Перенос Laravel cybertools.cc с Hestia на WordOps

Перенос 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 с расширениями.

Источники и ссылки


Комментарии загружаются…