{
  "schemaVersion": "1.0",
  "path": "/guias/bots-discord/deploy-bot-discord-nodejs-pm2",
  "url": "https://streethosting.com.br/guias/bots-discord/deploy-bot-discord-nodejs-pm2",
  "markdownUrl": "https://streethosting.com.br/guias/bots-discord/deploy-bot-discord-nodejs-pm2.md",
  "jsonUrl": "https://streethosting.com.br/guias/bots-discord/deploy-bot-discord-nodejs-pm2.json",
  "title": "Deploy de bot Discord Node.js com PM2: variáveis de ambiente e restart automático",
  "description": "Coloque bot discord.js ou compatível em produção com PM2 no Linux: ecosystem.config.cjs, clusters opcional, logs, startup systemd e boas práticas de segredo.",
  "category": "bots-discord",
  "topics": [
    "deploy",
    "linux",
    "automacao"
  ],
  "difficulty": "intermediario",
  "datePublished": "2026-05-19",
  "dateModified": "2026-05-20",
  "readingMinutes": 4,
  "series": {
    "id": "bots-inicio",
    "order": 2
  },
  "h1": "Deploy de bot Discord Node.js com PM2",
  "excerpt": "PM2 é gerenciador de processos Node popular para bots Discord porque reinicia após crash, persiste entre reboots quando combinado com startup hook e centraliza logs mínimos sem montar Kubernetes inteiro. Este guia cobre arquivo ecosystem, env vars para token e integração com hospedagem BR.",
  "author": "Equipe StreetHosting",
  "wordCount": 624,
  "categoryLabel": "Bots Discord",
  "topicLabels": [
    "Deploy e execução de apps",
    "Administração Linux",
    "Automação e webhooks"
  ],
  "primaryKeyword": "deploy bot discord pm2",
  "secondaryKeywords": [
    "discord.js pm2 ecosystem",
    "node bot systemd",
    "hospedar bot node brasil"
  ],
  "toc": [
    {
      "id": "por-que-pm2-e-nao-screen",
      "label": "Por que PM2 e não só screen"
    },
    {
      "id": "bootstrap-node-e-arquivo-do-bot",
      "label": "Bootstrap Node e arquivo do bot"
    },
    {
      "id": "ecosystem-config-e-env",
      "label": "ecosystem.config e variáveis de ambiente"
    },
    {
      "id": "logs-restarts-e-limites",
      "label": "Logs, restarts e limites de memória"
    },
    {
      "id": "hospedagem-gerenciada-vs-vps",
      "label": "Hospedagem gerenciada versus VPS"
    }
  ],
  "faqs": [
    {
      "question": "PM2 substitui Docker?",
      "answer": "Para bot único frequentemente sim em VPS simples. Docker brilha quando precisa reprodutibilidade multi-serviço e pipelines CI idênticos a produção."
    },
    {
      "question": "Posso usar cluster mode no Discord bot?",
      "answer": "discord.js single process é comum; sharding para bots massivos é outro capítulo. Cluster PM2 não substitui sharding correto da API Discord."
    },
    {
      "question": "Onde guardo DISCORD_TOKEN?",
      "answer": "Arquivo .env fora do Git com permissões restritas, ou variável exportada pelo systemd/painel de hospedagem. Nunca console.log token em erro."
    },
    {
      "question": "Preciso build TypeScript antes?",
      "answer": "Sim se código fonte é TS: rode tsc ou pipeline equivalente antes do PM2 apontar para dist/. Alternativa é ts-node em dev apenas."
    }
  ],
  "howToSteps": [],
  "relatedProducts": [
    "https://streethosting.com.br/bots",
    "https://streethosting.com.br/vps/ryzen"
  ],
  "relatedGuides": [
    "https://streethosting.com.br/guias/bots-discord/hospedagem-bot-discord-24-7",
    "https://streethosting.com.br/guias/vps/ssh-seguro-vps-linux",
    "https://streethosting.com.br/guias/vps/instalar-docker-ubuntu-vps"
  ],
  "content": {
    "format": "markdown",
    "body": "> **Resposta rápida**\n>\n> Para **deploy bot Discord Node.js com PM2**: instale LTS Node via nvm ou repos oficiais, copie projeto para servidor, defina `DISCORD_TOKEN` e flags em **.env**, crie `ecosystem.config.cjs` apontando script entry, rode `pm2 start ecosystem.config.cjs`, habilite `pm2 save` e `pm2 startup` para sobreviver reboot, monitore `pm2 logs --lines 100` e limite RAM com `max_memory_restart`. Para menos SysOps, use [hospedagem de bots StreetHosting](https://streethosting.com.br/bots).\n\n## Por que PM2 e não só screen\n\nscreen e tmux ajudam em sessão manual, mas não controlam ciclo de vida do processo. PM2 registra estado, reinicia quando o bot encerra com erro e mantém comando único para ver logs, memória e contagem de restarts. Em operação diária isso reduz tempo de resposta quando alguém reporta comando quebrado no Discord.\n\nSe a meta é uptime contínuo, combine este guia de deploy com o guia de [hospedagem bot Discord 24/7](https://streethosting.com.br/guias/bots-discord/hospedagem-bot-discord-24-7) para definir monitoramento e capacidade.\n\n## Bootstrap Node e arquivo do bot\n\n1. Acesse via `ssh usuario@vps` com chave e usuário sem root.\n2. Instale Node LTS e valide versão com `node -v`.\n3. Suba o projeto com clone privado ou pipeline CI, sem enviar secrets.\n4. Rode `npm ci --omit=dev` e execute build para gerar `dist/`.\n5. Teste local no servidor com `node dist/index.js` antes de iniciar no PM2.\n\nPassos de SSH seguro estão em [SSH seguro em VPS Linux](https://streethosting.com.br/guias/vps/ssh-seguro-vps-linux).\n\n## ecosystem.config e variáveis de ambiente\n\nNo `ecosystem.config.cjs`, declare nome do app, caminho do script compilado e diretório absoluto do projeto. Exemplo comum: `name: discord-bot-prod`, `script: ./dist/index.js`, `cwd: /home/bot/app` e `env.NODE_ENV=production`. Isso evita restart em pasta errada e facilita diferenciar produção e homologação com nomes separados no `pm2 list`.\n\n| Chave | Exemplo | Notas |\n| --- | --- | --- |\n| DISCORD_TOKEN | xxx.yyy.zzz | Rotacione ao suspeitar de vazamento |\n| NODE_ENV | production | Evita comportamento de desenvolvimento |\n| CLIENT_ID | 123456789012345678 | Necessário para registrar slash command |\n\n> **Atenção**\n>\n> Se token for exposto em commit ou log, regenere no portal do Discord e reinicie o processo com `pm2 restart discord-bot-prod --update-env`.\n\n## Logs, restarts e limites de memória\n\nConfigure `max_memory_restart` para interromper leak de memória antes do kernel matar processos. Em bot médio, começar com 300M a 500M costuma funcionar, mas ajuste pelo RSS real. Ative rotação de logs e acompanhe `pm2 logs --lines 100` após deploy para garantir que login e registro de comandos terminaram sem erro.\n\nExemplo de log saudável: `[Gateway] Logged in as ModBot#1234`. Exemplo de alerta: `Error: Used disallowed intents` seguido de reinício contínuo. Quando a contagem em `pm2 show discord-bot-prod` passa de 5 restarts em poucos minutos, trate como incidente e congele novos deploys até corrigir a causa.\n\n> **Dica**\n>\n> Em rate limit, prefira fila com retry e backoff. Log típico inclui `429 Too Many Requests` e campo `retry_after`. Use esse valor para agendar nova tentativa sem gerar loop.\n\n## Hospedagem gerenciada versus VPS\n\nEm VPS você controla sistema inteiro, inclusive updates, firewall e hardening. Em hospedagem gerenciada você entrega menos tempo para manutenção e mais tempo para código do bot. Contrate [planos de bot Discord StreetHosting](https://streethosting.com.br/bots) quando quiser operação assistida. Se preferir montar tudo por conta, use [VPS Ryzen](https://streethosting.com.br/vps/ryzen); stacks containerizadas podem seguir [Docker no Ubuntu VPS](https://streethosting.com.br/guias/vps/instalar-docker-ubuntu-vps).\n\n- Gerenciada: painel e suporte para rotina de deploy e restart.\n- VPS: liberdade para múltiplos bots e serviços auxiliares.\n\n- [ ] Executar pm2 save após alterar ecosystem.\n- [ ] Validar reboot com janela informada para a equipe.\n- [ ] Checar status com pm2 status e pm2 logs após restart.\n- [ ] Manter política de atualização de dependências e token rotation."
  }
}
