Palworld 専用サーバー管理ツールを作った
[!warning] このツールは現在 β版 です。まだ GitHub にも上げていません。試してみたいという声があればお気軽にDMください。
作ったきっかけ
Palworld の専用サーバーを自前で運用しているのですが、ちょっとした操作のたびに SSH でサーバーに入るのが面倒
- 再起動するたびにターミナルを開く
- プレイヤーをキックするのにコマンドを手で打つ
- メモリが逼迫してないか定期的に確認する(メモリ逼迫時はzabbixでも警告がきます。)
これをどうにかしたくて、ブラウザから操作できる管理 UI を作りました。
名前は Palworld Server Manager です。
何ができるか
ダッシュボード
サーバーの状態を 1 秒ごとに自動更新します。
- ゲームサーバーの統計(FPS、プレイヤー数、稼働時間、ゲーム内日数、ベースキャンプ数)
- サーバー全体のリソース(CPU・メモリ・ディスク)
- Palworld プロセスだけのリソース(CPU・メモリ、PID)
- サービスの状態(Running / Stopped)と起動・停止・再起動ボタン
「Palworld のプロセスが他のプロセスとどう違うか」をパッと見たくて、システム全体とプロセス個別のゲージを分けました。
プレイヤー一覧
接続中のプレイヤーをテーブルで表示します。Lv、Ping、位置座標、建築物数が出るので、何かあったときにすぐ確認できます。キック・バンもここから実行できます。
設定ファイル編集
PalWorldSettings.ini をブラウザから直接編集できます。
値をクリックするとモーダルが開いて編集できます。保存前に自動でバックアップを作るので、設定を壊してしまっても戻せます。AdminPassword などのパスワード系はマスクして表示します。
INI から読み取れない場合は REST API の現在値を読み取り専用で表示します。
追記: 保存済みの INI と、実際に稼働中の REST API の値を比較して「再起動待ちの変更」を一覧表示する機能を追加しました。INI を編集しただけではサーバーには反映されないため、反映漏れに気づけるようにしています。パスワード類はこの比較からは除外しています。
再起動スケジューラ
3つの方法でスケジュールを組めます。
- 毎日の再起動 — 時刻ボタンをクリックして複数選択できます
- 単発予約 — カレンダーから日時を選んで1回だけ
-
cron 式 —
0 */6 * * *のような上級者向け指定
実際の再起動は「指定時刻からゲーム内アナウンス → 約5分後に自動実行」という流れです。5分前・1分前・30秒前にゲーム内に通知が流れます。
ワールド保存に失敗した場合は再起動しない設計にしています。
スケジュールは JSON で永続化されるので、Manager を再起動しても消えません。
追記: Palworld 本体の更新処理(palworld-update.service)が実行中のときは、再起動・更新系の操作を拒否するようにしました。更新中に別の再起動がぶつかってサーバーを壊すのを防ぐためです。
Discord 通知
Discord の Webhook を2つ設定できます。
メモリ監視通知
60 秒ごとにメモリ使用率を監視します。
- 80% 超 → 🟡 Warning
- 90% 超 → 🔴 Critical(再起動を推奨)
- 回復時 → ✅ 回復通知
同じ状態が続いている間は 30 分おきに再通知します(毎分飛んでくるのは困るので)。ヒステリシスも入れています。80% 付近をウロウロしても通知が連打されません。
起動/停止通知
10 秒ごとに systemctl is-active でポーリングして、状態が変わったときだけ通知します。
- Palworld が起動 → 🟢
- Palworld が停止 → 🔴
コマンドパネル
Palworld の REST API で使えるコマンドを UI から直接実行できます。
/Info、/ShowPlayers、/Broadcast、/KickPlayer、/BanPlayer、/UnBanPlayer、/Save、/Shutdown、/DoExit
ワールド状況(追記)
Palworld の /game-data からプレイヤー・パル・NPC・PalBox・ギルドの状況を集計して表示するタブを追加しました。
- Actor の座標をマップ上に表示(ワールドマップ画像を配置すると地形の上に重ねて表示、未配置でも座標の相対分布として表示)
- 低HP・HP0・非アクティブなパルなどを一覧化
- 取得結果は15秒キャッシュ
サーバー側が /game-data に対応していない場合は「利用できません」と表示し、他の機能には影響しません。
稼働履歴(追記)
FPS、フレーム時間、接続人数、CPU、メモリを30秒間隔で記録し、期間別のグラフで確認できるタブを追加しました。
プレイヤーごとの参加・退出時刻と滞在時間もセッション履歴として残ります。データは30日で自動的に削除されます。
サーバー操作(追記)
再起動やアップデートを「安全に」行うための操作パネルを追加しました。
- 再起動・更新の前に接続中のプレイヤー人数を確認し、既定では誰か接続していると操作を拒否します
- 実行する場合は予告アナウンス+最大300秒のキャンセル可能な待機を挟み、ワールド保存後に処理を開始、REST API の復旧まで確認します
- アナウンス送信、ワールド保存、シャットダウン、強制停止、アンバン、Discord 通知テストもここから実行できます
「うっかり接続中のプレイヤーがいるサーバーを落としてしまう」事故を防ぐための機能です。
リアルタイムログ
WebSocket + journalctl でサーバーログをリアルタイムにブラウザに流します。エラー行は赤、警告は黄色で色分けされます。
追記: Palworld 本体の更新処理(palworld-update)のログも合わせて流れるようにしました。更新中に何が起きているかをこの画面だけで追えます。
環境切り替え
PAL_ENV を staging か production に設定すると、UI のバナーと右上の表示が切り替わります。
本番に間違えた操作をしにくくするためです。
技術スタック
バックエンド
| 項目 | 内容 |
|---|---|
| 言語・フレームワーク | Python 3.13 / FastAPI |
| スケジューラ | APScheduler |
| HTTP クライアント | httpx(Palworld REST API との通信) |
| リソース監視 | psutil |
| デプロイ | systemd ユニット |
フロントエンド
シングル HTML ファイル(Vanilla JS)です。ライブラリなしで DOM を createElement で組み立てています。
CSS は あのクラウドサービス 風のデザイントークンを自前で定義しました。ライト/ダークテーマはトップナビのボタンで切り替えできます(localStorage に保存されます)。
外部 CDN は一切使っていないので、インターネット非接続の環境でも動きます。
追記: 画面幅700px以下ではハンバーガーメニューによるドロワー表示に自動で切り替わるようにし、スマホからも操作しやすくしました。
セットアップの概要
基本的な流れはこうです。
# 1. 仮想環境と依存インストール
cd palworld-manager/backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# 2. 環境変数ファイルを配置
sudo install -o root -g root -m 600 ../palworld-manager.env.example /etc/palworld-manager.env
sudo nano /etc/palworld-manager.env
# 3. systemd に登録
sudo cp ../palworld-manager.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now palworld-manager
http://<サーバーIP>:8080 でアクセスできます。
主な環境変数は以下です。
| 変数 | 説明 |
|---|---|
PAL_ENV |
staging / production
|
PAL_HOST |
Palworld サーバーのホスト |
PAL_PORT |
Palworld REST API のポート(既定 8212) |
PAL_ADMIN_PASSWORD |
AdminPassword |
APP_PORT |
Web UI のポート(既定 8080) |
PAL_SERVICE_NAME |
systemd サービス名(既定 palserver) |
PAL_SETTINGS_INI |
PalWorldSettings.ini のフルパス(追記) |
SCHEDULE_TIMEZONE |
スケジュールの解釈・表示に使うタイムゾーン(追記) |
DISCORD_WEBHOOK_URL |
メモリ監視通知用 Webhook |
DISCORD_LIFECYCLE_WEBHOOK_URL |
起動/停止通知用 Webhook |
Discord 通知は単一ワーカー前提です。uvicorn を複数ワーカーで動かすと通知が重複するので注意してください。
設計で気にしたこと
再起動の二重実行を防ぐ
スケジューラ・手動操作・API の全経路が restart_coordinator() を通るようにして、asyncio.Lock と成功時のデバウンス(10 分)で二重実行を弾いています。
ワールド保存に失敗したら再起動しない
保存に失敗した状態で再起動するとデータが消えます。保存エラーが出たら再起動自体を中止するようにしています。
再起動の途中キャンセル
予告シーケンス中(保存前)はキャンセルできます。ワールド保存が終わって systemctl restart に入った後はキャンセル不可です。UI にはどちらの状態かを表示します。
XSS 対策
フロントエンドはサーバーから返ってきた値を全部 textContent で書いています。innerHTML は使っていません。
スケジュールの永続化とロールバック
JSON への書き込みを先に行い、APScheduler への登録に失敗したら JSON からもロールバックする設計です。どちらかだけ成功した「幽霊レコード」を作らないようにしています。
Webhook URL のログ伏字化(追記)
ログファイルや journal に Discord Webhook URL がそのまま出力されないよう、ログ出力時に自動で伏字にする処理を追加しました。ログを共有するときにうっかり Webhook URL を漏らさないようにするためです。
β版について
現在β版のため GitHub にはまだ上げていません。試してみたいという声があればお気軽にどうぞ。
更新履歴
- 2026-07-25: ワールド状況、稼働履歴、サーバー操作(安全なメンテナンス)、設定差分確認、スマホ表示対応などを追記
Palworld サーバーを運用している方に参考になれば幸いです。












