目的:
ARK_Ascended_Docker ベースの ARK サーバー群(asa0, asa1 など)を制御・可視化する専用 Web UI「asaui」を開発する。asaui は Docker コンテナとして提供され、UI 自体はリポジトリルートの compose.yml(asaui)で起動し、ARK サーバーは cluster/compose.yml を別 compose として運用する。
asaui は以下を提供する:
- Docker API(
/var/run/docker.sock)経由で、ARK_SERVERSに一致するコンテナの状態表示・start/stop/restart ASAUI_CLUSTER_DIR配下の compose/env を利用した、docker compose up/downによる cluster の一括起動/停止- cluster の env 上書き(
.cluster) - 高度なMOD管理:
ALL_MODS変数を活用した、UI 上での有効/無効および並び替え機能
対象リポジトリ:
- 本プロジェクト:
https://github.com/MusclePr/asaui - ARK_Ascended_Docker プロジェクト:
https://github.com/MusclePr/ARK_Ascended_Docker
※ ARK_Ascended_Docker は本リポジトリに参照用サブモジュールとして配置できるが、親の compose.yml と asaui の実行はサブモジュールに依存しない(参照専用)。
参考ファイル:
- 環境変数
.envファイル:
ASAUI_PASSWORD=your_secure_password
ASAUI_SIMPLE_PASSWORD=your_simple_password
NEXT_PUBLIC_BASE_PATH=/asaui
NEXTAUTH_SECRET=YourOriginalPrivateSecretSign
# https://docs.curseforge.com/rest-api/#authentication
CURSEFORGE_API_KEY=- compose 構成:
compose.ymlファイル(本リポジトリの現行例):
services:
asaui:
container_name: asaui
image: ghcr.io/musclepr/asaui:latest
build:
context: .
args:
NEXT_PUBLIC_BASE_PATH: ${NEXT_PUBLIC_BASE_PATH:-/asaui}
restart: unless-stopped
env_file: .env
environment:
- "TZ=Asia/Tokyo"
- "PUID=1000"
- "PGID=1000"
- "DOCKER_GID=999"
- "NEXTAUTH_URL=http://localhost:8080${NEXT_PUBLIC_BASE_PATH:-/asaui}"
volumes:
- ./cluster:/cluster
- /var/run/docker.sock:/var/run/docker.sock
ports:
- "8080:3000"ARK サーバー群は cluster/compose.yml で運用し、asaui から一括 up/down を実行する。
既存の ARK サーバー群(asa0, asa1 など)は、cluster 側の compose(cluster/compose.yml)が定義されています。
-
asa0
- image:
ghcr.io/musclepr/ark_ascended_docker:latest - container_name:
asa0 - volumes:
${HOST_CLUSTER_DIR:-.}/cluster/server:/cluster/server,./cluster/backups:/var/backups - ports:
7790:7790/udp,27030:27030/udp
- image:
-
asa1
- image:
ghcr.io/musclepr/ark_ascended_docker:latest... 共通 - container_name:
asa1 - volumes:
${HOST_CLUSTER_DIR:-.}/cluster/server:/cluster/server - ports:
7791:7791/udp,27031:27031/udp
- image:
-
asa_config
- image:
busybox - container_name:
asa_config - init:
true - command:
httpd -vfh /web - volumes:
${HOST_CLUSTER_DIR:-.}/web:/web:ro
- image:
-
注意点:
${HOST_CLUSTER_DIR:-.}について- docker in docker の場合は、docker ホストのパスを与える必要があるため、HOST_CLUSTER_DIR を定義しています。
- ホストから直接実行する時は、HOST_CLUSTER_DIR は未定義となり、カレントディレクトリパスからの相対参照になります。
cluster の親フォルダに、compose.yml を定義します。
- サービス名:
asaui - イメージ:
ghcr.io/musclepr/asaui:latest - コンテナ名:
asaui(推奨) - ボリューム:
./cluster:/cluster(cluster の env 編集・compose up/down のため)/var/run/docker.sock:/var/run/docker.sockホストの docker コマンドと同等に扱えるようにするため。
- 環境変数
.envを使用します。ASAUI_PASSWORD=your_secure_password ASAUI_SIMPLE_PASSWORD=your_simple_password NEXT_PUBLIC_BASE_PATH=/asaui NEXTAUTH_SECRET=YourOriginalPrivateSecretSign # https://docs.curseforge.com/rest-api/#authentication CURSEFORGE_API_KEY=
- ポート:
- 開発時はホストに公開(例:
8080:3000など)
- 開発時はホストに公開(例:
- モダンな Web UI:
- SPA または SSR/CSR ハイブリッド構成を想定(例: Next.js, React, Vue など)
- レスポンシブデザイン(PC 前提だが、モバイルでも最低限崩れないこと)
- UI 設計方針: 頻繁に使用する「ログ表示」ボタンを大きく配置し、誤操作を防ぎたい「起動・停止・再起動」ボタンはアイコンのみのコンパクトな配置とする。
- フレームワーク:
- 特に指定なし。Node.js/Next.js を想定した設計とするが、要件を満たせば他でも可。
- 認証・保護:
- asaui 自身にアプリ内ログイン(パスワード)を持ち、未ログイン時は
/loginに誘導する。- 管理者とオーナーでパスワードが異なり、扱える UI パーツも異なります。
- 管理者はすべて操作可能。オーナーは限定的。
- asaui 自身にアプリ内ログイン(パスワード)を持ち、未ログイン時は
機能:
- ホワイトリスト一覧表示
- プレイヤーごとに以下を表示:
- EOS ID(一意な識別子)
- 任意名(ニックネーム)
- プレイヤーごとに以下を表示:
- 最終ログイン日時(後述のセーブディレクトリ解析に基づく)
- プレイヤー追加
- 入力項目:
- EOS ID(必須)
- 任意名(任意だが入力推奨)
- バリデーション:
- EOS ID の形式チェック(文字数・文字種など、仕様が分かる範囲で実装)
- 重複 EOS ID の登録禁止
- 入力項目:
- プレイヤー削除
- 対象プレイヤーを選択し、削除確認ダイアログを表示してから実行。
- データ永続化
- 表示名などのメタ情報は
/cluster/players.jsonに保存する。 - ホワイトリスト/バイパスリストは ARK サーバー側のリストファイル(
ShooterGame/Binaries/Win64/*.txt)に反映する。
目的:
EOS ID から成るプレイヤーのセーブデータがどのセーブディレクトリに存在するかを解析し、そのディレクトリに対応するマップ名を Web UI 上に表示する。
前提:
asa0,asa1などのゲームサーバーコンテナは、./cluster/server:/cluster/serverをマウントしている。- asaui も同じボリュームを読み取り専用でマウントし、セーブデータを参照できるようにする。
要件:
- ディレクトリスキャン:
ARK_SAVE_BASE_DIR(デフォルト:/cluster/server/ShooterGame/Saved/SavedArks)配下のマップディレクトリを走査し、${EOS_ID}.arkprofileから最終ログインを推定する。- マップ名とディレクトリパスの対応は、設定ファイル等でマッピング可能にしておく(例:
TheIsland_WP,Extinction_WPなど)。
- UI 表示:
- 現状は「最終ログイン日時」を中心に表示し、マップ一覧の表示は将来拡張とする。
- 更新タイミング:
- 手動更新ボタン(「再スキャン」)を用意。
- 可能であれば一定間隔でバックグラウンド更新(ポーリング)も検討。
対象コンテナ:
asa0asa1- 将来的に
asa2などが追加される可能性はあるが、compose.yml に静的に定義されたもののみを扱う。
要件:
-
ステータス情報:
- 起動状態(running / stopped / restarting / pausing / paused など)
- コンテナ名
- イメージ名
- 稼働時間(取得可能であれば)
-
運用ポリシー(詳細状態):
PAUSING: 休眠状態へ遷移中。操作は安全側で禁止。PAUSED: 休眠状態。監視上は稼働扱いだが、RCON系操作は不可。
-
取得方法:
/var/run/docker.sockを通じて Docker API(dockerode)で取得する。
要件:
- 操作対象:
asa0,asa1など、compose.yml に静的定義されたコンテナ。
- 提供操作:
startstoprestart
- 制約:
- コンテナの増減は動的には扱わない(compose.yml を手動で編集・再起動する運用のため)。
- UI 上でも「コンテナ追加/削除」機能は提供しない。
実装方針:
- Docker API(dockerode)で
start/stop/restartを実行する。
要件:
- 各コンテナのログを Web UI 上でリアルタイムに閲覧可能にする。
- 取得方法:
/var/run/docker.sockを通じて Docker API のlogsストリームを取得。- バックエンドからフロントエンドへは Server-Sent Events (SSE) を使用して配信。
- UI 表示:
- モーダルまたは専用エリアで表示。
- ANSI カラーコードのパースに対応し、ターミナルに近い見栄えを提供する。
- 自動スクロールおよび手動クリア機能の提供。
要件:
- UI から start/stop/restart を実行可能にする。
- 対象コンテナ内で
manager rcon <command>を Docker Exec 相当で実行する。 - 実行対象は
ARK_MAP_MAIN(未指定時はARK_SERVERSの先頭)とする。(古い情報のため削除) - 任意コマンド送信フォームと結果表示を提供する。
-
.htaccessによる保護前提(古い情報のため削除) -
必要に応じてアプリ内認証を追加可能
-
本番は Web サーバーのサブパスに配置される想定
-
開発時はルート
/で問題なしだが、/asaui/ となる見込み。
-
言語: JavaScript / TypeScript
-
ランタイム: Node.js LTS
-
推奨フレームワーク: Next.js
-
Docker イメージとしてビルド
-
ghcr.io/musclepr/asaui:latestとして配布 -
マルチステージビルド推奨
-
UI はユーザー向けに分かりやすく
-
バックエンドはログを記録
-
Docker コマンド失敗時はエラー表示
-
パフォーマンス: スムーズな操作性
-
拡張性: compose.yml に追加されたコンテナに対応可能
-
保守性: モジュール化、設定ファイル化
asaui/
├─ cluster/ # ARK サーバー群の compose / env(asaui から一括 up/down・設定編集)
│ ├─ server/ # ARK サーバーデータ永続化(compose.yml で /cluster/server にマウント)
│ └─ backups/ # バックアップ格納(asa0 のみ)
├─ external/
│ └─ ARK_Ascended_Docker/ # 参照用サブモジュール(任意・実行しない)
├─ src/
│ ├─ app/ # Next.js App Router (pages + API routes)
│ ├─ components/
│ └─ lib/
├─ Dockerfile
├─ package.json
├─ README.md
└─ DEVELOP.md
-
プレイヤー詳細情報
-
バックアップ管理 UI
-
サーバー設定編集 UI
-
通知機能
以上を、本プロジェクトにおける asaui 開発の要求仕様とする。