Files
openmonetis/docker-compose-exemplo.yml

164 lines
4.9 KiB
YAML

# 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