Деплой Laravel на слабый VPS за вечер: nginx, php-fpm и один скрипт

0

Деплой ♡

Деплой Laravel на слабый VPS за вечер: nginx, php-fpm и один скрипт
Выкатить
и не сломать ♡

Выкладывать сайт на сервер страшно ровно до первого раза. Потом это превращается в один скрипт и пару минут ожидания. Я делала это на VPS с Ubuntu 24.04 и 1 ГБ памяти, без панелей и Docker. Знаешь этот мем «у меня на компьютере работает»? Вот тут его надо было превратить в «и на сервере работает». Рассказываю, что вышло и где я споткнулась.

Что нужно поставить

Набор небольшой. Всё ставится одной командой apt, но расширения PHP лучше перечислить сразу. Иначе Composer будет ругаться на каждое по очереди, а ты будешь бегать туда-сюда, как в квесте «найди недостающий пакет»:

apt-get install -y git unzip curl cron sqlite3 \
    php8.3-fpm php8.3-cli php8.3-sqlite3 php8.3-mbstring php8.3-xml php8.3-curl php8.3-zip \
    php8.3-intl php8.3-bcmath php8.3-gd

Composer ставится отдельно, официальным установщиком. Nginx на сервере уже был (там живёт чужой проект), поэтому свой сайт я добавила отдельным файлом в "sites-available", ничего не трогая в чужом. Сертификат выпускается одной командой "certbot --nginx -d домен -d www.домен": он сам допишет в конфиг HTTPS и редирект. Реально магия, которую делает за тебя чужой скрипт.

Пользователь, права и cron

Деплоить от root не стоит, поэтому я завела пользователя "deploy" и положила код в "/var/www/имя-проекта". Для приватного репозитория ему нужен доступ на чтение: я сделала отдельный deploy-ключ только на чтение и добавила его в настройки репозитория. Если ключ украдут, максимум, что с ним сделают, это почитают код.

Планировщику Laravel нужна одна строка в cron. Без неё отложенные записи и рассылки просто не заработают, и ты будешь сидеть и думать, почему ничего не происходит:

* * * * * deploy cd /var/www/имя-проекта && php artisan schedule:run >> /dev/null 2>&1

Ещё deploy-у нужно право перезагрузить php-fpm и выдать группе "www-data" доступ к "storage". Полный sudo ему давать не надо, я разрешила в "sudoers" ровно эти две команды. Принцип наименьших привилегий, или «не давай ребёнку спички».

Скрипт выкладки: нажал и пошёл пить кофе

Вся выкладка у меня живёт в одном файле "deploy.sh". Он тянет свежий код, ставит зависимости без dev-пакетов, гоняет миграции и пересобирает кеши:

git fetch origin "$BRANCH"
git checkout "$BRANCH"
git reset --hard "origin/$BRANCH"

composer install --no-dev --optimize-autoloader --no-interaction

php artisan down --retry=30 || true
php artisan migrate --force

php artisan optimize:clear
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
php artisan up

"git reset --hard" вместо "pull" я взяла специально. На сервере не должно быть своих правок, а если кто-то (то есть ты в три часа ночи) что-то там поправил руками, при выкладке это аккуратно исчезнет. Жёстко, зато честно.

Фронтенд собираю у себя

На сервере с 1 ГБ памяти "npm run build" может просто упасть, причём тихо и с достоинством. Поэтому Vite я запускаю на своём компьютере и заливаю готовую папку "public/build" через scp. Скрипт выкладки на сервере только проверяет, что "manifest.json" на месте, а Node не ставит вообще. Меньше софта, меньше проблем.

Грабли, на которые я наступила (за тебя)

Первые грабли: у меня на компьютере в PATH первым стоял PHP 8.2, а проекту нужен 8.3 и новее. "artisan" и тесты ругались на платформу, а я минут десять искала, что сломалось. Решение простое: запускать нужный PHP по полному пути, а не полагаться на PATH.

Вторые: файлы, которые загружает админка, принадлежат "www-data", и "chmod" от пользователя deploy на них падает. Из-за "set -e" скрипт обрывался на полпути, пока я не сделала эту команду нефатальной. Третьи про загрузки: каталог "storage" должен переживать выкладку, и "git reset --hard" его не трогает, потому что он в ".gitignore". Приятно, когда хоть что-то работает как ожидалось.

Что читать дальше: как ужиться с чужим проектом на этом же сервере, я описала в статье про два проекта на одном VPS, а как отправлять уведомления в Telegram с такого сервера, в статье про Cloudflare Worker.

Комментарии

Буду рада вашим мыслям, идеям и вопросам!
Давайте обсуждать ♡

Пока никто не написал.
Станьте первым! ♡

Поддержать проект

Угостить кофе по СБП

Перевод через Систему быстрых платежей, сумма любая. Спасибо, что вы здесь ♡

QR-код для перевода по СБП
Или другим способом
Дневник на почте

Подписаться на блог

Когда выйдет новая запись, я пришлю письмо со ссылкой. Без рассылок «просто так» и без спама. Отписаться можно одним нажатием.

Или следить в Telegram