Instalação
Variáveis de ambiente
O que cada variável faz em local e em produção.
A aplicação lê settings via ambiente (e .env quando presente).
x-api-key não é variável de ambiente — é header HTTP nas rotas /v1/*.
Tabela
| Nome | Obrigatória | Default | Local | Produção | O que faz |
|---|---|---|---|---|---|
APP_NAME | Não | OmniLink API | igual | igual | Título da app / OpenAPI |
APP_ENV | Não | development | development | production | development | staging | production. Em staging/production valida segredos |
APP_DEBUG | Não | false | false | false | Debug FastAPI — nunca true em produção exposta |
API_KEY_HEADER | Não | x-api-key | x-api-key | x-api-key | Nome lógico; a auth atual aceita somente x-api-key |
ENCRYPTION_KEY | Sim em staging/production | vazio → default interno só em development | vazio ok em dev | Fernet 44 chars | Criptografa o cofre (cookies/CSRF) |
WEBHOOK_SIGNING_SECRET | Sim em staging/production | default de dev | vazio ok em dev | ≥ 16, ≠ change-me | HMAC do webhook (X-Omnilink-Signature) |
METRICS_TOKEN | Sim em staging/production | "" | opcional | ≥ 16 | Protege /metrics e /health/diagnostics |
DATABASE_URL | Sim | ...@localhost:5432/omnilink | compose usa @postgres:5432 | host do serviço Swarm | SQLAlchemy/Alembic (psycopg v3) |
REDIS_URL | Declarada | redis://localhost:6379/0 | redis://redis:6379/0 | serviço Swarm | Reservada; health/Celery não usam esta var |
CELERY_BROKER_URL | Sim (worker + ready) | .../1 | redis://redis:6379/1 | serviço Swarm | Broker Celery; /health/ready faz PING aqui |
CELERY_RESULT_BACKEND | Sim (Celery) | .../2 | redis://redis:6379/2 | serviço Swarm | Backend de resultados |
DEFAULT_AFFILIATE_TAG | Não | valor da imagem | afiliadosLAB (recomendado) | sua tag | Tag Amazon quando o body não envia tag |
DATABASE_WAIT_ATTEMPTS | Não | 10 | — | ex. 40 | Tentativas de conexão no startup da API |
POSTGRES_DB | Só no Postgres | — | omnilink | omnilink | Banco inicial |
POSTGRES_USER | Só no Postgres | — | omnilink | omnilink | Deve bater com DATABASE_URL |
POSTGRES_PASSWORD | Só no Postgres | — | omnilink | senha forte | Deve bater com DATABASE_URL |
Na imagem também existem PYTHONDONTWRITEBYTECODE=1, PYTHONUNBUFFERED=1 e PLAYWRIGHT_BROWSERS_PATH=/ms-playwright.
Destaques
Tenant (x-api-key)
- Obrigatório nas rotas
/v1/*. - Multi-tenant por SHA-256 da chave (não há lista de chaves em env).
- Credenciais de loja vão no cofre (
POST /v1/accounts), criptografadas comENCRYPTION_KEY.
METRICS_TOKEN
- Obrigatório no startup se
APP_ENVéproductionoustaging. - Em development, vazio = rotas de métricas abertas.
- Uso:
Authorization: Bearer ...ou headerx-metrics-token.
Banco
- Formato:
postgresql+psycopg://USER:PASS@HOST:5432/DB - A API roda
alembic upgrade headantes do Uvicorn. - No Docker, o host é o nome do serviço (
postgres/postgres_omnilink), nãolocalhost.
Redis / Celery
Um Redis, três DBs lógicos:
| DB | Variável | Uso |
|---|---|---|
/0 | REDIS_URL | Sem uso de negócio hoje |
/1 | CELERY_BROKER_URL | Broker + health ready |
/2 | CELERY_RESULT_BACKEND | Resultados Celery |
API e worker precisam das mesmas URLs de broker/backend.
Webhooks
- Não é endpoint desta API: o worker faz POST de saída.
- Segredo:
WEBHOOK_SIGNING_SECRET - Header:
X-Omnilink-Signature(HMAC-SHA256 do JSON canônico) - Até 3 tentativas, timeout 10 s
- URL:
webhook_urlda conta ouwebhook_overrideno body
Mais contexto: Tasks e webhooks.
Gerar valores de produção
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))"ENCRYPTION_KEYWEBHOOK_SIGNING_SECRETMETRICS_TOKEN