🤖

【Koyeb】Discord BOTを無料で24時間稼働させる

に公開2

はじめに

Discord BOTを作成したものの、クラウドで24時間稼働させたいけれど方法がわからない...そんな悩みを抱えていませんか?

この記事では、Koyebという無料のクラウドプラットフォームを使用して、GitHubリポジトリからDiscord BOTを自動デプロイし、24時間稼働させる方法を詳しく解説します。

今回は例として、私が作ったDiscord Readme BotというBOTのリポジトリを使ってデプロイする手順を紹介します。

https://zenn.dev/saitogo/articles/8259eee6afc437

Koyebとは

Koyebは、GitHubリポジトリから直接アプリケーションをデプロイできるPaaS(Platform as a Service)プラットフォームです。

Koyebの特徴

  • 無料プラン:月512MB RAM、100GB帯域幅まで無料
  • GitHub連携:プッシュするだけで自動デプロイ
  • 24時間稼働:スリープ無しで常時起動 (無料プランはスリープ有り)
  • 簡単設定:環境変数の管理が簡単
  • ログ確認:リアルタイムでアプリケーションログを確認可能

HerokuやRailwayの代替として注目されているサービスで、特にDiscord BOT用途に適しています。

前提条件

この記事を進める前に、以下を準備してください:

  • GitHubアカウント
  • Discord BOTのトークンとアプリケーションID
  • Node.jsで作成されたDiscord BOT
  • Discord BOTが既にGitHubリポジトリにアップロード済み

ステップ1: GitHubリポジトリの準備

1.1 リポジトリの準備

まず、自分のBOTのリポジトリを使用します。
以下の点を確認してください:

  • package.jsonにstartスクリプトが定義されている
  • 環境変数を使用してトークンなどの機密情報を管理している
  • TypeScriptを使用している場合は、ビルド設定が適切である

1.2 package.jsonの確認

Koyebで正常にデプロイするために、package.jsonが適切に設定されているか確認します:

package.json
{
  "name": "discord-readme-bot",
  "scripts": {
    "start": "tsx src/index.ts",
    "build": "tsc",
    "dev": "tsx watch src/index.ts"
  },
  "dependencies": {
    "discord.js": "^14.14.1",
    "tsx": "^4.7.0"
  }
}

1.3 ヘルスチェック用サーバーの実装

KoyebでDiscord BOTを動作させるには、ヘルスチェック用の簡単なHTTPサーバーが必要です。
以下のようなファイルを追加します。

src/server.ts
import { Hono } from "hono";

const app = new Hono();

// ヘルスチェック用のエンドポイント
app.get("/", (c) => {
  return c.json({
    status: "ok",
    message: "Discord Bot is running",
    node_version: process.version,
    timestamp: new Date().toISOString(),
  });
});

export default app;

そして、メインのindex.tsでこのサーバーを起動します。

src/index.ts
import { serve } from "@hono/node-server";
import healthCheckServer from "./server";

// ... Discord BOTのコード ...

// Koyeb用のヘルスチェックサーバーを起動
serve({
  fetch: healthCheckServer.fetch,
  port: 8000,
});

この実装により、Koyebがhttp://localhost:8000/にアクセスしてアプリケーションの稼働状況を確認できます。

1.4 ヘルスチェックエンドポイントへ定期リクエスト実装

Koyebの無料プランは、外部からのリクエストが1時間無いとスリープ状態になります。
なので、定期的にヘルスチェックエンドポイントへリクエストする機能を実装する必要があります。
外部からリクエストするためのURLは、サービス作成後に発行されるURLを環境変数に設定して使います。
以下のようなファイルを追加します。

src/cron.ts
import cron from "node-cron";
import { PORT } from "./config";

const HEALTH_CHECK_URL =
  process.env.HEALTH_CHECK_URL || `http://localhost:${PORT}`;

// 10分ごとにヘルスチェックを実行
export function startHealthCheckCron() {
  cron.schedule("*/10 * * * *", async () => {
    try {
      const now = new Date().toLocaleString('ja-JP');
      console.log(`🔍 [${now}] ヘルスチェック実行中... (${HEALTH_CHECK_URL})`);
      const response = await fetch(HEALTH_CHECK_URL);

      if (response.ok) {
        console.log(`✅ [${now}] ヘルスチェック成功: ${response.status}`);
      } else {
        console.warn(`⚠️ [${now}] ヘルスチェック失敗: ${response.status}`);
      }
    } catch (error) {
      const now = new Date().toLocaleString('ja-JP');
      console.error(`❌ [${now}] ヘルスチェックエラー:`, error);
    }
  });

  console.log("🕐 ヘルスチェックの定期実行を開始しました (10分間隔)");
}

そして、メインのindex.tsでこのcronを起動します。

src/index.ts
import { startHealthCheckCron } from "./cron";

// ... Discord BOTのコード ...

serve({
  fetch: healthCheckServer.fetch,
  port: 8000,
});
startHealthCheckCron();

https://www.koyeb.com/docs/reference/instances#free-instances

ステップ2: Koyebアカウントの作成

2.1 アカウント登録

  1. Koyeb公式サイトにアクセス
  2. 「Sign up」をクリック
  3. GitHubアカウントでサインアップ(推奨)

Koyebサインアップ画面

2.2 GitHub連携の確認

GitHubでサインアップした場合、自動的にGitHubアカウントが連携されます。
手動で連携する場合は:

  1. ダッシュボードの「Settings」→「Git Integration」
  2. 「Connect GitHub」をクリック
  3. 必要な権限を許可

ステップ3: Koyebでのサービス作成

3.1 新しいサービスの作成

  1. Koyebダッシュボードで「Create Service」をクリック
  2. 「Web Service」をクリックし、GitHubを選択
  3. BOTのリポジトリを選択

サービス作成画面
サービス作成画面

3.2 インスタンスの選択

「CPU Eco」のFreeを選択してください。
リージョンはpingの小さい方を選択すると良いです。

インスタンス選択画面

3.3 サービス設定

サービス設定画面

Source

  • デプロイしたいブランチを選択(通常はmainまたはmaster

Builder

自動検出される場合がほとんどですが、手動で設定する場合:

  • Build Command: npm run build(TypeScriptの場合)
  • Run Command: npm start

Health Checks

  • Port: 8000(ヘルスチェック用エンドポイント)

3.4 環境変数の設定

「Environment Variables and files」セクションで必要な環境変数を追加します。

環境変数設定画面

3.5 デプロイ実行

すべての設定が完了したら「Deploy」ボタンをクリックします。

ステップ4: デプロイの確認と監視

4.1 デプロイ状況の確認

デプロイ後、サービス一覧から先程作成したサービスを選択してOverviewを見てください。
Build CompletedDeployment Healthyとなっていれば正常にデプロイが完了しています。

サービス一覧画面
Overview画面

4.2 ログの確認

BOTが正常に起動している場合、以下のようなログが表示されます。
「Instance is healthy. All health checks are passing.」と出ていればヘルスチェックも通っています。

Instance created. Preparing to start...
Starting download for registry01.prod.koyeb.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxx/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Download progress: 100% |++++++++| (8.8 MiB/s)
Download complete for registry01.prod.koyeb.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxx/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
> discord_readme_bot@1.0.0 start
> tsx src/index.ts
Instance is starting... Waiting for health checks to pass.
🤖 BOTを起動中...
🌐 ヘルスチェックサーバーを起動中...
✅ ヘルスチェックサーバーが起動しました
🔗 ヘルスチェックURL: http://localhost:8000
✅ BOTがログインしました
🔄 スラッシュコマンドを登録中...
✅ スラッシュコマンドを登録しました
✅ BOTが正常に起動しました!
============== BOT情報 ==============
ID: XXXXXXXXXXXXXXXXXXXX
ユーザー名: AnyBot#0000
Instance is healthy. All health checks are passing.

4.3 Discord側での動作確認

  1. BOTがオンライン状態になっているか確認
  2. スラッシュコマンドが正常に動作するかテスト
  3. メッセージの既読機能が働いているか確認
トラブルシューティング:BOTがオフラインの場合

BOTがオフラインの場合、以下を確認してください:

  1. 環境変数:DISCORD_TOKENが正しく設定されているか
  2. ログ:エラーメッセージがないか
  3. 権限:BOTに必要な権限が付与されているか
  4. トークン:Discord Developer Portalでトークンが有効か

ステップ5: 監視とメンテナンス

5.1 ログ監視

定期的にログを確認して、BOTが正常に動作していることを確認します。

Instance created. Preparing to start...
Starting download for registry01.prod.koyeb.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxx/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Download progress: 100% |++++++++| (8.8 MiB/s)
Download complete for registry01.prod.koyeb.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxx/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
> discord_readme_bot@1.0.0 start
> tsx src/index.ts
Instance is starting... Waiting for health checks to pass.
🤖 BOTを起動中...
🌐 ヘルスチェックサーバーを起動中...
✅ ヘルスチェックサーバーが起動しました
🔗 ヘルスチェックURL: http://localhost:8000
✅ BOTがログインしました
🔄 スラッシュコマンドを登録中...
✅ スラッシュコマンドを登録しました
✅ BOTが正常に起動しました!
============== BOT情報 ==============
ID: XXXXXXXXXXXXXXXXXXXX
ユーザー名: AnyBot#0000
Instance is healthy. All health checks are passing.

5.2 メトリクス確認

「Metrics」タブで以下を監視:

  • CPU Usage: CPU使用率
  • Memory Usage: メモリ使用量

Metrics画面

5.3 アップデート方法

BOTのコードを更新する場合:

  1. ローカルでコードを修正
  2. GitHubにプッシュ
  3. Koyebが自動的に再デプロイ
  4. ログで正常にデプロイされたか確認

ステップ6: コスト管理と制限

6.1 無料プランの制限

Koyebの無料プランには以下の制限があります:

  • サービス数: Web Service x1
  • CPU: 0.1 CORE
  • メモリ: 512MB
  • ディスク: 2000MB
  • 帯域幅: 100GB/Month
  • ビルド時間: 100Min/Month

6.2 制限に近づいた場合

制限に近づいた場合の対策:

  1. メモリ最適化: 不要なライブラリの削除
  2. 有料プラン: より多くのリソースが必要な場合
  3. 複数アカウント: 制限回避(利用規約要確認)

よくある問題と解決方法

Q1: BOTがオフラインになる

原因と解決方法:

  • トークンの期限切れ → Discord Developer Portalで新しいトークンを生成
  • 環境変数の設定ミス → Koyebの設定を再確認
  • コードのエラー → ログを確認してデバッグ

Q2: スラッシュコマンドが表示されない

原因と解決方法:

  • BOTの権限不足 → applications.commands権限を追加
  • グローバルコマンド登録の遅延 → 最大1時間待機
  • コードの登録処理エラー → ログでエラーを確認

Q3: メモリ不足エラー

原因と解決方法:

  • メモリリークの可能性 → コードを見直し
  • 不要なライブラリ → package.jsonを最適化
  • データの蓄積 → 定期的なクリーンアップ処理を実装

Q4: デプロイが失敗する

原因と解決方法:

  • package.jsonの設定ミス → start scriptを確認
  • 依存関係のエラー → npm installでローカル確認
  • TypeScriptコンパイルエラー → ビルドログを確認

まとめ

この記事では、Discord BOTをKoyebで24時間稼働させる方法を詳しく解説しました。

24時間稼働: BOTが常時オンライン状態
自動デプロイ: GitHubプッシュで自動更新
無料運用: 月額0円での継続運用
簡単管理: Webダッシュボードでの監視

Koyebを使用することで、インフラの心配をすることなく、BOTの開発と改善に集中できるようになります。ぜひ、あなたのDiscord BOTもKoyebで24時間稼働させてみてください!

この記事が役に立った場合は、ぜひいいねやコメントで教えてください。また、実際にデプロイして困ったことがあれば、コメント欄で質問してください。

参考リンク

GitHubで編集を提案

Discussion

KOU050223KOU050223

気軽にDiscordBotの作成ができました!
24時間運用のハードルが思ったより低くて驚きました。
記事の投稿ありがとうございますm(_ _)m

saitogosaitogo

コメントありがとうございます!
24時間運用が今では当たり前に無料でできて嬉しいですよね^^
みなさんのDiscordBot開発に少しでも役に立てれたら嬉しいです!