160 lines
3.5 KiB
Markdown
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();
|
|
```
|