49 lines
1.6 KiB
Bash
49 lines
1.6 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# Резервное копирование Gitea data dir + app.ini с простой ротацией.
|
|
# По умолчанию:
|
|
# - источник: /opt/gitea/data
|
|
# - бэкапы: /opt/backups/gitea
|
|
# - хранить: 14 архивов
|
|
|
|
GITEA_DATA_DIR="${GITEA_DATA_DIR:-/opt/gitea/data}"
|
|
BACKUP_DIR="${BACKUP_DIR:-/opt/backups/gitea}"
|
|
RETENTION="${RETENTION:-14}"
|
|
DATE_TAG="$(date +%Y%m%d-%H%M%S)"
|
|
ARCHIVE_NAME="gitea-backup-${DATE_TAG}.tar.gz"
|
|
TMP_DIR="${BACKUP_DIR}/.tmp-${DATE_TAG}"
|
|
|
|
mkdir -p "$BACKUP_DIR"
|
|
mkdir -p "$TMP_DIR"
|
|
|
|
echo "[INFO] Backup started: $DATE_TAG"
|
|
echo "[INFO] Source: $GITEA_DATA_DIR"
|
|
echo "[INFO] Target: $BACKUP_DIR/$ARCHIVE_NAME"
|
|
|
|
if [[ ! -d "$GITEA_DATA_DIR" ]]; then
|
|
echo "[ERR] Source directory not found: $GITEA_DATA_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
# Копируем только нужное в staging, чтобы архив был чистым.
|
|
cp -a "$GITEA_DATA_DIR" "$TMP_DIR/data"
|
|
|
|
tar -C "$TMP_DIR" -czf "${BACKUP_DIR}/${ARCHIVE_NAME}" data
|
|
rm -rf "$TMP_DIR"
|
|
|
|
echo "[OK] Archive created: ${BACKUP_DIR}/${ARCHIVE_NAME}"
|
|
|
|
# Ротация по количеству файлов (новые сохраняем, старые удаляем).
|
|
mapfile -t OLD_BACKUPS < <(ls -1t "${BACKUP_DIR}"/gitea-backup-*.tar.gz 2>/dev/null || true)
|
|
COUNT="${#OLD_BACKUPS[@]}"
|
|
if (( COUNT > RETENTION )); then
|
|
echo "[INFO] Retention: keep newest ${RETENTION}, remove $((COUNT - RETENTION))"
|
|
for (( i=RETENTION; i<COUNT; i++ )); do
|
|
rm -f "${OLD_BACKUPS[$i]}"
|
|
echo "[INFO] Removed old backup: ${OLD_BACKUPS[$i]}"
|
|
done
|
|
fi
|
|
|
|
echo "[OK] Backup finished"
|