#!/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 -u git "${GITEA_CONTAINER}" \ sh -c "mkdir -p /tmp/gitea-dump-tmp && 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 " (нет файлов)"