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çãofly.toml.fly secrets set: Transfere variáveis de ambiente comoDISCORD_TOKENdo 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.
- Instale e autentique a CLI do Fly
Baixe a CLI do Fly emfly.io/docs/flyctl/install/. Executeflyctl auth loginno terminal e siga o prompt do navegador para fazer login na sua conta do Fly.io. - 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 arquivorequirements.txtpara Python oupackage.jsonpara Node.js. Remova quaisquer arquivos específicos do Heroku, comoProcfileouheroku.yml, se presentes. - 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ódulohttpnativo. - Execute
fly launchpara criar o aplicativo Fly.io
Navegue até o diretório raiz do seu bot e executeflyctl launch. A CLI detectará seu runtime, pedirá um nome para o aplicativo e gerará um arquivofly.toml. Escolha uma região próxima à localização do servidor do seu Discord para baixa latência. - Transfira as variáveis de ambiente do Heroku
Executeflyctl secrets set DISCORD_TOKEN=seu_token_aquipara cada segredo. Use os mesmos nomes de variáveis do Heroku. Variáveis comuns incluemDISCORD_TOKEN,DATABASE_URLeBOT_PREFIX. - Adicione armazenamento persistente se necessário
Se seu bot usa SQLite ou armazena arquivos localmente, crie um volume comflyctl volumes create botdata --region iad --size 1. Em seguida, modifique seufly.tomlpara montar o volume:[[mounts]]
source = "botdata"
destination = "/data"
Atualize o código do seu bot para gravar dados em/dataem vez do diretório atual. - Faça o deploy do seu bot
Executeflyctl 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 executandoflyctl logs. - 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 nofly.toml:[vm]
count = 1
Em seguida, executeflyctl deploynovamente 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.