Staging для WordPress на VDS — это отдельное окружение, максимально похожее на продакшн, но изолированное от живого трафика. Вы можете обновлять плагины, ядро, менять тему, править код, тестировать миграции БД и только после этого выкатывать изменения на боевой сайт.
На уровне VDS staging — почти всегда просто ещё один виртуальный хост (vhost) и отдельная база данных, плюс понятная схема синхронизации. В этой статье разберём, как спроектировать staging для WordPress, какие типичные ошибки допускают и как автоматизировать работу с помощью wp-cli.
Зачем вообще нужен WordPress staging на VDS
Если вы админ или девопс, вы наверняка уже сталкивались с ситуацией, когда «невинное» обновление плагина кладёт сайт: PHP-fatal, белый экран, битая вёрстка. На шаред-хостинге staging часто организуют как поддомен, но на VDS у нас больше свободы — и больше ответственности.
Нормально спроектированный staging-стек даёт:
- Безопасные обновления ядра, тем и плагинов.
- Тестирование новых фич и A/B-изменений до выката в прод.
- Отработку миграций БД (особенно для крупных сайтов и интернет-магазинов).
- Возможность отката: вы знаете, как вернуться к предыдущему состоянию.
- Удобную песочницу для подрядчиков и разработчиков.
На VDS staging ещё помогает «прощупать» производительность: тесты кэша, object cache (Redis/Memcached), PHP-FPM, Nginx, сложных запросов к базе — в условиях, близких к боевым. Если параллельно хотите подтюнить время отклика, посмотрите статью о том, как ускорять WordPress с кэшем и CDN на шаред-хостинге: оптимизация скорости WordPress на шаред-хостинге с CDN и кэшем.
Базовая модель: прод и staging на одном VDS
Для большинства небольших и средних проектов staging для WordPress живёт на том же VDS, что и прод. Типичная схема:
- Прод: домен example.com.
- Staging: поддомен staging.example.com (или stage.example.com).
- Две базы: к примеру,
wp_prodиwp_stage. - Отдельные каталоги сайта:
/var/www/example.comи/var/www/staging.example.com.
Можно использовать и другую структуру директорий, главное — чтобы она была предсказуемой и понятной любому администратору, который придёт после вас.
Типовая структура директорий
Удобно разделять «код» и «данные» (uploads, кеши, временные файлы). Пример:
/var/www/example.com
releases/
2025-01-15-120000/
wp-core/ # ядро WordPress
wp-content/ # темы, плагины, uploads (либо часть через symlink)
current/ # symlink на текущий релиз
shared/
uploads/
cache/
/var/www/staging.example.com
releases/
current/
shared/
Так проще делать атомарные выкладки и откат: staging может использовать ту же модель deployment, что и прод, просто на другой базе и домене.

Разнесение баз данных и конфигов
Ключевое правило: staging никогда не должен писать в боевую базу и боевой wp-content/uploads, если вы не предусмотрели это специально и осознанно.
Минимальный набор отличий между продом и staging:
- Разные базы MySQL/MariaDB.
- Разные домены (URL сайта).
- Отдельные учётные данные для доступа к базе.
- Отключённый или ограниченный доступ к поисковым роботам на staging.
Конфигурация wp-config.php для прод и staging
Удобно вынести общую часть конфигурации в файл, а окружение определять по хосту или переменной окружения. Например:
// wp-config.base.php
define('WP_DEBUG', false);
// Общие настройки, salts, table_prefix и т.д.
// wp-config.php
require __DIR__ . '/wp-config.base.php';
$host = $_SERVER['HTTP_HOST'] ?? '';
if ($host === 'staging.example.com') {
define('DB_NAME', 'wp_stage');
define('DB_USER', 'wp_stage');
define('DB_PASSWORD', '***');
define('WP_HOME', 'https://staging.example.com');
define('WP_SITEURL', 'https://staging.example.com');
define('WP_ENV', 'staging');
} else {
define('DB_NAME', 'wp_prod');
define('DB_USER', 'wp_prod');
define('DB_PASSWORD', '***');
define('WP_HOME', 'https://example.com');
define('WP_SITEURL', 'https://example.com');
define('WP_ENV', 'production');
}
Так вы храните единую кодовую базу, но параметры окружения разносите логически. Альтернатива — отдельные wp-config.php для прод и staging с включением общих настроек.
Подготовка staging: копирование продакшна
Чаще всего staging-окружение создаётся как клон продакшна с последующим упрощением (обрезка данных, отключение интеграций, рассылок). Сценарий в общих чертах:
- Создать поддомен и vhost на веб-сервере.
- Скопировать файлы WordPress с продакшна на staging.
- Создать новую базу и пользователя.
- Сделать дамп боевой базы и развернуть его для staging.
- Использовать wp-cli для смены URL и дополнительных настроек.
Копирование файлов
На VDS копировать файлы проще всего через rsync локально:
rsync -a /var/www/example.com/current/ /var/www/staging.example.com/current/
Обратите внимание, что -a сохранит права и символические ссылки. Если у вас atomic deploy через releases/current, можно скопировать только текущий релиз или вообще переиспользовать кодовую базу и развести только wp-config.php и uploads.
Копирование базы данных
Предположим, база продакшна — wp_prod, staging — wp_stage. Команды могут выглядеть так:
mysqldump -u root -p wp_prod > /root/wp_prod_$(date +%F).sql
mysql -u root -p -e "CREATE DATABASE wp_stage CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -u root -p wp_stage < /root/wp_prod_$(date +%F).sql
После этого в staging уже есть полная копия данных. Осталось сменить URL и дополнительные настройки.
wp-cli как основной инструмент для staging
wp-cli — обязательный инструмент, если вы серьёзно относитесь к управлению WordPress на VDS. С его помощью мы меняем URL, обновляем плагины и ядро, чистим кэш, выполняем миграции.
Подключение wp-cli к staging
На staging-каталоге достаточно иметь один wp-cli.phar или установленный пакет wp-cli. Для начала убедимся, что всё работает:
cd /var/www/staging.example.com/current
wp core version
Если команда возвращает версию и не ругается на доступ к БД — конфигурация окружения корректна.
Смена URL сайта после копирования БД
После развёртывания копии боевой базы нужно поменять home и siteurl, а также URL внутри контента. С wp-cli это делается так:
cd /var/www/staging.example.com/current
wp option update siteurl 'https://staging.example.com'
wp option update home 'https://staging.example.com'
wp search-replace 'https://example.com' 'https://staging.example.com' --skip-columns=guid --all-tables
Флаг --skip-columns=guid обычно обязателен, чтобы не портить GUID у записей. Для сложных случаев (смешанный HTTP/HTTPS, www/без www) стоит сначала сделать dry-run:
wp search-replace 'http://example.com' 'https://staging.example.com' --skip-columns=guid --all-tables --dry-run
Защита staging: пароли и запрет индексации
Staging редко должен быть публичным. Частые риски:
- Дубли контента в поиске (SEO-хаос).
- Тестовые данные и отладочная информация в открытом доступе.
- Риск, что кто-то случайно начнёт использовать staging как «боевой».
Минимум, который стоит сделать:
- Включить
discourage_search_engines. - Добавить базовую HTTP-авторизацию на уровне веб-сервера.
Отключаем индексацию через wp-cli
На staging-сайте выполняем:
cd /var/www/staging.example.com/current
wp option update blog_public 0
Это включает опцию «Не позволять поисковым системам индексировать этот сайт».
Синхронизация прод → staging: как не сломать боевой сайт
Staging — живой организм. Его нужно регулярно обновлять, чтобы он оставался похожим на прод. Но важно не перепутать направления синхронизации и не затереть боевые данные.
Чаще всего нужно:
- Периодически обновлять базу staging свежим дампом продакшна.
- Копировать новые загруженные файлы (uploads).
- Оставлять на staging специфические настройки (отключённые оплаты, другие API-ключи и т. п.).
Безопасный rsync для uploads
На маленьких сайтах можно просто периодически копировать wp-content/uploads с продакшна на staging:
rsync -a --delete /var/www/example.com/current/wp-content/uploads/ /var/www/staging.example.com/current/wp-content/uploads/
Параметр --delete заставляет staging выглядеть ровно как прод. Если вы хотите оставлять дополнительные тестовые файлы на staging, --delete лучше не использовать.
Главное: всегда очень чётко проверяйте порядок аргументов rsync, чтобы случайно не перетереть прод staging-данными.
Если на проекте активно используете object cache или храните сессии в Redis, пригодится статья про настройки Redis для PHP и кэша: использование Redis для сессий и объектного кэша в PHP.
Типичные сценарии использования staging
На практике staging для WordPress на VDS используют для повторяющихся задач. Разберём несколько типичных кейсов и связку с wp-cli.
1. Обновление плагинов и ядра
Сценарий:
- Сделать свежий клон продакшна на staging (файлы и БД).
- На staging обновить плагины, тему, ядро через wp-cli.
cd /var/www/staging.example.com/current
wp plugin update --all
wp theme update --all
wp core update
- Проверить сайт вручную и, при необходимости, прогнать автотесты.
- Если всё ок, повторить обновление на проде, желательно в maintenance-окно.
Если проект крупный, добавьте smoke-тесты (curl-чеки на ключевые URL, проверки HTTP-кодов, простые Selenium или Playwright-сценарии).
2. Тестирование новой темы или крупного плагина
Для новых тем и тяжёлых плагинов staging обязателен. Вы можете:
- Активировать новую тему только на staging.
- Менять настройки виджетов и меню.
- Создавать тестовый контент, который никогда не попадёт на прод.
wp-cli помогает быстро переключаться между темами:
cd /var/www/staging.example.com/current
wp theme activate newtheme
wp theme status
После финального утверждения вы переносите изменения конфигурации вручную или через миграции и экспорт настроек (зависит от темы или плагина).
3. Проверка миграций БД и кастомного кода
Если в проекте есть свой плагин или mu-функции, которые добавляют или изменяют таблицы, staging — единственное безопасное место, где можно «прокрутить» миграции.
Рекомендуется идти так:
- Создать отдельную ветку кода (Git) и задеплоить её только на staging.
- На staging выполнить миграции (через wp-cli или специально написанный PHP-скрипт).
- Проверить, что запросы к БД выполняются быстро, нет deadlock и долгих блокировок.
После успешных тестов тот же код разворачиваете на прод, строго соблюдая порядок: бэкапы БД, maintenance-окно (при необходимости), мониторинг.

Синхронизация staging → прод: когда это допустимо
Многие пытаются использовать staging как место, где вносят контент-изменения, а затем «сливают» их в прод. Для WordPress это редко бывает безопасным без специальной логики, потому что:
- Контент и настройки часто тесно переплетены.
- В продакшне продолжают появляться новые записи, комментарии, заказы.
- Конфликты данных тяжело разрешать автоматически.
Тем не менее есть допустимые случаи:
- Маленький сайт-визитка, где контент меняется редко.
- Первичное наполнение контентом перед запуском.
- Сайты без пользовательской активности и заказов.
Тогда workflow может выглядеть так:
- Staging = временный «редакционный» стенд.
- Контент утверждён — мигрируете на прод через экспорты, wp-cli или частичные дампы.
- После запуска staging снова превращается в тестовый стенд.
Для e-commerce и high-traffic проектов лучше считать staging исключительно техническим окружением для разработки и тестирования, а не для «долгой» редакционной работы.
Миграции и откат: как не бояться выкатываться
Staging имеет смысл только тогда, когда у вас есть понятный план выката и отката. Иначе вы просто добавляете ещё одну копию сайта, но не снижаете риски.
Минимальный план выката изменений с staging на прод может включать:
- Проверку, что staging и прод синхронизированы на момент начала (версии плагинов, ядра, схемы БД).
- Фиксацию текущей версии кода в Git (tag или commit).
- Бэкапы БД и важных директорий (минимум
wp-content). - Выполнение того же набора команд, что вы делали на staging, но уже на проде (по чек-листу).
- Быстрый rollback-план: какой дамп и какие файлы возвращаем, какими командами.
wp-cli и здесь помогает:
wp db export— быстрый бэкап перед миграцией.wp plugin updateиwp core update— воспроизведение тех же шагов, что были на staging.wp option getиwp option update— точечные изменения настроек.
Практические советы по эксплуатации staging на VDS
Собрать staging — это половина дела. Важно, чтобы им было удобно пользоваться и через полгода, и через год.
Отделяйте настройки окружения от кода
Храните переменные окружения (доступы к БД, API-ключи, режимы debug) отдельно от репозитория с кодом. Варианты:
.env-файл и обёртка надwp-config.php, читающая его.- Переменные окружения в unit-файле systemd или в конфиге
php-fpm.d.
Это упростит переключение между продом и staging и снизит вероятность того, что staging случайно начнёт писать в боевую БД.
Логируйте и мониторьте staging
Хотя staging и не обслуживает реальных пользователей, логи там особенно ценны:
- PHP-ошибки и предупреждения.
- Замедленные запросы к БД.
- Ошибки API-интеграций.
Пойманная на staging проблема почти всегда дешевле, чем баг в проде. Если у вас есть централизованное логирование (ELK, Loki и подобные стеки), подключите к нему и staging.
Не копируйте в staging реальные секреты без необходимости
После копирования БД имеет смысл заменить ключи платёжных систем, почтовых провайдеров, CRM и т. п. на тестовые. В идеале — держать эти значения в отдельной конфигурации окружения (wp-config или env), а не в БД.
Автоматизация: скрипты и CI для staging
Если вы часто обновляете staging, имеет смысл собрать набор скриптов или CI-пайплайн, который будет:
- Деплоить новый релиз кода на staging.
- Копировать свежие данные БД и uploads с продакшна.
- Запускать wp-cli-команды для смены URL, очистки кэша и миграций.
- Прогонять базовый набор тестов.
Даже простой bash-скрипт с набором команд rsync, mysqldump и wp уже сильно снизит риск «человеческого фактора» и сделает работу со staging для WordPress на VDS гораздо приятнее.
Выводы
Staging-окружение для WordPress на VDS — это не роскошь, а базовая гигиена для любых проектов, где недопустим внезапный даунтайм из-за обновления плагина или неудачного куска кода.
Ключевые элементы хорошего staging:
- Разделённые базы и понятная структура директорий.
- Единая, но параметризуемая конфигурация
wp-config.php. - Жёсткий контроль направления синхронизаций (прод → staging, а не наоборот).
- Широкое использование wp-cli для обновлений, миграций и автоматизации.
- Защита от индексации и ограничение доступа.
Как только такой стенд появится, обновлять WordPress, ставить плагины и выкатывать фичи станет проще и спокойнее — а риск сломать боевой сайт заметно снизится. Если вы только планируете переезд с шаред-хостинга или старт нового проекта, удобнее сразу взять мощный VDS под WordPress, спроектировать прод и staging одновременно и не возвращаться к этому вопросу в пожарном режиме.


