Betreiber am 04.09.2026: "koennen wir das nicht mit in die webseite einbauen, das er sich das ueber das acp holt?" - das ist der bessere Entwurf, und der Grund ist das geringste Recht. WAS DER ERSTE ANLAUF FALSCH GEMACHT HAETTE Er haette dem Bot das Geheimnis von d4rk_web gegeben. Dann haetten ZWEI Dienste den Schluessel zu allem gehabt: Rechtematrix, Spielerliste, Protokoll, Schreibweg. Ein Bot, der nur wissen soll, ob jemand die Whitelist verwalten darf, braucht davon nichts. Jetzt bleibt das Panel der einzige, der mit dem Spielserver redet, und der Bot bekommt einen eigenen Schluessel (BOT_TOKEN), der genau eine Tuer oeffnet: /bot/person. EIGENER PFAD, EIGENER WAECHTER /bot/ statt /api/bot/, weil der Sitzungswaechter dort Discord-Anmeldung und Rolle prueft - beides hat eine Maschine nicht. Der Botwaechter vergleicht den Schluessel zeichenweise (dieselbe Ueberlegung wie in d4rk_web) und antwortet bei fehlendem oder falschem Schluessel mit 404, nicht 401: wer von aussen probiert, soll nicht erfahren, dass es hier einen Maschinenzugang gibt. Unter 32 Zeichen gibt es den Weg gar nicht - eine halbe Konfiguration darf keine Tuer aufmachen. DURCHGEREICHT, NICHT AUSGEWERTET. Das Panel entscheidet an dieser Stelle nichts; sonst waere es die zweite Rechteverwaltung, die ADR-0012 ausschliesst. NEBENBEI ZWEI FALLEN VERMIEDEN Dem Bot fehlt extra_hosts - host.docker.internal haette gar nicht aufgeloest, und der Fehler haette wie "Spielserver antwortet nicht" ausgesehen. Ueber das oeffentliche Panel braucht er es nicht. Und das Panel nennt seine zwei Werte D4RK_WEB_URL/D4RK_WEB_TOKEN; mein Botmodul hiess erst SPIELSERVER_*. Zwei Vokabeln fuer eine Sache bedeuten, dass man beim Umzug an zwei Stellen sucht und eine vergisst. Die Datei heisst jetzt panel.js - ein Modul namens spielserver.js, das mit dem Panel redet, waere ein Name, der luegt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
66 lines
3.0 KiB
YAML
66 lines
3.0 KiB
YAML
# d4rkbot Stack — deploybar über Portainer (Stacks → Add stack)
|
|
# WICHTIG: Portainer-Stack-Name "ecobot" NICHT ändern — er ist Teil des
|
|
# Volume-Namens (ecobot_ecobot_data); ein neuer Stack-Name = leeres Volume!
|
|
services:
|
|
d4rkbot:
|
|
build: .
|
|
image: d4rkbot:latest
|
|
# Immer neu bauen statt nur, wenn das Abbild fehlt.
|
|
#
|
|
# Das REPARIERT NICHTS -- Portainer baut auch ohne diese Zeile neu, das ist
|
|
# nachgemessen worden (Push 12:48, Abbild 13:01:02, Container 13:01:14). Es
|
|
# dauert nur rund dreizehn Minuten, weil Portainer in Intervallen nachfragt,
|
|
# und wer waehrenddessen misst, haelt den Zwischenstand fuer das Ergebnis.
|
|
#
|
|
# Die Zeile macht es nur ausdruecklich: bei einem Stack mit `build:` ist
|
|
# "immer neu bauen" das, was man beim Ausrollen will -- und wer spaeter von
|
|
# Hand `docker compose up -d` tippt, bekommt dasselbe wie die Automatik.
|
|
pull_policy: build
|
|
container_name: d4rkbot
|
|
restart: unless-stopped
|
|
# Werte kommen per Interpolation: lokal aus der .env im Projektordner (liest
|
|
# docker compose automatisch), in Portainer aus den Stack-Environment-Variables
|
|
environment:
|
|
DISCORD_TOKEN: ${DISCORD_TOKEN}
|
|
DISCORD_CLIENT_ID: ${DISCORD_CLIENT_ID}
|
|
DISCORD_GUILD_ID: ${DISCORD_GUILD_ID:-}
|
|
COMMIT_CHANNEL_ID: ${COMMIT_CHANNEL_ID}
|
|
DEVLOG_CHANNEL_ID: ${DEVLOG_CHANNEL_ID}
|
|
DEVLOG_POST_SECRET: ${DEVLOG_POST_SECRET}
|
|
GITEA_API_TOKEN: ${GITEA_API_TOKEN:-}
|
|
GITEA_URL: ${GITEA_URL:-https://git.d4rkst3r.de}
|
|
GITEA_WEBHOOK_SECRET: ${GITEA_WEBHOOK_SECRET}
|
|
DISCORD_CLIENT_SECRET: ${DISCORD_CLIENT_SECRET}
|
|
SESSION_SECRET: ${SESSION_SECRET}
|
|
ADMIN_DISCORD_ID: ${ADMIN_DISCORD_ID}
|
|
PUBLIC_URL: ${PUBLIC_URL:-https://bot.d4rkst3r.de}
|
|
# Lokale Zeitzone — wichtig für den Wochen-Rückblick (sonntags 20:00) und Datumsangaben
|
|
TZ: ${TZ:-Europe/Berlin}
|
|
DB_PATH: /app/data/ecobot.db
|
|
# ---------------------------------------------------------------
|
|
# Zugang zum Adminpanel (fuer /whitelist)
|
|
# ---------------------------------------------------------------
|
|
#
|
|
# Der Bot fragt das PANEL, nicht den Spielserver: sonst haetten zwei
|
|
# Dienste den Schluessel zu allem. Dieser hier oeffnet genau eine Tuer.
|
|
#
|
|
# Kein Vorgabewert - ein Bot, der bei fehlender Konfiguration heimlich
|
|
# irgendwohin verbindet, ist schlechter als einer, der "nicht
|
|
# eingerichtet" sagt.
|
|
ACP_URL: ${ACP_URL:-}
|
|
ACP_BOT_TOKEN: ${ACP_BOT_TOKEN:-}
|
|
# Die Discord-Rolle, die den Zutritt oeffnet. Muss dieselbe sein, die der
|
|
# Spielserver prueft (Convar d4rk_discord:role).
|
|
WHITELIST_ROLE_ID: ${WHITELIST_ROLE_ID:-}
|
|
# HTTP-Endpoint für Gitea-Webhooks + Webinterface
|
|
# NPM leitet bot.d4rkst3r.de → host.docker.internal:3080
|
|
ports:
|
|
- "3080:3080"
|
|
volumes:
|
|
# SQLite & Devlog-Bilder überleben Container-Neustarts.
|
|
# Volume-Name bleibt aus historischen Gründen "ecobot_data" (Daten!)
|
|
- ecobot_data:/app/data
|
|
|
|
volumes:
|
|
ecobot_data:
|