Files
2026-11-08 02:16:03 +01:00

6.5 KiB
Raw Permalink Blame History

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_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