Closed4
Discord botをHerokuからFly.ioに移行する
前提
- 言語は TypeScript
- フレームワークは Discord.js
- データベースは未使用
- ローカルでbotを動かせる状態である
大まかな手順
- アカウント作成
- GitHubログインが楽
- メールアドレスでも作成可能
- クレジットカード番号入力が出るが、
Try Fly.io for free
を押せば入れずに進められる
- flyctlをインストール
- Windows: Powershellを開いて
iwr https://fly.io/install.ps1 -useb | iex
- WSL2 Ubuntuを使っているなら下でOK
- Mac/Linux:
curl -L https://fly.io/install.sh | sh
- Windows: Powershellを開いて
- ログイン
$ flystl auth login
- デプロイ準備
$ flyctl launch
- fly.tomlとDockerfileが作成される
- fly.tomlは基本そのままでOK
- Dockerfileもほとんどそのまま
- Procfileのコマンドが
RUN
かCMD
で実行されていることを確認
- Procfileのコマンドが
- 環境変数を使っている場合は登録
$ flyctl secrets set TOKEN=hogehogetest
- デプロイ
$ flyctl deploy
- 10分以上はかかる
- 動作確認
- https://fly.io/dashboard からデプロイしたアプリの状態を見られる
ハマったこと
-
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
- 参考: https://mogura.dev/articles/2022/what-to-do-if-deploy-to-fly-io-fails/
-
sh: tsc not found
- ビルド中にTypeScriptのトランスパイルに失敗
- Dockerfileを修正する
-
npm install
→npm install --production=false
- typescriptが
devDependencies
に入っているため、npm install
だとtsc
だけでTypeScriptのビルドができない
- typescriptが
-
Failed due to unhealthy allocations - no stable job version to auto revert to and deploying as v*
- アプリ更新後の再デプロイに失敗
-
$ flyctl restart
してみる - 時間をおいて何回か試すとうまくいく
- 参考: https://qiita.com/proyuki02/items/0980686ea99ae530dc65#failed-due-to-unhealthy-allocations---no-stable-job-version-to-auto-revert-to-and-deploying-as-v1
現状のDockerfileはこんな感じ
FROM debian:bullseye as builder
ARG NODE_VERSION=16.13.2
RUN apt-get update; apt install -y curl
RUN curl https://get.volta.sh | bash
ENV VOLTA_HOME /root/.volta
ENV PATH /root/.volta/bin:$PATH
RUN volta install node@${NODE_VERSION}
#######################################################################
RUN mkdir /app
WORKDIR /app
# NPM will not install any package listed in "devDependencies" when NODE_ENV is set to "production",
# to install all modules: "npm install --production=false".
# Ref: https://docs.npmjs.com/cli/v9/commands/npm-install#description
ENV NODE_ENV production
COPY . .
# ここだけ変更
RUN npm install --production=false && npm run build
FROM debian:bullseye
LABEL fly_launch_runtime="nodejs"
COPY /root/.volta /root/.volta
COPY /app /app
WORKDIR /app
ENV NODE_ENV production
ENV PATH /root/.volta/bin:$PATH
CMD npm run start
Pythonであればこの動画を見れば良さそう
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
このスクラップは2022/12/02にクローズされました