5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Palworld 専用サーバー管理ツールを作った

5
Last updated at Posted at 2026-07-19

Palworld 専用サーバー管理ツールを作った

[!warning] このツールは現在 β版 です。まだ GitHub にも上げていません。試してみたいという声があればお気軽にDMください。

作ったきっかけ

Palworld の専用サーバーを自前で運用しているのですが、ちょっとした操作のたびに SSH でサーバーに入るのが面倒

  • 再起動するたびにターミナルを開く
  • プレイヤーをキックするのにコマンドを手で打つ
  • メモリが逼迫してないか定期的に確認する(メモリ逼迫時はzabbixでも警告がきます。)

これをどうにかしたくて、ブラウザから操作できる管理 UI を作りました。

名前は Palworld Server Manager です。

何ができるか

ダッシュボード

image.png

サーバーの状態を 1 秒ごとに自動更新します。

  • ゲームサーバーの統計(FPS、プレイヤー数、稼働時間、ゲーム内日数、ベースキャンプ数)
  • サーバー全体のリソース(CPU・メモリ・ディスク)
  • Palworld プロセスだけのリソース(CPU・メモリ、PID)
  • サービスの状態(Running / Stopped)と起動・停止・再起動ボタン

「Palworld のプロセスが他のプロセスとどう違うか」をパッと見たくて、システム全体とプロセス個別のゲージを分けました。

プレイヤー一覧

image.png

接続中のプレイヤーをテーブルで表示します。Lv、Ping、位置座標、建築物数が出るので、何かあったときにすぐ確認できます。キック・バンもここから実行できます。

設定ファイル編集

image.png

PalWorldSettings.ini をブラウザから直接編集できます。

値をクリックするとモーダルが開いて編集できます。保存前に自動でバックアップを作るので、設定を壊してしまっても戻せます。AdminPassword などのパスワード系はマスクして表示します。

INI から読み取れない場合は REST API の現在値を読み取り専用で表示します。

追記: 保存済みの INI と、実際に稼働中の REST API の値を比較して「再起動待ちの変更」を一覧表示する機能を追加しました。INI を編集しただけではサーバーには反映されないため、反映漏れに気づけるようにしています。パスワード類はこの比較からは除外しています。

再起動スケジューラ

image.png

3つの方法でスケジュールを組めます。

  1. 毎日の再起動 — 時刻ボタンをクリックして複数選択できます
  2. 単発予約 — カレンダーから日時を選んで1回だけ
  3. cron 式0 */6 * * * のような上級者向け指定

実際の再起動は「指定時刻からゲーム内アナウンス → 約5分後に自動実行」という流れです。5分前・1分前・30秒前にゲーム内に通知が流れます。

ワールド保存に失敗した場合は再起動しない設計にしています。

スケジュールは JSON で永続化されるので、Manager を再起動しても消えません。

追記: Palworld 本体の更新処理(palworld-update.service)が実行中のときは、再起動・更新系の操作を拒否するようにしました。更新中に別の再起動がぶつかってサーバーを壊すのを防ぐためです。

Discord 通知

Discord の Webhook を2つ設定できます。

メモリ監視通知

60 秒ごとにメモリ使用率を監視します。

image.png

  • 80% 超 → 🟡 Warning
  • 90% 超 → 🔴 Critical(再起動を推奨)
  • 回復時 → ✅ 回復通知

同じ状態が続いている間は 30 分おきに再通知します(毎分飛んでくるのは困るので)。ヒステリシスも入れています。80% 付近をウロウロしても通知が連打されません。

起動/停止通知

10 秒ごとに systemctl is-active でポーリングして、状態が変わったときだけ通知します。

image.png

  • Palworld が起動 → 🟢
  • Palworld が停止 → 🔴

コマンドパネル

image.png

Palworld の REST API で使えるコマンドを UI から直接実行できます。

/Info/ShowPlayers/Broadcast/KickPlayer/BanPlayer/UnBanPlayer/Save/Shutdown/DoExit

ワールド状況(追記)

Palworld の /game-data からプレイヤー・パル・NPC・PalBox・ギルドの状況を集計して表示するタブを追加しました。

image.png

  • Actor の座標をマップ上に表示(ワールドマップ画像を配置すると地形の上に重ねて表示、未配置でも座標の相対分布として表示)
  • 低HP・HP0・非アクティブなパルなどを一覧化
  • 取得結果は15秒キャッシュ

サーバー側が /game-data に対応していない場合は「利用できません」と表示し、他の機能には影響しません。

稼働履歴(追記)

FPS、フレーム時間、接続人数、CPU、メモリを30秒間隔で記録し、期間別のグラフで確認できるタブを追加しました。

image.png

プレイヤーごとの参加・退出時刻と滞在時間もセッション履歴として残ります。データは30日で自動的に削除されます。

サーバー操作(追記)

再起動やアップデートを「安全に」行うための操作パネルを追加しました。

image.png

  • 再起動・更新の前に接続中のプレイヤー人数を確認し、既定では誰か接続していると操作を拒否します
  • 実行する場合は予告アナウンス+最大300秒のキャンセル可能な待機を挟み、ワールド保存後に処理を開始、REST API の復旧まで確認します
  • アナウンス送信、ワールド保存、シャットダウン、強制停止、アンバン、Discord 通知テストもここから実行できます

「うっかり接続中のプレイヤーがいるサーバーを落としてしまう」事故を防ぐための機能です。

リアルタイムログ

image.png

WebSocket + journalctl でサーバーログをリアルタイムにブラウザに流します。エラー行は赤、警告は黄色で色分けされます。

追記: Palworld 本体の更新処理(palworld-update)のログも合わせて流れるようにしました。更新中に何が起きているかをこの画面だけで追えます。

環境切り替え

PAL_ENVstagingproduction に設定すると、UI のバナーと右上の表示が切り替わります。

  • 検証環境 → オレンジのバナー
    image.png

  • 本番環境 → 赤のバナー
    image.png

本番に間違えた操作をしにくくするためです。

技術スタック

バックエンド

項目 内容
言語・フレームワーク 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 サーバーを運用している方に参考になれば幸いです。

5
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?