はじめに
Pythonで作ったDiscord botを、Fly.ioにデプロイしたときの手順をまとめます。
この記事では、flyctl を使ったデプロイの流れを中心に書いています。
「はじめてのPython勉強会」参加者向けに、Git・GitHub・Dockerの基本的な説明をPLUG導入ページ に順次まとめる予定です。公開まで少しお待ちください。
前提
- Pythonアプリがローカルでは動いている
- GitHubにコードをpushできる
- Fly.ioのアカウントを作成済み
-
flyctlを使って操作する
Pythonで作ったものを、自分のPC以外の場所で動かしたいというときの参考になればと思います。
用意したファイル
今回は主に、次のファイルを用意してFly.ioに載せました。
requirements.txtDockerfilefly.toml- アプリ本体(
main.pyほか)
requirements.txt
必要なライブラリを書きます。
たとえば今回のDiscord botでは、こんなものを使っていました。
discord.py
python-dotenv
aiohttp
Dockerfile
Fly.ioではDockerコンテナとしてアプリを動かすので、Dockerfile を用意します。
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "main.py"]
ここでやっていること:
- Python 3.11 の軽量イメージを使う
- 作業ディレクトリを
/appにする -
requirements.txtをもとにライブラリを入れる - ソースコードをコンテナにコピーする
-
main.pyを実行する
WORKDIR /app の /app は、Dockerコンテナ内の作業フォルダです。
ローカルPC上のフォルダやGitHub上の保存場所とは別で、コンテナの中でコードを配置して実行するための場所になります。
また、COPY . . は、ローカルのプロジェクトフォルダ内のファイルを、コンテナ内の作業ディレクトリ(この場合 /app)へコピーする、という意味です。
実際の起動入口が main.py だったため、Dockerfile の CMD でも main.py を指定しました。
fly.toml
fly.toml は、Fly.ioに「このアプリをどう動かしてほしいか」を伝える設定ファイルです。
今回使ったのはこんな内容です。
app = "makino-san6go-linkedin-discord-bot"
primary_region = "nrt"
[build]
[env]
PORT = "8080"
[http_service]
internal_port = 8080
force_https = false
auto_stop_machines = "off"
auto_start_machines = true
min_machines_running = 1
[[http_service.checks]]
interval = "30s"
timeout = "5s"
grace_period = "10s"
method = "GET"
path = "/"
ざっくり説明
- アプリ名はこれ
- 東京リージョンで動かす
- 8080番ポートを使う
- HTTPサービスとして公開する
-
/にアクセスして生きているか確認する
という設定です。
fly.toml は、Fly.io の起動設定を手元で管理するためのファイルです。
なくても fly launch で初期設定を進めることはできますが、
- アプリ名
- リージョン
- ポート
- HTTPサービス
- ヘルスチェック
などを 最終的には fly.toml にまとめておくほうが、設定の見通しがよくなります。
あとで設定を変えて再デプロイするときも、fly.toml を編集すればよいです。
.gitignore
.env などの秘密情報はGitHubに上げないようにしておきます。
.env
__pycache__/
*.pyc
トークンをうっかりpushしないためにも、ここは最初に入れる。
GitHubにpushする
コードをGitHubに上げます。
git init
git add .
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/ユーザー名/リポジトリ名.git
git push -u origin main
Fly.io CLI を入れる
Fly.ioは flyctl というCLIで操作します。
# Mac
brew install flyctl
# Windows(PowerShell)
iwr https://fly.io/install.ps1 -useb | iex
入ったかどうかは、これで確認できます。
flyctl version
Fly.ioにログインする
flyctl auth login
ブラウザが開くので、そのまま進めればOKです。
アプリを作る
プロジェクトフォルダで、次を実行します。
flyctl launch
これでFly.io側のアプリ作成が進みます。
途中で fly.toml が作られることもあります。
私はあとから中身を見直して、ポートや設定を調整しました。
secrets を設定する
Discord botなどでは、トークンを環境変数で渡します。
Python側でたとえばこう読んでいるなら、
TOKEN = os.getenv("TOKEN")
Fly.io側も同じ名前で設定します。
flyctl secrets set TOKEN=あなたのトークン
デプロイする
flyctl deploy
flyctl deploy を実行すると、
ローカルのコードをもとにDockerイメージが作られ、それがFly.io上でコンテナとして起動します。
動作確認
# 状態を見る
flyctl status -a アプリ名
# ログを見る
flyctl logs -a アプリ名
いろいろ考える前にまずログを見るのがいちばん早かったです。
アプリを2つ登録していた
気づいたらアプリが2つ登録されていました。
2 apps のような表示が出ていて、ログを見たら2つ動いていました。
そこで、不要な方を削除しました。
# アプリの一覧を確認
flyctl apps list
# 不要なアプリを削除
flyctl apps destroy アプリ名
削除後、ログで1つだけ動いていることを確認しました。
flyctl logs -a アプリ名
まとめ
Fly.ioにPythonアプリをデプロイするときの4つ。
-
Dockerfileで実行環境を作る -
fly.tomlでポートやサービス設定をする - secrets でトークンなどを渡す
- 動かないときは
statusとlogsを見る
参考コマンドまとめ
# ログイン
flyctl auth login
# 初期化
flyctl launch
# secrets設定
flyctl secrets set TOKEN=あなたのトークン
# デプロイ
flyctl deploy
# 状態確認
flyctl status -a アプリ名
# ログ確認
flyctl logs -a アプリ名
# Machine起動
flyctl machine start -a アプリ名
おまけ: botが動いている様子
LinkedInのURLに含まれる文字列をデコードして、何の投稿か分かる形で再投稿してくれます。
---