Tema
Containers
Especificações de cada container do stack crm-galdix.
PostgreSQL
| Propriedade | Valor |
|---|---|
| Imagem | pgvector/pgvector:pg13 |
| Container | crm-galdix-postgres-1 |
| Porta | Não exposta externamente |
| Volume | postgres_data → /var/lib/postgresql/data |
| CPU | 1 core (cpu_quota=100000) |
| Network alias | crm-postgres |
| Health check | pg_isready a cada 10s |
| Restart | on-failure:5 (via override) |
Acesso interno: crm-galdix-postgres-1:5432
Credenciais: Via env POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB (do .env.secrets).
Redis
| Propriedade | Valor |
|---|---|
| Imagem | redis:alpine |
| Container | crm-galdix-redis-1 |
| Porta | Não exposta externamente |
| Volume | redis_data → /data |
| CPU | 0.3 core (cpu_quota=30000) |
| Persistência | AOF — appendonly yes --appendfsync everysec |
| Network alias | crm-redis |
| Restart | on-failure:5 |
Acesso interno: crm-galdix-redis-1:6379
Senha: Obrigatória via --requirepass ${REDIS_PASSWORD}.
Usos:
- Filas BullMQ (whatsapp-send, email-send, campaign-trigger, post-sale-survey)
- Deduplicação de mensagens WhatsApp (TTL 5 min)
- Cache de alias de lojas (TTL 60s)
- Deduplicação de webhooks (SyncEvent)
Backend (NestJS)
| Propriedade | Valor |
|---|---|
| Imagem | crm-backend:{LOCAL_TAG} (buildada localmente) |
| Container | crm-galdix-backend-1 |
| Porta | 127.0.0.1:3001:3001 (só localhost) |
| CPU | 2 cores (cpu_quota=200000) |
| Filesystem | Read-only (segurança) |
| tmpfs | /tmp |
| Volumes | /home/crm/logs/backend + docker.sock (ro) |
| Restart | on-failure:5 |
| Health check | GET http://localhost:3001/health |
Domínio público: apicrm.galdix.com.br (roteado pelo Traefik)
Variáveis críticas de runtime:
AZURE_KEYVAULT_URL,AZURE_TENANT_ID,AZURE_CLIENT_ID,AZURE_CLIENT_SECRET— acesso ao Key VaultREDIS_HOST=crm-galdix-redis-1,REDIS_PORT=6379,REDIS_PASSWORDDATABASE_URL— placeholder no compose, real vem do Key VaultNODE_ENV=production
Por que acessa o docker.sock? O backend precisa executar docker exec para buscar a CLERK_PUBLISHABLE_KEY do Key Vault durante o deploy do frontend.
Frontend (Next.js)
| Propriedade | Valor |
|---|---|
| Imagem | crm-frontend:{LOCAL_TAG} (buildada localmente) |
| Container | crm-galdix-frontend-1 |
| Porta | 3000 (interna, via Traefik) |
| CPU | 1 core (cpu_quota=100000) |
| Filesystem | Read-only (segurança) |
| tmpfs | /tmp |
| Volume | next_cache → /app/.next/cache |
| Restart | on-failure:5 |
| Health check | wget http://localhost:3000/ a cada 15s |
Domínio público: crm.galdix.com.br (roteado pelo Traefik)
IMPORTANTE: As variáveis NEXT_PUBLIC_* são injetadas no build da imagem, não em runtime. Mudar essas variáveis exige rebuild completo.
| Variável (build-time) | Valor |
|---|---|
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY | Buscado do Azure Key Vault pelo deploy.sh |
NEXT_PUBLIC_API_BASE_URL | https://apicrm.galdix.com.br |
NEXT_PUBLIC_META_APP_ID | Do .env.secrets |
NEXT_PUBLIC_META_CONFIG_ID | Do .env.secrets |
Traefik
Não gerenciado por este projeto — é um container separado na rede network_swarm_public. Roteamento definido via labels em docker-compose.labels.yml:
| Rota | Container | Porta |
|---|---|---|
crm.galdix.com.br | frontend | 3000 |
apicrm.galdix.com.br | backend | 3001 |
TLS automático via Let's Encrypt (letsencryptresolver).
Volumes
| Volume | Conteúdo | Backup necessário? |
|---|---|---|
postgres_data | Todos os dados do banco | Sim — crítico |
redis_data | Filas e cache (AOF) | Baixa prioridade |
next_cache | Cache de build Next.js | Não |
Verificar status
bash
# Status de todos os containers
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Image}}" | grep crm-galdix
# Uso de recursos
docker stats --no-stream | grep crm-galdix