Для чого призначений модуль
- Захист із першої хвилини. Під час встановлення створюється профіль «Щоденна повна копія»: файли та база щоночі о 03:00, сім найновіших копій на сервері. Копії за розкладом потребують виклику cron кожні кілька хвилин або тригера з панелі — на інформаційній панелі показано готову адресу та команду.
- Копія, яка переживе збій сервера. Копія, що лежить лише на тому самому сервері, що й магазин, зникає разом із ним. Модуль надсилає кожну готову копію до позначених місць поза сервером і попереджає на інформаційній панелі, якщо жодного такого місця немає.
- Захист перед оновленням. Кнопка «Швидкий знімок перед оновленням» копіює базу, а також модулі, теми, перевизначення та конфігурацію — те, що оновлення може зламати — без маси зображень, за частку часу повної копії.
- Відновлення після збою, злому або невдалої зміни. Відновлення всього магазину або лише його частини: бази, файлів, однієї таблиці або одного каталогу, наприклад теми.
- Відновлення на новому сервері. Аварійний скрипт
pdrestore.phpвідновлює магазин із копії на порожньому сервері, без встановленого PrestaShop — після втрати сервера або при зміні хостингу за тією самою адресою магазину.
Що потрапляє до резервної копії
П’ять діапазонів копії
- Файли та база — усе, що потрібно для відновлення магазину (рекомендовано).
- Лише база — мала й швидка копія, добра для частих копій між повними.
- Лише файли — зображення, модулі, теми та решта файлів магазину.
- Швидкий знімок — база та каталоги modules, themes, override, config, app/config, mails, translations, classes і controllers.
- Власний діапазон — база та позначені каталоги верхнього рівня; окремі файли кореневого каталогу (index.php, .htaccess і подібні) додаються завжди.
База даних
- Дамп у чистому PHP. Таблиці, подання, тригери, процедури, функції та події, без інструмента mysqldump і без доступу до оболонки сервера.
- Таблиці магазину або вся база. За замовчуванням копіюються таблиці з префіксом магазину; одна опція додає всі таблиці бази, наприклад таблиці зовнішньої інтеграції.
- Таблиці без рядків і пропущені таблиці. Статистика відвідувань, індекс пошукової системи, кеш і логи потрапляють до копії лише як структура. Власні списки дають змогу додати наступні таблиці, що копіюються без рядків, або повністю пропустити таблиці.
- Закриття магазину на час копіювання бази. Опція профілю переводить магазин у режим обслуговування лише на хвилини дампу бази, щоб жодне замовлення не було зафіксоване посеред запису, і знову відкриває його — також тоді, коли копія не вдалася.
Файли та виключення
- Завжди пропускаються. Кеш, логи, сесії, тимчасові зображення, каталоги .git і node_modules, каталог копій самого модуля, а також каталоги копій інших модулів резервного копіювання та модуля оновлення.
- Власні виключення. Пропущені шляхи із символом підстановки (themes/*/cache, **/nazwa), пропущені типи файлів (наприклад zip, mp4, psd) і ліміт розміру окремого файлу.
- Мініатюри та зображення товарів. Окремі опції пропускають мініатюри зображень (їх можна згенерувати з оригіналів) або весь каталог зображень товарів, коли зображення мають власну копію.
- Файли, змінені під час копії. Файл, змінений, видалений або недоступний для читання під час копіювання, фіксується в журналі, а копія триває далі.
Стиснення та поділ на файли
- Чотири рівні стиснення gzip — без стиснення, легке, рекомендоване та найсильніше. Дані, які не стискаються (зображення, архіви), модуль сам записує без стиснення, заощаджуючи час.
- Копія, поділена на файли вибраного розміру (за замовчуванням 256 МБ, від 16 до 4096 МБ), завдяки чому надсилання можна відновлювати, а обмеження розміру файлу на хостингу не заважають. Підтримуються файли магазину більші за 2 ГБ.
Розклад і автоматичні копії
- Профілі копій. Кожен профіль має власний діапазон, розклад, місця призначення, правила видалення старих копій і шифрування — наприклад повна копія щодня і додатково лише база кожні кілька годин.
- Розклад. Лише вручну, кожні кілька годин (від 1 до 24 годин або кожні 2–7 діб), щодня, у вибрані дні тижня або раз на місяць (у коротшому місяці — в останній день), о годині в часовому поясі магазину.
- Три способи запуску. Адреса cron із секретним токеном (викликається кожні 5 хвилин, нова адреса одним кліком), командний рядок
php modules/pdbackupandrestorepro/cli.phpз командами cron, run і status — без обмеження часу — а також тригер із панелі для хостингів без cron, який запускає прострочену копію під час візиту працівника в панель. - Короткі кроки з відновленням. Час одного кроку налаштовується від 5 до 120 секунд (рекомендовано 20). Після кожного кроку прогрес зберігається, а адреса cron сама викликає наступний крок; якщо сервер цього не дозволяє, копію продовжить наступний виклик cron.
- Прогрес у реальному часі. Індикатор прогресу, поточний етап і останні події. Закриття вкладки браузера не перериває копію, а кнопка «Зупинити» завершує її в найближчому безпечному місці.
- Лише одне завдання одночасно. Блокування в базі та блокування файлу не дозволяють, щоб два процеси (наприклад cron і вкладка браузера) виконували ту саму копію одночасно. Завдання, яке три рази поспіль не робить прогресу, завершується помилкою із зазначеною причиною.
Де зберігати копії: диск, NAS, FTP, FTPS, SFTP, S3
- Інший каталог на цьому сервері — другий диск або змонтований мережевий диск (NAS), поза каталогом магазину.
- FTP і FTPS. FTPS шифрує з’єднання та перевіряє сертифікат сервера (перевірку можна вимкнути для власного сервера із самопідписаним сертифікатом); пасивний або активний режим.
- SFTP (SSH). Вхід за паролем або приватним ключем (RSA у форматі PEM або ключ OpenSSH, також захищений паролем; ключі ed25519 там, де їх підтримує cURL хостингу), а також необов’язковий відбиток ключа сервера, завдяки якому модуль спілкується лише з правильним сервером.
- Сховище, сумісне з S3. Amazon S3, Backblaze B2, Wasabi, Cloudflare R2, Hetzner, OVH, MinIO та інші сервіси, сумісні з S3: адреса сервісу, регіон, bucket, каталог у bucket (кілька магазинів в одному bucket) і адресація bucket у шляху. Великі файли надсилаються частинами, а модуль ніколи не змінює налаштування самого bucket.
- Тест з’єднання. Кнопка «Тестувати з’єднання» записує, зчитує та видаляє тестовий файл, а коли сервіс це надає — показує вільне місце. Результат останнього тесту видно у списку місць призначення.
- Надсилання з відновленням. Копія надсилається до позначених місць по черзі та частинами; перерване надсилання відновлюється з місця, на якому зупинилося, а на серверах FTP, FTPS і SFTP розмір надісланого файлу порівнюється з оригіналом. Залишки копії, яку не вдалося надіслати, видаляються з місця призначення.
- Скрипт відновлення разом із копією. За замовчуванням до кожного місця поза сервером також потрапляє
pdrestore.php, тож копію можна відновити навіть тоді, коли магазину та його панелі вже немає.
Видалення старих копій (ретенція)
- У місцях призначення. Кількість найновіших копій, що зберігаються в кожному місці, видалення копій, старших за вибрану кількість днів, а також довга історія за схемою день–тиждень–місяць: додатково найновіша копія з кожного з останніх днів, тижнів або місяців.
- На цьому сервері. Окрема кількість найновіших копій і окремий ліміт віку. За браку місця на диску профіль може видаляти копію із сервера, коли вона дійде щонайменше до одного місця призначення.
- Що правила не видаляють. Найновішу справну копію, копії, позначені як захищені (у списку копій або для всього профілю, наприклад знімки перед оновленням), і копію, з якої підготовлено відновлення. Старі копії видаляються лише після того, як нова копія дійде до місця.
- Прибирання залишків. Якщо профіль не зберігає копії на сервері, копії, завантажені для відновлення, зникають із сервера через тиждень, а з копій, які не вдалося надіслати, там залишаються дві найновіші. Видалення, перерване посередині, повторюється. Із копій, виконаних із командного рядка без профілю, на сервері залишаються сім найновіших.
Шифрування копій і безпека
- AES-256 з контролем цілісності. Кожен фрагмент копії шифрується алгоритмом AES-256 (режим CTR) і підписується HMAC-SHA256; ключ створюється з пароля через PBKDF2-SHA256 (200 000 ітерацій). Зашифрований також список файлів копії, тож назви файлів не видно.
- Виявлення підміни. Опис копії (маніфест) підписується, а кожен фрагмент пов’язаний із копією, файлом і місцем у файлі — підмінений, переставлений або підкладений з іншої копії фрагмент не пройде перевірку.
- Пароль копії. Щонайменше 12 символів, вводиться двічі, зберігається в зашифрованому вигляді й більше ніде не показується. Без пароля зашифровану копію не відновить ніхто, зокрема й автор модуля. Новий пароль стосується майбутніх копій.
- Зашифровані дані входу. Паролі та ключі місць призначення зберігаються в базі в зашифрованому вигляді й не повертаються у форму.
- Каталог копій закритий для інтернету. Під час встановлення модуль вибирає каталог поза публічною частиною сайту, якщо хостинг це дозволяє; інакше — папку з випадковою назвою та захисними файлами. Кнопка «Перевірити з інтернету» на інформаційній панелі перевіряє, чи можна завантажити файли з каталогу, а для nginx надає готове правило блокування.
- Попередження в панелі. Список профілів попереджає, коли незашифровані копії потрапляють поза сервер, а список місць призначення — коли місце SFTP не перевіряє ключ сервера.
- Без з’єднань із серверами автора. Модуль не надсилає дані автору й не запускає системні команди; поза власним магазином він з’єднується виключно з місцями призначення та адресою моніторингу, які ви самі налаштуєте.
Перевірка копії та пробне відновлення
- Перевірка кожної копії. Після створення копія знову зчитується, а суми SHA-256 усіх її фрагментів порівнюються із збереженими. У списку така копія має статус «перевірена».
- Пробне відновлення. Повне зчитування копії — розшифрування, декомпресія, перевірка архіву та підрахунок SQL-інструкцій відносно опису копії — без жодних змін у магазині. Копія, що зберігається лише поза сервером, для цього завантажується.
- Нагадування. Інформаційна панель позначає, якщо за останній місяць жодна копія не була повністю зчитана.
Відновлення магазину з копії в панелі
- Майстер у трьох кроках. Вибір копії, вибір того, що має повернутися, і підтвердження шляхом введення адреси магазину. До підтвердження нічого не змінюється.
- П’ять діапазонів відновлення. Усе, що є в копії; лише база даних; лише файли; вибрані таблиці; вибрані каталоги (наприклад themes/classic або img/p).
- Спочатку поточний стан. Рекомендована опція перед відновленням створює захищену копію того, що буде замінено — для зашифрованих копій зашифровану паролем профілю. Якщо відновлення виявиться помилкою, ви повернетеся до стану до нього.
- Контроль перед стартом. Вільне місце на диску, право запису в каталог магазину, відповідність префікса таблиць, версія PrestaShop, з якої походить копія, і пароль зашифрованої копії. Попередження показуються перед підтвердженням.
- Безпечне виконання. На час відновлення магазин закривається для клієнтів і відкривається наприкінці. Відновлення працює на окремій сторінці поза панеллю, бо сама панель у цей час замінюється; після переривання воно продовжується з місця, на якому зупинилося, а сторінка видаляється після завершення.
- Файл налаштувань і вхід. Файл налаштувань PrestaShop походить із копії, але зберігає з’єднання з базою поточного сервера. Після відновлення бази працівники входять обліковими записами з дня створення копії.
- Копії поза сервером. Копію, що зберігається лише в місці призначення, кнопка «Завантажити й перевірити» завантажує та відразу повністю зчитує, перш ніж використати для відновлення.
- Копії з новішого сервера бази. Під час відновлення копії, створеної на новішій версії MySQL або MariaDB, невідомі колації та видалені режими SQL замінюються відповідниками, а решта помилок повідомляється.
- Перерване відновлення. Відновлення, яке протягом 10 хвилин не подає ознак життя, можна покинути з панелі — магазин знову відкривається, а копії знову виконуються.
Аварійне відновлення без панелі: pdrestore.php
- Один файл.
pdrestore.phpможна завантажити з вкладки Відновлення; за замовчуванням він також лежить у кожному місці призначення поруч із копією. - Без PrestaShop. Ви завантажуєте скрипт разом із файлами копії (назви, що починаються з pdbr-) до каталогу магазину й відкриваєте його в браузері. Якщо на сервері немає магазину, скрипт запитує дані бази даних.
- Доказ доступу до сервера. Скрипт створює поруч із собою файл із кодом, який потрібно переписати — ніхто сторонній, хто знає адресу скрипту, ним не скористається.
- Відновлення та прибирання. Після розриву з’єднання відновлення стартує з останнього завершеного кроку, а наприкінці скрипт видаляється із сервера однією кнопкою. Інтерфейс польською та англійською.
Інформаційна панель: чи захищений магазин?
- Оцінка в одному реченні. Наприклад «Магазин захищений. Остання копія від …, наступна запланована на …» або конкретна проблема: немає копії, невдала копія, занадто стара копія, cron не працює, немає місця поза сервером, каталог копій відкритий з інтернету.
- Контрольний список. Остання копія, її вік, розклад, cron, копія поза сервером, каталог копій, сповіщення та пробне відновлення — кожен пункт із кнопкою, що веде до місця, де його можна виправити.
- Плитки, графік і події. Остання справна копія, наступна копія, кількість копій на сервері (з їхнім розміром) і в кожному місці призначення, вільне місце на диску, графік розміру й часу останніх копій, а також останні події з журналу.
- Чотири запитання на старт. Що копіювати, де зберігати копії, коли і кого сповіщати — відповіді зберігаються в профілі. Нове місце призначення можна додати в процесі, а після вдалого тесту з’єднання ви повернетеся до запитань із уже позначеним цим місцем.
- Тест середовища. Версія PHP, розширення, ліміти часу й пам’яті, каталог копій і вільне місце на диску — з поясненням, що означає кожне обмеження.
- Заголовок на кожній вкладці. Остання справна копія, найближча запланована копія та стан захисту видно з кожної сторінки модуля.
Сповіщення e-mail і моніторинг
- Тривоги. E-mail, коли копія не вдалася; коли копія створена, але не дійшла до всіх місць призначення; коли профілю нікуди її надсилати; коли копія за розкладом не змогла розпочатися, а також коли протягом заданого часу (за замовчуванням 48 годин) немає вдалої копії.
- Підтвердження. Необов’язковий e-mail після кожної вдалої копії, із розміром і кількістю місць, де вона зберігається.
- Одержувачі та мова. Будь-який список адрес (порожнє поле = адреса e-mail магазину); повідомлення мовою за замовчуванням магазину, польською або англійською.
- Адреса моніторингу (heartbeat). Викликається після кожної вдалої копії, завдяки чому зовнішній сервіс моніторингу повідомить вас, коли копії перестануть створюватися. Налаштування показують, коли cron востаннє подавав ознаки життя, а інформаційна панель сигналізує, коли cron перестав викликати магазин.
Список копій і журнал
- Список копій. Профіль, вміст, розмір, тривалість, місця зберігання, результат перевірки та захист. Деталі копії: розмір до стиснення, кількість файлів і таблиць, шифрування, а також версії PrestaShop і модуля, які її створили.
- Дії з копією. Завантаження файлів копії на власний комп’ютер (із можливістю відновлення завантаження), нотатка, захист від автоматичного видалення, пробне відновлення, відновлення та видалення з усіх місць одразу.
- Знайти копії в каталозі. Копії, що лежать у каталозі копій, але відсутні у списку (наприклад перенесені з іншого сервера), додаються до списку однією кнопкою.
- Журнал. Кожен крок копії, надсилання та відновлення з читабельним, перекладеним повідомленням; фільтрація та завантаження журналу як текстового файлу. Завантаження копій, відновлення та відмова від відновлення — з іменем працівника — зберігаються два роки, решта записів — шість місяців.
Відкритий формат копії
- Звичайні архіви .tar.gz. Незашифровану копію відкриє будь-яка програма для архівів (7-Zip, WinRAR, tar), а база всередині як SQL-файли в каталозі db — копія не прив’язує до модуля.
- Незалежні фрагменти. Кожен файл копії складається з фрагментів, що стискаються та перевіряються окремо, завдяки чому копію, перевірку, надсилання та відновлення можна відновлювати після перерви.
Права доступу, багато магазинів і видалення
- Права працівників. Працівник із правом перегляду бачить копії, прогрес і журнал; запуск копій, завантаження файлів копії, відновлення та зміна налаштувань вимагають права редагування. Кожна дія в панелі перевіряє токен безпеки та права доступу.
- Багато магазинів (multistore). Копія охоплює всю інсталяцію PrestaShop — усі магазини одразу — а налаштування модуля є спільними для інсталяції.
- Видалення. Видаляє налаштування модуля, розклади та історію копій. Файли копій на диску та в місцях призначення залишаються.
Вимоги та сумісність
- PrestaShop 1.7.0–9.x, PHP 7.0–8.5 (64-бітний), MySQL 5.6+ або MariaDB 10+.
- Розширення PHP. zlib (стиснення, обов’язково), OpenSSL (шифрування копій і захист даних входу), cURL (FTP, FTPS, SFTP, S3, перевірка каталогу копій з інтернету та адреси моніторингу); SFTP вимагає cURL, зібраного з підтримкою SFTP. Налаштування mbstring.func_overload має бути вимкнене.
- Невеликі вимоги до пам’яті. Сам рушій копіювання потребує близько 20 МБ пам’яті; короткий ліміт часу запиту не заважає.
- Без залежностей. Без Composer, без доданих бібліотек, без exec і команд оболонки.
- Мови. Інтерфейс модуля, e-mail і скрипт відновлення польською та англійською.
Важливі межі роботи (версія 1.0)
- Відновлення за іншою адресою магазину або до бази з іншим префіксом таблиць не підтримується — модуль відмовляє перед першою зміною.
- Кожна копія є повною копією свого діапазону; інкрементні копії недоступні.
- Серед місць призначення немає Google Drive або Dropbox.
- Відновлення не видаляє файли або таблиці, які з’явилися в магазині після створення копії.
- Подання, тригери та процедури повертаються лише при відновленні всієї бази.
- Копія бази, що виконується через адресу cron або браузер, створюється в багатьох коротких кроках; для магазину з великим трафіком рекомендовано опцію закриття магазину на час копіювання бази або запуск копії з командного рядка.
- Копії за розкладом вимагають cron; тригер із панелі є аварійним виходом, що залежить від візитів працівників.
- Аварійний скрипт потребує файлу опису копії (назва закінчується на .manifest.json).
- Видалення залишає в каталозі магазину файли розпочатого й незавершеного відновлення (pdbr-restore-*) — їх потрібно завершити, покинути в панелі або видалити вручну.
- Журнал протягом двох років зберігає імена працівників, які завантажили копію або відновили магазин — це варто врахувати в реєстрі операцій обробки персональних даних.