Como Migrar um Bot do Discord do Heroku para o Fly.io
🔍 WiseChecker

Como Migrar um Bot do Discord do Heroku para o Fly.io

Você tem um bot do Discord rodando no Heroku e precisa movê-lo para o Fly.io porque o Heroku encerrou seu plano gratuito. A migração envolve mover o código do bot, variáveis de ambiente e dados persistentes para a nova plataforma. Este artigo explica as etapas exatas para migrar seu bot do Discord do Heroku para o Fly.io, incluindo a configuração do projeto no Fly.io, variáveis de ambiente e deploy com Dockerfile ou buildpack.

O Fly.io é uma plataforma em nuvem que permite executar aplicativos completos perto dos seus usuários. Ele oferece um plano gratuito com limites generosos para bots pequenos. O processo exige que você tenha uma conta no Fly.io, a CLI do Fly instalada e o código-fonte do bot disponível localmente.

Este guia cobre todo o processo de migração. Você aprenderá a preparar seu bot para o Fly.io, fazer o deploy e lidar com problemas comuns como vinculação de porta e armazenamento persistente.

Principais pontos: Migrando seu Bot do Discord para o Fly.io

  • fly launch: Cria um novo aplicativo Fly.io a partir do código-fonte do seu bot e gera um arquivo de configuração fly.toml.
  • fly secrets set: Transfere variáveis de ambiente como DISCORD_TOKEN do Heroku para o Fly.io de forma segura.
  • fly deploy: Faz o deploy do seu bot no Fly.io após configurar o Dockerfile ou buildpack.

O que muda ao migrar do Heroku para o Fly.io

Heroku e Fly.io funcionam de forma diferente em várias áreas. O Heroku usava um roteador que escutava nas portas 80 e 443 e encaminhava o tráfego para seu aplicativo em uma porta dinâmica. O Fly.io exige que seu aplicativo se vincule à porta definida na variável de ambiente PORT, normalmente 8080 para serviços web. Para um bot do Discord que usa apenas conexões WebSocket, você não precisa de um servidor web. No entanto, o Fly.io ainda espera que seu aplicativo se vincule a uma porta durante as verificações de deploy, então seu bot deve escutar em uma porta mesmo que nunca receba tráfego HTTP.

O Heroku usava Procfile para definir tipos de processo. O Fly.io usa um arquivo fly.toml e opcionalmente um Dockerfile. Você pode usar um Dockerfile para containerizar seu bot ou contar com os buildpacks integrados do Fly.io que detectam automaticamente seu runtime. Para a maioria dos bots em Python ou Node.js, a abordagem com buildpack funciona sem modificações.

O Heroku oferecia armazenamento de sistema de arquivos efêmero. O Fly.io oferece duas opções para dados persistentes: Fly Volumes para arquivos de banco de dados ou armazenamento de objetos como Tigris. Se seu bot usa SQLite ou outro armazenamento local de arquivos, você deve anexar um volume para manter os dados entre reinicializações.

Passos para migrar seu bot do Discord do Heroku para o Fly.io

Siga estes passos em ordem. Certifique-se de ter a CLI do Fly instalada e autenticada antes de começar.

  1. Instale e autentique a CLI do Fly
    Baixe a CLI do Fly em fly.io/docs/flyctl/install/. Execute flyctl auth login no terminal e siga o prompt do navegador para fazer login na sua conta do Fly.io.
  2. Prepare o código-fonte do seu bot
    Clone o repositório do seu bot do Heroku para sua máquina local. Certifique-se de que todas as dependências estão listadas em um arquivo requirements.txt para Python ou package.json para Node.js. Remova quaisquer arquivos específicos do Heroku, como Procfile ou heroku.yml, se presentes.
  3. Crie um servidor web mínimo para verificações de saúde
    O Fly.io exige que seu aplicativo escute em uma porta. Adicione um servidor HTTP simples que retorne status 200. Para bots Python usando discord.py, adicione este código ao final do seu arquivo principal:
    from aiohttp import web
    app_web = web.Application()
    async def health(request): return web.Response(text="OK")
    app_web.router.add_get('/', health)
    web.run_app(app_web, host='0.0.0.0', port=int(os.environ.get('PORT', 8080)))

    Para bots Node.js, use Express ou o módulo http nativo.
  4. Execute fly launch para criar o aplicativo Fly.io
    Navegue até o diretório raiz do seu bot e execute flyctl launch. A CLI detectará seu runtime, pedirá um nome para o aplicativo e gerará um arquivo fly.toml. Escolha uma região próxima à localização do servidor do seu Discord para baixa latência.
  5. Transfira as variáveis de ambiente do Heroku
    Execute flyctl secrets set DISCORD_TOKEN=seu_token_aqui para cada segredo. Use os mesmos nomes de variáveis do Heroku. Variáveis comuns incluem DISCORD_TOKEN, DATABASE_URL e BOT_PREFIX.
  6. Adicione armazenamento persistente se necessário
    Se seu bot usa SQLite ou armazena arquivos localmente, crie um volume com flyctl volumes create botdata --region iad --size 1. Em seguida, modifique seu fly.toml para montar o volume:
    [[mounts]]
    source = "botdata"
    destination = "/data"

    Atualize o código do seu bot para gravar dados em /data em vez do diretório atual.
  7. Faça o deploy do seu bot
    Execute flyctl deploy. A CLI compila seu aplicativo usando o buildpack detectado ou Dockerfile, faz o upload e inicia o bot. Acompanhe os logs em busca de erros executando flyctl logs.
  8. Configure o bot para execução contínua
    Por padrão, os aplicativos Fly.io são reduzidos a zero após 5 minutos de inatividade. Para um bot do Discord, você precisa que ele funcione 24/7. Defina o número mínimo de instâncias no fly.toml:
    [vm]
    count = 1

    Em seguida, execute flyctl deploy novamente para aplicar a alteração.

Problemas comuns após a migração e como corrigi-los

O bot fica offline após alguns minutos

Isso acontece quando o Fly.io reduz seu aplicativo a zero. Certifique-se de definir count = 1 no arquivo fly.toml. Verifique também se a conexão WebSocket do seu bot reconecta automaticamente. A maioria das bibliotecas do Discord lida com reconexão, mas confirme que seu código não encerra após uma desconexão.

O bot não inicia e mostra “Nenhuma verificação de saúde passou”

O Fly.io exige que seu aplicativo se vincule à variável de ambiente PORT. Seu bot deve escutar em 0.0.0.0 e na porta fornecida pelo Fly.io. Verifique se o código do seu servidor HTTP usa os.environ.get('PORT', 8080). Verifique também se o servidor responde dentro de 30 segundos durante a inicialização. Aumente o tempo limite da verificação de saúde no fly.toml se necessário.

Variáveis de ambiente não disponíveis

Segredos definidos com flyctl secrets set não são visíveis no painel do Fly.io. Use flyctl secrets list para verificar se existem. Se você definiu uma variável após o deploy, reinicie o aplicativo com flyctl apps restart para aplicar a alteração.

Dados persistentes perdidos após reinicialização

Seu bot deve gravar dados no caminho do volume montado, não no diretório de trabalho padrão. Verifique se o destino da montagem do volume no fly.toml corresponde ao caminho usado pelo seu bot. Por exemplo, se seu bot grava em ./data, defina destination = "/data" e atualize seu código para usar /data.

Plano gratuito do Fly.io vs Plano gratuito do Heroku para bots do Discord

Item Plano gratuito Heroku (Descontinuado) Plano gratuito Fly.io
Horas de execução 550 horas/mês, app dorme após 30 min inativo Sempre ativo com count = 1, sem sono por inatividade
Memória 512 MB RAM 256 MB RAM (CPU compartilhada)
Armazenamento persistente Apenas sistema de arquivos efêmero 3 GB de volume gratuito por aplicativo
Domínio personalizado Gratuito com seu-app.herokuapp.com Gratuito com seu-app.fly.dev
Opções de banco de dados Heroku Postgres (add-on pago) Fly Postgres, SQLite com volumes, armazenamento de objetos Tigris
Método de deploy Git push para repositório remoto Heroku flyctl deploy via CLI

Agora você sabe como migrar um bot do Discord do Heroku para o Fly.io. Os principais passos são adicionar um servidor web para verificação de saúde, definir variáveis de ambiente com flyctl secrets set e garantir que dados persistentes usem um volume montado. Após a migração, teste seu bot enviando comandos e verificando logs com flyctl logs. Para maior confiabilidade, configure o redeploy automático do Fly.io no Git push usando GitHub Actions e configure um serviço de monitoramento como UptimeRobot para alertá-lo se o bot ficar offline.