# 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. NUR NOCH RUECKFALL: seit # dem 04.09.2026 holt der Bot sie vom Adminpanel (/bot/config), wo sie # auf der Seite "Einstellungen" eingetragen wird. Was dort steht, gewinnt. # # Der Rueckfall bleibt, damit /whitelist auch dann noch etwas anzeigen # kann, wenn das Panel gerade nicht antwortet. 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: