985a33d3f9
- pdf-ocr-hotfolder@<name>.service mit Config pro Instanz - install.sh als Instanz-Manager: erkennt bestehende, fragt nach weiteren - Optional eigener Service-User pro Instanz (systemd drop-in) - update.sh stoppt/startet alle aktiven Instanzen automatisch Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
111 lines
3.7 KiB
Bash
Executable File
111 lines
3.7 KiB
Bash
Executable File
#!/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
|