This is my boilerplate for a Go http server project. Feedback and suggestions are encouraged!
Go to file
clawbot 4482529f6a Split Dockerfile: pre-built golangci-lint stage for faster CI (#26)
Closes [#22](#22)

## Changes

### Makefile
- Added `fmt-check` target: checks gofmt formatting without modifying files
- Added `hooks` target: installs pre-commit git hook
- Updated `check` target: now runs `fmt-check lint test`
- Removed redundant gofmt check from `lint` target (now in `fmt-check`)
- Added `.PHONY` declarations for all phony targets
- Updated `tools` target to use `go install`

### Dockerfile
- **Lint stage**: Uses pre-built `golangci/golangci-lint:v1.64.8` (sha256-pinned)
  - Runs `make fmt-check` and `make lint` for fast feedback
- **Build stage**: Uses `golang:1.24-bookworm` (sha256-pinned, matches go.mod 1.24.0)
  - `COPY --from=lint` forces BuildKit to actually run the lint stage
  - Runs `make test` then `make build`
- **Runtime stage**: Uses `debian:bookworm-slim` (sha256-pinned)
- All base images updated from ancient/unpinned versions to current sha256-pinned images
- Removed vendoring/source tarball per CLAUDE.md policy

### CI
- Added `.gitea/workflows/check.yml`: runs `docker build .` on push to main and PRs

## Image Versions
| Stage | Image | Digest |
|-------|-------|--------|
| lint | golangci/golangci-lint:v1.64.8 | sha256:2987913e...5cb8 |
| build | golang:1.24-bookworm | sha256:1a6d4452...77ac |
| runtime | debian:bookworm-slim | sha256:74d56e39...4421 |

## Verification
`docker build .` passes locally — all stages (lint, test, build) execute correctly.

<!-- session: agent:sdlc-manager:subagent:bcf4d5ff-f487-4dcb-aa85-1c0e039bbb3b -->

Co-authored-by: clawbot <clawbot@noreply.git.eeqj.de>
Reviewed-on: #26
Co-authored-by: clawbot <clawbot@noreply.example.org>
Co-committed-by: clawbot <clawbot@noreply.example.org>
2026-03-02 21:11:17 +01:00
.gitea/workflows Split Dockerfile: pre-built golangci-lint stage for faster CI (#26) 2026-03-02 21:11:17 +01:00
cmd/httpd remove Buildarch from globals - is available at runtime 2026-01-11 04:05:11 -08:00
internal remove Buildarch from globals - is available at runtime 2026-01-11 04:05:11 -08:00
static embed static files now (#14) 2022-11-28 00:19:47 +00:00
templates sneak/integrate-di (#17) 2023-01-29 03:06:05 +00:00
.dockerignore now supports remote error reporting to sentry, if desired 2020-09-30 21:59:20 -07:00
.drone.yml fix 2022-11-28 02:57:32 +01:00
.gitignore sneak/integrate-di (#17) 2023-01-29 03:06:05 +00:00
CLAUDE.md instructions for LLMs 2026-01-11 04:05:39 -08:00
CONVENTIONS.md instructions for LLMs 2026-01-11 04:05:39 -08:00
Dockerfile Split Dockerfile: pre-built golangci-lint stage for faster CI (#26) 2026-03-02 21:11:17 +01:00
go.mod Add Blog Posts CRUD with SQLite 2025-12-27 12:43:30 +07:00
go.sum Add Blog Posts CRUD with SQLite 2025-12-27 12:43:30 +07:00
LICENSE initial 2020-09-29 23:35:07 -07:00
Makefile Split Dockerfile: pre-built golangci-lint stage for faster CI (#26) 2026-03-02 21:11:17 +01:00
README.md update README 2020-10-10 15:17:17 +00:00
TODO.md Add Blog Posts CRUD with SQLite 2025-12-27 12:43:30 +07:00

gohttpserver

Build Status

This is my boilerplate for a go HTTP server, designed to be a starting point template for new projects, with most things conveniently stubbed out and ready for simple and fast customization, with sane defaults.

Many ideas are taken from Mat Ryer's talk titled "How I Write HTTP Web Services after Eight Years" at GopherCon 2019, seen here:

https://www.youtube.com/watch?v=rWBSMsLG8po

Contributing

Contributions are welcome! Please send me an email if you'd like an account on this server to submit PRs.

Alternately, even just feedback is great: sneak@sneak.berlin

Features

  • Basic logging middleware
  • Stub Authentication middleware
  • Helper functions for encoding/decoding json
  • Healthcheck route
  • Prometheus metrics endpoint
  • No global state of our own
    • some deps have some, such as the metrics collector and Sentry

Design Decisions

Pending Design Decisions

  • database: TBD (thinking about go-gorm/gorm)
  • templating: TBD (suggestions welcome)

TODO

  • Basic HTML Templates
  • Database Boilerplate
  • Sessions Middleware
  • sync.Once example for re-compiling templates
  • Bundling static assets into binary

Known Bugs (more TODO)

  • Chi recovery middleware logs non-json when in non-tty stdout mode, breaking validity of stdout as a json stream

Author

License

WTFPL (aka public domain):

            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
                    Version 2, December 2004

 Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>

 Everyone is permitted to copy and distribute verbatim or modified
 copies of this license document, and changing it is allowed as long
 as the name is changed.

            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. You just DO WHAT THE FUCK YOU WANT TO.