136 lines
3.1 KiB
Markdown
136 lines
3.1 KiB
Markdown
# 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
|
|
|
|
```bash
|
|
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/projects` como volume
|
|
- Subir projetos que já tiverem build em `dist/`
|
|
|
|
---
|
|
|
|
## Adicionando um novo projeto
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```bash
|
|
# 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)
|
|
|
|
1. Portainer → Containers → `nestjs-stack` → **Restart** ou **Reset**
|
|
2. O container sobe e **automaticamente relança todos os projetos** que tiverem `dist/main.js`
|
|
3. Os arquivos dos projetos continuam intactos (estão no volume do host)
|
|
|
|
---
|
|
|
|
## Comandos úteis
|
|
|
|
```bash
|
|
# 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:
|
|
|
|
```typescript
|
|
// 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();
|
|
```
|