This is a template repository for building REST APIs with Go. Click the "Use this template" button above to create your own repository based on this template.
This template includes everything you need to build a REST API with Go - logging, middleware, database setup, testing, and deployment configs.
- Structured logging
- Middleware (auth, CORS, etc.)
- Config management
- API docs with Swagger
- Docker setup
- GitHub Actions CI/CD
- Automated releases with GoReleaser
- Database migrations
- Tests
- Makefile for common tasks
The main ones are:
- gorilla/mux for routing
- go-playground/validator for request validation
- go-sql-driver/mysql for MySQL database access
- jmoiron/sqlx for enhanced database access
- Masterminds/squirrel for SQL builder
- golang-migrate/migrate for database migrations
- swaggo/swag for API documentation generation
- strechr/testify for writing easier test assertions
- mockery for generating mock interfaces
- uber/zap for structured logging
- prometheus/client_golang for metrics
- otel for observability
- jaeger for distributed tracing
- Redis for cache
Click the "Use this template" button at the top of this repository, or use GitHub CLI:
gh repo create my-go-api --template MitulShah1/golang-rest-api-templategit clone https://github.com/YOUR_USERNAME/my-go-api.git
cd my-go-apiAfter creating your repository, update these files:
go.mod- Update module nameREADME.md- Update project name and description.github/workflows/go.yml- Update repository references if neededdocker-compose.yml- Update service names if needed
make help # See all available commands
make env # Create .env file
make docker_up # Start with Docker
make test # Run testsgolang-microservice-template/
│── cmd/
│ ├── server/ # Main entry point for the service
│ │ ├── main.go
│── config/
│ ├── config.go # Application configuration
│── docs/ # API documentation
│── internal/
│ ├── handlers/ # HTTP handlers
│ │ ├── server.go # HTTP server
│ ├── services/ # Business logic
│ ├── repository/ # Data access layer
│── package/ # Utility packages (database, logging, middleware, etc.)
│ ├── database/
│ │ ├── database.go
│── │ ├──migrations/ # Database migrations
│ ├── logger/
│ │ ├── logger.go
│ ├── middleware/
│ │ ├── basic_auth.go # Basic authentication middleware
│ │ ├── cors.go # CORS middleware
│ ├── ├── promotheus.go # Prometheus metrics
│── test/
│ ├── e2e/ # End-to-end tests
│── Dockerfile # Docker build configuration
│── docker-compose.yml # Docker Compose setup
│── Makefile # Build automation
│── go.mod # Go module dependencies
│── go.sum # Dependencies lock file
│── README.md # Project documentation- Go 1.21+
- Docker and Docker Compose
- Make
To Check All Commands:
make help1; Clone the repository
git clone https://github.com/MitulShah1/golang-rest-api-template.git2; Create .env file from .env.example add details
make env3; Start the application using Docker Compose
make docker_upBuild the application:
make buildRun tests:
make testGenerate API documentation:
make generate_docsCreate Migration:
make create_migrationRun Migrations:
make migration_upDown Migrations:
make migration_downConfiguration is managed through .env. Environment variables can override these settings.
API documentation is generated using Swagger. The documentation is available at http://localhost:8080/swagger/index.html.
Prometheus metrics are exposed at http://localhost:8080/metrics.
- Unit tests are alongside the code
- Integration tests are in the
test/directory - Run all tests with
make test
This project uses GoReleaser for automated releases. Releases are triggered automatically when you push a version tag.
- Create and push a version tag:
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0- The GitHub Actions workflow will automatically:
- Build binaries for multiple platforms (Linux, macOS, Windows)
- Generate checksums
- Create Docker images for AMD64 and ARM64
- Publish to GitHub Container Registry
- Create a GitHub release with changelog
- Update pkg.go.dev documentation
Download the latest release from the releases page:
# Linux AMD64
wget https://github.com/MitulShah1/golang-rest-api-template/releases/download/v1.0.0/golang-rest-api-template_1.0.0_Linux_x86_64.tar.gz
tar -xzf golang-rest-api-template_1.0.0_Linux_x86_64.tar.gz
# macOS ARM64
wget https://github.com/MitulShah1/golang-rest-api-template/releases/download/v1.0.0/golang-rest-api-template_1.0.0_Darwin_arm64.tar.gz
tar -xzf golang-rest-api-template_1.0.0_Darwin_arm64.tar.gzPull and run the Docker image:
# Pull the latest version
docker pull ghcr.io/mitulshah1/golang-rest-api-template:latest
# Or pull a specific version
docker pull ghcr.io/mitulshah1/golang-rest-api-template:v1.0.0
# Run the container
docker run -p 8080:8080 ghcr.io/mitulshah1/golang-rest-api-template:latestTest the release process locally:
# Install GoReleaser
go install github.com/goreleaser/goreleaser@latest
# Test release (without publishing)
goreleaser release --snapshot --cleanThe project includes:
- Dockerfile for containerization
- docker-compose.yml for local development
- GitHub Actions for CI/CD pipeline
- GoReleaser for automated releases
- Fork the repository
- Create your feature branch
- Commit your changes
- Push to the branch
- Create a new Pull Request
This project is licensed under the MIT License - see the LICENSE file for details
