サーバー上の Telegram ボット:起動と自動起動
VPS で Telegram ボットをホストする方法:専用ユーザーによる分離、systemd サービス、トークンの保管、ログ、ネットワーク障害への対処について説明します。
更新日 2026年8月23日
ボットには常時稼働するプロセスが必要です。ここからが無料ホスティングの限界で、VDSの出番です。ボットはほとんどリソースを必要としません。数千人のユーザーを抱えるボットでも、VDS-1(1コア、2 GB)で十分に動きます。
配置
ボットがrootで動かないよう、専用のユーザーとディレクトリを用意します。
useradd -r -m -d /srv/bot -s /usr/sbin/nologin botuser
cd /srv/bot && sudo -u botuser git clone https://github.com/you/bot.git .
sudo -u botuser python3 -m venv venv
sudo -u botuser venv/bin/pip install -r requirements.txt
Node.jsの場合は、venvの代わりに npm ci --omit=dev を使います。
トークンはコード内ではなく環境ファイルに保存します。
install -o botuser -g botuser -m 600 /dev/null /srv/bot/.env
echo 'BOT_TOKEN=123456:ABC...' > /srv/bot/.env
トークンが書かれたファイルがリポジトリに入らないようにしてください。最初のコミットの前に .gitignore に追加します。
サービス
/etc/systemd/system/tgbot.service:
[Unit]
Description=Telegram bot
After=network-online.target
Wants=network-online.target
[Service]
User=botuser
WorkingDirectory=/srv/bot
EnvironmentFile=/srv/bot/.env
ExecStart=/srv/bot/venv/bin/python -u bot.py
Restart=always
RestartSec=10
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now tgbot
journalctl -u tgbot -f
Pythonの -u フラグは出力バッファリングを無効にします。これがないと、ログがjournalに数分遅れて表示されたり、まったく表示されなかったりします。
ロングポーリングかWebhookか
ロングポーリングのほうがシンプルです。ボット自身がTelegramに問い合わせるため、何も公開する必要がありません。ほとんどの用途にはこれで十分です。
Webhookはより高速で通信量も抑えられますが、ドメインと証明書が必要です。
location /bot/token {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
Let's Encrypt とリバースプロキシが必要です。Telegramは自己署名証明書を受け付けにくいため、通常の証明書を使用してください。
ボットのコピーが同時に2つ動いている状態は絶対に避けてください。Telegramは更新を1つの受信者にしか配信しないため、ボットの応答が断続的になります。編集後は、2つ目の起動ではなく restart を実行してください。
データ
設定や統計にはSQLiteで十分です。ボットの隣に置くファイルで済みます。別途データベースサーバーが必要になるのは、ボットにWebパネルや複数のプロセスがある場合だけです。
よくある間違い
| 症状 | 原因 |
|---|---|
Conflict: terminated by other getUpdates | ボットのコピーが2つ動いている |
| 一晩経つとボットが沈黙する | Restart=always が設定されておらず、ネットワーク切断時にプロセスがクラッシュした |
Unauthorized | トークンが失効した、または余分な空白を含めてコピーされた |
| ログが出ない | 出力バッファリング、またはstdoutではなくファイルに書き込んでいる |
| 手動では動くがサービスとしてはクラッシュする | systemdに環境変数がない |
スクリーンショット、公開リポジトリ、他人のチャットに現れたトークンは漏洩したものとみなします。BotFatherで失効させ、
.envファイルを変更してください。誰も気づかないだろうと考えてはいけません。