nonibot

nonibotをセルフホストする

nonibotはオープンソースで開発されており、ユーザーが独自のサーバー上でBotとダッシュボードを運用(セルフホスト)することができます。 このページでは、セルフホストの方法を解説します。

セルフホストしたnonibotは、公式のnonibotとは別のBotとして動作します。公式のBotやダッシュボードとは設定やデータを共有しません。

nonibotは次の3つで構成されています。

構成説明
BotDiscordに接続して機能を提供します。ダッシュボード向けの内部APIサーバーも同時に起動します。
ダッシュボード設定を行うWebアプリケーション (Next.js) です。
データベース設定を保存するPostgreSQLです。

事前準備

Discordアプリケーションを作成する

Discord Developer Portalでアプリケーションを作成します。

Cloudflare Turnstileのキーを取得する

メンバー認証を使用しない場合は、このステップを省略することができます。

Cloudflare Turnstileでサイトキーとシークレットキーを取得します。

アプリ絵文字を追加する

  1. GitHubの最新リリースを開き、Assets から application-emojis_バージョン.zip をダウンロードして展開します。

  1. Discord Developer Portalで作成したアプリケーションの Emojis を開きます。
  2. 展開した画像をすべてアップロードします。

方法1. Railway Templateを使用してホスティングする(推奨)

Railwayのテンプレートを使うと、Bot・ダッシュボード・データベースをまとめて構築できます。

nonibotのRailway Templateを開く

テンプレートをデプロイする

上のリンクを開き、「Deploy Now」をクリックします。

環境変数を入力する

画面の指示に従って環境変数の入力を行った後、「Deploy」をクリックします。

ダッシュボードのURLを設定する

web→SettingsのNetworkingから、ポート8080にダッシュボード用のドメインを設定します。
保有しているドメインを設定する場合は「Custom Domain」、それ以外の場合は「Generate Domain」をクリックします。

設定したドメインのURLとBETTER_AUTH_URLのURLが異なる場合は、web→Variablesから値を更新してください。

Discord Developer PortalでリダイレクトURLを登録する

Discord Developer Portalの OAuth2 → Redirects に、次のURLを追加します。

https://<ダッシュボードのURL>/api/auth/callback/discord
https://<ダッシュボードのURL>/api/invite/callback

方法2. 他のサーバーでホスティングする

VPSなど、任意のサーバーでホスティングすることもできます。

必要なもの

セットアップ

リポジトリをクローンし、依存関係をインストールします。

git clone https://github.com/nonick-mc/nonibot.git
cd nonibot
pnpm install

環境変数

プロジェクトごとに以下の場所へ環境変数ファイルを作成します。
それぞれ .env.sample をコピーして使うと便利です。

プロジェクトファイルの場所
Botapps/bot/.env
ダッシュボードapps/web/.env.local
データベース (マイグレーション用)packages/database/.env
cp apps/bot/.env.sample apps/bot/.env
cp apps/web/.env.sample apps/web/.env.local
cp packages/database/.env.sample packages/database/.env

Bot (apps/bot/.env)

変数名説明
DISCORD_TOKENDiscord Botのトークン
DATABASE_URLPostgreSQLの接続URL
INTERNAL_API_SECRET内部APIの認証に使う任意の文字列。
openssl rand -base64 32 コマンドなどで生成することもできます。
INTERNAL_API_PORT内部APIのポート番号(例: 3001)
INTERNAL_API_HOST内部APIがリッスンするホスト(例: 127.0.0.1)
別のマシンやコンテナからアクセスさせる場合は 0.0.0.0 にします。

ダッシュボード (apps/web/.env.local)

変数名説明
DATABASE_URLPostgreSQLの接続URL
BETTER_AUTH_URLダッシュボードの公開URL(例: https://nonibot.example.com)
BETTER_AUTH_SECRETセッションの暗号化に使うランダムな文字列
openssl rand -base64 32 コマンドなどで生成することもできます。
DISCORD_CLIENT_IDDiscordアプリケーションのクライアントID
DISCORD_CLIENT_SECRETDiscordアプリケーションのクライアントシークレット
DISCORD_INVITE_PERMISSIONBotの招待時に要求する権限の値
INTERNAL_API_URLBotの内部APIのURL(例: http://localhost:3001)
INTERNAL_API_SECRETBotのINTERNAL_API_SECRETと同じ値を設定します
NEXT_PUBLIC_TURNSTILE_SITE_KEYCloudflare Turnstileのサイトキー
TURNSTILE_SECRETKEYCloudflare Turnstileのシークレットキー
ADMIN_DISCORD_USER_IDS管理者ページにアクセスできるDiscordユーザーID(カンマ区切り)

NEXT_PUBLIC_ から始まる変数はビルド時にコードへ埋め込まれます。値を変更した場合は、再度ビルドしてください。

データベース (packages/database/.env)

変数名説明
DATABASE_URLPostgreSQLの接続URL

内部APIは、メッセージの送信やサーバーの情報の取得に使用されます。外部からの悪用を防止するため、内部APIのポートはインターネットに公開しないでください。

データベースを初期化する

テーブルを作成するため、マイグレーションを実行します。

pnpm database migrate

ビルドと起動

ビルドする

ルートで次のコマンドを実行すると、Bot・ダッシュボード・共通パッケージがまとめてビルドされます。

pnpm build

起動する

BotとダッシュボードはそれぞれNode.jsのプロセスとして起動します。

# Bot
pnpm bot start

# Bot (スラッシュコマンドを登録する場合)
pnpm bot start --register

# ダッシュボード
pnpm web start

長期運用する場合は、PM2やsystemd、Dockerなどでプロセスを常駐させ、異常終了時に再起動されるようにしてください。

リバースプロキシを設定する

ダッシュボードをインターネットに公開する場合は、NginxやCaddyなどでHTTPS化し、BETTER_AUTH_URL と同じURLでアクセスできるようにします。 Discord Developer Portalの OAuth2 → Redirects には、次のURLを登録してください。

https://<ダッシュボードのURL>/api/auth/callback/discord
https://<ダッシュボードのURL>/api/invite/callback

ビルド時間を改善する

nonibotはTurborepoを採用しているため、Remote Cacheを有効にすることでビルド時間を短縮できます。 一度ビルドした結果がクラウド上に保存され、同じ内容のビルドは再実行されずキャッシュから復元されます。

CIやデプロイ環境など、対話的なログインができない場合は、環境変数 TURBO_TOKEN と TURBO_TEAM を設定することで有効にできます。

変数名説明
TURBO_TOKENVercelで発行したアクセストークン。
TURBO_TEAMVercelのチームのSlug。

On this page