compose: rastro-node v4.8 (Rastro Vista)

This commit is contained in:
Erico Mac
2026-10-06 21:03:40 -03:00
parent 914df36be7
commit 1125dbfb47
2 changed files with 32 additions and 30 deletions
+16 -15
View File
@@ -89,7 +89,7 @@ services:
- '5000' - '5000'
ingestor: ingestor:
# DRENAGEM do ONE (passagens + fotos). Valores de cadência da produção antiga. # DRENAGEM do ONE (passagens + fotos). Valores de cadência da produção antiga.
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.7' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.8'
restart: unless-stopped restart: unless-stopped
# Só ORDEM de partida, sem `condition: service_healthy`: a espera de verdade é # Só ORDEM de partida, sem `condition: service_healthy`: a espera de verdade é
# dentro do container (`wait-for-db schema rabbitmq`). Com a condição aqui, o # dentro do container (`wait-for-db schema rabbitmq`). Com a condição aqui, o
@@ -128,7 +128,7 @@ services:
MINIO_BUCKET: rastro-photos MINIO_BUCKET: rastro-photos
command: 'sh -c "wait-for-db schema rabbitmq && pnpm --filter @rastro/ingestor start"' command: 'sh -c "wait-for-db schema rabbitmq && pnpm --filter @rastro/ingestor start"'
migrate: migrate:
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.7' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.8'
restart: 'no' restart: 'no'
depends_on: depends_on:
- db - db
@@ -141,7 +141,7 @@ services:
DB_CONNECTION_LIMIT: '5' DB_CONNECTION_LIMIT: '5'
command: 'sh -c "wait-for-db && pnpm --filter @rastro/db migrate && pnpm --filter @rastro/db postgis && pnpm --filter @rastro/db timescale && pnpm --filter @rastro/db intel && pnpm --filter @rastro/db seed:access && pnpm --filter @rastro/db analyze && pnpm --filter @rastro/db restore-users"' command: 'sh -c "wait-for-db && pnpm --filter @rastro/db migrate && pnpm --filter @rastro/db postgis && pnpm --filter @rastro/db timescale && pnpm --filter @rastro/db intel && pnpm --filter @rastro/db seed:access && pnpm --filter @rastro/db analyze && pnpm --filter @rastro/db restore-users"'
processor: processor:
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.7' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.8'
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- db - db
@@ -168,7 +168,7 @@ services:
command: 'sh -c "wait-for-db schema rabbitmq && pnpm --filter @rastro/processor start"' command: 'sh -c "wait-for-db schema rabbitmq && pnpm --filter @rastro/processor start"'
dfe-worker: dfe-worker:
# Cadeia MDF-e → CT-e → NF-e (SEFAZ; Teradata para transporte além de D+1) + rota OSRM. # Cadeia MDF-e → CT-e → NF-e (SEFAZ; Teradata para transporte além de D+1) + rota OSRM.
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.7' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.8'
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- db - db
@@ -226,7 +226,7 @@ services:
TERADATA_USER: '${TERADATA_USER}' TERADATA_USER: '${TERADATA_USER}'
TERADATA_PASSWORD: '${TERADATA_PASSWORD}' TERADATA_PASSWORD: '${TERADATA_PASSWORD}'
backend: backend:
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.7' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.8'
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- db - db
@@ -261,7 +261,7 @@ services:
DFE_CERT_PFX_BASE64: '${DFE_CERT_PFX_BASE64}' DFE_CERT_PFX_BASE64: '${DFE_CERT_PFX_BASE64}'
DFE_CERT_PASSPHRASE: '${DFE_CERT_PASSPHRASE}' DFE_CERT_PASSPHRASE: '${DFE_CERT_PASSPHRASE}'
DFE_TLS_REJECT_UNAUTHORIZED: 'false' DFE_TLS_REJECT_UNAUTHORIZED: 'false'
# Rastro Campo (PWA volante). O registro de passagem (610500) nasce DESLIGADO e # Rastro Vista (PWA volante). O registro de passagem (610500) nasce DESLIGADO e
# em HOMOLOGAÇÃO (tpAmb 2): ligar CAMPO_PASSAGEM_ENABLED só depois de ver cStat # em HOMOLOGAÇÃO (tpAmb 2): ligar CAMPO_PASSAGEM_ENABLED só depois de ver cStat
# 135/136 em homologação; produção = SEFAZ_EVENTO_TP_AMB=1. # 135/136 em homologação; produção = SEFAZ_EVENTO_TP_AMB=1.
CAMPO_PUBLIC_URL: 'https://${CAMPO_DOMAIN}' CAMPO_PUBLIC_URL: 'https://${CAMPO_DOMAIN}'
@@ -296,7 +296,7 @@ services:
- traefik.http.routers.rastroapi.priority=1000 - traefik.http.routers.rastroapi.priority=1000
- traefik.http.routers.rastroapi.service=rastroapi - traefik.http.routers.rastroapi.service=rastroapi
- traefik.http.services.rastroapi.loadbalancer.server.port=39010 - traefik.http.services.rastroapi.loadbalancer.server.port=39010
# /api no domínio do Rastro Campo: roteador SEPARADO — se CAMPO_DOMAIN estiver # /api no domínio do Rastro Vista: roteador SEPARADO — se CAMPO_DOMAIN estiver
# vazio, só ele fica inválido; o /api do web/admin continua de pé. # vazio, só ele fica inválido; o /api do web/admin continua de pé.
- 'traefik.http.routers.rastroapicampo.rule=Host(`${CAMPO_DOMAIN}`) && PathPrefix(`/api`)' - 'traefik.http.routers.rastroapicampo.rule=Host(`${CAMPO_DOMAIN}`) && PathPrefix(`/api`)'
- traefik.http.routers.rastroapicampo.entryPoints=https - traefik.http.routers.rastroapicampo.entryPoints=https
@@ -305,7 +305,7 @@ services:
- traefik.http.routers.rastroapicampo.priority=1000 - traefik.http.routers.rastroapicampo.priority=1000
- traefik.http.routers.rastroapicampo.service=rastroapi - traefik.http.routers.rastroapicampo.service=rastroapi
web: web:
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.7' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.8'
restart: unless-stopped restart: unless-stopped
environment: environment:
DATABASE_URL: 'postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public' DATABASE_URL: 'postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public'
@@ -340,7 +340,7 @@ services:
- traefik.http.routers.rastroweb.service=rastroweb - traefik.http.routers.rastroweb.service=rastroweb
- traefik.http.services.rastroweb.loadbalancer.server.port=39000 - traefik.http.services.rastroweb.loadbalancer.server.port=39000
admin: admin:
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.7' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.8'
restart: unless-stopped restart: unless-stopped
environment: environment:
DATABASE_URL: 'postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public' DATABASE_URL: 'postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public'
@@ -369,12 +369,13 @@ services:
- traefik.http.routers.rastroadmin.priority=10 - traefik.http.routers.rastroadmin.priority=10
- traefik.http.routers.rastroadmin.service=rastroadmin - traefik.http.routers.rastroadmin.service=rastroadmin
- traefik.http.services.rastroadmin.loadbalancer.server.port=39020 - traefik.http.services.rastroadmin.loadbalancer.server.port=39020
# Rastro Campo — PWA da fiscalização volante. O endereço sai da variável # Rastro Vista — PWA da fiscalização volante (endereço: rastrovista.<dominio>).
# CAMPO_DOMAIN: basta defini-la e apontar o DNS, SEM configurar domínio na tela do # O identificador interno segue `campo` (serviço, rotas /api/campo, permissões
# Coolify (como o /api do backend já faz). HTTPS é obrigatório — sem ele o # campo.*): renomear por dentro exigiria migrar permissões já gravadas no banco,
# navegador não libera a câmera. # e ninguém além de nós vê esses nomes. HTTPS é obrigatório — sem certificado
# válido o navegador não libera a câmera.
campo: campo:
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.7' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.8'
restart: unless-stopped restart: unless-stopped
environment: environment:
DATABASE_URL: 'postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public' DATABASE_URL: 'postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public'
@@ -406,7 +407,7 @@ services:
- traefik.http.routers.rastrocampo.priority=10 - traefik.http.routers.rastrocampo.priority=10
- traefik.http.routers.rastrocampo.service=rastrocampo - traefik.http.routers.rastrocampo.service=rastrocampo
- traefik.http.services.rastrocampo.loadbalancer.server.port=39030 - traefik.http.services.rastrocampo.loadbalancer.server.port=39030
# OCR de placas do Rastro Campo (CPU, modelos embutidos na imagem). Só rede interna. # OCR de placas do Rastro Vista (CPU, modelos embutidos na imagem). Só rede interna.
alpr: alpr:
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-alpr:v1' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-alpr:v1'
restart: unless-stopped restart: unless-stopped
+16 -15
View File
@@ -89,7 +89,7 @@ services:
- '5000' - '5000'
ingestor: ingestor:
# DRENAGEM do ONE (passagens + fotos). Valores de cadência da produção antiga. # DRENAGEM do ONE (passagens + fotos). Valores de cadência da produção antiga.
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.7' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.8'
restart: unless-stopped restart: unless-stopped
# Só ORDEM de partida, sem `condition: service_healthy`: a espera de verdade é # Só ORDEM de partida, sem `condition: service_healthy`: a espera de verdade é
# dentro do container (`wait-for-db schema rabbitmq`). Com a condição aqui, o # dentro do container (`wait-for-db schema rabbitmq`). Com a condição aqui, o
@@ -128,7 +128,7 @@ services:
MINIO_BUCKET: rastro-photos MINIO_BUCKET: rastro-photos
command: 'sh -c "wait-for-db schema rabbitmq && pnpm --filter @rastro/ingestor start"' command: 'sh -c "wait-for-db schema rabbitmq && pnpm --filter @rastro/ingestor start"'
migrate: migrate:
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.7' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.8'
restart: 'no' restart: 'no'
depends_on: depends_on:
- db - db
@@ -141,7 +141,7 @@ services:
DB_CONNECTION_LIMIT: '5' DB_CONNECTION_LIMIT: '5'
command: 'sh -c "wait-for-db && pnpm --filter @rastro/db migrate && pnpm --filter @rastro/db postgis && pnpm --filter @rastro/db timescale && pnpm --filter @rastro/db intel && pnpm --filter @rastro/db seed:access && pnpm --filter @rastro/db analyze && pnpm --filter @rastro/db restore-users"' command: 'sh -c "wait-for-db && pnpm --filter @rastro/db migrate && pnpm --filter @rastro/db postgis && pnpm --filter @rastro/db timescale && pnpm --filter @rastro/db intel && pnpm --filter @rastro/db seed:access && pnpm --filter @rastro/db analyze && pnpm --filter @rastro/db restore-users"'
processor: processor:
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.7' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.8'
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- db - db
@@ -168,7 +168,7 @@ services:
command: 'sh -c "wait-for-db schema rabbitmq && pnpm --filter @rastro/processor start"' command: 'sh -c "wait-for-db schema rabbitmq && pnpm --filter @rastro/processor start"'
dfe-worker: dfe-worker:
# Cadeia MDF-e → CT-e → NF-e (SEFAZ; Teradata para transporte além de D+1) + rota OSRM. # Cadeia MDF-e → CT-e → NF-e (SEFAZ; Teradata para transporte além de D+1) + rota OSRM.
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.7' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.8'
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- db - db
@@ -226,7 +226,7 @@ services:
TERADATA_USER: '${TERADATA_USER}' TERADATA_USER: '${TERADATA_USER}'
TERADATA_PASSWORD: '${TERADATA_PASSWORD}' TERADATA_PASSWORD: '${TERADATA_PASSWORD}'
backend: backend:
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.7' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.8'
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- db - db
@@ -261,7 +261,7 @@ services:
DFE_CERT_PFX_BASE64: '${DFE_CERT_PFX_BASE64}' DFE_CERT_PFX_BASE64: '${DFE_CERT_PFX_BASE64}'
DFE_CERT_PASSPHRASE: '${DFE_CERT_PASSPHRASE}' DFE_CERT_PASSPHRASE: '${DFE_CERT_PASSPHRASE}'
DFE_TLS_REJECT_UNAUTHORIZED: 'false' DFE_TLS_REJECT_UNAUTHORIZED: 'false'
# Rastro Campo (PWA volante). O registro de passagem (610500) nasce DESLIGADO e # Rastro Vista (PWA volante). O registro de passagem (610500) nasce DESLIGADO e
# em HOMOLOGAÇÃO (tpAmb 2): ligar CAMPO_PASSAGEM_ENABLED só depois de ver cStat # em HOMOLOGAÇÃO (tpAmb 2): ligar CAMPO_PASSAGEM_ENABLED só depois de ver cStat
# 135/136 em homologação; produção = SEFAZ_EVENTO_TP_AMB=1. # 135/136 em homologação; produção = SEFAZ_EVENTO_TP_AMB=1.
CAMPO_PUBLIC_URL: 'https://${CAMPO_DOMAIN}' CAMPO_PUBLIC_URL: 'https://${CAMPO_DOMAIN}'
@@ -296,7 +296,7 @@ services:
- traefik.http.routers.rastroapi.priority=1000 - traefik.http.routers.rastroapi.priority=1000
- traefik.http.routers.rastroapi.service=rastroapi - traefik.http.routers.rastroapi.service=rastroapi
- traefik.http.services.rastroapi.loadbalancer.server.port=39010 - traefik.http.services.rastroapi.loadbalancer.server.port=39010
# /api no domínio do Rastro Campo: roteador SEPARADO — se CAMPO_DOMAIN estiver # /api no domínio do Rastro Vista: roteador SEPARADO — se CAMPO_DOMAIN estiver
# vazio, só ele fica inválido; o /api do web/admin continua de pé. # vazio, só ele fica inválido; o /api do web/admin continua de pé.
- 'traefik.http.routers.rastroapicampo.rule=Host(`${CAMPO_DOMAIN}`) && PathPrefix(`/api`)' - 'traefik.http.routers.rastroapicampo.rule=Host(`${CAMPO_DOMAIN}`) && PathPrefix(`/api`)'
- traefik.http.routers.rastroapicampo.entryPoints=https - traefik.http.routers.rastroapicampo.entryPoints=https
@@ -305,7 +305,7 @@ services:
- traefik.http.routers.rastroapicampo.priority=1000 - traefik.http.routers.rastroapicampo.priority=1000
- traefik.http.routers.rastroapicampo.service=rastroapi - traefik.http.routers.rastroapicampo.service=rastroapi
web: web:
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.7' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.8'
restart: unless-stopped restart: unless-stopped
environment: environment:
DATABASE_URL: 'postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public' DATABASE_URL: 'postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public'
@@ -340,7 +340,7 @@ services:
- traefik.http.routers.rastroweb.service=rastroweb - traefik.http.routers.rastroweb.service=rastroweb
- traefik.http.services.rastroweb.loadbalancer.server.port=39000 - traefik.http.services.rastroweb.loadbalancer.server.port=39000
admin: admin:
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.7' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.8'
restart: unless-stopped restart: unless-stopped
environment: environment:
DATABASE_URL: 'postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public' DATABASE_URL: 'postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public'
@@ -369,12 +369,13 @@ services:
- traefik.http.routers.rastroadmin.priority=10 - traefik.http.routers.rastroadmin.priority=10
- traefik.http.routers.rastroadmin.service=rastroadmin - traefik.http.routers.rastroadmin.service=rastroadmin
- traefik.http.services.rastroadmin.loadbalancer.server.port=39020 - traefik.http.services.rastroadmin.loadbalancer.server.port=39020
# Rastro Campo — PWA da fiscalização volante. O endereço sai da variável # Rastro Vista — PWA da fiscalização volante (endereço: rastrovista.<dominio>).
# CAMPO_DOMAIN: basta defini-la e apontar o DNS, SEM configurar domínio na tela do # O identificador interno segue `campo` (serviço, rotas /api/campo, permissões
# Coolify (como o /api do backend já faz). HTTPS é obrigatório — sem ele o # campo.*): renomear por dentro exigiria migrar permissões já gravadas no banco,
# navegador não libera a câmera. # e ninguém além de nós vê esses nomes. HTTPS é obrigatório — sem certificado
# válido o navegador não libera a câmera.
campo: campo:
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.7' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-node:v4.8'
restart: unless-stopped restart: unless-stopped
environment: environment:
DATABASE_URL: 'postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public' DATABASE_URL: 'postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public'
@@ -406,7 +407,7 @@ services:
- traefik.http.routers.rastrocampo.priority=10 - traefik.http.routers.rastrocampo.priority=10
- traefik.http.routers.rastrocampo.service=rastrocampo - traefik.http.routers.rastrocampo.service=rastrocampo
- traefik.http.services.rastrocampo.loadbalancer.server.port=39030 - traefik.http.services.rastrocampo.loadbalancer.server.port=39030
# OCR de placas do Rastro Campo (CPU, modelos embutidos na imagem). Só rede interna. # OCR de placas do Rastro Vista (CPU, modelos embutidos na imagem). Só rede interna.
alpr: alpr:
image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-alpr:v1' image: 'gitea.externo.utic.app.br/ericoalmeida/rastro-alpr:v1'
restart: unless-stopped restart: unless-stopped