料金表Loading...
利用ガイドに戻る

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.jspackage.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 が新しいトークンで 起動し直します。

6. コードを貼って動かす

画面のエディタで書く方式です。雛形を 3 種類用意しているので、まず選んでから 書き換えるのが早いです。

  • 動作確認 — 1 分ごとに生存ログを出すだけ。まず動かしてみる用
  • Discord botdiscord.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 回目以降はキャッシュが効きます。キャッシュ用のディスクはプランに含まれ、ストレージ枠の外です

9. 稼働の確認とログ

Bot には公開 URL が無いので、状態・再起動回数・稼働時間・ログの 4 つで確認します。

  • ステータスタブ: 稼働中 / エラー / 停止中、再起動回数、稼働時間、取得元の commit
  • ログタブ: 出力を切り替えて見られます
    • Bot 本体console.log の出力
    • リポジトリ取得 (init) — clone のログ (Git 取得のときだけ)
    • 依存 install (init) — npm のログ

10. プラン上限

プラン上限を取得できませんでした。後ほど再読み込みしてください。

レプリカは 0 か 1 です (同じ Bot の二重起動を避けるため)。台数を増やすには プランを変更してください。

11. トラブルシューティング

「リポジトリの取得に失敗しています」と出る

ログタブの「リポジトリ取得 (init)」に理由が出ます。URL の誤り、ref が 存在しない、非公開なのにトークン未登録、のいずれかがほとんどです。 社内ネットワークのリポジトリは取得できません。

「依存パッケージの install に失敗しています」と出る

ログタブの「依存 install (init)」を確認してください。パッケージ名や バージョンの誤り、native モジュール (ビルドが要るもの) が原因です。 直して保存すると再試行されます。

起動はするがすぐ止まる / 再起動を繰り返す

プロセスが終了しています。ログタブの「Bot 本体」に例外が出ていないか、 常駐する処理があるかを確認してください。前の Pod に 切り替えると、落ちる直前の出力が見られます。

リポジトリを更新したのに反映されない

仕様です。設定タブの「Git から取り直す」を押してください。押しても 「変更はありませんでした」と出る場合は、ref の指す先が変わっていません (別ブランチを指定していないか確認してください)。

メモリ不足で落ちる

ステータスに OOMKilled と出ます。設定タブでメモリを 増やすか (プラン上限まで)、プランを変更してください。