Deployment
Production Server
import "github.com/neutron-dev/neutron-go/neutron"
func main() {
app := neutron.New(
neutron.WithConfig(neutron.LoadConfig[ServerConfig]("APP")),
)
app.Use(neutron.Chain(
neutron.RequestID(),
neutron.Logger(slog.Default()),
neutron.Recover(),
neutron.CORS(neutron.CORSOptions{AllowOrigins: []string{"*"}}),
neutron.Compress(5),
neutron.Timeout(30 * time.Second),
))
setupRoutes(app)
app.Run(":8080")
}
Configuration
Struct-based config with environment variable loading:
type ServerConfig struct {
Server struct {
Addr string `env:"ADDR" default:":8080"`
ReadTimeout time.Duration `env:"READ_TIMEOUT" default:"5s"`
WriteTimeout time.Duration `env:"WRITE_TIMEOUT" default:"10s"`
ShutdownTimeout time.Duration `env:"SHUTDOWN_TIMEOUT" default:"30s"`
}
Database struct {
URL string `env:"URL" required:"true"`
MaxConns int `env:"MAX_CONNS" default:"25"`
MinConns int `env:"MIN_CONNS" default:"5"`
}
Log struct {
Level string `env:"LEVEL" default:"info"`
Format string `env:"FORMAT" default:"json"`
}
}
cfg, err := neutron.LoadConfig[ServerConfig]("APP")
// Reads: APP_SERVER_ADDR, APP_DATABASE_URL, APP_LOG_LEVEL, etc.
Graceful Shutdown
app.Run() handles SIGINT/SIGTERM automatically with a 30-second drain timeout.
Lifecycle Hooks
app := neutron.New(
neutron.WithLifecycle(
neutron.LifecycleHook{
Name: "database",
OnStart: func(ctx context.Context) error {
return db.Connect(ctx)
},
OnStop: func(ctx context.Context) error {
return db.Close()
},
},
neutron.LifecycleHook{
Name: "cache",
OnStart: func(ctx context.Context) error {
return cache.Warmup(ctx)
},
OnStop: func(ctx context.Context) error {
return cache.Flush()
},
},
),
)
OnStarthooks run in registration order during startupOnStophooks run in reverse order during shutdown
Health Check
Built-in GET /health endpoint registered automatically:
{
"status": "ok",
"nucleus": true,
"version": "0.1.0"
}
Nucleus detection uses the NucleusChecker interface (optional).
Environment Variables
| Variable | Default | Description |
|----------|---------|-------------|
| APP_SERVER_ADDR | :8080 | Listen address |
| APP_SERVER_READ_TIMEOUT | 5s | HTTP read timeout |
| APP_SERVER_WRITE_TIMEOUT | 10s | HTTP write timeout |
| APP_SERVER_SHUTDOWN_TIMEOUT | 30s | Graceful shutdown timeout |
| APP_DATABASE_URL | — | Connection string (required) |
| APP_LOG_LEVEL | info | Log level |
| APP_LOG_FORMAT | json | Log format |
Docker
# Build stage
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /app/server ./cmd/server
# Runtime stage
FROM alpine:3.19
RUN apk add --no-cache ca-certificates
COPY --from=builder /app/server /usr/local/bin/
EXPOSE 8080
CMD ["server"]
Docker Compose
services:
app:
build: .
ports:
- "8080:8080"
environment:
APP_DATABASE_URL: postgres://nucleus:5432/mydb
APP_LOG_LEVEL: info
depends_on:
nucleus:
condition: service_healthy
nucleus:
image: ghcr.io/neutron-build/nucleus:latest
ports:
- "5432:5432"
volumes:
- nucleus_data:/var/lib/nucleus
healthcheck:
test: ["CMD", "pg_isready", "-h", "localhost"]
interval: 5s
volumes:
nucleus_data:
systemd
[Unit]
Description=My Neutron Go App
After=network.target
[Service]
Type=simple
User=myapp
ExecStart=/usr/local/bin/server
Environment=APP_DATABASE_URL=postgres://localhost:5432/mydb
Restart=on-failure
RestartSec=5
TimeoutStopSec=30
[Install]
WantedBy=multi-user.target
Auto-Generated Endpoints
Every Neutron Go app exposes:
| Endpoint | Description |
|----------|-------------|
| GET /health | Health + Nucleus detection |
| GET /openapi.json | OpenAPI 3.1 specification |
| GET /docs | Swagger UI |