-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
174 lines (168 loc) · 7.77 KB
/
Copy pathdocker-compose.yml
File metadata and controls
174 lines (168 loc) · 7.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
services:
redis:
image: redis:7-alpine
container_name: gateway-nacional-redis
restart: unless-stopped
# Acessível apenas via rede interna `gateway-net` — em produção, banco
# de dados nunca deve ficar publicado no host. Para depuração local
# (redis-cli, RedisInsight), troque temporariamente por `ports:` ou
# rode os comandos via `docker exec gateway-nacional-redis redis-cli`.
expose:
- "6379"
volumes:
- redis-data:/data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 3s
retries: 5
start_period: 5s
networks:
- gateway-net
# ─────────────────────────────────────────────────────────────────────────
# Postgres dedicado da Inteligência de Licitações (cruzamento Licitações
# <-> Empresas). Store analítico separado do gateway de federação ao vivo.
# ─────────────────────────────────────────────────────────────────────────
db:
image: postgres:16-alpine
container_name: gateway-nacional-db
restart: unless-stopped
# Interno à rede gateway-net — não publicado no host, igual ao redis.
# Para depurar localmente, descomente `ports` ou use:
# docker exec gateway-nacional-db psql -U cerne -d cerne_intel
expose:
- "5432"
# ports:
# - "5432:5432"
environment:
POSTGRES_DB: cerne_intel
POSTGRES_USER: ${LIC_INTEL_DB_USER:-cerne}
POSTGRES_PASSWORD: ${LIC_INTEL_DB_PASS:-cerne}
volumes:
- cerne-intel-pgdata:/var/lib/postgresql/data
# initdb.d roda UMA vez (criação do volume), como superuser no banco
# cerne_intel — habilita pg_trgm de largada (índices GIN de busca fuzzy).
- ./docker/postgres-init:/docker-entrypoint-initdb.d:ro
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${LIC_INTEL_DB_USER:-cerne} -d cerne_intel"]
interval: 5s
timeout: 3s
retries: 10
start_period: 5s
networks:
- gateway-net
api:
build:
context: .
dockerfile: Dockerfile
image: gateway-nacional:latest
container_name: gateway-nacional-api
restart: unless-stopped
ports:
- "8080:8080"
environment:
SPRING_DATA_REDIS_HOST: redis
SPRING_DATA_REDIS_PORT: "6379"
# ── Inteligência de Licitações (cruzamento Licitações<->Empresas) ─────
# Aponta para o Postgres dedicado do serviço `db`. Habilitada por padrão
# na stack docker; o enriquecimento assíncrono preenche CNAE/IBGE em
# background. Seed dirigido (Aracaju) é OPT-IN — ingestão completa é lenta.
GATEWAY_LIC_INTEL_ENABLED: ${GATEWAY_LIC_INTEL_ENABLED:-true}
GATEWAY_LIC_INTEL_ENRICH_ENABLED: ${GATEWAY_LIC_INTEL_ENRICH_ENABLED:-true}
LIC_INTEL_DB_URL: jdbc:postgresql://db:5432/cerne_intel
LIC_INTEL_DB_USER: ${LIC_INTEL_DB_USER:-cerne}
LIC_INTEL_DB_PASS: ${LIC_INTEL_DB_PASS:-cerne}
GATEWAY_LIC_INTEL_SEED_ENABLED: ${LIC_INTEL_SEED:-false}
LIC_INTEL_SEED_MUNICIPIO: ${LIC_INTEL_SEED_MUNICIPIO:-2800308}
LIC_INTEL_SEED_JANELA_DIAS: ${LIC_INTEL_SEED_JANELA_DIAS:-60}
LIC_INTEL_MODALIDADES: ${LIC_INTEL_MODALIDADES:-6,8}
LIC_INTEL_RPS: ${LIC_INTEL_RPS:-4}
# ── FlareSolverr (anti-bot sidecar) ───────────────────────────────────
# Necessário para: CNES, e-Gestor, FIPE-Oficial e fallback PlacaFipe.
# Sem esta variável apontada, as rotas Saúde devolvem 503 com
# mensagem clara orientando ativação.
GATEWAY_FLARESOLVERR_URL: http://flaresolverr:8191
# ── SISAB sidecar (Python + Selenium + Chromium headless) ────────────
# Necessário para /api/v1/saude/sisab/* (validação de produção).
# A página JSF/Mojarra do SISAB usa plugins Bootstrap Multiselect cujo
# estado só é sincronizado via cliques reais no DOM — HTTP puro
# produz IndexOutOfBoundsException no backend. O sidecar Python encapsula
# o Selenium driver e expõe um endpoint REST consumido por este Java.
# Sem esta variável, /api/v1/saude/sisab/* responde 503 com mensagem clara.
GATEWAY_SISAB_SIDECAR_URL: http://sisab-sidecar:8000
# ── Histórico Veicular Premium (orquestração híbrida) ────────────────
# Com a chave preenchida, o gateway consome a API premium oficial em
# milissegundos. Vazia (default), o client premium curto-circuita e a
# malha de scrapers gratuitos assume como fallback de resiliência.
GATEWAY_OLHONOCARRO_KEY: ${GATEWAY_OLHONOCARRO_KEY:-}
GATEWAY_CHECKAUTO_KEY: ${GATEWAY_CHECKAUTO_KEY:-}
# ── Motor de depreciação automática por risco ────────────────────────
# Redutor sobre o preço de mercado quando há indício de leilão/sinistro.
# Clampeado à faixa mandatória [0.20, 0.30] no boot.
GATEWAY_VEICULAR_RISCO_REDUTOR_MEDIO: ${GATEWAY_VEICULAR_RISCO_REDUTOR_MEDIO:-0.20}
GATEWAY_VEICULAR_RISCO_REDUTOR_ALTO: ${GATEWAY_VEICULAR_RISCO_REDUTOR_ALTO:-0.30}
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
flaresolverr:
condition: service_started
sisab-sidecar:
condition: service_healthy
volumes:
- sigtap-db:/app/data # Persiste o banco SQLite (Indexador SIGTAP)
- sigtap-work:/home/app/.gateway-nacional # Persiste o ZIP da competência (Download)
networks:
- gateway-net
flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:latest
container_name: gateway-nacional-flaresolverr
restart: unless-stopped
ports:
- "8191:8191"
environment:
LOG_LEVEL: info
TZ: America/Sao_Paulo
networks:
- gateway-net
# ─────────────────────────────────────────────────────────────────────────
# SISAB Sidecar — Python + FastAPI + Selenium + Chromium headless.
# ─────────────────────────────────────────────────────────────────────────
# Resolve a única rota do gateway (SISAB Validação) que não é alcançável
# via HTTP puro nem via FlareSolverr — a página depende de plugins JS
# Bootstrap Multiselect cujo estado só é sincronizado via cliques reais.
# Implementação reusa lógica testada em produção do projeto AutoAPSFinancias.
sisab-sidecar:
build:
context: ./services/sisab-sidecar
dockerfile: Dockerfile
image: gateway-nacional-sisab-sidecar:latest
container_name: gateway-nacional-sisab-sidecar
restart: unless-stopped
expose:
- "8000"
environment:
LOG_LEVEL: info
TZ: America/Sao_Paulo
# Chrome em containers exige memória compartilhada generosa para
# renderizar páginas JSF complexas. /dev/shm padrão Docker é 64M,
# insuficiente — definimos 2g via shm_size abaixo.
PYTHONUNBUFFERED: "1"
shm_size: 2g
healthcheck:
test: ["CMD-SHELL", "curl -fsS http://localhost:8000/health || exit 1"]
interval: 10s
timeout: 5s
retries: 3
start_period: 30s
networks:
- gateway-net
networks:
gateway-net:
driver: bridge
volumes:
redis-data:
sigtap-db:
sigtap-work:
cerne-intel-pgdata: