Atualiza scripts e configurações do projeto para melhorar o gerenciamento de projetos e a estrutura do repositório

This commit is contained in:
2026-04-18 14:45:51 -05:00
parent 9cc146348f
commit 163b89aca5
11 changed files with 304 additions and 93 deletions

170
README.md
View File

@@ -1,134 +1,158 @@
# NestJS Multi-Projeto Stack — Portainer
# NestJS Multi-Projeto Stack
## Estrutura no Host (VPS)
## 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
│ ├── 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/
├── projects/ ← seus projetos NestJS (volume)
│ ├── projeto1/
── projeto2/
├── nginx-dynamic/ ← configs nginx persistidas (volume)
└── pm2/ ← estado do PM2 persistido (volume)
```
---
## Setup inicial
### 1. No servidor (VPS), clone este repo
## 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
chmod +x /home/deploy/nest-stack/host-deploy.sh
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
```
### 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
## 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
# No HOST (fora do container)
cd /home/deploy/projects
git clone https://github.com/seu-usuario/meu-projeto.git projeto1
git clone https://github.com/seu-usuario/projeto1.git projeto1
# Roda o deploy
./home/deploy/nest-stack/host-deploy.sh projeto1
# Coloca o .env do projeto
nano /home/deploy/projects/projeto1/.env
# 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
# 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
```
---
## Reset do container (via Portainer)
## Reiniciar o container (seguro!)
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)
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
# Ver logs do container
# Logs do container
docker logs nestjs-stack -f
# Ver processos PM2 rodando
# Processos PM2
docker exec nestjs-stack pm2 list
# Ver logs de um projeto específico
# Logs de um projeto
docker exec nestjs-stack pm2 logs projeto1
# Entrar no container
docker exec -it nestjs-stack bash
# Ver status do nginx
# Ver config completa do nginx
docker exec nestjs-stack nginx -T
# Testar nginx
docker exec nestjs-stack nginx -t
```
---
## Regras de porta
## Portas internas
| Projeto | Porta interna |
|---------------|---------------|
| projeto1 | 3001 |
| projeto2 | 3002 |
| projeto3 | 3003 |
| projetoN | 300N |
| Projeto | Porta |
|------------|--------|
| projeto1 | 3001 |
| projeto2 | 3002 |
| projeto3 | 3003 |
A porta é determinada pela **ordem alfabética das pastas** em `/home/deploy/projects`.
Ordem alfabética das pastas em `/home/deploy/projects`.
---
## Seu projeto NestJS não precisa de nenhuma config especial
## Requisito no seu projeto NestJS
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:
O `main.ts` deve aceitar porta via argumento ou variável de ambiente:
```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;
const port =
process.argv.find((_, i, a) => a[i - 1] === '--port') ||
process.env.PORT ||
3000;
await app.listen(port);
}
bootstrap();