0cd6027b78825835e9cee1203bc0ac6c97094479
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
# 1. Clone este repositório
git clone <este-repo> /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
- Stacks → Add Stack
- Build method → Repository → cole a URL deste repo
- 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
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
cd /home/deploy/projects/projeto1
git pull
/home/deploy/nest-stack/host-deploy.sh projeto1
Ver status de todos os projetos
/home/deploy/nest-stack/host-status.sh
Remover um projeto
# 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) - ✅
.envde cada projeto → nunca apagado
Comandos úteis
# 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:
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%