#!/bin/sh set -eu umask 077 D() { date "+%Y-%m-%d %H:%M:%S"; } TS=$(date +%Y%m%d_%H%M%S) OUT="/backup/gitea_${TS}" mkdir -p "$OUT" echo "[$(D)] Starting gitea backup -> $OUT" # rootless 布局: app.ini=/etc/gitea(宿主 ./config), db+repos=/var/lib/gitea/data(宿主 ./data/data) # app.ini 含 SECRET_KEY/INTERNAL_TOKEN — 恢复 2FA/session/mirror 凭据必需 tar czf "$OUT/app.ini.tar.gz" -C /config app.ini sqlite3 /data/data/gitea.db ".backup '$OUT/gitea.db'" rsync -a /data/data/git/repositories/ "$OUT/repos/" tar czf "$OUT/repos.tar.gz" -C "$OUT" repos rm -rf "$OUT/repos" chmod 600 "$OUT"/* if [ -n "${BACKUP_UID:-}" ] && [ -n "${BACKUP_GID:-}" ]; then chown -R "$BACKUP_UID:$BACKUP_GID" "$OUT" /backup/backup.log fi echo "[$(D)] Backup OK: $(du -sh "$OUT" | cut -f1)"