Skip to content

Containers

Especificações de cada container do stack crm-galdix.

PostgreSQL

PropriedadeValor
Imagempgvector/pgvector:pg13
Containercrm-galdix-postgres-1
PortaNão exposta externamente
Volumepostgres_data/var/lib/postgresql/data
CPU1 core (cpu_quota=100000)
Network aliascrm-postgres
Health checkpg_isready a cada 10s
Restarton-failure:5 (via override)

Acesso interno: crm-galdix-postgres-1:5432

Credenciais: Via env POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB (do .env.secrets).

Redis

PropriedadeValor
Imagemredis:alpine
Containercrm-galdix-redis-1
PortaNão exposta externamente
Volumeredis_data/data
CPU0.3 core (cpu_quota=30000)
PersistênciaAOF — appendonly yes --appendfsync everysec
Network aliascrm-redis
Restarton-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)

PropriedadeValor
Imagemcrm-backend:{LOCAL_TAG} (buildada localmente)
Containercrm-galdix-backend-1
Porta127.0.0.1:3001:3001 (só localhost)
CPU2 cores (cpu_quota=200000)
FilesystemRead-only (segurança)
tmpfs/tmp
Volumes/home/crm/logs/backend + docker.sock (ro)
Restarton-failure:5
Health checkGET 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 Vault
  • REDIS_HOST=crm-galdix-redis-1, REDIS_PORT=6379, REDIS_PASSWORD
  • DATABASE_URL — placeholder no compose, real vem do Key Vault
  • NODE_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)

PropriedadeValor
Imagemcrm-frontend:{LOCAL_TAG} (buildada localmente)
Containercrm-galdix-frontend-1
Porta3000 (interna, via Traefik)
CPU1 core (cpu_quota=100000)
FilesystemRead-only (segurança)
tmpfs/tmp
Volumenext_cache/app/.next/cache
Restarton-failure:5
Health checkwget 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_KEYBuscado do Azure Key Vault pelo deploy.sh
NEXT_PUBLIC_API_BASE_URLhttps://apicrm.galdix.com.br
NEXT_PUBLIC_META_APP_IDDo .env.secrets
NEXT_PUBLIC_META_CONFIG_IDDo .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:

RotaContainerPorta
crm.galdix.com.brfrontend3000
apicrm.galdix.com.brbackend3001

TLS automático via Let's Encrypt (letsencryptresolver).

Volumes

VolumeConteúdoBackup necessário?
postgres_dataTodos os dados do bancoSim — crítico
redis_dataFilas e cache (AOF)Baixa prioridade
next_cacheCache de build Next.jsNã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

Documentação interna — Galdix CRM