feat: docker compose sobe a plataforma inteira - #54
Merged
Conversation
O compose so tinha MongoDB: quem clonava ainda precisava instalar Node, rodar npm install nos dois pacotes, configurar .env e subir dois processos so para ver a aplicacao. Para quem chega pelo post de lancamento, isso e a maior barreira que existe. Agora 'docker compose up -d' sobe banco, API e interface, e tudo responde em http://localhost:8080. A interface e servida por nginx, que faz o proxy de /api e do WebSocket - assim so uma porta precisa existir no host, e o navegador nunca precisa saber o endereco do backend. Subir de verdade encontrou dois bugs que nenhuma leitura de codigo teria mostrado: 1. o NotificationContext montava a URL do WebSocket com hostname + ':3000' fixo. Atras de qualquer proxy isso quebra - no compose a porta 3000 nem existe no host. Passa a derivar de window.location.host, como o hook irmao ja fazia; 2. minha primeira versao do nginx fazia proxy de /ws, mas a rota real e /api/ws/notifications - e o location /api/ generico nao repassa os cabecalhos de Upgrade, entao o handshake falharia de qualquer forma. Agora ha um location proprio, antes do generico. As imagens sao multi-stage: o backend fica sem devDependencies e roda como usuario sem privilegio; o frontend compila com Node e serve com nginx, sem carregar Node em producao. O seed fica sob o profile 'demo' porque nao e idempotente - rodar a cada boot criaria organizacoes duplicadas. O migrate roda sempre, esse e.
Contributor
There was a problem hiding this comment.
Pull request overview
Este PR reduz drasticamente a barreira de entrada para avaliar a plataforma localmente, passando a subir backend + frontend (nginx) + MongoDB via docker compose, além de ajustar o WebSocket para funcionar atrás de proxy.
Changes:
- Adiciona imagens Docker multi-stage para backend e frontend (nginx servindo estáticos e fazendo proxy).
- Atualiza o
docker-compose.ymlpara subir a stack completa e incluir um seed sob profiledemo. - Corrige a montagem da URL do WebSocket no frontend e documenta o “só quero ver funcionando” nos READMEs.
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| README.md | Adiciona guia rápido de execução via Docker Compose e aviso de troca de segredos. |
| README.en.md | Versão em inglês do guia rápido via Docker Compose. |
| frontend/src/contexts/NotificationContext.jsx | Corrige host/porta do WebSocket para operar atrás de proxy (usa window.location.host). |
| frontend/nginx.conf | Configura SPA fallback, cache de assets e proxy de /api e WebSocket. |
| frontend/Dockerfile | Build do frontend com Node e runtime nginx com healthcheck. |
| frontend/.dockerignore | Reduz contexto de build do frontend. |
| docker-compose.yml | Sobe stack completa (mongo, backend, frontend) e seed opcional via profile. |
| backend/Dockerfile | Build multi-stage com deps prod-only, usuário não privilegiado e healthcheck. |
| backend/.dockerignore | Reduz contexto de build do backend. |
Suppressed comments (1)
docker-compose.yml:98
- Se o volume de uploads não for montado por padrão, a definição do volume
uploadsfica sem uso e pode ser removida para evitar confusão.
volumes:
mongo_data:
uploads:
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+43
to
+46
| JWT_SECRET: ${JWT_SECRET:-troque-este-segredo-antes-de-usar-de-verdade} | ||
| JWT_REFRESH_SECRET: ${JWT_REFRESH_SECRET:-troque-este-refresh-tambem} | ||
| FRONTEND_URL: ${FRONTEND_URL:-http://localhost:8080} | ||
| # Integracoes externas sao opcionais: sem elas a aplicacao sobe e apenas |
Comment on lines
+49
to
+51
| volumes: | ||
| # Fallback local de upload, usado quando o R2 nao esta configurado. | ||
| - uploads:/app/uploads |
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
O
docker-compose.ymlsó tinha MongoDB. Quem clonava ainda precisava instalarNode, rodar
npm installnos dois pacotes, configurar.enve subir doisprocessos — só para ver a aplicação. Para quem chega pelo post de lançamento,
essa é a maior barreira que existe.
Agora:
e a plataforma responde em http://localhost:8080.
Dois bugs que só apareceram ao subir de verdade
Construí as imagens, subi a stack e exercitei o fluxo completo. Nenhuma leitura
de código teria mostrado estes dois:
1.
NotificationContextfixava a porta 3000. A URL do WebSocket era montadacom
hostname + ':3000'. Atrás de qualquer proxy isso quebra — e no compose aporta 3000 nem é exposta no host. Passa a derivar de
window.location.host,como o hook irmão (
useRealTimeNotifications) já fazia.2. Minha primeira versão do nginx tinha o caminho errado. Fiz proxy de
/ws, mas a rota real é/api/ws/notifications— e olocation /api/genériconão repassa os cabeçalhos de
Upgrade, então o handshake falharia dequalquer forma. Agora há um
location /api/wspróprio, declarado antes dogenérico.
Antes:
HTTP/1.1 404 Not Found. Depois:HTTP/1.1 101 Switching Protocols.As imagens
Backend — multi-stage: as dependências de produção são instaladas numa
camada separada, então a imagem final não carrega ESLint nem o runner de testes.
Roda como usuário sem privilégio (
node), com healthcheck próprio.Frontend — compila com Node e serve com nginx. O resultado do build é
estático; não há motivo para carregar Node em produção só para servir arquivo.
O nginx faz cache longo e imutável nos assets com hash no nome (senão o ganho do
code splitting se perderia),
no-cachenoindex.html, e fallback de SPA paraF5numa rota interna não devolver 404.Seed fica sob o profile
demoporque não é idempotente — rodar a cadaboot criaria organizações e usuários duplicados. O
migrateroda sempre, esse é.Verificação — subi e testei
docker compose up -dhealthyGET /eGET /kb/123GET /healthvia proxy{"status":"ok","mongodb":"connected"}GET /api/recordssem tokenGET /api/recordsautenticadoRecord not found/Registro não encontrado101 Switching Protocolspublic, immutable,max-age=31536000docker compose --profile demo run --rm seedOs READMEs (pt e en) ganharam uma seção "só quero ver funcionando" no topo do
Começando, com o aviso de que este compose é para avaliação e que os segredos
precisam ser trocados antes de qualquer exposição.