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

Если вы занимаетесь администрированием сайта или его разработкой, то наверняка понимаете, что применять все нововведения на работающем сайте, плохая практика.

Чтобы непроверенные изменения не навредили сайту, их лучше сначала проверить на отдельной копии – песочнице.

Простой и бесплатный способ сделать такую песочницу – развернуть ее на своем рабочем компьютере. В этой статье я расскажу, как сделать локальную копию сайта.

Основные шаги

Что такое локальная копия сайта? Локальная копия сайта — это его точная копия, которая хранится у вас на компьютере или в локальной сети. Это удобно для тестирования изменений, не рискуя повредить оригинальный сайт.

Оригинальный сайт у нас работает на сервере с ОС CentOS Stream 9. Наверняка у большинства читателей домашняя ОС – Windows, а значит надо иметь возможность как то использовать вторую систему.

Подготовить виртуальную машину

Решение довольно простое – использовать виртуальную машину. Используйте специальную программу для создания виртуальных окружений VirtualBox. С ее помощью можно создать отдельный, виртуальный сервер со своей операционной системой.

Подробно о том, как установить VirtualBox, создать виртуальную машину и установить CentOS Stream 9 на виртуальную машину описано в отдельной статье.

Подготовить окружение на виртуальном сервере

После того, как у нас появился локальный сервер, на нем нужно воспроизвести тот же набор сервисов, что и на оригинале. Наш веб сервер используется стек LEMP, значит, нам нужно установить на виртуальный сервер NGINX, MariaDB, PHP.

Все шаги по установке стека LEMP на CentOS Stream 9 подробно разобраны в отдельной статье.
Обязательно загляните в нее, если забыли, с чего мы начинали.

После установки MariaDB не забудьте создать на локальном сервере такую же базу и пользователя, с которыми работает ваш сайт.

В нашем случае это база данных waky_db и пользователь, которому разрешен доступ к этой базе waky_user. Пароль от пользователя сделайте такой же, как и на основном сайте. Это позволит избежать редактирования файла конфигурации сайта, после переноса.

Детально процесс создания базы и пользователя рассмотрен в статье посвященной установки CMS на сервер.

Перенос данных

У нас готов виртуальный сервер, на нем установлен веб сервер, осталось только перенести с основного сервера базу и файлы сайта.

Подготовим бэкап базы данных на основном сервере:

[root@waky ~]# mariadb-dump --single-transaction --skip-lock-tables waky_db > /usr/share/nginx/waky_db.sql
[root@waky ~]# gzip /usr/share/nginx/waky_db.sql
[root@waky ~]#  ll /usr/share/nginx/waky_db.sql.gz
-rw-r--r-- 1 root root 414488 Jul  9 09:48 /usr/share/nginx/waky_db.sql.gz
[root@waky ~]#

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

На основном сервере:
архив с базой – /usr/share/nginx/waky_db.sql.gz
файлы сайта – /usr/share/nginx/waky.ru

Копируем их на локальный сервер:

[root@localhost ~]# rsync -av root@waky.ru:/usr/share/nginx/waky_db.sql.gz /usr/share/nginx/
receiving incremental file list
waky_db.sql.gz
sent 43 bytes  received 414.690 bytes  165.893,20 bytes/sec
total size is 414.488  speedup is 1,00
[root@localhost ~]# rsync -a root@waky.ru:/usr/share/nginx/waky.ru /usr/share/nginx/
-[root@localhost ~]#

В команде rsync сначала указывается источник, откуда копируются файлы, в нашем случае это удаленный сервер, а в конце место назначения, у нас это локальная директория.

Разархивируем и зальем дамп базы сайта в локальную базу данных:

[root@localhost ~]# gunzip /usr/share/nginx/waky_db.sql.gz
[root@localhost ~]# mariadb waky_db < /usr/share/nginx/waky_db.sql
[root@localhost ~]#

Остаточная настройка

Осталось внести небольшие правки в дефолтные настройки NGINX, откройте в текстовом редакторе файл основной конфигурации:

[root@localhost ~]# vi /etc/nginx/nginx.conf

И приведите секцию server к следующему виду:

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/waky.ru;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        index index.php index.html;
        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;
       }
    }

В root указываем путь до директории в которую мы скопировали файлы сайта /usr/share/nginx/waky.ru

Добавляем index чтобы определить основной файл.

Добавляем location для обработки php файлов.

Секцию сервера для 443 мы не трогаем, так как не будем использовать протокол https на локальном сервере.

Перезапустим NGINX чтобы изменения вступили в силу:

[root@localhost ~]# nginx -s reload

Если в самой CMS сайта жестко задан адрес сайта, это надо поправить. Например для WordPress адрес указан в базе:

[root@localhost ~]# mariadb
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 19
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)]> use 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 [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       |
+-----------+-------------+-----------------+----------+
2 rows in set (0,001 sec)

Поменяем доменное имя на IP адрес нашего виртуального сервера:

MariaDB [waky_db]> UPDATE wp_options SET option_value='http://192.168.0.105'  WHERE option_value='https://waky.ru';
Query OK, 2 rows affected (0,002 sec)
Rows matched: 2  Changed: 2  Warnings: 0

Чтобы узнать IP адрес локального сервера можно воспользоваться командой ip a:

[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:4f:76:6e brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.105/24 brd 192.168.0.255 scope global dynamic noprefixroute enp0s3
       valid_lft 4362sec preferred_lft 4362sec
    inet6 fe80::a00:27ff:fe4f:766e/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
[root@localhost ~]#

Первым идет адрес, используемый для указания хоста на самого себя, он для всех 127.0.0.1 Нас интересует второй адрес, IP полученный в сети, у меня это 192.168.0.105

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

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

Откроем в браузере на нашем компьютере ссылку вида ‘http://192.168.0.105’

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

Заключение

Потратив немного времени сейчас, на создание локальной песочнице, вы сэкономите много времени и нервов, которые не придется тратить на починку основного сайта.

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