Files
duffyduckandClaude Opus 5 49ddaeccff Docker-Compose-Setup ohne benannte Volumes
Der Container bringt die gebaute Anwendung mit; einziger Mount ist
./data:/app/data. Die Buchhaltung bleibt damit als gewöhnliche SQLite-Dateien
im Projektverzeichnis und lässt sich ohne Docker sichern und einsehen.

Der Server band bisher fest an 127.0.0.1 und wäre im Container von außen nicht
erreichbar gewesen. Die Adresse ist jetzt über HOST einstellbar und bleibt
außerhalb des Containers unverändert auf 127.0.0.1; im Container gilt 0.0.0.0,
abgesichert über eine Portfreigabe, die nur auf 127.0.0.1 lauscht.

Weitere Festlegungen:
- Lauf unter der UID des aufrufenden Kontos, damit ./data nicht root gehört
- schreibgeschütztes Containerdateisystem, beschreibbar nur /app/data und /tmp
- .env wird nicht ins Image gebacken, sondern von docker-compose eingelesen
- ERiC bleibt außen vor und ist bei Bedarf vom Host einzubinden

Die Startmeldung nannte bisher nur, ob eine .env-Datei existiert. Im Container
gibt es keine, obwohl die Konfiguration vollständig vorliegt – gemeldet wird
jetzt der tatsächliche ERiC-Zustand.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 21:53:35 +02:00

67 lines
2.4 KiB
YAML

# Aufruf: docker-compose up -d --build
#
# Die Anwendung läuft dann unter http://localhost:3311
#
# Es werden bewusst keine benannten Volumes verwendet: die Buchhaltung liegt als
# gewöhnliche SQLite-Dateien im Projektverzeichnis unter ./data und lässt sich
# damit sichern, kopieren und einsehen, ohne Docker zu bemühen.
version: "3.8"
services:
euer:
build:
context: .
dockerfile: Dockerfile
image: open-eur-buchhaltung:latest
container_name: open-eur-buchhaltung
restart: unless-stopped
# An 127.0.0.1 gebunden: die Anwendung kennt keine Benutzeranmeldung, und
# hier liegen Steuernummer und Umsätze. Für den Zugriff aus dem Netz gehört
# ein Reverse Proxy mit Authentifizierung davor.
ports:
- "127.0.0.1:3311:3311"
# Mit der UID des aufrufenden Kontos laufen, damit die Dateien in ./data
# dem Host gehören und nicht root. UID/GID notfalls fest eintragen.
user: "${UID:-1000}:${GID:-1000}"
volumes:
# Einziger Mount: die Daten bleiben im Projektverzeichnis.
- ./data:/app/data
# ERiC ist proprietär und darf nicht ins Image. Wer echt übermitteln will,
# bindet die Installation vom Host ein und setzt die Pfade in .env.
# - /opt/eric:/opt/eric:ro
# - ./zertifikat.pfx:/app/zertifikat.pfx:ro
environment:
# Im Container muss auf allen Schnittstellen gelauscht werden, sonst
# erreicht die Portfreigabe den Prozess nicht.
HOST: 0.0.0.0
PORT: 3311
NODE_ENV: production
TZ: Europe/Berlin
# Die folgenden Werte kommen aus ./.env, sofern vorhanden. docker-compose
# liest diese Datei automatisch für die Ersetzung ein; fehlt sie, greifen
# die Vorgaben und die Anwendung läuft im ELSTER-Simulationsmodus.
LOG_LEVEL: "${LOG_LEVEL:-warn}"
EUER_DB: "${EUER_DB:-./data/euer.sqlite}"
EUER_MANDANT: "${EUER_MANDANT:-}"
ERIC_LIB_PATH: "${ERIC_LIB_PATH:-}"
ERIC_PLUGIN_PATH: "${ERIC_PLUGIN_PATH:-}"
ERIC_LOG_PATH: "${ERIC_LOG_PATH:-./data/eric-log}"
ELSTER_ZERTIFIKAT: "${ELSTER_ZERTIFIKAT:-}"
ELSTER_PIN: "${ELSTER_PIN:-}"
ELSTER_HERSTELLER_ID: "${ELSTER_HERSTELLER_ID:-}"
ELSTER_TESTMERKER: "${ELSTER_TESTMERKER:-}"
# Die Anwendung schreibt außerhalb von /app/data nichts.
read_only: true
tmpfs:
- /tmp
security_opt:
- no-new-privileges:true