Rewrite backup.sh for Gitea dump backup

This commit is contained in:
2026-06-06 15:08:34 +00:00
parent db100e7982
commit 5b18a9352d
Executable
+96
View File
@@ -0,0 +1,96 @@
#!/bin/bash
# Скрипт резервного копирования Gitea через gitea dump с отправкой на Яндекс.Диск
# Использует встроенную команду gitea dump, которая создаёт полный снапшот:
# - PostgreSQL база данных (SQL дамп)
# - Git-репозитории
# - Вложения
# - LFS-данные
# - Конфигурационные файлы
# - Пакеты
BACKUP_DIR="/opt/gitea/backups"
YADISK_MOUNT="/mnt/yandex-disk"
DATE=$(date +%Y%m%d_%H%M%S)
COMPOSE_DIR="/opt/gitea.nixg.ru"
GITEA_CONTAINER="gitea"
DUMP_FILE="gitea_dump_${DATE}.zip"
# Создаём локальную папку для бэкапов
mkdir -p "${BACKUP_DIR}"
echo "🔄 [$(date)] Начинаем резервное копирование Gitea..."
# Проверяем, примонтирован ли Яндекс.Диск
if ! mountpoint -q "${YADISK_MOUNT}"; then
echo " ❌ ОШИБКА: Яндекс.Диск не примонтирован!"
exit 1
fi
# Создаём папку для бэкапов на Яндекс.Диске (если её нет)
mkdir -p "${YADISK_MOUNT}/gitea-backups" 2>/dev/null
# 1. Полный дамп Gitea через встроенную команду
echo " → Выполняем gitea dump (БД + репозитории + вложения + конфиг)..."
cd "${COMPOSE_DIR}" || exit 1
docker compose exec -T "${GITEA_CONTAINER}" \
gitea dump \
--file "/tmp/${DUMP_FILE}" \
--tempdir /tmp/gitea-dump-tmp \
--skip-log \
--skip-custom-dir
DUMP_EXIT=$?
# 2. Копируем дамп из контейнера на хост
if [ ${DUMP_EXIT} -eq 0 ]; then
echo " → Копируем дамп из контейнера..."
docker compose cp "${GITEA_CONTAINER}:/tmp/${DUMP_FILE}" "${BACKUP_DIR}/" 2>/dev/null
if [ -s "${BACKUP_DIR}/${DUMP_FILE}" ]; then
echo " ✅ Дамп Gitea: $(du -h "${BACKUP_DIR}/${DUMP_FILE}" | cut -f1)"
else
echo " ❌ Ошибка копирования дампа из контейнера!"
fi
# Очищаем временный файл в контейнере
docker compose exec -T "${GITEA_CONTAINER}" rm -f "/tmp/${DUMP_FILE}" 2>/dev/null
docker compose exec -T "${GITEA_CONTAINER}" rm -rf /tmp/gitea-dump-tmp 2>/dev/null
else
echo " ❌ Ошибка выполнения gitea dump (exit code: ${DUMP_EXIT})!"
fi
# 3. Отдельный бэкап .env и переменных (если нужны)
echo " → Бэкап .env файлов..."
if [ -f "${COMPOSE_DIR}/.env" ]; then
cp "${COMPOSE_DIR}/.env" "${BACKUP_DIR}/gitea_env_${DATE}.txt"
echo " ✅ .env файл сохранён"
else
echo " ⚠️ .env файл не найден, пропускаем"
fi
# 4. Копирование на Яндекс.Диск
echo "☁️ Копирование на Яндекс.Диск..."
for file in "${DUMP_FILE}" "gitea_env_${DATE}.txt"; do
if [ -f "${BACKUP_DIR}/${file}" ]; then
cp "${BACKUP_DIR}/${file}" "${YADISK_MOUNT}/gitea-backups/"
echo " ✅ ${file}"
fi
done
# 5. Очистка старых бэкапов
# Локально: оставляем 7 дней
find "${BACKUP_DIR}" -type f -name "gitea_dump_*.zip" -mtime +7 -delete 2>/dev/null
find "${BACKUP_DIR}" -type f -name "gitea_env_*.txt" -mtime +7 -delete 2>/dev/null
# На Яндекс.Диске: оставляем 30 дней
find "${YADISK_MOUNT}/gitea-backups" -type f -name "gitea_dump_*.zip" -mtime +30 -delete 2>/dev/null
find "${YADISK_MOUNT}/gitea-backups" -type f -name "gitea_env_*.txt" -mtime +30 -delete 2>/dev/null
echo "✅ [$(date)] Резервное копирование Gitea завершено!"
# Показываем список созданных бэкапов
echo ""
echo "📊 Созданные бэкапы:"
ls -lh "${BACKUP_DIR}/gitea_dump_${DATE}."* "${BACKUP_DIR}/gitea_env_${DATE}."* 2>/dev/null || echo " (нет файлов)"