Files
docker-nest-js/README.md

160 lines
3.5 KiB
Markdown

# 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 <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
```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();
```