This commit is contained in:
SowinskiBraeden committed 2026-09-05 13:10:36 -07:00
1 parent 3ecced51c8
commit 3adb45886a
66 files changed
+9227 -3679

No files matched your search

+30 -1
View File
@@ -1,9 +1,27 @@
# Reforger Panel
Reforger Panel is a private web control panel for an Arma Reforger server hosted through Pterodactyl. It provides a focused interface for trusted server staff to monitor the server, manage access, review player activity, inspect configuration, search Workshop mods, and run limited power actions without exposing Pterodactyl credentials to the browser.
Reforger Panel is a private web control panel for an Arma Reforger server hosted through Pterodactyl. It gives trusted server staff a focused interface to watch the server live, manage the mod list, edit `config.json` safely, pick a mission, review player activity, and run power actions without exposing Pterodactyl credentials to the browser.
The panel is intended for one private community server. It is not a replacement for Pterodactyl and does not provide billing, public signup, raw console access, arbitrary file management, or multi-tenant hosting.
## What it does
- **Live console.** The panel proxies Pterodactyl's Wings websocket, so the Console page shows
output from the moment you press Start — container pull, SteamCMD update, mod downloads, then
the game itself. The same feed drives the CPU/memory/network/disk numbers, so they match what
Pterodactyl reports rather than lagging a poll behind.
- **Mod manager.** Backed by the reforgermods.net **v2** API. Add and remove mods, pin a version
from the published version list (or type one in), resolve dependencies, update one mod or all of
them, clear the list, or copy a modlist off any live server in the public server browser. Edits
are staged as a reviewable diff and written to `config.json` once.
- **Configuration.** Typed, range-validated cards for the settings the panel understands, a
searchable view of _every_ key the file actually contains, and a raw JSON editor. Only the fields
you touch are written, writes are serialised and verified by reading the file back, and a write
based on a stale copy is rejected instead of silently reverting someone else's change. Keys that
a Reforger egg re-templates from a startup variable are flagged, with an option to write both.
- **Mission select.** One list of the vanilla scenarios plus one group per installed mod that ships
missions, with a warning when the configured scenario is no longer provided by anything.
## Project Structure
```text
@@ -19,6 +37,7 @@ packages/shared Shared roles, DTOs, and Reforger configuration types
- Docker, for the local Postgres database
- Discord application credentials, only when using real Discord login
- Pterodactyl Client API credentials, only when connecting to a real server
- Outbound access to `api.reforgermods.net` for Workshop metadata (backend only)
## Local Setup
@@ -111,6 +130,11 @@ REFORGER_LOG_FILE_PATTERN=console.log
The panel follows the newest `logs_*` folder during sync. If you need to pin a single file instead, set `REFORGER_ADMIN_LOG_PATH`.
Log ingestion feeds player sessions and the killfeed only. The Console page does not depend on it —
it reads Pterodactyl's websocket directly, which is why it can show the install and mod-download
phases that never reach the game's own log file. That relay needs `PTERODACTYL_WEBSOCKET_ENABLED=true`
(the default) and a client API key with websocket access to the server.
## Common Commands
```bash
@@ -125,6 +149,11 @@ npm run db:seed # Seed initial server data
## Notes
- `config.json` is read live on every request and written in place; the previous contents are always
kept as `config.json.bak`.
- Workshop metadata is cached in the API process with stale-while-revalidate and request pacing, so
the Mods page is fast and the upstream rate limit is never approached. There is no background
polling of reforgermods.net — it is queried on demand only.
- Roles are stored in the panel database.
- New Discord users start as viewers.
- The Discord account matching `OWNER_DISCORD_ID` becomes the owner.