Перейти к содержанию

Резервная копия и изменение схемы

Оглавление серии

Резервная копия полезна, когда из неё можно восстановить согласованный проект. Наличие одного SQLite-файла не подтверждает эту возможность: рядом могут понадобиться uploads, модель, зависимости, настройки и доступы. В «Редакционном доме» разберём состав копии и изменение поля summary так, чтобы было понятно, что именно потребуется вернуть при неудачном шаге.

После предыдущего урока у нас есть fixtures и понимание штатного export. Теперь результатом станет письменная процедура восстановления в отдельной папке. Копирование рабочей базы, запуск восстановленного приложения и изменение схемы не выполнялись при подготовке курса. Мы описываем действия будущего оператора и критерии, по которым он сможет подтвердить результат.

Копия сохраняет несколько слоёв

Первый слой — исходники: config, src, отдельный site и пакет зависимостей. После вашей установки сюда добавится lockfile. Второй — данные SQLite, третий — физические files в uploads. Четвёртый — секреты и роли конкретного экземпляра. Пятый — локальное состояние получателя webhooks, если он уже использовался. У каждого слоя свой способ хранения и свой смысл при восстановлении.

В лаборатории с SQLite самый понятный файловый сценарий — остановить оба локальных процесса, затем сохранить базу и uploads вместе с соответствующими исходниками. Копирование живого файла без подходящего механизма согласования может получить промежуточное состояние. Поэтому для учебного порядка не заменяем остановку предположением, что «редактор сейчас ничего не делает».

Секреты сохраняются отдельно от общедоступного архива курса. В нашем ZIP их нет и быть не должно. Для вашей копии нужен защищённый способ хранения .env либо процедура создания новых credentials. Утерянный PREVIEW_SECRET можно заменить и тем самым перестать признавать старые ссылки; утерянный ключ зашифрованного export нельзя восстановить из его имени.

Admin users и API tokens не входят в штатный export. Соответственно, перенос через export/import и полная файловая копия не имеют одинаковых свойств. Оператор заранее выбирает механизм и знает, какие настройки придётся восстановить вручную. Детали возможностей следует сверить с Data Management.

Восстановление идёт в отдельное место

Создайте новую папку, не заменяя единственную имеющуюся лабораторию. Используйте ту же выбранную версию Strapi и совместимую Node. Верните исходники, установите зависимости по сохранённому lockfile, затем восстановите данные и assets выбранным способом. Настройки адресов должны указывать на новые локальные порты, чтобы не перепутать оригинал и копию.

Восстановленная CMS не должна автоматически уведомлять реальные системы. В нашей лаборатории внешних интеграций нет, но локальный webhook тоже лучше держать выключенным до проверки. Если endpoint по старому адресу работает, копия способна отправить событие, которое другой процесс воспримет как изменение оригинала. Это пример того, почему восстановление — не только извлечение файлов.

Сначала проверьте содержание, затем права. Найдите три статьи, Анну Лесную и «Вёрстку», сопоставьте связанный Author/Category, обложку и подпись. Убедитесь, что ru/published первой статьи содержит ожидаемый summary, а её en-представление имеет тот же documentId. Только затем подключайте отдельный сайт с собственным token и адресом CMS.

В файле specs/restore.md эти действия записаны кратко; урок объясняет причины каждой группы. В нём нет отметки о выполненном восстановлении. Такая честная процедура лучше ложного зелёного статуса: исходники курса не были запущены, а документ показывает, что именно должно быть подтверждено при будущей репетиции.

Изменение поля имеет последствия

Предположим, редакция хочет сократить максимальный summary с трёхсот двадцати до двухсот символов. В schema это маленькая правка числа. Для существующих документов последствия шире: старые descriptions могут превышать новый лимит. Сначала составьте список таких значений на копии, решите, как их сократить, и только потом применяйте правило к рабочему процессу.

Не обрезайте summary автоматически посередине предложения, если оно объясняет смысл статьи. Поле нужно карточке, а не просто проверке maxLength. Редактор может переписать фразу короче, сохранив предметный результат. Техническое ограничение задаёт задачу, но не заменяет решение по содержанию.

Другой пример — превращение text body в Blocks. Старый consumer разбивает строку по пустым строкам. Новый формат вернёт массив структурированных узлов, и прежний renderer больше не соответствует контракту. Требуется перенос данных и изменение клиента. Если обновить только schema, публичная страница может показывать [object Object] либо ошибку, хотя панель выглядит удобнее.

Для такой правки полезно отдельно сохранить старое и новое состояния модели, описание преобразования и контрольные документы. На копии сопоставьте абзацы и видимый результат, затем определите совместимый порядок обновления CMS и сайта. Одновременное изменение двух процессов без плана усложняет поиск причины: ошибку может создать формат данных, renderer или права доступа.

Откат возвращает согласованное состояние

Замена package.json прежней версией не откатывает базу автоматически. Если новый процесс уже изменил структуру или содержание, старый код может не понимать состояние данных. Поэтому rollback связывает код, зависимости и данные из одной точки копирования. Нельзя обещать обратимость каждой миграции только потому, что файл можно вернуть из Git.

После восстановления повторяются проверки тех свойств, ради которых проект существует. Для сайта это catalogue, отдельная статья и отсутствие draft по обычным маршрутам. Для редакции — сохранение черновика, публикация и локализация. Для preview — новая действующая ссылка и отказ изменённой подписи. Для webhook — сохранение ожидаемого inbox без лишних действий. Эти проверки выполняет будущая локальная репетиция, а не редакционный подсчёт слов этой серии.

У копии должно быть описание: дата, версия Strapi, Node, состояние схемы, способ сохранения данных, расположение assets и отдельного ключа. Имя backup-final.zip не сообщает этих сведений. Простой текст рядом с защищённым архивом помогает другому человеку понять, что именно восстановлено и какие элементы надо создать заново.

Копия должна иметь владельца и место назначения. Даже локально полезно написать, кто отвечает за повторение процедуры и где находится последняя пригодная версия. Иначе несколько архивов с похожими именами создают больше неопределённости, чем одна объяснённая копия.

Для самостоятельного решения составьте две процедуры: изменение одного редакционного summary и смена типа body. В первой достаточно сохранить содержание и проверить версии публикации; во второй меняется контракт между CMS и потребителем. Различная стоимость этих действий объясняет результат урока: надёжность определяется согласованным состоянием и проверенным восстановлением, а не количеством копий одной папки. Завершим курс передачей такой границы в выпускной документ.