Atualiza scripts e configurações do projeto para melhorar o gerenciamento de projetos e a estrutura do repositório
This commit is contained in:
170
README.md
170
README.md
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user