214 lines
4.4 KiB
Markdown
214 lines
4.4 KiB
Markdown
|
|
# Deploy WiFi-ETL em Produção
|
||
|
|
|
||
|
|
## Arquitetura
|
||
|
|
|
||
|
|
- **Aplicação**: `/opt/wifi-etl` (clone do repositório)
|
||
|
|
- **Config**: `.env` copiado de `/home/desenvolvimento/.envs/wifi_etl/.env`
|
||
|
|
- **Container**: Rodando via `docker compose` (cron + ETL)
|
||
|
|
- **Runner**: Self-hosted na VM (pull automático na mudança de código)
|
||
|
|
|
||
|
|
## Setup Inicial (uma única vez na VM)
|
||
|
|
|
||
|
|
### 1. Configurar Self-Hosted Runner no Gitea
|
||
|
|
|
||
|
|
Na **VM de produção**:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Criar diretório para o runner
|
||
|
|
mkdir -p ~/gitea-runner
|
||
|
|
cd ~/gitea-runner
|
||
|
|
|
||
|
|
# Baixar runner Gitea (Linux x86_64)
|
||
|
|
# Substitua URL pela sua instância Gitea
|
||
|
|
wget https://seu-gitea.com/api/v1/repos/seu-usuario/wifi-etl/actions/runners/download/linux_x86_64
|
||
|
|
|
||
|
|
# Ou use curl:
|
||
|
|
# curl -LO https://seu-gitea.com/api/v1/repos/seu-usuario/wifi-etl/actions/runners/download/linux_x86_64
|
||
|
|
|
||
|
|
# Descompactar
|
||
|
|
unzip linux_x86_64
|
||
|
|
chmod +x act_runner
|
||
|
|
|
||
|
|
# Gerar token no Gitea:
|
||
|
|
# 1. Vá para: Repositório → Settings → Actions → Runners
|
||
|
|
# 2. Clique "Create Runner"
|
||
|
|
# 3. Copie o Token gerado
|
||
|
|
|
||
|
|
# Registrar runner (substitua o token)
|
||
|
|
./act_runner register \
|
||
|
|
--instance https://seu-gitea.com \
|
||
|
|
--token seu_token_aqui
|
||
|
|
|
||
|
|
# Rodar em background
|
||
|
|
nohup ./act_runner daemon > runner.log 2>&1 &
|
||
|
|
|
||
|
|
# OU criar systemd service (recomendado):
|
||
|
|
sudo tee /etc/systemd/system/gitea-runner.service > /dev/null << 'EOF'
|
||
|
|
[Unit]
|
||
|
|
Description=Gitea Runner
|
||
|
|
After=network.target
|
||
|
|
|
||
|
|
[Service]
|
||
|
|
Type=simple
|
||
|
|
User=ubuntu
|
||
|
|
WorkingDirectory=/home/ubuntu/gitea-runner
|
||
|
|
ExecStart=/home/ubuntu/gitea-runner/act_runner daemon
|
||
|
|
Restart=always
|
||
|
|
RestartSec=10
|
||
|
|
|
||
|
|
[Install]
|
||
|
|
WantedBy=multi-user.target
|
||
|
|
EOF
|
||
|
|
|
||
|
|
sudo systemctl enable gitea-runner
|
||
|
|
sudo systemctl start gitea-runner
|
||
|
|
sudo systemctl status gitea-runner
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Preparar diretório da aplicação
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Criar diretório
|
||
|
|
mkdir -p /opt/wifi-etl
|
||
|
|
|
||
|
|
# Primeiro clone manual (depois é automático)
|
||
|
|
cd /opt/wifi-etl
|
||
|
|
git clone https://seu-gitea.com/seu-usuario/wifi-etl.git .
|
||
|
|
```
|
||
|
|
|
||
|
|
## Fluxo de Deploy Automático
|
||
|
|
|
||
|
|
```
|
||
|
|
1. git push main (local → Gitea)
|
||
|
|
↓
|
||
|
|
2. Gitea dispara workflow (push event)
|
||
|
|
↓
|
||
|
|
3. Runner na VM executa
|
||
|
|
↓
|
||
|
|
4. git pull /opt/wifi-etl (atualiza código)
|
||
|
|
↓
|
||
|
|
5. Copiar .env
|
||
|
|
↓
|
||
|
|
6. docker compose up -d --build
|
||
|
|
↓
|
||
|
|
7. Validar CRON status
|
||
|
|
↓
|
||
|
|
8. Testar conexão BD
|
||
|
|
↓
|
||
|
|
DONE! ✓
|
||
|
|
```
|
||
|
|
|
||
|
|
## Deploy Manual (se necessário)
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Na VM
|
||
|
|
cd /opt/wifi-etl
|
||
|
|
git pull origin main
|
||
|
|
cp /home/desenvolvimento/.envs/wifi_etl/.env ./.env
|
||
|
|
docker compose -f infra/docker-compose.yml up -d --build
|
||
|
|
|
||
|
|
# Aguardar inicialização
|
||
|
|
sleep 5
|
||
|
|
docker logs -f wifi_etl_worker
|
||
|
|
```
|
||
|
|
|
||
|
|
## Verificações Pós-Deploy
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Status do container
|
||
|
|
docker ps -a | grep wifi_etl
|
||
|
|
|
||
|
|
# Logs em tempo real
|
||
|
|
docker logs -f wifi_etl_worker
|
||
|
|
|
||
|
|
# Validar cron rodando
|
||
|
|
docker exec wifi_etl_worker ps aux | grep cron
|
||
|
|
|
||
|
|
# Testar banco de dados
|
||
|
|
docker exec wifi_etl_worker python3 << 'EOF'
|
||
|
|
import psycopg2, os
|
||
|
|
try:
|
||
|
|
conn = psycopg2.connect(
|
||
|
|
host=os.getenv('DB_HOST'),
|
||
|
|
port=int(os.getenv('DB_PORT', 5432)),
|
||
|
|
dbname=os.getenv('DB_NAME'),
|
||
|
|
user=os.getenv('DB_USER'),
|
||
|
|
password=os.getenv('DB_PASSWORD')
|
||
|
|
)
|
||
|
|
print("✓ Database conectado")
|
||
|
|
conn.close()
|
||
|
|
except Exception as e:
|
||
|
|
print(f"✗ Erro: {e}")
|
||
|
|
EOF
|
||
|
|
|
||
|
|
# Ver logs de ETL
|
||
|
|
docker exec wifi_etl_worker tail -50 /var/log/wifi-etl.log
|
||
|
|
```
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Container não inicia
|
||
|
|
```bash
|
||
|
|
docker logs wifi_etl_worker
|
||
|
|
docker exec wifi_etl_worker env | grep DB_
|
||
|
|
```
|
||
|
|
|
||
|
|
### Cron não funciona
|
||
|
|
```bash
|
||
|
|
docker exec -it wifi_etl_worker bash
|
||
|
|
cat /etc/cron.d/wifi-etl # Verificar arquivo
|
||
|
|
tail -20 /var/log/syslog # Verificar logs
|
||
|
|
```
|
||
|
|
|
||
|
|
### Banco não conecta
|
||
|
|
```bash
|
||
|
|
# Verificar variáveis de ambiente
|
||
|
|
docker exec wifi_etl_worker env | grep DB_
|
||
|
|
|
||
|
|
# Testar conexão
|
||
|
|
docker exec wifi_etl_worker python3 -m \
|
||
|
|
psycopg2 "postgresql://user:pass@host:port/db"
|
||
|
|
```
|
||
|
|
|
||
|
|
### Runner não pegando mudanças
|
||
|
|
```bash
|
||
|
|
cd ~/gitea-runner
|
||
|
|
./act_runner status
|
||
|
|
|
||
|
|
# Ver logs
|
||
|
|
tail -50 runner.log
|
||
|
|
|
||
|
|
# Restart
|
||
|
|
pkill act_runner
|
||
|
|
nohup ./act_runner daemon > runner.log 2>&1 &
|
||
|
|
```
|
||
|
|
|
||
|
|
## Revertir Deploy
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Parar container
|
||
|
|
docker-compose -f /opt/wifi-etl/infra/docker-compose.yml down
|
||
|
|
|
||
|
|
# Remover para forçar rebuild
|
||
|
|
docker rmi wifi-etl:latest
|
||
|
|
|
||
|
|
# Ou voltar para commit anterior
|
||
|
|
cd /opt/wifi-etl
|
||
|
|
git reset --hard HEAD~1
|
||
|
|
# Depois fazer deploy novamente
|
||
|
|
```
|
||
|
|
|
||
|
|
## ETL Schedule
|
||
|
|
|
||
|
|
Roda a cada **5 minutos** em produção:
|
||
|
|
|
||
|
|
```
|
||
|
|
*/5 * * * * /usr/local/bin/python /app/main.py
|
||
|
|
```
|
||
|
|
|
||
|
|
Logs: `/var/log/wifi-etl.log` (dentro do container)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Last updated**: 2026-04-22
|