init
This commit is contained in:
240
backup-scripts/backup-gitea-lxc.sh
Executable file
240
backup-scripts/backup-gitea-lxc.sh
Executable file
@@ -0,0 +1,240 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Скрипт бэкапа Gitea в LXC контейнере
|
||||
# Запускать ВНУТРИ LXC контейнера
|
||||
#
|
||||
# Создаёт:
|
||||
# - pg_dump базы данных
|
||||
# - gitea dump (репозитории, конфиг, данные)
|
||||
# - Единый архив
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
# ============================================
|
||||
# НАСТРОЙКИ
|
||||
# ============================================
|
||||
|
||||
# Директория для бэкапов
|
||||
BACKUP_BASE="${BACKUP_BASE:-/var/backups/gitea}"
|
||||
|
||||
# PostgreSQL
|
||||
DB_USER="${DB_USER:-gitea}"
|
||||
DB_NAME="${DB_NAME:-gitea}"
|
||||
|
||||
# Gitea пути
|
||||
GITEA_BIN="${GITEA_BIN:-/usr/local/bin/gitea}"
|
||||
GITEA_CONFIG="${GITEA_CONFIG:-/etc/gitea/app.ini}"
|
||||
GITEA_DATA="${GITEA_DATA:-/var/lib/gitea}"
|
||||
|
||||
# Сколько бэкапов хранить (0 = не удалять старые)
|
||||
KEEP_BACKUPS="${KEEP_BACKUPS:-7}"
|
||||
|
||||
# Отправка на удалённый сервер (опционально)
|
||||
REMOTE_BACKUP="${REMOTE_BACKUP:-}" # user@host:/path/to/backups
|
||||
|
||||
# ============================================
|
||||
# ФУНКЦИИ
|
||||
# ============================================
|
||||
|
||||
log() {
|
||||
echo -e "\033[1;32m[$(date '+%Y-%m-%d %H:%M:%S')]\033[0m $1"
|
||||
}
|
||||
|
||||
warn() {
|
||||
echo -e "\033[1;33m[WARN]\033[0m $1"
|
||||
}
|
||||
|
||||
error() {
|
||||
echo -e "\033[1;31m[ERROR]\033[0m $1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
if [ -n "$BACKUP_DIR" ] && [ -d "$BACKUP_DIR" ]; then
|
||||
rm -rf "$BACKUP_DIR"
|
||||
fi
|
||||
}
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
# ============================================
|
||||
# ПРОВЕРКИ
|
||||
# ============================================
|
||||
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
error "Запустите от root: sudo $0"
|
||||
fi
|
||||
|
||||
if ! command -v "$GITEA_BIN" &>/dev/null; then
|
||||
error "Gitea не найдена: $GITEA_BIN"
|
||||
fi
|
||||
|
||||
if ! systemctl is-active --quiet postgresql; then
|
||||
error "PostgreSQL не запущен"
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# ПОДГОТОВКА
|
||||
# ============================================
|
||||
|
||||
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
|
||||
BACKUP_DIR="$BACKUP_BASE/gitea-backup-$TIMESTAMP"
|
||||
ARCHIVE_NAME="gitea-backup-$TIMESTAMP.tar.gz"
|
||||
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
mkdir -p "$BACKUP_BASE"
|
||||
|
||||
log "=========================================="
|
||||
log " Бэкап Gitea (LXC)"
|
||||
log "=========================================="
|
||||
log ""
|
||||
log "Директория: $BACKUP_DIR"
|
||||
log "Архив: $BACKUP_BASE/$ARCHIVE_NAME"
|
||||
log ""
|
||||
|
||||
# Сохраняем версию
|
||||
GITEA_VERSION=$("$GITEA_BIN" --version 2>&1 | head -1)
|
||||
echo "$GITEA_VERSION" > "$BACKUP_DIR/gitea-version.txt"
|
||||
log "Версия Gitea: $GITEA_VERSION"
|
||||
|
||||
# ============================================
|
||||
# ШАГ 1: ДАМП POSTGRESQL
|
||||
# ============================================
|
||||
|
||||
log "Создание дампа PostgreSQL..."
|
||||
sudo -u postgres pg_dump -d "$DB_NAME" --no-owner --no-acl > "$BACKUP_DIR/database.sql"
|
||||
log " ✓ database.sql ($(du -h "$BACKUP_DIR/database.sql" | cut -f1))"
|
||||
|
||||
# ============================================
|
||||
# ШАГ 2: ОСТАНОВКА GITEA (для консистентности)
|
||||
# ============================================
|
||||
|
||||
GITEA_WAS_RUNNING=false
|
||||
if systemctl is-active --quiet gitea; then
|
||||
GITEA_WAS_RUNNING=true
|
||||
log "Остановка Gitea..."
|
||||
systemctl stop gitea
|
||||
sleep 2
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# ШАГ 3: GITEA DUMP
|
||||
# ============================================
|
||||
|
||||
log "Создание gitea dump..."
|
||||
|
||||
# gitea dump запускается от пользователя git, поэтому используем его директорию
|
||||
DUMP_TEMP="$GITEA_DATA/tmp-dump"
|
||||
mkdir -p "$DUMP_TEMP"
|
||||
chown git:git "$DUMP_TEMP"
|
||||
|
||||
# gitea dump создаёт архив с репозиториями и данными
|
||||
sudo -u git "$GITEA_BIN" dump \
|
||||
--config "$GITEA_CONFIG" \
|
||||
--work-path "$GITEA_DATA" \
|
||||
--file "$DUMP_TEMP/gitea-dump.zip" \
|
||||
--tempdir "$DUMP_TEMP" \
|
||||
--skip-db \
|
||||
--type zip 2>&1 | tee "$BACKUP_DIR/dump.log" || {
|
||||
warn "gitea dump завершился с предупреждениями (см. dump.log)"
|
||||
}
|
||||
|
||||
# Проверяем на фатальные ошибки
|
||||
if grep -q "\[F\]" "$BACKUP_DIR/dump.log" 2>/dev/null; then
|
||||
warn "Обнаружена фатальная ошибка в gitea dump:"
|
||||
grep "\[F\]" "$BACKUP_DIR/dump.log"
|
||||
fi
|
||||
|
||||
# Перемещаем результат в директорию бэкапа
|
||||
if [ -f "$DUMP_TEMP/gitea-dump.zip" ]; then
|
||||
mv "$DUMP_TEMP/gitea-dump.zip" "$BACKUP_DIR/"
|
||||
log " ✓ gitea-dump.zip ($(du -h "$BACKUP_DIR/gitea-dump.zip" | cut -f1))"
|
||||
else
|
||||
warn "gitea-dump.zip не создан, копируем данные вручную..."
|
||||
cp -a "$GITEA_DATA" "$BACKUP_DIR/data"
|
||||
log " ✓ data/ (ручное копирование)"
|
||||
fi
|
||||
|
||||
# Очищаем временную директорию
|
||||
rm -rf "$DUMP_TEMP"
|
||||
|
||||
# ============================================
|
||||
# ШАГ 4: КОПИРОВАНИЕ КОНФИГУРАЦИИ
|
||||
# ============================================
|
||||
|
||||
log "Копирование конфигурации..."
|
||||
cp "$GITEA_CONFIG" "$BACKUP_DIR/app.ini"
|
||||
log " ✓ app.ini"
|
||||
|
||||
# ============================================
|
||||
# ШАГ 5: ПЕРЕЗАПУСК GITEA
|
||||
# ============================================
|
||||
|
||||
if [ "$GITEA_WAS_RUNNING" = true ]; then
|
||||
log "Запуск Gitea..."
|
||||
systemctl start gitea
|
||||
log " ✓ Gitea запущена"
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# ШАГ 6: СОЗДАНИЕ АРХИВА
|
||||
# ============================================
|
||||
|
||||
log "Создание архива..."
|
||||
cd "$BACKUP_BASE"
|
||||
tar -czf "$ARCHIVE_NAME" -C "$BACKUP_BASE" "$(basename $BACKUP_DIR)"
|
||||
|
||||
ARCHIVE_SIZE=$(du -h "$BACKUP_BASE/$ARCHIVE_NAME" | cut -f1)
|
||||
log " ✓ $ARCHIVE_NAME ($ARCHIVE_SIZE)"
|
||||
|
||||
# Удаляем временную директорию
|
||||
rm -rf "$BACKUP_DIR"
|
||||
trap - EXIT
|
||||
|
||||
# ============================================
|
||||
# ШАГ 7: РОТАЦИЯ СТАРЫХ БЭКАПОВ
|
||||
# ============================================
|
||||
|
||||
if [ "$KEEP_BACKUPS" -gt 0 ]; then
|
||||
log "Ротация бэкапов (храним $KEEP_BACKUPS)..."
|
||||
cd "$BACKUP_BASE"
|
||||
ls -t gitea-backup-*.tar.gz 2>/dev/null | tail -n +$((KEEP_BACKUPS + 1)) | xargs -r rm -f
|
||||
CURRENT_COUNT=$(ls -1 gitea-backup-*.tar.gz 2>/dev/null | wc -l)
|
||||
log " ✓ Текущих бэкапов: $CURRENT_COUNT"
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# ШАГ 8: ОТПРАВКА НА УДАЛЁННЫЙ СЕРВЕР
|
||||
# ============================================
|
||||
|
||||
if [ -n "$REMOTE_BACKUP" ]; then
|
||||
log "Отправка на удалённый сервер: $REMOTE_BACKUP"
|
||||
if scp "$BACKUP_BASE/$ARCHIVE_NAME" "$REMOTE_BACKUP/"; then
|
||||
log " ✓ Отправлено"
|
||||
else
|
||||
warn "Не удалось отправить бэкап"
|
||||
fi
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# ИТОГИ
|
||||
# ============================================
|
||||
|
||||
log ""
|
||||
log "=========================================="
|
||||
log " ✅ Бэкап завершён!"
|
||||
log "=========================================="
|
||||
log ""
|
||||
log "Файл: $BACKUP_BASE/$ARCHIVE_NAME"
|
||||
log "Размер: $ARCHIVE_SIZE"
|
||||
log ""
|
||||
log "Содержимое архива:"
|
||||
log " - database.sql (PostgreSQL дамп)"
|
||||
log " - gitea-dump.zip (репозитории, LFS, данные)"
|
||||
log " - app.ini (конфигурация)"
|
||||
log " - gitea-version.txt"
|
||||
log ""
|
||||
|
||||
# Возвращаем путь к архиву (для скриптов)
|
||||
echo "$BACKUP_BASE/$ARCHIVE_NAME"
|
||||
207
backup-scripts/backup-proxmox.sh
Executable file
207
backup-scripts/backup-proxmox.sh
Executable file
@@ -0,0 +1,207 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Скрипт бэкапа Gitea LXC контейнера с Proxmox хоста
|
||||
# Запускать НА PROXMOX хосте
|
||||
#
|
||||
# Выполняет:
|
||||
# 1. Бэкап на уровне приложения (gitea dump + pg_dump) внутри LXC
|
||||
# 2. vzdump - полный бэкап контейнера (опционально)
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
# ============================================
|
||||
# НАСТРОЙКИ
|
||||
# ============================================
|
||||
|
||||
# ID LXC контейнера с Gitea
|
||||
LXC_ID="${LXC_ID:-300}"
|
||||
|
||||
# Директория для хранения бэкапов на Proxmox
|
||||
BACKUP_STORAGE="${BACKUP_STORAGE:-/var/lib/vz/dump}"
|
||||
|
||||
# Делать ли полный vzdump контейнера (занимает много места)
|
||||
DO_VZDUMP="${DO_VZDUMP:-false}"
|
||||
|
||||
# Сжатие для vzdump: zstd, gzip, lzo, none
|
||||
VZDUMP_COMPRESS="${VZDUMP_COMPRESS:-zstd}"
|
||||
|
||||
# Сколько бэкапов хранить
|
||||
KEEP_BACKUPS="${KEEP_BACKUPS:-7}"
|
||||
|
||||
# Сколько vzdump хранить (они большие!)
|
||||
KEEP_VZDUMP="${KEEP_VZDUMP:-3}"
|
||||
|
||||
# Удалённый сервер для копирования (опционально)
|
||||
REMOTE_BACKUP="${REMOTE_BACKUP:-}" # user@host:/path
|
||||
|
||||
# ============================================
|
||||
# ФУНКЦИИ
|
||||
# ============================================
|
||||
|
||||
log() {
|
||||
echo -e "\033[1;34m[$(date '+%Y-%m-%d %H:%M:%S')]\033[0m $1"
|
||||
}
|
||||
|
||||
warn() {
|
||||
echo -e "\033[1;33m[WARN]\033[0m $1"
|
||||
}
|
||||
|
||||
error() {
|
||||
echo -e "\033[1;31m[ERROR]\033[0m $1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# ============================================
|
||||
# ПРОВЕРКИ
|
||||
# ============================================
|
||||
|
||||
if ! command -v pct &>/dev/null; then
|
||||
error "Этот скрипт должен запускаться на Proxmox хосте"
|
||||
fi
|
||||
|
||||
if ! pct status "$LXC_ID" &>/dev/null; then
|
||||
error "LXC контейнер $LXC_ID не найден"
|
||||
fi
|
||||
|
||||
LXC_STATUS=$(pct status "$LXC_ID" | awk '{print $2}')
|
||||
if [ "$LXC_STATUS" != "running" ]; then
|
||||
error "LXC контейнер $LXC_ID не запущен (статус: $LXC_STATUS)"
|
||||
fi
|
||||
|
||||
mkdir -p "$BACKUP_STORAGE"
|
||||
|
||||
# ============================================
|
||||
# ПЕРЕМЕННЫЕ
|
||||
# ============================================
|
||||
|
||||
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
|
||||
GITEA_BACKUP_DIR="/var/backups/gitea"
|
||||
|
||||
log "=========================================="
|
||||
log " Бэкап Gitea LXC (ID: $LXC_ID)"
|
||||
log "=========================================="
|
||||
log ""
|
||||
|
||||
# ============================================
|
||||
# ШАГ 1: БЭКАП НА УРОВНЕ ПРИЛОЖЕНИЯ
|
||||
# ============================================
|
||||
|
||||
log "Запуск бэкапа Gitea внутри LXC..."
|
||||
|
||||
# Копируем скрипт бэкапа в контейнер
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
if [ -f "$SCRIPT_DIR/backup-gitea-lxc.sh" ]; then
|
||||
pct push "$LXC_ID" "$SCRIPT_DIR/backup-gitea-lxc.sh" /root/backup-gitea-lxc.sh
|
||||
pct exec "$LXC_ID" -- chmod +x /root/backup-gitea-lxc.sh
|
||||
fi
|
||||
|
||||
# Запускаем бэкап внутри контейнера
|
||||
BACKUP_OUTPUT=$(pct exec "$LXC_ID" -- bash -c "KEEP_BACKUPS=$KEEP_BACKUPS /root/backup-gitea-lxc.sh" 2>&1) || {
|
||||
echo "$BACKUP_OUTPUT"
|
||||
error "Бэкап внутри LXC завершился с ошибкой"
|
||||
}
|
||||
|
||||
echo "$BACKUP_OUTPUT"
|
||||
|
||||
# Получаем путь к созданному архиву (последняя строка вывода)
|
||||
LXC_BACKUP_FILE=$(echo "$BACKUP_OUTPUT" | tail -1)
|
||||
|
||||
if [ -z "$LXC_BACKUP_FILE" ] || ! pct exec "$LXC_ID" -- test -f "$LXC_BACKUP_FILE"; then
|
||||
# Ищем последний бэкап
|
||||
LXC_BACKUP_FILE=$(pct exec "$LXC_ID" -- ls -t "$GITEA_BACKUP_DIR"/gitea-backup-*.tar.gz 2>/dev/null | head -1)
|
||||
fi
|
||||
|
||||
if [ -n "$LXC_BACKUP_FILE" ]; then
|
||||
log "Копирование бэкапа из LXC..."
|
||||
BACKUP_NAME=$(basename "$LXC_BACKUP_FILE")
|
||||
pct pull "$LXC_ID" "$LXC_BACKUP_FILE" "$BACKUP_STORAGE/$BACKUP_NAME"
|
||||
log " ✓ $BACKUP_STORAGE/$BACKUP_NAME"
|
||||
|
||||
# Удаляем архив из LXC (хранятся только на Proxmox)
|
||||
pct exec "$LXC_ID" -- rm -f "$LXC_BACKUP_FILE"
|
||||
log " ✓ Удалён из LXC (хранится только на Proxmox)"
|
||||
else
|
||||
warn "Не удалось найти архив бэкапа в LXC"
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# ШАГ 2: VZDUMP (полный бэкап контейнера)
|
||||
# ============================================
|
||||
|
||||
if [ "$DO_VZDUMP" = "true" ]; then
|
||||
log ""
|
||||
log "Создание полного бэкапа контейнера (vzdump)..."
|
||||
|
||||
vzdump "$LXC_ID" \
|
||||
--compress "$VZDUMP_COMPRESS" \
|
||||
--storage local \
|
||||
--mode snapshot \
|
||||
--notes "Gitea backup $TIMESTAMP" \
|
||||
2>&1 | while read line; do log " $line"; done
|
||||
|
||||
log " ✓ vzdump завершён"
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# ШАГ 3: ОТПРАВКА НА УДАЛЁННЫЙ СЕРВЕР
|
||||
# ============================================
|
||||
|
||||
if [ -n "$REMOTE_BACKUP" ] && [ -n "$BACKUP_NAME" ]; then
|
||||
log ""
|
||||
log "Отправка на удалённый сервер: $REMOTE_BACKUP"
|
||||
if scp "$BACKUP_STORAGE/$BACKUP_NAME" "$REMOTE_BACKUP/"; then
|
||||
log " ✓ Отправлено"
|
||||
else
|
||||
warn "Не удалось отправить"
|
||||
fi
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# ШАГ 4: РОТАЦИЯ БЭКАПОВ
|
||||
# ============================================
|
||||
|
||||
if [ "$KEEP_BACKUPS" -gt 0 ]; then
|
||||
log ""
|
||||
log "Ротация gitea бэкапов (храним $KEEP_BACKUPS)..."
|
||||
cd "$BACKUP_STORAGE"
|
||||
ls -t gitea-backup-*.tar.gz 2>/dev/null | tail -n +$((KEEP_BACKUPS + 1)) | xargs -r rm -f
|
||||
log " ✓ Готово"
|
||||
fi
|
||||
|
||||
# Ротация vzdump (они большие!)
|
||||
if [ "$KEEP_VZDUMP" -gt 0 ] && [ "$DO_VZDUMP" = "true" ]; then
|
||||
log "Ротация vzdump бэкапов (храним $KEEP_VZDUMP)..."
|
||||
cd "$BACKUP_STORAGE"
|
||||
# Удаляем старые .tar.zst, .tar.gz, .tar.lzo и соответствующие .log файлы
|
||||
for ext in tar.zst tar.gz tar.lzo vma.zst vma.gz vma.lzo; do
|
||||
ls -t vzdump-lxc-${LXC_ID}-*.$ext 2>/dev/null | tail -n +$((KEEP_VZDUMP + 1)) | while read f; do
|
||||
rm -f "$f" "${f%.${ext}}.log"
|
||||
log " Удалён: $(basename $f)"
|
||||
done
|
||||
done
|
||||
log " ✓ Готово"
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# ИТОГИ
|
||||
# ============================================
|
||||
|
||||
log ""
|
||||
log "=========================================="
|
||||
log " ✅ Бэкап завершён!"
|
||||
log "=========================================="
|
||||
log ""
|
||||
log "Бэкапы Gitea:"
|
||||
ls -lh "$BACKUP_STORAGE"/gitea-backup-*.tar.gz 2>/dev/null | tail -5 || echo " (нет)"
|
||||
log ""
|
||||
|
||||
if [ "$DO_VZDUMP" = "true" ]; then
|
||||
log "Бэкапы vzdump:"
|
||||
ls -lh "$BACKUP_STORAGE"/vzdump-lxc-${LXC_ID}-*.* 2>/dev/null | tail -3 || echo " (нет)"
|
||||
log ""
|
||||
fi
|
||||
|
||||
log "Следующий бэкап по расписанию или вручную:"
|
||||
log " $0"
|
||||
log ""
|
||||
494
backup-scripts/restore-gitea.sh
Executable file
494
backup-scripts/restore-gitea.sh
Executable file
@@ -0,0 +1,494 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Скрипт восстановления Gitea из бэкапа
|
||||
# Основан на рекомендациях: https://docs.gitea.com/administration/backup-and-restore
|
||||
#
|
||||
# Поддерживает:
|
||||
# - Архивы созданные через `gitea dump`
|
||||
# - Нативные дампы PostgreSQL
|
||||
# - Ручные бэкапы директорий
|
||||
#
|
||||
# База данных: PostgreSQL
|
||||
# Запускать в LXC контейнере ПОСЛЕ установки Gitea
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
# ============================================
|
||||
# НАСТРОЙКИ
|
||||
# ============================================
|
||||
|
||||
# Путь к архиву бэкапа
|
||||
BACKUP_ARCHIVE="${1:-}"
|
||||
|
||||
# Новый домен/IP (оставьте пустым для автоопределения)
|
||||
NEW_DOMAIN="${NEW_DOMAIN:-$(hostname -I | awk '{print $1}')}"
|
||||
|
||||
# Новый порт
|
||||
NEW_PORT="${NEW_PORT:-3000}"
|
||||
|
||||
# Credentials для PostgreSQL
|
||||
DB_USER="${DB_USER:-gitea}"
|
||||
DB_NAME="${DB_NAME:-gitea}"
|
||||
DB_PASSWORD="${DB_PASSWORD:-gitea}"
|
||||
DB_HOST="${DB_HOST:-127.0.0.1}"
|
||||
|
||||
# Пути Gitea (для нативной установки в LXC)
|
||||
# Согласно https://docs.gitea.com/administration/backup-and-restore#restore-command-restore
|
||||
GITEA_USER="git"
|
||||
GITEA_HOME="/home/git"
|
||||
GITEA_WORK_DIR="/var/lib/gitea"
|
||||
GITEA_CONFIG="/etc/gitea/app.ini"
|
||||
GITEA_CUSTOM="/var/lib/gitea/custom"
|
||||
GITEA_DATA="/var/lib/gitea/data"
|
||||
GITEA_REPOS="/var/lib/gitea/data/gitea-repositories"
|
||||
GITEA_LOG="/var/lib/gitea/log"
|
||||
GITEA_BIN="/usr/local/bin/gitea"
|
||||
|
||||
# ============================================
|
||||
# ФУНКЦИИ
|
||||
# ============================================
|
||||
|
||||
log() {
|
||||
echo -e "\033[1;32m[$(date '+%H:%M:%S')]\033[0m $1"
|
||||
}
|
||||
|
||||
warn() {
|
||||
echo -e "\033[1;33m[WARNING]\033[0m $1"
|
||||
}
|
||||
|
||||
error() {
|
||||
echo -e "\033[1;31m[ERROR]\033[0m $1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
# ============================================
|
||||
# ПРОВЕРКИ
|
||||
# ============================================
|
||||
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
error "Запустите скрипт от root: sudo $0 /path/to/backup.tar.gz"
|
||||
fi
|
||||
|
||||
if [ -z "$BACKUP_ARCHIVE" ]; then
|
||||
echo "Использование: $0 <путь_к_архиву_бэкапа>"
|
||||
echo ""
|
||||
echo "Примеры:"
|
||||
echo " $0 /tmp/gitea-backup-20240115-120000.tar.gz"
|
||||
echo ""
|
||||
echo "Переменные окружения:"
|
||||
echo " NEW_DOMAIN - новый домен/IP для Gitea (default: auto)"
|
||||
echo " NEW_PORT - HTTP порт (default: 3000)"
|
||||
echo " DB_USER - пользователь PostgreSQL (default: gitea)"
|
||||
echo " DB_PASSWORD - пароль PostgreSQL (default: gitea)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$BACKUP_ARCHIVE" ]; then
|
||||
error "Файл бэкапа не найден: $BACKUP_ARCHIVE"
|
||||
fi
|
||||
|
||||
# Установка необходимых утилит
|
||||
log "Проверка зависимостей..."
|
||||
if ! command -v unzip &> /dev/null; then
|
||||
log " Установка unzip..."
|
||||
apt-get update -qq && apt-get install -y -qq unzip
|
||||
fi
|
||||
|
||||
log "=========================================="
|
||||
log " Восстановление Gitea из бэкапа"
|
||||
log "=========================================="
|
||||
log ""
|
||||
log "Архив: $BACKUP_ARCHIVE"
|
||||
log "Новый домен: $NEW_DOMAIN"
|
||||
log "Новый порт: $NEW_PORT"
|
||||
log "База данных: PostgreSQL ($DB_USER@$DB_NAME)"
|
||||
log ""
|
||||
|
||||
# ============================================
|
||||
# РАСПАКОВКА
|
||||
# ============================================
|
||||
|
||||
log "Распаковка архива..."
|
||||
TEMP_DIR=$(mktemp -d)
|
||||
cd "$TEMP_DIR"
|
||||
|
||||
# Определяем тип архива и распаковываем
|
||||
case "$BACKUP_ARCHIVE" in
|
||||
*.tar.gz|*.tgz)
|
||||
tar -xzf "$BACKUP_ARCHIVE"
|
||||
;;
|
||||
*.zip)
|
||||
unzip -q "$BACKUP_ARCHIVE"
|
||||
;;
|
||||
*)
|
||||
tar -xf "$BACKUP_ARCHIVE" 2>/dev/null || unzip -q "$BACKUP_ARCHIVE" 2>/dev/null
|
||||
;;
|
||||
esac
|
||||
|
||||
# Находим директорию с данными
|
||||
BACKUP_DIR=$(find . -maxdepth 1 -type d -name "gitea-backup*" | head -1)
|
||||
if [ -z "$BACKUP_DIR" ] || [ "$BACKUP_DIR" = "." ]; then
|
||||
BACKUP_DIR="."
|
||||
fi
|
||||
|
||||
log "Директория бэкапа: $BACKUP_DIR"
|
||||
log "Содержимое:"
|
||||
ls -la "$BACKUP_DIR"
|
||||
echo ""
|
||||
|
||||
# ============================================
|
||||
# ОСТАНОВКА GITEA
|
||||
# ============================================
|
||||
|
||||
log "Остановка Gitea..."
|
||||
systemctl stop gitea 2>/dev/null || true
|
||||
sleep 2
|
||||
|
||||
# ============================================
|
||||
# ОПРЕДЕЛЕНИЕ ТИПА БЭКАПА
|
||||
# ============================================
|
||||
|
||||
log "Анализ бэкапа..."
|
||||
|
||||
# Читаем информацию о версии
|
||||
if [ -f "$BACKUP_DIR/gitea-version.txt" ]; then
|
||||
OLD_VERSION=$(cat "$BACKUP_DIR/gitea-version.txt")
|
||||
log " Версия Gitea в бэкапе: $OLD_VERSION"
|
||||
fi
|
||||
|
||||
# Проверяем наличие gitea dump архива
|
||||
GITEA_DUMP=""
|
||||
for ext in zip tar.gz; do
|
||||
if [ -f "$BACKUP_DIR/gitea-dump.$ext" ]; then
|
||||
GITEA_DUMP="$BACKUP_DIR/gitea-dump.$ext"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# Или ищем по паттерну
|
||||
if [ -z "$GITEA_DUMP" ]; then
|
||||
GITEA_DUMP=$(find "$BACKUP_DIR" -name "gitea-dump-*.zip" -o -name "gitea-dump-*.tar.gz" 2>/dev/null | head -1)
|
||||
fi
|
||||
|
||||
if [ -n "$GITEA_DUMP" ]; then
|
||||
log " Найден gitea dump: $(basename $GITEA_DUMP)"
|
||||
fi
|
||||
|
||||
# Проверяем нативный дамп PostgreSQL
|
||||
NATIVE_DB_DUMP=""
|
||||
if [ -f "$BACKUP_DIR/gitea-db-native.sql" ]; then
|
||||
NATIVE_DB_DUMP="$BACKUP_DIR/gitea-db-native.sql"
|
||||
log " Найден нативный дамп PostgreSQL: gitea-db-native.sql"
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# ВОССТАНОВЛЕНИЕ POSTGRESQL
|
||||
# ============================================
|
||||
|
||||
log "Восстановление базы данных PostgreSQL..."
|
||||
|
||||
if [ -n "$NATIVE_DB_DUMP" ]; then
|
||||
log " Восстановление из нативного дампа..."
|
||||
|
||||
# Пересоздаём БД
|
||||
sudo -u postgres psql -c "DROP DATABASE IF EXISTS $DB_NAME;" 2>/dev/null || true
|
||||
sudo -u postgres psql -c "CREATE DATABASE $DB_NAME OWNER $DB_USER;" 2>/dev/null || \
|
||||
sudo -u postgres psql -c "CREATE DATABASE $DB_NAME;" 2>/dev/null
|
||||
|
||||
# Импортируем
|
||||
PGPASSWORD="$DB_PASSWORD" psql -U "$DB_USER" -h "$DB_HOST" -d "$DB_NAME" < "$NATIVE_DB_DUMP"
|
||||
log " ✓ PostgreSQL база восстановлена"
|
||||
else
|
||||
# Пробуем из gitea dump
|
||||
if [ -n "$GITEA_DUMP" ]; then
|
||||
DUMP_TEMP=$(mktemp -d)
|
||||
case "$GITEA_DUMP" in
|
||||
*.zip) unzip -q "$GITEA_DUMP" -d "$DUMP_TEMP" ;;
|
||||
*.tar.gz) tar -xzf "$GITEA_DUMP" -C "$DUMP_TEMP" ;;
|
||||
esac
|
||||
|
||||
SQL_FILE=$(find "$DUMP_TEMP" -name "gitea-db.sql" 2>/dev/null | head -1)
|
||||
if [ -n "$SQL_FILE" ]; then
|
||||
warn " Используем дамп из gitea dump (рекомендуется нативный)"
|
||||
|
||||
sudo -u postgres psql -c "DROP DATABASE IF EXISTS $DB_NAME;" 2>/dev/null || true
|
||||
sudo -u postgres psql -c "CREATE DATABASE $DB_NAME OWNER $DB_USER;" 2>/dev/null
|
||||
|
||||
PGPASSWORD="$DB_PASSWORD" psql -U "$DB_USER" -h "$DB_HOST" -d "$DB_NAME" < "$SQL_FILE"
|
||||
log " ✓ PostgreSQL база восстановлена из gitea dump"
|
||||
else
|
||||
warn " SQL дамп не найден в бэкапе"
|
||||
fi
|
||||
else
|
||||
warn " Дамп базы данных не найден!"
|
||||
fi
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# ВОССТАНОВЛЕНИЕ ДАННЫХ ИЗ GITEA DUMP
|
||||
# Согласно: https://docs.gitea.com/administration/backup-and-restore#restore-command-restore
|
||||
# Структура gitea dump:
|
||||
# - app.ini (опционально)
|
||||
# - custom/ - кастомизации
|
||||
# - data/ - данные (attachments, avatars, lfs, indexers)
|
||||
# - repos/ - репозитории
|
||||
# - gitea-db.sql - дамп БД
|
||||
# - log/ - логи (не нужны для восстановления)
|
||||
# ============================================
|
||||
|
||||
if [ -n "$GITEA_DUMP" ]; then
|
||||
log "Восстановление данных из gitea dump..."
|
||||
|
||||
# Убедимся что архив распакован
|
||||
if [ -z "$DUMP_TEMP" ]; then
|
||||
DUMP_TEMP=$(mktemp -d)
|
||||
case "$GITEA_DUMP" in
|
||||
*.zip) unzip -q "$GITEA_DUMP" -d "$DUMP_TEMP" ;;
|
||||
*.tar.gz) tar -xzf "$GITEA_DUMP" -C "$DUMP_TEMP" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
log " Содержимое gitea dump:"
|
||||
ls -la "$DUMP_TEMP"
|
||||
echo ""
|
||||
|
||||
# Создаём необходимые директории
|
||||
mkdir -p "$GITEA_DATA" "$GITEA_REPOS" "$GITEA_CUSTOM" "$GITEA_LOG"
|
||||
|
||||
# 1. Репозитории: repos/ -> GITEA_REPOS
|
||||
if [ -d "$DUMP_TEMP/repos" ]; then
|
||||
log " → Репозитории (repos/ -> $GITEA_REPOS)..."
|
||||
cp -r "$DUMP_TEMP/repos/"* "$GITEA_REPOS/" 2>/dev/null || true
|
||||
log " Скопировано: $(ls -1 "$GITEA_REPOS" 2>/dev/null | wc -l) элементов"
|
||||
else
|
||||
warn " Директория repos/ не найдена в dump"
|
||||
fi
|
||||
|
||||
# 2. Data директория: data/ -> GITEA_DATA
|
||||
if [ -d "$DUMP_TEMP/data" ]; then
|
||||
log " → Data директория (data/ -> $GITEA_DATA)..."
|
||||
for item in "$DUMP_TEMP/data/"*; do
|
||||
if [ -e "$item" ]; then
|
||||
item_name=$(basename "$item")
|
||||
if [ "$item_name" != "conf" ]; then
|
||||
cp -r "$item" "$GITEA_DATA/" 2>/dev/null || true
|
||||
fi
|
||||
fi
|
||||
done
|
||||
log " Скопировано в data/"
|
||||
fi
|
||||
|
||||
# 3. Custom директория: custom/ -> GITEA_CUSTOM
|
||||
if [ -d "$DUMP_TEMP/custom" ]; then
|
||||
log " → Custom директория (custom/ -> $GITEA_CUSTOM)..."
|
||||
cp -r "$DUMP_TEMP/custom/"* "$GITEA_CUSTOM/" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# 4. Логи: log/ -> GITEA_LOG (опционально)
|
||||
if [ -d "$DUMP_TEMP/log" ]; then
|
||||
log " → Логи (log/ -> $GITEA_LOG)..."
|
||||
cp -r "$DUMP_TEMP/log/"* "$GITEA_LOG/" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# 5. LFS данные (если отдельно)
|
||||
if [ -d "$DUMP_TEMP/lfs" ]; then
|
||||
log " → LFS данные..."
|
||||
mkdir -p "$GITEA_DATA/lfs"
|
||||
cp -r "$DUMP_TEMP/lfs/"* "$GITEA_DATA/lfs/" 2>/dev/null || true
|
||||
fi
|
||||
|
||||
log " ✓ Данные из gitea dump восстановлены"
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# ВОССТАНОВЛЕНИЕ ИЗ РУЧНОГО БЭКАПА (fallback)
|
||||
# ============================================
|
||||
|
||||
if [ -z "$GITEA_DUMP" ] && [ -d "$BACKUP_DIR/data" ]; then
|
||||
log "Восстановление из ручного бэкапа..."
|
||||
|
||||
# Репозитории
|
||||
for repo_dir in "gitea-repositories" "git/repositories" "repositories"; do
|
||||
if [ -d "$BACKUP_DIR/data/$repo_dir" ]; then
|
||||
log " → Репозитории ($repo_dir)..."
|
||||
mkdir -p "$GITEA_REPOS"
|
||||
cp -r "$BACKUP_DIR/data/$repo_dir/"* "$GITEA_REPOS/" 2>/dev/null || true
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
# Остальные данные
|
||||
for subdir in avatars attachments lfs packages; do
|
||||
if [ -d "$BACKUP_DIR/data/$subdir" ]; then
|
||||
log " → $subdir..."
|
||||
mkdir -p "$GITEA_DATA/$subdir"
|
||||
cp -r "$BACKUP_DIR/data/$subdir/"* "$GITEA_DATA/$subdir/" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# ВОССТАНОВЛЕНИЕ КОНФИГУРАЦИИ
|
||||
# ============================================
|
||||
|
||||
log "Восстановление конфигурации..."
|
||||
|
||||
if [ -f "$BACKUP_DIR/app.ini" ]; then
|
||||
# Сохраняем бэкап текущего конфига
|
||||
if [ -f "$GITEA_CONFIG" ]; then
|
||||
cp "$GITEA_CONFIG" "$GITEA_CONFIG.new-install-backup"
|
||||
fi
|
||||
|
||||
# Копируем конфиг из бэкапа
|
||||
cp "$BACKUP_DIR/app.ini" "$GITEA_CONFIG"
|
||||
log " ✓ app.ini восстановлен"
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# ОБНОВЛЕНИЕ КОНФИГУРАЦИИ ДЛЯ НОВОГО СЕРВЕРА
|
||||
# ============================================
|
||||
|
||||
log "Обновление конфигурации для нового сервера..."
|
||||
|
||||
if [ -f "$GITEA_CONFIG" ]; then
|
||||
log " Исходный app.ini:"
|
||||
grep -E "^(DOMAIN|ROOT_URL|ROOT|WORK_PATH|RUN_USER|HOST)\s*=" "$GITEA_CONFIG" 2>/dev/null | head -10 || true
|
||||
echo ""
|
||||
|
||||
# === [server] секция ===
|
||||
sed -i "s|^DOMAIN\s*=.*|DOMAIN = $NEW_DOMAIN|" "$GITEA_CONFIG"
|
||||
sed -i "s|^SSH_DOMAIN\s*=.*|SSH_DOMAIN = $NEW_DOMAIN|" "$GITEA_CONFIG"
|
||||
sed -i "s|^ROOT_URL\s*=.*|ROOT_URL = http://$NEW_DOMAIN:$NEW_PORT/|" "$GITEA_CONFIG"
|
||||
sed -i "s|^HTTP_PORT\s*=.*|HTTP_PORT = $NEW_PORT|" "$GITEA_CONFIG"
|
||||
|
||||
# === [repository] секция ===
|
||||
sed -i "s|^ROOT\s*=.*/git/repositories.*|ROOT = $GITEA_REPOS|" "$GITEA_CONFIG"
|
||||
sed -i "s|^ROOT\s*=.*/data/git/repositories.*|ROOT = $GITEA_REPOS|" "$GITEA_CONFIG"
|
||||
sed -i "s|^ROOT\s*=.*/gitea-repositories.*|ROOT = $GITEA_REPOS|" "$GITEA_CONFIG"
|
||||
|
||||
# === Глобальные пути ===
|
||||
sed -i "s|^WORK_PATH\s*=.*/var/lib/gitea.*|WORK_PATH = $GITEA_WORK_DIR|" "$GITEA_CONFIG"
|
||||
sed -i "s|^WORK_PATH\s*=.*/data.*|WORK_PATH = $GITEA_WORK_DIR|" "$GITEA_CONFIG"
|
||||
sed -i "s|^WORK_PATH\s*=.*/app/gitea.*|WORK_PATH = $GITEA_WORK_DIR|" "$GITEA_CONFIG"
|
||||
|
||||
# === [database] секция - PostgreSQL ===
|
||||
sed -i "s|^HOST\s*=.*db:.*|HOST = $DB_HOST:5432|" "$GITEA_CONFIG"
|
||||
sed -i "s|^HOST\s*=.*gitea-db.*|HOST = $DB_HOST:5432|" "$GITEA_CONFIG"
|
||||
|
||||
# === [log] секция ===
|
||||
sed -i "s|^ROOT_PATH\s*=.*/log.*|ROOT_PATH = $GITEA_LOG|" "$GITEA_CONFIG"
|
||||
|
||||
# === [server] LFS ===
|
||||
sed -i "s|^LFS_CONTENT_PATH\s*=.*|LFS_CONTENT_PATH = $GITEA_DATA/lfs|" "$GITEA_CONFIG"
|
||||
|
||||
# === [security] секция ===
|
||||
sed -i "s|^INSTALL_LOCK\s*=.*|INSTALL_LOCK = true|" "$GITEA_CONFIG"
|
||||
|
||||
# === Глобальные настройки ===
|
||||
sed -i "s|^RUN_USER\s*=.*|RUN_USER = $GITEA_USER|" "$GITEA_CONFIG"
|
||||
|
||||
log " Обновлённый app.ini:"
|
||||
grep -E "^(DOMAIN|ROOT_URL|ROOT|WORK_PATH|RUN_USER|HOST)\s*=" "$GITEA_CONFIG" 2>/dev/null | head -10 || true
|
||||
echo ""
|
||||
|
||||
log " ✓ Конфигурация обновлена"
|
||||
log " Domain: $NEW_DOMAIN"
|
||||
log " Port: $NEW_PORT"
|
||||
log " Repos: $GITEA_REPOS"
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# ПРАВА ДОСТУПА
|
||||
# ============================================
|
||||
|
||||
log "Установка прав доступа..."
|
||||
|
||||
chown -R $GITEA_USER:$GITEA_USER "$GITEA_WORK_DIR"
|
||||
chown -R $GITEA_USER:$GITEA_USER "$GITEA_HOME" 2>/dev/null || true
|
||||
chown root:$GITEA_USER "$GITEA_CONFIG"
|
||||
chmod 640 "$GITEA_CONFIG"
|
||||
chmod -R 750 "$GITEA_REPOS" 2>/dev/null || true
|
||||
|
||||
log " ✓ Права установлены"
|
||||
|
||||
# ============================================
|
||||
# РЕГЕНЕРАЦИЯ SSH КЛЮЧЕЙ
|
||||
# ============================================
|
||||
|
||||
log "Регенерация SSH authorized_keys..."
|
||||
|
||||
mkdir -p "$GITEA_HOME/.ssh"
|
||||
touch "$GITEA_HOME/.ssh/authorized_keys"
|
||||
chown -R $GITEA_USER:$GITEA_USER "$GITEA_HOME/.ssh"
|
||||
chmod 700 "$GITEA_HOME/.ssh"
|
||||
chmod 600 "$GITEA_HOME/.ssh/authorized_keys"
|
||||
|
||||
sudo -u $GITEA_USER $GITEA_BIN admin regenerate keys -c "$GITEA_CONFIG" 2>/dev/null && \
|
||||
log " ✓ SSH ключи регенерированы" || \
|
||||
warn " Не удалось регенерировать SSH ключи (возможно нет пользователей с ключами)"
|
||||
|
||||
# ============================================
|
||||
# РЕГЕНЕРАЦИЯ GIT HOOKS (КРИТИЧНО!)
|
||||
# Согласно документации: ./gitea admin regenerate hooks
|
||||
# Без этого git push не будет работать!
|
||||
# ============================================
|
||||
|
||||
log "Регенерация Git hooks..."
|
||||
sudo -u $GITEA_USER $GITEA_BIN admin regenerate hooks -c "$GITEA_CONFIG" 2>/dev/null && \
|
||||
log " ✓ Git hooks регенерированы" || \
|
||||
warn " Не удалось регенерировать hooks (выполните вручную после запуска)"
|
||||
|
||||
# ============================================
|
||||
# ОЧИСТКА
|
||||
# ============================================
|
||||
|
||||
log "Очистка временных файлов..."
|
||||
rm -rf "$TEMP_DIR"
|
||||
[ -n "$DUMP_TEMP" ] && rm -rf "$DUMP_TEMP"
|
||||
|
||||
# ============================================
|
||||
# ЗАПУСК GITEA
|
||||
# ============================================
|
||||
|
||||
log "Запуск Gitea..."
|
||||
systemctl start gitea
|
||||
sleep 3
|
||||
|
||||
if systemctl is-active --quiet gitea; then
|
||||
log "✅ Gitea успешно запущена!"
|
||||
else
|
||||
warn "Gitea не запустилась автоматически"
|
||||
echo ""
|
||||
echo "Проверьте логи:"
|
||||
echo " journalctl -u gitea -e"
|
||||
echo " cat $GITEA_WORK_DIR/log/gitea.log"
|
||||
fi
|
||||
|
||||
# ============================================
|
||||
# ИТОГИ
|
||||
# ============================================
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " ✅ Восстановление завершено!"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo " Gitea доступна: http://$NEW_DOMAIN:$NEW_PORT"
|
||||
echo ""
|
||||
echo " Конфигурация: $GITEA_CONFIG"
|
||||
echo " Данные: $GITEA_WORK_DIR"
|
||||
echo ""
|
||||
echo " Проверьте:"
|
||||
echo " ☐ Авторизация пользователей"
|
||||
echo " ☐ Список репозиториев"
|
||||
echo " ☐ Git clone/push операции"
|
||||
echo " ☐ Webhooks (если используются)"
|
||||
echo ""
|
||||
echo " Если есть проблемы, выполните:"
|
||||
echo " sudo -u git $GITEA_BIN doctor check --all --fix -c $GITEA_CONFIG"
|
||||
echo " sudo -u git $GITEA_BIN admin regenerate hooks -c $GITEA_CONFIG"
|
||||
echo ""
|
||||
echo " Логи: journalctl -u gitea -f"
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
60
backup-scripts/setup-backup-cron.sh
Executable file
60
backup-scripts/setup-backup-cron.sh
Executable file
@@ -0,0 +1,60 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Настройка автоматического бэкапа Gitea
|
||||
# Запускать на Proxmox хосте
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
LXC_ID="${LXC_ID:-300}"
|
||||
BACKUP_TIME="${BACKUP_TIME:-12:00}" # Время бэкапа (HH:MM)
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
|
||||
echo "Настройка автоматического бэкапа Gitea"
|
||||
echo ""
|
||||
echo "LXC контейнер: $LXC_ID"
|
||||
echo "Время бэкапа: $BACKUP_TIME ежедневно"
|
||||
echo ""
|
||||
|
||||
# Копируем скрипты
|
||||
echo "Копирование скриптов..."
|
||||
cp "$SCRIPT_DIR/backup-proxmox.sh" /usr/local/bin/gitea-backup
|
||||
cp "$SCRIPT_DIR/backup-gitea-lxc.sh" /usr/local/bin/gitea-backup-lxc
|
||||
chmod +x /usr/local/bin/gitea-backup /usr/local/bin/gitea-backup-lxc
|
||||
|
||||
# Копируем скрипт в LXC
|
||||
pct push "$LXC_ID" "$SCRIPT_DIR/backup-gitea-lxc.sh" /root/backup-gitea-lxc.sh
|
||||
pct exec "$LXC_ID" -- chmod +x /root/backup-gitea-lxc.sh
|
||||
|
||||
# Парсим время
|
||||
HOUR=$(echo "$BACKUP_TIME" | cut -d: -f1)
|
||||
MINUTE=$(echo "$BACKUP_TIME" | cut -d: -f2)
|
||||
|
||||
# Создаём cron задачу
|
||||
CRON_FILE="/etc/cron.d/gitea-backup"
|
||||
cat > "$CRON_FILE" << EOF
|
||||
# Автоматический бэкап Gitea
|
||||
# Создано: $(date)
|
||||
|
||||
# Ежедневный бэкап в $BACKUP_TIME
|
||||
$MINUTE $HOUR * * * root LXC_ID=$LXC_ID /usr/local/bin/gitea-backup >> /var/log/gitea-backup.log 2>&1
|
||||
|
||||
# Еженедельный полный vzdump (воскресенье в 13:00)
|
||||
0 13 * * 0 root LXC_ID=$LXC_ID DO_VZDUMP=true /usr/local/bin/gitea-backup >> /var/log/gitea-backup.log 2>&1
|
||||
EOF
|
||||
|
||||
chmod 644 "$CRON_FILE"
|
||||
|
||||
echo ""
|
||||
echo "✅ Cron задача создана: $CRON_FILE"
|
||||
echo ""
|
||||
echo "Расписание:"
|
||||
echo " - Ежедневно в $BACKUP_TIME: gitea dump + pg_dump"
|
||||
echo " - Воскресенье в 13:00: + полный vzdump контейнера"
|
||||
echo ""
|
||||
echo "Логи: /var/log/gitea-backup.log"
|
||||
echo ""
|
||||
echo "Ручной запуск:"
|
||||
echo " gitea-backup # Только данные"
|
||||
echo " DO_VZDUMP=true gitea-backup # + полный бэкап контейнера"
|
||||
echo ""
|
||||
Reference in New Issue
Block a user