14.12.2025 21:43
2

Goback - простые бэкапы

У меня на сервере куча разношерстных сервисов - блог, старый сайт на wordpress, сервис бюджета на го в докере и несколько телеграм ботов.

Начал по дефолту с баш-скриптов, но меня хватило на 2 скрипта - там в каждом куча дублирующегося кода, отдельно это все надо ставить на крон - это даже не касаясь удобства баша для больших скриптов.

part of bash script

Но должны же быть готовые решения проблемы для настройки?

Нагуглилась утилита borgmatic / borgbackup, которая вроде обещала удобные конфиги в yaml, но ставилась через apt и на каждый сервис приходилось опять писать свои конфиги и вешать на крон отдельно. Конфиги вроде понятные, но все равно нетривиальные и не интуитивны.

example of borgmatic yaml

Поэтому я сел и написал свои конфиги, которые бы меня полностью устраивали:

global:
  backup_dir: "/var/www/backups"
  filename_mask: "%name%-%Y%m%d%H%M%S"
  default_compression: "gzip"
  retention:
    daily: 2
    weekly: 2
    monthly: 2
    yearly: 2

backups:
  - name: "my-backup"
    subdirectory: "project"
    source_dir: "/var/www/project"

При этом можно через include_dir сделать подключение конфигов из директории - таким образом для каждого бэкапа можно будет писать свой отдельный файл.

Goback

Ну и поверх уже написанных конфигов я запустил Cursor, чтобы реализовать утилиту, способную выполнять все, что было заложено в конфиги.

Так получился goback - небольшая утилита на Go, которая решает описанные проблемы.

Единый конфиг в YAML — можно настроить всё в одном файле или подключать конфиги автоматически из подпапки. Нужен новый бэкап? Просто добавляем YAML-файл с указанием директории или команды для дампа.

Гибкая настройка бэкапов:

  • Бэкап конкретных директорий с исключениями (glob-паттерны)
  • Выполнение команд (например, mysqldump или pg_dump)
  • Разные типы сжатия: gzip, zip, tar, tar.gz или без сжатия

Хуки для автоматизации:

  • Pre-hooks — команды, выполняемые перед бэкапом (например, остановка сервиса)
  • Post-hooks — команды после бэкапа (например, синхронизация с облаком)
  • Хуки могут быть глобальными или для каждого бэкапа отдельно

Умная политика хранения:

  • Автоматическое определение якорных точек (daily, weekly, monthly, yearly)
  • Настройка количества бэкапов для каждого типа
  • Автоматическая очистка старых бэкапов

Один бинарник на 2.5 МБ без внешних зависимостей. Запуск одной командой: ./goback.

Пример конфигурации

global:
  backup_dir: "/var/www/backups"
  filename_mask: "%name%-%Y%m%d%H%M%S"
  default_compression: "gzip"
  retention:
    daily: 2
    weekly: 2
    monthly: 2
    yearly: 2
  post_hooks:
    - "rclone sync /var/www/backups remote:backups"

backups:
  # Бэкап директории с исключениями
  - name: "example-website"
    subdirectory: "example"
    source_dir: "/var/www/example"
    exclude_patterns:
      - "var/cache/*"
      - "vendor/*"
      - "*.log"
      - "node_modules/*"
    compression: "zip"

  # Бэкап базы данных через команду
  - name: "database-dump"
    subdirectory: "databases"
    command: "mysqldump -u user -ppassword database_name"
    output_file: "database.sql"
    compression: "gzip"
    retention:
      daily: 7
      weekly: 4
      monthly: 6
      yearly: 2

Автоматическая загрузка конфигов

Одна из самых удобных фич — автоматическая загрузка конфигов из директории. Можно указать include_dir в глобальных настройках, и утилита автоматически подхватит все .yaml и .yml файлы из этой папки:

global:
  include_dir: "/var/www/my/backup/backups"

Теперь для каждого нового сервиса достаточно создать один файл в этой директории:

# /var/www/my/backup/backups/blog.yaml
name: "blog"
subdirectory: "blog"
source_dir: "/var/www/blog"
exclude_patterns:
  - "var/cache/*"
  - "vendor/*"
compression: "zip"

И всё — новый бэкап начинает создаваться по крону вместе с остальными. Постхук синхронизации заливает все в облако.

Ну и немного опций добавил, здесь основные, больше деталей в репозитории.

Использование

Запуск всех бэкапов:

./goback

Запуск конкретного бэкапа:

./goback -b blog

Запуск нескольких бэкапов:

./goback -b blog -b database -b telegram-bot

Использование кастомного конфига:

./goback -config /path/to/config.yaml

Результат

Одним словом — красота. Пара часов в Cursor, и необходимая по запросам утилита готова.

Все бэкапы в одном месте с единой логикой, простое добавление новых бэкапов через YAML, автоматическая ротация и очистка старых бэкапов, гибкая настройка для каждого сервиса, post-hook с синхронизацией в облако работает автоматически.

И всё работает из коробки, без лишних зависимостей и сложных настроек. Скачал бинарник, положил рядом конфиг и можно запускать.

backup logs screen

Проект доступен на GitHub: https://github.com/positron48/goback

Там можно найти полную документацию, примеры конфигураций и инструкции по сборке.

P.S. Уже вижу как вместо маркетплейсов готовых приложений все будет создаваться на лету.

Tags: Ubuntu AI Cursor Go
Больше эксклюзивного контента и live-обновлений в моём Telegram-канале

Комментариев пока нет

Последние статьи