Discordから、同じマシン上のPaper系、Fabric、Velocityサーバーを管理するDiscordBOTです。
Important
このプロジェクトでは、AIを使用してコードおよびドキュメントの一部を生成しています。 利用・公開・変更を行う際は、内容を確認し、十分なテストとセキュリティレビューを実施してください。
- 最大25台のMinecraftサーバーを
config.ymlへ明示登録 - Start、Stop、Restart、明示確認付き強制終了
- 起動完了ログによる状態判定
- ポート競合、クラッシュ、残存プロセスの検知
- サーバー単位の自動再起動
- Minecraftコンソールへの単一コマンド送信
- mclo.gsへの手動ログ共有
worldまたはserver-allの手動ZIPバックアップとRollback- OSHIによるプロセスCPU・メモリ表示
- SQLiteによる操作履歴とパネル復元
- Windows/Linux対応
DiscordからOSコマンド、PowerShell、コマンドプロンプト、Bash、任意のシェルを実行する機能はありません。
- Java 21以降
- BOTとMinecraftサーバーを実行するWindowsまたはLinuxマシン
- Discord BOTトークン
- 管理用Discordサーバー、ロール、テキストチャンネル2つ
Windows:
.\gradlew.bat test shadowJarLinux:
./gradlew test shadowJar実行可能JARはbuild/libs/sabakan.jarへ生成されます。詳細な設定テンプレートはリポジトリのconfig.example.ymlを参照してください。
java --enable-native-access=ALL-UNNAMED -jar sabakan.jar
--enable-native-access=ALL-UNNAMEDは、SQLite JDBCとOSHI/JNAが必要とするネイティブ機能をJava 24以降でも明示的に許可するための指定です。Java 21でも使用できます。
初回は必須項目に絞ったconfig.ymlとServer/ディレクトリを生成し、Discordへ接続せず終了します。生成されたファイルへBOTトークン、Discord ID、サーバー情報を設定してください。利用可能な全設定と説明は、別ファイルのconfig.example.ymlを参照してください。
port: autoではPaper/Fabricのserver.propertiesまたはVelocityのvelocity.tomlからポートを取得します。設定ファイルがまだない初回起動では既定ポート25565を使用します。数値を指定した場合は、起動直前にPaper/Fabricのserver-portまたはVelocityのbindへ同じポートを安全に反映します。MinecraftのEULAは内容を確認し、生成されたeula.txtで管理者が明示的に同意してください。
config.ymlにはBOTトークンを含むため、Gitへコミットしないでください。初回生成用のconfig.initial.ymlはJAR内部だけに収録し、リポジトリ直下には公開用のconfig.example.ymlを含めます。
Sabakan/
├── sabakan.jar
├── config.yml
├── data/
│ ├── server-manager.db
│ ├── backups/
│ ├── logs/
│ └── processes/
└── Server/
├── survival/
├── modded/
└── proxy/
| コマンド | 動作 |
|---|---|
servers / list |
登録サーバーの一覧を表示 |
status [server-id] |
全サーバー、または指定サーバーの現在状態を表示 |
start <server-id> |
指定サーバーを起動 |
stop <server-id> |
指定サーバーを正常停止 |
restart <server-id> |
指定サーバーを再起動 |
console <server-id> <command> |
Minecraftコンソールへコマンドを送信 |
reload |
新設定を完全検証後、問題がなければ反映 |
shutdown / exit |
管理中サーバーを登録順に正常停止してBOTを終了 |
help |
使用可能なコマンドを表示 |
Ctrl+Cも可能な範囲で捕捉します。ただし、電源断、OS/JVMの強制終了ではMinecraftサーバーの安全な停止を保証できません。
管理パネル用チャンネルで、設定済みの管理ロールを持つユーザーが/reloadを実行すると、config.ymlを完全検証してから再読み込みします。検証に失敗した場合は現在の設定を維持し、エラーを実行者だけに表示します。
管理パネルで対象サーバーを選択してから、操作ボタンを押します。選択状態はユーザーごとに保持され、selection-timeout-minutesを過ぎると期限切れになります。起動・停止・再起動・強制終了の確認メモはSQLiteの操作履歴へ保存されます。
管理パネルで対象サーバーを選択してBackupボタンを押し、モーダルへ次のいずれかを入力します。
| 入力値 | 対象 | 実行条件 |
|---|---|---|
world |
server.propertiesのlevel-nameと、Paper系の_nether・_the_endワールド |
Paper/Fabricは稼働中または停止中。Velocityは非対応 |
server-all |
サーバーディレクトリ内の通常ファイルすべて | ファイル整合性のため停止中のみ |
稼働中のworldバックアップでは、BOTがsave-offとsave-all flushを送信し、保存完了ログを確認してからZIPを作成します。終了時は成否にかかわらずsave-onを送信します。
作成先はdata/backups/<server-id>/日時-world.zipまたは日時-server-all.zipです。バックアップは自動削除されないため、空き容量を定期的に確認してください。シンボリックリンクは対象外です。
管理パネルで対象サーバーを選択し、サーバープロセスを完全に停止してからRollbackボタンを押します。モーダルには最新のバックアップZIP名が初期入力されます。復元元を確認し、確認欄へrollbackと入力して送信してください。
worldバックアップは、現在のワールド3種をバックアップ時点の内容へ置き換えます。プラグイン設定など、ワールド外のファイルは変更しません。server-allバックアップは、サーバーディレクトリ全体をバックアップ時点の内容へ置き換えます。- 復元直前に、現在の対象ファイルが存在する場合は同じ範囲で自動バックアップします。復元後に問題が見つかった場合の退避データとして利用できます。
STOPPED、またはプロセスが残っていないCRASHED状態だけで実行できます。起動中・停止処理中・外部プロセス検知中は実行しません。- Discordから指定できる復元対象は
data/backups/<server-id>/内にSabakan形式の名前で保存されたZIPだけです。任意パスは指定できません。サーバー機上でZIPを差し替えられる権限を持つ利用者は信頼されている前提です。 - ZIPはパストラバーサル、重複パス、展開サイズ、ワールド範囲を検証し、隔離領域へ展開してから置き換えます。
Rollback中はBOTやPCを強制終了しないでください。通常の失敗では元のディレクトリを自動復旧しますが、電源断やストレージ障害が発生した場合は、自動作成された復元前バックアップや.sabakan-rollback-recovery-*退避ディレクトリを使った手動復旧が必要になることがあります。
- BOTは専用の低権限OSユーザーで実行してください。
config.yml、data/、各MinecraftサーバーディレクトリをBOT実行ユーザーだけが読み書きできるようにしてください。- Discordでは設定したGuild IDと管理ロールIDの両方が一致した場合だけ操作できます。
- BOT異常終了後に残ったプロセスは自動で再管理せず、
EXTERNAL_PROCESS_DETECTEDとして隔離します。 - mclo.gs共有前に秘密情報をマスクしますが、完全な除去は保証できません。共有前提のログだけを対象にしてください。
server-allバックアップには設定ファイルや認証情報が含まれる可能性があります。data/backups/を公開せず、安全な権限で保管してください。- Rollbackはファイルを置き換える破壊的操作です。復元元の日時と種類を確認し、実行中はBOTを終了しないでください。
本体はApache License 2.0です。依存ライブラリについてはTHIRD-PARTY-NOTICES.mdを参照してください。