Перейти к основному контенту

Глава 3.5: Стратегия бэкапов.

Среди системных администраторов есть старая мудрость: «Люди делятся на две категории: те, кто еще не делает бэкапы, и те, кто их УЖЕ делает». В селф-хостинге бэкап — это ваша единственная страховка от сгоревшего SSD, случайной команды rm -rf или неудачного обновления.

Благодаря тому, что мы изначально построили правильную архитектуру (все данные и конфиги лежат в папке /stacks), процесс резервного копирования у нас будет максимально простым, изящнымпонятным и надежным.


1. Главное правило: НельзяЖелезный просто«холодный» такбэкап

скопировать

Когда папкуконтейнер базы данных

У новичков часто возникает соблазн просто скопировать всю папку /stacks/bookstack/db_data, пока контейнер работает. Это огромная ошибка. База данных (MariaDB или PostgreSQLPostgreSQL) активно работает, он постоянно держит файлы открытыми и записывает туда кэш. Если попытаться скопировать ихпапку db_data прямо в этот момент, вы получитерискуете получить "битый", поврежденный архив, который потом откажется запускаться.

Для домашнего селф-хостинга, где кратковременная остановка сайта на 10–15 секунд глубокой ночью никому не навредит, поэтому, существует идеальный, самый надежный и простой метод — Правильная«холодный» стратегиябэкап.

состоит

Алгоритм изпрост двухдо этапов:безобразия:

  1. СделатьОстанавливаем официальный текстовый слепок базы данныхконтейнеры (Дамп)освобождаем сфайлы помощьюи встроенныхсбрасываем утилит самой СУБД прямокэш на лету.диск).
  2. ЗаархивироватьУпаковываем папкивсю конфигурацийпапку и полученный дамппроекта в одинархив.
надежныйЗапускаем архив.контейнеры обратно.

2. ДелаемРучной дампбэкап: базыШаг данныхза «на лету»шагом

ЧтобыДавайте сделатьразберем, резервнуюкак копиюзаархивировать базынашу данных,Wiki намвручную. не нужно ничего устанавливать на сервер Debian. Мы дадим команду утилите mysqldump, которая уже находится внутри работающего контейнера с базой.

Перейдем в папкукаталог нашейсо Wiki:стеками:

cd /stacks/bookstackstacks

ВыполнимТеперь выполним цепочку команд:

# 1. Останавливаем проект (файлы закрываются)
docker compose -f ./bookstack/docker-compose.yml stop

# 2. Архивируем всю папку в один сжатый файл с текущей датой в имени
tar -czf /var/backups/bookstack_backup_$(date +%F).tar.gz ./bookstack

# 3. Поднимаем проект обратно в работу
docker compose -f ./bookstack/docker-compose.yml start

Флаг -f позволяет нам управлять нужным docker-compose.yml удаленно, даже не заходя внутрь самой папки bookstack.


3. Автоматизация по ночам через Cron

Чтобы сервер сам делал эту процедуру каждую ночь в 3:00, занесем эту строчку в системный планировщик задач Cron.

Откроем планировщик:

crontab -e

Прокрутите в самый вниз файла и вставьте следующую команду создания(все дампашаги связываются оператором &&, который запускает следующее действие только при успехе предыдущего):

0 3 * * * cd /stacks && docker compose -f ./bookstack/docker-compose.yml stop && tar -czf /var/backups/bookstack_$(date +\%F).tar.gz ./bookstack && docker compose -f ./bookstack/docker-compose.yml start

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


4. Альтернатива: Путь идеалиста (вместоДамп базы без остановки)

Конечно, среди домашних сисадминов всегда найдутся перфекционисты, которые скажут: «Мой сервер должен работать в режиме 24/7/365, и даже секундная остановка базы ради бэкапа — это преступление!».

Если вы относитесь к их числу или просто хотите расширить кругозор, то вам предстоит курить мануалы в сторону утилиты mysqldump (или ${DB_PASSWORD}pg_dump подставьтедля вашбаз реальныйPostgreSQL). парольЭтот пользователяподход позволяет делать "горячий слепок" базы данных изпрямо файлана .env):лету, вообще без остановки контейнеров, просовывая команду внутрь через утилиту выполнения:

docker exec bookstack_db mysqldump -u bookstack_user -p'secure_db_password_456' bookstackapp > db_backup.sql

РазборТакой магии:метод Командаявляется dockerбезальтернативным execстандартом временнов "просовываеткорпоративном руку"сегменте. внутрьНа запущенногокрупных контейнерапредприятиях, bookstack_db,в запускаетбанках тамили утилитувысоконагруженных резервногоинтернет-магазинах копированияпрерывание сервиса даже на 10 секунд глубокой ночью грозит огромными финансовыми потерями и аккуратнорепутационными выгружаетубытками.

готовый

Но файлдавайте db_backup.sqlбудем наружу,честны: прямодля домашнего селф-хостинга это абсолютно избыточно по нескольким причинам:

    Если в вашу3 текущуючаса локальнуюночи папкуваша личная Wiki заснет на сервере5–10 Debian.секунд,
    этого

    3. Архивация всего стека приложения

    Технически, база данных у нас теперь сохранена в один текстовый файл. Рядом лежит папка app_data со всеми картинками и конфигами сайта. Теперь мы можем безопасно упаковать всю папку проекта в один сжатый архив формата .tar.gz:

    # Поднимаемся на уровень выше в каталог /stacks
    cd /stacks
    
    # Архивируем всю папку bookstack в один файл
    tar -czf bookstack_backup_$(date +%F).tar.gz ./bookstack

    Конструкция $(date +%F) автоматически подставит в имя архива текущую дату. На выходе вы получите красивый файл вида: bookstack_backup_2026-06-01.tar.gz.

    Очистка места: Файл db_backup.sql внутри папки проекта больше не нужен, так как он уже надежно упакован внутрь общего архива. Удалим его, чтобы не дублировать данные:

    rm /stacks/bookstack/db_backup.sql

    4. Как автоматизировать бэкапы по ночам?

    Делать это руками каждый деньпросто никто не будет.заметит.

    ДавайтеВам заставимпридется серверплодить Debianлишние выполнятьсущности: этуписать процедурусложные автоматическимногострочные каждуюbash-скрипты, ночькоторые сначала делают дамп, потом архивируют файлы, а затем подчищают за собой временные файлы .sql. Вам придется "светить" пароль от базы данных в 3:00,открытом используятекстовом встроенныйвиде планировщикпрямо задачвнутри Cron.планировщика

    ОткроемCron, планировщикчто задач:

    с
    crontabточки -e
    зрения

    Прокрутитебезопасности в самыйсомнительная внизпрактика.

    файла и вставьте одну длинную строчку (все команды выполняются последовательно через оператор &&):
    0 3 * * * cd /stacks/bookstack && docker exec bookstack_db mysqldump -u bookstack_user -p'secure_db_password_456' bookstackapp > db_backup.sql && cd /stacks && tar -czf /var/backups/bookstack_$(date +\%F).tar.gz ./bookstack && rm /stacks/bookstack/db_backup.sql

    Сохраните файл и выйдете. Теперь каждую ночь в системную директорию /var/backups/ будет падать свежий, чистый архив вашей Wiki.

    ⚠️💡 ГлавноеРезюме правилодомашнего выживания:админа: Храните
    Оставьте бэкапы«горячие надампы» другомэнтерпрайзу устройстве!
    Хранитьс бэкапыих намиллионными томоборотами. жеНаш жестком«холодный» диске,метод гдес крутитсяdocker самcompose Dockerstop — это плохойавтомат тон.Калашникова: Еслион дискпроще сгорит,в вынастройке, потеряетене оставляет мусора и рабочуюгарантирует систему,100% иконсистентность бэкапы.файлов Настройте копирование полученных архивов из папки /var/backups/базы на вашудиске домашнююбез флешку,лишней сетевоеголовной хранилище (NAS) или в облако.боли.


    5. КакХочу восстановитьбольше: всёПродвинутые избэкапы бэкапачерез заRestic

    2

    Простое минуты?копирование архивов в .tar.gz отлично работает на старте. Но когда ваших сервисов станет много, архивы начнут занимать гигабайты/терабайты, ведь каждую ночь вы будете копировать одни и те же картинки и файлы заново.

    Если случиласьвы авария,хотите жесткийнастроить дисквзрослую, сгорел,профессиональную систему резервного копирования с дедупликацией (когда сохраняются только изменившиеся за сутки кусочки файлов), шифрованием и выавтоматической купилиотправкой новыйв чистыйудаленные компьютер,облака, процедурапереходите вашего полного восстановления выглядит тривиально:

      Установите чистый Docker пок нашему гайдуспециальному изпрактическому Разделаруководству: 1.

      👉 СоздайтеПродвинутые пустуюбэкапы: папкуНастройка /stacks.и Распакуйтеавтоматизация ваш архив командой: tar -xzf bookstack_backup_XXXX.tar.gz -C /stacks/. ЗайдитеRestic в папку проекта cd /stacks/bookstack и запустите контейнеры: docker compose up -d. Восстановите базу данных из дампа одной командой:

      docker exec -i bookstack_db mysql -u bookstack_user -p'secure_db_password_456' bookstackapp < db_backup.sql

      Через 30 секунд ваша Wiki продолжит работу с той самой секунды, когда был сделан ночной архив. Вы великолепны!


      🐳 Поздравляем! Книга «Docker Ecosystem» полностью написана и укомплектована!Linux
      ВыТам прошли путь от полного непонимания контейнеров до построения взрослой, автоматизированной, изолированной и защищенной серверной экосистемы. Теперь у вас есть мощнейший сисадминский фундамент, и вы готовы к развертыванию сервисов любой сложности!подробно