Весной 2025 года Laravel-проект cybertools.cc переехал с Hestia Control Panel на сервер с WordOps. Ниже рабочий порядок: бэкап, файлы, база, Composer, Nginx и PHP, кэши artisan, cron и закрытие .env. Пароли и IP в тексте заменены плейсхолдерами.
Подготовка
На старом сервере нужен root или админ Hestia. Сайт там обычно лежит в /home/<username>/web/cybertools.cc/public_html. Первым делом полный бэкап пользователя, архив появится в /backup, его стоит сразу скачать к себе:
v-backup-user <username>
На новом сервере ставим WordOps и стек Nginx, PHP, MariaDB:
wget -qO wo wops.cc && sudo bash wo sudo wo stack install
Сайт и база в WordOps
Для Laravel нужен PHP-сайт с базой. По документации WordOps это ключ –mysql, а реквизиты созданной базы лежат в /var/www/site.tld/wo-config.php. Версию PHP задаём сразу, под требования composer.json проекта:
sudo wo site create cybertools.cc --mysql --php83 sudo cat /var/www/cybertools.cc/wo-config.php
Файлы проекта
# на старом сервере tar -czf cybertools.tar.gz -C /home/<username>/web/cybertools.cc public_html # на новом, после scp cd /var/www/cybertools.cc/htdocs tar -xzf ~/cybertools.tar.gz mv public_html/* public_html/.[!.]* . 2>/dev/null; rmdir public_html
WordOps смотрит в /var/www/cybertools.cc/htdocs, а Laravel должен отдаваться из каталога public. Правим root в /etc/nginx/sites-available/cybertools.cc на /var/www/cybertools.cc/htdocs/public и проверяем конфиг. В блоке location / должно быть try_files $uri $uri/ /index.php?$query_string.
sudo nginx -t && sudo wo stack reload --nginx
Права:
cd /var/www/cybertools.cc/htdocs
sudo chown -R www-data:www-data .
sudo find . -type d -exec chmod 755 {} \;
sudo find . -type f -exec chmod 644 {} \;
sudo chmod -R 775 storage bootstrap/cache
sudo chmod 640 .env
База данных
# на старом сервере mysqldump -u <dbuser> -p cybertools_db > cybertools_db.sql # на новом mysql -u <wo_dbuser> -p <wo_dbname> < cybertools_db.sql
В .env прописываем реквизиты из wo-config.php:
DB_HOST=localhost DB_DATABASE=<wo_dbname> DB_USERNAME=<wo_dbuser> DB_PASSWORD=<wo_dbpassword>
APP_KEY, ключи Socialite, Stripe, почты и прочие секреты переносим из старого .env. В репозиторий и чаты их не выкладываем.
Composer и PHP
cd /var/www/cybertools.cc/htdocs composer install --no-dev --optimize-autoloader
Если на старом lock-файле всплывают конфликты, например Monolog и Illuminate\Log, обновляем зависимости осознанно под свою ветку Laravel, а не всё сразу до latest. Если проекту нужна другая ветка PHP, сайт переключается одной командой, например sudo wo site update cybertools.cc –php82.
Artisan и cron
php artisan optimize:clear php artisan config:cache php artisan route:cache php artisan view:cache php artisan storage:link
Планировщик Laravel от пользователя, под которым работает PHP:
sudo crontab -u www-data -e * * * * * cd /var/www/cybertools.cc/htdocs && php artisan schedule:run >> /dev/null 2>&1
Проверка, DNS и SSL
- до смены DNS проверить сайт через hosts-файл: главная, блог, страницы утилит, вход через соцсети, тарифы, отправка почты;
- в .env на проде APP_DEBUG=false, после правки снова php artisan config:cache;
- закрыть .env в Nginx: location ~ /\.env { deny all; };
- сменить A и AAAA на новый сервер и после этого выпустить сертификат: sudo wo site update cybertools.cc -le.
Логи на первые дни:
tail -f /var/log/nginx/cybertools.cc.error.log tail -f /var/www/cybertools.cc/htdocs/storage/logs/laravel.log
Итог: перенос Laravel с Hestia на WordOps это бэкап, сайт с базой через –mysql, root на public, Composer, кэши artisan и cron. Если после переезда пустая страница или 500, сначала смотрим laravel.log и лог Nginx: обычно виноваты права на storage, старый config-cache, root не на public или не та версия PHP.