nonibotをセルフホストする
nonibotはオープンソースで開発されており、ユーザーが独自のサーバー上でBotとダッシュボードを運用(セルフホスト)することができます。 このページでは、セルフホストの方法を解説します。
セルフホストしたnonibotは、公式のnonibotとは別のBotとして動作します。公式のBotやダッシュボードとは設定やデータを共有しません。
nonibotは次の3つで構成されています。
| 構成 | 説明 |
|---|---|
| Bot | Discordに接続して機能を提供します。ダッシュボード向けの内部APIサーバーも同時に起動します。 |
| ダッシュボード | 設定を行うWebアプリケーション (Next.js) です。 |
| データベース | 設定を保存するPostgreSQLです。 |
事前準備
Discordアプリケーションを作成する
Discord Developer Portalでアプリケーションを作成します。
Cloudflare Turnstileのキーを取得する
メンバー認証を使用しない場合は、このステップを省略することができます。
Cloudflare Turnstileでサイトキーとシークレットキーを取得します。
アプリ絵文字を追加する
- GitHubの最新リリースを開き、
Assetsからapplication-emojis_バージョン.zipをダウンロードして展開します。

- Discord Developer Portalで作成したアプリケーションの
Emojisを開きます。 - 展開した画像をすべてアップロードします。
方法1. Railway Templateを使用してホスティングする(推奨)
Railwayのテンプレートを使うと、Bot・ダッシュボード・データベースをまとめて構築できます。
nonibotのRailway Templateを開く
環境変数を入力する
画面の指示に従って環境変数の入力を行った後、「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/discordhttps://<ダッシュボードのURL>/api/invite/callback方法2. 他のサーバーでホスティングする
VPSなど、任意のサーバーでホスティングすることもできます。
必要なもの
セットアップ
リポジトリをクローンし、依存関係をインストールします。
git clone https://github.com/nonick-mc/nonibot.git
cd nonibot
pnpm install環境変数
プロジェクトごとに以下の場所へ環境変数ファイルを作成します。
それぞれ .env.sample をコピーして使うと便利です。
| プロジェクト | ファイルの場所 |
|---|---|
| Bot | apps/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/.envBot (apps/bot/.env)
| 変数名 | 説明 |
|---|---|
DISCORD_TOKEN | Discord Botのトークン |
DATABASE_URL | PostgreSQLの接続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_URL | PostgreSQLの接続URL |
BETTER_AUTH_URL | ダッシュボードの公開URL(例: https://nonibot.example.com) |
BETTER_AUTH_SECRET | セッションの暗号化に使うランダムな文字列openssl rand -base64 32 コマンドなどで生成することもできます。 |
DISCORD_CLIENT_ID | DiscordアプリケーションのクライアントID |
DISCORD_CLIENT_SECRET | Discordアプリケーションのクライアントシークレット |
DISCORD_INVITE_PERMISSION | Botの招待時に要求する権限の値 |
INTERNAL_API_URL | Botの内部APIのURL(例: http://localhost:3001) |
INTERNAL_API_SECRET | BotのINTERNAL_API_SECRETと同じ値を設定します |
NEXT_PUBLIC_TURNSTILE_SITE_KEY | Cloudflare Turnstileのサイトキー |
TURNSTILE_SECRETKEY | Cloudflare Turnstileのシークレットキー |
ADMIN_DISCORD_USER_IDS | 管理者ページにアクセスできるDiscordユーザーID(カンマ区切り) |
NEXT_PUBLIC_ から始まる変数はビルド時にコードへ埋め込まれます。値を変更した場合は、再度ビルドしてください。
データベース (packages/database/.env)
| 変数名 | 説明 |
|---|---|
DATABASE_URL | PostgreSQLの接続URL |
内部APIは、メッセージの送信やサーバーの情報の取得に使用されます。外部からの悪用を防止するため、内部APIのポートはインターネットに公開しないでください。
データベースを初期化する
テーブルを作成するため、マイグレーションを実行します。
pnpm database migrateビルドと起動
起動する
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/discordhttps://<ダッシュボードのURL>/api/invite/callbackビルド時間を改善する
nonibotはTurborepoを採用しているため、Remote Cacheを有効にすることでビルド時間を短縮できます。 一度ビルドした結果がクラウド上に保存され、同じ内容のビルドは再実行されずキャッシュから復元されます。
Vercelにログインする
npx turbo loginリポジトリをリンクする
npx turbo linkCIやデプロイ環境など、対話的なログインができない場合は、環境変数 TURBO_TOKEN と TURBO_TEAM を設定することで有効にできます。
| 変数名 | 説明 |
|---|---|
TURBO_TOKEN | Vercelで発行したアクセストークン。 |
TURBO_TEAM | VercelのチームのSlug。 |
