Глава 3.5: Стратегия бэкапов.
Среди системных администраторов есть старая мудрость: «Люди делятся на две категории: те, кто еще не делает бэкапы, и те, кто их УЖЕ делает». В селф-хостинге бэкап — это ваша единственная страховка от сгоревшего SSD, случайной команды rm -rf или неудачного обновления.
Благодаря тому, что мы изначально построили правильную архитектуру (все данные и конфиги лежат в папке /stacks), процесс резервного копирования у нас будет максимально простым, изящнымпонятным и надежным.
1. Главное правило: НельзяЖелезный просто«холодный» такбэкап
Когда папкуконтейнер базы данных
У новичков часто возникает соблазн просто скопировать всю папку /stacks/bookstack/db_data, пока контейнер работает. Это огромная ошибка. База данных (MariaDB или PostgreSQLPostgreSQL) активно работает, он постоянно держит файлы открытыми и записывает туда кэш. Если попытаться скопировать ихпапку db_data прямо в этот момент, вы получитерискуете получить "битый", поврежденный архив, который потом откажется запускаться.
Для домашнего селф-хостинга, где кратковременная остановка сайта на 10–15 секунд глубокой ночью никому не навредит, поэтому, существует идеальный, самый надежный и простой метод — Правильная«холодный» стратегиябэкап.
Алгоритм изпрост двухдо этапов:безобразия:
СделатьОстанавливаемофициальный текстовый слепок базы данныхконтейнеры (Дамп)освобождаемсфайлыпомощьюивстроенныхсбрасываемутилит самой СУБД прямокэш налету.диск).ЗаархивироватьУпаковываемпапкивсюконфигурацийпапкуи полученный дамппроекта водинархив.
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. Архивация всего стека приложения
Технически, база данных у нас теперь сохранена в один текстовый файл. Рядом лежит папка 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.sql4. Как автоматизировать бэкапы по ночам?
Делать это руками каждый деньпросто никто не будет.заметит.
.sql.
Вам придется "светить" пароль от базы данных в Откроем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
Простое минуты?копирование архивов в .tar.gz отлично работает на старте. Но когда ваших сервисов станет много, архивы начнут занимать гигабайты/терабайты, ведь каждую ночь вы будете копировать одни и те же картинки и файлы заново.
Если случиласьвы авария,хотите жесткийнастроить дисквзрослую, сгорел,профессиональную систему резервного копирования с дедупликацией (когда сохраняются только изменившиеся за сутки кусочки файлов), шифрованием и выавтоматической купилиотправкой новыйв чистыйудаленные компьютер,облака, процедурапереходите вашего полного восстановления выглядит тривиально:
👉 СоздайтеПродвинутые пустуюбэкапы: папкуНастройка /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 ВыТам прошли путь от полного непонимания контейнеров до построения взрослой, автоматизированной, изолированной и защищенной серверной экосистемы. Теперь у вас есть мощнейший сисадминский фундамент, и вы готовы к развертыванию сервисов любой сложности!подробно