# Go HTTP server A simple Go HTTP server boilerplate with Echo, structured logging, and Docker support. Includes graceful shutdown on `SIGINT`/`SIGTERM` via `errgroup`. ## Project layout cmd/app/ entrypoint, wiring, graceful shutdown cmd/app/handler/ HTTP handlers and route registration internal/config/ env-based configuration internal/domain/ your business logic goes here internal/infrastructure/os/ signal handling pkg/logger/ Zap logger setup ## Endpoints | Method | Path | Description | |--------|-----------|---------------------------| | GET | `/health` | Liveness check (`200 OK`) | ## Adding an endpoint Register routes in a `setup…Routes` method and call it from `handler.New` (see `cmd/app/handler/health.go`): ```go func (h *Handler) setupFooRoutes(e *echo.Echo) { e.GET("/foo", h.getFoo) } ``` ## Prerequisites - Go 1.25+ - Docker and Docker Compose (for containerized runs) ## Configuration Copy the example environment file and adjust values if needed: ```bash cp .env.dist .env ``` The application reads configuration from process environment variables (via [envconfig](https://github.com/kelseyhightower/envconfig)). Docker Compose loads `.env` automatically. For a local `go run`, export variables or source the file: ```bash set -a && source .env && set +a ``` | Variable | Default | Description | |----------|---------|-------------| | `LOG_LEVEL` | `info` | Zap log level (`debug`, `info`, `warn`, `error`) | | `API_PORT` | `3000` | HTTP listen port | | `API_READ_TIMEOUT` | `7` | Server read timeout (seconds) | | `API_WRITE_TIMEOUT` | `5` | Server write timeout (seconds) | | `API_IDLE_TIMEOUT` | `5` | Server idle timeout (seconds) | | `API_TIMEOUT` | `5` | Reserved for future use | Inside Docker, the process always listens on port `3000`; `API_PORT` in `.env` controls the host port mapping. ## Run with Docker (recommended) ```bash make setup-docker # copy .env, download modules, build and start containers ``` Or step by step: ```bash make setup-local # copy .env (if missing) and go mod download make run # docker compose up --build ``` Verify: ```bash curl http://localhost:3000/health ``` Stop: ```bash make down ``` ## Run locally (without Docker) ```bash make setup-local make run-local ``` ## Build binary ```bash make build ./bin/server ``` ## Make targets ```bash make help ``` Common targets: `run`, `run-local`, `down`, `setup-local`, `setup-docker`, `build`, `tests`, `lint`.