1. Что подготовить до переноса
Перенос сайта — плановая операция. Если сделать всё заранее, DNS-переключение занимает пару минут, а сайт недоступен не более часа (обычно меньше).
Что нужно заранее
- • VPS с Ubuntu 22.04, доступ по SSH
- • Доступ к панели управления хостингом (cPanel, ISPmanager, Plesk)
- • Доступ к DNS-записям домена (у регистратора или в панели хостинга)
- • FTP/SFTP доступ к файлам сайта
- • Данные подключения к БД (логин, пароль, имя БД)
До смены DNS
- • Понизьте TTL у A-записи домена до 300 с (5 минут) — за 24–48 ч до переезда
- • Запишите все DNS-записи (MX, TXT, CNAME) — они понадобятся
- • Убедитесь что VPS уже полностью настроен и сайт открывается по IP
- • Сделайте финальный бэкап непосредственно перед DNS-переключением
Стратегия: сначала настраиваем VPS, потом меняем DNS
Пока DNS указывает на старый хостинг, сайт работает в штатном режиме. VPS настраивается параллельно — без спешки. Переключаем DNS только когда всё проверено. Это позволяет провести перенос без даунтайма.
2. Экспорт файлов сайта
Нужно скачать все файлы сайта: PHP-скрипты, изображения, темы, плагины, загруженные пользователями файлы. Обычно это директория public_html или www.
Вариант A — через панель хостинга (проще)
В cPanel: File Manager → выделить всю папку public_html → Compress → скачать ZIP. В ISPmanager/Plesk аналогично. Архив удобно скачать одним файлом и потом распаковать на VPS.
Вариант B — через SSH на хостинге (быстрее)
Если хостинг даёт SSH — заархивируйте прямо там и передайте сразу на VPS, минуя локальный компьютер:
# Зайти на хостинг по SSH
ssh user@shared-hosting.ru
# Архивировать public_html
cd ~
tar -czf site_backup.tar.gz public_html/
# Узнать IP VPS (понадобится для rsync)
# Проверить размер архива
ls -lh site_backup.tar.gz# Запустить с хостинга — скопировать архив на VPS
scp site_backup.tar.gz root@ВАШ_VPS_IP:/tmp/
# Или rsync (если большой архив — rsync надёжнее)
rsync -avz site_backup.tar.gz root@ВАШ_VPS_IP:/tmp/Вариант C — через FTP
Если SSH нет, используйте FileZilla или WinSCP: скачайте файлы на локальный компьютер, затем загрузите на VPS. Для больших сайтов (сотни МБ медиафайлов) это медленнее, но работает.
Для WordPress
Самые тяжёлые папки — wp-content/uploads/ (медиафайлы) и wp-content/plugins/. Если сайт большой, плагины можно не переносить — они переустанавливаются из репозитория. Uploads — обязательно.
3. Экспорт базы данных
База данных — самая важная часть. Файлы сайта можно перекачать заново, данные — нет.
Через phpMyAdmin (в панели хостинга)
Войдите в phpMyAdmin через панель хостинга → выберите базу данных → вкладка Экспорт → метод Быстрый, формат SQL → кнопка Экспортировать. Скачается файл dbname.sql.
Для больших баз данных (более 100 МБ)
phpMyAdmin может завершиться по таймауту. Лучше использовать mysqldump через SSH или попросить хостинг-провайдера предоставить дамп напрямую.
Через SSH на хостинге
# Узнать данные БД из wp-config.php (для WordPress)
grep -E "DB_(NAME|USER|PASSWORD|HOST)" ~/public_html/wp-config.php
# Создать дамп
mysqldump -u DB_USER -pDB_PASSWORD DB_NAME > ~/db_backup.sql
# Проверить размер
ls -lh ~/db_backup.sql
# Упаковать (для скорости передачи)
gzip ~/db_backup.sqlscp ~/db_backup.sql.gz root@ВАШ_VPS_IP:/tmp/Совет: финальный бэкап перед DNS-переключением
За несколько минут до смены DNS сделайте ещё один дамп БД — именно его загружайте на VPS последним. Так вы не потеряете новые записи, комментарии и заказы, появившиеся пока вы настраивали VPS.
4. Настройка VPS: Nginx + PHP + MySQL
Установим стек для WordPress и большинства PHP-сайтов. Если ваш сайт на другой технологии — смотрите блок ниже.
ssh root@ВАШ_VPS_IP
apt update && apt upgrade -yNginx
apt install nginx -y
systemctl enable --now nginx
# Проверить — должен открываться в браузере по IP
curl -I http://ВАШ_VPS_IPPHP 8.3
apt install software-properties-common -y
add-apt-repository ppa:ondrej/php -y
apt update
apt install php8.3-fpm php8.3-mysql php8.3-curl php8.3-gd php8.3-mbstring php8.3-xml php8.3-zip php8.3-intl php8.3-bcmath php8.3-imagick -y
# Проверить версию
php -vMySQL 8.0
apt install mysql-server -y
systemctl enable --now mysql
# Базовая защита (задайте пароль root и ответьте Y на все вопросы)
mysql_secure_installationmysql -u root -p
-- Внутри MySQL:
CREATE DATABASE site_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'site_user'@'localhost' IDENTIFIED BY 'СЛОЖНЫЙ_ПАРОЛЬ';
GRANT ALL PRIVILEGES ON site_db.* TO 'site_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;Nginx: конфиг виртуального хоста
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.php index.html;
# WordPress — красивые URL
location / {
try_files $uri $uri/ /index.php?$args;
}
# Передать PHP на обработку PHP-FPM
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# Скрыть .htaccess и прочие скрытые файлы
location ~ /\. {
deny all;
}
# Кэшировать статику
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
client_max_body_size 64M;
}ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginxЕсли сайт не на WordPress
Laravel/Bitrix/OpenCart — тот же стек, но в root указывайте папку public/ (Laravel) или корень сайта. Статический сайт — Nginx без PHP. Python — Nginx как прокси перед Gunicorn/Uvicorn. Node.js — Nginx как прокси перед PM2/Node.
5. Загрузка файлов и базы на VPS
Разместить файлы сайта
# Создать директорию для сайта
mkdir -p /var/www/example.com
# Распаковать архив (если передавали tar.gz)
tar -xzf /tmp/site_backup.tar.gz -C /var/www/example.com --strip-components=1
# Или если скачивали zip
apt install unzip -y
unzip /tmp/site_backup.zip -d /var/www/example.com
# Проверить структуру
ls /var/www/example.com# Владелец — www-data (пользователь Nginx/PHP-FPM)
chown -R www-data:www-data /var/www/example.com
# Права: 755 для директорий, 644 для файлов
find /var/www/example.com -type d -exec chmod 755 {} ;
find /var/www/example.com -type f -exec chmod 644 {} ;Импортировать базу данных
# Если дамп был сжат gzip
gunzip /tmp/db_backup.sql.gz
# Импортировать
mysql -u site_user -p site_db < /tmp/db_backup.sql
# Проверить — посчитать таблицы
mysql -u site_user -p -e "USE site_db; SHOW TABLES;" | wc -lОбновить wp-config.php
На старом хостинге в wp-config.php были данные его базы данных. Теперь нужно указать данные новой БД на VPS.
/** Имя базы данных */
define( 'DB_NAME', 'site_db' );
/** Пользователь базы данных */
define( 'DB_USER', 'site_user' );
/** Пароль пользователя базы данных */
define( 'DB_PASSWORD', 'СЛОЖНЫЙ_ПАРОЛЬ' );
/** Адрес сервера базы данных */
define( 'DB_HOST', 'localhost' );Проверить сайт по IP (до смены DNS)
Добавьте запись в файл hosts на своём компьютере и откройте сайт в браузере:
# Добавить строку (заменить IP и домен)
1.2.3.4 example.com www.example.comОткройте example.com в браузере — должен открыться сайт с VPS. Проверьте: главная страница, внутренние ссылки, форма входа в админку, загрузка медиафайлов. Если всё работает — можно переключать DNS.
Не забудьте убрать запись из hosts после переноса
После смены DNS удалите строку из hosts — иначе браузер будет принудительно открывать сайт по старому IP даже после переноса.
6. Смена DNS и SSL
Сменить A-запись домена
Войдите в панель регистратора (или куда делегирован домен) и обновите A-запись:
| Запись | Тип | Значение | TTL |
|---|---|---|---|
| @ | A | IP адрес VPS | 300 с |
| www | A | IP адрес VPS | 300 с |
| @ | MX | Ваш почтовый сервер | 300 с |
# Спросить DNS напрямую у публичного резолвера
dig @8.8.8.8 example.com A +short
# Или через nslookup
nslookup example.com 8.8.8.8
# Должен вернуть IP вашего VPSПолучить SSL-сертификат
После того как DNS обновился (IP домена стал указывать на VPS):
apt install certbot python3-certbot-nginx -y
# Получить сертификат и автоматически настроить Nginx
certbot --nginx -d example.com -d www.example.com
# Проверить автообновление (должно быть без ошибок)
certbot renew --dry-runCertbot сам добавит блок с HTTPS в конфиг Nginx и настроит редирект с HTTP. Сертификат автоматически обновляется раз в 60 дней.
Сайт на WordPress: обновить URL в БД
Если на старом хостинге был HTTP, а теперь HTTPS — обновите адрес сайта в БД:
mysql -u site_user -p site_db -e "
UPDATE wp_options
SET option_value = 'https://example.com'
WHERE option_name IN ('siteurl', 'home');"7. Проверка после переезда
Когда DNS переключился и сертификат получен — пройдитесь по чеклисту:
Открывается ли сайт по HTTPS
Браузер должен показывать замок. Не должно быть предупреждения о сертификате. Проверьте оба варианта: example.com и www.example.com.
Редирект с HTTP на HTTPS
Откройте http://example.com — должен автоматически перенаправить на https://. Certbot настраивает это автоматически.
Работают ли внутренние страницы
Пройдитесь по нескольким страницам сайта. Для WordPress: главная, архив, отдельная запись, страница, категория.
Загружаются ли изображения
Откройте страницу с медиафайлами. Если картинки не грузятся — проверьте права на папку wp-content/uploads/ (chown www-data:www-data).
WordPress: войти в админку
/wp-admin/ должен открываться. Проверьте, что плагины активны, настройки на месте, медиабиблиотека доступна.
Нет ли mixed content
Если часть ресурсов (картинки, скрипты) грузится по HTTP — браузер покажет предупреждение. Для WordPress установите плагин Really Simple SSL или вручную обновите URL в БД.
Диагностика проблем
# Логи Nginx
tail -f /var/log/nginx/error.log
tail -f /var/log/nginx/access.log
# Логи PHP-FPM
tail -f /var/log/php8.3-fpm.log
# Проверить права на файлы (всё должно быть www-data)
ls -la /var/www/example.com/
# Проверить статус сервисов
systemctl status nginx php8.3-fpm mysql# В wp-config.php добавить перед строкой "/* That's all, stop editing! */"
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true ); # сохранять в wp-content/debug.log
define( 'WP_DEBUG_DISPLAY', false ); # не показывать ошибки на сайте
# Смотреть лог
tail -f /var/www/example.com/wp-content/debug.logКогда всё работает — отключить хостинг
Не спешите сразу отказываться от старого хостинга. Подождите 1–2 недели — убедитесь, что всё стабильно работает на VPS, нет скрытых проблем с редкими страницами. После этого спокойно отменяйте подписку.