diff --git a/backup.sh b/backup.sh new file mode 100755 index 0000000..dd09eeb --- /dev/null +++ b/backup.sh @@ -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 " (нет файлов)" \ No newline at end of file