Files
adventureland/docs/admin/docker.md
T
2026-11-08 02:16:03 +01:00

250 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`