یک سرویس REST API ساده و production-ready با استفاده از Go و Gin framework.
- شروع سریع
- پیشنیازها
- ساختار پروژه
- راهاندازی محیط Development
- راهاندازی محیط Production
- API Endpoints
- استفاده از Makefile
- Observability
- مستندات بیشتر
# 1. کلون کردن پروژه (اگر از Git استفاده میکنید)
git clone <repository-url>
cd sdgo
# 2. ایجاد فایل .env از نمونه
cp env.example .env
# 3. راهاندازی با Docker (سادهترین روش)
make docker-up
# 4. تست API
curl http://localhost:8080/healthخروجی مورد انتظار:
{"status":"ok","state":"ready"}- Docker 20.10+ و Docker Compose 2.0+ (برای اجرای با Docker)
- Go 1.21+ (فقط برای development محلی)
- Make (اختیاری اما توصیه میشود)
Linux:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USERmacOS:
brew install docker docker-compose
# یا دانلود Docker Desktop از docker.comWindows: دانلود و نصب Docker Desktop
docker --version
docker-compose --versionsdgo/
├── cmd/
│ └── server/ # Entry point اصلی برنامه
│ └── main.go # نقطه شروع برنامه
│
├── internal/ # کدهای داخلی (غیر قابل استفاده خارجی)
│ ├── api/ # API handlers و routes
│ │ ├── handlers.go # Handler functions
│ │ └── routes.go # Route definitions
│ ├── config/ # مدیریت configuration
│ │ └── config.go # بارگذاری و validation
│ ├── lifecycle/ # مدیریت lifecycle (ready/shutdown)
│ │ └── lifecycle.go
│ ├── logger/ # Logging utilities
│ │ └── logger.go # Zerolog setup
│ ├── metrics/ # Prometheus metrics
│ │ └── metrics.go
│ ├── middleware/ # HTTP middleware
│ │ ├── correlation.go # Correlation ID
│ │ ├── error_handler.go # Error handling
│ │ ├── logging.go # Request/Response logging
│ │ ├── prometheus.go # Metrics collection
│ │ └── tracing.go # OpenTelemetry tracing
│ ├── server/ # HTTP server wrapper
│ │ └── server.go # Server lifecycle
│ └── tracer/ # OpenTelemetry tracer
│ └── tracer.go
│
├── pkg/ # Packages قابل استفاده خارجی
│ └── errors/ # Error definitions
│ └── errors.go
│
├── configs/ # فایلهای configuration
│ ├── prometheus.yml # Prometheus config
│ ├── tempo.yaml # Tempo config
│ ├── loki/ # Loki configs
│ └── promtail/ # Promtail configs
│
├── docs/ # مستندات پروژه
│ ├── QUICK_START.md # راهنمای سریع
│ ├── LOCAL_DEVELOPMENT.md # راهنمای development
│ ├── OBSERVABILITY.md # راهنمای Observability
│ ├── LOKI_GUIDE.md # راهنمای Loki
│ ├── PROMETHEUS_GUIDE.md # راهنمای Prometheus
│ └── ... # سایر مستندات
│
├── docker-compose.yml # Docker Compose برای production
├── docker-compose.dev.yml # Docker Compose برای development DB
├── docker-compose.observability.yml # Observability stack
├── Dockerfile # Multi-stage Docker build
├── Makefile # Build automation
├── env.example # نمونه فایل environment variables
└── README.md # این فایل
cmd/server/: نقطه ورود برنامه. اینجاmain()قرار دارد.internal/: کدهای داخلی که نباید از خارج پروژه استفاده شوند.pkg/: کدهای قابل استفاده خارجی (مثل libraries).configs/: فایلهای configuration برای ابزارهای خارجی.
این روش سادهترین است و نیازی به نصب Go ندارد.
# ایجاد فایل .env از نمونه
cp env.example .env
# بررسی فایل .env (مقادیر پیشفرض معمولاً کافی است)
cat .env# راهاندازی تمام سرویسها (PostgreSQL + API)
make docker-upاین دستور:
- ✅ PostgreSQL container را راهاندازی میکند
- ✅ Docker image را میسازد (در اولین اجرا)
- ✅ API container را راهاندازی میکند
- ✅ Health check را اجرا میکند
# مشاهده لاگها
make docker-logs
# یا فقط لاگ API
docker-compose logs -f api
# بررسی وضعیت containers
docker ps# Health check
curl http://localhost:8080/health
# Readiness probe
curl http://localhost:8080/ready
# Liveness probe
curl http://localhost:8080/live
# Hello endpoint
curl http://localhost:8080/hello# توقف تمام containers
make docker-downمهم: Docker به صورت خودکار کد را rebuild نمیکند. بعد از تغییر کد:
# روش 1: Rebuild و restart
make docker-up-rebuild
# روش 2: فقط rebuild API
docker-compose build api
docker-compose up -d api
# روش 3: Rebuild با --build flag
docker-compose up -d --build apiاین روش برای development بهتر است چون با هر تغییر کد، خودکار rebuild میشود.
# راهاندازی PostgreSQL
make dev-db-up# ایجاد .env (اگر وجود ندارد)
make dev-setup
# تغییر DB_HOST به localhost
# در فایل .env:
# DB_HOST=localhost# اجرا با hot reload (توصیه میشود)
make dev-run
# یا اجرای ساده (بدون hot reload)
make runنکته: make dev-run از air استفاده میکند که به صورت خودکار نصب میشود.
# توقف دیتابیس
make dev-db-down
# توقف برنامه: Ctrl+C| ویژگی | Docker (make docker-up) |
Local (make dev-run) |
|---|---|---|
| نیاز به Go | ❌ | ✅ |
| Hot Reload | ❌ (نیاز به rebuild) | ✅ (خودکار) |
| سرعت تغییرات | کند (نیاز به rebuild) | سریع (instant) |
| مناسب برای | Testing, Production | Development |
| پیچیدگی | ساده | متوسط |
توصیه:
- شروع کار: از
make docker-upاستفاده کنید - Development فعال: از
make dev-runاستفاده کنید
- فایل
.envبا مقادیر production JWT_SECRET_KEYوJWT_REFRESH_SECRETباید تغییر کنندGIN_MODE=release
# کپی از نمونه
cp env.example .env
# ویرایش .env و تغییر مقادیر مهم:
# - JWT_SECRET_KEY (حداقل 32 کاراکتر)
# - JWT_REFRESH_SECRET (حداقل 32 کاراکتر)
# - GIN_MODE=release
# - LOG_LEVEL=info# Build image
make docker-build
# یا force rebuild
make docker-build-rebuild# با Docker Compose
make docker-up
# یا با Docker مستقیم
docker run -d \
--name go-backend-api \
-p 8080:8080 \
--env-file .env \
go-backend-service:latest# Health check
curl http://localhost:8080/health
# Readiness (برای Kubernetes)
curl http://localhost:8080/ready
# Liveness (برای Kubernetes)
curl http://localhost:8080/live# مشاهده logs
docker logs -f go-backend-api
# یا با Docker Compose
docker-compose logs -f api- Secrets Management: از Docker Secrets یا Kubernetes Secrets استفاده کنید
- Logging: Logs به
stdoutمیروند. از log aggregation استفاده کنید - Health Checks: از
/readyو/liveبرای Kubernetes probes استفاده کنید - Graceful Shutdown: برنامه از graceful shutdown پشتیبانی میکند
- Metrics: از
/metricsبرای Prometheus scraping استفاده کنید
| Endpoint | Method | توضیحات | استفاده |
|---|---|---|---|
/health |
GET | Health check عمومی | Docker healthcheck |
/ready |
GET | Readiness probe | Kubernetes readiness |
/live |
GET | Liveness probe | Kubernetes liveness |
مثال:
curl http://localhost:8080/health
# {"status":"ok","state":"ready"}
curl http://localhost:8080/ready
# {"status":"ready","state":"ready"}
curl http://localhost:8080/live
# {"status":"alive","state":"ready"}| Endpoint | Method | توضیحات |
|---|---|---|
/hello |
GET | پیام Hello World |
/delayed-hello |
GET | Hello با delay تصادفی (1-3 ثانیه) |
/test-error |
GET | تست error handling |
/metrics |
GET | Prometheus metrics |
مثال:
curl http://localhost:8080/hello
# {"message":"Hello, World!"}
curl http://localhost:8080/metrics
# # HELP http_request_duration_seconds Duration of HTTP requests...# نمایش تمام دستورات
make help
# Development
make dev # راهاندازی کامل محیط dev
make dev-setup # ایجاد .env
make dev-db-up # راهاندازی دیتابیس
make dev-run # اجرا با hot reload
make run # اجرای ساده
# Docker
make docker-up # راهاندازی containers
make docker-down # توقف containers
make docker-logs # مشاهده logs
make docker-build # Build image
make docker-up-rebuild # Rebuild و restart
# Build & Test
make build # Build binary
make test # اجرای تستها
make deps # دانلود dependenciesبرای لیست کامل دستورات:
make helpاین پروژه شامل پشتیبانی کامل از Observability است:
- OpenTelemetry Tracing: Distributed tracing
- Tempo: Trace storage backend
- Jaeger UI: Visualization traces (اختیاری)
- Prometheus: Metrics collection
- Loki: Log aggregation و central logging
- Promtail: Log collector از Docker containers
- Grafana: Dashboards و visualization (traces, logs, metrics)
# راهاندازی تمام stack (Tempo, Jaeger, Prometheus, Loki, Grafana)
make observability-up
# بعد از تغییر config files (tempo.yaml, prometheus.yml, loki-config.yaml):
make observability-up-rebuild
# دسترسی به UI:
# - Grafana: http://localhost:3000 (admin/admin) - برای traces, logs, metrics
# - Jaeger: http://localhost:16686 (memory storage only)
# - Prometheus: http://localhost:9090
# - Loki API: http://localhost:3100
# - Tempo API: http://localhost:3200- باز کردن: http://localhost:3000
- رفتن به Explore (منوی سمت چپ)
- انتخاب Loki datasource
- جستجوی logs:
{container="go-backend-api"}
برای راهنمای کامل، به OBSERVABILITY.md و LOKI_GUIDE.md مراجعه کنید.
تمام مستندات در پوشه docs/ قرار دارند:
- QUICK_START.md: راهنمای سریع شروع کار
- LOCAL_DEVELOPMENT.md: راهنمای کامل development محلی
- TROUBLESHOOTING.md: راهنمای عیبیابی مشکلات رایج
- OBSERVABILITY.md: راهنمای کامل Observability (Tempo, Prometheus, Grafana)
- LOKI_GUIDE.md: راهنمای کامل Loki و Central Logging
- LOGGING_GUIDE.md: راهنمای مشاهده و مدیریت لاگها
- PROMETHEUS_GUIDE.md: راهنمای مشاهده Metrics در Grafana
- TEMPO_GUIDE.md: راهنمای کامل Tempo و مشاهده Traces
- TEMPO_QUICK_START.md: راهنمای سریع Tempo
- VSCODE_DEBUG_GUIDE.md: راهنمای کامل debug با VS Code
- VSCODE_DEBUG.md: راهنمای debug با VS Code (نسخه قدیمی)
- DEBUG_TIMEOUT_FIX.md: راهنمای رفع مشکل Timeout در Debug
- DEBUG_TIPS.md: نکات و ترفندهای Debug
- DOCKER_VERSIONING.md: راهنمای Versioning در Docker Images
- DOCKER_BUILD_FIX.md: راهنمای رفع مشکلات Docker Build
- RUN_GUIDE.md: راهنمای اجرا (قدیمی - برای مرجع)
راهحل:
# Rebuild container
make docker-up-rebuild
# یا
docker-compose build api
docker-compose up -d apiراهحل:
# تغییر port در .env
SERVER_PORT=8081
# یا توقف برنامه استفادهکننده از port
sudo lsof -i :8080
kill -9 <PID>راهحل:
# بررسی وضعیت PostgreSQL
docker ps | grep postgres
# بررسی logs
docker-compose logs postgres
# Restart database
docker-compose restart postgresراهحل:
# Container از کد قدیمی استفاده میکند
make docker-up-rebuildتمام متغیرهای محیطی در env.example تعریف شدهاند:
# Server
SERVER_HOST=0.0.0.0
SERVER_PORT=8080
SERVER_READ_TIMEOUT=15s
SERVER_WRITE_TIMEOUT=15s
SERVER_IDLE_TIMEOUT=120s
SERVER_GRACEFUL_SHUTDOWN_TIMEOUT=10s
# Database
DB_HOST=postgres
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=postgres
DB_NAME=go_backend_db
DB_SSLMODE=disable
# JWT
JWT_SECRET_KEY=your-secret-key-change-in-production-min-32-chars
JWT_REFRESH_SECRET=your-refresh-secret-key-change-in-production-min-32-chars
JWT_EXPIRATION=24h
# Application
GIN_MODE=release # یا debug برای development
LOG_LEVEL=info # debug, info, warn, error
# OpenTelemetry
OTEL_TRACING_ENABLED=true
OTEL_SERVICE_NAME=go-backend-service
OTEL_SERVICE_VERSION=1.0.0
OTEL_JAEGER_ENABLED=true
OTEL_JAEGER_ENDPOINT=jaeger:4318- ✅ Non-root user در Docker
- ✅ Graceful shutdown
- ✅ Health checks
- ✅ Structured logging
- ✅ Error handling
⚠️ مهم: در production،JWT_SECRET_KEYرا تغییر دهید
MIT
برای مشارکت در پروژه، لطفاً:
- Issue ایجاد کنید
- Fork کنید
- Branch جدید بسازید
- تغییرات را commit کنید
- Pull Request ارسال کنید
برای سوالات و مشکلات:
- Issue در GitHub ایجاد کنید
- مستندات را بررسی کنید
- Logs را بررسی کنید:
make docker-logs