Files
docker-nest-js/README.md

3.5 KiB

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

  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

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)
  • .env de 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();