#!/usr/bin/env bash # # PDF OCR Hotfolder — Update-Script # # Aktualisiert Code und venv unter /opt/pdf-ocr-hotfolder/ sowie die # systemd Template-Unit. Danach werden alle laufenden Instanzen neu gestartet. # Config-Dateien unter /etc/pdf-ocr-hotfolder/ bleiben unverändert. # set -euo pipefail RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m' log_info() { echo -e "${GREEN}[INFO]${NC} $*"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } log_error() { echo -e "${RED}[ERROR]${NC} $*"; } if [ "${EUID}" -ne 0 ]; then log_error "Bitte als root ausführen: sudo ./update.sh" exit 1 fi INSTALL_DIR="/opt/pdf-ocr-hotfolder" CONFIG_DIR="/etc/pdf-ocr-hotfolder" SERVICE_TEMPLATE="pdf-ocr-hotfolder@.service" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ -f "$SCRIPT_DIR/pdf_ocr_hotfolder/__init__.py" ]; then REPO_DIR="$SCRIPT_DIR" elif [ -f "$INSTALL_DIR/.repo_path" ]; then REPO_DIR="$(cat "$INSTALL_DIR/.repo_path")" [ -d "$REPO_DIR" ] || { log_error "Gespeicherter Repo-Pfad existiert nicht: $REPO_DIR"; exit 1; } else log_error "Repo nicht gefunden. update.sh aus dem Repo ausführen." exit 1 fi [ -d "$INSTALL_DIR" ] || { log_error "Installation nicht gefunden. Erst install.sh ausführen."; exit 1; } OLD_VERSION="$(cat "$INSTALL_DIR/VERSION" 2>/dev/null || echo unknown)" NEW_VERSION="$(cat "$REPO_DIR/VERSION" 2>/dev/null || echo unknown)" echo echo "==========================================" echo " PDF OCR Hotfolder — Update" echo "==========================================" log_info "Repo: $REPO_DIR" log_info "Install: $INSTALL_DIR" log_info "Version: $OLD_VERSION → $NEW_VERSION" echo # Laufende Instanzen ermitteln mapfile -t RUNNING < <(systemctl list-units --no-legend --state=active 'pdf-ocr-hotfolder@*.service' 2>/dev/null | awk '{print $1}') if [ "${#RUNNING[@]}" -gt 0 ]; then log_info "Laufende Instanzen: ${RUNNING[*]}" else log_info "Keine laufenden Instanzen." fi log_info "Stoppe laufende Instanzen..." for unit in "${RUNNING[@]}"; do systemctl stop "$unit" || true done log_info "Backup erstellen..." BACKUP_DIR="/var/backups/pdf-ocr-hotfolder" mkdir -p "$BACKUP_DIR" tar -czf "$BACKUP_DIR/backup-$(date +%Y%m%d-%H%M%S).tar.gz" \ -C "$INSTALL_DIR" --exclude=venv --exclude=__pycache__ . 2>/dev/null || true log_info "Code aktualisieren..." rm -rf "$INSTALL_DIR/pdf_ocr_hotfolder" cp -r "$REPO_DIR/pdf_ocr_hotfolder" "$INSTALL_DIR/" cp "$REPO_DIR/requirements.txt" "$INSTALL_DIR/" cp "$REPO_DIR/VERSION" "$INSTALL_DIR/" cp "$REPO_DIR/config.example.toml" "$INSTALL_DIR/" echo "$REPO_DIR" > "$INSTALL_DIR/.repo_path" log_info "Dependencies aktualisieren..." "$INSTALL_DIR/venv/bin/pip" install --upgrade pip -q "$INSTALL_DIR/venv/bin/pip" install --upgrade -r "$INSTALL_DIR/requirements.txt" -q log_info "systemd Template-Unit aktualisieren..." cp "$REPO_DIR/systemd/$SERVICE_TEMPLATE" "/etc/systemd/system/$SERVICE_TEMPLATE" systemctl daemon-reload log_info "Berechtigungen setzen..." # Eigentümer des Codes bleibt der primäre User (pdfocr); Instanzen laufen # ggf. als anderer User, lesen aber nur den Code. PRIMARY_USER="$(stat -c '%U' "$INSTALL_DIR/venv" 2>/dev/null || echo pdfocr)" chown -R "$PRIMARY_USER":"$PRIMARY_USER" "$INSTALL_DIR" log_info "Starte Instanzen wieder..." FAIL=0 for unit in "${RUNNING[@]}"; do systemctl start "$unit" || true sleep 1 if systemctl is-active --quiet "$unit"; then log_info " ✅ $unit" else log_error " ❌ $unit — journalctl -u $unit -n 30" FAIL=1 fi done echo if [ "$FAIL" -eq 0 ]; then log_info "Update auf $NEW_VERSION abgeschlossen ✓" else log_warn "Update abgeschlossen, aber mindestens eine Instanz läuft nicht." exit 1 fi