#!/usr/bin/env bash
set -euo pipefail
STAMP=$(date +%Y%m%d_%H%M%S)
ARCHIVE_ROOT=/opt/archive/hermes-werkstandard/$STAMP
BACKUP_ROOT=/opt/backups/hermes-werkstandard-entfernung/$STAMP
SRC=/opt/struktur/hermes-werkstandard
mkdir -p "$ARCHIVE_ROOT" "$BACKUP_ROOT"
chmod 700 "$ARCHIVE_ROOT" "$BACKUP_ROOT"
hostname > "$BACKUP_ROOT/host.txt"; whoami >> "$BACKUP_ROOT/host.txt"; date -Is >> "$BACKUP_ROOT/host.txt"
docker ps -a --filter name=hermes-werkstandard > "$BACKUP_ROOT/docker-ps.txt"
docker inspect hermes-werkstandard > "$BACKUP_ROOT/docker-inspect.json" 2>/dev/null || true
docker volume ls > "$BACKUP_ROOT/docker-volumes.txt"
docker network ls > "$BACKUP_ROOT/docker-networks.txt"
docker image inspect nousresearch/hermes-agent:latest > "$BACKUP_ROOT/image-inspect.json" 2>/dev/null || true
find "$SRC" -printf '%y|%s|%u|%g|%m|%TY-%Tm-%Td %TH:%TM:%TS|%p\n' 2>/dev/null | sort > "$BACKUP_ROOT/dateiliste-vor-entfernung.txt"
find "$SRC" -type f -print0 | sort -z | xargs -0 sha256sum > "$BACKUP_ROOT/sha256-vor-entfernung.txt"
cp -a /opt/struktur/dashboard/app-carlo.py "$BACKUP_ROOT/app-carlo.py.vor-entfernung"
sha256sum "$BACKUP_ROOT/app-carlo.py.vor-entfernung" > "$BACKUP_ROOT/app-carlo.py.vor-entfernung.sha256"
tar --xattrs --acls --numeric-owner -czf "$ARCHIVE_ROOT/hermes-werkstandard-vollarchiv.tar.gz" -C /opt/struktur hermes-werkstandard
sha256sum "$ARCHIVE_ROOT/hermes-werkstandard-vollarchiv.tar.gz" > "$ARCHIVE_ROOT/hermes-werkstandard-vollarchiv.tar.gz.sha256"
tar -tzf "$ARCHIVE_ROOT/hermes-werkstandard-vollarchiv.tar.gz" > "$ARCHIVE_ROOT/archiv-inhalt.txt"
test -s "$ARCHIVE_ROOT/hermes-werkstandard-vollarchiv.tar.gz"
mkdir -p "$ARCHIVE_ROOT/reference"/{skills,soul,config,reports,manifests,sensitive}
chmod 700 "$ARCHIVE_ROOT/reference/sensitive"
cp -a "$SRC/data/skills" "$ARCHIVE_ROOT/reference/skills/"
cp -a "$SRC/data/SOUL.md" "$ARCHIVE_ROOT/reference/soul/" 2>/dev/null || true
cp -a "$SRC/data/config.yaml" "$ARCHIVE_ROOT/reference/config/" 2>/dev/null || true
cp -a "$SRC/docker-compose.yml" "$ARCHIVE_ROOT/reference/manifests/"
for f in "$SRC"/*.md "$SRC"/*.csv; do [ -f "$f" ] && cp -a "$f" "$ARCHIVE_ROOT/reference/reports/"; done
cp -a "$BACKUP_ROOT"/* "$ARCHIVE_ROOT/reference/manifests/" 2>/dev/null || true
find "$SRC/data" -maxdepth 1 -type f \( -name '*.env' -o -name '*token*' -o -name '*secret*' -o -name '*credential*' -o -name 'config.yaml*' \) -exec cp -a {} "$ARCHIVE_ROOT/reference/sensitive/" \; 2>/dev/null || true
find "$ARCHIVE_ROOT/reference/sensitive" -type f -exec chmod 600 {} \;
cat > "$ARCHIVE_ROOT/ARCHIV-MANIFEST.md" <<EOF
# Hermes Werkstandard Archiv
- Herkunft: $SRC
- Archivdatum: $(date -Is)
- ursprünglicher Container: hermes-werkstandard (nicht vorhanden/laufend)
- ursprüngliches Image: nousresearch/hermes-agent:latest
- Grund: stillgelegte Altinstanz; vollständige Sicherung vor Entfernung
- Status: nicht aktiv
- Skills: 75 tatsächliche Verzeichnisse; 41 einzigartig, 22 abweichend, 12 identisch
- Vollarchiv: $ARCHIVE_ROOT/hermes-werkstandard-vollarchiv.tar.gz
- Referenzstruktur: $ARCHIVE_ROOT/reference
- Wiederherstellung: tar mit --xattrs/--acls nach /opt/struktur entpacken; Cockpit-Datei aus Backup wiederherstellen; Syntax prüfen; Dienst neu starten; Container nicht automatisch starten.
- Keine Datei darf automatisch nach Hermes Carlo übernommen werden.
EOF
cat > "$ARCHIVE_ROOT/ROLLBACK.md" <<EOF
# Rollback
Vollarchiv prüfen und nach /opt/struktur entpacken. Rechte/ACLs/Xattrs wiederherstellen. $BACKUP_ROOT/app-carlo.py.vor-entfernung nach /opt/struktur/dashboard/app-carlo.py zurückspielen, py_compile prüfen und carlo-dashboard.service neu starten. Werkstandard-Container nicht automatisch starten.
EOF
echo "ARCHIVE_ROOT=$ARCHIVE_ROOT"
echo "BACKUP_ROOT=$BACKUP_ROOT"
du -sh "$ARCHIVE_ROOT" "$BACKUP_ROOT"
sha256sum "$ARCHIVE_ROOT/hermes-werkstandard-vollarchiv.tar.gz"
echo "archive_valid=yes"