0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Fly.ioにPythonアプリをデプロイしてみた【Discord bot実例】

0
Posted at

はじめに

Pythonで作ったDiscord botを、Fly.ioにデプロイしたときの手順をまとめます。
この記事では、flyctl を使ったデプロイの流れを中心に書いています。

「はじめてのPython勉強会」参加者向けに、Git・GitHub・Dockerの基本的な説明をPLUG導入ページ に順次まとめる予定です。公開まで少しお待ちください。


前提

  • Pythonアプリがローカルでは動いている
  • GitHubにコードをpushできる
  • Fly.ioのアカウントを作成済み
  • flyctl を使って操作する

Pythonで作ったものを、自分のPC以外の場所で動かしたいというときの参考になればと思います。


用意したファイル

今回は主に、次のファイルを用意してFly.ioに載せました。

  • requirements.txt
  • Dockerfile
  • fly.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つ。

  1. Dockerfile で実行環境を作る
  2. fly.toml でポートやサービス設定をする
  3. secrets でトークンなどを渡す
  4. 動かないときは statuslogs を見る

参考コマンドまとめ

# ログイン
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に含まれる文字列をデコードして、何の投稿か分かる形で再投稿してくれます。

---

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?