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?

Discord BotをPodmanに移行してみた

Last updated at Posted at 2025-12-15

私は、これまで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が同時に起動している状態になってしまいます。

  1. 古いBotを停止・無効化する
    これまでの設定は sudo で管理していたはずなので、sudo を使って停止します。

    # 停止
    sudo systemctl stop discordbot
    
    # 自動起動の解除(サーバー再起動時に古いほうが立ち上がらないようにする)
    sudo systemctl disable discordbot
    
  2. 停止の確認
    以下のコマンドを打ち、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と同じディレクトリに既にある場合はこの手順は飛ばしてください。

  1. ディレクトリへ移動

    cd /home/opc/OU-Sakumon-Discord-Bot
    
  2. 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を編集した場合は以下を実行することで反映できます。

  1. ビルド実行

    podman build -t my-discord-bot .
    
  2. 成功の確認
    最後に以下のような文字が出れば成功です。

    Successfully tagged localhost/my-discord-bot:latest
    

手順5:Podman用のsystemd設定 (Quadlet)

サーバーを再起動した時に自動でBotが立ち上がるよう設定します。
今回は、管理しやすいユーザー権限で動作させます。

  1. 設定ファイルを置くディレクトリを作成

    mkdir -p ~/.config/containers/systemd/
    
  2. 設定ファイルを作成

    nano ~/.config/containers/systemd/discordbot.container
    
  3. 以下の内容をコピペして保存します(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を起動します。

  1. 設定ファイルの再読み込み

    systemctl --user daemon-reload
    
  2. Botの起動

    systemctl --user start discordbot
    
  3. 自動起動の有効化

    systemctl --user enable discordbot
    
  4. 成功の確認
    ステータスを確認します。

    systemctl --user status discordbot
    

    緑色の丸印 Active: active (running) が表示されていれば成功です。


よくあるエラー

Q. 「Unit discordbot.service not found」と出る。

原因: コマンドの打ち間違いです。

  • これまで:sudo systemctl ... を使っていました。
  • これから:** systemctl --user ... を使います。

Q. ログを確認したい

リアルタイムでログを確認するには以下のコマンドを使ってください。

journalctl --user -u discordbot -f

👇こんな記事も書いてます!

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?