🥟

bun + typescript + Koyeb でDiscord bot作成

に公開

bun + typescript + Koyebで簡単なdiscord botを作成しました

「すみそー!」に反応して「すみそー!」を返します


すみそー!

sumisoなので「すみそー!」と鳴きます。sumisoなので。

https://github.com/sumisoc0db8c/e8dbcd-discord-bot/tree/zenn公開

構成

node.jsより爆速のall-in-one toolkitであるbunを使用しました
とくに設定せずにそのままtypescriptが利用できます
https://bun.sh/

デプロイ先はKoyeb
無料で構築可能です
しかし無料枠だと1時間アクセスなしでスリープします  
https://www.koyeb.com/

前提条件

以下は準備済みとします

  • Githubアカウント
  • discord botのtoken

discordのアプリを作成してtokenを発行してください
解説は他の記事に譲ります
https://discord.com/developers/applications

bunのインストール

Node.jsがあるなら次のコマンドでインストールできます

npm install -g bun

その後npmは2度と使用されることはありませんでした
他のインストール方法はこちら
https://bun.sh/docs/installation

プロジェクトの作成

任意のフォルダでプロジェクトを初期化します

bun init

discord bot用のライブラリを追加します

bun add discord.js

各種ファイルが生成されます

config.json作成

discord botのtokenを記載してください

config.json
{
	"token": "your-token-goes-here"
}

tokenが漏れると第三者からbotが操作できてしまうので
コミットに含めないように、.gitignoreに追加します

.gitignore
config.json

index.ts作成

srcフォルダを作成し、index.tsをsrcフォルダ配下に移動させます
discord bot用のコードを記載します

「すみそー!」という投稿に対し、「すみそー!」と応答します

index.ts
import { GatewayIntentBits, Client, Message, Events } from "discord.js";

const { token } = require("../config.json");

// 権限を指定してクライアントを作成
const client = new Client({
    intents: [
        // メッセージの読み取り
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.MessageContent,
    ],
});

// 起動確認
client.once(Events.ClientReady, () => {
    console.log("Ready!");
    if (client.user) {
        console.log(client.user.tag);
    }
});

// メッセージ応答
client.on(Events.MessageCreate, async (message: Message) => {
    // botのメッセージには反応しない
    if (message.author.bot) return;

    if (message.content === "すみそー!") {
        message.reply("すみそー!");
    }
});

// discord接続
client.login(token);

// koyeb用のWebサーバー
const port = process.env.PORT || 3000
console.log(`Launching Bun HTTP server on port: ${port}, url: http://0.0.0.0:${port} 🚀`)
Bun.serve({
  port: port,
  fetch(_request) {
    return new Response('Hello from Koyeb')
  },
})

discord botにはWebサーバー機能は不要ですが
Koyebのヘルスチェック応答用に用意しています

https://www.koyeb.com/docs/deploy/bun

動作確認

ローカルで実行し、discord botが動くか確認します

実行
bun run src/index.ts

discord上で適当なサーバーなどにbotを招待し

  • オンラインになるか
  • メッセージに応答するか

確認してください

エラーが表示されてdiscord botが起動しない場合は
botの権限設定が足りてない可能性があります

https://discord.com/developers/applications

Dockerfile作成

Koyeb用にDockerfileを作成します

FROM oven/bun:1
WORKDIR /app
COPY . .
RUN bun install
 
ARG PORT
EXPOSE ${PORT:-3000}
 
CMD ["bun", "src/index.ts"]

https://www.koyeb.com/docs/deploy/bun

Githubにプッシュ

botの動作確認ができたらGithubにプッシュします
GithubのリポジトリからKoyebに連携します

https://github.com/sumisoc0db8c/e8dbcd-discord-bot/tree/zenn公開

Koyebデプロイ

Koyebのアカウントを作成します
GitHubログインがオススメです
https://www.koyeb.com/

organization's nameは適当に設定してください


organization's name

画面に従ってアンケートに答えます
スキップもできそうです

Webサービスを作成します
GitHubを選択します


Let's deploy a new service

GitHubのアカウントに接続します
Install Github appをクリック


Connect to GitHub

デプロイするリポジトリを選択します
Only select repositoriesでdiscord botを選択します
Install & Authorizeをクリック

Install & Authorize Koyeb

リポジトリが表示されます
デプロイするリポジトリをクリック

Import project

インスタンスとリージョンを選択します
CPU EcoFreeを選択します
リージョンは応答が速そうなワシントンを選択

Choose instance and regions

ビルドの設定をします
Dockerfileを選択

Configure builder

config.jsonを追加します
config.jsonはリポジトリに追加していないので、ここで追加します
Filesを選択して、config.jsonの内容を貼り付けます
PathをDockerfileで指定したアプリの展開先に合わせます
/app/config.json

ポートを設定します
ヘルスチェック用のWebサーバーを3000に立てているので合わせます

Configure ports

すべて設定したらdeployします

少し待つとデプロイが完了します
以上でdiscord botの構築完了です

動作確認

discordでbotがオンラインになっていることを確認します

Koyebのoverviewよりbotの状態を確認できます
ヘルスチェックのエンドポイントにpublic urlが割り当てされます


overview

Freeの場合、public urlに1時間アクセスがないとスリープ状態になります
アクセスがあると数秒で起動します

まとめ

bun + typescript + Koyebで簡単なdiscord botを作成しました

https://github.com/sumisoc0db8c/e8dbcd-discord-bot/tree/zenn公開

Koyebはドキュメントが充実していて、またGitHub連携で簡単にデプロイできました

無料で構築可能ですが、スリープ対策は別途検討する必要があります
urlをbotのプロフィールに貼っておくか?

Discussion