version: '3.8' services: # =================================== # POSTGRES DATABASE # =================================== postgres: image: postgres:15-alpine container_name: servicemanager-db restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB:-servicemanager} POSTGRES_USER: ${POSTGRES_USER:-servicemanager} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-servicemanager123} POSTGRES_INITDB_ARGS: "--encoding=UTF8 --locale=C" volumes: - postgres_data:/var/lib/postgresql/data - ./db/schema.sql:/docker-entrypoint-initdb.d/01-schema.sql:ro ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-servicemanager}"] interval: 10s timeout: 5s retries: 5 networks: - servicemanager-network # =================================== # REDIS CACHE & BROKER # =================================== redis: image: redis:7-alpine container_name: servicemanager-redis restart: unless-stopped command: redis-server --appendonly yes volumes: - redis_data:/data ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 5 networks: - servicemanager-network # =================================== # FASTAPI BACKEND # =================================== backend: build: context: ./backend dockerfile: ../docker/Dockerfile.backend container_name: servicemanager-backend restart: unless-stopped env_file: - .env environment: - ENVIRONMENT=${ENVIRONMENT:-development} - DEBUG=${DEBUG:-true} - SECRET_KEY=${SECRET_KEY} - DATABASE_URL=${DATABASE_URL} - REDIS_URL=${REDIS_URL} - CELERY_BROKER_URL=${CELERY_BROKER_URL} - CELERY_RESULT_BACKEND=${CELERY_RESULT_BACKEND} - JWT_SECRET_KEY=${JWT_SECRET_KEY} - CORS_ORIGINS=${CORS_ORIGINS} - SMTP_HOST=${SMTP_HOST} - SMTP_PORT=${SMTP_PORT} - DEFAULT_FROM_EMAIL=${DEFAULT_FROM_EMAIL} volumes: - ./backend:/app - uploads_data:/app/uploads - logs_data:/app/logs ports: - "8000:8000" depends_on: postgres: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 networks: - servicemanager-network # =================================== # CELERY WORKER # =================================== worker: build: context: ./workers dockerfile: ../docker/Dockerfile.worker container_name: servicemanager-worker restart: unless-stopped env_file: - .env environment: - ENVIRONMENT=${ENVIRONMENT:-development} - DATABASE_URL=${DATABASE_URL} - CELERY_BROKER_URL=${CELERY_BROKER_URL} - CELERY_RESULT_BACKEND=${CELERY_RESULT_BACKEND} - SMTP_HOST=${SMTP_HOST} - SMTP_PORT=${SMTP_PORT} - DEFAULT_FROM_EMAIL=${DEFAULT_FROM_EMAIL} volumes: - ./workers:/app - ./backend:/backend:ro - uploads_data:/app/uploads - logs_data:/app/logs depends_on: postgres: condition: service_healthy redis: condition: service_healthy networks: - servicemanager-network # =================================== # CELERY BEAT (SCHEDULER) # =================================== beat: build: context: ./workers dockerfile: ../docker/Dockerfile.worker container_name: servicemanager-beat restart: unless-stopped command: celery -A app.celery beat --loglevel=info --schedule=/tmp/celerybeat-schedule env_file: - .env environment: - ENVIRONMENT=${ENVIRONMENT:-development} - DATABASE_URL=${DATABASE_URL} - REDIS_URL=${REDIS_URL} - CELERY_BROKER_URL=${CELERY_BROKER_URL} - CELERY_RESULT_BACKEND=${CELERY_RESULT_BACKEND} volumes: - ./workers:/app - ./backend:/backend:ro depends_on: postgres: condition: service_healthy redis: condition: service_healthy networks: - servicemanager-network # =================================== # FRONTEND CLIENT (CLIENTES) # =================================== frontend-client: build: context: ./frontend-client dockerfile: ../docker/Dockerfile.frontend args: - FRONTEND_TYPE=client container_name: servicemanager-client-frontend restart: unless-stopped environment: - NODE_ENV=${ENVIRONMENT:-development} - PUBLIC_API_URL=http://backend:8000 - PUBLIC_APP_NAME=ServiceManager Cliente volumes: - ./frontend-client:/app - /app/node_modules ports: - "3000:3000" depends_on: - backend networks: - servicemanager-network # =================================== # FRONTEND INTERNAL (STAFF INTERNO) # =================================== frontend-internal: build: context: ./frontend-internal dockerfile: ../docker/Dockerfile.frontend args: - FRONTEND_TYPE=internal container_name: servicemanager-internal-frontend restart: unless-stopped environment: - NODE_ENV=${ENVIRONMENT:-development} - PUBLIC_API_URL=http://backend:8000 - PUBLIC_APP_NAME=ServiceManager Admin volumes: - ./frontend-internal:/app - /app/node_modules ports: - "3001:3000" depends_on: - backend networks: - servicemanager-network # =================================== # NGINX REVERSE PROXY # =================================== nginx: image: nginx:alpine container_name: servicemanager-nginx restart: unless-stopped volumes: - ./docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro - uploads_data:/var/www/uploads:ro ports: - "80:80" depends_on: - backend - frontend-client - frontend-internal networks: - servicemanager-network # =================================== # DEVELOPMENT TOOLS # =================================== # Adminer - Database Admin Interface adminer: image: adminer:4-standalone container_name: servicemanager-adminer restart: unless-stopped environment: ADMINER_DEFAULT_SERVER: postgres ADMINER_DESIGN: galkaev ports: - "8080:8080" depends_on: - postgres networks: - servicemanager-network profiles: - dev # MailHog - Email Testing mailhog: image: mailhog/mailhog:latest container_name: servicemanager-mailhog restart: unless-stopped ports: - "1025:1025" # SMTP server - "8025:8025" # Web UI networks: - servicemanager-network profiles: - dev # Redis Commander - Redis GUI redis-commander: image: rediscommander/redis-commander:latest container_name: servicemanager-redis-commander restart: unless-stopped environment: REDIS_HOSTS: local:redis:6379 ports: - "8081:8081" depends_on: - redis networks: - servicemanager-network profiles: - dev # =================================== # VOLUMES # =================================== volumes: postgres_data: name: servicemanager_postgres_data redis_data: name: servicemanager_redis_data uploads_data: name: servicemanager_uploads_data logs_data: name: servicemanager_logs_data celery_beat_data: name: servicemanager_celery_beat_data # =================================== # NETWORKS # =================================== networks: servicemanager-network: name: servicemanager_network driver: bridge