# Docker Compose para Next.js + PostgreSQL name: openmonetis # MODOS DE USO: # 1. Banco LOCAL (PostgreSQL em container): # - Configure DATABASE_URL com host "db" no .env # - Execute: docker compose up --build # # 2. Banco REMOTO (ex: Supabase): # - Configure DATABASE_URL com a URL do banco remoto no .env # - Execute: docker compose up app --build (apenas o serviço app) # # 3. Para parar todos os serviços: # - Execute: docker compose down # # 4. Para remover volumes (CUIDADO: apaga dados do banco local): # - Execute: docker compose down -v services: # ============================================ # Servico: PostgreSQL (Banco de dados local) # ============================================ # db: # image: postgres:18-alpine # container_name: openmonetis_postgres # restart: unless-stopped # environment: # POSTGRES_USER: ${POSTGRES_USER:-openmonetis} # POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-openmonetis_dev_password} # POSTGRES_DB: ${POSTGRES_DB:-openmonetis_db} # # Garante que os dados ficam no volume montado (evita perda apos down/up) # PGDATA: /var/lib/postgresql/data # # Configuracoes de performance # POSTGRES_INITDB_ARGS: "-E UTF8 --locale=C" # ports: # # Mapeia porta 5432 do container para 5432 do host # # Util para conectar com ferramentas externas (ex: DBeaver, pgAdmin) # - "${DB_PORT:-5432}:5432" # volumes: # # Volume nomeado para persistencia de dados # # Os dados sobrevivem ao restart do container # - postgres_data:/var/lib/postgresql/data # # Script de inicializacao (cria extensao pgcrypto automaticamente) # - ./scripts/postgres/init.sql:/docker-entrypoint-initdb.d/init.sql:ro # healthcheck: # test: # [ # "CMD-SHELL", # "pg_isready -U ${POSTGRES_USER:-openmonetis} -d ${POSTGRES_DB:-openmonetis_db}", # ] # interval: 10s # timeout: 5s # retries: 5 # start_period: 10s # networks: # - openmonetis_network # Descomentar para ativar logs de queries (debug) # command: ["postgres", "-c", "log_statement=all"] # ============================================ # Serviço: Aplicação Next.js # ============================================ app: build: context: . dockerfile: Dockerfile container_name: openmonetis_app restart: unless-stopped ports: # Mapeia porta 3000 do container para 3000 do host - "${APP_PORT:-3000}:3000" environment: # Variaveis de ambiente da aplicação NODE_ENV: production # DATABASE_URL do .env # Banco local: use host "db" (serviço Docker) # Banco remoto: use a URL completa do provider DATABASE_URL: ${DATABASE_URL} # Outras variaveis de ambiente necessarias BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET} BETTER_AUTH_URL: ${BETTER_AUTH_URL:-http://localhost:3000} # Configuracoes de email (se usar) RESEND_API_KEY: ${RESEND_API_KEY:-} RESEND_FROM_EMAIL: ${RESEND_FROM_EMAIL:-} # Configuracoes de OAuth (se usar) GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID:-} GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET:-} GITHUB_CLIENT_ID: ${GITHUB_CLIENT_ID:-} GITHUB_CLIENT_SECRET: ${GITHUB_CLIENT_SECRET:-} # Configuracoes de AI providers (se usar) ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-} OPENAI_API_KEY: ${OPENAI_API_KEY:-} GOOGLE_GENERATIVE_AI_API_KEY: ${GOOGLE_GENERATIVE_AI_API_KEY:-} OPENROUTER_API_KEY: ${OPENROUTER_API_KEY:-} # So depende do 'db' se estiver usando banco local # Para banco remoto, comente a linha abaixo ou suba apenas: docker compose up app # depends_on: # db: # condition: service_healthy networks: - openmonetis_network # Script de inicializacao: roda migrations antes de iniciar o app # ATENCAO: Em producao, considere rodar migrations separadamente por segurança entrypoint: ["/bin/sh", "-c"] command: - | echo "🚀 Aguardando banco de dados..." sleep 5 echo "📦 Rodando migrations..." pnpm db:push || echo "⚠️ Migrations falharam ou já estão atualizadas" echo "✅ Iniciando aplicação Next.js..." node server.js # Healthcheck da aplicacao healthcheck: test: [ "CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:${APP_PORT:-3000}/api/health", ] interval: 30s timeout: 10s retries: 3 start_period: 40s # ============================================ # Volumes # ============================================ volumes: postgres_data: name: openmonetis_postgres_data driver: local # ============================================ # Networks # ============================================ networks: openmonetis_network: name: openmonetis_network driver: bridge