commit dfd626ce7bf5bc6509f89633d6f198b09d03d0b3 Author: S.Gromov Date: Wed Oct 22 09:28:50 2025 +0300 Добавлена универсальная система автоматического резервного копирования Docker-проектов - Автоматическое создание tar.gz архивов по расписанию (cron) - Загрузка бэкапов в S3-совместимые хранилища (Yandex Cloud, AWS S3, MinIO, Timeweb) - Опциональная остановка сервисов перед бекапом для консистентности данных - Автоматическое удаление старых бэкапов - Подробное логирование всех операций - Запуск в отдельном Docker-контейнере diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..37b55ff --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +*.md +.git +.gitignore + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..97edf74 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,41 @@ +FROM alpine:latest + +# Устанавливаем необходимые пакеты +RUN apk add --no-cache \ + bash \ + tar \ + gzip \ + bzip2 \ + aws-cli \ + tzdata \ + curl \ + docker-cli \ + docker-cli-compose + +# Устанавливаем supercronic (cron для контейнеров) +ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.2.29/supercronic-linux-amd64 \ + SUPERCRONIC=supercronic-linux-amd64 \ + SUPERCRONIC_SHA1SUM=cd48d45c4b10f3f0bfdd3a57d054cd05ac96812b + +RUN curl -fsSLO "$SUPERCRONIC_URL" \ + && echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - \ + && chmod +x "$SUPERCRONIC" \ + && mv "$SUPERCRONIC" "/usr/local/bin/supercronic" + +# Создаем необходимые директории +RUN mkdir -p /backup-source /scripts /var/log + +# Копируем скрипты +COPY backup.sh /scripts/backup.sh +COPY entrypoint.sh /scripts/entrypoint.sh +COPY crontab /scripts/crontab + +# Устанавливаем права на выполнение +RUN chmod +x /scripts/backup.sh /scripts/entrypoint.sh + +# Устанавливаем рабочую директорию +WORKDIR /scripts + +# Запускаем entrypoint +CMD ["/scripts/entrypoint.sh"] + diff --git a/README.md b/README.md new file mode 100644 index 0000000..7b09f35 --- /dev/null +++ b/README.md @@ -0,0 +1,229 @@ +# 🗄️ Universal Docker Backup Service + +Универсальная система автоматического резервного копирования Docker-проектов с загрузкой в S3-совместимое хранилище. + +## ✨ Возможности + +- ✅ Автоматическое создание tar.gz архивов по расписанию (cron) +- ✅ Загрузка бэкапов в S3-совместимые хранилища (Yandex Cloud, AWS S3, MinIO, Timeweb и т.д.) +- ✅ Опциональная остановка сервисов перед бекапом для консистентности данных +- ✅ Автоматическое удаление старых бэкапов +- ✅ Подробное логирование всех операций +- ✅ Запуск в отдельном Docker-контейнере + +## 🚀 Быстрый старт + +### 1. Подготовка + +Скопируйте файлы в директорию вашего проекта, который нужно бекапить: + +```bash +git clone backup-system +cd your-project +cp -r backup-system/* . +``` + +### 2. Настройка + +Отредактируйте `docker-compose.yaml` и укажите свои значения переменных окружения: + +```yaml +environment: + # Обязательные параметры + - BACKUP_PROJECT_NAME=my-project + - BACKUP_S3_BUCKET=my-backups + - BACKUP_S3_ENDPOINT=s3.twcstorage.ru + - BACKUP_S3_ACCESS_KEY=your_access_key + - BACKUP_S3_SECRET_KEY=your_secret_key + + # Необязательные параметры + - BACKUP_SCHEDULE=0 3 * * * # Каждый день в 03:00 + - BACKUP_RETENTION_DAYS=30 +``` + +### 3. Запуск + +```bash +docker compose up -d backup +``` + +Проверить логи: + +```bash +docker compose logs -f backup +``` + +## 📋 Переменные окружения + +Все параметры подробно описаны в `docker-compose.yaml` с примерами использования. + +### Обязательные параметры + +| Параметр | Описание | Пример | +|----------|----------|--------| +| `BACKUP_S3_BUCKET` | Имя S3 бакета | `my-backups` | +| `BACKUP_S3_ENDPOINT` | Эндпоинт S3 сервиса | `s3.twcstorage.ru` | +| `BACKUP_S3_ACCESS_KEY` | Ключ доступа S3 | `your_key` | +| `BACKUP_S3_SECRET_KEY` | Секретный ключ S3 | `your_secret` | + +### Необязательные параметры + +| Параметр | Значение по умолчанию | Описание | +|----------|----------------------|----------| +| `BACKUP_PROJECT_NAME` | `project` | Имя проекта для архивов | +| `BACKUP_S3_FOLDER` | ` ` (корень) | Папка внутри бакета | +| `BACKUP_S3_REGION` | `ru-1` | Регион S3 | +| `BACKUP_RETENTION_DAYS` | `30` | Дни хранения бэкапов | +| `BACKUP_SCHEDULE` | `0 3 * * *` | Расписание cron | +| `BACKUP_ON_START` | `false` | Бекап при старте | +| `BACKUP_STOP_SERVICES` | ` ` | Сервисы для остановки | +| `BACKUP_COMPOSE_FILE` | ` ` | Путь к compose-файлу | + +## 🛠️ Расширенные сценарии + +### Остановка сервисов перед бекапом + +Для консистентности данных можно останавливать сервисы перед созданием архива: + +```yaml +environment: + # ... другие параметры ... + - BACKUP_STOP_SERVICES=gitea gitea-db + - BACKUP_COMPOSE_FILE=/backup-source/docker-compose.yml +``` + +**Важно:** +- Сервисы будут остановлены через `docker compose down` +- После создания архива сервисы автоматически запустятся через `docker compose up -d` +- Если бекап упадет с ошибкой - сервисы все равно запустятся обратно + +### Изменение директории для бекапа + +По умолчанию бекапится текущая директория (`.`). Чтобы изменить: + +```yaml +volumes: + - /path/to/your/project:/backup-source:ro + # ... остальные volumes ... +``` + +### Примеры расписаний (cron) + +```yaml +# Каждый день в 03:00 +- BACKUP_SCHEDULE=0 3 * * * + +# Каждые 6 часов +- BACKUP_SCHEDULE=0 */6 * * * + +# Каждое воскресенье в 02:00 +- BACKUP_SCHEDULE=0 2 * * 0 + +# Каждые 30 минут +- BACKUP_SCHEDULE=*/30 * * * * + +# Дважды в день: 03:00 и 15:00 +- BACKUP_SCHEDULE=0 3,15 * * * +``` + +### Тестовый бекап + +Для проверки настроек запустите бекап вручную: + +```bash +docker compose exec backup /scripts/backup.sh +``` + +Или включите бекап при старте: + +```yaml +- BACKUP_ON_START=true +``` + +## 📂 Формат архивов + +Архивы создаются в формате: + +``` +{BACKUP_PROJECT_NAME}-backup-YYYY-MM-DD_HH-MM-SS.tar.gz +``` + +Пример: `my-project-backup-2025-10-22_03-00-00.tar.gz` + +## 🔧 Структура проекта + +``` +. +├── backup.sh # Основной скрипт бекапа +├── entrypoint.sh # Точка входа контейнера +├── crontab # Шаблон cron (генерируется автоматически) +├── Dockerfile # Образ контейнера +├── docker-compose.yaml # Конфигурация сервиса +└── README.md # Документация +``` + +## 🐛 Решение проблем + +### Проверка логов + +```bash +# Все логи +docker compose logs backup + +# Логи в реальном времени +docker compose logs -f backup + +# Внутренние логи бекапа +docker compose exec backup cat /var/log/backup.log +``` + +### Проверка доступа к S3 + +```bash +docker compose exec backup aws s3 ls s3://your-bucket --endpoint-url=https://your-endpoint +``` + +### Ручной запуск бекапа + +```bash +docker compose exec backup /scripts/backup.sh +``` + +## 📊 S3-провайдеры + +### Yandex Cloud Object Storage + +```yaml +- BACKUP_S3_ENDPOINT=storage.yandexcloud.net +- BACKUP_S3_REGION=ru-central1 +``` + +### Timeweb Cloud S3 + +```yaml +- BACKUP_S3_ENDPOINT=s3.twcstorage.ru +- BACKUP_S3_REGION=ru-1 +``` + +### AWS S3 + +```yaml +- BACKUP_S3_ENDPOINT=s3.amazonaws.com +- BACKUP_S3_REGION=us-east-1 +``` + +### MinIO (self-hosted) + +```yaml +- BACKUP_S3_ENDPOINT=minio.your-domain.com +- BACKUP_S3_REGION=us-east-1 +``` + +## 📝 Лицензия + +MIT + +## 🤝 Поддержка + +При возникновении проблем создайте issue в репозитории. + diff --git a/backup.sh b/backup.sh new file mode 100644 index 0000000..e8450f3 --- /dev/null +++ b/backup.sh @@ -0,0 +1,302 @@ +#!/bin/bash + +####################################################### +# Universal Docker Project Backup Script +# Архивирует проект и загружает в S3 +####################################################### + +set -e # Остановка при ошибке + +# Цвета для логов +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Функция логирования +log() { + echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" >&2 +} + +log_error() { + echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ERROR:${NC} $1" >&2 +} + +log_warning() { + echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] WARNING:${NC} $1" >&2 +} + +# Проверка обязательных переменных окружения +check_env_vars() { + local missing_vars=() + + if [ -z "$BACKUP_S3_BUCKET" ]; then missing_vars+=("BACKUP_S3_BUCKET"); fi + if [ -z "$BACKUP_S3_ACCESS_KEY" ]; then missing_vars+=("BACKUP_S3_ACCESS_KEY"); fi + if [ -z "$BACKUP_S3_SECRET_KEY" ]; then missing_vars+=("BACKUP_S3_SECRET_KEY"); fi + if [ -z "$BACKUP_S3_ENDPOINT" ]; then missing_vars+=("BACKUP_S3_ENDPOINT"); fi + + if [ ${#missing_vars[@]} -ne 0 ]; then + log_error "Отсутствуют обязательные переменные окружения: ${missing_vars[*]}" + exit 1 + fi +} + +# Настройка AWS CLI для работы с S3 +configure_aws() { + log "Настройка AWS CLI..." + + export AWS_ACCESS_KEY_ID="$BACKUP_S3_ACCESS_KEY" + export AWS_SECRET_ACCESS_KEY="$BACKUP_S3_SECRET_KEY" + export AWS_DEFAULT_REGION="${BACKUP_S3_REGION:-ru-1}" + + # Для S3-совместимых хранилищ (Yandex, Minio и т.д.) + if [ -n "$BACKUP_S3_ENDPOINT" ]; then + AWS_ENDPOINT_ARG="--endpoint-url=https://${BACKUP_S3_ENDPOINT}" + else + AWS_ENDPOINT_ARG="" + fi +} + +# Остановка сервисов перед бекапом +stop_services() { + if [ -z "$BACKUP_STOP_SERVICES" ]; then + log "Список сервисов для остановки не указан, пропускаем..." + return 0 + fi + + # Ищем docker-compose.yml в директории бекапа + local compose_file="/backup-source/docker-compose.yml" + + if [ ! -f "$compose_file" ]; then + # Пробуем docker-compose.yaml + compose_file="/backup-source/docker-compose.yaml" + fi + + if [ ! -f "$compose_file" ]; then + log_error "Docker Compose файл не найден в /backup-source/" + return 1 + fi + + log "Остановка сервисов: ${BACKUP_STOP_SERVICES}" + log "Используется compose файл: ${compose_file}" + + # Останавливаем указанные сервисы + docker compose -f "$compose_file" down $BACKUP_STOP_SERVICES || { + log_error "Ошибка при остановке сервисов" + return 1 + } + + log "Сервисы успешно остановлены" + + # Даем время на корректное завершение + sleep 5 + + return 0 +} + +# Запуск сервисов после бекапа +start_services() { + if [ -z "$BACKUP_STOP_SERVICES" ]; then + return 0 + fi + + # Ищем docker-compose.yml в директории бекапа + local compose_file="/backup-source/docker-compose.yml" + + if [ ! -f "$compose_file" ]; then + # Пробуем docker-compose.yaml + compose_file="/backup-source/docker-compose.yaml" + fi + + if [ ! -f "$compose_file" ]; then + log_error "Docker Compose файл не найден в /backup-source/" + return 1 + fi + + log "Запуск сервисов: ${BACKUP_STOP_SERVICES}" + + # Запускаем указанные сервисы в detached режиме + docker compose -f "$compose_file" up -d $BACKUP_STOP_SERVICES || { + log_error "Ошибка при запуске сервисов" + return 1 + } + + log "Сервисы успешно запущены" + + return 0 +} + +# Создание архива +create_backup() { + local timestamp=$(date '+%Y-%m-%d_%H-%M-%S') + + # Имя проекта берется из переменной окружения + local project_name="${BACKUP_PROJECT_NAME:-project}" + local backup_filename="${project_name}-backup-${timestamp}.tar.gz" + local backup_path="/tmp/${backup_filename}" + + log "Начинается создание полного бэкапа проекта: ${backup_filename}" + log "Проект: ${project_name}" + log "Архивируется вся директория /backup-source/" + + # Создаем полный архив всей директории БЕЗ ИСКЛЮЧЕНИЙ + log "Создание tar.gz архива..." + tar -czf "$backup_path" \ + -C /backup-source \ + --transform "s,^,${project_name}/," \ + . || { + log_error "Ошибка создания архива" + return 1 + } + + # Получаем размер архива + local backup_size=$(du -h "$backup_path" | cut -f1) + log "Полный архив создан успешно: ${backup_filename} (размер: ${backup_size})" + + # Возвращаем путь через глобальную переменную + BACKUP_FILE_PATH="$backup_path" + return 0 +} + +# Загрузка архива в S3 +upload_to_s3() { + local backup_path="$1" + + # Проверка существования файла + if [ ! -f "$backup_path" ]; then + log_error "Файл бэкапа не найден: $backup_path" + return 1 + fi + + local backup_filename=$(basename "$backup_path") + + # Формируем путь с учетом BACKUP_S3_FOLDER + local s3_folder="${BACKUP_S3_FOLDER}" + if [ -n "$s3_folder" ]; then + # Удаляем начальный и конечный слэш, если есть + s3_folder="${s3_folder#/}" + s3_folder="${s3_folder%/}" + local s3_path="s3://${BACKUP_S3_BUCKET}/${s3_folder}/${backup_filename}" + else + local s3_path="s3://${BACKUP_S3_BUCKET}/${backup_filename}" + fi + + log "Загрузка бэкапа в S3: ${s3_path}" + + aws s3 cp "$backup_path" "$s3_path" $AWS_ENDPOINT_ARG || { + log_error "Ошибка загрузки в S3" + return 1 + } + + log "Бэкап успешно загружен в S3" +} + +# Удаление старых бэкапов из S3 +cleanup_old_backups() { + local retention_days="${BACKUP_RETENTION_DAYS:-30}" + + log "Очистка старых бэкапов (старше ${retention_days} дней)..." + + # Вычисляем дату отсечения (совместимо с BusyBox) + local retention_seconds=$((retention_days * 86400)) + local current_timestamp=$(date +%s) + local cutoff_timestamp=$((current_timestamp - retention_seconds)) + local cutoff_date=$(date -d "@${cutoff_timestamp}" '+%Y-%m-%d' 2>/dev/null || date -r "${cutoff_timestamp}" '+%Y-%m-%d' 2>/dev/null || echo "") + + if [ -z "$cutoff_date" ]; then + log_warning "Не удалось вычислить дату отсечения, пропускаем очистку" + return 0 + fi + + log "Удаление бэкапов старше ${cutoff_date}..." + + # Формируем путь с учетом BACKUP_S3_FOLDER + local s3_folder="${BACKUP_S3_FOLDER}" + if [ -n "$s3_folder" ]; then + s3_folder="${s3_folder#/}" + s3_folder="${s3_folder%/}" + local s3_list_path="s3://${BACKUP_S3_BUCKET}/${s3_folder}/" + else + local s3_list_path="s3://${BACKUP_S3_BUCKET}/" + fi + + # Получаем список всех бэкапов + aws s3 ls "${s3_list_path}" $AWS_ENDPOINT_ARG | grep "\-backup-" | while read -r line; do + # Извлекаем дату из имени файла (*-backup-YYYY-MM-DD_HH-MM-SS.tar.gz) + local filename=$(echo "$line" | awk '{print $4}') + local file_date=$(echo "$filename" | sed -n 's/.*-backup-\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\).*/\1/p') + + if [ -n "$file_date" ] && [ "$file_date" \< "$cutoff_date" ]; then + log "Удаление старого бэкапа: ${filename}" + if [ -n "$s3_folder" ]; then + aws s3 rm "s3://${BACKUP_S3_BUCKET}/${s3_folder}/${filename}" $AWS_ENDPOINT_ARG || { + log_warning "Не удалось удалить ${filename}" + } + else + aws s3 rm "s3://${BACKUP_S3_BUCKET}/${filename}" $AWS_ENDPOINT_ARG || { + log_warning "Не удалось удалить ${filename}" + } + fi + fi + done + + log "Очистка завершена" +} + +# Основная функция +main() { + log "==========================================" + log "Запуск процесса бэкапа проекта" + log "==========================================" + + # Проверка переменных окружения + check_env_vars + + # Настройка AWS CLI + configure_aws + + # Остановка сервисов перед бекапом + stop_services || { + log_error "Не удалось остановить сервисы" + exit 1 + } + + # Создание бэкапа + create_backup || { + log_error "Не удалось создать бэкап" + # Пытаемся запустить сервисы обратно даже при ошибке + start_services + exit 1 + } + + # Запуск сервисов после создания бекапа + start_services || { + log_warning "Не удалось запустить сервисы, но бэкап создан" + } + + # Загрузка в S3 + upload_to_s3 "$BACKUP_FILE_PATH" || { + log_error "Не удалось загрузить бэкап в S3" + rm -f "$BACKUP_FILE_PATH" + exit 1 + } + + # Очистка временного файла + rm -f "$BACKUP_FILE_PATH" + log "Временный файл удален" + + # Очистка всех старых временных файлов бэкапа из /tmp + log "Очистка старых временных файлов..." + find /tmp -name "*-backup-*.tar.gz" -type f -mmin +60 -delete 2>/dev/null || true + + # Очистка старых бэкапов + cleanup_old_backups + + log "==========================================" + log "Бэкап завершен успешно!" + log "==========================================" +} + +# Запуск +main + diff --git a/crontab b/crontab new file mode 100644 index 0000000..7fcc186 --- /dev/null +++ b/crontab @@ -0,0 +1,6 @@ +# Universal Backup Cron Jobs +# Это файл будет перезаписан при запуске контейнера на основе BACKUP_SCHEDULE +# По умолчанию: каждый день в 03:00 +0 3 * * * /scripts/backup.sh >> /var/log/backup.log 2>&1 + + diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..6f2a65d --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,60 @@ +# =========================================== +# Universal Docker Project Backup Service +# Автоматическое резервное копирование Docker-проектов в S3 +# =========================================== + +services: + backup: + build: . + container_name: project-backup + restart: unless-stopped + + environment: + - TZ=Europe/Moscow + + # Имя проекта (используется в названии архива: {name}-backup-2025-10-22_03-00-00.tar.gz) + - BACKUP_PROJECT_NAME=${BACKUP_PROJECT_NAME:-project} + + # S3 бакет для хранения бэкапов (обязательно) + - BACKUP_S3_BUCKET=${BACKUP_S3_BUCKET} + + # Папка внутри бакета (необязательно, по умолчанию - корень) + - BACKUP_S3_FOLDER=${BACKUP_S3_FOLDER:-} + + # Эндпоинт S3 сервиса (обязательно): s3.twcstorage.ru, storage.yandexcloud.net и т.д. + - BACKUP_S3_ENDPOINT=${BACKUP_S3_ENDPOINT} + + # Ключи доступа к S3 (обязательно) + - BACKUP_S3_ACCESS_KEY=${BACKUP_S3_ACCESS_KEY} + - BACKUP_S3_SECRET_KEY=${BACKUP_S3_SECRET_KEY} + + # Регион S3 + - BACKUP_S3_REGION=${BACKUP_S3_REGION:-ru-1} + + # Количество дней хранения бэкапов (автоматически удаляются старые) + - BACKUP_RETENTION_DAYS=${BACKUP_RETENTION_DAYS:-30} + + # Расписание запуска в формате cron: "0 3 * * *" = каждый день в 03:00 + - BACKUP_SCHEDULE=${BACKUP_SCHEDULE:-0 3 * * *} + + # Запускать ли бэкап сразу при старте контейнера (true/false) + - BACKUP_ON_START=${BACKUP_ON_START:-false} + + # Список сервисов для остановки перед бекапом через пробел (необязательно): gitea gitea-db + - BACKUP_STOP_SERVICES=${BACKUP_STOP_SERVICES:-} + + volumes: + # Директория проекта для бекапа (переопределяется через BACKUP_SOURCE_PATH, по умолчанию: текущая директория) + - ${BACKUP_SOURCE_PATH:-.}:/backup-source:ro + + # Синхронизация времени с хостом + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + + # Docker socket для управления контейнерами (нужен для BACKUP_STOP_SERVICES) + - /var/run/docker.sock:/var/run/docker.sock:ro + +# Раскомментируйте если нужно подключить к сети других сервисов +#networks: +# gitea_network: +# name: gitea_network diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..9a43c90 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +echo "================================================" +echo "Universal Docker Project Backup Service" +echo "================================================" +echo "Project: ${BACKUP_PROJECT_NAME:-project}" +echo "Source Path: ${BACKUP_SOURCE_PATH:-.} (mounted as /backup-source)" +echo "Timezone: ${TZ:-UTC}" +echo "Backup Schedule: ${BACKUP_SCHEDULE:-0 3 * * *}" +echo "S3 Endpoint: ${BACKUP_S3_ENDPOINT:-не указан}" +echo "S3 Bucket: ${BACKUP_S3_BUCKET:-не указан}" +echo "Retention Days: ${BACKUP_RETENTION_DAYS:-30}" +echo "Backup Type: Full project directory" +if [ -n "$BACKUP_STOP_SERVICES" ]; then + echo "Services to stop: ${BACKUP_STOP_SERVICES}" + echo "Compose file: /backup-source/docker-compose.yml (auto-detect)" +fi +echo "================================================" + +# Проверка обязательных переменных +if [ -z "$BACKUP_S3_BUCKET" ] || [ -z "$BACKUP_S3_ACCESS_KEY" ] || [ -z "$BACKUP_S3_SECRET_KEY" ]; then + echo "ERROR: Не заданы обязательные переменные окружения для S3!" + echo "Необходимо указать: BACKUP_S3_BUCKET, BACKUP_S3_ACCESS_KEY, BACKUP_S3_SECRET_KEY" + exit 1 +fi + +# Создаем crontab файл с заданным расписанием +echo "${BACKUP_SCHEDULE:-0 3 * * *} /scripts/backup.sh >> /var/log/backup.log 2>&1" > /scripts/crontab + +echo "Расписание установлено: ${BACKUP_SCHEDULE:-0 3 * * *}" +echo "Логи сохраняются в: /var/log/backup.log" +echo "================================================" + +# Опционально: запускаем первый бэкап сразу при старте +if [ "${BACKUP_ON_START:-false}" = "true" ]; then + echo "Запуск начального бэкапа..." + /scripts/backup.sh >> /var/log/backup.log 2>&1 +fi + +echo "Запуск supercronic..." +echo "Контейнер запущен и ожидает выполнения по расписанию" +echo "================================================" + +# Запускаем supercronic в foreground режиме +exec supercronic /scripts/crontab + diff --git a/env.example b/env.example new file mode 100644 index 0000000..0aaaeb9 --- /dev/null +++ b/env.example @@ -0,0 +1,58 @@ +# =========================================== +# Конфигурация автоматического бэкапа +# +# Этот блок содержит настройки для автоматического резервного копирования данных +# в S3-совместимое хранилище. Бэкап запускается по расписанию в отдельном Docker контейнере. +# =========================================== + +# Путь к директории для бекапа (необязательно, по умолчанию - текущая директория) +# Примеры: /var/www/project, /home/user/my-project +BACKUP_SOURCE_PATH= + +# Имя проекта (используется для именования бэкапов) +# Будет создаваться архив: {BACKUP_PROJECT_NAME}-backup-YYYY-MM-DD_HH-MM-SS.tar.gz +BACKUP_PROJECT_NAME=project + +# S3 бакет для хранения бэкапов (обязательно) +BACKUP_S3_BUCKET= + +# Папка внутри S3 бакета (необязательно, по умолчанию - корень) +# Примеры: backups, project/backups, prod/backups +BACKUP_S3_FOLDER= + +# Эндпоинт S3 сервиса (обязательно) +# Примеры: s3.twcstorage.ru, storage.yandexcloud.net, s3.amazonaws.com +BACKUP_S3_ENDPOINT= + +# Ключи доступа к S3 (обязательно) +BACKUP_S3_ACCESS_KEY= +BACKUP_S3_SECRET_KEY= + +# Регион S3 (по умолчанию: ru-1) +BACKUP_S3_REGION=ru-1 + +# Количество дней хранения старых бэкапов (по умолчанию: 30) +# Бэкапы старше указанного количества дней будут автоматически удалены +BACKUP_RETENTION_DAYS=30 + +# Расписание запуска бэкапа в формате cron (по умолчанию: 0 3 * * * - каждый день в 03:00) +# Формат: минута час день месяц день_недели +# Примеры: +# 0 5 * * * - каждый день в 05:00 +# 0 */6 * * * - каждые 6 часов +# 0 2 * * 0 - каждое воскресенье в 02:00 +# */30 * * * * - каждые 30 минут +BACKUP_SCHEDULE=0 5 * * * + +# Запускать ли бэкап сразу при старте контейнера (по умолчанию: false) +# Полезно для тестирования или создания бэкапа перед важными изменениями +# Значения: true / false +BACKUP_ON_START=false + +# Список сервисов для остановки перед бекапом (необязательно) +# Сервисы будут остановлены через "docker compose down", +# а после создания архива запущены через "docker compose up -d" +# Укажите названия сервисов через пробел, например: gitea gitea-db +# Если не указано - сервисы НЕ будут останавливаться +# Примечание: автоматически ищется docker-compose.yml в директории бекапа +BACKUP_STOP_SERVICES=