Initial own-git docs, configs, scripts, and hardening pack
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
#!/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"
|
||||
Reference in New Issue
Block a user