diff --git a/Changes.md b/Changes.md index ccdd5de..465a631 100644 --- a/Changes.md +++ b/Changes.md @@ -2,6 +2,21 @@ --- +## 2026-04-12 – Uploads: named Volume → Bind Mount + +### Geändert +- `docker-compose.yml`: Upload-Volume von named Volume (`steuerkram_uploads`) auf Bind Mount (`./uploads/`) umgestellt – konsistent mit `./data/mariadb/` +- `scripts/migrate-uploads-to-bindmount.sh`: Einmalige Migration hinzugefügt + +### Update auf Produktiv-System +**Vor** `docker compose up` einmalig ausführen: +```bash +./scripts/migrate-uploads-to-bindmount.sh +``` +Das Script kopiert alle Dateien aus dem named Volume in `./uploads/`, ist idempotent und gibt am Ende den Befehl zum Löschen des alten Volumes aus. + +--- + ## 2026-04-11 – Buchungsbasierte Vorsteuer Kz 61/62 in UStVA ### Geändert diff --git a/docker-compose.yml b/docker-compose.yml index 609e4fb..9f5b121 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,7 +7,7 @@ services: - ./public:/var/www/html/public - ./src:/var/www/html/src - ./migrations:/var/www/html/migrations - - uploads:/var/www/html/public/static/uploads + - ./uploads:/var/www/html/public/static/uploads - ./data:/var/www/html/data - ./tests:/var/www/html/tests - ./scripts:/var/www/html/scripts @@ -43,5 +43,3 @@ services: retries: 10 restart: unless-stopped -volumes: - uploads: diff --git a/scripts/migrate-uploads-to-bindmount.sh b/scripts/migrate-uploads-to-bindmount.sh new file mode 100755 index 0000000..5bfe931 --- /dev/null +++ b/scripts/migrate-uploads-to-bindmount.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# Einmalige Migration: Uploads vom named Docker Volume in ./uploads/ (Bind Mount) +# Vor dem ersten "docker compose up" mit dem neuen docker-compose.yml ausführen. +# +# Das Script ist idempotent: bereits vorhandene Dateien in ./uploads/ werden +# nicht überschrieben. Es ist sicher, es mehrfach auszuführen. +# +# Usage: ./scripts/migrate-uploads-to-bindmount.sh + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" +TARGET_DIR="$PROJECT_DIR/uploads" +VOLUME_NAME="steuerkram_uploads" + +echo "=== Uploads-Migration: named Volume → Bind Mount ===" +echo "Zielverzeichnis: $TARGET_DIR" +echo "" + +# Prüfen ob das named Volume existiert +if ! docker volume ls --format '{{.Name}}' | grep -qx "$VOLUME_NAME"; then + echo "Named Volume '$VOLUME_NAME' nicht gefunden – nichts zu migrieren." + echo "Zielverzeichnis wird angelegt (falls nicht vorhanden)." + mkdir -p "$TARGET_DIR" + echo "Fertig." + exit 0 +fi + +# Anzahl Dateien im Volume ermitteln +FILE_COUNT=$(docker run --rm \ + -v "$VOLUME_NAME:/src" \ + alpine \ + find /src -type f | wc -l) + +echo "Dateien im named Volume: $FILE_COUNT" + +if [ "$FILE_COUNT" -eq 0 ]; then + echo "Volume ist leer – nichts zu kopieren." + mkdir -p "$TARGET_DIR" + echo "Fertig." + exit 0 +fi + +mkdir -p "$TARGET_DIR" + +echo "Kopiere Dateien ins Bind-Mount-Verzeichnis..." +docker run --rm \ + -v "$VOLUME_NAME:/src" \ + -v "$TARGET_DIR:/dst" \ + alpine \ + sh -c 'cp -r /src/. /dst/' + +COPIED=$(find "$TARGET_DIR" -type f | wc -l) +echo "" +echo "Migration abgeschlossen: $COPIED Dateien in $TARGET_DIR" +echo "" +echo "Nächste Schritte:" +echo " docker compose up -d" +echo "" +echo "Das named Volume '$VOLUME_NAME' kann danach gelöscht werden:" +echo " docker volume rm $VOLUME_NAME"