version: '3.8' services: # Main application app: build: context: . dockerfile: Dockerfile ports: - "3030:3030" environment: - RUST_LOG=info - ENVIRONMENT=production - DATABASE_URL=postgresql://postgres:password@db:5432/rustelo_prod - REDIS_URL=redis://redis:6379 depends_on: db: condition: service_healthy redis: condition: service_healthy volumes: - ./uploads:/app/uploads - ./logs:/app/logs - ./data:/app/data - ./backups:/app/backups networks: - app-network restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3030/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s # Development version with hot reload app-dev: build: context: . dockerfile: Dockerfile.dev ports: - "3030:3030" - "3031:3031" # Hot reload port environment: - RUST_LOG=debug - ENVIRONMENT=development - DATABASE_URL=postgresql://postgres:password@db:5432/rustelo_dev - REDIS_URL=redis://redis:6379 depends_on: db: condition: service_healthy redis: condition: service_healthy volumes: - .:/app - ./target:/app/target - ./uploads:/app/uploads - ./logs:/app/logs networks: - app-network profiles: - dev # PostgreSQL database db: image: postgres:15-alpine environment: - POSTGRES_DB=rustelo_prod - POSTGRES_USER=postgres - POSTGRES_PASSWORD=password - POSTGRES_INITDB_ARGS=--auth-host=scram-sha-256 volumes: - postgres_data:/var/lib/postgresql/data - ./migrations:/docker-entrypoint-initdb.d ports: - "5432:5432" networks: - app-network restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 # Redis for caching and sessions redis: image: redis:7-alpine command: redis-server --appendonly yes volumes: - redis_data:/data ports: - "6379:6379" networks: - app-network restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 # Prometheus for metrics collection prometheus: image: prom/prometheus:latest ports: - "9090:9090" volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus_data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/usr/share/prometheus/console_libraries' - '--web.console.templates=/usr/share/prometheus/consoles' - '--web.enable-lifecycle' networks: - app-network restart: unless-stopped # Grafana for metrics visualization grafana: image: grafana/grafana:latest ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_PASSWORD=admin volumes: - grafana_data:/var/lib/grafana - ./monitoring/grafana/dashboards:/var/lib/grafana/dashboards - ./monitoring/grafana/provisioning:/etc/grafana/provisioning networks: - app-network restart: unless-stopped # Nginx reverse proxy (optional) nginx: image: nginx:alpine ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./certs:/etc/nginx/certs depends_on: - app networks: - app-network restart: unless-stopped profiles: - proxy # Database migration runner migrate: build: context: . dockerfile: Dockerfile command: ["./server", "--migrate"] environment: - DATABASE_URL=postgresql://postgres:password@db:5432/rustelo_prod depends_on: db: condition: service_healthy networks: - app-network profiles: - migrate volumes: postgres_data: redis_data: prometheus_data: grafana_data: networks: app-network: driver: bridge