add admin docs
This commit is contained in:
@@ -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`
|
||||
Reference in New Issue
Block a user