# Ръководство за потребителя на Symelo Backups and Migration

За Symelo Backups and Migration версия 1.0.4.

Това ръководство обяснява как да правите резервни копия на сайта си, да пазите копия в облака, да възстановявате резервно копие (дори когато сайтът вече не се зарежда) и да премествате сайт на нов домейн или сървър. Описано е какво прави всяка настройка и как сами да отстранявате проблеми. Последният раздел, „За разработчици“, разглежда константите в wp-config.php, куките (hooks), командите за WP-CLI, REST API и форматите на файловете с резервни копия.

Нужна ви е помощ? Пишете на office@symelo.com или посетете [symelo.com](https://symelo.com/).

## Съдържание

1. [Какво прави](#какво-прави)
2. [Основни понятия](#основни-понятия)
3. [Изисквания](#изисквания)
4. [Бърз старт](#бърз-старт)
5. [Къде какво се намира](#къде-какво-се-намира)
6. [Раздел „Backups“](#раздел-backups)
7. [Раздел „Schedules“](#раздел-schedules)
8. [Раздел „Destinations“](#раздел-destinations)
9. [Раздел „Migration“](#раздел-migration)
10. [Раздел „Recovery“](#раздел-recovery)
11. [Раздел „Settings“](#раздел-settings)
12. [Раздел „Support“](#раздел-support)
13. [Известия, имейли и Здраве на сайта](#известия-имейли-и-здраве-на-сайта)
14. [Настройване на всяко място за съхранение](#настройване-на-всяко-място-за-съхранение)
15. [Възстановяване](#възстановяване)
16. [Миграция и клониране](#миграция-и-клониране)
17. [Резервни копия преди обновявания](#резервни-копия-преди-обновяване)
18. [Криптиране](#криптиране)
19. [Ротация на копията и дисково пространство](#запазване-на-резервните-копия-и-дисково-пространство)
20. [Практически рецепти](#практически-рецепти)
21. [Отстраняване на проблеми](#отстраняване-на-проблеми)
22. [Поверителност и сигурност](#поверителност-и-сигурност)
23. [Деактивиране и деинсталиране](#деактивиране-и-деинсталиране)
24. [За разработчици](#за-разработчици)

---

## Какво прави

Symelo Backups and Migration пази копия на целия ви сайт на сигурно място и ги връща, когато ви потрябват.

- **Прави резервни копия** на базата данни, плъгините, темите, качените медийни файлове, останалата част от wp-content и, ако желаете, на самия WordPress. Стартирате резервните копия сами или оставяте **графиците** да ги правят – от всеки час до веднъж месечно.
- Прави **инкрементални резервни копия**: след пълно резервно копие следващите копия съхраняват само променените файлове. На всеки няколко дни автоматично започва ново пълно резервно копие.
- **Копира резервните копия на места за съхранение**: Google Drive, Dropbox, OneDrive / Microsoft 365, Amazon S3 и S3-съвместими хранилища (Wasabi, DigitalOcean Spaces, Scaleway, MinIO), Cloudflare R2, Backblaze B2, Microsoft Azure Blob Storage, SFTP, FTP/FTPS и имейл. Едно резервно копие може да отиде на няколко места.
- **Възстановява** резервно копие от таблото – целия сайт или само някои части.
- **Възстановява дори когато сайтът не работи** – чрез частен **линк за възстановяване**, който работи без WordPress.
- **Прави резервни копия преди обновявания**: базата данни и обновяваният плъгин или тема (или самият WordPress) се запазват точно преди всяко обновяване, включително автоматичните.
- **Премества и клонира сайтове**: **пакет за миграция** може да се инсталира на празен сървър със самостоятелния **инсталатор**, да се качи на друг сайт или друг сайт да го изтегли чрез **линк за миграция**. Адресите се заменят автоматично, включително в сериализирани данни.
- **Криптира** базата данни или цялото резервно копие с ваша парола.
- **Изтрива старите резервни копия** по правила, които вие избирате, без никога да прекъсва инкрементална верига.
- Изпраща ви имейл при неуспешно резервно копие, добавя проверки в **Здраве на сайта** и има команди за **WP-CLI** и **REST API**.

Цялата работа се изпълнява във фонов режим, на кратки стъпки. Можете да затворите страницата, докато тече резервно копие. Единственото изключение е самото възстановяване: дръжте страницата за възстановяване отворена, докато не съобщи, че е готово.

Резервните копия са обикновени архиви `.tar.gz` и SQL файл, компресиран с gzip. Некриптирано резервно копие може да се отвори със стандартни инструменти, без плъгина.

## Основни понятия

| Понятие | Значение |
|---|---|
| **Резервно копие** (backup) | Копие на сайта ви в определен момент: папка с описание (`manifest.json`), файла на базата данни, един или повече архива с файлове и списък на файловете. |
| **Компонент** (component) | Част от сайта, която можете да архивирате и възстановите самостоятелно: **Database**, **Plugins**, **Themes**, **Media uploads**, **Other content** и **WordPress core**. |
| **Пълно резервно копие** (full backup) | Съдържа всички избрани файлове. Може да се възстанови самостоятелно. |
| **Инкрементално резервно копие** (incremental backup) | Съдържа само файловете, които са нови или променени след предишното резервно копие. Базата данни винаги се запазва изцяло. Нуждае се от резервните копия, върху които е изградено. |
| **Верига** (chain) | Пълно резервно копие и инкременталните копия, изградени върху него. При възстановяване на инкрементално копие автоматично се използва цялата верига. |
| **Този сървър** (This server) | Частната папка за резервни копия на уеб сървъра ви, `wp-content/uploads/symelo-backups-…` (краят на името е случаен). Всяко резервно копие първо се създава тук. |
| **Място за съхранение** (destination) | Друго място, което пази копия на резервните ви копия, например Google Drive или S3 bucket. Ако сървърът се повреди или бъде хакнат, копията там остават в безопасност. |
| **Задача** (job) | Работа, която се изпълнява във фонов режим: резервно копие, подготовка на възстановяване, изтегляне или изтриване на резервно копие. Задачите се изпълняват една по една; останалите чакат на опашка. |
| **Пакет за миграция** (migration package) | Пълно резервно копие, предназначено за преместване на сайт: всички компоненти плюс wp-config.php. Идва с инсталатор и линк за миграция. |
| **Ключ за инсталатора** (Installer key) | Парола от 24 знака, която се показва само веднъж при създаването на пакет за миграция. Без нея никой не може да стартира инсталатора на пакета. |
| **Инсталатор** (installer) | `installer.php` – един самостоятелен файл, който разполага пакет за миграция на сървър, дори на такъв без WordPress. |
| **Линк за миграция** (Migration link) | Дълъг код, започващ с `symelo-migrate:`, с който друг сайт може да изтегли пакет за миграция директно, от сървър на сървър. Валиден е 48 часа. |
| **Линк за възстановяване** (recovery link) | Таен адрес, който отваря инструмента за възстановяване без WordPress, така че да можете да възстановите резервно копие, съхранено на този сървър, когато сайтът не работи. |
| **Инструмент за възстановяване** (restorer) | Самостоятелният инструмент за възстановяване. Възстановяванията винаги се изпълняват в него, извън WordPress, защото заменят собствената база данни и файловете на WordPress. |
| **Криптиране** (encryption) | Незадължителна защита на резервните копия с ваша парола, която се прилага, преди те да напуснат сървъра. Без паролата никой не може да възстанови криптирани резервни копия. |
| **Ротация** (retention) | Правилата колко стари резервни копия се пазят – на този сървър и на местата за съхранение. |
| **От друг сайт** (From another site) | Резервно копие, чийто подпис този сайт не може да провери: създадено е от друг сайт, променено е след това или ключовете за сигурност на този сайт са се променили оттогава. Възстановяването му изисква вашето потвърждение. |

## Изисквания

- WordPress 6.4 или по-нова версия.
- PHP 7.4 или по-нова версия. При по-стар PHP плъгинът остава неактивен и показва: „Symelo Backups and Migration needs PHP 7.4 or newer. This site runs PHP …, so the plugin is inactive.“
- PHP разширения:
  - **zlib**: нужно е за всяко резервно копие и възстановяване (компресия).
  - **mysqli**: нужно е на инструмента за възстановяване, за да импортира базата данни. Почти всеки хостинг го има.
  - **sodium**: силно препоръчително. Криптираните резервни копия използват Argon2id, за да превърнат паролата ви в ключ, а него го има само разширението sodium. Без него плъгинът преминава към вградената в WordPress библиотека sodium_compat и PBKDF2. Резервно копие, криптирано на сървър със sodium, може да се декриптира само на сървър със sodium.
  - **SimpleXML**: нужно е за Amazon S3 и съвместимите хранилища, Backblaze B2 и Azure.
  - **ftp** (компилирано с OpenSSL за FTPS): нужно е за мястото за съхранение FTP / FTPS.
  - SFTP работи без разширения (плъгинът носи собствена SFTP библиотека). На PHP 7 изисква настройката `mbstring.func_overload` да е изключена.
- Права за запис на уеб сървъра в `wp-content/uploads` (там се съхраняват резервните копия) и в `wp-content` (там се поставят инструментът за възстановяване и линкът за възстановяване).
- Дисково пространство: плъгинът не започва резервно копие при по-малко от 50 MB свободно място. Предвидете приблизително компресирания размер на сайта си за всяко пълно резервно копие на този сървър, плюс място за възстановяване. Вижте [Ротация на копията и дисково пространство](#запазване-на-резервните-копия-и-дисково-пространство).
- Фонова работа: сайтът изпраща кратки заявки към самия себе си, а WP-Cron е резервният вариант. Ако хостингът ви блокира и двете, използвайте системна cron задача (вижте [Пускане на резервни копия от системна cron задача](#стартиране-на-архивирането-от-системна-cron-задача)).

Само администраторите могат да виждат и използват плъгина (правото `manage_options`). Разработчиците могат да променят това; вижте [За разработчици](#за-разработчици).

**Мрежа от сайтове (Multisite):** резервните копия обхващат цялата мрежа – таблиците и файловете на всеки сайт. Екранът на плъгина е в таблото на основния сайт и е достъпен само за супер администраторите. Активирайте плъгина за цялата мрежа или на основния сайт.

---

## Бърз старт

Тези стъпки ви водят от инсталирането до автоматично резервно копие извън сървъра и линк за възстановяване.

### 1. Инсталиране и активиране

1. В wp-admin отидете на **Разширения → Добавяне на разширение** и потърсете „Symelo Backups and Migration“.
2. Натиснете **Инсталиране**, след това **Активиране**.

За да инсталирате от .zip файл, натиснете **Качване на разширение** на същия екран, изберете файла, натиснете **Инсталиране**, след това **Активиране**.

В страничното меню на администрацията се появява ново меню **Backups**. Плъгинът създава частната си папка за резервни копия и насрочва ежедневната си поддръжка. Все още нищо не е архивирано.

### 2. Направете първото си резервно копие

1. Отидете на **Backups**. Отваря се разделът **Backups** със съобщението „No backups yet. Make your first one below: it runs in the background and takes a few minutes.“
2. В картата **Back up now** оставете стойностите по подразбиране: всичко без **WordPress core**, тип **Automatic (recommended)**.
3. Натиснете **Back up now**.

Виждате „Backup started. It runs in the background, so you can close this page.“ и лента за напредъка. Когато приключи, страницата показва „The backup is finished.“, а резервното копие се появява в списъка **Backups**, съхранено на **This server**.

### 3. Добавете място за съхранение

Резервно копие, което съществува само на сървъра ви, се губи, ако сървърът се повреди.

1. Отворете раздела **Destinations**. Тъй като все още нямате място за съхранение, изборът **Add a destination** е отворен.
2. Изберете услуга, например **Amazon S3 and S3-compatible**, и попълнете настройките ѝ. В [Настройване на всяко място за съхранение](#настройване-на-всяко-място-за-съхранение) ще намерите откъде да вземете всяка стойност.
3. Натиснете **Save destination**. Плъгинът веднага го тества: „Destination saved and tested: backups can be stored there.“

За **Google Drive**, **Dropbox** и **OneDrive / Microsoft 365** първо създавате собствено приложение при доставчика. След запазването натиснете **Connect …** и влезте в профила си.

### 4. Настройте график

1. Отворете раздела **Schedules**. Формата **New schedule** е отворена.
2. Стойностите по подразбиране са добро начало: **Every day** в **03:00**, **Incremental (recommended)** с **Full backup every** 7 дни, обичайните ви компоненти, само този сървър (отметнете местата си за съхранение) и **Keep the newest** 7 резервни копия.
3. Натиснете **Add schedule**.

### 5. Създайте линка за възстановяване

1. Отворете раздела **Recovery** и натиснете **Create recovery link**.
2. Копирайте линка в мениджъра си на пароли веднага. Той се показва само веднъж.

Ако някога неуспешно обновяване ви остави с бял екран, отворете този линк и възстановете най-новото резервно копие отпреди проблема.

### 6. По желание, но препоръчително

- **Settings → Encryption**: задайте парола и изберете **Encrypt everything**, особено когато резервните копия отиват при облачен доставчик. Вижте [Криптиране](#криптиране).
- **Settings → Notifications**: проверете адреса в **Send to**. Имейлите при неуспех са включени по подразбиране.

---

## Къде какво се намира

**Backups** в страничното меню на администрацията отваря един екран със седем раздела. Те се превключват мигновено, без презареждане.

| Раздел | За какво служи |
|---|---|
| **Backups** | Състояние, **Back up now**, списъкът с резервни копия (възстановяване, изтегляне, изтриване), последна активност и журнали. |
| **Schedules** | Автоматични резервни копия: колко често, какво, къде, колко да се пазят. |
| **Destinations** | Къде отиват копията на резервните ви копия: добавяне, тестване, изключване и премахване на места за съхранение. |
| **Migration** | Създаване на пакет за миграция; импортиране на сайт от пакет, от файлове, качени по FTP, или чрез линк за миграция. |
| **Recovery** | Линкът за възстановяване при неработещ сайт и инсталаторът за възстановяване без този сайт. |
| **Settings** | Какво да се архивира, криптиране, ротация, известия, резервни копия преди обновявания, скорост и поведение при деинсталиране. |
| **Guide** | Това ръководство, вътре в плъгина, със съдържание и поле за търсене („Find in this guide“). |
| **Support** | Линкове за помощ, отчет със системна информация и данни за контакт. |

На екрана „Разширения“ под плъгина има линкове **Backups** и **Settings**.

Когато се изпълнява задача, напредъкът ѝ се показва на живо под лентата с раздели, независимо кой раздел е отворен.

---

## Раздел „Backups“

### Обобщение на състоянието

Горната карта показва как вървят резервните ви копия:

- „Your last backup was **3 hours ago** (date).“ Резервните копия преди обновявания и резервните копия от друг сайт не се броят тук.
- „The last backup failed: …“ с линк **View log**, когато последната задача за резервно копие е неуспешна.
- „No backups yet. Make your first one below: it runs in the background and takes a few minutes.“

Под нея:

- „Next scheduled backup: … (in 5 hours).“ или „No schedule yet, so backups only happen when you start them.“ с линк **Set up a schedule**.
- „Backups are only kept on this server. If the server fails, they are lost with it.“ с линк **Add a destination**, когато нямате място за съхранение.

Бутонът **Back up now** ви отвежда до формата. Следват четири показателя: **Last backup**, **Next scheduled**, **Backups** (с общия им размер) и **Destinations**.

### Картата „Back up now“

| Настройка | Какво прави | По подразбиране |
|---|---|---|
| **What to back up** | Компонентите, които да се включат (таблицата по-долу). | Както е зададено в **Settings → What to back up** |
| **Where to keep it** | **This server** е включен винаги: „Винаги. Нужен е за бързи възстановявания и за линка за възстановяване; старите копия се премахват според Settings → Retention.“ Отметнете местата за съхранение, които също трябва да получат копие. Местата, които са изключени или не могат да работят на този сървър, са посивени. | Отметнати са всички работещи места за съхранение |
| **Type** | **Automatic (recommended)** или **Full** (вижте по-долу). | Automatic |
| **Encrypt this backup** | Показва се само когато е зададена парола за криптиране. „Използва паролата от Settings → Encryption.“ Ако криптирането е **Off** в настройките, тази отметка криптира всичко. | Отметнато, когато криптирането е включено в настройките |
| **Note** | По желание, например „Преди редизайна“. Показва се в списъка. | Празно |

| Компонент | Описание в плъгина | По подразбиране |
|---|---|---|
| **Database** | Публикации, страници, коментари, потребители, поръчки и настройки. | Включено |
| **Plugins** | Всичко в wp-content/plugins. | Включено |
| **Themes** | Всичко в wp-content/themes. | Включено |
| **Media uploads** | Изображения и файлове в wp-content/uploads. | Включено |
| **Other content** | Останалата част от wp-content, например задължителните (must-use) плъгини и преводите. | Включено |
| **WordPress core** | wp-admin, wp-includes и файловете в главната папка. Обикновено не е нужно: WordPress може да се преинсталира по всяко време. | Изключено |

Добре е да знаете:

- Задължителните плъгини (`wp-content/mu-plugins`) спадат към **Other content**: запазват се и се възстановяват заедно с него, а не с **Plugins**.
- Папките в папката на WordPress, различни от wp-admin, wp-includes и wp-content, никога не се архивират. Символните връзки също не се архивират; журналът на задачата ги изброява.
- wp-config.php се запазва отделно, когато **Include wp-config.php** е включено в настройките, и възстановяването никога не го записва върху работещия ви файл.

**Automatic или Full:**

- **Automatic (recommended)**: „Прави инкрементално резервно копие, когато има скорошно пълно: запазват се само файловете, променени след последното резервно копие, което е много по-бързо и заема много по-малко място. Иначе се запазва всичко. Базата данни винаги се запазва изцяло.“
- **Full**: „Запазва отново всеки файл. Отнема повече време, но не зависи от по-ранни резервни копия.“

При **Automatic** резервното копие е инкрементално, когато са изпълнени всички тези условия:

- по-ранно резервно копие, което сте стартирали сами (а не по график), има точно същите файлови компоненти;
- цялата верига на това копие е пълна на всяко отметнато място за съхранение (или на този сървър, ако не сте отметнали нито едно);
- пълното резервно копие на веригата е на по-малко от 7 дни, а веригата има по-малко от 50 резервни копия;
- ако по-ранното копие е криптирано с **Encrypt everything**, то е направено с текущата парола.

В противен случай се прави пълно резервно копие. Резервно копие само с базата данни винаги е пълноценно само по себе си; списъкът го показва като **Database**. Пълно резервно копие без базата данни се показва като **Files**.

Натиснете **Back up now**. Виждате „Backup started. It runs in the background, so you can close this page.“ Ако се изпълнява друга задача: „Another job is running. This backup starts as soon as it is done.“

Резервното копие се отказва веднага, когато има по-малко от 50 MB свободно дисково пространство („There is only … of free disk space on this server, which isn't enough to make a backup. Free up space or remove old backups first.“) или когато е поискано криптиране без парола („Set a backup encryption password in Settings → Encryption first, or turn encryption off for this backup.“).

### Напредък

Докато се изпълнява задача, карта под лентата с раздели показва заглавието ѝ (например **Backing up**), значка за състоянието, лента за напредъка и какво прави в момента, например „Backing up wp_posts (1,200 of 5,000 rows)“ или „Uploading … to Google Drive“. Бележката гласи „This runs in the background, so you can close this page.“

- **Cancel** спира задачата, след като попита „Cancel this job? Work done so far is discarded.“ Незавършено резервно копие се премахва; качване, което е било в ход, се прекратява на мястото за съхранение.
- **View log** отваря журнала на задачата.

Докато този екран е отворен, той сам извършва и малка част от работата, така че задачите напредват дори при хостинги, които блокират фоновите заявки.

Резервното копие минава през следните стъпки:

1. **Preparing the backup**: решава се дали да е пълно, или инкрементално.
2. За инкрементални резервни копия: **Getting the file list of the previous backup** (изтегля се от място за съхранение, ако е нужно).
3. **Backing up the database**, таблица по таблица, след това **Checking the database backup**: дъмпът се прочита обратно и трябва да завършва с маркера си за завършване.
4. **Looking for files**, а за инкременталните резервни копия и **Comparing with the previous backup** (по размер и време на промяна).
5. **Archiving files** в една или повече части `.tar.gz`.
6. **Writing the file index** и **Calculating checksums**. Подписаният `manifest.json` се записва последен: наличието му означава, че резервното копие е пълно.
7. **Uploading** на всеки файл до всяко място за съхранение, като манифестът е последен.
8. **Removing old backups** според правилата за ротация.

Когато задачата приключи, страницата се презарежда и показва резултата:

- „The backup is finished.“ с **View log**.
- „The backup is finished. There were 2 warnings.“ (в жълто). Предупрежденията не спират резервното копие: пропуснат нечетим файл, символна връзка, малко свободно дисково пространство или „Uploading to … failed: … The backup is still kept on this server.“
- „The backup failed: …“ с причината.
- „The backup was cancelled.“

### Списъкът с резервни копия

Картата **Backups** изброява всяко резервно копие на този сървър и на местата ви за съхранение, като най-новите са първи (най-новите 200).

| Колона | Значение |
|---|---|
| **Date** | Кога е създадено и преди колко време. Иконата с катинар означава **Encrypted**. Резервните копия, създадени от друг сайт, показват и „From https://other-site.com“. |
| **Type** | **Full**, **Incremental**, **Database**, **Files**, **Pre-update** или **Migration**. **Incomplete** (в червено), когато липсват файлове. „Scheduled“ отдолу, когато е създадено по график. |
| **Size** | Размерът на собствените файлове на това резервно копие (не на веригата). |
| **Contents** | Компонентите в него. |
| **Stored at** | **This server** и имената на местата за съхранение, които имат пълно копие. |
| **Note** | Вашата бележка или например „Before updating the plugin Akismet“. |

Действия:

| Действие | Кога се показва | Какво прави |
|---|---|---|
| **Restore** | Резервното копие е пълно на този сървър или на място за съхранение, което може да го върне (всеки тип освен Email) | Отваря формата за възстановяване. Вижте [Възстановяване от таблото](#възстановяване-от-таблото). |
| **Download** | Резервното копие е на този сървър | Отваря панел. **Download all** изтегля всички файлове на резервното копие в един ZIP архив (размерът му е на бутона), кръстен на ID на резервното копие. Под него има по един бутон за всеки файл с името и размера му: **Manifest**, **Database**, **Files** (или **Files, part 1**, **part 2**…), **File index**, а за пакетите за миграция и **Installer** (`installer.php`). „За да го възстановите другаде, изтеглете всички файлове, включително манифеста.“ Вижте [Изтегляне на резервни копия](#изтегляне-на-резервни-копия). |
| **Copy to this server** | Резервното копие е само на места за съхранение, които могат да го върнат | „Копира резервното копие от мястото за съхранение на този сървър, за да можете да го изтеглите. За възстановяване това не е нужно.“ Линковете за изтегляне се появяват, когато копирането приключи. |
| Бележка вместо **Restore** | Резервното копие се съхранява само по имейл | „Съхранено е само по имейл: изтеглете прикачените файлове и ги качете в раздела Migration, за да го възстановите.“ Вижте [Имейл](#имейл). |
| **Delete** | Резервното копие се съхранява някъде | Отваря меню: **Delete it from:** с отметка за всяко място и **Delete backup**. Пита „Delete this backup from the selected places? This can't be undone.“ Когато този сървър съдържа и незавършено копие на резервно копие, което е пълно на място за съхранение, менюто има допълнителната отметка **This server (unfinished copy)**. |
| **Log** | Задачата, която го е създала, все още е известна (задачите се пазят 30 дни) | Отваря журнала на тази задача. |

Изтриване:

- Изпълнява се във фонов режим: „The backup is being deleted in the background.“
- Резервно копие, върху което са изградени по-нови инкрементални копия, не може да бъде изтрито първо: „1 newer incremental backup builds on this one and can't be restored without it. Delete it first.“
- Резервно копие, което се използва от изпълняваща се задача, не може да бъде изтрито: „This backup is being used by a running job. Try again when it has finished.“
- Местата за съхранение **Email** не могат да изтриват имейли. Резервното копие изчезва от списъка за това място, а в журнала пише „Email can't delete files, so … stays there. Delete it there yourself if you need the space.“

**Look for backups at destinations** (показва се, когато имате места за съхранение) отваря малък панел. Натиснете **Look for backups** в него, за да се прегледа папката на този сайт на всяко място за съхранение, което е включено и може да изброява файлове (всички освен Email), и да се добавят намерените там резервни копия: „Looking for backups at your destinations…“. Използвайте го след възстановяване на по-стара база данни или след преинсталиране на плъгина.

По подразбиране се търси в папката на текущия адрес на сайта. За да търсите в друга папка, например тази на стария адрес на сайта, попълнете незадължителното поле **Site folder** („След преместване на нов адрес въведете папката на стария, напр. old-domain.com“). **Show the folders at my destinations** преглежда местата ви за съхранение и показва папките на другите сайтове с резервни копия в тях като бутони, които попълват полето („Folders of other sites: click one to use it.“ или „No folders of other sites were found.“). При големи места за съхранение това може да отнеме известно време. Вижте [След смяна на домейна](#след-смяна-на-домейна).

Непълно резервно копие на този сървър (такова, което е спряло, преди да бъде записан манифестът му) не може да бъде възстановено. Натиснете **Delete** до него („Delete this incomplete backup from this server? It can't be restored, and this can't be undone.“) или го оставете: папките на незавършени резервни копия се премахват автоматично след два дни. Резервно копие, което все още се записва от изпълняваща се задача, никога не се предлага за изтриване.

### Последна активност

Картата **Recent activity** изброява последните 12 задачи с **Started**, **Job** (**Backup**, **Restore**, **Import**, **Package download**, **Download**, **Delete**, **Cleanup**, **Destination check**, **Migration package**), **Status** (**Waiting to start**, **Running**, **Finished**, **Finished with warnings**, **Failed**, **Cancelled**), **Details** (грешката, напредъкът или „Took 3 mins“ и броят предупреждения) и линк **View log**.

Докато подготвено възстановяване или импортиране ви чака, на реда му пише „Ready to restore. The link works until …“ и има бутон **Continue to the restore**. Бутонът вижда само администраторът, който го е стартирал, и само докато линкът не изтече (един час след проверката на резервното копие).

### Журнали

**View log** отваря журнала на същото място, със заглавие например „Log: Backup, October 12, 2026 3:00 am“. Всеки ред съдържа часа в UTC, ниво и какво се е случило. Пароли, ключове и токени никога не се записват в журналите. Журналите и завършените задачи се пазят 30 дни; за по-старите се показва „This log isn't available any more. Logs are kept for 30 days.“

### Изтегляне на резервни копия

Резервните копия, съхранени на този сървър, могат да се изтеглят с бутона **Download** в раздела Backups, от **Packages on this server** и от готовия пакет в раздела Migration, както и от раздела Recovery.

- **Download all** е най-лесният начин да запазите копие или да преместите резервно копие: един ZIP файл, кръстен на ID на резервното копие (например `20261012-191500-migration-a1b2c3.zip`), с всички файлове на резервното копие. Файловете в него не се компресират повторно (те вече са компресирани), така че създаването на ZIP файла почти не натоварва сървъра, а ZIP файлове над 4 GB също работят. Разархивирайте го, преди да използвате файловете: при разархивирането се получава папка с ID на резервното копие като име, готова за качване по FTP в папката за импортиране на друг сайт, или чиито файлове избирате в **Upload from your computer**.
- **Бутоните за файловете** изтеглят отделни файлове, с имената и размерите им. Използвайте ги, ако ви трябва само един файл или ако на компютъра ви няма място за ZIP файла и съдържанието му.
- Големите изтегляния продължават оттам, където са спрели: ако връзката прекъсне, използвайте **Resume** в списъка с изтегляния на браузъра си. Линковете за изтегляне работят, докато сте влезли, до един ден след зареждането на страницата; ако някой от тях е спрял да работи, презаредете страницата.
- Ако изтеглянето не може да бъде изпратено, страницата казва защо (например „This backup file isn't stored on this server…“) и дава линк за връщане.
- Safari може да разархивира изтеглените `.gz` файлове („Open safe files after downloading“). Изключете това или използвайте **Download all**: файловете на резервното копие трябва да запазят имената си и окончанието `.gz`, за да могат да бъдат възстановени.

За да възстановите инкрементално резервно копие другаде, ви трябват и резервните копия, върху които то се надгражда: изтеглете всяко от тях.

---

## Раздел „Schedules“

„Графиците правят резервни копия вместо вас. Часовете са в часовата зона на сайта (…). WordPress ги стартира, когато сайтът получава посещения, така че при сайтове с много малко посещения резервното копие може да започне с няколко минути закъснение.“

Ако WP-Cron е изключен на сайта ви, се показва предупреждение: „WP-Cron is turned off on this site (DISABLE_WP_CRON). Make sure your server calls wp-cron.php every few minutes, otherwise schedules don't run.“

### Списък с графици

| Колона | Значение |
|---|---|
| **Schedule** | Името (натиснете го, за да редактирате), с **Off**, когато графикът е изключен. |
| **When** | Например „Every day at 3:00 am“ и „Incremental, full every 7 days“ или „Full backups“. |
| **Backs up** | Компонентите, „To: …“ (местата за съхранение или „This server“) и колко копия се пазят, например „Keeps the newest 7“. |
| **Next run** | Дата и час или —, когато е изключен. |
| **Last run** | Дата и час със състояние: **Done**, **Done with warnings** (неуспешно качване), **Running**, **Skipped**, **Cancelled** или **Failed**. Под него – причината, ако има такава (например „Skipped: the previous backup of this schedule was still running.“ или защо резервното копие е неуспешно), и линк **View log** към журнала на това изпълнение. „Not yet“ преди първото изпълнение. |

Действия: **Edit**, **Run now** (стартира веднага резервно копие с настройките на този график; следващото редовно изпълнение остава непроменено; отказва се със съобщението „A backup for this schedule is already running.“, докато има такова на опашка или в изпълнение), **Turn off** / **Turn on**, **Delete** („Delete this schedule? Backups it made are kept.“).

### Добавяне или редактиране на график

Натиснете **Add schedule** (формата вече е отворена, ако нямате график).

| Настройка | Какво прави | По подразбиране |
|---|---|---|
| **Name** | По желание, например „Нощно“. Без име графикът се нарича „Daily backup“, „Weekly backup“ и т.н. | Празно |
| **How often** | **Every hour**, **Every 6 hours**, **Every 12 hours**, **Every day**, **Every week** или **Every month**. | Every day |
| **Day of the week** | Само за **Every week**. | Monday |
| **Day of the month** | Само за **Every month**. „От 1 до 28, за да съществува денят във всеки месец.“ | 1 |
| **Time** | „Най-добре е спокоен час от денонощието. При ежечасни резервни копия се броят само минутите; при всеки 6 или 12 часа отброяването започва от този час.“ | 03:00 |
| **Type** | **Incremental (recommended)**: „Запазва само файловете, променени след последното резервно копие, което е бързо и заема малко място, и от време на време прави пълно резервно копие. Базата данни винаги се запазва изцяло.“ **Full every time**: „Всяко резервно копие е самостоятелно. Отнема повече време и място.“ | Incremental |
| **Full backup every … days** | Само за инкрементални. Ново пълно резервно копие започва, когато пълното копие на веригата достигне тази възраст. „Възстановяването на инкрементално резервно копие изисква пълното копие, върху което е изградено, затова и те се пазят.“ От 1 до 365. | 7 |
| **What to back up** | Компонентите. Всеки график пази собствения си избор. | Както в **Settings → What to back up** |
| **Where to keep it** | **This server** (винаги) плюс местата за съхранение, които отметнете. До изключено място за съхранение пише „(turned off: skipped until you turn it on)“. | Само този сървър: отметнете местата си за съхранение |
| **How many to keep** | **Keep the newest … backups and delete them after … days**. „0 означава без ограничение. По-старите резервни копия от този график се премахват след всяко ново.“ | 7 и 0 |
| **Status** | **On**. | On |

Натиснете **Add schedule** или **Save schedule**.

Как работят графиците:

- Всеки график има собствена верига от инкрементални резервни копия. Ръчните резервни копия и другите графици никога не се смесват с нея.
- Инкрементален график прави и пълно резервно копие, когато веригата не може да бъде продължена: добавено е място за съхранение, компонентите са променени, член на веригата липсва на място за съхранение или веригата е достигнала 50 резервни копия.
- Ако е дошло време за график, докато предишното му резервно копие все още е на опашка или се изпълнява, това изпълнение се пропуска (**Last run** показва **Skipped**).
- Различни графици, чието време е дошло едновременно, се изчакват: изпълнява се по една задача.
- Когато резервно копие по график изобщо не може да започне (например няма дисково пространство или е зададено криптиране без парола), **Last run** показва **Failed** и получавате имейла „[Site] Scheduled backup couldn't start“, ако имейлите при неуспех са включени.
- **How many to keep** се прилага за резервните копия на този график на всяко от неговите места за съхранение. Когато графикът няма място за съхранение, правилото се прилага и на този сървър. Копията на този сървър винаги следват **Settings → Retention**. Вижте [Ротация на копията и дисково пространство](#запазване-на-резервните-копия-и-дисково-пространство).

---

## Раздел „Destinations“

„Всяко резервно копие първо се създава на този сървър. Местата за съхранение пазят копия другаде, така че да можете да възстановите сайта си дори ако сървърът се повреди или бъде хакнат. Две места са по-сигурни от едно.“

### Списък с места за съхранение

Първият ред винаги е **This server**: „Винаги включен. Старите копия се премахват според Settings → Retention.“ Той показва **Ready** и свободното дисково пространство, с линк **Retention**.

Всяко място за съхранение показва името, типа и папката си, както и състояние:

| Състояние | Значение |
|---|---|
| **Ready** | Настройките са попълнени. (Използвайте **Test**, за да проверите връзката.) |
| **Connected** + профил | Има вход в Google Drive, Dropbox или OneDrive. |
| **Not connected** | Google Drive, Dropbox или OneDrive: отворете мястото за съхранение и натиснете **Connect …**. |
| **Reconnect needed** + причина | Входът е отменен, изтекъл е или вече не може да бъде прочетен: „The saved sign-in can't be read anymore (the site's security keys changed). Connect again.“ Отворете мястото за съхранение и натиснете **Reconnect**. |
| **Off** | „Графиците го пропускат.“ Ръчните резервни копия също не могат да го изберат. |
| **Needs attention** + проблеми | Липсва задължителна стойност или „A saved password or key can't be decrypted any more (the site's security keys changed). Enter it again.“ |
| **Not available** + причина | Този сървър не може да използва този тип, например „This server's PHP has no FTP support (the ftp extension). Ask your host to enable it, or use SFTP.“ |
| **Unknown type** | „Добавката, която го е предоставяла, може да е неактивна.“ |

Действия: **Edit**, **Test**, **Turn off** / **Turn on**, **Remove** („Remove this destination? Backups already stored there stay there, but this site stops using it.“).

**Test** качва малък файл, намира го в списъка с файлове, прочита го обратно и го изтрива: „It works: a test file was uploaded and deleted again.“ или „The test failed: …“.

### Добавяне на място за съхранение

1. Натиснете **Add destination** (изборът вече е отворен, ако нямате нито едно).
2. Под **Add a destination** натиснете плочката на услуга: **Google Drive**, **Dropbox**, **OneDrive / Microsoft 365**, **Amazon S3 and S3-compatible**, **Cloudflare R2**, **Backblaze B2**, **Microsoft Azure Blob Storage**, **SFTP**, **FTP / FTPS** или **Email**. Плочките, които сървърът не може да използва, са посивени, с посочена причина. Плочките показват и какво предоставя доставчикът безплатно, например **10 GB free** (в зелено: безплатно всеки месец) или **Free trials** (в синьо: за ограничен период), а картата с настройките обяснява предложението и дава линк към актуалните цени на доставчика. Вижте [Безплатно хранилище накратко](#безплатно-пространство-накратко).
3. Попълнете полетата на услугата. Задължителните полета са отбелязани с червена звездичка (*). Помощният текст на всяко поле казва откъде да вземете стойността; вижте [Настройване на всяко място за съхранение](#настройване-на-всяко-място-за-съхранение).
4. По желание въведете **Name** („Показва се само в този плъгин. По подразбиране е името на услугата.“), например „Google Drive (служебен профил)“.
5. Натиснете **Save destination**.

След запазване:

- Повечето места за съхранение се тестват веднага: „Destination saved and tested: backups can be stored there.“ или „Saved, but the connection test failed: …“ (настройките се запазват, така че можете да ги поправите).
- Google Drive, Dropbox, OneDrive: „Saved. Now click Connect to sign in to your account.“ Оставате на страницата на мястото за съхранение.
- SFTP без отпечатък на ключа на хоста: „The server sent its host key. Check it below and click "Trust this key" if it is the right one.“ Вижте [SFTP](#sftp).

Всяко място за съхранение освен Email има поле **Folder** (по подразбиране `SymeloBackups`): „Резервните копия се съхраняват в тази папка, в подпапка с името на този сайт (например SymeloBackups/example.com/), така че няколко сайта могат да ползват едно и също място за съхранение. За подпапки използвайте наклонени черти.“ Подпапката носи името на адреса на сайта (хост, порт и път).

### Редактиране на място за съхранение

Натиснете името му или **Edit**.

- Паролите, ключовете и тайните никога не се показват отново. В полето пише „Saved. Leave blank to keep it.“ Въведете нова стойност, за да я замените. Незадължителните тайни (например app secret за Dropbox или паролата на SSH ключ) имат отметка **Remove the saved value**.
- Типът на място за съхранение не може да се променя: вместо това добавете ново.
- Google Drive, Dropbox и OneDrive показват карта **Account**: **Connected** с „Backups are stored in you@example.com.“ и **Disconnect**; или **Reconnect needed** с причината, **Reconnect** и **Disconnect**; или „Not connected yet. Save the client ID and secret below, then sign in to allow this site to store backups in your account.“ с **Connect …**. Докато задължителна настройка все още е празна (например **Tenant** за OneDrive), се показва „Fill in the settings marked * below and save them. Then you can sign in to allow this site to store backups in your account.“, а мястото за съхранение показва **Needs attention** с, например, „Tenant is required.“
- Картата **Test, turn off or remove**: „Тестът качва малък файл, прочита папката и отново изтрива файла. Изключено място за съхранение се пропуска от графиците, но запазва настройките си.“ Бутони: **Test connection**, **Turn off** / **Turn on**, **Remove destination**.

Изключването на място за съхранение е полезно по време на поддръжка на хранилището: графиците го пропускат и го отбелязват в журнала си („The destination "…" is turned off and was skipped.“), а нищо друго не се променя.

Можете да имате до 50 места за съхранение.

---

## Раздел „Migration“

„Пакетът за миграция е пълно копие на този сайт (файлове, база данни и настройки), което друг сайт може да импортира. Използвайте го, за да се преместите на нов домейн или хостинг, или за да копирате друг сайт в този.“

Подробни инструкции стъпка по стъпка ще намерите в [Миграция и клониране](#миграция-и-клониране).

### Експортиране на този сайт

„Създава пакет с всичко, включително wp-config.php. Когато е готов, имате три начина да го преместите: да изтеглите файловете, да използвате инсталатора на нов сървър или да изпратите линка за миграция на друг сайт.“

Когато криптирането е включено: „Encryption is on, so the package is encrypted. You'll need your encryption password on the other site.“

Натиснете **Create migration package**. Пакетът се създава във фонов режим като резервно копие: „Creating the migration package. It runs in the background; the download links appear here when it is ready.“

Когато приключи, страницата се обновява сама и картата **Your migration package is ready** показва, заедно с датата на създаване и размера на пакета:

- **Send it straight to another site**: **Migration link** в поле само за четене с бутон **Copy**. „На другия сайт инсталирайте този плъгин и поставете линка в Migration → Pull from another site. Линкът работи до …. Всеки, който го има, може да изтегли пакета, затова не го споделяйте.“
- **Save the installer key now.** „Показва се само този път. Нужен ви е, за да стартирате installer.php на нов сървър; никой не може да използва инсталатора без него.“ Полето **Installer key** има бутон **Copy**. След презареждане: „The installer key was shown when the package was created and isn't shown again. If you didn't save it, create a new package.“
- **Or download it**: „За нов сървър изтеглете всички файлове и инсталатора.“ **Download all** (един ZIP), файловете един по един и **Installer** (`installer.php`). Вижте [Изтегляне на резервни копия](#изтегляне-на-резервни-копия).

Ако сте напуснали страницата, докато пакетът се е създавал, картата все още е там, когато се върнете в раздела Migration в рамките на два часа, с линка и (ако още не сте го видели) ключа за инсталатора.

**Packages on this server** изброява до пет пакета. Всеки има два бутона:

- **Get link** създава нов линк за миграция и го показва на място, с бутон **Copy** и срока му на валидност. Всеки линк работи 48 часа; линковете, създадени преди това, продължават да работят, докато не изтекат. Използвайте го винаги когато ви трябва линк: първият е изтекъл, изгубен е или искате да изпратите пакета на друг сайт.
- **Download** отваря същите изтегляния като в раздела Backups.

„Пакетите са изброени и в раздела Backups, където можете да ги изтриете.“

Пакетите за миграция се пазят само на този сървър; те не се качват на местата за съхранение. Броят се към правилото за ротация на този сървър (вижте [Ротация на копията и дисково пространство](#запазване-на-резервните-копия-и-дисково-пространство)).

### Преместване на нов сървър

Картата повтаря стъпките за празен сървър:

1. „Създайте пакет за миграция и запазете ключа за инсталатора.“
2. „Изтеглете всички файлове на пакета и installer.php.“
3. „На новия сървър създайте празна база данни, след което качете installer.php и файловете на пакета в папката, в която трябва да бъде сайтът.“
4. „Отворете installer.php в браузъра си (например https://example.com/installer.php), въведете ключа за инсталатора и данните за новата база данни.“
5. „Когато приключи, влезте както обикновено. Проверете дали installer.php и файловете на пакета са изчезнали от сървъра.“

„Ако там вече е инсталиран WordPress, инсталирайте този плъгин и импортирайте пакета (по-долу).“

### Импортиране на сайт в този

„Импортирането заменя всичко на този сайт (съдържание, потребители, плъгини, теми и настройки) с другия сайт. След това влизате с потребителските имена и паролите на другия сайт.“

Импортирането винаги става на две стъпки: първо пакетът попада на този сайт (качен, копиран по FTP или изтеглен от другия сайт), след което го импортирате. Получаването на пакета тук не променя нищо на този сайт. Има три начина да получите пакет тук. И при трите той се появява под **Packages ready to import**, а най-новият, който още не е импортиран, се появява и най-горе в раздела Migration (вижте **A package is ready to import** по-долу).

**Upload from your computer**

„Изберете всички файлове на пакета: manifest.json и файловете .gz (.enc, когато пакетът е криптиран). Големите файлове се изпращат на малки части, така че ограничението за качване на хостинга ви няма значение, а прекъснато качване продължава оттам, където е спряло.“

1. Изберете файловете (може и няколко наведнъж).
2. Натиснете **Upload**. Всеки файл показва напредъка си („12 MB of 480 MB“). Налични са **Pause** и **Resume**.
3. Когато пакетът е пълен: „Package … is complete.“ с бутон **Import this package**. Иначе „Still missing: …“.

Ако качването спре, изберете отново същите файлове: качването продължава оттам, където е спряло. Файлове, които не са част от пакет, се отказват („Not a backup package file. Choose manifest.json and the .gz or .enc files of a backup.“). Качването изисква свободно дисково пространство, равно на размера на файла плюс 50 MB.

**Files uploaded by FTP**

„С FTP или файловия мениджър на хостинга си създайте папка с името на ID на резервното копие в папката по-долу и поставете всички файлове на пакета в нея. ID на резервното копие е началото на имената на файловете, например 20261012-191500-migration-a1b2c3.“ Полето **Import folder** показва папката, например `wp-content/uploads/symelo-backups-…/import/`. „След това натиснете "Look for packages" по-долу.“

Качвайте в двоичен (binary) режим, за да не се променят файловете по пътя.

**Pull from another site**

„На другия сайт създайте пакет за миграция (или натиснете "Get link" до някой пакет) и копирайте линка му за миграция. След това:“

1. „**Download.** Поставете линка по-долу. Този сайт копира пакета от другия сайт, от сървър на сървър, в папката си за импортиране. Нищо на този сайт не се променя и можете да напуснете страницата, докато тече изтеглянето.“
2. „**Import.** Когато изтеглянето приключи, пакетът се появява най-горе в този раздел с бутон Import. Импортирането е отделна стъпка, която стартирате сами: то заменя този сайт с другия.“

Поставете линка в полето **Migration link** и натиснете **Download the package**. Линкът за миграция е дълъг код, който започва със `symelo-migrate:`, а не уеб адрес. „Поставете целия линк: той започва със "symelo-migrate:" и работи 48 часа след създаването си. Интервалите и новите редове, добавени при копирането, се пренебрегват.“ Кавичките или ъгловите скоби около него също се пренебрегват.

Преди да се изтегли каквото и да е, плъгинът проверява линка и пита другия сайт дали го приема, така че проблемите се виждат веднага и съобщението казва какво не е наред: текстът не е линк за миграция (например е уеб адрес), линкът е отрязан при копирането, изтекъл е, другият сайт е отхвърлил подписа му или другият сайт не може да бъде достигнат. Вижте [Проблеми при миграция](#проблеми-при-миграция).

След това: „Downloading the package from the other site. This only copies it to this site: when it is done, it appears at the top of this tab, and nothing is imported until you click Import.“ Картата за напредъка най-горе на страницата показва процента и файла, който се изтегля („Downloading file 2 of 5: … (120 MB of 480 MB)“), а картата Pull показва „A package is downloading now.“ Можете да напуснете страницата: изтеглянето продължава във фонов режим. Контролната сума на всеки файл се проверява. Когато изтеглянето приключи, страницата отваря раздела Migration при изтегления пакет. Линк за миграция не може да се използва на сайта, който го е създал: „This migration link is from this site. Paste it into the site you are moving to.“

**A package is ready to import**

Докато чака пълен пакет, който още не е импортиран, разделът Migration започва с тази карта: откъде идва пакетът (**From**), **Made on**, **Size** и дали е **Encrypted**, след това **What happens when you import it**:

1. „Проверявате данните и потвърждавате на следващия екран. Дотогава нищо не се променя.“
2. „Този сайт проверява пакета. Това отнема минута-две, а сайтът остава онлайн.“
3. „Отваря се екранът за възстановяване, който стъпка по стъпка заменя съдържанието, потребителите, плъгините, темите и настройките на този сайт с тези от пакета. Посетителите виждат съобщение за поддръжка, докато това приключи.“ Плюс „Links to … are changed to …“, когато адресът е различен.
4. „След това влизате с потребителско име и парола от другия сайт.“

**Review and import** отваря формата **Import this package**. **Back up this site first** води към раздела Backups. Когато чакат няколко пакета, се показва най-новият, а картата казва колко още са изброени по-долу. След като импортирането на пакет е стартирано, картата вече не го показва; списъкът го отбелязва с **Import started …**.

**Packages ready to import**

**Look for packages** опреснява списъка. За всеки пакет се показват **Package** (дата и ID), **From** (старият адрес), **Size** и **Status**: **Complete**, **Imported** с датата или **Files missing** с имената на липсващите файлове. Натиснете **Import** до пълен пакет. **Delete** премахва файловете на пакета от папката за импортиране: „Delete this package? Its files are removed from the import folder on this server. This can't be undone.“

**Automatic cleanup.** „Пакетите се изтриват автоматично 7 дни след края на импортирането им, заедно с работните им файлове. Пакетите, които не са импортирани, остават, докато не ги изтриете.“ Импортираният пакет показва кога ще стане това („Deleted automatically on …“), с бутон **Delete now**, който го изтрива веднага, и **Import again**, ако ви потрябва отново преди това. Почистването се изпълнява веднъж дневно с WP-Cron, а също и когато администратор отвори wp-admin, ако ежедневното изпълнение не е ставало от 12 часа (за сайтове, на които WP-Cron е изключен). Пакет, който се използва от изпълняваща се задача, се запазва до следващото изпълнение. Пакетите, качени или изтеглени отново след импортиране, се броят за нови.

Формата **Import this package** показва **Made on**, **Size** и **Links** (стар адрес → адреса на този сайт), както и две предупреждения:

- „Everything on this site is replaced. Posts, pages, users, plugins, themes, media and settings all come from the package. Afterwards you log in with a username and password from the other site. Make a backup of this site first if you might need it.“
- „Your site will be in maintenance mode during the import. Keep this browser tab open until it says it's done.“

„Packages from another site can't be verified here, so only import packages you made yourself or trust.“

Под **What happens after you click Import** формата изброява следващите стъпки: пакетът се проверява, докато сайтът остава онлайн, екранът за възстановяване се отваря сам и показва всяка стъпка с напредъка ѝ и журнал, а ако връзката прекъсне, повторното отваряне на адреса на екрана за възстановяване продължава оттам, където е спряло.

Въведете **Encryption password** („Нужна е само когато пакетът е криптиран: въведете паролата за криптиране на сайта, който го е създал.“), отметнете „I understand that this site's content and users will be replaced.“ и натиснете **Import and replace this site**. Плъгинът пита още веднъж: „Import this package and replace this site? This can't be undone without a backup.“

Пакетът се проверява („Getting the package ready. The import starts as soon as it has been checked.“), след което браузърът ви продължава към страницата за възстановяване, както при възстановяване. Вижте [Какво се случва по време на възстановяване](#какво-се-случва-по-време-на-възстановяване).

Импортирането се отказва, преди каквото и да е да бъде променено, когато пакетът не пасва на този сайт: пакет от мрежа от сайтове на единичен сайт, пакет от единичен сайт в мрежа от сайтове или мрежов пакет от друг домейн или път. Вижте [Мрежа от сайтове (Multisite)](#мултисайт).

Пакетите остават в папката за импортиране 7 дни след края на импортирането, след което се изтриват автоматично (вижте **Automatic cleanup** по-горе).

### Преминаване към окончателния домейн

След импортиране сайтът има адреса на сайта, в който сте импортирали, например адрес на тестова среда. Често това е само спирка по пътя: проверявате копието и след това то трябва да поеме истинския домейн. Плъгинът помни откъде е дошъл сайтът, а Таблото, екранът Разширения и екраните на този плъгин показват:

„Този сайт е мигриран от … към …. Когато проверите, че всичко работи, можете да го преместите на окончателния му домейн.“

- **Change domain** отваря картата **Switch to the final domain** най-горе в раздела Migration.
- **Keep this domain**: сайтът остава на адреса си, а известието изчезва завинаги („OK: the site keeps …“).
- **Not now** скрива известието за вас за една седмица.

Картата има три стъпки:

1. **Check the new address (dry run).** Полето **Final address** е попълнено с адреса, от който е дошъл сайтът; променете го, ако сайтът трябва да отиде другаде (адресът трябва да започва с `https://`). **Dry run** преброява какво би обновила смяната и не променя нищо: „The change updates … rows in … tables, plus the site address and the WordPress address under Settings → General. Nothing has changed yet.“, заедно с таблиците с най-много промени. Стойностите, които не могат да бъдат променени (новият адрес е твърде дълъг за колоната им), се посочват отделно, а **See the details in the log** изброява всяка таблица. Пробното изпълнение е валидно един ден, за адреса, за който е направено.
2. **Make a backup.** „Ако нещо се обърка, възстановяването на резервно копие връща …. Смяната засяга само базата данни, така че е достатъчно резервно копие на базата данни.“ **Back up the database now** стартира такова (с бележка „Before the domain change“).
3. **Change the domain.** Прочетете какво ще се случи: „След това този сайт отговаря само на …“
   - „Името на домейна (DNS) и хостингът ви трябва вече да изпращат … към този сървър, с валиден HTTPS сертификат. В противен случай никой, включително вие, няма да може да достигне сайта, докато това не стане.“
   - „Тук ще излезете от профила си. Когато смяната приключи, тази страница показва бутон към администрацията на новия адрес: влезте там със същото потребителско име и парола.“
   - Старият адрес спира да показва сайта, освен ако хостингът ви не го пренасочва към новия.
   - „Това отнема от няколко секунди до няколко минути и завършва на сървъра, дори ако тази страница загуби връзка.“

   Отметнете „I understand: the site moves to …, and I will log in again there.“ и натиснете **Change the domain now** (плъгинът пита още веднъж).

Смяната заменя всички варианти на текущия адрес по същия начин като импортирането (вижте [Замяна на адреси](#замяна-на-адреси)), на сървъра и на кратки стъпки, таблица по таблица. Таблицата с настройки (`wp_options`) е последна, в една стъпка заедно с адреса на сайта и адреса на WordPress: много плъгини пазят там собствено копие на адреса (плъгини за SSL, сигурност, кеширане, многоезичност или „force domain“), а някои от тях пренасочват всяко посещение към това копие, така че ако се променят по-рано, сайтът би се преместил, докато смяната още тече. Тази последна стъпка се изпълнява в една транзакция на базата данни: или се запазва цялата, или нищо. Тя също изтрива запазените правила за постоянните връзки (WordPress ги създава наново) и изчиства обектния кеш. Дотогава сайтът продължава да работи на текущия адрес.

Картата за напредъка най-горе в раздела Migration следи смяната. Сесията ви на този адрес приключва, когато сайтът се превключи, затова страницата продължава да чете напредъка с еднократен ключ, който показва само докъде е стигнала смяната. Когато смяната приключи, тя казва:

„The domain change is complete. This site now answers at …“

- **Open the new admin** отваря страницата за вход на новия адрес; след като влезете, се връщате в раздела Migration.
- **Open the site** отваря началната страница на новия адрес.
- „Ако … все още не води към този сървър, тези бутони отварят това, към което води в момента.“ Панелът показва двата реда за wp-config.php, с които сайтът отново отговаря на стария си адрес, докато домейнът не започне да сочи тук (вижте [Проблеми при смяна на домейна](#проблеми-при-смяна-на-домейна)); възстановяването на резервното копие на базата данни, направено преди това, отменя смяната.

Страницата не преминава сама на новия адрес. Ако загуби връзка със сайта, преди смяната да приключи, тя казва това и показва **Open the new admin** и **Reload this page**: смяната продължава да тече на сървъра и ако е приключила, сайтът отговаря на новия адрес. След това разделът Migration на новия адрес показва **The domain was changed** с журнала на смяната и какво да проверите: няколко страници, пренасочване от стария адрес при хостинга ви и услугите извън WordPress, които знаят адреса (търсачки, CDN, услуги за плащане или имейл).

Без импортиране **Change this site's domain** (линк най-горе в раздела Migration) отваря същата карта. Тя не е налична в мрежа от сайтове (multisite), нито докато wp-config.php задава `WP_HOME` или `WP_SITEURL` (първо премахнете тези редове): картата казва защо.

---

## Раздел Recovery

„Таен адрес, който възстановява този сайт от резервно копие на този сървър, дори когато самият WordPress не работи: бял екран след обновяване, сринал се плъгин или хакнат сайт. Работи без вход, затова го пазете като парола.“

### Създаване на връзката

Щракнете **Create recovery link**. Страницата показва „Запазете тази връзка в мениджъра си за пароли сега. Тя се показва само този път. Ако я загубите, създайте нова.“ заедно с **Recovery link** и бутон **Copy**.

Връзката изглежда така: `https://example.com/wp-content/symelo-recovery/index.php?key=…`.

След това картата за състоянието съобщава „Връзката за възстановяване е включена. Създадена е на …“ и колко резервни копия може да възстанови: „С нея могат да се възстановят 3 резервни копия на този сървър.“ Ако няма локални резервни копия: „На този сървър все още няма резервни копия, така че връзката няма какво да възстанови. Пазете поне едно копие на този сървър.“

| Бутон | Какво прави |
|---|---|
| **Create a new link** | Заменя връзката; старата спира да работи. Пита „Да се създаде ли нова връзка за възстановяване? Текущата връзка ще спре да работи.“ |
| **Turn off** | Премахва инструмента за възстановяване; връзката спира да работи веднага. |

Инструментът за възстановяване се намира в `wp-content/symelo-recovery/`. Ако ново внедряване (redeploy) го премахне или ако се променят данните за базата данни, пътищата, версията на плъгина или паролата за криптиране, плъгинът го настройва отново със същата връзка при следващото отваряне на страница в wp-admin. Ако това не е възможно, картата съобщава „Файловете за възстановяване липсват или не могат да бъдат записани (възможно е внедряване да ги е премахнало). Създайте нова връзка, за да ги настроите отново.“

### Когато сайтът ви не работи

1. „Отворете връзката за възстановяване от мениджъра си за пароли.“
2. „Изберете най-новото резервно копие отпреди началото на проблема.“
3. „Следвайте стъпките. Файловете и базата данни се заменят точно както при нормално възстановяване, след което можете да влезете отново.“

„Връзката използва само резервни копия, съхранени на този сървър. Ако самият сървър вече го няма, инсталирайте WordPress и този плъгин на нов сървър, добавете същото място за съхранение, щракнете ‚Look for backups at destinations‘ в раздела Backups (въведете папката на стария сайт, ако адресът е променен) и възстановете оттам. Или преместете пакет за миграция заедно с неговия инсталатор.“ Подробностите са в [Когато сайтът не работи: връзката за възстановяване](#когато-сайтът-не-работи-връзката-за-аварийно-възстановяване) и [На нов сървър](#на-нов-сървър-installerphp).

### Възстановяване без този сайт

„Пакетът за миграция идва с installer.php – самостоятелен инструмент за възстановяване, който работи на всеки сървър, дори на празен. Пазете актуален пакет на сигурно място, за да сте готови за най-лошия случай.“

Когато на този сървър има пакет, картата показва „Най-новият пакет на този сървър: …“ с връзки за изтеглянето му. „Инсталаторът иска ключа на инсталатора, показан при създаването на пакета.“ Бутонът **Create a migration package** (или **Create a newer package**) отваря раздела Migration.

Инсталаторът работи само с пакети за миграция, а пакетите остават на този сървър. За да сте готови за пълна загуба на сървъра, изтеглете актуален пакет (всички файлове плюс `installer.php`) и го пазете на друго място заедно с ключа на инсталатора.

---

## Раздел Settings

Настройките са групирани в карти: **What to back up**, **Encryption**, **Retention**, **Notifications**, **Before updates** и **Advanced**. Връзките в горната част водят до всяка карта. Всяка карта има собствен бутон **Save changes**: „Настройките са запазени.“

### Какво да включва резервното копие

„Използва се от ‚Back up now‘ и от новите графици. Всеки график пази собствения си избор.“

| Настройка | Какво прави | По подразбиране |
|---|---|---|
| Компоненти | **Database**, **Plugins**, **Themes**, **Media uploads**, **Other content**, **WordPress core**. Вижте [Back up now](#картата-back-up-now). Нужен е поне един. | Всички без WordPress core |
| **Include wp-config.php** | „Съдържа данните за достъп до базата данни и ключовете за сигурност. Запазва се в резервното копие, но никога не се копира автоматично върху работещия файл, така че възстановяването не може да ви остави без достъп.“ Инсталаторът го използва, за да настрои новия сайт. Запазва се само когато резервното копие включва файлове. | Включено |

**Leave out**

| Настройка | Какво прави | По подразбиране |
|---|---|---|
| **Folders and files** | „По един на ред, относително спрямо папката на WordPress. * съвпада с всичко, така че */node_modules изключва всяка папка node_modules. Стойностите по подразбиране пропускат кеша и архивите на други плъгини за резервни копия.“ Изключването на папка изключва и всичко в нея. До 200 реда. **Use the defaults** попълва отново списъка по подразбиране. | Вижте по-долу |
| **File types** | Разширения без точката, разделени със запетаи. | `log, tmp` |
| **Files larger than … MB** | „Размер 0 означава без ограничение.“ | 0 |

Изключенията по подразбиране:

```
wp-content/cache
wp-content/upgrade
wp-content/upgrade-temp-backup
wp-content/updraft
wp-content/ai1wm-backups
wp-content/backups-dup-lite
wp-content/backups-dup-pro
wp-content/wpvividbackups
wp-content/uploads/backwpup-*
*/node_modules
*/.git
```

Шаблоните се сравняват с целия път. Например `wp-content/uploads/2019` изключва качените файлове от тази година, а `*.zip` изключва всеки .zip файл. Шаблоните могат да съдържат букви, цифри, интервали и `. _ * / @ + -`, но не и `..`; всички други се отхвърлят: „‚…‘ не е валиден път за изключване и беше пропуснат.“

Винаги се изключват, независимо от настройките: собствената папка на плъгина за резервни копия, инструментите за възстановяване (restore и recovery), `.maintenance` и wp-config.php (запазва се отделно, вижте по-горе).

**Database tables**

| Опция | Описание в плъгина |
|---|---|
| **This site's tables (starting with wp_)** (по подразбиране) | „Препоръчително. Таблиците на друг софтуер в същата база данни се изключват.“ При multisite това включва таблиците на всеки сайт. |
| **All tables in the database** | „Включва таблици, които не принадлежат на WordPress.“ |
| **Only the tables I choose** | „За специални конфигурации. Изключването на таблици на WordPress може да направи възстановяването непълно.“ Появява се списък с всички таблици и размера им; отметнете тези, които да влязат в резервното копие. |

### Настройки за криптиране

„Криптираните резервни копия могат да бъдат отворени само с вашата парола, така че изтекло или откраднато копие не разкрива нищо. Те се криптират, преди да напуснат този сървър.“

| Опция | Описание в плъгина |
|---|---|
| **Off** (по подразбиране) | „Резервните копия могат да се отварят с обикновени инструменти.“ |
| **Encrypt the database** | „Защитава потребителските акаунти, поръчките и настройките. Файловете остават четими.“ |
| **Encrypt everything** | „Базата данни и всички файлове. Най-сигурният избор, когато резервните копия се съхраняват при облачен доставчик.“ |

В **Password** въведете **New password** (поне 8 знака; „най-добре е дълга парола-фраза“) и **Repeat it**. Червено каре ви напомня: „Ако загубите тази парола, никой не може да възстанови криптираните ви резервни копия, включително ние. Запазете я в мениджъра си за пароли. Тя ви трябва и за възстановяване на резервно копие на друг сайт или сървър.“

Изборът на режим без парола не включва криптирането: „Задайте парола, за да включите криптирането.“ След като паролата е зададена, картата показва **A password is set** („Оставете полетата празни, за да я запазите.“) и карта **Remove the password**. Вижте [Криптиране](#криптиране).

### Запазване

„Колко резервни копия остават на този сървър. Копията в местата за съхранение следват собствената настройка на всеки график.“

| Настройка | По подразбиране |
|---|---|
| **Keep the newest … backups** (от 0 до 1000) | 5 |
| **and delete them after … days** (от 0 до 3650) | 0 |

„0 означава без ограничение. Резервните копия заемат дисково пространство, затова пазете само необходимото; пълните резервни копия, върху които надграждат по-новите инкрементални, се запазват автоматично.“ Картата показва и свободното дисково пространство. Вижте [Запазване и дисково пространство](#запазване-на-резервните-копия-и-дисково-пространство).

### Известия

| Настройка | Какво прави | По подразбиране |
|---|---|---|
| **Email me when a backup fails** | Също когато резервното копие е завършено, но не е могло да бъде копирано в място за съхранение, когато планирано резервно копие не е могло да стартира и когато изтеглянето на пакет за миграция е неуспешно. | Включено |
| **Also email me when a backup succeeds** | Не важи за резервните копия преди обновяване. | Изключено |
| **Send to** | „Разделяйте няколко адреса със запетаи. Имейлите се изпращат с wp_mail(), така че SMTP плъгин като Symelo SMTP подобрява доставката.“ До 10 адреса. | Имейлът на администратора на сайта |

Какво съдържат имейлите, вижте в [Известия, имейли и Здраве на сайта](#известия-имейли-и-здраве-на-сайта).

### Преди обновявания

| Настройка | Какво прави | По подразбиране |
|---|---|---|
| **Back up before updates** | „Преди WordPress да обнови плъгин, тема или себе си (включително при автоматични обновявания), се прави бързо резервно копие на базата данни и на това, което се обновява, така че неуспешно обновяване да може да бъде отменено. Това добавя няколко секунди към всяко обновяване.“ | Включено |
| **Keep the newest … of these backups** (от 1 до 50) | По-старите резервни копия отпреди обновявания се премахват. | 3 |

Под настройките картата показва как е минало последното резервно копие преди обновяване: „Последно резервно копие преди обновяване: … (преди …)“ с **Done**, **Skipped** или **Failed** и какво се е случило, например „Направено е резервно копие преди обновяването на плъгина Akismet.“ или „Не беше направено резервно копие преди обновяването на плъгина Akismet, защото се изпълняваше друго резервно копие. Обновяването продължи.“ Пропуснатите и неуспешните резултати са откроени. Преди първото обновяване: „Все още не е правено резервно копие преди обновяване.“

Вижте [Резервни копия преди обновявания](#резервни-копия-преди-обновяване).

### Разширени

**Speed**: „Резервните копия се изпълняват на кратки стъпки във фонов режим. Тази настройка определя доколко могат да натоварват сървъра.“

| Скорост | Описание в плъгина | Продължителност на стъпка | Пауза между стъпките | Изчаква, когато натоварването на процесорно ядро е поне |
|---|---|---|---|---|
| **Fast** | „Дълги стъпки, една след друга. За самостоятелни (dedicated) сървъри или спокойни периоди.“ | 25 с | Няма | Никога |
| **Normal (recommended)** (по подразбиране) | „Равномерна работа, която спира на пауза, когато сървърът е претоварен.“ | 15 с | Няма | 2.0 |
| **Gentle, for small servers** | „Кратки стъпки с паузи между тях и изчакване, когато сървърът е зает. Резервните копия отнемат повече време, но посетителите няма да забележат.“ | 6 с | 20 с | 0.7 |

- Стъпката никога не продължава повече, отколкото позволява времевият лимит на PHP (лимитът минус 10 секунди, но поне 5 секунди).
- Проверката на натоварването изисква сървър, който отчита натоварването си. Където това не е възможно (например под Windows), работата никога не изчаква.
- Докато екранът Backups е отворен, той също изпълнява кратки стъпки от 3 до 8 секунди.
- WP-CLI, маршрутът `run` на REST API и резервните копия преди обновявания не правят паузи и не изчакват натоварен сървър.
- Ако скоростта е зададена в wp-config.php: „Зададено чрез SYMELO_BACKUPS_SPEED в wp-config.php.“

**Archives**

| Настройка | Какво прави | По подразбиране |
|---|---|---|
| **Split archives into parts of … MB** (от 10 до 4096) | „По-малките части се качват по-надеждно в някои места за съхранение и се вписват в ограниченията за размер на имейлите. Един голям файл все пак може да направи част по-голяма.“ | 500 |
| **Compression** (от 1 до 9) | „1 е най-бързо, 9 дава най-малките файлове. 6 е добър баланс. Изображенията и видеоклиповете почти не се свиват при което и да е ниво.“ | 6 |

**When the plugin is deleted**

| Настройка | Какво прави | По подразбиране |
|---|---|---|
| **Also delete its data** | „Премахва настройките, графиците, местата за съхранение и данните за вход, когато изтриете плъгина. Резервните копия никога не се изтриват: тези на този сървър и в местата ви за съхранение остават, където са, така че все още можете да ги възстановите.“ | Изключено |

Каквото и да изберете, изтриването на плъгина винаги премахва връзката за възстановяване и останалите инструменти за възстановяване. Вижте [Деактивиране и деинсталиране](#деактивиране-и-деинсталиране).

---

## Раздел Support

- **Get help**: „Повечето проблеми се свеждат до дисковото пространство, данните за вход на място за съхранение или фонови заявки, блокирани от хостинга. Журналът на неуспешна задача обикновено казва точно какво се е объркало.“ Връзки към **Recent activity and logs**, **Test your destinations** и **Check Site Health**, както и бутон **Email support** (office@symelo.com).
- **System information**: текстов отчет с версията на плъгина, папката за съхранение (случайната ѝ част е маскирана) и дали в нея може да се записва, свободното дисково пространство, резервните копия, графиците, текущата и последните задачи, настройките ви, местата за съхранение (само имена и типове), данни за WordPress и сървъра, разширенията на PHP (включително дали е наличен Argon2id) и забранените функции. „Никога не включва пароли, ключове, токени или връзки.“ Щракнете **Copy system information** и го поставете в имейла си до поддръжката.
- **About Symelo LTD**: кой прави плъгина, с връзка към symelo.com.

---

## Известия, имейли и Здраве на сайта

### Известия в администрацията

На Таблото и на екрана Разширения, когато последната задача за резервно копие е неуспешна:

„Symelo Backups: последното резервно копие (дата) е неуспешно: …“ с връзка **See what happened** към журнала му. Известието изчезва след следващото успешно резервно копие.

След миграция, на Таблото, на екрана Разширения и на собствения екран на плъгина (само за администратори):

„Symelo Backups: Този сайт е мигриран от … към …. Когато проверите, че всичко работи, можете да го преместите на окончателния му домейн.“ с **Change domain**, **Keep this domain** (известието изчезва завинаги) и **Not now** (скрива се за вас за една седмица). Вижте [Преминаване към окончателния домейн](#преминаване-към-окончателния-домейн).

На собствения екран на плъгина, когато ключът, с който се подписват резервните ви копия, е трябвало да бъде заменен:

„Ключът, с който се подписват резервните ви копия, трябваше да бъде заменен (ключовете за сигурност на сайта са променени). Резервните копия, направени преди …, ще се показват като ‚от друг сайт‘ и възстановяването им изисква едно допълнително потвърждение.“ Щракнете **Dismiss**, след като го прочетете. Вижте [Резервни копия, отбелязани като от друг сайт](#резервни-копия-отбелязани-като-направени-от-друг-сайт).

### Имейли

Имейлите се изпращат до адресите в **Send to** в **Settings → Notifications** като обикновен текст чрез `wp_mail()`.

| Тема | Кога |
|---|---|
| „[Сайт] Резервното копие е неуспешно“ | Резервно копие е неуспешно. „Не е запазено ново резервно копие; по-ранните ви резервни копия не са засегнати.“ |
| „[Сайт] Резервното копие е завършено, но качването е неуспешно“ | Резервното копие е завършено на този сървър, но не е могло да бъде копирано във всички места за съхранение. |
| „[Сайт] Резервното копие е завършено“ | Само при включено **Also email me when a backup succeeds**. |
| „[Сайт] Планираното резервно копие не можа да стартира“ | Настъпил е часът за изпълнение на график, но резервното му копие не е могло да стартира; посочена е причината. |
| „[Сайт] Изтеглянето на пакета за миграция е неуспешно“ / „[Сайт] Пакетът за миграция е изтеглен“ | Изтегляне с връзка за миграция е неуспешно или е завършило. |

Имейлите за резервни копия съдържат ID на резервното копие, кой го е стартирал (администратор, график, обновяване или експорт за миграция), компонентите, началния час, продължителността и размера, всяко място за съхранение („качено“ или „неуспешно (…)“), до 10 предупреждения и връзка към екрана Backups.

### Здраве на сайта

**Инструменти → Здраве на сайта** включва шест проверки:

| Проверка | Добър резултат | Проблем и решение |
|---|---|---|
| Сайтът ви има скорошно резервно копие | „Последното успешно резервно копие е отпреди ….“ | „Сайтът ви все още няма резервно копие“ (направете такова и настройте график). „Планираните резервни копия не се изпълняват“: последното резервно копие е по-старо от два пъти интервала на най-честия ви график. Проверете екрана Backups за неуспешни задачи и се уверете, че WP-Cron работи. |
| Резервните копия не могат да бъдат изтеглени от уеб | „Уеб сървърът отказва заявки за файлове в папката с резервни копия.“ | „Папката с резервни копия може да бъде отворена от уеб“: сървърът пренебрегва защитните файлове (например Nginx). Вижте [Поверителност и сигурност](#поверителност-и-сигурност). „Защитата на папката с резервни копия не можа да бъде проверена“: сайтът не е успял да заяви тестов файл от самия себе си. |
| Местата за съхранение на резервни копия работят | „Нито едно място за съхранение не е съобщило за грешка наскоро.“ | „Място за съхранение на резервни копия има проблеми“, с грешката на всяко място от последното резервно копие или извличане на списък. |
| Има достатъчно дисково пространство за резервни копия | „Свободни са … дисково пространство; последното резервно копие е заело …“ | „Дисковото пространство за резервни копия намалява“ (по-малко от два пъти размера на последното копие) или „Няма достатъчно дисково пространство за следващото резервно копие“ (по-малко от размера на последното копие). |
| Резервните копия се изпълняват във фонов режим | „Няма блокирала задача за резервно копие.“ | „Задача за резервно копие е блокирала“: задача не е напреднала от 30 минути. Вижте [Задачите не стартират или блокират](#задачите-не-стартират-или-блокират). |
| Този сайт разпознава собствените си резервни копия | „Ключът, който отбелязва резервните копия като направени от този сайт, е непокътнат, така че при възстановяване може да се провери, че резервното копие не е променяно.“ | „По-старите резервни копия се показват като направени от друг сайт“: ключът за подписване вече не е могъл да бъде прочетен (ключовете за сигурност в wp-config.php или `SYMELO_BACKUPS_KEY` са променени или е импортирана базата данни на друг сайт), затова на показаната дата е създаден нов. По-старите резервни копия все още могат да се възстановят след потвърждение. Затварянето на известието на екрана на плъгина също изчиства този резултат. Вижте [Резервни копия, отбелязани като от друг сайт](#резервни-копия-отбелязани-като-направени-от-друг-сайт). |

Резултатът от проверката на защитата се запомня за 12 часа.

**Здраве на сайта → Информация → Symelo Backups and Migration** показва версията, папката с резервни копия, свободното дисково пространство, броя на резервните копия (всички и колко от тях са на този сървър), последното успешно резервно копие, графиците, местата за съхранение, криптирането, скоростта, дали са включени резервните копия преди обновявания и връзката за възстановяване, кога за последно е работил фоновият изпълнител (и евентуална грешка при изпращането на заявката му) и дали съществува събитието в планировчика.

---

## Настройване на всяко място за съхранение

Общи съвети:

- Създайте отделен акаунт, ключ или приложение само за резервни копия, с достъп единствено до мястото, където се пазят те.
- Дръжте бъкетите, контейнерите и папките частни.
- След запазване проверете дали тестът минава успешно. Проблемите на дадено място за съхранение се виждат и в списъка Backups (липсващи копия), и в Здраве на сайта.
- Таблата за управление на доставчиците се променят често. Ако име на меню по-долу не съвпада точно, потърсете най-близкото съответствие.

### Безплатно пространство накратко

Няколко доставчика съхраняват резервни копия безплатно, което е достатъчно за много малки и средни сайтове, особено с инкрементални резервни копия и правила за запазване. Предложенията по-долу са проверени на 12 октомври 2026 г. Доставчиците ги променят, затова проверете страницата с цени на доставчика (има връзка към нея в картата с настройки на всяко място за съхранение), преди да разчитате на някое от тях.

| Място за съхранение | Безплатно пространство | За колко време |
|---|---|---|
| Google Drive | 15 GB на Google акаунт, споделени с Gmail и Google Photos | Без срок |
| Cloudflare R2 | 10 GB (клас на съхранение Standard), 1 милион заявки за запис и 10 милиона заявки за четене на месец. Изтеглянията никога не се таксуват, така че възстановяванията са безплатни. | Без срок, всеки месец |
| Backblaze B2 | Първите 10 GB. Изтеглянията са безплатни до три пъти обема, който съхранявате, всеки месец. | Без срок |
| OneDrive / Microsoft 365 | 5 GB на акаунт в Microsoft, споделени с прикачените файлове в Outlook.com | Без срок |
| Dropbox | 2 GB (Dropbox Basic) | Без срок |
| Microsoft Azure Blob Storage | 5 GB hot blob хранилище (локално резервирано), плюс кредит от $200 за първите 30 дни, с нов безплатен акаунт в Azure | 12 месеца |
| Amazon S3 | Няма безплатно пространство. Новите акаунти в AWS получават кредит от $100 (до $200) по безплатния план. | До 6 месеца |
| Wasabi (S3-съвместимо) | Пробен период с до 1 TB, без кредитна карта | 30 дни |
| Scaleway (S3-съвместимо) | 750 GB за нови потребители на Object Storage | 90 дни |
| DigitalOcean Spaces (S3-съвместимо) | Няма ($5 на месец за 250 GiB) | – |
| SFTP, FTP / FTPS | Вашият собствен сървър или хостинг акаунт | – |
| Имейл | Ограничено от пощенската ви кутия и от ограничението за размер на прикачените файлове | – |

За да прецените какво ще се побере: резервните копия са компресирани, но изображенията и видеоклиповете почти не се свиват, така че пълното резервно копие обикновено е между половината и целия размер на файловете на сайта плюс базата данни. Всяко инкрементално резервно копие съхранява само промененото. Разделът Backups показва размера на всяко резервно копие.

### Google Drive

„Съхранявайте резервни копия в Google Drive (личен или Google Workspace). Влизате с Google; не се съхранява парола.“

Еднократно създавате собствено Google приложение. Стъпки (от помощния текст на полетата):

1. В Google Cloud Console създайте проект (или изберете съществуващ) и активирайте **Google Drive API**.
2. Отворете **Google Auth platform** и задайте аудиторията:
   - Google Workspace: **Internal**.
   - Личен Google акаунт: **External**, след това **Publish app**. „В режим Testing Google прекратява достъпа след 7 дни.“
3. Отидете в **Clients → Create client**, изберете **Web application** и добавете **Redirect URI**, показан във формата на мястото за съхранение, като оторизиран redirect URI. Той трябва да съвпада точно.
4. Копирайте **Client ID** и **Client secret** („Показва се, когато създадете клиента (Clients → вашият клиент → Client secrets).“).
5. В WordPress добавете място за съхранение **Google Drive**, поставете двете стойности, задайте **Folder** и щракнете **Save destination**.
6. Щракнете **Connect Google Drive**, изберете акаунта и разрешете достъпа. Връщате се със съобщението „Свързано с Google Drive като you@gmail.com.“

| Поле | Какво да въведете | По подразбиране |
|---|---|---|
| **Redirect URI** | Само за четене, с бутон **Copy**. Добавете го към вашия Google клиент. | – |
| **Client ID** (задължително) | Завършва на `.apps.googleusercontent.com`. | Празно |
| **Client secret** (задължително) | Съхранява се криптирано. | Празно |
| **Folder** | „Папка в Google Drive за резервните копия, напр. SymeloBackups. Използвайте / за подпапки. Плъгинът я създава сам: той вижда само папките и файловете, които сам е създал, но не и тези, които сте направили ръчно.“ | SymeloBackups |

Добре е да знаете:

- „Плъгинът иска достъп само до файловете, които създава, така че Google не изисква преглед на приложението.“ Той не вижда останалата част от вашия Drive.
- Поради това файловете, които качите или преместите ръчно в папката, са невидими за плъгина. Ако настроите мястото за съхранение на нов сайт и искате да виждате по-старите резервни копия, използвайте същото Google приложение (същия client ID).
- Ако промените client ID след свързването: „Client ID беше променен след свързването на Google Drive. Свържете отново Google Drive в раздела Destinations.“
- **Disconnect** отменя и достъпа в Google.
- Плъгинът опреснява данните за вход, които не са използвани 7 дни, за да не изтекат, докато не се използват.

### Dropbox

„Съхранявайте резервни копия в Dropbox, в папка на приложение или където и да е във вашия Dropbox. Влизате с Dropbox; не се съхранява парола.“

Стъпки (от помощния текст на полетата):

1. На dropbox.com/developers/apps щракнете **Create app**, изберете **Scoped access**, след това **App folder** (резервните копия отиват в `Apps/<app name>`) или **Full Dropbox**.
2. В раздела **Permissions** включете **files.metadata.read**, **files.content.write** и **files.content.read** и щракнете **Submit**.
3. В раздела **Settings** добавете **Redirect URI** от формата на мястото за съхранение, след това копирайте **App key**.
4. В WordPress добавете място за съхранение **Dropbox**, поставете **App key** и щракнете **Save destination**.
5. Щракнете **Connect Dropbox** и разрешете достъпа.

| Поле | Какво да въведете | По подразбиране |
|---|---|---|
| **App key** (задължително) | От раздела Settings на приложението. | Празно |
| **App secret** | „По избор: входът използва PKCE, за който не е нужен app secret. Ако го въведете, той се съхранява криптирано.“ | Празно |
| **Folder** | „Папка във вашия Dropbox за резервните копия, напр. SymeloBackups. Използвайте / за подпапки. При приложение от тип ‚App folder‘ тя е в Apps/<app name>/.“ | SymeloBackups |

Ако при свързването липсва разрешение: „Dropbox не предостави всички разрешения, необходими за резервните копия (липсват: …). Проверете разрешенията на приложението, щракнете отново ‚Connect‘ и разрешете достъп до файловете.“ Разрешенията, променени след свързването, влизат в сила едва след повторно свързване. **Disconnect** отменя и достъпа в Dropbox.

### OneDrive / Microsoft 365

„Съхранявайте резервни копия в OneDrive или OneDrive for Business (Microsoft 365). Влизате с Microsoft; не се съхранява парола.“

Стъпки (от помощния текст на полетата):

1. В центъра за администриране на Microsoft Entra (entra.microsoft.com) отидете в **App registrations → New registration**. Изберете кой може да влиза („за личен OneDrive включете личните акаунти в Microsoft“).
2. Добавете **Redirect URI** от формата на мястото за съхранение с платформа **Web**.
3. В **API permissions → Add a permission → Microsoft Graph → Delegated permissions** добавете **Files.ReadWrite**, **offline_access** и **User.Read**.
4. В **Certificates & secrets → New client secret** създайте secret и копирайте неговата стойност **Value** (не Secret ID).
5. В WordPress добавете място за съхранение **OneDrive / Microsoft 365**, попълнете полетата по-долу и щракнете **Save destination**.
6. Щракнете **Connect OneDrive**, изберете акаунта и приемете.

| Поле | Какво да въведете | По подразбиране |
|---|---|---|
| **Application (client) ID** (задължително) | От страницата Overview на приложението. | Празно |
| **Client secret** (задължително) | Стойността Value на secret-а. „Secret-ите изтичат (най-късно след 24 месеца): добавете нов преди това.“ | Празно |
| **Tenant** (задължително) | „Зависи от ‚Supported account types‘ на приложението (на страницата му Authentication). Single tenant, стойността по подразбиране за нови приложения: Directory (tenant) ID от страницата Overview на приложението. Multiple Entra ID tenants (multitenant): organizations. Multitenant и лични акаунти в Microsoft: common. Само лични акаунти в Microsoft: consumers.“ | Празно (подсказка „Directory (tenant) ID“) |
| **Folder** | „Папка във вашия OneDrive за резервните копия, напр. SymeloBackups. Използвайте / за подпапки. Създава се при нужда.“ | SymeloBackups |

**Tenant** трябва да съответства на „Supported account types“, избрани за приложението. Новите приложения са single-tenant: за тях е нужен вашият **Directory (tenant) ID** от страницата Overview на приложението; с `common` входът се проваля с AADSTS50194. За личен OneDrive приложението трябва да позволява лични акаунти в Microsoft. Други стойности се отхвърлят при запазване. Когато client secret изтече, резервните копия в OneDrive се провалят с грешка при вход: създайте нов secret, въведете го в мястото за съхранение, запазете и свържете отново. Microsoft няма лесен начин входът да бъде отменен отвън, затова **Disconnect** изтрива запазените данни за вход от сайта ви.

### Проблеми с входа (Google Drive, Dropbox, OneDrive)

| Съобщение | Решение |
|---|---|
| „Връзката за вход е изтекла или вече е използвана. Щракнете отново ‚Connect‘.“ | Завършете входа до 10 минути, в същия браузър и със същия администраторски акаунт. |
| „Влизането в … не завърши: …“ | Следва причината от доставчика. Често redirect URI не съвпада: копирайте отново **Redirect URI** и го поставете в приложението точно както е. |
| „… Microsoft изисква собствения tenant на това приложение. Копирайте Directory (tenant) ID от страницата Overview на приложението в Microsoft Entra в полето Tenant на мястото за съхранение, запазете и щракнете отново ‚Connect‘.“ | Microsoft е отговорил с AADSTS50194 (single-tenant приложение, използвано с `common`) или AADSTS90002 (непознат tenant). Направете каквото казва съобщението. |
| „Запазените данни за вход вече не могат да бъдат прочетени (ключовете за сигурност на сайта са променени). Свържете отново.“ | Ключовете за сигурност в wp-config.php или `SYMELO_BACKUPS_KEY` са променени или базата данни е от друг сайт. Щракнете отново **Connect**. |
| „… не изпрати refresh token, така че резервните копия ще спрат да работят до няколко часа. Премахнете достъпа на това приложение в настройките за сигурност на акаунта си, след това щракнете отново ‚Connect‘.“ | Направете каквото казва съобщението. |
| „… не прие client ID или client secret. Проверете ги в мястото за съхранение (client secret-ите могат да изтичат), запазете и свържете отново.“ | Направете каквото казва съобщението. |
| „Достъпът до … е отменен или е изтекъл. Свържете отново … в раздела Destinations.“ | Отворете мястото за съхранение и щракнете **Reconnect**. |
| „Този сайт използва обикновени постоянни връзки, така че redirect URI съдържа ‚?‘, което услугите за вход може да отхвърлят.“ | Първо изберете друга структура в **Настройки → Постоянни връзки**, след това копирайте новия redirect URI. |

Ако адресът на сайта ви се промени (нов домейн или преминаване от http към https), се променя и redirect URI. Обновете го в приложението си и свържете отново.

### Amazon S3 и S3-съвместими хранилища

„Amazon S3, Wasabi, DigitalOcean Spaces, Scaleway, MinIO и други S3-съвместими хранилища. Cloudflare R2 има собствено място за съхранение.“

| Поле | Какво да въведете | По подразбиране |
|---|---|---|
| **Provider** | **Amazon S3**, **Wasabi**, **DigitalOcean Spaces**, **Scaleway Object Storage** или **MinIO or another S3-compatible service (custom endpoint)**. | Amazon S3 |
| **Access key ID** (задължително) | „Създайте ключ, който може само да изброява, чете, записва и изтрива обекти в този бъкет (за AWS: s3:ListBucket, s3:GetObject, s3:PutObject, s3:DeleteObject и s3:AbortMultipartUpload).“ | Празно |
| **Secret access key** (задължително) | Съхранява се криптирано. | Празно |
| **Bucket** (задължително) | „Бъкетът трябва вече да съществува. Дръжте го частен.“ | Празно |
| **Region** | „Къде се намира бъкетът. Amazon S3 и Wasabi: например us-east-1 или eu-central-1. DigitalOcean Spaces: например nyc3, ams3 или fra1. Scaleway: fr-par, nl-ams, pl-waw или it-mil. Други услуги: според документацията им, обикновено us-east-1.“ Задължително за Wasabi, DigitalOcean Spaces и Scaleway. | Празно |
| **Endpoint URL** | Само за собствен endpoint (там е задължително). „Адресът на S3 API на услугата, започващ с https://, с порта, ако не е стандартният (за MinIO често https://your-server:9000). Обикновен http:// работи само за сървър във вашата собствена мрежа (localhost, частен IP адрес или име без точки), защото иначе резервните копия биха пътували некриптирани.“ Другите адреси с `http://` се отхвърлят при запазване. | Празно |
| **Path-style URLs** | „Поставя името на бъкета в пътя (https://endpoint/bucket/…) вместо в името на хоста. Винаги се използва при собствени endpoint-и и при имена на бъкети с точки.“ | Изключено |
| **Storage class** | Само за Amazon S3: **Standard**, **Standard-Infrequent Access**, **One Zone-Infrequent Access**, **Intelligent-Tiering**, **Glacier Instant Retrieval**, **Glacier Flexible Retrieval**, **Glacier Deep Archive**. | Standard |
| **Server-side encryption** | Само за Amazon S3: „Amazon S3 да криптира съхранените файлове с SSE-S3 (AES-256). Новите бъкети правят това по подразбиране; включете го, когато политика на бъкета изисква съответния хедър.“ | Изключено |
| **Folder** | Вижте [Добавяне на място за съхранение](#добавяне-на-място-за-съхранение). | SymeloBackups |

Добре е да знаете:

- За класовете на съхранение: „Glacier Flexible Retrieval и Deep Archive са най-евтините, но файловете в тях трябва да бъдат възстановени в конзолата на AWS (отнема часове), преди плъгинът да може да ги изтегли, а ранното изтриване се таксува. Класовете Infrequent Access и Glacier таксуват минимален срок на съхранение.“ Правилата за запазване изтриват старите резервни копия, така че минималните срокове на съхранение може да струват допълнително. За бързо възстановяване използвайте Standard, Intelligent-Tiering или Glacier Instant Retrieval.
- Файловете над 8 MB се качват на части и качването продължава оттам, където е спряло. Отмененото качване се прекратява. Недовършено качване на части може да бъде почистено и с правило за жизнения цикъл на бъкета.
- Избягвайте правила за жизнения цикъл, които изтриват или преместват файлове с резервни копия. Правилата за запазване на плъгина вече премахват старите резервни копия, а правилата, които изтриват файлове, могат да нарушат веригите от инкрементални копия.
- Всяка заявка е подписана (AWS Signature Version 4) и носи контролна сума, така че хранилището отхвърля всичко, което е повредено по пътя.
- Криптирането от страна на сървъра защитава файловете при доставчика. За защита от край до край включете и криптирането на плъгина.

### Cloudflare R2

„Обектно хранилище от Cloudflare без такси за изтегляне, чрез неговия S3-съвместим API.“ R2 включва 10 GB безплатно пространство всеки месец (вижте [Безплатно пространство накратко](#безплатно-пространство-накратко)).

Настройте го в таблото на Cloudflare:

1. Отворете **R2** (може да се наложи еднократно да включите R2 за акаунта си). Създайте бъкет, например `site-backups`. Оставете публичния достъп изключен. Запазете класа на съхранение по подразбиране **Standard**: безплатният план не покрива Infrequent Access.
2. Копирайте своя **Account ID** от страницата с общ преглед на R2 (Account details).
3. Отворете **Manage API tokens** и създайте R2 API токен с разрешението **Object Read & Write**, ограничено до този бъкет. Копирайте **Access Key ID** и **Secret Access Key**: Cloudflare показва secret-а само веднъж.

| Поле | Какво да въведете | По подразбиране |
|---|---|---|
| **Account ID** (задължително) | „Показва се в таблото на Cloudflare на страницата с общ преглед на R2 (Account details), 32 букви и цифри.“ | Празно |
| **Access key ID** (задължително) | „В таблото на Cloudflare отворете R2, след това Manage API tokens, и създайте R2 API токен с разрешението ‚Object Read & Write‘, ограничено до този бъкет. Копирайте показаните Access Key ID и Secret Access Key (показват се само веднъж).“ | Празно |
| **Secret access key** (задължително) | Съхранява се криптирано. | Празно |
| **Bucket** (задължително) | „Бъкет, който сте създали в R2. Оставете публичния достъп изключен.“ | Празно |
| **Jurisdiction** | **Default (automatic location)** или **European Union (EU)**. „Изберете EU само за бъкети, създадени с юрисдикция EU, която задържа данните в рамките на Европейския съюз.“ | Default |
| **Folder** | Вижте [Добавяне на място за съхранение](#добавяне-на-място-за-съхранение). | SymeloBackups |

Добре е да знаете:

- При грешен account ID се показва: „Въведете своя Cloudflare account ID (32 букви и цифри).“
- R2 винаги криптира съхранените файлове, затова няма опция за криптиране от страна на сървъра. За защита от край до край включете криптирането на плъгина.
- Изтеглянията от R2 са безплатни, така че възстановяването или копирането на резервно копие обратно на сървъра не струва нищо.
- Качванията над 8 MB се извършват на части и продължават оттам, където са спрели, както при Amazon S3.

### Backblaze B2

„Евтино облачно хранилище от Backblaze, чрез неговия S3-съвместим API.“

| Поле | Какво да въведете | По подразбиране |
|---|---|---|
| **Application key ID** (задължително) | „Създайте application key в Backblaze в Application Keys, ограничен до този бъкет, с права за четене и запис. Главният ключ (master application key) не работи с тази връзка.“ | Празно |
| **Application key** (задължително) | Показва се веднъж при създаването на ключа. Съхранява се криптирано. | Празно |
| **Bucket** (задължително) | „Частен бъкет, който вече съществува.“ | Празно |
| **Endpoint region** (задължително) | „Частта между ‚s3.‘ и ‚.backblazeb2.com‘ в endpoint-а на бъкета, показан на страницата Buckets (например us-west-004 или eu-central-003).“ | Празно |
| **Server-side encryption** | „Backblaze да криптира съхранените файлове (SSE-B2). Бъкетите могат да правят това и по подразбиране.“ | Изключено |
| **Folder** | Вижте [Добавяне на място за съхранение](#добавяне-на-място-за-съхранение). | SymeloBackups |

При грешен регион се показва: „Въведете региона на endpoint-а, както е показан на страницата Buckets в Backblaze, например us-west-004.“

### Microsoft Azure Blob Storage

„Съхранявайте резервни копия в контейнер на акаунт за съхранение в Azure.“

| Поле | Какво да въведете | По подразбиране |
|---|---|---|
| **Storage account name** (задължително) | „Името на акаунта за съхранение (от 3 до 24 малки букви и цифри).“ | Празно |
| **Sign in with** | **Access key** или **Shared access signature (SAS token)**. „SAS токен, ограничен до един контейнер, е по-сигурен от ключа за достъп на акаунта.“ | Access key |
| **Access key** | „В портала на Azure: акаунт за съхранение → Security + networking → Access keys.“ Копирайте стойността Key, а не connection string. | Празно |
| **SAS token** | „Създайте го за този контейнер (или за услугата Blob с достъп до контейнери и обекти) с разрешенията Read, Write, Delete и List, само за HTTPS и с далечна дата на изтичане. Поставете частта след ‚?‘.“ | Празно |
| **Container** (задължително) | „Частен контейнер, който вече съществува.“ От 3 до 63 малки букви, цифри и единични тирета. | Празно |
| **Azure cloud** | **Azure (global)**, **Azure operated by 21Vianet (China)** или **Azure Government (US)**. | Azure (global) |
| **Access tier** | **Account default**, **Hot**, **Cool** (минимум 30 дни) или **Cold** (минимум 90 дни). „Нивото Archive не се предлага: архивираните резервни копия не могат да бъдат възстановени, без първо да бъдат рехидратирани.“ | Account default |
| **Folder** | Вижте [Добавяне на място за съхранение](#добавяне-на-място-за-съхранение). | SymeloBackups |

Когато SAS токенът изтече, качванията се провалят. Създайте нов токен и го въведете в мястото за съхранение.

### SFTP

„Всеки сървър, до който имате достъп по SSH: storage box, VPS или NAS. Криптирано, с проверка на самоличността на сървъра.“

| Поле | Какво да въведете | По подразбиране |
|---|---|---|
| **Server** (задължително) | Например `backup.example.com` или IP адрес, без `sftp://`. | Празно |
| **Port** | От 1 до 65535. | 22 |
| **Username** (задължително) | SSH потребителят. | Празно |
| **Sign in with** | **Password** или **Private key**. „Частен ключ, който се използва само за резервни копия, е най-сигурният избор.“ | Password |
| **Password** | За вход с парола. Съхранява се криптирано. | Празно |
| **Private key** | „Поставете целия частен ключ (формат OpenSSH, PEM или PuTTY). Добавете публичния му ключ в ~/.ssh/authorized_keys на сървъра.“ Съхранява се криптирано. | Празно |
| **Key passphrase** | „Само ако частният ключ е защитен с парола-фраза.“ | Празно |
| **Host key fingerprint** | SHA-256 отпечатъкът на сървъра, например `SHA256:…`. Вижте по-долу. | Празно |
| **Folder** | „Папка за резервните копия, относително спрямо папката, в която попадате след влизане (обикновено домашната ви папка). Започнете с / за абсолютен път. Всеки сайт получава своя подпапка.“ | SymeloBackups |

**Доверяване на ключа на хоста на сървъра.** Плъгинът изпраща паролата или ключа ви само до сървър, чиято самоличност е проверил. Той никога не прехвърля резервни копия без запазен отпечатък.

1. Запазете мястото за съхранение с празно поле **Host key fingerprint**. Плъгинът се свързва, без да влиза, и съобщава: „Сървърът изпрати ключа на хоста си. Проверете го по-долу и щракнете ‚Trust this key‘, ако е правилният.“
2. Картата **Check the server's host key** показва: „Сървърът отговори с ключ ssh-ed25519 с този отпечатък: SHA256:…“
3. Сравнете го с отпечатъка, който ви дава хостингът. На компютър, на който имате доверие, можете също да изпълните:
   ```sh
   ssh-keyscan backup.example.com | ssh-keygen -lf -
   ```
4. Само ако съвпадат, щракнете **Trust this key** в рамките на 15 минути. Плъгинът го запазва, влиза истински и тества връзката: „Ключът на хоста е запазен и връзката работи. Отсега нататък плъгинът отказва да се свърже, ако сървърът покаже различен ключ.“

Можете и сами да поставите отпечатъка в полето, преди да запазите.

Ако по-късно ключът на сървъра се промени (преинсталиране, преместване или атака), резервните копия към него спират: „Ключът на хоста на сървъра не съвпада със запазения отпечатък (запазен: …, на сървъра: …), затова плъгинът не влезе. Ако сървърът е преинсталиран или преместен, проверете новия отпечатък с хостинга си и го запазете. В противен случай някой може да прихваща връзката.“

Времето за изчакване на връзките е 30 секунди.

### FTP / FTPS

„Уеб хостинг или NAS, който предлага FTP с TLS криптиране (FTPS). Предпочитайте SFTP, когато сървърът го поддържа.“

| Поле | Какво да въведете | По подразбиране |
|---|---|---|
| **Server** (задължително) | Например `ftp.example.com`, без `ftp://` и без папка. | Празно |
| **Port** | От 1 до 65535. | 21 |
| **Username** (задължително) | | Празно |
| **Password** (задължително) | Съхранява се криптирано. | Празно |
| **Encryption** | **Require TLS (explicit FTPS)** или **None: plain FTP (not recommended)**. „При обикновен FTP паролата ви и резервните копия пътуват некриптирани и могат да бъдат прочетени по пътя. Избирайте го само за сървър във вашата собствена мрежа.“ | Require TLS |
| **Passive mode** | „Оставете това включено, освен ако хостингът ви не каже друго; работи през повечето защитни стени.“ | Включено |
| **Folder** | „Папка за резервните копия, относително спрямо папката, в която попадате след влизане. Започнете с / за абсолютен път. Всеки сайт получава своя подпапка. Дръжте я извън публичната уеб папка.“ | SymeloBackups |

Добре е да знаете:

- Работи само explicit FTPS (AUTH TLS, обикновено на порт 21). Implicit FTPS на порт 990 не се поддържа от PHP.
- Ако сървърът откаже TLS, входът се проваля; плъгинът никога не преминава сам към обикновен FTP.
- PHP не проверява сертификата на FTPS сървъра, така че FTPS защитава от подслушване, но не и от сървър самозванец. SFTP с доверен ключ на хоста е по-сигурен.
- FTPS изисква FTP разширението на PHP да е компилирано с OpenSSL: „PHP на този сървър не може да използва FTPS (FTP разширението му е компилирано без OpenSSL). Използвайте SFTP.“
- Качванията продължават оттам, където са спрели, когато сървърът поддържа това.

### Имейл

„Изпраща всеки файл от резервното копие по имейл като прикачен файл. Само за малки сайтове: пощенските сървъри ограничават размера на прикачените файлове.“

| Поле | Какво да въведете | По подразбиране |
|---|---|---|
| **Send to** (задължително) | „Един или повече адреси, разделени със запетаи. Резервните копия съдържат целия ви сайт, включително потребителските данни: изпращайте ги само до пощенски кутии, на които имате доверие.“ До 10. | Празно |
| **Largest file (MB)** | От 1 до 100. „Файловете над този размер не се изпращат по имейл. Прикачените файлове нарастват с около една трета при изпращане, а повечето пощенски услуги приемат общо 20 до 25 MB на имейл. Намалете размера на частите на архива в настройките на плъгина, така че частите да се побират.“ | 20 |

Добре е да знаете:

- Всеки файл от резервното копие се изпраща в отделен имейл, като манифестът е последен. Темите изглеждат така: „Резервно копие на My Site: 20261012-030000-full-a1b2c3 (файлове, част 2)“.
- Имейлите се изпращат чрез `wp_mail()`, така че изпращането на имейли от сайта трябва да работи (Symelo SMTP помага).
- Файл над ограничението не се изпраща: „… е …, повече от ограничението за имейл от …, затова не беше изпратен по имейл. Изпращайте резервните копия на този сайт в облачно хранилище или по SFTP или намалете размера на частите на архива в настройките на плъгина.“ Задайте **Settings → Advanced → Split archives into parts of** под ограничението, например 12 MB при ограничение от 20 MB.
- Плъгинът не може да изброява, изтегля или изтрива имейли. Резервно копие, съхранено само по имейл, няма действие **Restore** или **Copy to this server**; в списъка пише „Съхранено само по имейл: изтеглете прикачените файлове и ги качете в раздела Migration, за да възстановите.“
- За възстановяване от имейли: запазете всички прикачени файлове на резервното копие в една папка, качете ги в **Migration → Upload from your computer** и след това изберете **Import**. Импортирането заменя целия сайт с изключение на основните файлове на WordPress и wp-config.php.
- **Test** изпраща „Тестов имейл от Symelo Backups на …“ с малък прикачен файл, `symelo-test.txt`.

---

## Възстановяване

Има три начина за възстановяване:

| Ситуация | Използвайте |
|---|---|
| Сайтът работи и можете да влезете | [Възстановяване от таблото](#възстановяване-от-таблото) |
| WordPress не работи (бял екран, фатална грешка, хакнат сайт), но сървърът и резервните копия на него са налице | [Връзката за аварийно възстановяване](#когато-сайтът-не-работи-връзката-за-аварийно-възстановяване) |
| Сървърът вече го няма или подготвяте сайт на празен сървър | [installer.php](#на-нов-сървър-installerphp) или нова инсталация на WordPress с този плъгин |

Когато е възможно, първо направете резервно копие на текущото състояние: ако възстановяването не даде желания резултат, ще можете да се върнете обратно.

### Възстановяване от таблото

1. В раздела **Backups** щракнете **Restore** до резервното копие.
2. Отваря се формулярът **Restore the backup from …**:
   - Жълто поле: „Your site will be in maintenance mode during the restore. Visitors see a short "back in a moment" message. Most restores take a few minutes; large sites take longer. Keep this browser tab open until it says it's done.“
   - За резервно копие от друг сайт — червено поле: „This backup was made by another site (…). Backups are signed by the site that made them, and this signature can't be checked here, so there is no way to tell whether the backup was changed. Only restore it if you trust where it came from.“
3. В **What to restore** махнете отметката от частите, които искате да останат непроменени. При всяка част е посочено какво замества (вижте таблицата по-долу).
4. Незадължителни настройки:
   - **Remove plugins and themes that aren't in the backup** (когато резервното копие съдържа плъгини или теми): „Leave this off to keep plugins and themes installed after the backup was made.“ Опцията не се предлага за резервни копия преди обновяване, тъй като те съдържат един-единствен плъгин или тема.
   - „Links are changed from https://old.example.com to https://example.com.“, когато резервното копие е направено на друг адрес.
   - „This incremental backup builds on 3 earlier backups, which are used automatically.“
   - **Restore from**: когато резервното копие се намира на няколко места, от които може да бъде възстановено, изберете кое копие да се използва. Най-бързо е от този сървър. (От копия, изпратени по имейл, не може да се възстановява.)
   - **Encryption password**, за криптирани резервни копия: „Leave this blank to use the password saved in Settings. Enter a password only if this backup was made with an older one.“ Полето е задължително, когато на този сайт вече няма запазена парола или резервното копие е от друг сайт.
   - За резервно копие от друг сайт отметнете „I trust this backup and want to replace this site with it.“
5. Щракнете **Restore now** и потвърдете „Restore this backup now? The parts you selected are replaced.“

| Част | Какво прави възстановяването ѝ |
|---|---|
| **Database** | „Replaces all posts, pages, comments, users, orders and settings with their state on …. Anything added or changed since then is lost, and you may have to log in again.“ |
| **Plugins** | „Replaces the plugins in wp-content/plugins with the versions in the backup.“ |
| **Themes** | „Replaces the themes in wp-content/themes with the versions in the backup.“ |
| **Media uploads** | „Puts back the media files from the backup. Files uploaded since then are kept.“ |
| **Other content** | „Replaces the other files in wp-content, like must-use plugins and translations.“ |
| **WordPress core** | „Replaces wp-admin, wp-includes and the files in the main folder. wp-config.php is never overwritten.“ |

**Подготовка.** Първо една задача подготвя резервното копие, докато сайтът ви остава онлайн: „Getting the backup ready. The restore starts as soon as it has been checked.“ Тя прочита описанието на резервното копие и на копията, върху които то надгражда, изтегля нужните файлове от мястото за съхранение, ако възстановявате оттам (за това е нужно дисково пространство за цялата верига), и проверява SHA-256 контролната сума на всеки файл, подписа и паролата за криптиране. Грешките я спират на този етап, преди да е променено каквото и да е, например „The encryption password is wrong. Enter the password this backup was made with.“ или „An earlier backup that this incremental backup builds on is missing, so it can't be restored.“ Отказва се и резервно копие, чиято база данни не пасва на този сайт: копие на мултисайт мрежа върху самостоятелен сайт, копие на самостоятелен сайт върху мрежа или копие на мрежа от друг домейн или път (вижте [Мултисайт](#мултисайт)).

**Страницата за възстановяване.** Когато всичко е готово, браузърът ви сам отваря страницата за възстановяване. Ако това не стане (например защото сте затворили раздела), редът на задачата в **Recent activity** показва „Ready to restore. The link works until …“ и има бутон **Continue to the restore**; страницата, от която сте започнали, показва „The backup is ready to restore.“ със същия бутон: „The link works for one hour. Your site is in maintenance mode while the restore runs.“ Бутонът вижда само администраторът, който е стартирал възстановяването. След като часът изтече, стартирайте възстановяването отново.

Страницата за възстановяване (със заглавие **Restore**) показва:

- **Backup**: **Backup from**, **Site**, **Contains**, **Size**, **Type** (например „incremental, 4 backups in a row“), **Note**, **Encrypted**.
- **Server check**: **PHP**, **PHP extensions**, **Backup files**, **Encryption**, **Database** (създава се и се изтрива тестова таблица), **Folders** (права за запис), **Disk space**, **Backup signature** (само за непроверени резервни копия, с потвърждение) и **Time limit**. Проблемите не позволяват стартиране; предупрежденията изискват вашето потвърждение.
- „Nothing has been changed yet. The restore replaces the parts listed above with the backup.“
- Бутони: **Start the restore**, **Check again** и **Cancel and go back to WordPress** (премахва инструмента за възстановяване; нищо не е променено).

Щракнете **Start the restore**. Страницата показва **Restoring** с лента за напредъка и стъпките (вижте [Какво се случва по време на възстановяване](#какво-се-случва-по-време-на-възстановяване)). „Keep this page open until it has finished. If the connection drops, open the same link again: the work continues where it stopped.“

Когато приключи: „Your site has been restored. The backup has been restored and maintenance mode is off.“ с бележки като „If WordPress asks you to log in, use your login from the time of the backup.“ и бутон **Go to your dashboard**. Инструментът за възстановяване се изтрива сам.

Възстановяването по дадена връзка трябва да бъде стартирано до един час. След като е стартирано, същата връзка може да продължи спряло възстановяване в рамките на два дни.

### Когато сайтът не работи: връзката за аварийно възстановяване

Нужни са ви предварително създадена връзка за аварийно възстановяване (раздел **Recovery**) и поне едно завършено резервно копие на този сървър.

1. Отворете връзката за аварийно възстановяване. Страницата **Site recovery** показва резервните копия на този сървър, от най-новото към най-старото (до 200): дата, тип и бележка, какво съдържат и размера им. Значки: **Verified** (подписано от този сайт) или **Not verified**, **Encrypted**, **From …** (направено на друг адрес), **Files missing**.
2. Щракнете **Restore…** до желаното резервно копие.
3. В **What to restore** изберете частите. **WordPress core files** по подразбиране не е отметнато. По желание отметнете **Also remove plugin and theme files that aren't in the backup**. Ако резервното копие е криптирано и връзката не знае паролата, въведете **Encryption password**. Щракнете **Continue** (или **Back to the list**).
4. Изпълнява се **Server check**, както при възстановяване от таблото. Щракнете **Start the restore** (или **Choose another backup**).
5. Възстановяването първо проверява контролната сума на всеки файл от резервното копие (**Checking the backup files**) и едва след това възстановява.
6. Когато приключи: „Your site has been restored.“ и „Your recovery link keeps working, so keep it somewhere safe.“

Какво е добре да знаете:

- Връзката вижда само резервните копия в папката за резервни копия на този сървър. Пакетите в папката за импортиране не се показват.
- Връзката знае паролата за криптиране, която е била зададена при последното ѝ обновяване, така че обикновено не е нужно да я въвеждате.
- Резервно копие, направено на друг адрес, получава адреса на този сайт.
- Ако въведете грешна връзка твърде много пъти, страницата се заключва за 15 минути. Вижте [Страницата за възстановяване или на инсталатора е заключена](#страницата-за-възстановяване-или-на-инсталатора-е-заключена).

### На нов сървър: installer.php

`installer.php` разгръща миграционен пакет на всеки сървър, дори на такъв без WordPress. Нужни са ви файловете на пакета, `installer.php` и ключът на инсталатора. Всички стъпки са описани в [Преместване на нов хостинг](#преместване-на-нов-хостинг).

Ако разполагате само с обикновени резервни копия на място за съхранение (без миграционен пакет), инсталирайте WordPress и този плъгин на новия сървър на **същия адрес** като преди, добавете мястото за съхранение със същите настройки, щракнете **Look for backups at destinations** в раздела Backups и възстановете. Новата инсталация не може да провери старите подписи, затова резервните копия се показват като идващи от друг сайт и вие потвърждавате, че им имате доверие. Ако адресът е различен, отворете **Look for backups at destinations** и въведете папката на стария адрес (вижте [След смяна на домейна](#след-смяна-на-домейна)) или изтеглете файловете на резервното копие от мястото за съхранение и ги импортирайте от **Migration → Upload from your computer**.

### Какво се случва по време на възстановяване

Инструментът за възстановяване минава през следните стъпки на кратки порции, така че ограничението за време на PHP няма значение:

| Стъпка | Какво се случва |
|---|---|
| **Checking the backup files** | Само при връзката за аварийно възстановяване и при инсталатора (при възстановяване от таблото файловете вече са проверени): SHA-256 контролната сума на всеки файл се сравнява с манифеста. |
| **Turning on maintenance mode** | Записва се файл `.maintenance`. „Visitors see a short "briefly unavailable" message.“ Файлът се опреснява, докато тече възстановяването. |
| **Restoring files** (инсталатор: **Unpacking the files**) | Архивите на всяко резервно копие във веригата се разархивират поред, като се започне от пълното копие. След всяко копие се премахват файловете, които то е отбелязало като изтрити. Записват се само избраните части. |
| **Removing files that aren't in the backup** | Само с опцията „remove plugins and themes“: файловете и папките в wp-content/plugins и wp-content/themes, които не фигурират в резервното копие, се изтриват. |
| **Restoring the database** (инсталатор: **Importing the database**) | Дъмпът на базата данни от най-новото резервно копие се импортира таблица по таблица. При различен префикс на таблиците те се преименуват, както и потребителските роли и потребителските настройки. |
| **Updating addresses in the database** | Само когато адресът или папката са се променили: старите адреси и пътища до папки се заменят (вижте [Замяна на адреси](#замяна-на-адреси)). Напредъкът показва таблицата и редовете ѝ („wp_postmeta (table 14 of 29), 12,000 of 48,000 rows“), а журналът получава ред за всяка променена таблица („wp_posts: updated 1,204 of 3,310 rows.“). |
| **Finishing up** | Инсталаторът записва wp-config.php. Когато е възстановена базата данни, запазените правила за постоянните връзки се изтриват (WordPress ги създава наново при първото посещение). Режимът на поддръжка се изключва. Инструментът за възстановяване премахва себе си (при таблото), нулира се (при връзката за аварийно възстановяване) или изтрива инсталатора и файловете на пакета (при инсталатора, ако сте избрали това). |

Възстановяването никога не разархивира файлове извън папката на WordPress: абсолютни пътища, `..` и символни връзки в архива се отхвърлят.

**Какво показва екранът за възстановяване.** Докато се зарежда, първата карта вече казва докъде е стигнало възстановяването, директно от сървъра: „Getting the restore ready. Nothing has been changed yet.“, „A restore is in progress. It is at step 3 of 6 (Restoring the database), about 45% done.“ или „The restore has stopped…“. Докато тече: **Step 3 of 6: Restoring the database**, лентата за напредък с процента и какво се прави в момента (например таблицата), „Running for 4 min 12 s · progress saved 3 s ago“ и списъкът със стъпките. **Log** изброява собствените съобщения на възстановяването и всяка заявка, която страницата изпраща, с това, което възстановяването е правило след нея („Page: Request "run": HTTP 200 in 15.0 s: Updating addresses: wp_postmeta (table 3 of 5), 484,738 of 1,000,000 rows.“); неуспешните заявки се записват с HTTP статуса си и началото на отговора на сървъра, а журналът се отваря сам. Всяка заявка работи около 15 секунди; докато страницата чака някоя, тя показва „Still working… 12 s on this part of the restore“, а в журнала на всеки 30 секунди се добавя „Still waiting for the answer to "run" (30 s).“. Собствените редове на страницата се запазват при презареждане на раздела: те се появяват под „--- Before this page was reloaded ---“, така че копираният журнал показва и какво се е случило преди това.

**При повторно отваряне на страницата** (след затваряне на раздела, прекъсната връзка или презареждане) възстановяването се показва там, където е: „This restore was already started on …. This page continues it from where it is.“ Ако сървърът все още работи по стъпка, стартирана по-рано, страницата казва „The server is still finishing a step that was started earlier… Waiting …“ и продължава сама.

**Когато браузърът постави страницата на пауза** (браузърите спират таймерите в разделите на заден план, а някои ги замразяват), страницата забелязва това, когато отново стане активна: спира да чака заявка, чийто отговор вече не може да дойде („The browser paused this page…“), и пита отново, а ако по време на възстановяването не се изпраща нищо, продължава сама („The page wasn't asking the server for the next part; continuing.“).

**Когато сървърът не отговаря**, страницата не чака безкрайно: заявките спират след ограничение за време (45 секунди за зареждане на състоянието, 3 минути за работна стъпка), кратките прекъсвания се опитват отново автоматично, а след това страницата обяснява какво се е случило, например „The server didn't answer“, „The server couldn't be reached“, „The server's answer couldn't be read“ (PHP предупреждения или услуга за сигурност са го променили), „A firewall blocked the request“ или „The server stopped the request“ (ограничение за време на хостинга), всяко с указания какво да направите и бутон **Try again**. Картата **If the restore can't continue** най-долу на страницата обяснява как да продължите, как да използвате връзката за аварийно възстановяване и как да изключите режима на поддръжка ръчно.

**Ако някоя стъпка се провали**, страницата показва „This step stopped: …“ с причината и подсказка, както и два бутона: **Try again** продължава оттам, където е спряло; **Start this step over** започва стъпката отначало. Когато се свързвате с поддръжката, щракнете **Copy the log** под **Log**. Докато възстановяването е на пауза, сайтът остава в режим на поддръжка. Самият WordPress пренебрегва файл за поддръжка, по-стар от 10 минути, така че след известно време посетителите отново виждат сайта, вероятно наполовина възстановен: довършете или повторете възстановяването.

### Какво не се променя при възстановяване

- **wp-config.php** никога не се презаписва, така че възстановяването не може да ви откъсне от базата данни. Версията на файла в резервното копие се използва само от инсталатора.
- Файловете, създадени след резервното копие, остават на място: медията, качена оттогава, както и плъгините и темите, добавени оттогава (освен ако не отметнете опцията „remove plugins and themes“).
- Таблиците в базата данни, които липсват в резервното копие (например от плъгин, инсталиран по-късно), остават.
- Собствената папка за резервни копия на плъгина, инструментите за възстановяване и за аварийно възстановяване и `.maintenance` никога не се засягат.
- Папките в папката на WordPress, различни от wp-admin, wp-includes и wp-content, не влизат в резервните копия, затова не се променят.
- Възстановяването на базата данни възстановява и собствените настройки, графици и места за съхранение на този плъгин във вида им към онзи момент. Списъкът ви с резервни копия не се засяга, защото резервните копия са файлове, а не редове в базата данни.

---

## Миграция и клониране

Миграционният пакет стига до новия сайт по един от три начина:

| Начин | Кога да го използвате |
|---|---|
| **installer.php** | Новият сървър е празен (все още няма WordPress). |
| **Pull from another site** (връзка за миграция) | На новия сайт са инсталирани WordPress и този плъгин и новият сайт може да достигне стария през интернет. Най-бързият вариант: директно от сървър към сървър. |
| **Upload from your computer** или **Files uploaded by FTP** | На новия сайт са инсталирани WordPress и този плъгин, но той не може да достигне стария (или файловете вече са у вас). |

### Създаване на пакета

На стария сайт: **Migration → Create migration package**. Запазете ключа на инсталатора веднага. Вижте [Експортиране на този сайт](#експортиране-на-този-сайт).

Пакетът съдържа всички компоненти, включително ядрото на WordPress, и wp-config.php. Той се криптира, когато криптирането е включено в настройките на стария сайт; тогава ще ви трябва същата парола и на новия сайт.

### Импортиране в съществуващ WordPress сайт

1. На новия сайт инсталирайте WordPress (ако е нужно) и този плъгин.
2. Прехвърлете пакета там: поставете връзката за миграция в **Pull from another site** и щракнете **Download the package** или качете файловете. След това щракнете **Review and import** най-горе в раздела Migration.
3. В **Packages ready to import** щракнете **Import**, въведете паролата за криптиране, ако е нужна, отметнете потвърждението и щракнете **Import and replace this site**.
4. Следвайте страницата за възстановяване до края.
5. Влезте с потребителско име и парола от стария сайт.

Импортирането замества базата данни, плъгините, темите, медията и останалото съдържание. То никога не засяга файловете на ядрото на WordPress или wp-config.php: новият сайт запазва собствените си данни за достъп до базата данни и ключове за сигурност. Използвайте на новия сайт същата или по-нова версия на WordPress от тази на стария. Когато пакетът е направен с по-нова версия на WordPress, формулярът за импортиране показва предупреждение, преди да започнете („This package was made with WordPress …, and this site runs …. An import never replaces WordPress itself, so update WordPress here first, then import.“), а при подготовката на импортирането в журнала на задачата се добавя следното предупреждение: „This package was made with WordPress …, but this site runs WordPress …. An import doesn't change WordPress itself, so plugins, themes and the database from the newer version may not work here. Update WordPress on this site first (Dashboard → Updates), then import.“ Импортирането не се спира, затова проверете версията, преди да импортирате.

### Използване на инсталатора

1. Създайте празна база данни на новия сървър и потребител на базата данни с всички права върху нея.
2. Качете `installer.php` и всички файлове на пакета в папката, където трябва да бъде сайтът (обикновено основната уеб директория). Файловете на пакета могат да са и в подпапка, носеща името на ID-то на резервното копие.
3. Отворете `https://your-new-site/installer.php`. Страницата **Site installer** иска: **Enter your installer key** („You saw this key when you created the migration package on the old site.“). При грешен ключ: „That key isn't right. 9 tries left before a 15-minute pause.“
4. Попълнете **The new site**: **Database host** („Often localhost.“), **Database name**, **Database user**, **Database password**, **Table prefix** (попълнен с префикса на стария сайт), **Site address** („Where the new site will be. We filled in the address of this page.“) и **Encryption password**, когато пакетът е криптиран. Оставете отметнато **Delete the installer and the backup files when the site is ready (recommended)**. Щракнете **Check and continue**.
5. **Server check** добавя две проверки: **WordPress** (файловете на ядрото са в пакета или вече са в папката) и **Existing site**. Ако в папката вече има wp-config.php или базата данни има таблици с този префикс: „There is already a site here: …. Installing replaces it. Back it up first if you still need it.“ Отметнете „Yes, replace the existing site“, за да продължите.
6. Щракнете **Install the site**. Инсталаторът проверява всеки файл, разархивира файловете, импортира базата данни, заменя адресите и записва wp-config.php: файла на стария сайт с данните за новата база данни (или нов файл с нови ключове за сигурност, когато старият не е в пакета).
7. „Your site is ready. The files are in place, the database is imported and wp-config.php is written.“ Щракнете **Log in to your site** и влезте с потребителско име и парола от стария сайт.

Инсталаторът държи работните си файлове в папка `symelo-installer-data` до себе си. След като приключи, той отказва да се изпълни отново: „This installer has finished. The site has been set up. For your security the installer won't run again.“ Проверете дали `installer.php`, файловете на пакета и тази папка са изчезнали; изтрийте ги ръчно, ако бележка съобщава, че не са могли да бъдат премахнати.

Инсталаторът изисква PHP 7.4+, zlib, mysqli и sodium или openssl. Криптиран пакет, създаден на сървър, където PHP има разширението sodium, може да бъде отворен само там, където PHP също го има.

### Замяна на адреси

Когато резервното копие или пакетът е направен на друг адрес, старият адрес се заменя с новия в цялата база данни:

- във вариантите с `http://` и `https://`, в адреси без протокол (`//old.example.com`), в JSON-екранирани (`https:\/\/old.example.com`) и URL-кодирани варианти;
- в сериализирани данни (така много плъгини съхраняват опциите си), като дължините на низовете се коригират;
- без да се променят по-дълги адреси, които просто започват по същия начин (`old.example.com.au` остава непроменен);
- включително адреса на WordPress (siteurl), когато се различава от адреса на сайта, както и пътя до папката на сървъра, когато сайтът се мести в друга папка.

GUID-ите на публикациите не се променят.

Редовете се намират по първичния ключ на таблицата им. Таблица без първичен ключ се обновява по уникален индекс, чиито колони не могат да бъдат празни, а когато няма и такъв и има до 20 000 реда, по стойностите на редовете (обновяват се всички копия на повтарящ се ред). По-голяма таблица без какъвто и да е ключ остава непроменена, с предупреждение в журнала: „The table … has no primary key or unique index and about … rows, too many to update its addresses safely without one, so they weren't changed. If a plugin keeps addresses there, change them in that plugin's settings, or with a search-and-replace tool.“

Стойност, чийто нов адрес би бил по-дълъг, отколкото колоната ѝ позволява, никога не се отрязва: тя запазва стария адрес, а журналът посочва къде, например „Skipped wp_redirection_404.referrer in the row with id 1234: the new value would be 262 characters long, but the column holds at most 255 characters, so it keeps the old address. Change it by hand if it matters.“

При възстановяване от таблото на ваше собствено резервно копие адресите се заменят само когато адресът на резервното копие се различава от адреса на този сайт.

### След миграция

- Влизате с потребителските имена и паролите на стария сайт.
- Настройките, графиците и местата за съхранение на този плъгин се пренасят заедно с базата данни. При импортиране новият сайт запазва собствените си ключове за сигурност от wp-config.php, затова запазените пароли, ключове и оторизации на стария сайт не могат да бъдат декриптирани: местата за съхранение показват **Needs attention** или **Reconnect needed** („The saved sign-in can't be read anymore (the site's security keys changed). Connect again.“). Въведете стойностите отново и се свържете наново или премахнете местата за съхранение, които не ви трябват тук. Задайте отново паролата за криптиране. (При инсталатора wp-config.php на стария сайт се пренася, така че всичко продължава да работи. Ако и двата сайта дефинират един и същ `SYMELO_BACKUPS_KEY`, също продължава да работи.)
- Проверете раздела **Schedules**: клонингът изпълнява същите графици като оригинала, към същите места за съхранение.
- Резервните копия, направени на този сървър преди импортирането, вече може да се показват като идващи от друг сайт. Вижте [Резервни копия, отбелязани като идващи от друг сайт](#резервни-копия-отбелязани-като-направени-от-друг-сайт).
- Създайте нова връзка за аварийно възстановяване на новия сайт.
- Ако сайтът трябва да продължи към окончателния си домейн (например след тестване на адрес на тестова среда), вижте [Преминаване към окончателния домейн](#преминаване-към-окончателния-домейн).
- Импортираният пакет се изтрива от папката за импортиране 7 дни по-късно (вижте **Automatic cleanup** в [Импортиране на сайт в този](#импортиране-на-сайт-в-този)).

### Мултисайт

- Резервното копие на мултисайт мрежа съдържа таблиците на всички сайтове и цялата папка uploads.
- За да преместите мрежа на нов домейн или път, използвайте **инсталатора**. Той обновява основния домейн и път на мрежата в базата данни и в wp-config.php: „This is a multisite network moving to a new address. The installer updates the main domain and path of the network. Sites with their own domains keep them; check them in Network Admin afterwards.“
- Импортирането в раздела Migration, както и възстановяването от таблото на базата данни от резервно копие на мрежа, работят само за мрежа на същия домейн и път. В противен случай се отказват, преди да се промени каквото и да е, например: „This network package was made at …, but this network is at …. An import can't move a network to another domain or path. Use the package's installer instead: it moves the network to its new address and writes a matching wp-config.php.“
- Пакет или резервно копие от мултисайт мрежа не може да се постави в самостоятелен сайт, а такова от самостоятелен сайт не може да се постави в мрежа. Например: „This package comes from a multisite network, but this site is a single site. Importing it here would break the site. To move the network, use the package's installer on a new server or in an empty folder.“
- Тези проверки засягат само базата данни: възстановяването само на файлове (плъгини, теми, медия, друго съдържание) винаги е възможно.
- Плъгинът няма опция за преместване на самостоятелен сайт в мрежа или на отделен сайт извън мрежа: резервните копия и пакетите винаги обхващат цялата мрежа.

---

## Резервни копия преди обновяване

Когато настройката **Settings → Before updates → Back up before updates** е включена (по подразбиране), плъгинът прави бързо резервно копие точно преди WordPress да изтегли обновление:

| Обновление | Какво се архивира |
|---|---|
| Плъгин | Базата данни и папката на този плъгин. |
| Тема | Базата данни и папката на тази тема. |
| WordPress | Базата данни и ядрото на WordPress (wp-admin, wp-includes и файловете в основната папка). |

Подробности:

- Работи както за обновленията, които стартирате вие, така и за автоматичните. Новите инсталации и обновленията на преводи се пропускат.
- Когато се обновяват няколко плъгина наведнъж, базата данни се архивира само веднъж, с първия от тях.
- Изпълнява се в същата заявка като обновлението, в рамките на общо около 60 секунди. Ако не успее да приключи навреме или вече тече друго архивиране, се пропуска и обновлението продължава. Обновлението никога не се блокира. **Settings → Before updates** показва как е минало последното.
- Тези резервни копия остават на този сървър; не се копират на местата за съхранение. За тях важи настройката за криптиране.
- Появяват се в списъка с тип **Pre-update** и бележка като „Before updating the plugin Akismet“. Пазят се най-новите 3 (**Keep the newest … of these backups**); те не се броят към останалите локални резервни копия.
- За тях не се изпраща имейл при успех; при неуспех се изпраща имейл, както при другите резервни копия.

**Отмяна на неуспешно обновление:** в раздела **Backups** щракнете **Restore** до резервното копие **Pre-update**. За да върнете само старата версия на плъгина, отметнете **Plugins** и махнете отметката от **Database**. Отметнете и **Database**, ако обновлението е променило базата данни и новата версия я е оставила в състояние, с което старата не може да работи.

---

## Криптиране

### Какво се криптира

| Настройка | Криптира се | Не се криптира |
|---|---|---|
| **Encrypt the database** | Файлът с базата данни (`….database.sql.gz.enc`). | Архивите с файлове, индексът на файловете, манифестът. |
| **Encrypt everything** | Файлът с базата данни, всяка част от архивите с файлове и индексът на файловете (`.enc`). | Манифестът. |

Манифестът (`manifest.json`) никога не се криптира, за да може плъгинът да показва и проверява резервните копия без паролата. Той съдържа името и адреса на сайта, пътя до папката на WordPress, имената на таблиците с броя на редовете в тях, броя и общия размер на файловете, контролните суми на резервното копие, а при инкременталните резервни копия — и пътищата на изтритите файлове.

Файловете се криптират на този сървър, преди да бъдат качени, с XChaCha20-Poly1305. Ключът се извлича от паролата ви с Argon2id, когато PHP има разширението sodium, а в противен случай — с PBKDF2-SHA256 и 600 000 итерации. Argon2id използва 64 MB памет или 256 MB, когато ограничението на паметта за PHP на сървъра, който прави резервното копие, е неограничено или поне 512 MB; сървърът, който го възстановява, се нуждае от същото количество. Грешна парола се открива, преди да бъде декриптирано каквото и да е, а всяка промяна в криптиран файл се засича.

### Паролата

- Паролата се пази в базата данни, криптирана (вижте [Поверителност и сигурност](#поверителност-и-сигурност)), така че планираните резервни копия могат да се криптират, без да я искат.
- **Ако загубите паролата, никой не може да възстанови криптираните резервни копия.** Пазете я в мениджър на пароли.
- Тя ви трябва, за да възстановите резервно копие на друг сайт или сървър, да импортирате криптиран миграционен пакет и в инсталатора.
- Възстановяването от таблото използва запазената парола автоматично. Възстановяването на базата данни връща паролата, която е била запазена към онзи момент.
- Връзката за аварийно възстановяване също помни паролата.

### Смяна или премахване на паролата

- Въведете **New password** и **Repeat it** в **Settings → Encryption → Change the password**, след което щракнете **Save changes**: „Encryption password saved. Keep it somewhere safe: without it, encrypted backups can't be restored.“
- „Changing it applies to new backups only: older ones still need the password they were made with.“ Пазете старата парола, докато пазите резервни копия, направени с нея. За да възстановите такова копие, въведете паролата му в полето **Encryption password** на формуляра за възстановяване.
- При **Encrypt everything** следващото инкрементално резервно копие след смяна на паролата става пълно.
- **Remove password** (в картата **Remove the password**) изключва криптирането: „New backups are no longer encrypted. Existing encrypted backups keep needing the password, so don't forget it.“
- Не сменяйте паролата, докато тече архивиране: „The encryption password changed while the backup was running. Please start the backup again.“

---

## Запазване на резервните копия и дисково пространство

### Къде важат правилата

| Правило | Задава се в | Важи за |
|---|---|---|
| Локално | **Settings → Retention**: пазят се най-новите 5, без ограничение по възраст (по подразбиране) | Всички резервни копия на този сървър с изключение на тези преди обновяване: ръчни и планирани резервни копия, миграционни пакети и копия, направени с **Copy to this server**. |
| Преди обновяване | **Settings → Before updates**: пазят се най-новите 3 | Резервните копия преди обновяване на този сървър. |
| За всеки график | **How many to keep** на всеки график: пазят се най-новите 7 (по подразбиране) | Резервните копия на този график на всяко от неговите места за съхранение; и на този сървър, когато графикът няма място за съхранение. Резервните копия, намерени в папката на друг сайт (вижте [След смяна на домейна](#след-смяна-на-домейна)), никога не се премахват от това правило. |

Правилата се прилагат след всяко резервно копие (локалното правило, а за резервните копия преди обновяване — тяхното собствено правило, плюс правилото на графика за планираните резервни копия) и веднъж дневно за всичко.

Как решават правилата:

- Резервно копие се премахва, когато е извън **Keep the newest** или е по-старо от **delete them after … days**. 0 означава без ограничение за съответната част.
- Най-новото резервно копие, обхванато от дадено правило, винаги се пази, така че ограничението по възраст не може да премахне всичко, когато архивирането спре за известно време.
- **Веригите се пазят цели**: резервно копие, върху което надгражда оставащо инкрементално копие на същото място, никога не се премахва. Затова при инкрементални графици може да виждате повече резервни копия от зададения брой, докато ново пълно резервно копие не започне нова верига.
- Току-що направеното резервно копие никога не се премахва от собственото си изпълнение.
- Резервните копия, които стартирате сами и копирате на места за съхранение, не се премахват от тези места от никое правило. Изтрийте ги в раздела Backups, когато вече не ви трябват.
- Миграционните пакети се броят към локалното правило. Създаването на пакет може да изтласка по-старо локално резервно копие.
- Пакетите в папката за импортиране не се обхващат от никое правило: изтрийте ги в **Migration → Packages ready to import**.
- Резервните копия, намерени в папката на друг сайт на място за съхранение (по-стар адрес, вижте [След смяна на домейна](#след-смяна-на-домейна)), никога не се премахват автоматично.

### Дисково пространство

- Всяко резервно копие първо се създава на този сървър. За пълно резервно копие очаквайте приблизително компресирания размер на сайта ви, за инкременталните — много по-малко. Изображенията и видеата почти не се компресират.
- Резервно копие не стартира при по-малко от 50 MB свободно място. Преди стъпките за базата данни и файловете то изчислява нужното място; спира, когато очевидно няма достатъчно („There isn't enough free disk space for the file archives: at least … is needed and only … is free. Free up space or remove old backups, then try again.“), и предупреждава, когато мястото е на ръба („Disk space is tight: … may need up to … and … is free. The backup continues, but it may fail if the disk fills up.“).
- Възстановяването от място за съхранение първо изтегля нужните файлове на този сървър.
- Качването или изтеглянето на пакет изисква свободно място колкото размера му плюс 50 MB.
- Свободното място се показва в раздела Destinations (**This server**), в **Settings → Retention** и в „Здраве на сайта“.

За да освободите място: намалете **Keep the newest** в **Settings → Retention**, изтрийте стари резервни копия в раздела Backups, изтрийте импортирани пакети в раздела Migration или изключете големи папки, които не ви трябват (кешове, стари архиви).

---

## Практически рецепти

### База данни всеки ден, пълно копие всяка седмица, в Google Drive и S3

1. Добавете място за съхранение **Google Drive** и **Amazon S3** и се уверете, че и двата теста минават успешно.
2. В **Schedules** добавете график:
   - **Name**: „База данни всеки ден“, **How often**: **Every day**, **Time**: 02:00.
   - **What to back up**: само **Database**. (Резервното копие само на базата данни винаги е цялостно само по себе си.)
   - **Where to keep it**: и двете места за съхранение.
   - **Keep the newest** 30 резервни копия.
3. Добавете втори график:
   - **Name**: „Пълно копие всяка седмица“, **How often**: **Every week**, **Day of the week**: Sunday, **Time**: 03:30.
   - **Type**: **Full every time**.
   - **What to back up**: всичко, което ви трябва.
   - **Where to keep it**: и двете места за съхранение. **Keep the newest** 8 резервни копия.
4. В **Settings → Retention** задайте колко копия да остават на този сървър, например 7.

И двата графика оставят резервните си копия и на този сървър, където важи локалното правило.

### Преместване на нов хостинг

**Новият сървър е празен:**

1. На стария сайт: **Migration → Create migration package**. Запазете ключа на инсталатора.
2. Щракнете **Download all** (един ZIP с всички файлове на пакета) и **Installer** (`installer.php`), след което разархивирайте ZIP файла на компютъра си.
3. На новия хостинг: създайте празна база данни и потребител, след което качете `installer.php` и файловете на пакета в основната уеб директория.
4. Отворете `installer.php` на адреса на новия сайт и следвайте [Използване на инсталатора](#използване-на-инсталатора). Ако запазвате същия домейн, въведете го в **Site address**.
5. Насочете домейна към новия сървър, ако още не сте го направили, влезте и проверете сайта.
6. На новия сайт: проверете местата за съхранение и графиците и създайте нова връзка за аварийно възстановяване.

**На новия хостинг вече е инсталиран WordPress:**

1. Инсталирайте този плъгин там.
2. На стария сайт: **Create migration package** и копирайте **Migration link**.
3. На новия сайт: **Migration → Pull from another site**, поставете връзката, **Download the package**, след това **Review and import** най-горе в раздела.

### Клониране на продукционния сайт в тестова среда

1. На тестовия сайт (с инсталирани WordPress и този плъгин) предотвратете изпращането на имейли до клиенти. Със Symelo SMTP добавете `define( 'SYMELO_SMTP_DELIVERY', 'log_only' );` в неговия wp-config.php преди импортирането.
2. На продукционния сайт: **Migration → Create migration package**, копирайте връзката за миграция.
3. На тестовия сайт: **Migration → Pull from another site**, поставете връзката, **Download the package**, след това **Review and import**.
4. След импортирането влезте с акаунта си от продукционния сайт. На тестовия сайт отворете **Schedules** и изключете или изтрийте графиците, които не искате там, и прегледайте **Destinations**. (Те идват от продукционния сайт; вижте [След миграция](#след-миграция).)

Ако тестовият сайт не може да достигне продукционния през интернет (например когато и двата работят в една и съща частна мрежа), вместо това качете файловете на пакета или попитайте разработчик за филтъра `symelo_backups_pull_allow_private_urls`.

### Тест на временен адрес, след това преминаване към истинския домейн

За преместване на нов хостинг, когато искате да проверите сайта, преди домейнът да сочи там:

1. Инсталирайте WordPress и този плъгин на новия хостинг на временен адрес (много хостинг доставчици предоставят такъв).
2. Импортирайте стария сайт там (вижте [Преместване на нов хостинг](#преместване-на-нов-хостинг)) и го проверете на временния адрес.
3. Насочете DNS записите на домейна към новия хостинг и добавете домейна (с HTTPS сертификат) в настройките на новия хостинг.
4. На новия сайт: **Change domain** в известието или **Migration → Switch to the final domain**. Направете пробното изпълнение за истинския адрес, направете резервно копие на базата данни и след това натиснете **Change the domain now**. Когато страницата покаже „The domain change is complete“, щракнете **Open the new admin** и влезте отново на истинския адрес.

### Възстановяване на един плъгин

- **След неуспешно обновление**: възстановете резервното копие **Pre-update**, като отметнете само **Plugins**. То съдържа единствено този плъгин. Вижте [Резервни копия преди обновяване](#резервни-копия-преди-обновяване).
- **От обикновено резервно копие**: възстановяването на **Plugins** връща всички плъгини във вида им към онзи момент, с което се отменят и по-новите обновления на другите плъгини. За да вземете само един плъгин от некриптирано пълно резервно копие, изтеглете частите му **Files**, извлечете `wp-content/plugins/plugin-name/` с програма за архиви и качете тази папка по FTP.

### Щадящо архивиране на малък сървър

1. **Settings → Advanced → Speed**: **Gentle, for small servers**.
2. Намалете **Compression** до 3 или 4: по-малко натоварване на процесора, малко по-големи файлове.
3. Изключете това, което не ви трябва: кешове, стари архиви, `node_modules`.
4. Използвайте график **Incremental** в спокойно време, така че повечето изпълнения да записват само променените файлове.
5. Ако архивирането все още спира със съобщението „The job stopped three times in a row because PHP ran out of memory/time…“, вижте [Ограничения за време и памет](#ограничения-за-време-и-памет).

### Резервни копия предимно извън сървъра

Всяко резервно копие първо се създава на този сървър и плъгинът винаги пази там поне най-новото (то е нужно за бързо възстановяване и за връзката за аварийно възстановяване).

1. Добавете поне едно място за съхранение и го отметнете в графиците си.
2. В **Settings → Retention** задайте **Keep the newest** на 1. (0 означава без ограничение, а не „нито едно“.)
3. Използвайте графици **Full every time**, ако искате на този сървър да има само едно резервно копие. При инкрементални графици текущата верига остава на този сървър, докато не започне ново пълно резервно копие.

### Стартиране на архивирането от системна cron задача

Когато хостингът ви блокира заявките на сайта към самия него или WP-Cron е изключен (`DISABLE_WP_CRON`), оставете cron на сървъра да върши работата. `wp symelo-backups run` стартира планираните резервни копия, чийто час е настъпил, след което обработва задачите в опашката, докато не остане нито една.

Например на всеки 5 минути:

```sh
*/5 * * * * cd /path/to/wordpress && wp symelo-backups run --max-seconds=270
```

Ежедневната поддръжка (прилагане на правилата за запазване, почистване, поддържане на вписванията в облачните услуги активни) продължава да се изпълнява чрез WP-Cron. Когато WP-Cron е изключен, добавете `wp cron event run --due-now --quiet` в същата cron задача.

`--max-seconds` прекратява изпълнението, преди да започне следващата cron задача; останалото продължава при следващото изпълнение. `wp symelo-backups run` не прави паузи между стъпките и не изчаква, ако сървърът е натоварен.

Без WP-CLI външна cron услуга може да извиква `POST /wp-json/symelo-backups/v1/run` с парола за приложение на администратор (вижте [REST API](#rest-api)). Всяко извикване стартира графиците, чийто час е настъпил, и работи до 60 секунди.

---

## Отстраняване на проблеми

### Започнете оттук

1. В раздела **Backups** погледнете **Recent activity** и отворете **View log** на неуспешната задача. Последните редове обикновено казват точно какво се е объркало.
2. Проверете **Инструменти → Здраве на сайта**.
3. В раздела **Destinations** натиснете **Test** за всяко място за съхранение.

### Задачите не стартират или блокират

Задачата остава на „Waiting to start…“ или „Здраве на сайта“ съобщава „A backup job is stuck“.

- В даден момент се изпълнява само една задача. „Waiting for the job before it to finish…“ означава, че друга задача все още се изпълнява.
- Оставете екрана **Backups** отворен за минута: той сам изпълнява стъпките. Ако задачата сега тръгне, стартирането във фонов режим е блокирано.
- Чести причини: защитна стена или плъгин за сигурност, който блокира заявките на сайта към самия него, HTTP удостоверяване на тестов (staging) сайт или изключен WP-Cron. **Здраве на сайта → Информация → Symelo Backups and Migration → Background runner** показва кога фоновият изпълнител е работил за последно и евентуална грешка при изпращането на заявката му.
- Решение: разрешете заявките на сайта към `wp-admin/admin-ajax.php` или изпълнявайте работата от системна cron задача (вижте [Изпълнение на резервните копия от системна cron задача](#стартиране-на-архивирането-от-системна-cron-задача)).
- Задача, която вече не ви трябва: натиснете **Cancel** в картата с напредъка ѝ.
- Графиците изобщо не се изпълняват: проверете дали WP-Cron работи. **Scheduler event** в **Здраве на сайта → Информация → Symelo Backups and Migration** трябва да показва **Scheduled**. Без WP-Cron `wp symelo-backups run`, изпълнявана от системна cron задача, също стартира графиците, чийто час е настъпил.
- **Run now** показва „A backup for this schedule is already running.“: изчакайте това резервно копие или го отменете.

### Ограничения за време и памет

Плъгинът работи на кратки стъпки и след всяка запазва докъде е стигнал. Когато PHP бъде прекъснат по време на стъпка, следващата стъпка продължава от последната запазена точка с по-кратки стъпки. След три поредни прекъсвания задачата завършва неуспешно с едно от следните съобщения:

| Съобщение | Какво да направите |
|---|---|
| „The job stopped three times in a row because PHP ran out of memory. Ask your host to raise the PHP memory limit, or exclude very large files or folders in Settings, then try again.“ | Направете каквото пише. Обичайната причина са много големи единични файлове. |
| „The job stopped three times in a row because PHP ran out of time. Choose the speed "Gentle, for small servers" in Settings → Advanced (it works in shorter steps), or ask your host to raise max_execution_time, then try again.“ | Направете каквото пише. |
| „The job stopped three times in a row before a step could finish (the server ended the request). Try the speed "Gentle, for small servers" in Settings → Advanced and check the PHP error log. Last error: …“ | Направете каквото пише; последната грешка ще помогне на хостинг доставчика ви. |

### Недостатъчно дисково пространство

| Съобщение | Какво да направите |
|---|---|
| „There is only … of free disk space on this server, which isn't enough to make a backup. Free up space or remove old backups first.“ | Вижте [Дисково пространство](#дисково-пространство). |
| „There isn't enough free disk space for the database backup / the file archives: …“ | Същото. |
| „The archive part … wasn't written completely. The disk may be full.“ | Същото. |

### Грешки при местата за съхранение

| Съобщение | Причина и решение |
|---|---|
| „Uploading to … failed: … The backup is still kept on this server.“ | Резервното копие е наред; неуспешно е само копирането. Причината е посочена след двоеточието. Оправете мястото за съхранение и го тествайте; при следващото резервно копие копирането се прави отново. Временните проблеми (ограничения на броя заявки, грешки на сървъра, мрежови проблеми) първо се опитват повторно автоматично. |
| „… isn't connected yet. Open the destination on the Destinations tab and click "Connect …".“ | Свържете акаунта. |
| „Access to … was revoked or has expired. Reconnect … on the Destinations tab.“ | Натиснете **Reconnect**. За OneDrive проверете също дали тайната на клиента (client secret) не е изтекла. |
| „The server's host key fingerprint isn't saved yet…“ / „The server's host key doesn't match the saved fingerprint…“ | SFTP. Вижте [SFTP](#sftp). |
| „The server didn't accept the username and password.“ / „The server didn't accept the private key…“ | Вход в SFTP. Проверете потребителското име и ключа в `~/.ssh/authorized_keys`. |
| „Couldn't connect to … on port …. Check the server name and port, and that the server allows connections from this site's IP address.“ | Сървърът не е достъпен от вашия хостинг. Попитайте и двете страни за защитни стени. |
| „Enter the endpoint region as shown on the Backblaze Buckets page, for example us-west-004.“ | Регион на B2. |
| „Request signing doesn't work on this server…“ | S3: свържете се с поддръжката. |
| „Endpoint URL: use https://. Plain http:// is only accepted for a server in your own network…“ | S3-съвместимо хранилище с персонализиран endpoint: използвайте `https://` адреса на услугата. |
| „Tenant: enter the Directory (tenant) ID from the app's Overview page…“ | OneDrive: вижте [OneDrive / Microsoft 365](#onedrive--microsoft-365). |
| „… is …, more than the email limit of …, so it wasn't emailed…“ | Имейл. Вижте [Имейл](#имейл). |
| „The email couldn't be sent: … Check this site's email setup (for example with Symelo SMTP), and that the mail server accepts attachments of this size.“ | Имейл. Проверете настройките за имейл на сайта. |
| „The destination "…" is turned off and was skipped.“ | Включете го отново или махнете отметката от него в графика. |
| „A saved password or key can't be decrypted any more (the site's security keys changed). Enter it again.“ | Вижте [Запазената стойност вече не може да бъде дешифрирана](#запазената-стойност-вече-не-може-да-бъде-дешифрирана). |

### Резервните копия на мястото за съхранение не се показват

- Натиснете **Look for backups at destinations** в раздела Backups.
- По подразбиране плъгинът търси само в папката на този сайт, която носи името на текущия адрес на сайта (например `SymeloBackups/example.com/`). След смяна на адреса по-старите резервни копия са в старата папка: вижте [След смяна на домейна](#след-смяна-на-домейна).
- Google Drive показва само файловете, създадени от самия плъгин със същото Google приложение.
- Резервните копия, изпратени по имейл, не могат да бъдат изброени.
- Отворете журнала на задачата **Destination check** в **Recent activity**: съобщението „The backups on … could not be listed: …“ посочва проблема.

### След смяна на домейна

Резервните копия на местата за съхранение се пазят в папка, която носи името на адреса на сайта. След преместване на нов домейн (или нов път) новите резервни копия отиват в нова папка, а по-старите остават в старата. За да ги видите отново:

1. В раздела Backups отворете **Look for backups at destinations**.
2. Въведете старата папка в **Site folder**, например `old-domain.com`, или натиснете **Show the folders at my destinations** и я изберете.
3. Натиснете **Look for backups**.

Намерените там резервни копия се добавят към списъка. Те се показват като направени от друг сайт, затова при възстановяването им се изисква потвърждение, а старият им адрес се заменя с текущия. Те се изтеглят от старата папка, новите инкрементални резервни копия никога не се надграждат върху тях, а правилата за запазване на графиците никога не ги изтриват: изтрийте ги сами, когато вече не ви трябват.

Базата данни на мрежа multisite не може да бъде възстановена на друг адрес по този начин; използвайте инсталатора на миграционен пакет (вижте [Multisite](#мултисайт)).

### Резервни копия, отбелязани като направени от друг сайт

Списъкът показва „From https://…“, а при възстановяване трябва да потвърдите, че имате доверие на резервното копие. Това се случва, когато:

- резервното копие е направено от друг сайт (импорт или папка на място за съхранение, споделена по погрешка);
- резервното копие е намерено в папката на друг адрес на мястото за съхранение, например стария домейн на този сайт (вижте [След смяна на домейна](#след-смяна-на-домейна));
- манифестът на резервното копие е променен след създаването му;
- ключовете за сигурност на този сайт са се променили след създаването на резервното копие: нови WordPress salts в wp-config.php, добавяне или промяна на `SYMELO_BACKUPS_KEY` или импорт на базата данни на друг сайт. Тогава плъгинът вече не може да прочете ключа си за подписване и създава нов, така че всички по-стари резервни копия изглеждат чужди, дори когато са със собствения адрес на сайта. Плъгинът ви уведомява, когато това се случи, а **Инструменти → Здраве на сайта** показва „Older backups show as made by another site“.

Ако знаете, че резервното копие е ваше, отметнете потвърждението и го възстановете.

### Проблеми при възстановяване

| Съобщение или ситуация | Какво да направите |
|---|---|
| „This backup is encrypted. Enter the password it was made with.“ / „The encryption password is wrong…“ | Въведете паролата, зададена при създаването на резервното копие. |
| „An earlier backup that this incremental backup builds on is missing, so it can't be restored.“ | Изтрито е звено от веригата. Възстановете пълното резервно копие на веригата или друга верига. |
| „This file was encrypted with Argon2id, which needs the PHP sodium extension…“ | Помолете хостинг доставчика си да включи разширението sodium. |
| „The restore tool could not be set up. Check that wp-content is writable.“ | Инструментът за възстановяване се копира в wp-content. Оправете правата на папката. |
| „The restorer could not be started: the server answers with an error (500). The PHP error log of your hosting account shows why.“ | Сървърът отказва да изпълнява PHP в нова папка в wp-content. Попитайте хостинг доставчика си. |
| Страница **This restore link doesn't work**: „The link is wrong or incomplete, it has expired, or it was already used. A restore link has to be opened within an hour, and works for one restore only.“ | Връзките за възстановяване изтичат след един час, ако възстановяването не е стартирано, и след два дни, след като е стартирано. Върнете се в раздела Backups и стартирайте възстановяването отново; ако WordPress вече не се зарежда, използвайте аварийната връзка (recovery link). Обикновена страница „Not Found“ означава, че инструментът за възстановяване вече е приключил и се е премахнал. |
| Страница **This recovery link doesn't work**: „The link is wrong or incomplete, or it was replaced by a newer link or turned off.“ | Копирайте отново цялата връзка (тя завършва с дълъг код след `?key=`). Ако WordPress още работи, създайте нова връзка в **Backups → Recovery**; в противен случай използвайте инсталатора на миграционен пакет или попитайте хостинг доставчика си. |
| „This link can't be used. It has expired, was already used, or isn't complete…“ | Показва се, когато страницата за възстановяване вече е била отворена и връзката е спряла да работи. Действайте както при страниците по-горе. На аварийната страница текстът казва, че аварийната връзка е заменена или изключена: използвайте най-новата от **Backups → Recovery**. |
| „This backup comes from a multisite network, but this site is a single site…“ / „This backup comes from a single site, but this site is a multisite network…“ / „This network backup was made at …, but this network is at …“ | Базата данни не пасва на този сайт. Вижте [Multisite](#мултисайт). Възстановяването само на файловете все пак е възможно. |
| „A statement in the database backup is larger than this database server accepts (max_allowed_packet is … MB).“ | Помолете хостинг доставчика си да увеличи `max_allowed_packet` за MySQL/MariaDB. |
| „The database user can't create and delete tables: …“ | Дайте на потребителя на базата данни всички права върху нея. |
| „The web server can't write to …“ | Оправете правата на папката и натиснете **Check again**. |
| Сайтът все още показва „Briefly unavailable for scheduled maintenance“ | Възстановяването е спряло. Отворете отново връзката за възстановяване и натиснете **Try again** или изтрийте файла `.maintenance` в папката на WordPress. |
| Страницата за възстановяване остава на първата си карта и след 15 секунди показва **This page hasn't started** | Скриптът на страницата е блокиран: от разширение на браузъра или от услуга, която пренаписва страниците, като Cloudflare Rocket Loader или PageSpeed (от версия 1.0.2 страницата ги моли да не го правят). Презаредете, отворете адреса в частен прозорец или в друг браузър с изключени разширения или изключете Rocket Loader (Cloudflare: Speed → Optimization) и презаредете. Възстановяването пази напредъка си на сървъра. |
| „A firewall blocked the request (HTTP 403)“ | Плъгин за сигурност, ModSecurity или услуга като Cloudflare е отказала заявките на страницата. Помолете хостинг доставчика си да разреши заявките към адреса на страницата за възстановяване (`wp-content/symelo-restore-…/index.php`) или временно спрете защитната стена по време на възстановяването, след което натиснете **Try again**. |
| „The server's answer couldn't be read“ | Нещо е добавило текст към отговора (PHP предупреждения, услуга за сигурност или кеширане). Съобщението показва началото на изпратеното от сървъра. Натиснете **Try again**; ако се повтаря, изпратете журнала на хостинг доставчика си. |
| „The server didn't answer“ / „The server stopped the request (HTTP 502/503/504)“ | Обикновено ограничение за време на хостинга или на проксито. Натиснете **Try again**: възстановяването продължава от последната запазена точка. |
| Страницата изглежда застинала на **Updating addresses in the database** | Отворете **Log**: докато стъпката тече, приблизително на всеки 15 секунди се появява ред „Page: Request "run": HTTP 200 …“ с текущата таблица и броя редове, а „Running for … · progress saved … ago“ под лентата за напредък продължава да отброява. Голяма таблица (например wp_postmeta) може да отнеме няколко минути на бавен сървър за бази данни. Ако няколко минути не се появи нов ред, презаредете страницата: възстановяването продължава оттам, където е спряло. (Преди версия 1.0.3 тази стъпка обновяваше по един ред наведнъж, което беше много бавно на някои сървъри, а лентата се местеше само между таблиците.) |
| Таблица е изброена с „has no primary key or unique index and about … rows“ | Таблицата е твърде голяма, за да бъде обновена без ключ; адресите в нея не са променени. Вижте [Замяна на адреси](#замяна-на-адреси). |

### Страницата за възстановяване или на инсталатора е заключена

След 10 грешни ключа или връзки от един и същ IP адрес в рамките на 15 минути (или 100 от всички адреси) страницата отказва нови опити за 15 минути:

- Инсталаторът показва „Too many wrong keys. For your security, try again in … minutes.“
- Връзките за възстановяване и аварийните връзки отварят страница **Please wait a moment**: „This page was opened with a wrong link too often, so it is locked for a while to keep your site safe.“ Тя посочва колко да изчакате и че трябва да копирате цялата връзка.

Изчакайте толкова, колкото посочва страницата, и използвайте правилната връзка или ключ. Зад прокси или CDN всички посетители може да се броят за един адрес; тогава грешен опит от някой друг може да заключи и вас. Ако инструментът за възстановяване не може да брои грешните опити (например защото в папката му не може да се записва), той никога не заключва никого.

### Проблеми при миграция

| Съобщение | Какво да направите |
|---|---|
| „Paste the migration link from the other site. It starts with "symelo-migrate:".“ | Полето е било празно. |
| „This is a web address, not a migration link…“ / „This isn't a migration link. A migration link starts with "symelo-migrate:"…“ | Копирали сте нещо друго, например адреса на сайта. На стария сайт отворете **Backups → Migration** и копирайте връзката, която започва със `symelo-migrate:` (бутонът **Copy** я копира цялата). |
| „This migration link is incomplete or damaged…“ | Част от връзката липсва, обикновено защото е отрязана при копирането (някои програми за чат и имейл разделят дългите редове). Копирайте я отново с бутона **Copy**. |
| „This migration link expired on … (links work for 48 hours)…“ / „The other site says this migration link has expired…“ | На стария сайт натиснете **Get link** до пакета в **Migration → Packages on this server** и поставете новата връзка. |
| „The other site refused this migration link because its signature doesn't match…“ | Връзката е променена или отрязана или ключовете за сигурност на стария сайт са сменени след създаването ѝ. Натиснете **Get link** на стария сайт и поставете новата връзка. |
| „This migration link is from this site. Paste it into the site you are moving to.“ | Използвайте връзката на новия сайт. |
| „This site couldn't connect to … to download the package: …“ / „This site can't reach …: the name can't be found…“ | Старият сайт е офлайн, адресът му е променен или защитна стена, плъгин за сигурност или страница „coming soon“ блокира заявките към `wp-admin/admin-ajax.php`. Оправете това или изтеглете файловете на пакета там и вместо това ги качете тук. |
| „… (or a firewall or security plugin in front of it) blocked the request with HTTP status 403…“ | Разрешете заявките към `wp-admin/admin-ajax.php?action=symelo_backups_pull` на стария сайт по време на преместването (например в плъгина му за сигурност или в защитната стена на CDN) или вместо това качете файловете. |
| „… didn't recognise the request. Check that Symelo Backups and Migration is installed and active on the other site.“ | Активирайте плъгина на стария сайт. |
| „… asks for a password (HTTP authentication)…“ | Старият сайт е защитен с парола. Разрешете достъпа до `wp-admin/admin-ajax.php` без нея по време на преместването или вместо това качете файловете. |
| „The other site doesn't have this migration package any more…“ | Пакетът е изтрит на стария сайт. Създайте там нов пакет. |
| „This package comes from a multisite network…“ / „This package comes from a single site…“ / „This network package was made at …“ | Пакетът не пасва на този сайт. Вижте [Multisite](#мултисайт). |
| „The package could not be downloaded from the other site: …“ | Мрежови проблеми; изтеглянето първо се опитва няколко пъти. Проверете дали новият сайт може да достигне до стария, или вместо това качете файловете. |
| „The server refused the upload because it is too large. Ask your host to raise upload_max_filesize and post_max_size, or upload the files by FTP.“ | Направете каквото пише. |
| „Your login session expired. Reload the page and choose the files again: the upload continues where it stopped.“ | Направете каквото пише. |
| „This package isn't complete yet. Missing: …“ | Качете липсващите файлове. |
| „This package builds on the backup …, which isn't on this server. Upload it too.“ | Инкременталното резервно копие се нуждае от цялата си верига: качете файловете на всяко резервно копие, върху което то се надгражда. |

### Проблеми при смяна на домейна

| Съобщение или ситуация | Какво да направите |
|---|---|
| „Enter a full address that starts with https://…“ | Окончателният адрес трябва да е пълен адрес, който започва с `https://`, без потребителско име, `?` или `#`. |
| „Run the dry run for this address first (again, if it is older than a day or the address changed).“ | Направете пробното изпълнение за желания адрес и след това сменете домейна в рамките на един ден. |
| „wp-config.php sets the site's address (WP_HOME or WP_SITEURL)…“ | Премахнете редовете `WP_HOME` и `WP_SITEURL` от wp-config.php и се върнете. |
| „This is a multisite network. Its domain can't be changed here…“ | Преместете мрежата с инсталатора на пакет за миграция. |
| След смяната новият адрес не се отваря или отваря друг сайт | DNS записите му или хостингът ви все още не го изпращат към този сървър или липсва HTTPS сертификатът му. Оправете това при доставчика на домейна или при хостинга си; сайтът заработва веднага щом това стане. Дотогава добавянето на `define( 'WP_HOME', 'https://old.example' );` и `define( 'WP_SITEURL', 'https://old.example' );` (с вашия стар адрес) в wp-config.php кара WordPress отново да отговаря на стария адрес, така че да можете да влезете там; премахнете двата реда, след като новият адрес заработи. За да се върнете окончателно, възстановете резервното копие на базата данни, направено преди смяната (от раздела Backups, докато тези редове са добавени, или с връзката за аварийно възстановяване, която работи без вход), след което премахнете редовете. |
| Страницата показва „Can't reach the site right now. Trying again…“ по време на смяната | Смяната продължава да тече на сървъра. Ако е приключила, сайтът отговаря на новия адрес: **Open the new admin**. Ако това все още не отваря този сайт, вижте реда по-горе. **Reload this page** показва отново напредъка, докато смяната още тече. |
| „The domain change stopped before it finished…“ / „The domain change was cancelled.“ / „The domain change failed: …“ с „Some rows may already use the new address…“ | Сайтът все още отговаря на стария си адрес: адресът на сайта и таблицата с настройки се променят едва в последната стъпка, наведнъж. Стартирайте смяната отново, за да я довършите (вече променените редове се пропускат), или възстановете резервното копие, което сте направили преди това. |
| Искате да разберете дали смяната е приключила, без да влизате в администрацията | Отворете `https://old.example/wp-json/` (или `?rest_route=/` на стария адрес): `home` и `url` показват адреса, който сайтът използва в момента. С WP-CLI: `wp option get home`. За да довършите спряла смяна, изпълнете `wp symelo-backups run` на сървъра. |

### Проблеми с аварийната връзка

- „The recovery files are missing or can't be written…“: отворете която и да е страница в wp-admin (плъгинът ги създава отново) или натиснете **Create a new link**.
- „The recovery link could not be set up: …“: обикновено в wp-content не може да се записва.
- След смяна на ключовете за сигурност (salts или `SYMELO_BACKUPS_KEY`) плъгинът вече не може да обновява връзката. Старата връзка продължава да работи, но създайте нова, за да използва текущите настройки.

### Запазената стойност вече не може да бъде дешифрирана

Виждате „The saved value can't be decrypted any more (the site's security keys changed). Enter it again.“ при място за съхранение, местата за съхранение показват **Needs attention** или място за съхранение в Google Drive, Dropbox или OneDrive показва **Reconnect needed** със съобщението „The saved sign-in can't be read anymore (the site's security keys changed). Connect again.“

Паролите, ключовете и данните за вход се шифроват с `SYMELO_BACKUPS_KEY` или, ако той не е зададен, със security salts на сайта ви. Ако ключът или salts са се променили (някои плъгини за сигурност сменят salts периодично; при импорт се запазват salts на новия сайт), старите стойности не могат да бъдат прочетени. Въведете ги отново, свържете отново OAuth местата за съхранение и задайте отново паролата за шифроване. Ако дефинирате `SYMELO_BACKUPS_KEY` (и го запазите при преместване на сайта), това няма да се случва занапред.

### Все още имате проблем?

Отидете в раздела **Support**, натиснете **Copy system information** и изпратете информацията по имейл заедно с описание на проблема (и журнала на задачата) на office@symelo.com.

---

## Поверителност и сигурност

### Какво се съхранява и къде

| Данни | Къде |
|---|---|
| Резервни копия | `wp-content/uploads/symelo-backups-{random}/backups/{backup ID}/` (при multisite – в папката за качвания на основния сайт). |
| Файлове на задачите, журнали, временни файлове | `…/jobs/`, `…/logs/`, `…/tmp/` в същата папка. Журналите и задачите се изтриват след 30 дни, временните файлове – след един ден. |
| Качени и изтеглени пакети | `…/import/{backup ID}/`. |
| Настройки на аварийната връзка | `…/recovery/` и аварийният инструмент в `wp-content/symelo-recovery/`. |
| Инструменти за възстановяване | `wp-content/symelo-restore-{random}/`, докато възстановяването се подготвя или изпълнява. Премахват се, когато приключи, или след един ден без използване. |
| Настройки, графици, места за съхранение, OAuth вписвания, списъкът с резервни копия на местата за съхранение | Опции в базата данни на WordPress. Паролите, ключовете, токените, паролата за шифроване и ключът за подписване са шифровани. |

Името на папката за съхранение съдържа случайна част, а плъгинът поставя в нея файлове `.htaccess`, `web.config` и `index.php`, които блокират уеб достъпа при Apache, LiteSpeed и IIS. **Nginx пренебрегва тези файлове.** При Nginx блокирайте папката в конфигурацията на сървъра (хостинг доставчикът ви може да помогне):

```nginx
location ~ /symelo-backups- { deny all; }
```

„Здраве на сайта“ проверява дали резервните копия не могат да бъдат изтеглени през уеб, независимо какъв сървър използвате. Изтеглянията в администрацията минават през WordPress след проверка на правата; към папката за съхранение никога няма директна връзка.

Аварийният инструмент и инструментът за възстановяване се нуждаят от данните за вход в базата данни и от паролата за шифроване. Те ги пазят шифровани с ключ, извлечен от тайната част на връзката, която никога не се записва във файл. Правилата за достъп за Apache, LiteSpeed и IIS блокират всичко в тези папки освен `index.php`; при Nginx ги защитава шифроването.

### Какво се изпраща и къде

- **Резервните копия** отиват само до местата за съхранение, които сте настроили, с данните за акаунт, които сте въвели: Google Drive (oauth2.googleapis.com, accounts.google.com, www.googleapis.com), Dropbox (www.dropbox.com, api.dropboxapi.com, content.dropboxapi.com), OneDrive (login.microsoftonline.com, graph.microsoft.com), Amazon S3 (s3.{region}.amazonaws.com), Wasabi, DigitalOcean Spaces, Scaleway, Cloudflare R2 ({account}.r2.cloudflarestorage.com), Backblaze B2 (s3.{region}.backblazeb2.com), Azure Blob Storage ({account}.blob.core.windows.net), вашия MinIO или друг персонализиран S3 endpoint, вашия SFTP или FTP сървър или по имейл чрез `wp_mail()`. Нищо не се изпраща, докато не добавите място за съхранение. Резервните копия, имената на файловете и адресът на сайта ви (името на папката на сайта) се изпращат само доколкото е нужно за съхраняването и изброяването на резервните копия. Заявките към S3-съвместими хранилища, Cloudflare R2, B2 и Azure се идентифицират с user agent `SymeloBackups/<version>`, който включва адреса на сайта ви.
- **Фонова работа**: сайтът изпраща кратки заявки към самия себе си (`wp-admin/admin-ajax.php`, удостоверени със случаен токен, уникален за всеки сайт) и използва WP-Cron. „Здраве на сайта“ заявява тестов файл от папката с резервни копия.
- **Миграционни връзки**: новият сайт изтегля пакета от стария сайт с подписани заявки, които изтичат заедно с връзката.
- **Известията** отиват до вашите адреси за известия.
- Нищо не се изпраща до Symelo LTD.

### Лични данни

Резервните копия съдържат цялата ви база данни: потребителски акаунти, поръчки, коментари и всичко останало. Имайте това предвид от гледна точка на защитата на данните:

- Съхранявайте резервни копия само там, където имате право да пазите лични данни, и ограничете колко дълго ги пазите с правила за запазване.
- Изтриването на потребител или заличаването на лични данни в WordPress не променя съществуващите резервни копия. Те изчезват, когато правилата за запазване ги премахнат.
- Шифроването (**Encrypt everything**) прави откраднатите или изтекли резервни копия безполезни без паролата.

### Бележки за сигурността

- Всяко действие в администрацията проверява правата и nonce защитата на WordPress. REST маршрутите изискват правото (capability) на плъгина, с изключение на напредъка на смяната на домейна (`migration/domain/status`): той отговаря само на случаен ключ, който страницата в администрацията е получила за тази смяна, съхраняван само като хеш и валиден един ден, и не показва нищо освен състоянието, процента, стъпката и новия адрес за вход.
- Манифестът на всяко резервно копие съдържа SHA-256 контролни суми на файловете му и е подписан с ключ, известен само на този сайт (HMAC-SHA256). При възстановяване се проверяват и двете; резервно копие, което не може да бъде проверено, изисква изричното ви потвърждение.
- Архивите се разархивират само в папката на WordPress: абсолютните пътища, `..` и символните връзки се отхвърлят, а wp-config.php никога не се презаписва.
- Импортът на базата данни изпълнява само типовете SQL заявки, необходими за един дъмп.
- Паролите, ключовете и токените се съхраняват шифровани, никога не се показват отново в администрацията, никога не се връщат от REST API и се премахват от журналите и от отчета със системна информация.
- SFTP сървърите се закрепват чрез отпечатъка на хост ключа им (host key fingerprint). OAuth вписванията използват ваше собствено приложение с PKCE.
- Инструментът за възстановяване, аварийната връзка и инсталаторът използват дълги случайни ключове, проверявани за постоянно време, заключват достъпа при повтарящи се грешни ключове, а инструментът за възстановяване и инсталаторът се изтриват сами, когато приключат. Връзките за възстановяване изтичат след един час, ако не бъдат използвани.
- Миграционните връзки са подписани, изтичат след 48 часа и предоставят само файловете на съответния миграционен пакет.
- **Пазете аварийната връзка, миграционните връзки и ключовете на инсталатора като пароли.**

---

## Деактивиране и деинсталиране

**Деактивирането** на плъгина:

- спира графиците, резервните копия преди обновявания и цялата фонова работа (започната задача продължава, когато активирате плъгина отново);
- оставя резервните копия, настройките, местата за съхранение и аварийната връзка на мястото им. **Аварийната връзка продължава да работи**, докато плъгинът е неактивен, защото не ѝ е нужен WordPress. Това е нарочно: когато сайтът е повреден, плъгините често се деактивират, докато се търси проблемът. Ако не искате това, първо изключете връзката в раздела Recovery.

**Изтриването** на плъгина (Разширения → Изтриване):

- Винаги: премахва планираните задачи, заключващите файлове, аварийната връзка (инструмента ѝ в wp-content и настройките ѝ) и останалите инструменти за възстановяване. Те отварят възстановяване без вход и никой няма да ги наглежда, след като плъгинът бъде премахнат. След повторно инсталиране създайте нова аварийна връзка.
- С включено **Settings → Advanced → Also delete its data**: премахва също настройките, графиците, местата за съхранение, OAuth вписванията, списъка с резервни копия на местата за съхранение, както и файловете на задачите, журналите и временните файлове. При multisite за файловете решава настройката на основния сайт.
- **Никога:** резервните копия не се изтриват – нито на този сървър (папките `backups/` и `import/` остават), нито на местата за съхранение. Те може да са единственото копие на сайта ви.
- С изключено **Also delete its data** (по подразбиране) всичко останало остава, така че след повторно инсталиране продължавате оттам, докъдето сте стигнали.

За да премахнете всичко:

1. Изтрийте ненужните резервни копия в раздела Backups, като изберете всички места, където се съхраняват, както и пакетите в **Migration → Packages ready to import**.
2. Прекъснете връзката с местата за съхранение в Google Drive, Dropbox и OneDrive и изтрийте приложенията, които сте създали при тези доставчици, ако не ви трябват.
3. Отметнете **Settings → Advanced → Also delete its data** и натиснете **Save changes**.
4. Деактивирайте и изтрийте плъгина. (Аварийната връзка и инструментите за възстановяване се премахват заедно с него.)
5. Изтрийте папката `wp-content/uploads/symelo-backups-…` чрез FTP.

---

## За разработчици

### Константи в wp-config.php

| Константа | Стойности | Ефект |
|---|---|---|
| `SYMELO_BACKUPS_KEY` | Поне 32 случайни знака | Ключ, който шифрова съхраняваните тайни (пароли и ключове на местата за съхранение, OAuth токени, паролата за шифроване, ключа за подписване на манифестите) вместо ключ, извлечен от security salts на сайта (`wp_salt( 'secure_auth' )`). Тогава само копие на базата данни не е достатъчно, за да бъдат разкрити. По-кратките стойности се пренебрегват. |
| `SYMELO_BACKUPS_SPEED` | `fast`, `normal` или `gentle` | Заключва **Settings → Advanced → Speed**. Невалидните стойности означават `normal`. |

Задайте `SYMELO_BACKUPS_KEY` при инсталирането на плъгина и го запазете при преместване на сайта:

```php
define( 'SYMELO_BACKUPS_KEY', '…64 random characters…' );
```

Ако го добавите или промените по-късно, всичко, шифровано със стария ключ, става нечетимо: въведете отново тайните на местата за съхранение, свържете отново OAuth местата за съхранение, задайте отново паролата за шифроване и създайте нова аварийна връзка. Създава се и нов ключ за подписване, така че съществуващите резервни копия се показват като направени от друг сайт.

### Филтри

| Филтър | По подразбиране | Предназначение |
|---|---|---|
| `symelo_backups_capability` | `'manage_options'` (`'manage_network_options'` при multisite) | Правото (capability) за екрана, всяко действие в администрацията и REST API. |
| `symelo_backups_pace` | Вижте [Advanced](#разширени) | `( array $profile, string $speed )`. Ключове: `budget` (секунди на стъпка), `pause` (секунди между стъпките), `max_load` (натоварване на ядро, при което работата изчаква; 0 = никога). |
| `symelo_backups_dispatch_args` | Неблокираща POST заявка с токена на изпълнителя | Аргументите на `wp_remote_post()` за заявката, която сайтът изпраща към самия себе си. |
| `symelo_backups_http_timeout` | `60` | `( int $seconds, string $method, string $host )`. Време за изчакване на заявките към S3-съвместими хранилища, B2 и Azure (минимум 5). |
| `symelo_backups_ftp_timeout` | `30` | Време за изчакване на FTP връзката в секунди (минимум 5). |
| `symelo_backups_sftp_timeout` | `30` | Време за изчакване на SFTP връзката в секунди (минимум 5). |
| `symelo_backups_azure_version` | `'2026-04-06'` | Версия на REST API на Azure Blob Storage. |
| `symelo_backups_pull_request_args` | – | `( array $args, string $url )`. Аргументите на заявките, които изтеглят пакет от друг сайт. |
| `symelo_backups_pull_allow_private_urls` | `false` | `( bool $allow, string $url )`. Разрешава изтегляне от частни и локални адреси (например два сайта в една вътрешна мрежа). |
| `symelo_backups_notification` | – | `( array $mail )` с `to` (масив), `subject`, `body`. Променя или отменя (с празно `to`) имейл с известие. |
| `symelo_backups_more_from_symelo` | `[]` | Продуктите, показани под „More from Symelo LTD“ в раздела Support: `[ [ 'title' => …, 'description' => …, 'url' => … ] ]`. Картата се показва само когато списъкът не е празен. |

### Действия

| Действие | Аргументи | Кога |
|---|---|---|
| `symelo_backups_loaded` | `Plugin $plugin` | Плъгинът е зареден. |
| `symelo_backups_register_destinations` | `Registry $registry` | Регистрирайте собствено място за съхранение с `$registry->add( new My_Destination() )`. Местата за съхранение имплементират `Symelo\Backups\Destinations\DestinationInterface`. |
| `symelo_backups_job_finished` | `array $job` | Задача е завършена, неуспешна или отменена. Ключовете включват `id`, `type`, `status`, `options`, `result`, `error`, `warnings`. |
| `symelo_backups_destination_saved` | `string $id, string $type, bool $new` | Добавено или променено е място за съхранение. |
| `symelo_backups_destination_deleted` | `string $id` | Премахнато е място за съхранение. |
| `symelo_backups_destination_tested` | `string $id, true\|WP_Error $result` | Тествано е място за съхранение. |
| `symelo_backups_cleanup` | `JobManager $jobs` | След ежедневното почистване. |

### WP-CLI

| Команда | Какво прави |
|---|---|
| `wp symelo-backups backup [--components=<list>] [--destinations=<list>] [--type=<full\|incremental\|auto>] [--note=<note>] [--no-wait]` | Създава резервно копие и изчаква да приключи, като показва напредъка. По подразбиране компонентите се вземат от настройките, мястото за съхранение е само този сървър, а типът е `full`. С `--no-wait` само го поставя в опашката. |
| `wp symelo-backups list [--format=<table\|csv\|json\|yaml\|ids>]` | Изброява резервните копия с ID, дата, тип, размер, компоненти, пълнота, шифроване, къде се съхраняват и бележката. |
| `wp symelo-backups restore <id> [--components=<list>] [--source=<id>] [--ask-password] [--confirm-foreign] [--no-replace-urls]` | Подготвя възстановяване и отпечатва адреса на страницата за възстановяване. Нищо не се променя, докато не я отворите в браузър (в рамките на един час) и не стартирате възстановяването оттам. |
| `wp symelo-backups run [--max-seconds=<seconds>]` | Стартира планираните резервни копия, чийто час е настъпил, след което обработва задачите в опашката, докато не остане нито една (или докато не изтече времето, минимум 10 секунди), без паузи. |
| `wp symelo-backups schedules [--format=<format>]` | Изброява графиците. |
| `wp symelo-backups destinations list` | Изброява местата за съхранение с ID, име, тип и дали са включени и достъпни. |
| `wp symelo-backups destinations test <id>` | Тества място за съхранение. |
| `wp symelo-backups self-test` | Проверява на този сървър архивите, шифроването, откриването на повреди, дъмп на база данни и импорт на временни таблици, търсенето и замяната и подписването на S3 заявки (от 10 до 30 секунди). |

Примери:

```sh
wp symelo-backups backup --components=database --note="Before the launch"
wp symelo-backups backup --destinations=s3-a1b2c3 --type=auto
wp symelo-backups restore 20261012-191500-full-a1b2c3 --components=plugins,themes
```

### REST API

Всички маршрути са под `/wp-json/symelo-backups/v1/` и изискват правото на плъгина: влязъл администратор (с REST nonce) или парола за приложение. Отговорите никога не съдържат тайни: за тайните на местата за съхранение се посочва само дали са зададени, а задачите не включват ключовете на инсталатора и миграционните връзки.

| Метод и маршрут | Параметри | Какво прави |
|---|---|---|
| `GET /status` | – | Версия, свободно място, текуща задача, брой активни задачи, последно успешно резервно копие, бройки, състояние на аварийната връзка, времена на изпълнителя. |
| `GET /backups` | – | Всички резервни копия, като най-новите са първи. |
| `POST /backups` | `components`, `destinations`, `type` (`full` по подразбиране, `incremental`, `auto`), `note`, `encrypt`, `include_wp_config` | Стартира резервно копие. Отговаря с 202 и задачата. |
| `GET /backups/{id}` | – | Манифестът (без подписа) плюс `locations` и `foreign`. |
| `DELETE /backups/{id}` | `locations` (по подразбиране: навсякъде) | Изтрива резервно копие във фонов режим. |
| `GET /backups/{id}/files/{file}` | – | Предава поточно файл от резервно копие на този сървър (`manifest.json` или файл, посочен в манифеста). Поддържа HTTP Range. |
| `GET /backups/{id}/archive` | – | Предава поточно всички файлове на резервно копие на този сървър като един ZIP архив, `{id}.zip` (без компресия, ZIP64 при нужда). Поддържа HTTP Range, така че прекъснатите изтегляния продължават. |
| `GET /jobs/current` | – | Текущата или следващата задача. |
| `GET /jobs/{id}` | `log` (bool) | Задача, по избор с края на журнала ѝ. |
| `POST /jobs/{id}/cancel` | – | Отменя задача. |
| `POST /run` | `seconds` (5–60, по подразбиране 20) | Стартира планираните резервни копия, чийто час е настъпил (`started`: schedule ID => job ID), след което изпълнява фоновата работа в тази заявка без паузи: алтернатива на WP-CLI за външен cron. |
| `POST /restore` | `backup_id` (задължителен), `components`, `source`, `password`, `replace_urls` (bool или null), `delete_extra`, `confirm_foreign` | Подготвя възстановяване (задача). Когато приключи, `result.restorer_url` (за същия потребител) е страницата за възстановяване, която трябва да отворите в рамките на един час. |
| `GET /settings` | – | Всички настройки, без тайните (вместо тях `has_encryption_password`). |
| `POST /settings` | Произволни ключове на настройки; `encryption_password` (само за запис, `""` я премахва) | Променя само изпратените ключове, като ги валидира както екранът с настройки. Новата парола трябва да е поне 8 знака, а шифроването не може да бъде включено без парола: и в двата случая отговорът е 400 и нищо не се променя. Премахването на паролата изключва шифроването. Връща настройките, `errors` (стойностите, които са пропуснати) и `messages`. |
| `GET /destinations` | – | Местата за съхранение със стойностите им; тайните само като зададени или не, плюс проблемите. |
| `POST /destinations` | `id` (пропуснете го, за да добавите), `type`, `label`, `values` | Добавя или променя място за съхранение. Празните тайни запазват съхранената стойност. |
| `DELETE /destinations/{id}` | – | Премахва място за съхранение (резервните копия, съхранени там, остават). |
| `POST /destinations/{id}/test` | – | Тества място за съхранение: `{ok, message}`. |
| `GET /schedules` | – | Всички графици. |
| `POST /schedules` | `id` (пропуснете го, за да добавите), `label`, `enabled`, `frequency`, `time`, `weekday`, `monthday`, `type`, `full_every`, `components`, `destinations`, `keep`, `keep_days` | Добавя или променя график. Новият график взема пропуснатото от стойностите по подразбиране: всеки ден в 03:00, инкрементално с пълно резервно копие на всеки 7 дни, компонентите от настройките, този сървър, пазене на 7 копия. |
| `DELETE /schedules/{id}` | – | Изтрива график (резервните му копия остават). |
| `GET /recovery` | – | Състояние на аварийната връзка: `enabled`, `created`, `folder_ok`. |
| `POST /recovery` | – | Създава (или заменя) аварийната връзка. Отговорът е единственото място, където връзката се показва. |
| `DELETE /recovery` | – | Изключва аварийната връзка. |
| `POST /migration/export` | `encrypt`, `note` | Стартира създаването на миграционен пакет. Отговорът (202) е единственото място, където се съдържа `result.installer_key`. |
| `POST /migration/{id}/link` | – | Нова миграционна връзка за пакет на този сървър: `{link, expires}`. |
| `GET /migration/{id}/installer` | – | Предава поточно `installer.php` за пакет. |
| `GET /migration/imports` | – | Пакетите в папката за импорт, с пълнотата им и липсващите файлове. |
| `DELETE /migration/imports/{id}` | – | Изтрива пакет от папката за импорт (импортираните пакети се изтриват и автоматично 7 дни след импортирането). |
| `POST /migration/pull` | `link` | Изтегля пакет чрез миграционна връзка (задача). Първо връзката се проверява и другият сайт се пита дали я приема; грешките (400) казват какво не е наред. |
| `POST /migration/import` | `backup_id`, `password`, `confirm_foreign` | Подготвя импорт (задача, както при `/restore`). |
| `GET /migration/domain` | – | Смяната на домейна след миграция: `record` (`from`, `to`, `package`, `kind`, `time`), `pending`, текущите адреси (`current`), `blockers`, задачата за пробно изпълнение (`dry_run`), която позволява смяна, `last_change`. |
| `POST /migration/domain` | `new_home` (задължителен, https), `dry_run` (по подразбиране true), `dry_run_job`, `confirm` | Стартира пробно изпълнение (само преброява) или смяната (задача). Смяната изисква `confirm: true` и `dry_run_job`: завършено пробно изпълнение за същия адрес от последните 24 часа. След това сайтът отговаря само на `new_home`. |
| `DELETE /migration/domain` | – | Keep this domain: премахва записа за миграцията и известието му. |
| `POST /migration/domain/status` | `job`, `token` | Не изисква вход: напредъкът на смяна на домейна за страница, чиято сесия е приключила, когато сайтът се е превключил (`status`, `percent`, `step`, `login_url`). Ключът (token) идва от страницата в администрацията и работи един ден. |
| `POST /self-test` | – | Самопроверката (както в WP-CLI). |
| `GET /oauth` | – | Публичен: целта на OAuth пренасочването. Той само препраща отговора на доставчика към wp-admin, където се проверяват администраторът и заявката за вписване. |

Крайната точка за изтегляне чрез миграционните връзки е `wp-admin/admin-ajax.php?action=symelo_backups_pull`. Тя не изисква вход; всяка заявка носи подпис, извлечен от връзката, и се предоставят само файловете на съответния миграционен пакет, докато връзката не изтече. Отказаната заявка посочва причината в заглавката `X-Symelo-Pull-Error` (`expired`, `signature`, `not_found` или `invalid`), така че сайтът, който изтегля, може да обясни проблема.

Идентификатори: резервни копия `{Ymd}-{His}-{type}-{random}` в UTC (например `20261012-191500-full-a1b2c3`), задачи `job-{Ymd}-{His}-{microseconds}-{random}`, места за съхранение `{type}-{random}` (например `s3-a1b2c3`), графици `{frequency}-{n}` (например `daily-1`).

### Файлови формати

Резервното копие е папка `backups/{id}/` на този сървър и `{folder}/{site}/{id}/` на местата за съхранение (частта за сайта е хостът, портът и пътят на сайта, например `example.com`):

| Файл | Съдържание |
|---|---|
| `manifest.json` | Описанието: данни за сайта, компоненти, файлове с размери и SHA-256 контролни суми, веригата, изтритите пътища, режимът на шифроване и подписът. Записва се (и се качва) последен. |
| `{id}.database.sql.gz` | Дъмпът на базата данни (`.enc`, когато е шифрован). |
| `{id}.files.{n}.tar.gz` | Части на файловия архив, n = 1, 2, … (`.enc`, когато са шифровани). |
| `{id}.index.gz` | Файловият индекс: по един JSON ред за всеки файл от пълния набор файлове, с размер, време на промяна и резервното копие, което съдържа текущата му версия (`.enc`, когато е шифрован). |
| `installer.json` | Само за миграционни пакети: bcrypt хешът на ключа на инсталатора. |

Подробности:

- Архивите са POSIX ustar файлове `.tar.gz`. Пътищата са относителни спрямо папката на WordPress (`wp-content/uploads/2026/10/photo.jpg`, `wp-admin/index.php`). wp-config.php се съхранява като `symelo-meta/wp-config.php` в част 1. Всяка част е самостоятелен архив.
- Дъмпът на базата данни е обикновен SQL в UTF-8, по една заявка на ред: `DROP TABLE IF EXISTS`, `CREATE TABLE`, след това заявки `INSERT`, с оригиналния префикс на таблиците. Двоичните стойности се записват в шестнадесетичен вид. Изгледите (views) нямат `DEFINER`. Последният ред е `-- symelo:complete`; дъмп без него е непълен.
- Файловете се записват като поредица от gzip членове, които стандартните инструменти четат като един `.gz` файл.
- Шифрованите файлове (`.enc`) започват със заглавката `SYMBKENC` и могат да бъдат отворени само от плъгина, неговия инструмент за възстановяване или инсталатора.
- `docs/architecture.md` в папката на плъгина описва подробно всеки формат.

**Ръчно отваряне на нешифровано резервно копие:**

```sh
# Files: extract every part. For an incremental backup, extract the full
# backup first, then each incremental backup in order (see "chain" in
# manifest.json), and delete the paths listed under files.deleted.
mkdir site && cd site
tar -xzf ../20261012-191500-full-a1b2c3.files.1.tar.gz

# The old wp-config.php
cat symelo-meta/wp-config.php

# Database: import the dump of the newest backup in the chain
gunzip -c ../20261012-191500-full-a1b2c3.database.sql.gz > database.sql
mysql -u dbuser -p dbname < database.sql

# File index
gunzip -c ../20261012-191500-full-a1b2c3.index.gz | head
```

Когато по този начин премествате сайта на друг адрес, след това заменете адресите, например с `wp search-replace`.

### Планирани задачи

| Hook | График | Предназначение |
|---|---|---|
| `symelo_backups_daily` | Ежедневно | Прилага всички правила за запазване; изтрива приключилите задачи и журналите, по-стари от 30 дни, временните файлове, по-стари от един ден, недовършените папки на резервни копия, по-стари от два дни, изоставените качвания на пакети, по-стари от седмица, и неизползваните инструменти за възстановяване; опреснява OAuth вписванията, които не са използвани 7 дни. |
| `symelo_backups_schedules` | На всеки 5 минути | Стартира графиците, чийто час е настъпил. |
| `symelo_backups_runner` | Всяка минута, само докато има задачи в опашката или в изпълнение | Резервен механизъм, който поддържа фоновите задачи в движение. |
| `symelo_backups_runner_next` | Еднократно | Продължава задача след пауза (скорост Gentle, натоварен сървър или място за съхранение, което е поискало повторен опит по-късно). |

Всички те се премахват при деактивиране.
