# Docker Compose para stack completo: Frontend + Backend + DB # Uso: docker compose -f docker-compose.yml up -d services: # ============================================ # FRONTEND (React/Vite + Nginx) # ============================================ frontend: build: context: ./frontend dockerfile: Dockerfile args: VITE_API_URL: /api image: ${COMPOSE_PROJECT_NAME:-myapp}-frontend:latest container_name: ${COMPOSE_PROJECT_NAME:-myapp}-frontend restart: unless-stopped ports: - "${FRONTEND_PORT:-3000}:80" depends_on: backend: condition: service_healthy networks: - app-network healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:80"] interval: 30s timeout: 5s retries: 3 # ============================================ # BACKEND (Go) # ============================================ backend: build: context: ./backend dockerfile: Dockerfile image: ${COMPOSE_PROJECT_NAME:-myapp}-backend:latest container_name: ${COMPOSE_PROJECT_NAME:-myapp}-backend restart: unless-stopped ports: - "${BACKEND_PORT:-8080}:8080" environment: - DATABASE_URL=postgres://${POSTGRES_USER:-app}:${POSTGRES_PASSWORD:-secret}@db:5432/${POSTGRES_DB:-app}?sslmode=disable - REDIS_URL=redis://redis:6379 - JWT_SECRET=${JWT_SECRET:-change-me-in-production} - ENV=${ENV:-production} depends_on: db: condition: service_healthy redis: condition: service_healthy networks: - app-network healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/health"] interval: 30s timeout: 5s retries: 3 # ============================================ # DATABASE (PostgreSQL) # ============================================ db: image: postgres:16-alpine container_name: ${COMPOSE_PROJECT_NAME:-myapp}-db restart: unless-stopped environment: POSTGRES_USER: ${POSTGRES_USER:-app} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-secret} POSTGRES_DB: ${POSTGRES_DB:-app} volumes: - postgres_data:/var/lib/postgresql/data # Opcional: scripts de inicialización # - ./init.sql:/docker-entrypoint-initdb.d/init.sql ports: - "${POSTGRES_PORT:-5432}:5432" networks: - app-network healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-app} -d ${POSTGRES_DB:-app}"] interval: 10s timeout: 5s retries: 5 # ============================================ # CACHE (Redis) # ============================================ redis: image: redis:7-alpine container_name: ${COMPOSE_PROJECT_NAME:-myapp}-redis restart: unless-stopped command: redis-server --appendonly yes volumes: - redis_data:/data ports: - "${REDIS_PORT:-6379}:6379" networks: - app-network healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 # ============================================ # NETWORKS # ============================================ networks: app-network: driver: bridge # ============================================ # VOLUMES # ============================================ volumes: postgres_data: name: ${COMPOSE_PROJECT_NAME:-myapp}_postgres_data redis_data: name: ${COMPOSE_PROJECT_NAME:-myapp}_redis_data