OmniLink API
Instalação

Docker Swarm

Deploy em produção com stack, Traefik e segredos.

Em produção a recomendação é Docker Swarm (ou Portainer em cima do Swarm), com a imagem:

automacaodebaixocusto/omnilink-api:latest

O arquivo de referência no produto é um docker-stack.yml (Compose 3.8). Swarm não usa depends_on.

Pré-requisitos

  1. Swarm inicializado no manager.
  2. Rede overlay externa para o Traefik (criar antes do deploy):
docker network create --driver overlay network_public
  1. Traefik já rodando nessa rede, com entrypoint websecure e certresolver letsencryptresolver (labels do stack assumem isso).
  2. Segredos reais gerados (placeholders do stack falham com APP_ENV=production).

Gerar segredos

python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
python3 -c "import secrets; print(secrets.token_urlsafe(32))"
python3 -c "import secrets; print(secrets.token_urlsafe(32))"
LinhaVariávelRegra
1ENCRYPTION_KEY44 caracteres Fernet
2WEBHOOK_SIGNING_SECRET≥ 16; não pode ser change-me
3METRICS_TOKEN≥ 16

Copie os mesmos valores em api e worker. A senha do Postgres em POSTGRES_PASSWORD deve coincidir com a senha em DATABASE_URL.

O stack oficial hoje usa só environment:não há docker secret implementado. Em ambiente corporativo você pode migrar para secrets; a API só lê variáveis de ambiente.

Serviços da stack

ServiçoImagemRéplicasRedesVolume
APIautomacaodebaixocusto/omnilink-api:latest1internal + network_public
Workermesma imagem1internal
Postgrespostgres:161internalomnilink_pgdata_v2
Redisredis:71internalnenhum no stack
  • A API não publica porta no host; o Traefik encaminha para a porta 8000.
  • Healthcheck da API: GET http://127.0.0.1:8000/health/ready (interval 30s, start_period 40s).
  • Redis no stack: sem senha.
  • Ajuste o host Traefik (ex.: Host(\omnilink.seudominio.com`)`).

Réplicas de worker acima de 1 não estão no stack oficial — se aumentar, monitore CPU/RAM do Playwright. Em produção costuma-se --concurrency=1 no Celery.

Deploy

Com o docker-stack.yml preenchido (segredos e domínio):

docker stack deploy -c docker-stack.yml omnilink

Conferir:

docker stack services omnilink

Logs:

docker service logs -f omnilink_api_omnilink
docker service logs -f omnilink_worker_omnilink

Atualizar (mesmo comando, nova tag/config):

docker stack deploy -c docker-stack.yml omnilink

Remover:

docker stack rm omnilink

O que tratar como segredo

ValorOndePor quê
ENCRYPTION_KEYapi + workerFernet do cofre
WEBHOOK_SIGNING_SECRETapi + workerHMAC X-Omnilink-Signature
METRICS_TOKENapi + worker/metrics e /health/diagnostics
Senha Postgrespostgres + DATABASE_URLDeve ser a mesma
x-api-key dos tenantsnão é envHeader HTTP; hash no banco

Tabela completa: Variáveis de ambiente.

Dependências

DependênciaVersão no stackNa mesma stack?
PostgreSQLpostgres:16Sim (ou externo via DATABASE_URL)
Redisredis:7Sim (Celery + /health/ready)
Playwright/ChromiumJá na imagemNão
TraefikFora deste stackSó a API na network_public

Postgres e Redis no Swarm ficam só na overlay internal — não exponha na internet.

On this page