Files
owngit/scripts/backup-gitea.sh
T

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"