--- name: GOL Fix - gol-solver.service ExecStart quebrado 2026-05-04 description: gol-solver.service com aspas escapadas literais no ExecStart → crash-loop 23.875x desde 03/05 07:24. Solver órfão segurando porta. Fix: reescrever .service sem bash wrapper, matar processos zumbis. type: project originSessionId: da5514be-fbd6-46e5-a3de-cf03a5dda20d --- # GOL fix — gol-solver.service quebrado em 2026-05-04 ## Sintomas observados (antes do fix) - `/health` do solver na VM: `hasBearer:false` permanente - Search direta no solver retorna **HTTP 406 Akamai** (mas com `clientIP: 186.247.226.26` correto da VM) - Scraper servidor (3036) timeout 120s e cai pro fallback BrowserPool - Fallback retorna `"Form nao encontrado [PROXY]"` (saída direta servidor caída) - Cache do scraper estava poluído com erros (cacheia `success:false`) ## Causa-raiz `/etc/systemd/system/gol-solver.service` tinha: ``` ExecStart=/bin/bash -c \"/usr/bin/node /opt/gol-solver/gol-solver.mjs >> /tmp/gol-solver.log 2>&1\" ``` As `\"` são literais (systemd não interpreta escape). Bash recebia `-c '\"'` e crashava com `unexpected EOF while looking for matching '"'`. Crash-loop de 23.875 restarts desde **03/05 07:24 UTC** (último log de Chrome rodando: 03/05 02:15 SIGTERM). **Processo órfão:** o solver antigo (node PID 996269, bash PID 996268) ficou rodando como filho do PID 1 segurando a porta 9092 — nesse estado o `/health` respondia (porque o processo node antigo ainda escutava) mas sem renovar bearer (Chrome travou em form-fill às 02:11). Por isso `hasBearer:false`. ## Fix aplicado (`/etc/systemd/system/gol-solver.service`) ```ini [Unit] Description=GOL Solver After=network.target [Service] Type=simple User=customer Environment=DISPLAY=:99 WorkingDirectory=/opt/gol-solver ExecStart=/usr/bin/node /opt/gol-solver/gol-solver.mjs StandardOutput=journal StandardError=journal Restart=always RestartSec=5 [Install] WantedBy=multi-user.target ``` Backup do quebrado: `/etc/systemd/system/gol-solver.service.bak-broken-2026-05-04` ## Procedimento completo ```bash # 1. SSH na VM (porta 2222 evita Tailscale SSH auth): sshpass -p 'Skymilhas26' ssh -p 2222 -o StrictHostKeyChecking=accept-new customer@100.91.20.22 # 2. Backup + reescrever .service (ver acima) sudo cp /etc/systemd/system/gol-solver.service /etc/systemd/system/gol-solver.service.bak-broken-2026-05-04 sudo tee /etc/systemd/system/gol-solver.service > /dev/null << 'EOF' ... (conteúdo acima) EOF # 3. Matar processos órfãos (Chrome + node antigos) sudo pkill -9 -f gol-solver-profile ps -ef | grep -E "gol-solver|gol-chrome" | grep -v grep # confirmar 0 # 4. Reset + start sudo systemctl daemon-reload sudo systemctl reset-failed gol-solver sudo systemctl start gol-solver # 5. Aguardar warmup (~10s) e validar curl http://100.91.20.22:9092/health # esperar hasBearer:true ``` ## Validação pós-fix (2026-05-04 18:16 UTC) | Teste | Tempo | Resultado | Source | |---|---|---|---| | OW MISS GRU-GIG 14/05 | 6.2 s | 4 voos | `vm-solver` | | OW HIT idem | 21 ms | 4 voos / fromCache | `vm-solver` | | RT MISS 14/05 → 21/05 | 4.7 s | 8 voos | `bff` | | RT HIT idem | 17 ms | 8 voos / fromCache | `bff` | `/health`: `hasBearer:true` em <10s pós-restart. ## Bug colateral pendente (não corrigido) `/opt/skymilhas/scrapers/gol/service.js` cacheia respostas com `success:false`. Durante o período quebrado isso poluiu o cache com `{"error":"Form nao encontrado [PROXY]","fromCache":true}`. **Recomendo** adicionar guarda no cacheMiddleware/handler para skip cache quando `success !== true`. **Why:** O `\"` literal no .service file não foi auto-corrigido pelo systemd e o crash-loop silencioso passou despercebido por 35h porque o solver órfão respondia no /health (sem bearer válido). **How to apply:** Sempre que `hasBearer:false` persistir, checar: 1. `systemctl status gol-solver` — `Active:` deve ser `running`, não `activating (auto-restart)` 2. `systemctl show gol-solver -p ExecStart` — verificar se ExecStart faz sentido sem escapes esquisitos 3. `ps -ef | grep gol-solver` — só o processo do systemd deve existir, sem órfãos do PID 1