# Hospedar um bot do Discord

URL: https://0.0.0.0:3002/docs/guias/bot-discord

Coloque um bot feito com discord.js ou discord.py online 24/7 no Hydro, com o token como segredo.

Um bot do Discord abre uma conexão com o gateway do Discord e fica ouvindo eventos. Ele não recebe conexões, então roda como **worker**: um processo contínuo, sem porta pública, que o Hydro reinicia se cair.

## Antes de começar [#antes-de-começar]

* O token do bot, em **Discord Developer Portal → Applications → seu app → Bot → Reset Token**.
* Os **Privileged Gateway Intents** que o bot usa ligados na mesma página (por exemplo, *Message Content Intent* para ler mensagens).
* O código num repositório do GitHub ou num `.zip` (sem `node_modules` nem `.venv`).

## 1. Leia o token da variável de ambiente [#1-leia-o-token-da-variável-de-ambiente]

Nunca deixe o token no código. Leia de `DISCORD_TOKEN`:

```js title="index.js (discord.js)"
import { Client, Events, GatewayIntentBits } from 'discord.js';

const client = new Client({ intents: [GatewayIntentBits.Guilds] });
client.once(Events.ClientReady, (ready) => console.log(`Online como ${ready.user.tag}`));
client.login(process.env.DISCORD_TOKEN);
```

```python title="main.py (discord.py)"
import os
import discord

client = discord.Client(intents=discord.Intents.default())

@client.event
async def on_ready():
    print(f"Online como {client.user}")

client.run(os.environ["DISCORD_TOKEN"])
```

## 2. Garanta o comando de início [#2-garanta-o-comando-de-início]

* **Node.js:** um script `start` no `package.json`, como `"start": "node index.js"`. O gerenciador (npm, pnpm, yarn ou bun) vem do lockfile.
* **Python:** um `main.py` na raiz e as dependências no `requirements.txt` (ou `pyproject.toml` com Poetry ou uv).

## 3. Crie o worker [#3-crie-o-worker]

Em **Aplicações → Criar aplicação**, escolha a origem (GitHub, `.zip` ou imagem Docker), o tipo **Worker** e a memória. Bots pequenos costumam rodar bem com 128 a 256 MB; acompanhe o consumo em **Métricas** e ajuste.

## 4. Cadastre o token e faça o deploy [#4-cadastre-o-token-e-faça-o-deploy]

Na aba **Variáveis**, crie `DISCORD_TOKEN` marcada como **segredo** e faça o deploy. Nos **Logs**, aparece a linha `Online como …` quando o bot conecta.

## Erros comuns [#erros-comuns]

| Sintoma                          | Causa                                                                          |
| -------------------------------- | ------------------------------------------------------------------------------ |
| `Used disallowed intents`        | O código pede um intent privilegiado que não está ligado no Developer Portal   |
| `An invalid token was provided`  | Token errado ou com espaço sobrando na variável. Gere outro e atualize         |
| O bot conecta e não lê mensagens | Falta o *Message Content Intent*, no código e no portal                        |
| A app fica `crashed`             | O processo caiu 5 vezes em 10 minutos. As últimas linhas do log mostram o erro |

## Dados do bot [#dados-do-bot]

Arquivos que o bot grava, como um banco SQLite, ficam na **pasta do projeto**, que continua entre deploys e entra no backup diário ([detalhes](/docs/aplicacoes)). Para muitos acessos simultâneos, use um [banco gerenciado](/docs/bancos-de-dados).
