# NestJS Multi-Projeto Stack ## Estrutura do repositório ``` nest-stack/ ├── Dockerfile ├── docker-compose.yml ├── .gitignore ├── nginx/ │ └── nginx.conf ← config base do nginx ├── scripts/ ← rodam DENTRO do container │ ├── start.sh ← entrypoint do container │ └── deploy.sh ← build + PM2 + nginx ├── host-deploy.sh ← deploya um projeto (rode no host) ├── host-remove.sh ← remove um projeto (rode no host) └── host-status.sh ← status dos projetos (rode no host) ``` ## Estrutura no host (VPS) ``` /home/deploy/ ├── nest-stack/ ← este repositório ├── projects/ ← seus projetos NestJS (volume) │ ├── projeto1/ │ └── projeto2/ ├── nginx-dynamic/ ← configs nginx persistidas (volume) └── pm2/ ← estado do PM2 persistido (volume) ``` --- ## Setup inicial no VPS ```bash # 1. Clone este repositório git clone /home/deploy/nest-stack # 2. Crie as pastas necessárias mkdir -p /home/deploy/projects mkdir -p /home/deploy/nginx-dynamic mkdir -p /home/deploy/pm2 # 3. Dê permissão aos scripts chmod +x /home/deploy/nest-stack/host-*.sh ``` --- ## Deploy via Portainer 1. **Stacks → Add Stack** 2. **Build method → Repository** → cole a URL deste repo 3. **Deploy the stack** ✅ O container vai buildar e subir automaticamente todos os projetos que já tiverem `dist/main.js`. --- ## Comandos do dia a dia ### Adicionar um projeto ```bash cd /home/deploy/projects git clone https://github.com/seu-usuario/projeto1.git projeto1 # Coloca o .env do projeto nano /home/deploy/projects/projeto1/.env # Deploya /home/deploy/nest-stack/host-deploy.sh projeto1 ``` ### Atualizar um projeto ```bash cd /home/deploy/projects/projeto1 git pull /home/deploy/nest-stack/host-deploy.sh projeto1 ``` ### Ver status de todos os projetos ```bash /home/deploy/nest-stack/host-status.sh ``` ### Remover um projeto ```bash # Remove tudo (PM2 + nginx + arquivos) /home/deploy/nest-stack/host-remove.sh projeto1 # Remove do PM2/nginx mas MANTÉM os arquivos /home/deploy/nest-stack/host-remove.sh projeto1 --keep-files ``` --- ## Reiniciar o container (seguro!) Pode reiniciar pelo Portainer sem medo — nada é perdido: - ✅ Arquivos dos projetos → `/home/deploy/projects` (volume) - ✅ Configs Nginx → `/home/deploy/nginx-dynamic` (volume) - ✅ Estado PM2 → `/home/deploy/pm2` (volume) - ✅ `.env` de cada projeto → nunca apagado --- ## Comandos úteis ```bash # Logs do container docker logs nestjs-stack -f # Processos PM2 docker exec nestjs-stack pm2 list # Logs de um projeto docker exec nestjs-stack pm2 logs projeto1 # Entrar no container docker exec -it nestjs-stack bash # Ver config completa do nginx docker exec nestjs-stack nginx -T # Testar nginx docker exec nestjs-stack nginx -t ``` --- ## Portas internas | Projeto | Porta | |------------|--------| | projeto1 | 3001 | | projeto2 | 3002 | | projeto3 | 3003 | Ordem alfabética das pastas em `/home/deploy/projects`. --- ## Requisito no seu projeto NestJS O `main.ts` deve aceitar porta via argumento ou variável de ambiente: ```typescript 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(); ```