An API boilerplate written in Golang with Gin Framework and Gorm
Write restful API with fast development and developer friendly
.env. sample file .env.example# Server Configuration
SECRET=h9wt*pasj6796j##w(w8=xaje8tpi6h*r&hzgrz065u&ed+k2)
DEBUG=True # `False` in Production
ALLOWED_HOSTS=0.0.0.0
SERVER_HOST=0.0.0.0
SERVER_PORT=8000
# Database Configuration
MASTER_DB_NAME=test_pg_go
MASTER_DB_USER=mamun
MASTER_DB_PASSWORD=123
MASTER_DB_HOST=postgres_db
MASTER_DB_PORT=5432
MASTER_DB_LOG_MODE=True # `False` in Production
MASTER_SSL_MODE=disable
REPLICA_DB_NAME=test_pg_go
REPLICA_DB_USER=mamun
REPLICA_DB_PASSWORD=123
REPLICA_DB_HOST=localhost
REPLICA_DB_PORT=5432
REPLICA_DB_LOG_MODE=True # `False` in Production
REPLICA_SSL_MODE=disable
DEBUG set False in ProductionMASTER_DB_LOG_MODE and REPLICA_DB_LOG_MODE set False in productionMASTER_DB_HOST value set as localhost for local development, and use postgres_db for docker development admin@admin.com Password rootpostgres_db, DB Username and Password as per .env set.env, default Username mamun and password 123Follow these steps:
- Copy .env.example as .env and configure necessary values
- To add all dependencies for a package in your module go get . in the current directory
- Locally run go run main.go or go build main.go and run ./main
- Check Application health available on 0.0.0.0:8000/health
Follow these steps:
- Make sure install the latest version of docker and docker-compose
- Docker Installation for your desire OS https://docs.docker.com/engine/install/ubuntu/
- Docker Composer Installation https://docs.docker.com/compose/install/
- Run and Develop make dev
- Check Application health available on 0.0.0.0:8000/health
router := gin.New()
router.Use(gin.Logger())
router.Use(gin.Recovery())
router.Use(middleware.CORSMiddleware())
├── controllers
│ └── base_controller.go
├── docker-compose-dev.yml
├── docker-compose-prod.yml
├── Dockerfile
├── Dockerfile-dev
├── go.mod
├── go.sum
├── LICENSE
├── main.go
├── Makefile
├── models
│ └── example_model.go
├── pkg
│ ├── config
│ │ ├── config.go
│ │ ├── db.go
│ │ └── server.go
│ ├── database
│ │ ├── database.go
│ │ └── migration.go
│ ├── helpers
│ │ ├── pagination
│ │ │ └── pagination.go
│ │ ├── response.go
│ │ └── search.go
│ └── logger
│ └── logger.go
├── README.md
├── repository
│ └── example_repo.go
└── routers
├── index.go
├── middleware
│ └── cors.go
└── router.go
example_model.gopackage models
import (
"time"
)
type Example struct {
Id int `json:"id"`
Data string `json:"data" binding:"required"`
CreatedAt *time.Time `json:"created_at,string,omitempty"`
UpdatedAt *time.Time `json:"updated_at_at,string,omitempty"`
}
// TableName is Database Table Name of this model
func (e *Example) TableName() string {
return "examples"
}
package database
import (
"gin-boilerplate/models"
)
//Add list of model add for migrations
var migrationModels = []interface{}{&models.Example{}}
example_controller.gobase.DB, this is wrapper of *gorm.DBpackage controllers
import (
"gin-boilerplate/models"
"gin-boilerplate/repository"
"github.com/gin-gonic/gin"
"net/http"
)
func GetData(ctx *gin.Context) {
var example []*models.Example
repository.Get(&example)
ctx.JSON(http.StatusOK, &example)
}
func Create(ctx *gin.Context) {
example := new(models.Example)
repository.Save(&example)
ctx.JSON(http.StatusOK, &example)
}
example.gopackage routers
import (
"gin-boilerplate/controllers"
"github.com/gin-gonic/gin"
"net/http"
)
func RegisterRoutes(route *gin.Engine) {
route.GET("/health", func(ctx *gin.Context) { ctx.JSON(http.StatusOK, gin.H{"live": "ok"}) })
//added new
route.GET("/v1/example/", controllers.GetData)
route.POST("/v1/example/", controllers.Create)
//Add All route
//TestRoutes(route)
}
0.0.0.0:8000/v1/example/make buildmake productiondatabase:
driver: "postgres"
dbname: "test_pg_go"
username: "mamun"
password: "123"
host: "postgres_db" # use `localhost` for local development
port: "5432"
ssl_mode: disable
log_mode: false
server:
host: "0.0.0.0"
port: "8000"
secret: "secret"
allow_hosts: "localhost"
debug: false #use `false` in production
request:
timeout: 100
func ServerConfig() string {
viper.SetDefault("server.host", "0.0.0.0")
viper.SetDefault("server.port", "8000")
appServer := fmt.Sprintf("%s:%s", viper.GetString("server.host"), viper.GetString("server.port"))
return appServer
}
func DbConfiguration() string {
dbname := viper.GetString("database.dbname")
username := viper.GetString("database.username")
password := viper.GetString("database.password")
host := viper.GetString("database.host")
port := viper.GetString("database.port")
sslMode := viper.GetString("database.ssl_mode")
dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=%s",
host, username, password, dbname, port, sslMode)
return dsn
}
make dev: make dev for development workmake build: make build containermake production: docker production build and upclean: clean for all clear docker images$ claude mcp add gin-boilerplate \
-- python -m otcore.mcp_server <graph>