bun + typescript + Koyeb でDiscord bot作成
bun + typescript + Koyebで簡単なdiscord botを作成しました
「すみそー!」に反応して「すみそー!」を返します

すみそー!
sumisoなので「すみそー!」と鳴きます。sumisoなので。
構成
node.jsより爆速のall-in-one toolkitであるbunを使用しました
とくに設定せずにそのままtypescriptが利用できます
デプロイ先はKoyeb
無料で構築可能です
しかし無料枠だと1時間アクセスなしでスリープします
前提条件
以下は準備済みとします
- Githubアカウント
- discord botのtoken
discordのアプリを作成してtokenを発行してください
解説は他の記事に譲ります
bunのインストール
Node.jsがあるなら次のコマンドでインストールできます
npm install -g bun
その後npmは2度と使用されることはありませんでした
他のインストール方法はこちら
プロジェクトの作成
任意のフォルダでプロジェクトを初期化します
bun init
discord bot用のライブラリを追加します
bun add discord.js
各種ファイルが生成されます
config.json作成
discord botのtokenを記載してください
{
"token": "your-token-goes-here"
}
tokenが漏れると第三者からbotが操作できてしまうので
コミットに含めないように、.gitignoreに追加します
config.json
index.ts作成
srcフォルダを作成し、index.tsをsrcフォルダ配下に移動させます
discord bot用のコードを記載します
「すみそー!」という投稿に対し、「すみそー!」と応答します
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のヘルスチェック応答用に用意しています
動作確認
ローカルで実行し、discord botが動くか確認します
bun run src/index.ts
discord上で適当なサーバーなどにbotを招待し
- オンラインになるか
- メッセージに応答するか
確認してください
エラーが表示されてdiscord botが起動しない場合は
botの権限設定が足りてない可能性があります
Dockerfile作成
Koyeb用にDockerfileを作成します
FROM oven/bun:1
WORKDIR /app
COPY . .
RUN bun install
ARG PORT
EXPOSE ${PORT:-3000}
CMD ["bun", "src/index.ts"]
Githubにプッシュ
botの動作確認ができたらGithubにプッシュします
GithubのリポジトリからKoyebに連携します
Koyebデプロイ
Koyebのアカウントを作成します
GitHubログインがオススメです
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 EcoのFreeを選択します
リージョンは応答が速そうなワシントンを選択

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を作成しました
Koyebはドキュメントが充実していて、またGitHub連携で簡単にデプロイできました
無料で構築可能ですが、スリープ対策は別途検討する必要があります
urlをbotのプロフィールに貼っておくか?
Discussion