6.5 KiB
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
cd /data/ai/gaming/adventureland
docker compose exec al-mongo mongosh adventureland
Einzelnes Kommando:
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
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 }
)'
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.
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.
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.
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.
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.
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
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
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.
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.
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:
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):
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
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/:
docker compose restart al-backend al-game
Nach Änderungen am Image oder an Build-Patches:
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_MASTERerlaubt Codeausführung im Game-Server. Nicht öffentlich erreichbar machen.al-backendundal-gamesind im Compose-Setup an alle Host-Interfaces gebunden. Für öffentlichen Betrieb Firewall/Caddy davorsetzen.- Default-Keys aus
files/config/keys.jsvor öffentlichem Zugriff ersetzen. - Offline-Characters vor DB-Änderungen ausloggen; sonst überschreibt der Game-Server die Werte.
Quellen
docker-compose.yml– Services, Ports, VolumesDockerfile– Build-Patches und Runtimefiles/config/keys.js– Admin-Keysfiles/config/options.js– Ports, Serverdefinition, Limitssource-repos/adventureland_mongodb/adventure_functions.js–character_to_info,update_character,update_user_data,user_to_serversource-repos/adventureland_mongodb/api.js–create_character_api