私は、これまでsystemdを用いてDiscord Botを運用していましたがGeminiと話しているとPodmanをおすすめされたので移行してみました。
Gemini曰く、こんなメリットがあるそうです。
◆「勝手にアップデート」による故障を防げる
- Systemd時代: サーバーのOS更新(
yum update)でPythonのバージョンが勝手に上がり、依存ライブラリが動かなくなる事故が起きます。- Podman移行後: コンテナの中に「Bot専用のPython環境」を閉じ込めるため、サーバー側がどう変わっても、Botの環境は永遠に壊れません。
◆セキュリティが劇的に向上する(Rootless)- Systemd時代:
sudo(管理者権限)でBotを動かしていたため、万が一Botが乗っ取られるとサーバー全体を支配されるリスクがありました。- Podman移行後: 一般ユーザー権限(Rootless)で動作します。もしBotが攻撃されても、被害はコンテナの中だけで食い止められ、サーバー本体は守られます。
◆Systemdとの完璧な連携 (Quadlet)- PodmanはSystemdと同じ開発元(Red Hat系)の技術であるため、親和性が抜群です。
docker runコマンドで管理するのではなく、OS標準のsystemctlコマンドで「自動起動」「再起動」「ログ確認」が管理できるため、サーバー管理者にとって非常に扱いやすい構成になります。
◆サーバーを汚さないpip installを繰り返してサーバー内がぐちゃぐちゃになるのを防げます。- Oracle Linux (RHEL系) ではDockerよりもPodmanが標準推奨されており、動作も軽量で安定しています。
私の環境と前提確認
以下のコードでは、必要に応じて変えて実行してください。
- サーバー:Oracle Cloud (Linux)
- Botのコードがある場所:
/home/opc/Discord-Botと仮定 - Podmanはインストール済みであること
手順1:既存のBotの停止
移行前に、systemd で動いている古いBotを停止させます。
これを忘れると、新旧のBotが同時に起動している状態になってしまいます。
-
古いBotを停止・無効化する
これまでの設定はsudoで管理していたはずなので、sudoを使って停止します。# 停止 sudo systemctl stop discordbot # 自動起動の解除(サーバー再起動時に古いほうが立ち上がらないようにする) sudo systemctl disable discordbot -
停止の確認
以下のコマンドを打ち、Active: inactive (dead)となっていることを確認してください。sudo systemctl status discordbot
手順2:Lingerの設定
以下のコマンドを打ってください。
loginctl show-user opc --property=Linger
Linger=noと出た場合は以下のコードを打ってください。
loginctl enable-linger
もう一度、loginctl show-user opc --property=Lingerを打ってLinger=yesと出れば成功です。
手順3:Dockerfileの作成
必要に応じてDockerfileを作ってください。Botと同じディレクトリに既にある場合はこの手順は飛ばしてください。
-
ディレクトリへ移動
cd /home/opc/OU-Sakumon-Discord-Bot -
Dockerfileというファイルを作成し、以下の内容をコピペして保存します。# ベースイメージ(Python 3.11 軽量版) FROM python:3.11-slim # 作業ディレクトリの設定 WORKDIR /app # 必要なパッケージをインストール(gitなどが必要な場合) RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/* # 依存関係ファイルのコピーとインストール COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # ソースコードをすべてコピー COPY . . # 実行コマンド (main.py は自分の起動ファイル名に変えてください) CMD ["python", "main.py"]
手順4:コンテナイメージのビルド
作ったDockerを反映させます。
今後、Dockerfileを編集した場合は以下を実行することで反映できます。
-
ビルド実行
podman build -t my-discord-bot . -
成功の確認
最後に以下のような文字が出れば成功です。Successfully tagged localhost/my-discord-bot:latest
手順5:Podman用のsystemd設定 (Quadlet)
サーバーを再起動した時に自動でBotが立ち上がるよう設定します。
今回は、管理しやすいユーザー権限で動作させます。
-
設定ファイルを置くディレクトリを作成
mkdir -p ~/.config/containers/systemd/ -
設定ファイルを作成
nano ~/.config/containers/systemd/discordbot.container -
以下の内容をコピペして保存します(
Ctrl+O→ Enter →Ctrl+X)。
※EnvironmentFileのパスは自分の環境に合わせてください。[Unit] Description=Discord Bot Container After=network-online.target [Container] # 手順2で作ったイメージ名 Image=localhost/my-discord-bot:latest # コンテナ名 ContainerName=discordbot # 環境変数ファイル(.env)を読み込む設定 # ⚠️重要: フルパスで指定してください EnvironmentFile=/home/opc/Discord-Bot/.env [Service] # 停止しても自動で再起動する設定 Restart=always [Install] WantedBy=default.target
手順6:Botの起動
新しいBotを起動します。
-
設定ファイルの再読み込み
systemctl --user daemon-reload -
Botの起動
systemctl --user start discordbot -
自動起動の有効化
systemctl --user enable discordbot -
成功の確認
ステータスを確認します。systemctl --user status discordbot緑色の丸印
●とActive: active (running)が表示されていれば成功です。
よくあるエラー
Q. 「Unit discordbot.service not found」と出る。
原因: コマンドの打ち間違いです。
- これまで:
sudo systemctl ...を使っていました。 - これから:**
systemctl --user ...を使います。
Q. ログを確認したい
リアルタイムでログを確認するには以下のコマンドを使ってください。
journalctl --user -u discordbot -f
👇こんな記事も書いてます!