Перехід із загального хостингу (shared) на віртуальний виділений сервер (VDS/VPS) — це закономірний крок, коли сайт переростає ресурсні обмеження. VDS дає повний root-доступ, незалежні ресурси CPU/RAM і можливість тонкого налаштування під ваші потреби.
Коли пора переїжджати з shared на VDS
| Симптом | Причина | Рішення |
|---|---|---|
| Сайт гальмує в години пік | Конкуренція за ресурси із сусідами | VDS з виділеними ресурсами |
| Помилки 503 / перевищення лімітів | CPU/RAM квоти shared | VDS без обмежень хостера |
| Не можна встановити потрібний PHP/Python | Shared контролює середовище | Повний root на VDS |
| Потрібен cron щохвилини | Shared забороняє часті завдання | Будь-який cron на VDS |
| Кілька проєктів | Додаткові сайти коштують дорого | Необмежена кількість сайтів на VDS |
Підготовка VDS перед міграцією
# Оновити систему (Ubuntu/Debian)
apt update && apt upgrade -y
# Встановити веб-стек
apt install nginx php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl php8.3-zip mariadb-server -y
# Запустити сервіси
systemctl enable --now nginx php8.3-fpm mariadb
Крок 1: Створення резервної копії на shared-хостингу
# Через cPanel: Backup Wizard → Full Backup
# Або вручну через SSH (якщо доступний)
tar -czf ~/backup-site.tar.gz ~/public_html/
mysqldump -u dbuser -p dbname > ~/backup-db.sql
Крок 2: Перенесення файлів на VDS
># Завантажити архів з shared на локальний ПК, потім залити на VDS
scp backup-site.tar.gz root@YOUR-VDS-IP:/var/www/
# Або напряму з shared на VDS через rsync
rsync -avz --progress user@shared-host:~/public_html/ root@YOUR-VDS-IP:/var/www/example.com/
# Розпакувати
cd /var/www/
tar -xzf backup-site.tar.gz
Крок 3: Відновлення бази даних
# Створити БД і користувача
mysql -u root -p <<'SQL'
CREATE DATABASE mysite CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'StrongPass123';
GRANT ALL ON mysite.* TO 'myuser'@'localhost';
FLUSH PRIVILEGES;
SQL
# Імпортувати дамп
mysql -u myuser -p mysite < backup-db.sql
Крок 4: Налаштування Nginx
# /etc/nginx/sites-available/example.com
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
Крок 5: Тестування до зміни DNS
># Додати в /etc/hosts на вашому ПК для тесту
YOUR-VDS-IP example.com www.example.com
# Перевірити сайт у браузері без зміни DNS
# Після успішного тесту — повернути hosts і змінити DNS
Крок 6: Зміна DNS без простою
Змінюйте DNS-записи лише після успішного тестування сайту на VDS:
- Знизьте TTL A-запису до 300 секунд за 24 години до міграції
- Переконайтеся, що сайт працює на VDS (через /etc/hosts)
- Оновіть A-запис на IP вашого VDS
- Дочекайтеся поширення DNS (5–30 хвилин при TTL 300)
- Тримайте старий хостинг активним ще 48 годин як запасний варіант
Нульовий простій: При правильному зниженні TTL і тестуванні через /etc/hosts перемикання DNS відбувається непомітно для користувачів — сайт доступний увесь час.
Оновіть конфіг застосунку! Після перенесення оновіть
wp-config.php (WordPress), .env або інші конфіги з новими даними БД. Старі credentials від shared-хостингу працювати не будуть.
Навіщо переходити з shared на VDS
Shared-хостинг обмежує ресурси CPU/RAM, забороняє запуск фонових процесів і не дозволяє тонке налаштування PHP/MySQL. VDS дає повний контроль.
💡 Ознаки того, що пора на VDS: сайт падає в години пік, потрібні cron-завдання щохвилини, потрібен PHP 8.2+ або Redis.
Крок 1: Бекап через cPanel
cPanel → Backup Wizard → Full Backup. Завантажте архів (.tar.gz) із сервера.
Крок 2: Встановлення стеку на VDS
apt update && apt install -y nginx mysql-server php8.2-fpm php8.2-mysql php8.2-gd php8.2-xml php8.2-mbstring php8.2-curl php8.2-zip
systemctl enable --now nginx mysql php8.2-fpm
Крок 3: Імпорт бази даних
mysql -u root -p -e "CREATE DATABASE mydb CHARACTER SET utf8mb4;"
mysql -u root -p -e "CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'pass';"
mysql -u root -p -e "GRANT ALL ON mydb.* TO 'myuser'@'localhost';"
mysql -u root -p mydb < backup.sql
Крок 4: Налаштування Nginx + PHP-FPM
server {
listen 80;
server_name mysite.com www.mysite.com;
root /var/www/mysite;
index index.php index.html;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Чекліст перед перемиканням DNS
| Перевірка | Команда |
|---|---|
| Сайт відкривається за IP | curl http://NEW_IP |
| PHP працює | php -r "echo phpinfo();" | head |
| MySQL доступна | mysql -u myuser -p mydb -e "SHOW TABLES;" |
| SSL налаштовано | certbot --nginx -d mysite.com |
⚠️ Знизьте TTL DNS-запису до 300 секунд за 24 години до перенесення — це прискорить поширення після зміни A-запису.