Как сделать копию сайта на WordPress.

Когда ваш сайт начинает активно работать и принимать посетителей, применять на живом сайте все нововведения, будь то новые модули или плагины, новый шаблон или апдейт версии движка, становится неудобно. Если что-то пойдет не по плану, можно положить сайт, или нарушить его функционал.

При пустом сайте проблема не велика, но если реальные пользователи наткнуться на неработающий сайт они испытают негативный опыт, и в следующий раз могут пренебречь вашим сайтом. Поэтому для тестирования всех мало-мальски значимых изменений нужно иметь резервную копию сайта.

На данном этапе у нас есть сайт с установленным вордпрессом. Давайте разберем, как сделать копию сайта на WordPress. Ее мы сможем использовать для нужд разработки и тестирования. В целом, то, как создать копию сайта имеет много общего с процессом бэкапирования. Единственное, для начала нам нужно подготовить домен для копии.

Отправляемся в наш DNS сервис, в нашем случае это Cloudflare, и добавляем новый поддомен. Так как копия сайта будет находиться на том же хосте, что и живой сайт, и будет иметь тот же IP, я использую запись типа CNAME для присвоения адреса. Хотя можно задать IP и стандартной A записью.

Теперь заходим на хост и делаем новый файл конфига NGINX, для нового сабдомена. Для этого скопируем уже имеющийся и внесем правки.

[root@waky ~]# cp -a /etc/nginx/conf.d/waky.ru.conf /etc/nginx/conf.d/dev.waky.ru.conf
[root@waky ~]# vi /etc/nginx/conf.d/dev.waky.ru.conf

Меняем доменное имя в server_name и root, а так же заменим все блоки с Basic Auth на общий запрет, чтобы закрыть всю дев копию от доступа посторонних. В итоге получим следующие настройки:

server {
listen      80;
listen      [::]:80;
server_name dev.waky.ru;
root /usr/share/nginx/dev.waky.ru;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
# Settings for a TLS enabled server.
#
server {
listen      443 ssl http2;
listen      [::]:443 ssl http2;
server_name dev.waky.ru;
root /usr/share/nginx/dev.waky.ru;
index index.php;
ssl_certificate "/etc/letsencrypt/live/waky.ru/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/waky.ru/privkey.pem";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout  10m;
ssl_ciphers PROFILE=SYSTEM;
ssl_prefer_server_ciphers on;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
auth_basic          "Restricted area";
auth_basic_user_file /usr/share/nginx/.htpasswd;
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
location / {
try_files $uri $uri/ /index.php?$args;
index index.php;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}

Сохраняем изменения, проверяем настройки и перезапускаем NGINX:

[root@waky ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@waky ~]# nginx -s reload

Теперь скопируем файлы и базу данных. Но для начала нужно создать новую пару база и пользователь для нашей копии. Все как мы делали для основного сайта. Заходим в консоль mariadb и выполняем следующие команды:

[root@waky ~]# mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 10.5.27-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> CREATE DATABASE dev_waky_db;
Query OK, 1 row affected (0.012 sec)

MariaDB [(none)]> CREATE USER 'dev_waky_user'@'localhost' IDENTIFIED BY 'КакоЙНИбуДьПароЛь';
Query OK, 0 rows affected (0.059 sec)

MariaDB [(none)]> GRANT ALL ON dev_waky_db.* TO 'dev_waky_user'@'localhost';
Query OK, 0 rows affected (0.011 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.010 sec)

MariaDB [(none)]> exit
Bye
[root@waky ~]#

Теперь делаем бэкап базы текущего сайта и заливаем его в базу дев сайта:

[root@waky ~]# mariadb-dump --single-transaction waky_db > waky_db.sql
[root@waky ~]# mariadb dev_waky_db< waky_db.sql

Поправим главную ссылку нашей копии, возвращаемся в консоль mariadb:

MariaDB [(none)]> USE dev_waky_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

MariaDB [dev_waky_db]> SELECT * FROM wp_options WHERE option_value='https://waky.ru';
+-----------+-------------------+-----------------+----------+
| option_id | option_name      | option_value    | autoload |
+-----------+-------------------+-----------------+----------+
|        2 | siteurl          | https://waky.ru | on      |
|        3 | home              | https://waky.ru | on      |
|      209 | niteoCS_logo_link | https://waky.ru | auto    |
+-----------+-------------------+-----------------+----------+
3 rows in set (0.003 sec)

MariaDB [dev_waky_db]> UPDATE wp_options SET option_value='https://dev.waky.ru'  WHERE option_value='https://waky.ru';
Query OK, 3 rows affected (0.006 sec)
Rows matched: 3  Changed: 3  Warnings: 0

С базой закончили, осталось скопировать файлы, и поправить конфиг файл вордпресса:

[root@waky ~]# cp -a /usr/share/nginx/waky.ru/ /usr/share/nginx/dev.waky.ru/
[root@waky ~]# vi /usr/share/nginx/dev.waky.ru/wp-config.php

Меняем следующие строки, заменяя базу, пользователя и пароль от живого сайта на новые:
define( 'DB_NAME', 'dev_waky_db' );
define( 'DB_USER', 'dev_waky_user' );
define( 'DB_PASSWORD', 'КакоЙНИбуДьПароЛь' );

Выпустим бесплатный SSL сертификат для нашего поддомена:

[root@waky ~]# certbot certonly -v --webroot -w /usr/share/nginx/dev.waky.ru/ -d dev.waky.ru

Теперь поправим путь к файлам сертификата в NGINX:
vi /etc/nginx/conf.d/dev.waky.ru.conf
и меняем доменное имя в следующих строках:
ssl_certificate "/etc/letsencrypt/live/dev.waky.ru/fullchain.pem";
ssl_certificate_key "/etc/letsencrypt/live/dev.waky.ru/privkey.pem";

Еще раз перезагрузим NGINX:
nginx -s reload

Наша резервная копия сайта WordPress доступна по адресу https://dev.waky.ru/ и закрыта от посторонних глаз. Вводим пароль от Basic Auth и видим, что у нас получилась точная копия сайта вордпресс.