252 lines
8.4 KiB
YAML
252 lines
8.4 KiB
YAML
version: '3.8'
|
|
|
|
# =============================================================================
|
|
# GoodGo Platform - Local Development Environment
|
|
# =============================================================================
|
|
#
|
|
# Prerequisites:
|
|
# 1. Copy env.local.example to .env.local and configure values
|
|
# 2. Ensure Docker and Docker Compose are installed
|
|
# 3. Get Neon PostgreSQL URL from https://console.neon.tech
|
|
#
|
|
# Start: docker-compose up -d
|
|
# Stop: docker-compose down
|
|
# Logs: docker-compose logs -f [service-name]
|
|
#
|
|
# Access Points:
|
|
# - Traefik Dashboard: http://localhost:8080
|
|
# - IAM Service: http://localhost/api/v1/auth (backward compatible)
|
|
# - IAM Service: http://localhost/api/v1/identity, /api/v1/access, /api/v1/governance
|
|
# - Web Admin: http://admin.localhost
|
|
# - Web Client: http://localhost
|
|
#
|
|
# =============================================================================
|
|
|
|
services:
|
|
# ===========================================================================
|
|
# SHARED INFRASTRUCTURE
|
|
# ===========================================================================
|
|
|
|
# Redis - Shared cache and session store
|
|
redis:
|
|
image: redis:7-alpine
|
|
container_name: redis-cache-local
|
|
command: redis-server /etc/redis/redis.conf
|
|
ports:
|
|
- "${REDIS_PORT:-6379}:6379"
|
|
volumes:
|
|
- redis_data:/data
|
|
- ../../infra/databases/redis/redis.conf:/etc/redis/redis.conf
|
|
healthcheck:
|
|
test: ["CMD", "redis-cli", "ping"]
|
|
interval: 5s
|
|
timeout: 3s
|
|
retries: 5
|
|
networks:
|
|
- microservices-network
|
|
restart: unless-stopped
|
|
|
|
# Traefik - API Gateway and Reverse Proxy
|
|
traefik:
|
|
image: traefik:v3.3
|
|
container_name: traefik-local
|
|
command:
|
|
- "--api.insecure=true"
|
|
- "--providers.docker=true"
|
|
- "--providers.docker.exposedbydefault=false"
|
|
- "--providers.docker.network=goodgo-network"
|
|
- "--providers.file.directory=/etc/traefik/dynamic"
|
|
- "--providers.file.watch=true"
|
|
- "--entrypoints.web.address=:80"
|
|
- "--log.level=${LOG_LEVEL:-INFO}"
|
|
- "--accesslog=true"
|
|
ports:
|
|
- "80:80" # HTTP
|
|
- "8080:8080" # Dashboard
|
|
volumes:
|
|
# EN: Use actual Docker Desktop socket path (not symlink)
|
|
# VI: Sử dụng đường dẫn socket thực của Docker Desktop (không phải symlink)
|
|
- ${HOME}/.docker/run/docker.sock:/var/run/docker.sock:ro
|
|
- ../../infra/traefik:/etc/traefik:ro
|
|
networks:
|
|
- microservices-network
|
|
restart: unless-stopped
|
|
labels:
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.localhost`)"
|
|
- "traefik.http.routers.traefik-dashboard.entrypoints=web"
|
|
- "traefik.http.routers.traefik-dashboard.service=api@internal"
|
|
|
|
# ===========================================================================
|
|
# BACKEND SERVICES
|
|
# ===========================================================================
|
|
|
|
# IAM Service - Identity and Access Management
|
|
iam-service:
|
|
build:
|
|
context: ../..
|
|
dockerfile: services/iam-service/Dockerfile
|
|
container_name: iam-service-local
|
|
env_file:
|
|
- .env.local
|
|
environment:
|
|
# Service-specific
|
|
- PORT=5001
|
|
- SERVICE_NAME=iam-service
|
|
- API_VERSION=${API_VERSION:-v1}
|
|
|
|
# Shared from .env.local (explicit for clarity)
|
|
- NODE_ENV=${NODE_ENV:-development}
|
|
- LOG_LEVEL=${LOG_LEVEL:-debug}
|
|
- DATABASE_URL=${DATABASE_URL}
|
|
- REDIS_HOST=${REDIS_HOST:-redis}
|
|
- REDIS_PORT=${REDIS_PORT:-6379}
|
|
- JWT_SECRET=${JWT_SECRET}
|
|
- JWT_EXPIRES_IN=${JWT_EXPIRES_IN:-15m}
|
|
- JWT_REFRESH_SECRET=${JWT_REFRESH_SECRET}
|
|
- JWT_REFRESH_EXPIRES_IN=${JWT_REFRESH_EXPIRES_IN:-7d}
|
|
- ENCRYPTION_KEY=${ENCRYPTION_KEY}
|
|
- CORS_ORIGIN=${CORS_ORIGIN}
|
|
- TRACING_ENABLED=${TRACING_ENABLED:-false}
|
|
- JAEGER_ENDPOINT=${JAEGER_ENDPOINT}
|
|
ports:
|
|
- "5001:5001"
|
|
depends_on:
|
|
redis:
|
|
condition: service_healthy
|
|
traefik:
|
|
condition: service_started
|
|
networks:
|
|
- microservices-network
|
|
restart: unless-stopped
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-f", "http://localhost:5001/health"]
|
|
interval: 30s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 40s
|
|
labels:
|
|
# Traefik service discovery
|
|
- "traefik.enable=true"
|
|
- "traefik.http.routers.iam-service.rule=PathPrefix(`/api/v1/auth`) || PathPrefix(`/api/v1/users`) || PathPrefix(`/api/v1/identity`) || PathPrefix(`/api/v1/access`) || PathPrefix(`/api/v1/governance`) || PathPrefix(`/api/v1/rbac`) || PathPrefix(`/api/v1/mfa`) || PathPrefix(`/api/v1/sessions`)"
|
|
- "traefik.http.routers.iam-service.entrypoints=web"
|
|
- "traefik.http.services.iam-service.loadbalancer.server.port=5001"
|
|
- "traefik.http.services.iam-service.loadbalancer.healthcheck.path=/health"
|
|
- "traefik.http.services.iam-service.loadbalancer.healthcheck.interval=10s"
|
|
|
|
# ===========================================================================
|
|
# FRONTEND APPLICATIONS (Temporarily disabled)
|
|
# ===========================================================================
|
|
# Uncomment when needed for development
|
|
|
|
# # Web Admin - Admin Dashboard (Next.js)
|
|
# web-admin:
|
|
# build:
|
|
# context: ../..
|
|
# dockerfile: apps/web-admin/Dockerfile
|
|
# container_name: web-admin-local
|
|
# environment:
|
|
# - NODE_ENV=${NODE_ENV:-development}
|
|
# - NEXT_PUBLIC_API_URL=http://localhost/api/v1
|
|
# ports:
|
|
# - "3000:3000"
|
|
# depends_on:
|
|
# - iam-service
|
|
# - traefik
|
|
# networks:
|
|
# - microservices-network
|
|
# restart: unless-stopped
|
|
# labels:
|
|
# # Traefik service discovery
|
|
# - "traefik.enable=true"
|
|
# - "traefik.http.routers.web-admin.rule=Host(`admin.localhost`)"
|
|
# - "traefik.http.routers.web-admin.entrypoints=web"
|
|
# - "traefik.http.services.web-admin.loadbalancer.server.port=3000"
|
|
|
|
# # Web Client - Client Application (Next.js)
|
|
# web-client:
|
|
# build:
|
|
# context: ../..
|
|
# dockerfile: apps/web-client/Dockerfile
|
|
# container_name: web-client-local
|
|
# environment:
|
|
# - NODE_ENV=${NODE_ENV:-development}
|
|
# - NEXT_PUBLIC_API_URL=http://localhost/api/v1
|
|
# ports:
|
|
# - "3001:3000"
|
|
# depends_on:
|
|
# - iam-service
|
|
# - traefik
|
|
# networks:
|
|
# - microservices-network
|
|
# restart: unless-stopped
|
|
# labels:
|
|
# # Traefik service discovery
|
|
# - "traefik.enable=true"
|
|
# - "traefik.http.routers.web-client.rule=Host(`localhost`)"
|
|
# - "traefik.http.routers.web-client.entrypoints=web"
|
|
# - "traefik.http.services.web-client.loadbalancer.server.port=3000"
|
|
|
|
# ===========================================================================
|
|
# OBSERVABILITY (Optional - Uncomment to enable)
|
|
# ===========================================================================
|
|
|
|
# Jaeger - Distributed Tracing
|
|
# jaeger:
|
|
# image: jaegertracing/all-in-one:1.47
|
|
# container_name: jaeger-local
|
|
# ports:
|
|
# - "16686:16686" # UI
|
|
# - "14268:14268" # Collector
|
|
# environment:
|
|
# - COLLECTOR_OTLP_ENABLED=true
|
|
# networks:
|
|
# - microservices-network
|
|
# restart: unless-stopped
|
|
|
|
# Prometheus - Metrics Collection
|
|
# prometheus:
|
|
# image: prom/prometheus:latest
|
|
# container_name: prometheus-local
|
|
# ports:
|
|
# - "9090:9090"
|
|
# volumes:
|
|
# - ../../infra/observability/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
|
|
# - prometheus_data:/prometheus
|
|
# networks:
|
|
# - microservices-network
|
|
# restart: unless-stopped
|
|
|
|
# Grafana - Metrics Visualization
|
|
# grafana:
|
|
# image: grafana/grafana:latest
|
|
# container_name: grafana-local
|
|
# ports:
|
|
# - "3001:3000"
|
|
# environment:
|
|
# - GF_SECURITY_ADMIN_PASSWORD=admin
|
|
# volumes:
|
|
# - grafana_data:/var/lib/grafana
|
|
# networks:
|
|
# - microservices-network
|
|
# restart: unless-stopped
|
|
|
|
# =============================================================================
|
|
# VOLUMES
|
|
# =============================================================================
|
|
volumes:
|
|
redis_data:
|
|
driver: local
|
|
# prometheus_data:
|
|
# driver: local
|
|
# grafana_data:
|
|
# driver: local
|
|
|
|
# =============================================================================
|
|
# NETWORKS
|
|
# =============================================================================
|
|
networks:
|
|
microservices-network:
|
|
driver: bridge
|
|
name: goodgo-network
|