Перенос Laravel-проекта cybertools.cc с Hestia Control Panel на сервер с WordOps. Ниже рабочий порядок: бэкап, файлы, БД, Composer, Nginx/PHP, artisan-кэши, cron и закрытие .env. Пароли и IP в текст не выкладываем: везде плейсхолдеры.
1. Подготовка
Доступ
- Hestia: root или админ панели. Типичный путь сайта:
/home/<username>/web/cybertools.cc/public_html. - WordOps на новом сервере. Установка (Ubuntu):
wget -qO wo wops.cc && sudo bash wo
Ориентиры: от ~512 МБ RAM, место на диске, 64-bit Ubuntu/Debian в поддерживаемых ветках WordOps.
Бэкап на Hestia
v-backup-user <username>
Архив обычно лежит в /backup. Скачайте локально (SCP/SFTP) до любых экспериментов с DNS.
Стек на WordOps
wo stack install
Поднимаются Nginx, PHP, MySQL/MariaDB и зависимости. Для современного Laravel разумно целиться в PHP 8.2/8.3 (что поддерживает ваш код и WordOps на момент установки).
2. Файлы проекта
Архив с Hestia
tar -czf cybertools.tar.gz /home/<username>/web/cybertools.cc/public_html # scp cybertools.tar.gz на новый сервер
Сайт в WordOps
wo site create cybertools.cc --php
Корень: /var/www/cybertools.cc/htdocs. Nginx и PHP-пул WordOps создаёт сам; под Laravel document root должен смотреть на каталог с public/index.php (часто .../htdocs/public). Если у вас код разложен «плоско» как в Hestia public_html, сверьте структуру и при необходимости поправьте root в конфиге сайта.
Распаковка
cd /var/www/cybertools.cc/htdocs tar -xzf cybertools.tar.gz # если внутри public_html: mv public_html/* . rmdir public_html
Права
chown -R www-data:www-data /var/www/cybertools.cc/htdocs chmod -R 755 /var/www/cybertools.cc/htdocs chmod -R 775 /var/www/cybertools.cc/htdocs/storage chmod -R 775 /var/www/cybertools.cc/htdocs/bootstrap/cache chmod 640 /var/www/cybertools.cc/htdocs/.env chown www-data:www-data /var/www/cybertools.cc/htdocs/.env
3. База данных
Экспорт на Hestia
mysqldump -u <dbuser> -p cybertools_db > cybertools_db.sql # scp cybertools_db.sql на WordOps-сервер
Создание БД и импорт
wo db create cybertools_db # запишите выданные user/password mysql -u <dbuser> -p cybertools_db < cybertools_db.sql
Обновление .env
nano /var/www/cybertools.cc/htdocs/.env
DB_HOST=localhost DB_DATABASE=cybertools_db DB_USERNAME=<dbuser> DB_PASSWORD=<dbpassword>
APP_KEY, ключи Socialite, Stripe, mail и прочие секреты переносите из старого .env (или из защищённого хранилища), не публикуя их в репозиторий и не светите в чатах.
4. Composer, PHP, Nginx
Зависимости
cd /var/www/cybertools.cc/htdocs composer install --no-dev
Если всплывают конфликты Monolog / Illuminate\Log на старом lock-файле, обновляйте осмысленно под вашу major-ветку Laravel, а не «вслепую latest». Пример направления (подстраивайте под composer.json проекта):
composer update # только если осознанно меняете версии: # composer require monolog/monolog:^2.9 # composer require laravel/framework:^10.0
Версия PHP
Если сайт создан на одной ветке PHP, а проект требует другую, ставьте нужный PHP-FPM и переключайте сайт (через WordOps-команды или правку conf). Пример ручного направления для 8.3:
# пакеты php8.3 / php8.3-fpm и расширения (mysql, xml, mbstring, curl, zip, gd, bcmath ...) systemctl restart php8.3-fpm wo stack reload
В vhost должен быть корректный fastcgi_pass, например:
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
Laravel rewrite
В location для фронта:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
После правок:
wo stack reload
5. Artisan и cron
cd /var/www/cybertools.cc/htdocs php artisan cache:clear php artisan config:clear php artisan config:cache php artisan route:clear php artisan route:cache php artisan view:clear php artisan view:cache php artisan storage:link
Планировщик (от пользователя, под которым крутится PHP, часто www-data):
crontab -u www-data -e
* * * * * cd /var/www/cybertools.cc/htdocs && php artisan schedule:run >> /dev/null 2>&1
6. Проверка
- Главная: https://cybertools.cc
- Блог: https://cybertools.cc/blog
- Утилиты:
https://cybertools.cc/tool/<slug> - Socialite:
/auth/social-login - Stripe/тарифы:
/pricing - Отправка почты (тестовое письмо / queue)
Логи:
tail -f /var/log/nginx/cybertools.cc.error.log tail -f /var/www/cybertools.cc/htdocs/storage/logs/laravel.log
7. Безопасность и DNS
Закройте .env в Nginx (если такого location ещё нет):
location ~ /\.env {
deny all;
return 403;
}
wo stack reload
- В DNS смените A/AAAA на новый сервер только после smoke-теста (hosts-файл или временный hostname удобны до cutover).
- На проде:
APP_DEBUG=false, затем сноваphp artisan config:clear && php artisan config:cache. - SSL: Let’s Encrypt через WordOps (
wo site update ... --leили актуальная команда вашей версии) после того, как DNS указывает на новый IP.
Итог
- Бэкап пользователя Hestia + отдельный dump БД.
wo site create, распаковка в/var/www/.../htdocs, права на storage/cache.- Новая БД через
wo db create, правка.envбез публикации секретов. - Composer, PHP-FPM socket, try_files под Laravel.
- Artisan cache/link, cron schedule, deny на
.env,APP_DEBUG=false.
Если страница «пустая» или 500, сначала laravel.log и error-log Nginx: чаще всего это права storage, старый config-cache, неверный root на public или несовпадение версии PHP с расширениями.