Discord bot を Heroku からFly.ioに移行する
TypeScript製のDiscord botをHerokuで動かしていたが、無料サービスが終了するので別サービスに移行する
移行候補
VM
EC2
GCE
PaaS
Fly.io
Railway
Render.com
Fly.ioが良いっぽい
https://www.youtube.com/watch?v=J7Fm7MdZn_E
Dockerfileがちょっと書ければ問題なさそう
Pythonの場合こんな感じのDockerfileになる(上記動画より引用)
code:Dockerfile
# バージョンを指定
FROM python:3.10
# サーバーの中でbotを動かす作業ディレクトリを指定
WORKDIR /bot
# 使用ライブラリ一覧を作業ディレクトリにコピー
COPY requirements.txt /bot/
# ライブラリをダウンロード
RUN pip install -r requirements.txt
# flyctl deployを実行したディレクトリの中身とライブラリを作業ディレクトリにコピー
COPY . /bot
# 作業ディレクトリでbotを実行
CMD python main.py
大まかな手順
アカウント作成
GitHubログインが楽
メールアドレスでも作成可能
flyctlをインストール
Windows: Powershellを開いて iwr https://fly.io/install.ps1 -useb | iex
WSL2 Ubuntuを使っているなら下でOK
Mac/Linux: curl -L https://fly.io/install.sh | sh
ログイン
flystl auth login
デプロイ準備
flyctl launch
fly.tomlとDockerfileが作成される
fly.tomlは基本そのままでOK
Dockerfileもほとんどそのまま
ProcfileのコマンドがRUNかCMDで実行されていることを確認
環境変数を使っている場合は登録
flyctl secrets set TOKEN=hogehogetest
デプロイ
flyctl deploy
10分以上はかかる
動作確認
ハマったこと
Error failed to fetch an image or build from source: error building: error during connect:
ビルドに失敗
$ flyctl wireguard websockets enableを実行してから再度flyctl deploy
それでも失敗するなら$ flyctl deploy --local-only
sh: tsc not found
ビルド中にTypeScriptのトランスパイルに失敗
Dockerfileを修正する
npm install → npm install --production=false
typescriptがdevDependenciesに入っているため、npm installだとtscだけでTypeScriptのビルドができない
Failed due to unhealthy allocations - no stable job version to auto revert to and deploying as v*
アプリ更新後の再デプロイに失敗
$ flyctl restartしてみる
時間をおいて何回か試すとうまくいく