Prüfung / Lint, Typen, Tests (push) Canceled after 0s
Prüfung / Images bauen (pdf) (push) Canceled after 0s
Prüfung / Images bauen (web) (push) Canceled after 0s
Prüfung / Images bauen (worker) (push) Canceled after 0s
Images / bauen (pdf, docker/pdf.Dockerfile) (push) Canceled after 0s
Images / bauen (web, docker/web.Dockerfile) (push) Canceled after 0s
Images / bauen (worker, docker/worker.Dockerfile) (push) Canceled after 0s
Die Adresse zeigte auf /var/run/clamav/clamd.sock in einem geteilten Volume. Das offizielle clamav-Image legt seinen Unix-Socket aber unter /tmp im eigenen Container an - nachgemessen, das Verzeichnis im Volume bleibt leer. Jeder Verbindungsversuch lief damit in ENOENT, und die Statusseite meldete die Virenpruefung dauerhaft als gestoert. Folgenreich war das nicht nur fuer die Anzeige: ohne erreichbaren Scanner bleiben Uploads auf "Pruefung unvollstaendig" liegen und brauchen die Freigabe von Hand. Die Kette hat also gehalten, aber niemand kam durch. Dasselbe Image oeffnet ab Werk TCPSocket 3310. Darueber laeuft die Anbindung jetzt; der Port ist im Stack nicht veroeffentlicht und nur im internen Netz erreichbar. CLAMAV_ADDRESS nimmt weiterhin einen Pfad an, falls irgendwo doch ein Unix-Socket erreichbar ist. Das Socket-Volume faellt weg, es enthielt nie etwas. Der Scanner sieht ausserdem die Dateiablage nicht mehr: uebertragen wird per INSTREAM durch die Verbindung, gelesen hat er dort nie etwas. Geprueft gegen ein laufendes clamd, einschliesslich EICAR. Diese Pruefung bleibt als abschaltbarer Teil der Suite stehen: CLAMAV_LIVE=clamav:3310 pnpm --filter @afis/web test pruefkette Die uebrigen neuen Pruefungen decken das Zerlegen der Adresse ab. Sie haetten den Fehler nicht gefunden - eine Adresse, die auf nichts zeigt, ist syntaktisch tadellos. Nur eine echte Verbindung beantwortet das.
67 lines
3.3 KiB
Bash
67 lines
3.3 KiB
Bash
# AfiS-Aktensystem - Vorlage für den .env-Reiter in Dockge.
|
|
# Diese Datei enthält nur Platzhalter. Die echten Werte gehören nach
|
|
# /opt/stacks/afis/.env und niemals ins Repository. Siehe docs/11-betrieb.md.
|
|
|
|
# --- Zeitzone -----------------------------------------------------------------
|
|
TZ=Europe/Berlin
|
|
|
|
# --- Datenbank ----------------------------------------------------------------
|
|
# Wird von db, pgbouncer, web, worker und den Backups gelesen.
|
|
POSTGRES_PASSWORD=hier-ein-langes-zufaelliges-passwort
|
|
|
|
# Die Anwendung spricht über pgbouncer im Transaktionsmodus, deshalb pgbouncer=true.
|
|
DATABASE_URL=postgresql://afis:hier-ein-langes-zufaelliges-passwort@pgbouncer:6432/afis?pgbouncer=true&connection_limit=1
|
|
# Migrationen und LISTEN/NOTIFY brauchen eine Verbindung an pgbouncer vorbei.
|
|
DIRECT_DATABASE_URL=postgresql://afis:hier-ein-langes-zufaelliges-passwort@db:5432/afis
|
|
|
|
# --- Anwendung ----------------------------------------------------------------
|
|
# Auf welchem Port die Anwendung auf dem Host erreichbar ist. Im Container
|
|
# hoert sie immer auf 3000; hier steht nur, worauf das abgebildet wird. Ein
|
|
# Reverse Proxy davor leitet auf genau diesen Port.
|
|
WEB_PORT=3000
|
|
# Die öffentliche Adresse der Anwendung. Auth.js baut daraus die redirect_uri
|
|
# für Discord; sie muss zeichengenau im Developer Portal hinterlegt sein als
|
|
# <APP_URL>/api/auth/callback/discord
|
|
APP_URL=https://afis.example.de
|
|
# 32+ Zeichen. Erzeugen mit: openssl rand -base64 48
|
|
AUTH_SECRET=hier-ein-langes-zufaelliges-geheimnis-mit-mindestens-32-zeichen
|
|
|
|
# --- Discord ------------------------------------------------------------------
|
|
# Aus dem Developer Portal. Das Server Members Intent muss aktiviert sein,
|
|
# sonst liefert der Bot keine Rollen. Siehe docs/03-auth-und-rechte.md.
|
|
# Als Redirect-URI in der Application eintragen:
|
|
# <APP_URL>/api/auth/callback/discord
|
|
# Der Bot muss ausserdem auf den Server eingeladen sein, sonst liefert die
|
|
# API "Unknown Guild":
|
|
# https://discord.com/oauth2/authorize?client_id=<DISCORD_CLIENT_ID>&scope=bot&permissions=3072
|
|
DISCORD_CLIENT_ID=
|
|
DISCORD_CLIENT_SECRET=
|
|
DISCORD_BOT_TOKEN=
|
|
DISCORD_GUILD_ID=
|
|
# Kanal, in den der Worker Start, Verbindungsabbruch und fehlgeschlagenen
|
|
# Voll-Abgleich meldet. Das ist die eigentliche Alarmierung.
|
|
DISCORD_ADMIN_CHANNEL_ID=
|
|
# Takt des Postausgangs als Sicherheitsnetz; angestossen wird er ueber LISTEN.
|
|
WORKER_OUTBOX_MS=30000
|
|
|
|
# --- Notfallzugang ------------------------------------------------------------
|
|
# Eine oder zwei Discord-IDs, kommagetrennt. Diese Nutzer haben immer Stufe 5
|
|
# und alle Rechte, unabhängig vom Rollen-Mapping. Ohne das sperrt man sich beim
|
|
# ersten Fehler in der Rollenverwaltung selbst aus.
|
|
BOOTSTRAP_ADMIN_IDS=
|
|
|
|
# --- Dateien und Prüfkette ----------------------------------------------------
|
|
FILES_DIR=/data/files
|
|
# clamd: host:port im Stack, oder ein Pfad, wenn ein Unix-Socket erreichbar ist.
|
|
# Das offizielle Image legt seinen Socket unter /tmp im eigenen Container ab,
|
|
# deshalb TCP - der Port ist nur im Stack-Netz erreichbar, nicht nach aussen.
|
|
CLAMAV_ADDRESS=clamav:3310
|
|
PDF_SERVICE_URL=http://pdf:3000
|
|
|
|
# --- Cloudflare Tunnel --------------------------------------------------------
|
|
CLOUDFLARE_TUNNEL_TOKEN=
|
|
|
|
# --- Auslagerungs-Backup ------------------------------------------------------
|
|
RESTIC_REPOSITORY=
|
|
RESTIC_PASSWORD=
|