version: '3.8' services: # ============================ # BANCO DE DADOS PRINCIPAL # ============================ postgres: image: postgres:15-alpine restart: always environment: POSTGRES_DB: edumanager POSTGRES_USER: edumanager POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-EduManager2026!Seguro} volumes: - pgdata:/var/lib/postgresql/data - ./schema.sql:/docker-entrypoint-initdb.d/01_schema.sql healthcheck: test: ["CMD-SHELL", "pg_isready -U edumanager"] interval: 10s timeout: 5s retries: 5 networks: - edumanager-internal # ============================ # STORAGE S3-COMPATIBLE (MINIO) # ============================ minio: image: minio/minio:latest restart: always command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minioadmin} MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-MiniO2026!Seguro} volumes: - miniodata:/data networks: - edumanager-internal - traefik-public deploy: labels: - "traefik.enable=true" - "traefik.http.routers.minio.rule=Host(`storageedu.microtecinformaticacurso.com.br`)" - "traefik.http.routers.minio.entrypoints=websecure" - "traefik.http.routers.minio.tls.certresolver=letsencrypt" - "traefik.http.services.minio.loadbalancer.server.port=9000" # ============================ # EDUMANAGER (PAINEL ADMIN) # ============================ edumanager: image: edumanager-app:latest restart: always depends_on: - postgres - minio environment: - NODE_ENV=production - PORT=3000 - DATABASE_URL=postgresql://edumanager:${POSTGRES_PASSWORD:-EduManager2026!Seguro}@postgres:5432/edumanager - JWT_SECRET=${JWT_SECRET:-EduManager-JWT-Secret-2026!} - MINIO_ENDPOINT=minio - MINIO_PORT=9000 - MINIO_ACCESS_KEY=${MINIO_ROOT_USER:-minioadmin} - MINIO_SECRET_KEY=${MINIO_ROOT_PASSWORD:-MiniO2026!Seguro} - MINIO_PUBLIC_URL=${MINIO_PUBLIC_URL:-https://storageedu.microtecinformaticacurso.com.br} - ASAAS_API_KEY=${ASAAS_API_KEY} - ASAAS_API_URL=${ASAAS_API_URL} - ASAAS_WEBHOOK_TOKEN=${ASAAS_WEBHOOK_TOKEN} networks: - edumanager-internal - traefik-public deploy: labels: - "traefik.enable=true" - "traefik.http.routers.edumanager.rule=Host(`edumanager.microtecinformaticacurso.com.br`)" - "traefik.http.routers.edumanager.entrypoints=websecure" - "traefik.http.routers.edumanager.tls.certresolver=letsencrypt" - "traefik.http.services.edumanager.loadbalancer.server.port=3000" # ============================ # PORTAL DO ALUNO # ============================ portalaluno: image: portalaluno-app:latest restart: always depends_on: - postgres environment: - NODE_ENV=production - PORT=3001 - DATABASE_URL=postgresql://edumanager:${POSTGRES_PASSWORD:-EduManager2026!Seguro}@postgres:5432/edumanager - JWT_SECRET=${JWT_SECRET:-EduManager-JWT-Secret-2026!} - MINIO_ENDPOINT=minio - MINIO_PORT=9000 - MINIO_ACCESS_KEY=${MINIO_ROOT_USER:-minioadmin} - MINIO_SECRET_KEY=${MINIO_ROOT_PASSWORD:-MiniO2026!Seguro} - MINIO_PUBLIC_URL=${MINIO_PUBLIC_URL:-https://storageedu.microtecinformaticacurso.com.br} networks: - edumanager-internal - traefik-public deploy: labels: - "traefik.enable=true" - "traefik.http.routers.portalaluno.rule=Host(`portal.microtecinformaticacurso.com.br`)" - "traefik.http.routers.portalaluno.entrypoints=websecure" - "traefik.http.routers.portalaluno.tls.certresolver=letsencrypt" - "traefik.http.services.portalaluno.loadbalancer.server.port=3001" volumes: pgdata: miniodata: networks: edumanager-internal: driver: overlay traefik-public: external: true