# 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`