# NestJS Multi-Projeto Stack — Portainer ## Estrutura no Host (VPS) ``` /home/deploy/ ├── nest-stack/ ← este repositório │ ├── Dockerfile │ ├── docker-compose.yml │ ├── nginx/nginx.conf │ ├── scripts/ │ │ ├── start.sh ← entrypoint do container │ │ └── deploy.sh ← deploy dentro do container │ └── host-deploy.sh ← atalho para rodar do host │ └── projects/ ← SEUS PROJETOS (volume montado) ├── projeto1/ ← git clone aqui └── projeto2/ ``` --- ## Setup inicial ### 1. No servidor (VPS), clone este repo ```bash git clone /home/deploy/nest-stack mkdir -p /home/deploy/projects chmod +x /home/deploy/nest-stack/host-deploy.sh ``` ### 2. No Portainer → Stacks → Add Stack - **Name:** `nestjs-stack` - **Build method:** Repository (aponta para este repo) — OU — - **Build method:** Upload → sobe o `docker-compose.yml` ### 3. Clique em **Deploy the stack** O container vai: - Buildar a imagem (Nginx + Node + PM2) - Montar `/home/deploy/projects` como volume - Subir projetos que já tiverem build em `dist/` --- ## Adicionando um novo projeto ```bash # No HOST (fora do container) cd /home/deploy/projects git clone https://github.com/seu-usuario/meu-projeto.git projeto1 # Roda o deploy ./home/deploy/nest-stack/host-deploy.sh projeto1 # Pronto! Acessível em: # http://nest.juancjc.com.br/projeto1 ``` --- ## Atualizando um projeto existente ```bash # Atualiza o código cd /home/deploy/projects/projeto1 git pull # Redeploya /home/deploy/nest-stack/host-deploy.sh projeto1 ``` --- ## Reset do container (via Portainer) 1. Portainer → Containers → `nestjs-stack` → **Restart** ou **Reset** 2. O container sobe e **automaticamente relança todos os projetos** que tiverem `dist/main.js` 3. Os arquivos dos projetos continuam intactos (estão no volume do host) --- ## Comandos úteis ```bash # Ver logs do container docker logs nestjs-stack -f # Ver processos PM2 rodando docker exec nestjs-stack pm2 list # Ver logs de um projeto específico docker exec nestjs-stack pm2 logs projeto1 # Entrar no container docker exec -it nestjs-stack bash # Ver status do nginx docker exec nestjs-stack nginx -t ``` --- ## Regras de porta | Projeto | Porta interna | |---------------|---------------| | projeto1 | 3001 | | projeto2 | 3002 | | projeto3 | 3003 | | projetoN | 300N | A porta é determinada pela **ordem alfabética das pastas** em `/home/deploy/projects`. --- ## Seu projeto NestJS não precisa de nenhuma config especial O Nginx remove o prefixo `/projeto1` antes de repassar ao NestJS. Seu app recebe as rotas normalmente como `/`. **Único requisito:** seu `main.ts` deve aceitar a porta via variável de ambiente ou argumento: ```typescript // main.ts async function bootstrap() { const app = await NestFactory.create(AppModule); const port = process.argv.find((_, i, a) => a[i-1] === '--port') || process.env.PORT || 3000; await app.listen(port); } bootstrap(); ```