{"id":31600326,"url":"https://github.com/semmidev/goca","last_synced_at":"2026-05-14T21:37:24.924Z","repository":{"id":312568659,"uuid":"1047734368","full_name":"SemmiDev/goca","owner":"SemmiDev","description":"Goca: Go-based RESTful API template with Clean Architecture. Features JWT auth, notes CRUD, Redis worker, rate limiting, Zap logging, and Swagger docs. Docker-ready for scalable, testable apps.","archived":false,"fork":false,"pushed_at":"2025-08-31T15:25:31.000Z","size":109,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-08-31T16:24:37.161Z","etag":null,"topics":["clean-architecture","golang","jwt","redis","swagger","uncle-bob","worker"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SemmiDev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-31T05:19:27.000Z","updated_at":"2025-08-31T15:25:35.000Z","dependencies_parsed_at":"2025-08-31T16:24:40.751Z","dependency_job_id":"764cdba8-6d49-4328-b7f5-450518b21692","html_url":"https://github.com/SemmiDev/goca","commit_stats":null,"previous_names":["semmidev/goca"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/SemmiDev/goca","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SemmiDev%2Fgoca","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SemmiDev%2Fgoca/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SemmiDev%2Fgoca/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SemmiDev%2Fgoca/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SemmiDev","download_url":"https://codeload.github.com/SemmiDev/goca/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SemmiDev%2Fgoca/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278572004,"owners_count":26008686,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clean-architecture","golang","jwt","redis","swagger","uncle-bob","worker"],"created_at":"2025-10-06T06:56:49.577Z","updated_at":"2025-10-06T06:56:53.740Z","avatar_url":"https://github.com/SemmiDev.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Go Clean Architecture Template\n\nSebuah *boilerplate* atau templat untuk layanan RESTful API berbasis Go yang mengikuti prinsip **Clean Architecture**. Desain ini bertujuan untuk menciptakan struktur proyek yang modular, mudah diuji (*testable*), dapat diskalakan (*scalable*), dan mudah dipelihara (*maintainable*). Proyek ini sudah menyertakan fitur inti seperti manajemen **Pengguna** (*User*) dengan autentikasi JWT dan **Catatan** (*Notes*), serta dukungan untuk *observability*, pemrosesan latar belakang (*background processing*), dan *containerization*.\n\nProyek ini dirancang untuk para pengembang (*developer*) yang ingin memulai proyek API Go dengan fondasi yang kokoh, sambil menerapkan praktik terbaik (*best practices*) seperti *dependency injection*, *separation of concerns*, dan pengujian (*testing*).\n\n-----\n\n## ✨ Fitur Utama\n\n  - 🏗️ **Clean Architecture**: Pemisahan lapisan yang jelas antara domain (entitas \u0026 logika bisnis), *use case* (layanan), *delivery* (*handler*), dan infrastruktur (*repository*, basis data, dll.) untuk memudahkan pemeliharaan dan pengujian.\n  - 🔐 **Autentikasi \u0026 Otorisasi**: Registrasi, *login*, dan proteksi *endpoint* menggunakan JWT. Termasuk fitur lupa sandi (*forgot password*) dan verifikasi email.\n  - 📝 **Manajemen Catatan**: Operasi CRUD lengkap untuk catatan (*notes*) yang terikat pada setiap pengguna.\n  - ⚙️ **Pekerja Latar Belakang (*Background Worker*)**: Proses asinkron (*asynchronous*) menggunakan Redis sebagai perantara pesan (*message broker*) untuk tugas seperti pengiriman email (melalui SMTP).\n  - 📈 **Pembatasan Laju \u0026 Keamanan**: Pembatasan permintaan (*rate limiting*) dengan Redis, *middleware* untuk CORS, ID permintaan (*request ID*), pemulihan dari *panic*, dan *header* keamanan (*security headers*).\n  - 📜 **Logging Terstruktur**: Menggunakan Zap untuk *logging* terstruktur dalam format JSON yang mudah dianalisis, dengan integrasi *tracing*.\n  - 🔍 **Observability**: Dukungan untuk pemantauan (*monitoring*) dengan Prometheus, Grafana, Loki, Tempo, dan OpenTelemetry (OTel) melalui konfigurasi di direktori `scripts/`.\n  - 📦 **Containerized \u0026 Orchestrated**: Siap untuk di-*deploy* dengan Docker dan Docker Compose, termasuk pengaturan untuk basis data, *cache*, dan perangkat *observability*.\n  - 📄 **Dokumentasi API**: Dokumentasi API (OpenAPI/Swagger) yang dibuat secara otomatis dari anotasi kode, lengkap dengan contoh permintaan dan respons.\n  - ✅ **Pengujian \u0026 Linting**: *Unit test* untuk komponen-komponen kunci, serta *golangci-lint* untuk memastikan kualitas kode.\n  - 📧 **Templat Email**: Templat email yang disematkan (*embedded*) untuk verifikasi dan lupa sandi.\n  - 🔑 **Utilitas Pendukung**: Termasuk *cache* (Redis), enkripsi (AES), *hashing* kata sandi (*password hashing* dengan Bcrypt), pembuatan OTP, penjadwal (*scheduler* dengan GoCron), dan validator (Go-Playground).\n\n-----\n\n## 🛠️ Rangkaian Teknologi (*Tech Stack*)\n\n| Kategori | Teknologi/Alat |\n|---|---|\n| **Bahasa** | Go (v1.25.0+) |\n| **Framework HTTP** | Fiber (untuk *routing* dan *middleware*) |\n| **Basis Data** | PostgreSQL (dengan pelacakan *query*) |\n| **Cache \u0026 Broker** | Redis (untuk *caching*, *rate limiting*, *worker*) |\n| **Autentikasi** | JWT, Bcrypt |\n| **Email** | SMTP dengan templat |\n| **Observability** | OpenTelemetry, Prometheus, Grafana, Loki, Tempo, Promtail |\n| **Migrasi DB** | golang-migrate |\n| **Dokumentasi** | Swaggo (Swagger/OpenAPI) |\n| **Linting \u0026 Pengujian** | golangci-lint, Go testing framework |\n| **Containerization** | Docker, Docker Compose |\n| **Lainnya** | GoCron (*scheduler*), Redis (*worker distributor*) |\n\n-----\n\n## 🏛️ Struktur Proyek\n\nStruktur proyek mengikuti standar konvensi Go dengan adaptasi dari Clean Architecture. Setiap modul (seperti `user` dan `note`) memiliki lapisannya sendiri untuk memastikan independensi.\n\nBerikut adalah struktur direktori proyek:\n\n```\n.\n├── api                  # Definisi API (proto, dokumen Swagger)\n│   ├── proto\n│   └── swagger          # Berkas Swagger yang dihasilkan\n├── cmd                  # Titik masuk (entrypoint) aplikasi\n│   └── api\n│       └── main.go      # Berkas utama untuk menjalankan server\n├── compose.yaml         # Konfigurasi Docker Compose untuk pengembangan/produksi\n├── Dockerfile           # Instruksi untuk membangun image Docker\n├── go.mod \u0026 go.sum      # Dependensi Go\n├── internal             # Logika bisnis inti (tidak untuk diimpor dari luar)\n│   ├── app.go           # Inisialisasi aplikasi utama\n│   ├── config           # Manajemen konfigurasi (.env, konstanta)\n│   ├── modules          # Modul domain per fitur\n│   │   ├── note         # Modul notes: DTO, entitas, handler, repo, service\n│   │   └── user         # Modul user: DTO, entitas, handler, repo, service\n│   ├── pkg              # Paket utilitas yang digunakan bersama (apperror, cache, dll.)\n│   │   ├── apperror     # Penanganan error kustom\n│   │   ├── assets       # Aset yang disematkan (templat email)\n│   │   ├── cache        # Cache Redis\n│   │   ├── database     # Koneksi Postgres \u0026 pelacakan query\n│   │   ├── email        # Pengirim email SMTP\n│   │   ├── encoding     # Encoding Base64\n│   │   ├── encryption   # Enkripsi AES\n│   │   ├── logger       # Logger Zap\n│   │   ├── observability# Middleware \u0026 utilitas OTel\n│   │   ├── password     # Hashing Bcrypt\n│   │   ├── random       # Pembuat OTP \u0026 string acak\n│   │   ├── ratelimit    # Pembatas permintaan berbasis Redis\n│   │   ├── request      # Penyaringan permintaan\n│   │   ├── response     # Helper untuk respons API\n│   │   ├── scheduler    # Penjadwal GoCron\n│   │   ├── token        # Manajemen token JWT\n│   │   ├── validator    # Validator Go-Playground\n│   │   └── worker       # Pekerja latar belakang (distributor Redis, tugas)\n│   └── server           # Pengaturan server (rute API, middleware, dll.)\n├── logs                 # Berkas log (dihasilkan)\n├── Makefile             # Otomatisasi tugas (build, test, migrate, dll.)\n├── migrations           # Berkas migrasi SQL untuk skema DB\n├── playground.http      # Berkas untuk pengujian API (misalnya, via VSCode REST Client)\n├── README.md            # Dokumentasi ini\n└── scripts              # Konfigurasi untuk alat observability (Grafana, dll.)\n```\n\n### Diagram Arsitektur Sederhana\n\nBerikut adalah representasi sederhana dari arsitektur proyek ini:\n\n```\n+-------------------+     +-------------------+     +-------------------+\n|      Delivery     |     |      Use Case     |     |       Domain      |\n|   (Handler, API)  |\u003c---\u003e|     (Service)     |\u003c---\u003e|     (Entitas)     |\n+-------------------+     +-------------------+     +-------------------+\n         ^                         ^\n         |                         |\n         v                         v\n+-------------------+     +-------------------+\n|   Infrastruktur   |     |     Eksternal     |\n|(Repositori, DB, ...)|   | (Email, Observ.)  |\n+-------------------+     +-------------------+\n```\n\n-----\n\n## 🚀 Memulai\n\n### Prasyarat\n\n  - Git\n  - Go (v1.25.0+)\n  - Docker \u0026 Docker Compose\n  - Make\n\nInstal beberapa alat Go tambahan yang diperlukan:\n\n```bash\ngo install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest\ngo install github.com/swaggo/swag/cmd/swag@latest\ngo install github.com/golangci/golangci-lint/cmd/golangci-lint@latest\n```\n\n### 1\\. Salin (*Clone*) Repositori\n\n```bash\ngit clone https://github.com/semmidev/goca.git\ncd goca\n```\n\n### 2\\. Konfigurasi Lingkungan (*Environment*)\n\nSalin `.env.example` menjadi `.env`, lalu sesuaikan isinya:\n\n```bash\ncp .env.example .env\n```\n\nIsi variabel yang diperlukan seperti `DATABASE_URL`, `REDIS_ADDR`, `JWT_SECRET_KEY`, dan konfigurasi `SMTP_*` untuk email.\n\n### 3\\. Jalankan dengan Docker (Direkomendasikan)\n\n```bash\nmake up\n```\n\nPerintah ini akan menjalankan aplikasi, Postgres, Redis, dan semua layanan *observability*. Aplikasi dapat diakses di `http://localhost:8080`.\n\nUntuk menghentikan semua layanan:\n\n```bash\nmake down\n```\n\n### 4\\. Jalankan Secara Lokal (Tanpa Docker)\n\n1.  Pastikan Postgres \u0026 Redis sudah berjalan di sistem Anda.\n2.  `go mod tidy`\n3.  `make migrateup`\n4.  `make run-api`\n\nAplikasi akan berjalan pada *port* yang ditentukan di berkas `.env` (standarnya: 8080).\n\n### Pengaturan Observability\n\n  - **Grafana**: `http://localhost:3000` (user/pass standar: admin/admin)\n  - **Prometheus**: `http://localhost:9090`\n  - **Loki \u0026 Tempo** juga tersedia untuk logging dan tracing.\n\n-----\n\n## ⚙️ Perintah Makefile\n\n| Perintah | Deskripsi |\n|---|---|\n| `make up` | Menjalankan semua *container* Docker |\n| `make down` | Menghentikan \u0026 menghapus *container* |\n| `make run-api` | Menjalankan aplikasi secara lokal |\n| `make test` | Menjalankan *unit test* |\n| `make swagger` | Membuat dokumen Swagger |\n| `make migrateup` | Menerapkan migrasi basis data |\n| `make migratedown` | Membatalkan migrasi terakhir |\n| `make new_migration name=xyz` | Membuat berkas migrasi baru |\n| `make lint` | Menjalankan *linter* |\n\n-----\n\n## 📄 Dokumentasi API\n\nSetelah aplikasi berjalan, dokumentasi API dapat diakses melalui `http://localhost:8080/swagger/index.html`. Untuk memperbarui dokumen, jalankan perintah `make swagger`.\n\n-----\n\n## 🤝 Berkontribusi\n\n*Fork* repositori ini, buat *branch* baru, lakukan perubahan dan *commit*, lalu buat *Pull Request*. Gunakan *Issues* untuk memulai diskusi.\n\n-----\n\n## 📜 Lisensi\n\nProyek ini dilisensikan di bawah Lisensi MIT. Lihat berkas `LICENSE` untuk detail lengkap.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsemmidev%2Fgoca","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsemmidev%2Fgoca","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsemmidev%2Fgoca/lists"}