Bot (常駐プロセス)
Discord bot・定期実行・キューの consumer などを、コードだけで動かす
1. 概要
Bot は外向き通信だけを行う常駐プロセスを動かす機能です。 コンテナイメージを用意する必要はなく、コード (と依存のpackage.json) を渡すだけで起動します。
- 向いているもの: Discord / Slack bot、定期実行、キューの consumer、外部 API の監視
- 向いていないもの: Web サイト、API サーバ — 公開 URL を持てません。それらは Web サービス を使ってください
2. 前提条件
- Bot のライセンス (料金プラン から購入)
- ランタイムは現在 Node.js のみ
- Git から動かす場合は公開ホスト (GitHub 等) のリポジトリ
3. 取得元を選ぶ (Git / 直接編集)
作成画面の最初で、コードをどこから持ってくるかを選びます。
| Git から取得 (推奨) | 直接編集 | |
|---|---|---|
| コードの置き場 | あなたのリポジトリ | ToukaCloud (画面のエディタ) |
| ファイル構成 | ディレクトリを作れる | フラットのみ |
| サイズ上限 | 実質なし | プランごと (下記) |
| 更新のしかた | 「Git から取り直す」を押す | エディタで保存 |
4. Git から動かす
リポジトリの条件は次の 3 つです。
- リポジトリ直下に
index.jsがあること (これが起動されます) - 依存があるなら直下に
package.json https://で始まる URL (ssh は非対応)
your-repo/ ├── index.js ← 起動されるファイル ├── package.json ← 依存があれば └── package-lock.json
モノレポの一部を使う場合は「サブディレクトリ」を指定します。 指定した階層がコードの root として扱われるので、index.js と package.json はその中にあれば 足ります (repo を分ける必要はありません)。
your-monorepo/
├── README.md
└── bots/
└── notifier/ ← サブディレクトリに "bots/notifier" を指定
├── index.js ← これが起動される
└── package.json作成時に ref (ブランチ / タグ / commit) を解決して commit を固定します。リポジトリを更新しても動いているコードは変わりません — 取り込むには 設定タブの「Git から取り直す」を押します。
サンプルは examples/discord-bot にあります (ping に応答する Discord bot)。
5. 非公開リポジトリ
アクセストークンを登録すると非公開リポジトリからも取得できます。 登録は Git アクセストークン (作成画面からも開けます) で行います。
- GitHub: fine-grained PAT で対象リポジトリのみ、Contents は
Read-only。ユーザー名は省略可 - GitLab: deploy token の
read_repository。ユーザー名にトークン名を入れてください
トークンはホストごとに 1 つで、同じホストのリポジトリを使う Bot すべてで共有されます。登録後は表示できません (末尾 4 文字だけ 照合用に残ります)。更新すると、そのホストを使っている Bot が新しいトークンで 起動し直します。
https://user:token@...) は 受け付けません。ログや設定に残ってしまうためです。読み取り以上の権限を持つ トークンは登録しないでください。6. コードを貼って動かす
画面のエディタで書く方式です。雛形を 3 種類用意しているので、まず選んでから 書き換えるのが早いです。
- 動作確認 — 1 分ごとに生存ログを出すだけ。まず動かしてみる用
- Discord bot —
discord.jsで ping に応答する - 定期実行 — 一定間隔で外部 API を叩く。依存ゼロ
制約:
- ファイルはフラット構成のみ (
src/foo.jsのようなディレクトリは作れません) - 合計サイズにプランごとの上限があります (下記)
- 起動されるのは
index.jsです
保存すると再起動します。旧プロセスが止まってから新しい プロセスが起動するので、同じ Bot が二重に動く瞬間はありません。
7. 環境変数
トークンなどの秘密はコードに書かず環境変数で渡します。 作成画面と設定タブで KEY=value 形式で指定でき、process.env から読めます。
DISCORD_TOKEN=xxxxxxxx LOG_LEVEL=info
設定漏れは起動時に落として理由を出すのがおすすめです。Bot には URL も probe も無いため、黙って接続に失敗すると画面には「再起動を繰り返して いる」ことしか出ません。
if (!process.env.DISCORD_TOKEN) {
console.error('DISCORD_TOKEN が設定されていません');
process.exit(1);
}8. 依存パッケージ
package.json があれば、起動前の init コンテナが 自動で install します。package-lock.json があればnpm ci、無ければ npm install です。
- install は
--ignore-scriptsで走ります。ビルドが要る native モジュール (node-gyp を使うもの) は動きません devDependenciesは入りません (--omit=dev)- 2 回目以降はキャッシュが効きます。キャッシュ用のディスクはプランに含まれ、ストレージ枠の外です
^14 など) を推奨します。パッチを 固定すると、その版が npm から消えたときに install が失敗します。9. 稼働の確認とログ
Bot には公開 URL が無いので、状態・再起動回数・稼働時間・ログの 4 つで確認します。
- ステータスタブ: 稼働中 / エラー / 停止中、再起動回数、稼働時間、取得元の commit
- ログタブ: 出力を切り替えて見られます
- Bot 本体 —
console.logの出力 - リポジトリ取得 (init) — clone のログ (Git 取得のときだけ)
- 依存 install (init) — npm のログ
- Bot 本体 —
setInterval や接続の維持など、 イベントループを空にしない処理が必要です。10. プラン上限
レプリカは 0 か 1 です (同じ Bot の二重起動を避けるため)。台数を増やすには プランを変更してください。
11. トラブルシューティング
ログタブの「リポジトリ取得 (init)」に理由が出ます。URL の誤り、ref が 存在しない、非公開なのにトークン未登録、のいずれかがほとんどです。 社内ネットワークのリポジトリは取得できません。
ログタブの「依存 install (init)」を確認してください。パッケージ名や バージョンの誤り、native モジュール (ビルドが要るもの) が原因です。 直して保存すると再試行されます。
プロセスが終了しています。ログタブの「Bot 本体」に例外が出ていないか、 常駐する処理があるかを確認してください。前の Pod に 切り替えると、落ちる直前の出力が見られます。
仕様です。設定タブの「Git から取り直す」を押してください。押しても 「変更はありませんでした」と出る場合は、ref の指す先が変わっていません (別ブランチを指定していないか確認してください)。
ステータスに OOMKilled と出ます。設定タブでメモリを 増やすか (プラン上限まで)、プランを変更してください。