add admin docs

This commit is contained in:
2026-11-08 02:16:03 +01:00
parent 793797dacb
commit b70127a57b
3 changed files with 635 additions and 0 deletions
+249
View File
@@ -0,0 +1,249 @@
# Docker- und MongoDB-Admin
Diese Variante arbeitet direkt auf den Containern und der MongoDB. Sie ist
nützlich für Offline-Änderungen, Recovery und Prüfungen. Für laufende
Characters ist die Game-Server-API (`docs/admin/api.md`) oder der
Admin-Executor (`docs/admin/executor.md`) meist besser geeignet.
## Stack
| Service | Aufgabe | Port |
|---|---|---|
| `al-mongo` | MongoDB mit Replica-Set `rs0` | intern `27017` |
| `al-backend` | Express-Backend, Web-Client, `/api` | `8090` |
| `al-game` | Socket.IO-Game-Server, `/server.api` | `7192` |
MongoDB ist im Compose-Setup **nicht** auf den Host veröffentlicht. Der Zugriff
läuft über `docker compose exec`.
## MongoDB-Shell
```sh
cd /data/ai/gaming/adventureland
docker compose exec al-mongo mongosh adventureland
```
Einzelnes Kommando:
```sh
docker compose exec al-mongo mongosh adventureland --eval \
'db.user.findOne({ "info.email": "du@example.com" }, { _id: 1, name: 1, cash: 1, "info.slots": 1 })'
```
## Account und Character finden
```sh
docker compose exec al-mongo mongosh adventureland --eval \
'db.user.findOne(
{ "info.email": "du@example.com" },
{ _id: 1, name: 1, cash: 1, "info.gold": 1, "info.slots": 1, "info.characters": 1 }
)'
```
```sh
docker compose exec al-mongo mongosh adventureland --eval \
'db.character.findOne(
{ "info.name": "CharName" },
{ _id: 1, owner: 1, level: 1, xp: 1, online: 1, server: 1, "info.gold": 1, "info.items": 1 }
)'
```
## Shells geben
Shells sind accountweit und liegen in `user.cash`.
```sh
docker compose exec al-mongo mongosh adventureland --eval \
'db.user.updateOne(
{ "info.email": "du@example.com" },
{ $inc: { cash: 1000 } }
)'
```
Danach neu einloggen oder den neuen Stand per `/server.api/cupdate` an online
Characters schicken (siehe `docs/admin/api.md`).
## Bank-Gold geben
Bank-Gold ist accountweit und liegt in `user.info.gold`.
```sh
docker compose exec al-mongo mongosh adventureland --eval \
'db.user.updateOne(
{ "info.email": "du@example.com" },
{ $inc: { "info.gold": 100000 } }
)'
```
Neu einloggen bzw. Bank betreten. Ist der Character bereits in der Bank, wird
`player.user.gold` live nicht automatisch aktualisiert.
## Character-Gold geben
Character-Gold liegt in `character.info.gold`.
> Nur bearbeiten, solange der Character **offline** ist (`online: false`,
> `server: ""`). Sonst überschreibt der Game-Server den Wert beim nächsten Sync.
```sh
docker compose exec al-mongo mongosh adventureland --eval \
'db.character.updateOne(
{ "info.name": "CharName" },
{ $inc: { "info.gold": 100000 } }
)'
```
## Item ins Character-Inventar
Item-Namen stehen in `design/items.js` (`G.items`), zum Beispiel `hpot0`,
`mpot0`, `helmet`, `shoes`. Das Inventar fasst maximal 42 Einträge.
```sh
docker compose exec al-mongo mongosh adventureland --eval \
'db.character.updateOne(
{ "info.name": "CharName" },
{ $push: { "info.items": { name: "hpot0", q: 100 } } }
)'
```
Das ist ein roher Push: kein Stacking, keine Inventarprüfung. Für laufende
Characters `add_item` per Game-Server-API verwenden.
## Item in die Bank
Bank-Packs liegen in `user.info.items0` bis `user.info.items47`.
```sh
docker compose exec al-mongo mongosh adventureland --eval \
'db.user.updateOne(
{ "info.email": "du@example.com" },
{ $push: { "info.items0": { name: "hpot0", q: 100 } } }
)'
```
Pack-Größe beachten (bis 42). Neu einloggen bzw. Bank betreten.
## Charakterplätze setzen
```sh
docker compose exec al-mongo mongosh adventureland --eval \
'db.user.updateOne(
{ "info.email": "du@example.com" },
{ $set: { "info.slots": 18 } }
)'
```
Maximum 18. Der Wert wird bei jeder Anfrage gelesen; kein Neustart nötig.
## Admin setzen
```sh
docker compose exec al-mongo mongosh adventureland --eval \
'db.user.updateOne(
{ "info.email": "du@example.com" },
{ $set: { admin: true } }
)'
```
Danach neu einloggen. Der Admin-Executor ist dann unter
`http://localhost:8090/admin/executor` erreichbar.
## GM setzen
GM ist eine Character-Rolle, kein Web-Admin.
```sh
docker compose exec al-mongo mongosh adventureland --eval \
'db.character.updateOne(
{ "info.name": "CharName" },
{ $set: { role: "gm", "info.p.role": "gm" } }
)'
```
Danach den Character neu einloggen.
## Keys lesen
`ACCESS_MASTER`, `BOT_MASTER` und `SERVER_MASTER` stehen in
`files/config/keys.js` und sind im Container unter
`/app/secretsandconfig/keys.js` gemountet.
```sh
docker compose exec -T al-game node -e \
'console.log(require("/app/secretsandconfig/keys").ACCESS_MASTER)'
```
Den Wert nicht in Chat, Logs oder Commits schreiben. Vor öffentlichem Betrieb
rotieren und `al-backend` sowie `al-game` neu starten.
## Backup und Restore
Backup:
```sh
docker compose exec -T al-mongo mongodump \
--db adventureland --archive=/tmp/al-backup.gz
docker compose cp al-mongo:/tmp/al-backup.gz ./al-backup.gz
```
Restore (destruktiv, überschreibt die aktuelle DB):
```sh
docker compose cp ./al-backup.gz al-mongo:/tmp/al-backup.gz
docker compose exec -T al-mongo mongorestore \
--archive=/tmp/al-backup.gz --drop
```
Vor jedem Restore den aktuellen Stand sichern. `--drop` entfernt vorhandene
Collections.
## Logs und Status
```sh
docker compose ps
docker compose logs -f al-backend
docker compose logs -f al-game
docker compose logs -f al-mongo
```
## Neustart und Rebuild
Nach Änderungen an `files/config/`:
```sh
docker compose restart al-backend al-game
```
Nach Änderungen am Image oder an Build-Patches:
```sh
docker compose build
docker compose up -d
```
Nach Änderungen an `files/custom/game.js` reicht in der Regel ein Neustart der
beiden App-Container.
## Sicherheit
- MongoDB ist nicht auf dem Host veröffentlicht; nicht zusätzlich exposen.
- `ACCESS_MASTER` erlaubt Codeausführung im Game-Server. Nicht öffentlich
erreichbar machen.
- `al-backend` und `al-game` sind im Compose-Setup an alle Host-Interfaces
gebunden. Für öffentlichen Betrieb Firewall/Caddy davorsetzen.
- Default-Keys aus `files/config/keys.js` vor öffentlichem Zugriff ersetzen.
- Offline-Characters vor DB-Änderungen ausloggen; sonst überschreibt der
Game-Server die Werte.
## Quellen
- `docker-compose.yml` – Services, Ports, Volumes
- `Dockerfile` – Build-Patches und Runtime
- `files/config/keys.js` – Admin-Keys
- `files/config/options.js` – Ports, Serverdefinition, Limits
- `source-repos/adventureland_mongodb/adventure_functions.js` –
`character_to_info`, `update_character`, `update_user_data`, `user_to_server`
- `source-repos/adventureland_mongodb/api.js` – `create_character_api`