Gokit Starter adalah boilerplate modern untuk membangun API menggunakan Go. Proyek ini dirancang dengan prinsip Clean Architecture dan Modular Monolith, fokus pada pemisahan kepentingan, testability, dan skalabilitas.
- Framework: Go-Chi (Router)
- Dependency Injection: Uber Fx
- ORM: Ent (Entity Framework for Go)
- Caching: Redis (via go-redis)
- Communication: Internal In-Memory Event Bus
- Validation: Go-Playground Validator
- Logging: Slog (Standard Library)
- Testing: Testify & Mockery (Automated Mocks)
- Documentation: swaggest/openapi-go + Scalar
- Otomasi: Taskfile, Lefthook, & Atlas
Struktur ini memisahkan antara infrastruktur, transport layer, dan business logic secara tegas:
├── cmd/ # Entry points aplikasi
├── database/ # Aset database (SQL Migrations)
│ └── migrations/ # File migrasi ter-versi (Atlas)
├── internal/
│ ├── app/ # Bootstrapping (Fx Modules, Router setup)
│ ├── config/ # Konfigurasi runtime (Viper + Validation)
│ ├── database/ # Implementasi ORM (Ent, Schema)
│ ├── delivery/ # Transport layer (HTTP Middleware, Response)
│ ├── infra/ # Infrastructure (butuh config/external system)
│ │ ├── auth/ # JWT, bcrypt, context helpers
│ │ ├── cache/ # Redis wrapper + NullCache
│ │ └── database/ # Ent client wrapper
│ ├── modules/ # Domain business logic (Modular Monolith)
│ │ └── auth/ # Contoh module: Auth
│ │ ├── app/ # Service / Use Cases
│ │ ├── domain/ # Kontrak, Entitas, & Error Domain
│ │ ├── handler/# HTTP Handler (self-contained dalam modul)
│ │ └── infra/ # Implementasi Repository
│ └── pkg/ # Utilities (pure logic, tanpa external dep)
│ ├── apperr/ # Standardized error types
│ ├── doc/ # OpenAPI spec builder + Scalar UI
│ ├── eventbus/ # In-memory event bus
│ ├── logger/ # slog wrapper
│ ├── pagination/ # Pagination helpers
│ └── validate/ # Validator wrapper
├── scripts/ # Script pembantu (Module Generator)
├── test/
│ └── mocks/ # Mock yang dihasilkan secara otomatis (Mockery)
└── taskfile.yml # Task runner (pengganti Makefile)
Aplikasi menggunakan pola pemisahan layer yang memastikan logika bisnis tidak tercampur dengan urusan teknis (DB/HTTP).
graph LR
Client -- HTTP --> Handler
Handler -- Input --> Service
Service -- Domain Entity --> Repository
Repository -- SQL --> PostgreSQL
Repository -- Map --> Service
Service -- Result --> Handler
Handler -- JSON --> Client
Sistem mendukung akun Personal dan Organization secara stateless menggunakan JWT.
sequenceDiagram
participant User
participant Auth
participant Context
User->>Auth: Login / Register
Auth->>User: Token JWT (berisi UserID & OrgID)
Note over User,Context: Setiap request menyertakan token
User->>Context: Request + Token
Context->>Context: Middleware parse OrgID ke Context
Context->>Service: Logic otomatis terfilter by OrgID
Untuk menjaga modularitas, antar module berkomunikasi secara asinkron lewat Event Bus.
graph TD
AuthModule[Module Auth] -- "Publish: UserRegistered" --> Bus[Internal Event Bus]
Bus -- "Dispatch" --> EmailModule[Module Email]
Bus -- "Dispatch" --> AnalyticsModule[Module Analytics]
Pastikan Anda sudah menginstal:
- Go 1.21+
- Task (
brew install go-task) - Atlas CLI (
brew install ariga/tap/atlas) - Docker (untuk database PostgreSQL dan Redis)
- Clone repository:
git clone git@github.com:masmuss/gokit-starter.git
- Salin environment variables:
cp .env.example .env
- Jalankan infrastruktur:
docker compose up -d
- Jalankan aplikasi dengan hot-reload:
task server
Setelah server berjalan, akses dokumentasi API di http://localhost:8080/docs/ (Scalar UI).
Gunakan task untuk menjalankan perintah umum:
task server: Menjalankan server denganair(hot-reload).task test: Menjalankan semua unit test.task mocks: Menghasilkan mock otomatis menggunakan Mockery.task generate: Menghasilkan kode Ent dari skema.task new:module name=...: Melakukan scaffolding folder dan boilerplate untuk modul baru.task viz: Menghasilkan diagram visualisasi dependency graph Uber Fx.task db:diff name=...: Mendeteksi perubahan skema dan men-generate file SQL migrasi baru.task db:migrate: Menjalankan migrasi SQL ke database.task db:clean: Reset database development (Docker) ke kondisi bersih.
Proyek ini menggunakan Versioned Migrations melalui Atlas. Jangan melakukan perubahan database secara manual.
- Modifikasi skema di
internal/database/schema/. - Jalankan
task generateuntuk memperbarui kode Go. - Jalankan
task db:diff name=deskripsi_perubahanuntuk membuat file migrasi.sql. - Review file SQL di folder
database/migrations/. - Jalankan
task db:migrateuntuk menerapkan perubahan.
Gunakan perintah generator untuk menjaga konsistensi arsitektur:
task new:module name=productSistem akan otomatis membuatkan folder domain, app, dan infra di bawah internal/modules/product/.
Gokit Starter - Built for developers who love clean and maintainable code.