Skip to content

Commit 1def725

Browse files
authored
Merge pull request #25 from AgroCore-co/dev
Ajusta Pipeline e Deploy
2 parents ba366a6 + 57b0585 commit 1def725

5 files changed

Lines changed: 187 additions & 43 deletions

File tree

.dockerignore

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
node_modules
2+
dist
3+
.git
4+
.github
5+
.env
6+
.env.*
7+
*.log
8+
logs/
9+
coverage/
10+
.nyc_output
11+
.eslintcache
12+
*.md
13+
infra/docker-compose.yml
14+
test/

.github/workflows/aws.yml

Lines changed: 31 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,18 @@ jobs:
1414
- name: Checkout código
1515
uses: actions/checkout@v4
1616

17-
- name: Configurar Node.js
18-
uses: actions/setup-node@v4
19-
with:
20-
node-version: '20'
21-
cache: 'npm'
22-
23-
- name: Instalar dependências
24-
run: npm ci
25-
26-
- name: Build do projeto
27-
run: npm run build
28-
2917
- name: Criar pacote para deploy
3018
run: |
31-
mkdir -p deploy-package
32-
cp -r dist deploy-package/
33-
cp package.json deploy-package/
34-
cp package-lock.json deploy-package/
35-
cp ecosystem.config.js deploy-package/
36-
tar -czf deploy.tar.gz -C deploy-package .
37-
38-
- name: Copiar e extrair no EC2
19+
tar -czf deploy.tar.gz \
20+
--exclude='.git' \
21+
--exclude='node_modules' \
22+
--exclude='.env' \
23+
--exclude='dist' \
24+
--exclude='coverage' \
25+
--exclude='logs' \
26+
.
27+
28+
- name: Copiar pacote para EC2
3929
uses: appleboy/scp-action@v0.1.7
4030
with:
4131
host: ${{ secrets.EC2_HOST }}
@@ -45,30 +35,30 @@ jobs:
4535
source: 'deploy.tar.gz'
4636
target: '/home/ec2-user/'
4737

48-
- name: Deploy e iniciar aplicação
38+
- name: Deploy via Docker Compose
4939
uses: appleboy/ssh-action@v1.0.3
5040
with:
5141
host: ${{ secrets.EC2_HOST }}
5242
username: ec2-user
5343
key: ${{ secrets.EC2_SSH_KEY }}
5444
port: 22
5545
script: |
46+
set -e
5647
cd /home/ec2-user
5748
58-
# Parar aplicação
59-
pm2 stop buffs-api 2>/dev/null || true
60-
pm2 delete buffs-api 2>/dev/null || true
49+
# Garantir que o Docker está rodando
50+
sudo systemctl start docker 2>/dev/null || true
6151
6252
# Backup do .env
6353
if [ -f buffs-api/.env ]; then
6454
cp buffs-api/.env /tmp/.env.backup
6555
fi
6656
67-
# Limpar e recriar diretório
57+
# Limpar e recriar diretório (preserva .env)
6858
rm -rf buffs-api
6959
mkdir -p buffs-api
7060
71-
# Extrair arquivos
61+
# Extrair código-fonte
7262
tar -xzf deploy.tar.gz -C buffs-api/
7363
rm deploy.tar.gz
7464
@@ -79,24 +69,23 @@ jobs:
7969
8070
cd buffs-api
8171
82-
# Verificar arquivos necessários
83-
[ ! -f .env ] && echo "ERRO: .env não encontrado" && exit 1
84-
[ ! -d dist ] && echo "ERRO: dist não encontrado" && exit 1
85-
[ ! -f dist/src/main.js ] && echo "ERRO: dist/src/main.js não encontrado" && exit 1
72+
# Verificar .env obrigatório
73+
[ ! -f .env ] && echo "ERRO: .env não encontrado na EC2" && exit 1
74+
75+
# Parar containers antigos (se existirem)
76+
docker compose -f infra/docker-compose.prod.yml down --remove-orphans 2>/dev/null || true
8677
87-
# Criar logs
88-
mkdir -p logs
78+
# Build e subir todos os serviços
79+
docker compose -f infra/docker-compose.prod.yml up -d --build
8980
90-
# Instalar dependências
91-
npm ci --omit=dev --no-audit
81+
# Limpar imagens antigas não utilizadas
82+
docker image prune -f
9283
93-
# Iniciar aplicação
94-
pm2 start ecosystem.config.js --env production
95-
pm2 save
84+
# Aguardar a API inicializar
85+
echo "Aguardando API inicializar..."
86+
sleep 15
9687
97-
# Aguardar e verificar
98-
sleep 5
99-
curl -f http://localhost:3001/health || exit 1
88+
# Health check
89+
curl -f http://localhost:3001/health || (docker compose -f infra/docker-compose.prod.yml logs buffs-api && exit 1)
10090
101-
echo "Deploy concluído com sucesso!"
102-
pm2 status
91+
echo "✅ Deploy concluído com sucesso!"

Dockerfile

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# ========================================
2+
# BUFFS API - Dockerfile
3+
# ========================================
4+
# Multi-stage build para imagem otimizada de produção.
5+
#
6+
# Estágio 1 (builder): instala todas as deps e compila TypeScript
7+
# Estágio 2 (production): apenas deps de produção + dist compilado
8+
# ========================================
9+
10+
# ------ ESTÁGIO 1: BUILD ------
11+
FROM node:20-alpine AS builder
12+
13+
WORKDIR /app
14+
15+
# Copia manifests primeiro (cache de layers)
16+
COPY package*.json ./
17+
COPY tsconfig*.json ./
18+
COPY nest-cli.json ./
19+
20+
# Instala todas as dependências (incluindo devDeps para build)
21+
RUN npm ci --no-audit
22+
23+
# Copia o código fonte
24+
COPY src ./src
25+
26+
# Compila TypeScript
27+
RUN npm run build
28+
29+
# ------ ESTÁGIO 2: PRODUÇÃO ------
30+
FROM node:20-alpine AS production
31+
32+
WORKDIR /app
33+
34+
ENV NODE_ENV=production
35+
36+
# Copia manifests
37+
COPY package*.json ./
38+
39+
# Instala apenas dependências de produção
40+
RUN npm ci --only=production --no-audit && npm cache clean --force
41+
42+
# Copia o dist compilado do estágio anterior
43+
COPY --from=builder /app/dist ./dist
44+
45+
# Cria diretório de logs
46+
RUN mkdir -p logs
47+
48+
# Usuário não-root para segurança
49+
RUN addgroup -g 1001 -S nodejs && adduser -S nestjs -u 1001
50+
RUN chown -R nestjs:nodejs /app
51+
USER nestjs
52+
53+
EXPOSE 3001
54+
55+
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
56+
CMD wget --no-verbose --tries=1 --spider http://localhost:3001/health || exit 1
57+
58+
CMD ["node", "dist/src/main.js"]

infra/docker-compose.prod.yml

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
version: '3.8'
2+
3+
# ========================================
4+
# BUFFS API - Infraestrutura de Produção (EC2)
5+
# ========================================
6+
# Uso:
7+
# cd /home/ec2-user/buffs-api
8+
# docker-compose -f infra/docker-compose.prod.yml up -d --build
9+
#
10+
# Variáveis de ambiente lidas do .env na raiz do projeto.
11+
# IMPORTANTE: RABBITMQ_URL deve ser amqp://admin:admin@rabbitmq:5672
12+
# (hostname interno Docker, não localhost)
13+
# ========================================
14+
15+
services:
16+
# ========================================
17+
# RabbitMQ - Message Broker
18+
# ========================================
19+
rabbitmq:
20+
image: rabbitmq:3.13-management-alpine
21+
container_name: buffs-rabbitmq
22+
hostname: buffs-rabbitmq
23+
restart: unless-stopped
24+
ports:
25+
- "5672:5672"
26+
- "15672:15672"
27+
environment:
28+
RABBITMQ_DEFAULT_USER: admin
29+
RABBITMQ_DEFAULT_PASS: admin
30+
RABBITMQ_DEFAULT_VHOST: /
31+
volumes:
32+
- rabbitmq_data:/var/lib/rabbitmq
33+
healthcheck:
34+
test: ["CMD", "rabbitmq-diagnostics", "ping"]
35+
interval: 15s
36+
timeout: 10s
37+
retries: 5
38+
start_period: 40s
39+
networks:
40+
- buffs-network
41+
42+
# ========================================
43+
# Buffs API - NestJS
44+
# ========================================
45+
buffs-api:
46+
build:
47+
context: ..
48+
dockerfile: Dockerfile
49+
container_name: buffs-api
50+
restart: unless-stopped
51+
ports:
52+
- "3001:3001"
53+
env_file:
54+
- ../.env
55+
environment:
56+
# Sobrescreve RABBITMQ_URL para usar hostname interno Docker
57+
RABBITMQ_URL: amqp://admin:admin@rabbitmq:5672
58+
NODE_ENV: production
59+
# buffs-ia roda no host na porta 8000
60+
IA_API_URL: http://host.docker.internal:8000
61+
extra_hosts:
62+
# Permite acessar serviços do host (ex: buffs-ia na porta 8000)
63+
- "host.docker.internal:host-gateway"
64+
depends_on:
65+
rabbitmq:
66+
condition: service_healthy
67+
networks:
68+
- buffs-network
69+
70+
# ========================================
71+
# Volumes Persistentes
72+
# ========================================
73+
volumes:
74+
rabbitmq_data:
75+
driver: local
76+
77+
# ========================================
78+
# Network Interna
79+
# ========================================
80+
networks:
81+
buffs-network:
82+
driver: bridge
83+
name: buffs-network-prod

src/modules/alerta/consumers/alerta.consumer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export class AlertaConsumer {
2323
* Processa mensagens de alerta vindas da fila RabbitMQ.
2424
* Apenas valida, mapeia e repassa para o AlertaService.
2525
*/
26-
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
26+
2727
@RabbitSubscribe({
2828
exchange: RabbitMQConfig.EXCHANGE,
2929
routingKey: RabbitMQConfig.ALERTA_ROUTING_KEY,

0 commit comments

Comments
 (0)