作品一覧へ戻る

02 / PROJECT DETAIL

Sub-PC Homelab

Discord Bot、Palworld管理API、セーブエディタを直接つなげず、小さく検証可能な境界を間に置いたサニタイズ済みホームラボ参照実装です。

技術スタック

  • Node.js 22
  • Python 3.12
  • Discord
  • Palworld REST API
  • Tailscale Serve
  • Docker Compose

01

解きたかったこと

ゲームサーバーの運用をDiscordから扱いやすくしつつ、Botが侵害されてもホスト上の任意コマンド実行へつながらない構成を目指しました。実環境のバックアップではなく、再利用できる安全境界とテスト可能なモジュールだけを公開しています。

02

構成

  • Discord BotはUUID付きJSON要求をowner-onlyのディレクトリへatomic write
  • Pythonホストワーカーが要求を検査し、許可されたPalworld管理操作だけをloopbackのREST APIへ実行
  • 管理ブラウザはTailscale Serveを経由し、localhost限定のNode認証プロキシからセーブエディタへ接続
  • Compose例はlocalhost bind、read-only、capability削除を基本にする

03

設計と工夫

  • Botからshell文字列を受け取らず、操作名とpayload schemaをBot側・ワーカー側の両方で完全一致検査
  • 要求ファイルの所有者、permission、symlink、最大サイズ、UUID、作成時刻、有効期限を実行前に確認
  • Tailscale本人ヘッダーはlocalhost内のプロキシだけが信頼し、書き込み時はOriginも照合
  • 上流へTailscale系・X-Forwarded系ヘッダーを渡さず、Palworld APIではredirectと可変接続先を禁止

04

検証

  • Node.jsワークスペースの単体テストとPython unittestを一つのnpm testから実行
  • 公開例からIPアドレス、Tailnet名、ユーザーID、認証情報、セーブデータ、運用履歴を除外
  • 要求と応答のschema・サイズを固定し、異常なファイルや期限切れ要求を拒否する境界をテスト可能に分離

05

制約と次の一手

  • Tailnet参加端末、Discordアカウント、Tailscaleアカウント自体の侵害は対象外
  • ゲームサーバー本体、Bot全体、Tailnet参加やSSH登録の自動化は含まない
  • OS更新、MFA、端末暗号化、分離バックアップは、この参照実装とは別の運用層で継続する必要がある
作品一覧へ戻る