5f715e1a61a7f05949e78e56c57b24c9f2201d9f
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
git clone <este-repo> /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/projectscomo volume - Subir projetos que já tiverem build em
dist/
Adicionando um novo projeto
# 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
# 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)
- Portainer → Containers →
nestjs-stack→ Restart ou Reset - O container sobe e automaticamente relança todos os projetos que tiverem
dist/main.js - Os arquivos dos projetos continuam intactos (estão no volume do host)
Comandos úteis
# 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:
// 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();
Description
Languages
Shell
95.1%
Dockerfile
4.9%