version: '3.8' services: app: build: . ports: - "8080:8080" environment: - SERVER_PORT=8080 - SERVER_ENVIRONMENT=production - DATABASE_TYPE=sqlite - DATABASE_DSN=/app/data/data.db - JWT_SECRET_KEY=production-super-secret-jwt-key-change-me - JWT_ACCESS_TOKEN_DURATION=15m - JWT_REFRESH_TOKEN_DURATION=168h - LOGGER_LEVEL=info - LOGGER_ENCODING=json volumes: - app_data:/app/data restart: unless-stopped healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s depends_on: - db networks: - app_network # Optional MySQL service db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_DATABASE: go_echo_db MYSQL_USER: dbuser MYSQL_PASSWORD: dbpassword ports: - "3306:3306" volumes: - db_data:/var/lib/mysql restart: unless-stopped healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 30s timeout: 10s retries: 3 start_period: 30s networks: - app_network profiles: - mysql # Optional PostgreSQL service postgres: image: postgres:15-alpine environment: POSTGRES_DB: go_echo_db POSTGRES_USER: dbuser POSTGRES_PASSWORD: dbpassword ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U dbuser -d go_echo_db"] interval: 30s timeout: 10s retries: 3 start_period: 30s networks: - app_network profiles: - postgres # Optional Redis for caching/sessions redis: image: redis:7-alpine ports: - "6379:6379" volumes: - redis_data:/data restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 30s timeout: 10s retries: 3 start_period: 30s networks: - app_network profiles: - redis volumes: app_data: db_data: postgres_data: redis_data: networks: app_network: driver: bridge