#!/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