# DEPLOY — Coolify (Hetzner VPS) Guia passo-a-passo para colocar o **shivao-cloud** em produção no Coolify. ## Pré-requisitos - VPS Hetzner com **Coolify** instalado e acessível - Domínio (ou subdomínio) apontando para o IP do servidor - Ex: `shivao.exemplo.com` → IP da VPS - DNS propagado (verifique com `dig shivao.exemplo.com`) ## Passo 1 — Subir o código para Git Recomendado: criar repo privado no GitHub/GitLab. ```bash cd shivao-projeto/server git init git add . git commit -m "Initial commit" git remote add origin git@github.com:OWNER/shivao-cloud.git git push -u origin main ``` > Alternativa: usar a opção "Deploy from Docker Image" do Coolify e fazer > build local + push para um registry. Mas Git é mais simples. ## Passo 2 — No Coolify ### 2.1. Criar a aplicação 1. **+ New Resource** → **Application** 2. Selecione **Public/Private Repository (with GitHub App)** ou **Public/Private Repository** 3. Cole a URL do repo 4. Branch: `main` 5. **Build Pack**: `Dockerfile` 6. **Base Directory**: deixe em branco (o Dockerfile está na raiz) 7. **Dockerfile location**: `/Dockerfile` 8. **Port**: `3000` 9. Salvar ### 2.2. Configurar domínio 1. Aba **Domains** 2. Adicione: `https://shivao.exemplo.com` 3. **Generate Let's Encrypt** (automático) 4. Salvar ### 2.3. Variáveis de ambiente Aba **Environment Variables** → adicionar: #### Mínimo obrigatório ``` BOAT_TOKEN= ``` #### Pelo menos um canal de notificação **Telegram** (recomendado, grátis): ``` TELEGRAM_BOT_TOKEN= TELEGRAM_CHAT_IDS= ``` **E-mail** (Gmail com app password): ``` SMTP_HOST=smtp.gmail.com SMTP_PORT=587 SMTP_SECURE=false SMTP_USER=seu-email@gmail.com SMTP_PASS= SMTP_FROM=Shivao SMTP_TO=destinatario@exemplo.com,outro@exemplo.com ``` **ntfy.sh** (push grátis sem cadastro): ``` NTFY_TOPIC= ``` Veja **server/.env.example** para todas as opções (Twilio, webhook, etc). #### Opcionais ``` HEARTBEAT_TIMEOUT_SEC=300 # 5 min — tempo até dead-man disparar NODE_ENV=production ``` ### 2.4. Volume persistente **Crítico** — sem isso, ao reiniciar o container você perde tudo. 1. Aba **Storages** 2. **+ Add** 3. Tipo: **Persistent Storage** ou **Volume** 4. Name: `shivao-data` 5. Mount Path: `/data` 6. Salvar ### 2.5. Deploy 1. Aba principal da aplicação 2. **Deploy** (canto superior direito) 3. Acompanhar logs do build (~2-3 minutos primeira vez) Se tudo der certo, ao final: ``` Shivao Cloud rodando em :3000 Canais configurados: telegram, email, ... Dead-man switch: 300s ``` ## Passo 3 — Verificar ### 3.1. Health check público ```bash curl https://shivao.exemplo.com/api/health # {"ok":true,"ts":1730000000000} ``` ### 3.2. Auth funcionando ```bash curl -H "Authorization: Bearer SEU_TOKEN" https://shivao.exemplo.com/api/info # {"channels":["telegram","email"],"heartbeatTimeoutSec":300,"version":"1.0"} ``` ### 3.3. Acessar o app Abra `https://shivao.exemplo.com/` no navegador. O frontend deve carregar. ### 3.4. Testar notificação No app: **Arquivo** → preencha servidor + token → **Disparar mensagem de teste** Você deve receber a mensagem em todos os canais configurados. ## Passo 4 — Configurar Telegram (5 minutos) Se ainda não fez: 1. No Telegram, fale com [@BotFather](https://t.me/BotFather) 2. `/newbot` → escolha nome e username → ele dá um **token** 3. Copie o token (tipo `123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11`) 4. Inicie conversa com o bot recém-criado (envie qualquer coisa) 5. Acesse `https://api.telegram.org/bot/getUpdates` 6. No JSON retornado, procure `"chat":{"id":123456789,...}` → esse é seu `CHAT_ID` 7. Cole `TELEGRAM_BOT_TOKEN` e `TELEGRAM_CHAT_IDS` no Coolify 8. Redeploy 9. Teste no app Para grupo: adicione o bot ao grupo, mande uma mensagem lá, repita o passo 5 (o `chat_id` do grupo é negativo). ## Passo 5 — Conectar o app ao servidor No celular: 1. Abrir `https://shivao.exemplo.com/` no Chrome 2. Menu (⋮) → **Adicionar à tela inicial** (vira "app") 3. Abrir o app, ir em **Arquivo** 4. Seção **☁️ Sincronização na nuvem**: - Servidor: `https://shivao.exemplo.com` - Token: o `BOAT_TOKEN` definido no Coolify 5. **Testar conexão** → deve receber notificação de teste 6. **↑ Enviar tudo para nuvem** (primeira vez) A partir daí, o app sincroniza automaticamente. Se trocar de celular, basta colar a URL + token e tocar em **↓ Baixar da nuvem**. ## Atualizando o código Sempre que houver mudanças: ```bash git push origin main ``` No Coolify: - **Deploy** → ele puxa, builda, e troca o container - A migração de schema do SQLite é automática (CREATE TABLE IF NOT EXISTS) ## Backup O volume `/data` contém: - `shivao.db` (SQLite com todos os dados) - `media/` (fotos, áudios, vídeos) **Recomendado**: configurar backup periódico do volume no Coolify ou sincronizar `/data` para um S3 com `restic` ou `borgbackup` via cronjob. ## Troubleshooting ### "BOAT_TOKEN não configurado" Variável de ambiente faltando ou < 16 chars. Veja Passo 2.3. ### "Failed to fetch" no app - DNS não propagou ainda - Token errado - Coolify não está expondo SSL (verificar Domains) ### "Webhooks falham mas Telegram funciona" Discord/genérico podem ter rate limits. O servidor faz fan-out independente, então um falhar não afeta os outros. ### "GPS não funciona no app" Geolocation API só funciona em HTTPS. Coolify configura HTTPS automaticamente — mas verifique se está acessando `https://...` e não `http://`. ### "Dead-man switch não dispara" - Verificar logs do servidor: `docker logs ` - Dead-man só dispara se houve `/api/anchor/start` antes - Default é 5 min sem heartbeat — pode ajustar em `HEARTBEAT_TIMEOUT_SEC` ### Container reinicia em loop Verificar logs. Causa comum: `BOAT_TOKEN` muito curto (mínimo 16 chars). ## Custos esperados - Hetzner CX22 (2 vCPU, 4 GB RAM): ~6€/mês — sobra recurso - Domínio: ~10€/ano - Telegram, ntfy, Open-Meteo: grátis - Twilio (se ativar SMS): ~$1/mês + ~$0.05 por SMS no Brasil - Windy Point Forecast: o dono já tem premium pessoal Total mínimo: ~7€/mês.