Der erste Verdacht ("kein Runner") war die halbe Wahrheit. Portainers
GitOps-Weg funktioniert, nachgemessen in seinem eigenen Datenverzeichnis:
/d/compose/1/src/melden.js 12:48 <- die Uhrzeit des Pushes
/d/compose/1/stack.env 12:57 <- Portainer hat neu geschrieben
docker images d4rkbot:latest 00:21 <- das Abbild 15 Stunden alt
Portainer holt den neuen Stand also brav ins Stack-Verzeichnis und ruft dann
docker compose up -d. UND DAS BAUT NUR, WENN DAS ABBILD FEHLT. d4rkbot:latest
gab es -- also kein Bau, kein neuer Container, und der Bot lief weiter mit dem
Code von vorgestern.
Kein Runner, kein Webhook, keine Fehlermeldung: es sah nach "nichts zu tun"
aus. Das ist die unangenehme Sorte Fehler -- man pusht, hakt es ab, und der
Fehler, den man gerade behoben hat, laeuft weiter.
pull_policy: build laesst compose bei jedem Ausrollen neu bauen. Geprueft mit
docker compose config (v5.3.1 nimmt es an und gibt es aufgeloest zurueck).
Einmal noch von Hand, denn die Zeile wirkt erst, wenn sie selbst ausgerollt
ist: Portainer -> Stack ecobot -> Pull and redeploy.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
52 lines
2.2 KiB
YAML
52 lines
2.2 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, nicht nur wenn das Abbild fehlt.
|
|
#
|
|
# Ohne das ist der Auto-Deploy ein Leerlauf, und das war er: Portainer zieht
|
|
# den neuen Stand brav ins Stack-Verzeichnis (nachgemessen -- die Dateien
|
|
# trugen die Uhrzeit des Pushes) und ruft dann `docker compose up -d`. Das
|
|
# baut aber nur, wenn das Abbild FEHLT. `d4rkbot:latest` gab es, also
|
|
# passierte nichts: kein Bau, kein Neustart, und der Bot lief weiter mit dem
|
|
# Code von vorgestern.
|
|
#
|
|
# Das ist die unangenehme Sorte Fehler -- man pusht, hakt es ab, und der
|
|
# Fehler, den man gerade behoben hat, laeuft weiter.
|
|
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
|
|
# 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:
|