Colocar o V3RSec de pe (docker compose)
O V3RSec é empacotado para rodar em um único nó, via docker compose, operável por uma
pessoa. Esta página é a sequência de subida real, verificada em execução — inclusive os
dois passos que mudaram desde a versão anterior: os certificados do OpenSearch (novo,
obrigatório) e as migrations (agora automáticas).
Ordem importa. Gere os certificados do OpenSearch antes da primeira subida, suba os containers, depois faça o bootstrap manual do Logto — sem ele a autenticação não funciona. Pular a ordem não quebra sempre na hora; alguns passos faltando só aparecem depois, como falha silenciosa.
1. Preparar as variáveis de ambiente
Copie o arquivo de exemplo e preencha os segredos (nenhum valor real vem versionado):
cp .env.example .env
# edite .env e troque TODOS os "troque-por-..." por segredos fortes
Variáveis essenciais
| Grupo | Variáveis | Para quê |
|---|---|---|
| Postgres (control-plane) | POSTGRES_DB, POSTGRES_USER, POSTGRES_PASSWORD |
Banco de metadados (tenants, alvos, usuários, papéis, ocorrências, auditoria). |
| Backend / PWA | BACKEND_PORT (8000), PWA_PORT (8080) |
Portas publicadas no host. São os dois únicos serviços expostos — veja a nota sobre colisão de porta no passo 4. |
| Fila | QUEUE_PASSWORD |
Redis (fila assíncrona de coleta e detecção). |
| OpenSearch | OPENSEARCH_ADMIN_USER, OPENSEARCH_ADMIN_PASSWORD, OPENSEARCH_URL |
Armazenamento e indexação. |
| MinIO | MINIO_ROOT_USER, MINIO_ROOT_PASSWORD |
Object storage on-prem para retenção fria (snapshots). |
| Logto (IdP) | LOGTO_POSTGRES_*, LOGTO_ENDPOINT, LOGTO_ADMIN_ENDPOINT, LOGTO_ISSUER, LOGTO_JWKS_URI, LOGTO_API_RESOURCE |
Serviço de identidade/login. Ajuste os endpoints para o domínio real em produção. |
| Logto (PWA) | VITE_LOGTO_ENDPOINT, VITE_LOGTO_APP_ID, VITE_LOGTO_API_RESOURCE, VITE_BACKEND_URL |
Lidos pelo aplicativo no build. O VITE_LOGTO_APP_ID você obtém no bootstrap do Logto. |
| Coletor V3RCondo | V3RCONDO_AUDIT_KEY, V3RCONDO_AUDIT_BASE_URL, V3RSEC_COLLECTOR_TENANT_ID, V3RSEC_COLLECTOR_TARGET_ID |
Chave read-only da Audit Events API e os IDs do tenant/alvo. Sem eles o worker de coleta não sobe. |
Segredos ficam fora do código:
.enve.envrcestão no.gitignore. Nunca versione o arquivo preenchido.
Atenção — a senha do OpenSearch tem exigência própria.
OPENSEARCH_ADMIN_PASSWORDprecisa ter maiúscula, minúscula, número e símbolo (mínimo 8 caracteres). Uma senha simples não dá erro claro na hora: o container do OpenSearch recusa subir, e o sintoma que aparece é o serviço reiniciando em loop ou saindo com erro genérico de segurança. Se a subida travar no OpenSearch, confira a senha antes de qualquer outra coisa.
2. Gerar os certificados TLS do OpenSearch (obrigatório, uma vez)
./deploy/opensearch/generate-certs.sh
A imagem do OpenSearch sobe, por padrão, com certificados de demonstração cuja chave
privada é pública — vem embutida na própria imagem, igual para todo mundo que a baixa.
Numa ferramenta de monitoramento de segurança isso é inaceitável mesmo em desenvolvimento
(ambiente de teste tende a virar molde do de produção, e ninguém troca certificado “depois”).
Este script gera uma CA e certificados próprios do V3RSec em deploy/opensearch/certs/
(gitignored — nenhuma chave privada é versionada) e é o que o docker-compose.yml já espera
montar no container.
Rode este passo antes da primeira subida. Se você pular, o OpenSearch ainda sobe (ele usa os certificados de demonstração por padrão), mas com a falha de segurança acima — não é um atalho seguro, é dívida.
Para acrescentar o hostname de produção ao certificado (além de opensearch, localhost e
127.0.0.1, que já vêm por padrão):
EXTRA_SAN="DNS:opensearch.v3rsec.exemplo" ./deploy/opensearch/generate-certs.sh
Depois de gerar (ou trocar) o certificado, aplique com docker compose up -d opensearch (ou
restart) — não é preciso recriar o volume de dados do OpenSearch.
3. Subir os containers
docker compose up -d --build
Isso sobe backend (Deno), PWA (React+Tailwind), Postgres, Redis, OpenSearch (+ Dashboards), Logto, CrowdSec, Prometheus/Alertmanager/Blackbox, MinIO e Vector. Apenas backend e PWA têm porta publicada no host; os motores OSS ficam na rede interna do compose (o backend é o único ponto exposto ao PWA).
Para só validar a configuração, sem subir nada:
docker compose config
As migrations do control-plane rodam sozinhas. O serviço v3rsec-migrate aplica o
schema e o seed de papéis/permissões (RBAC) automaticamente na subida, antes do backend
começar a aceitar requisições — não é preciso (e não existe mais o passo de) rodar
deno task migrate manualmente. É idempotente: subir de novo não falha nem duplica nada.
4. Onde as coisas ficam
- Backend:
http://localhost:8000— nesta fatia, a rota pública éGET /health. - PWA:
http://localhost:8080. - Logto (login):
http://localhost:3301; console admin do Logto:http://admin.localhost:3302— nãohttp://localhost:3302puro (veja o motivo no bootstrap do Logto).
Atenção — porta ocupada não é realocada sozinha. Se
BACKEND_PORTouPWA_PORTjá estiverem em uso por outro serviço do seu host, odocker compose upfalha comport is already allocated— o Docker não tenta outra porta por conta própria. Neste ambiente, por exemplo, as portas3001e8080já estavam ocupadas por outras aplicações rodando na máquina; a solução foi ajustarPWA_PORT=8081no.envantes de subir de novo. Depois de qualquer ajuste de porta, confira a porta publicada de fato comdocker compose ps(colunaPORTS) — é ela, não o valor “padrão” do.env.example, que você usa para abrir o PWA e para configurar o redirect do Logto (bootstrap, passo 7).
5. Fazer o bootstrap do Logto (obrigatório)
Antes de qualquer login funcionar, siga o Bootstrap do Logto. É um passo manual e único: criar a primeira conta admin, a organização, o aplicativo de login e o recurso de API. Sem ele, o V3RSec sobe mas ninguém entra.
Limitações conhecidas da subida
- O vínculo alvo → coletor ainda passa por IDs preenchidos no
.env(onboarding de alvo automatizado é um passo futuro). - As telas do PWA (saúde dos alvos, ocorrências, notificações) sobem com dados de exemplo — a coleta real do V3RCondo já grava no OpenSearch, mas a exibição ao vivo nas telas ainda está sendo conectada.
Veja o quadro completo em Estado atual e limitações.