Развертывание Laravel-проектов на VPS: пошаговое руководство

Практический курс по самостоятельному деплою веб-проектов на базе Laravel и Lovable на облачный сервер (VPS/VDS). Вы пройдете весь путь от аренды сервера до финального запуска приложения, используя проверенные инструкции от [webhost1.ru](https://webhost1.ru/help/articles/general-information/2025-06-26-kak-razvernut-laravel-na-vps-i-ne-sojti-s-uma-poshagovaja-instrukcija--gotovye-reshenija-ot-webhost1.html) и [javascript.plainenglish.io](https://javascript.plainenglish.io/from-shared-hosting-to-vps-a-complete-guide-to-deploying-your-laravel-api-ebe76ddc4fb0).

Подготовка облачного сервера: аренда, базовая безопасность и настройка SSH

Подготовка облачного сервера: аренда, базовая безопасность и настройка SSH

Развертывание современных веб-проектов, созданных с помощью фреймворка Laravel или сгенерированных через платформу Lovable, требует правильного окружения. Обычный виртуальный хостинг для таких задач подходит плохо: он накладывает жесткие ограничения на установку программного обеспечения и не дает полного контроля над системой. Решением становится VPS (Virtual Private Server) — виртуальный частный сервер.

VPS — это изолированная часть мощного физического компьютера, которая ведет себя как отдельный полноценный сервер. Вы получаете гарантированные ресурсы (процессор, память, диск) и право устанавливать любые программы.

VPS — это твой личный островок в океане интернета: ресурсы только твои, полная свобода в настройках, и никакой сосед не уронит твой сайт из-за своего кривого кода.

arenda-server.cloud

Аренда сервера: характеристики и операционная система

Первый шаг к запуску проекта — аренда сервера у облачного провайдера. Процесс покупки обычно сводится к выбору трех параметров: операционной системы, физического расположения (локации) и мощности.

Для проектов на Laravel стандартом индустрии является операционная система Ubuntu. Рекомендуется выбирать версии с пометкой LTS (Long Term Support — долгосрочная поддержка), например, Ubuntu 22.04 LTS или 24.04 LTS. Они обеспечивают стабильность и получают обновления безопасности в течение пяти лет.

Минимальные требования для комфортной работы Laravel-проекта:

  • Процессор (vCPU): 1 ядро
  • Оперативная память (RAM): 1–2 ГБ
  • Накопитель: 20–25 ГБ (желательно NVMe SSD для высокой скорости чтения/записи)

Важное правило: если оперативная память сервера RAM<1RAM < 1 ГБ, процесс установки зависимостей через пакетный менеджер Composer может завершиться ошибкой из-за нехватки памяти. Поэтому 1 ГБ — это абсолютный минимум, а 2 ГБ — рекомендуемый старт.

Бюджет на такой сервер обычно рассчитывается по часам. Расход = Цена за час × 730 часов (среднее количество часов в месяце). При цене 0,007 долл. в час итоговая стоимость составит около 5 долл. в месяц.

После оплаты провайдер выдаст вам три ключевых параметра: IP-адрес сервера (например, 192.168.1.50), имя пользователя (по умолчанию это root) и пароль.

Первое подключение по SSH

Управление облачным сервером происходит без графического интерфейса — только через командную строку. Для связи вашего компьютера с сервером используется протокол SSH (Secure Shell).

SSH — это криптографический сетевой протокол, который создает защищенный зашифрованный туннель между вашим компьютером и сервером. Любые команды, которые вы отправляете, невозможно перехватить или прочитать извне.

Для подключения откройте терминал (Командная строка или PowerShell в Windows, Terminal в macOS) и введите команду:

ssh root@192.168.1.50

Замените цифры на IP-адрес вашего сервера. Система спросит, доверяете ли вы этому узлу (нужно написать yes и нажать Enter), а затем запросит пароль. При вводе пароля в Linux символы не отображаются на экране — это нормальное поведение системы безопасности. Просто введите пароль и нажмите Enter.

Создание нового пользователя и отказ от root

Пользователь root — это супер-администратор системы. Он имеет абсолютную власть: может удалять любые системные файлы, менять любые настройки и останавливать критически важные процессы.

Работать от имени root на постоянной основе — плохая практика. Это можно сравнить с вождением автомобиля, у которого вместо педали тормоза установлена кнопка самоуничтожения. Одно неосторожное движение (или опечатка в команде), и сервер будет безвозвратно сломан.

Вместо этого мы создадим обычного пользователя и наделим его правом временно повышать свои привилегии с помощью команды sudo (Superuser DO).

Создадим пользователя с именем laraveladmin:

adduser laraveladmin

Система попросит придумать пароль для нового пользователя и заполнить дополнительную информацию (ее можно пропустить, нажимая Enter).

Теперь добавим этого пользователя в группу sudo, чтобы он мог выполнять административные задачи:

usermod -aG sudo laraveladmin

Здесь флаг -a означает append (добавить), а -G — group (группа). Теперь вы можете отключиться от сервера командой exit и зайти заново, но уже под новым именем:

ssh laraveladmin@192.168.1.50

Настройка SSH-ключей: вход без пароля

Ввод пароля при каждом подключении утомляет, а сами пароли уязвимы для атак методом подбора (брутфорс), когда специальные программы-боты пытаются угадать ваш пароль, перебирая миллионы комбинаций.

Решение этой проблемы — асимметричное шифрование с помощью SSH-ключей.

Механизм состоит из двух частей:

  1. Публичный ключ — это «замок». Вы копируете его на свой сервер. Его можно показывать кому угодно, он служит только для проверки.
  2. Приватный ключ — это «физический ключ» от замка. Он хранится только на вашем личном компьютере и никогда не передается по сети.

Когда вы пытаетесь подключиться, сервер проверяет, подходит ли ваш приватный ключ к публичному замку. Если да — вас пускают без пароля.

Чтобы создать такую пару ключей, откройте терминал на своем локальном компьютере (не на сервере!) и введите:

ssh-keygen -t rsa -b 4096

Нажимайте Enter на все вопросы системы, чтобы оставить настройки по умолчанию. Ключи будут созданы.

Теперь нужно отправить «замок» (публичный ключ) на ваш сервер. Для этого введите:

ssh-copy-id laraveladmin@192.168.1.50

Система в последний раз попросит пароль пользователя laraveladmin. После этого вы сможете подключаться к серверу мгновенно, без ввода пароля.

Базовая безопасность: настройка брандмауэра (UFW)

По умолчанию сервер открыт для множества типов сетевых соединений. Чтобы защитить его от взлома, необходимо настроить брандмауэр (файрвол) — систему, которая блокирует все входящие подключения, кроме тех, которые вы явно разрешили.

В Ubuntu для этого используется утилита UFW (Uncomplicated Firewall — несложный брандмауэр).

Нам нужно разрешить всего три типа подключений:

  • Порт 22 — для управления сервером по SSH.
  • Порт 80 — для обычного веб-трафика (HTTP).
  • Порт 443 — для защищенного веб-трафика (HTTPS).

Выполните на сервере следующие команды (обратите внимание, что теперь перед административными командами мы пишем sudo):

sudo ufw allow OpenSSH
sudo ufw allow 80
sudo ufw allow 443

После того как правила добавлены, включаем брандмауэр:

sudo ufw enable

Система предупредит, что это может разорвать текущее SSH-соединение. Соглашайтесь (введите y и нажмите Enter). Поскольку мы предварительно разрешили OpenSSH, наше соединение не прервется.

Сравнение состояния портов до и после включения UFW

Порт / Сервис До включения UFW После включения UFW
22 (SSH) Открыт Открыт (разрешили вручную)
80 (HTTP) Открыт Открыт (разрешили вручную)
443 (HTTPS) Открыт Открыт (разрешили вручную)
3306 (База данных) Открыт Заблокирован извне
6379 (Redis) Открыт Заблокирован извне

Блокировка портов баз данных извне — критически важный шаг. База данных должна быть доступна только самому серверу (локально), но не хакерам из интернета.

Отключение входа по паролю

Финальный штрих базовой безопасности — полный запрет на вход по паролю и запрет на прямое подключение пользователя root. Теперь, когда у нас есть SSH-ключи и пользователь laraveladmin, пароли нам больше не нужны.

Откроем конфигурационный файл SSH-сервера с помощью консольного текстового редактора nano:

sudo nano /etc/ssh/sshd_config

В этом файле нужно найти две строки и изменить их значения на no:

  1. PermitRootLogin no (запрещает вход суперпользователю).
  2. PasswordAuthentication no (запрещает вход по паролю для всех).

Чтобы сохранить изменения в редакторе nano, нажмите Ctrl+O, затем Enter, а для выхода — Ctrl+X.

Чтобы новые настройки вступили в силу, перезапустите службу SSH:

sudo systemctl restart ssh

Теперь ваш облачный сервер надежно защищен. Никто не сможет подобрать пароль, так как вход по паролю отключен, а доступ к системе есть только у владельца приватного SSH-ключа. Фундамент заложен, и сервер полностью готов к установке веб-сервера, PHP и базы данных для вашего Laravel-проекта.

Установка программного окружения: настройка PHP, Composer и необходимых утилит

Установка программного окружения: настройка PHP, Composer и необходимых утилит

В предыдущей части мы арендовали облачный сервер, обезопасили его с помощью брандмауэра и настроили вход по SSH-ключам. Теперь у нас есть надежный, но абсолютно пустой виртуальный компьютер. Чтобы он смог запускать веб-проекты на базе фреймворка Laravel, его нужно превратить в полноценный веб-сервер.

Процесс подготовки сервера похож на ремонт в новостройке: прежде чем завозить мебель (код вашего проекта), нужно провести электричество, воду и интернет (установить базовое программное обеспечение). Для современных PHP-приложений стандартом является стек технологий LEMP.

LEMP — это аббревиатура, обозначающая набор из четырех ключевых компонентов: Linux (операционная система), Engine-X (веб-сервер Nginx), MySQL или MariaDB (база данных) и PHP (язык программирования).

Шаг 1: Обновление системы и установка базовых утилит

Перед установкой любых новых программ необходимо убедиться, что сама операционная система Ubuntu имеет актуальные списки пакетов и последние обновления безопасности.

Подключитесь к серверу по SSH от имени вашего пользователя (например, laraveladmin) и выполните команду:

sudo apt update && sudo apt upgrade -y

Команда apt update скачивает свежие списки доступных программ, а apt upgrade устанавливает их. Флаг -y автоматически соглашается на все предложения системы, избавляя вас от необходимости нажимать Enter.

Далее установим набор базовых системных утилит, которые понадобятся нам в дальнейшем:

sudo apt install -y git unzip curl software-properties-common

Зачем нужны эти программы:

  • git — система контроля версий. С ее помощью мы будем скачивать код вашего проекта из репозиториев (например, с GitHub или GitLab).
  • unzip — архиватор. Он критически важен для работы пакетного менеджера PHP, который скачивает библиотеки в виде ZIP-архивов.
  • curl — утилита для скачивания файлов по прямым ссылкам прямо в командной строке.
  • software-properties-common — инструмент, позволяющий легко добавлять сторонние репозитории (источники программ), если нам понадобятся более свежие версии ПО.

Шаг 2: Установка веб-сервера Nginx

Веб-сервер — это программа, которая круглосуточно «слушает» сетевые порты (80 и 443) и отвечает на запросы пользователей. Когда кто-то вводит адрес вашего сайта в браузере, именно веб-сервер принимает этот запрос.

Исторически самым популярным веб-сервером был Apache. Однако для современных проектов, особенно высоконагруженных, индустрия перешла на Nginx (читается как «Энджинкс»).

Почему Nginx, а не Apache?

Характеристика Apache Nginx
Архитектура Создает новый процесс для каждого пользователя Обрабатывает тысячи соединений в одном процессе (событийно-ориентированный)
Потребление памяти Высокое (растет с каждым новым посетителем) Низкое и предсказуемое
Статические файлы Отдает медленнее Отдает мгновенно (картинки, CSS, JS)

Установим Nginx командой:

sudo apt install -y nginx

Сразу после установки Nginx запускается автоматически. Вы можете проверить это, введя IP-адрес вашего сервера в адресную строку браузера. Если вы видите страницу с надписью Welcome to nginx!, значит, веб-сервер успешно установлен и принимает запросы из интернета.

Шаг 3: Установка PHP и PHP-FPM

Сам по себе Nginx умеет отдавать только статические файлы (HTML, картинки). Он не понимает язык PHP, на котором написан Laravel. Если Nginx получит запрос к PHP-файлу, он просто попытается скачать его пользователю на компьютер, что приведет к утечке исходного кода.

Чтобы этого избежать, нам нужен переводчик — PHP-FPM (FastCGI Process Manager).

Когда Nginx видит, что пользователь запрашивает PHP-страницу, он передает этот запрос в PHP-FPM. Тот выполняет код Laravel, генерирует готовый HTML и возвращает его Nginx, который уже отправляет результат в браузер пользователя.

Laravel требует свежих версий PHP (8.2 или 8.3). Установим PHP версии 8.3 и набор обязательных расширений (модулей), без которых фреймворк не запустится:

sudo apt install -y php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl php8.3-zip php8.3-bcmath php8.3-intl

Каждое расширение выполняет свою важную роль:

  • php-mysql — позволяет PHP общаться с базой данных.
  • php-mbstring — необходим для правильной работы с текстом в кодировке UTF-8 (например, с кириллицей).
  • php-xml — используется для чтения конфигурационных файлов и работы с API.
  • php-zip — нужен для распаковки библиотек.

Проверить успешность установки можно командой:

php -v

Система должна вывести информацию о версии PHP 8.3.

Шаг 4: Установка пакетного менеджера Composer

Современные проекты не пишутся с нуля. Laravel состоит из десятков сторонних библиотек (пакетов). Чтобы не скачивать их вручную, используется Composer — официальный менеджер зависимостей для PHP.

Composer читает файл composer.json в вашем проекте, видит список нужных библиотек и автоматически скачивает их правильные версии.

Установка Composer состоит из двух этапов: скачивание установщика и перемещение его в системную папку, чтобы он был доступен из любой директории.

Выполните следующие команды по очереди:

curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

Первая команда скачивает файл composer.phar (это исполняемый PHP-архив) в текущую папку. Вторая команда перемещает его в системную директорию /usr/local/bin/ и переименовывает в composer.

Теперь вы можете вызвать его простой командой:

composer --version

Шаг 5: Установка и настройка базы данных MySQL

Любому динамическому приложению нужно место для хранения данных: пользователей, статей, заказов. Laravel поддерживает разные СУБД (системы управления базами данных), но самой популярной связкой остается MySQL.

Установим сервер баз данных:

sudo apt install -y mysql-server

Сразу после установки база данных работает с настройками по умолчанию, которые не очень безопасны. Запустим встроенный скрипт безопасности:

sudo mysql_secure_installation

Скрипт задаст несколько вопросов. Рекомендуется ответить Y (Yes) на вопросы об удалении анонимных пользователей, запрете удаленного входа для суперпользователя (root) и удалении тестовой базы данных.

Создание базы данных для проекта

Теперь нам нужно создать отдельную базу данных для вашего будущего проекта и пользователя, который будет иметь к ней доступ. Использовать главного пользователя root для работы сайта — грубое нарушение безопасности.

Зайдем в консоль управления MySQL:

sudo mysql

Вы увидите, что приглашение командной строки изменилось на mysql>. Теперь мы пишем не команды Linux, а SQL-запросы.

Создадим базу данных с именем laravel_app (вы можете придумать свое):

CREATE DATABASE laravel_app CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Создадим нового пользователя laravel_user и зададим ему надежный пароль (замените StrongPassword123! на свой):

CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';

Выдадим этому пользователю полные права, но только на созданную нами базу данных laravel_app:

GRANT ALL PRIVILEGES ON laravel_app.* TO 'laravel_user'@'localhost';

Применим изменения и выйдем из консоли MySQL:

FLUSH PRIVILEGES;
EXIT;

Обязательно сохраните имя базы данных, имя пользователя и пароль в надежном месте (например, в менеджере паролей). Эти данные понадобятся нам на следующем этапе, когда мы будем подключать код Laravel к базе данных.

На этом подготовка программного окружения завершена. Ваш сервер оснащен мощным веб-сервером Nginx, актуальной версией PHP с необходимыми модулями, менеджером пакетов Composer и настроенной базой данных MySQL. Фундамент полностью готов к тому, чтобы принять исходный код вашего проекта.

Настройка базы данных: установка СУБД, создание базы и пользователей

Любому современному веб-приложению нужна память. Место, где будут надежно храниться учетные записи пользователей, тексты статей, история заказов и настройки сайта. В экосистеме веб-разработки за эту задачу отвечают системы управления базами данных (СУБД).

Если веб-сервер Nginx — это курьер, доставляющий страницы пользователю, а PHP — это мозг, генерирующий эти страницы, то база данных — это строгий архивариус. Она не просто хранит информацию, но и позволяет мгновенно находить нужные записи среди миллионов других, связывать их между собой и защищать от несанкционированного доступа.

Выбор СУБД для Laravel-проекта

Фреймворк Laravel из коробки поддерживает несколько популярных реляционных баз данных: MySQL, PostgreSQL, SQLite и SQL Server. Для большинства проектов, разворачиваемых на VPS, выбор сводится к двум лидерам.

Характеристика MySQL (и MariaDB) PostgreSQL
Сложность освоения Низкая. Идеально для старта Средняя. Требует более глубоких знаний
Скорость чтения Очень высокая (отлично для блогов, каталогов) Высокая
Сложные запросы и аналитика Справляется хорошо Безоговорочный лидер
Тип данных JSON Поддерживается Поддерживается с продвинутой индексацией

Для нашего руководства мы выберем MySQL (или ее полностью совместимый аналог MariaDB, который часто используется в Ubuntu по умолчанию). Это индустриальный стандарт, который идеально подходит для 95% веб-проектов и имеет огромное сообщество, что облегчает поиск решений при возникновении ошибок.

Установка и базовая защита сервера баз данных

Подключитесь к вашему VPS по SSH. Установка СУБД выполняется через стандартный менеджер пакетов Ubuntu. Выполните следующую команду:

sudo apt update
sudo apt install -y mysql-server

Сразу после установки база данных запускается с настройками по умолчанию. Эти настройки удобны для локальной разработки, но абсолютно не подходят для публичного сервера в интернете. Например, по умолчанию может присутствовать анонимный пользователь или тестовая база данных, открытая для всех.

Чтобы закрыть эти уязвимости, разработчики MySQL предусмотрели специальный скрипт безопасности. Запустите его:

sudo mysql_secure_installation

Система задаст вам несколько вопросов. Вот рекомендуемые ответы для обеспечения безопасности:

  1. Установка плагина валидации паролей (VALIDATE PASSWORD COMPONENT): Можно ответить N (Нет), если вы сами генерируете сложные пароли, или Y (Да), чтобы система принудительно запрещала простые пароли вроде qwerty.
  2. Удаление анонимных пользователей (Remove anonymous users): Обязательно Y.
  3. Запрет удаленного входа для root (Disallow root login remotely): Обязательно Y. Суперпользователь должен иметь возможность подключаться только изнутри самого сервера.
  4. Удаление тестовой базы данных (Remove test database): Обязательно Y.
  5. Перезагрузка таблиц привилегий (Reload privilege tables now): Обязательно Y, чтобы все изменения вступили в силу немедленно.

Создание базы данных и пользователя для проекта

В мире информационной безопасности существует золотое правило:

Принцип наименьших привилегий — это концепция, согласно которой пользователю или программе выдаются только те права доступа, которые строго необходимы для выполнения их задач, и не более того.

Именно поэтому мы никогда не подключаем Laravel-приложение к базе данных от имени суперпользователя root. Если злоумышленник найдет уязвимость в коде вашего сайта, он получит доступ ко всем базам данных на сервере. Вместо этого мы создадим отдельную базу и отдельного пользователя, который будет иметь права только на эту базу.

Войдите в консоль управления MySQL от имени суперпользователя:

sudo mysql

Приглашение командной строки изменится на mysql>. Теперь мы пишем SQL-запросы. Каждая команда должна заканчиваться точкой с запятой.

1. Создаем базу данных

CREATE DATABASE laravel_project CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Здесь laravel_project — это имя вашей базы. Параметр CHARACTER SET utf8mb4 критически важен: он указывает базе данных использовать полноценную кодировку Unicode. В отличие от старого utf8, формат utf8mb4 поддерживает хранение эмодзи (😊) и редких символов. COLLATE определяет правила сортировки и сравнения строк.

2. Создаем пользователя

CREATE USER 'laravel_user'@'localhost' IDENTIFIED BY 'SuperSecretPassword123!';

Мы создаем пользователя laravel_user. Обратите внимание на часть '@'localhost'. Это дополнительный слой безопасности: мы указываем, что этот пользователь имеет право подключаться к базе данных только с этого же самого сервера. Попытка подключиться с домашнего компьютера под этим логином будет отклонена.

3. Выдаем права

GRANT ALL PRIVILEGES ON laravel_project.* TO 'laravel_user'@'localhost';

Эта команда дает нашему новому пользователю полные права (создание таблиц, запись, удаление данных), но исключительно внутри базы laravel_project (на это указывает .* после имени базы).

4. Применяем изменения и выходим

FLUSH PRIVILEGES;
EXIT;

Подключение Laravel к базе данных

Теперь у нас есть готовая база данных, но код Laravel ничего о ней не знает. В современных фреймворках учетные данные не зашиваются жестко в код. Они хранятся в специальном скрытом файле переменных окружения — .env, который находится в корне вашего проекта.

Файл .env содержит настройки, которые зависят от среды (локальный компьютер, тестовый сервер, боевой сервер).

Откройте файл .env в папке вашего проекта на сервере (например, с помощью редактора nano) и найдите блок, начинающийся с DB_:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_project
DB_USERNAME=laravel_user
DB_PASSWORD=SuperSecretPassword123!

Разберем каждую строку:

  • DB_CONNECTION — указывает драйвер базы данных (в нашем случае mysql).
  • DB_HOST — IP-адрес сервера баз данных. Поскольку база и сайт находятся на одном VPS, мы используем локальный адрес 127.0.0.1 (он же localhost).
  • DB_PORT — сетевой порт. Для MySQL стандартным портом является 3306. Если IP-адрес — это номер дома, то порт — это номер квартиры, где живет СУБД.
  • DB_DATABASE, DB_USERNAME, DB_PASSWORD — данные, которые мы создали на предыдущем шаге.

Решение частых проблем с подключением

Если после настройки файла .env ваше приложение выдает ошибку Access denied for user, проблема часто кроется не в опечатках, а в системе кэширования Laravel. Фреймворк кэширует настройки для ускорения работы. Чтобы заставить его прочитать обновленный файл .env, выполните в папке проекта команду:

php artisan config:clear

Миграции: создание структуры таблиц

База данных подключена, но она абсолютно пуста. В ней нет таблиц для пользователей, паролей или контента. В классической веб-разработке программисту приходилось бы вручную писать SQL-запросы для создания каждой таблицы.

Laravel решает эту проблему с помощью миграций. Миграции — это система контроля версий для вашей базы данных. В коде проекта уже лежат PHP-файлы, описывающие, какие таблицы нужны приложению и какие колонки в них должны быть.

Чтобы превратить эти PHP-описания в реальные таблицы в MySQL, достаточно выполнить одну команду в корне проекта:

php artisan migrate

Фреймворк подключится к базе данных, используя доступы из файла .env, прочитает файлы миграций и автоматически создаст всю необходимую структуру. Если команда выполнилась без ошибок и вывела зеленые сообщения Done, значит, настройка базы данных прошла абсолютно успешно.

Теперь ваш сервер обладает полноценной памятью. В следующей части курса мы разберем процесс переноса исходного кода вашего проекта на сервер и настройку веб-сервера Nginx для обработки входящих запросов пользователей.

Перенос кода и сборка проекта: клонирование репозитория и установка зависимостей

В предыдущих статьях мы подготовили надежный фундамент для нашего проекта: арендовали и защитили сервер, установили веб-сервер, язык программирования PHP и настроили базу данных MySQL. Если сравнить развертывание сайта со строительством дома, то мы уже возвели стены, провели электричество и водопровод. Теперь настало время завезти мебель и жильцов — то есть перенести исходный код вашего Laravel-приложения на сервер и заставить его работать.

В этой статье мы разберем процесс доставки кода из системы контроля версий на ваш VPS, установку всех необходимых зависимостей и настройку прав доступа.

Почему Git, а не FTP?

Исторически разработчики переносили файлы на сервер с помощью протокола FTP, просто копируя папки с локального компьютера. Сегодня этот подход считается устаревшим и опасным.

Для современных проектов, особенно созданных с помощью таких инструментов, как Lovable, стандартом является использование Git — распределенной системы контроля версий, и платформ вроде GitHub или GitLab.

Характеристика FTP-клиент (устаревший подход) Git и GitHub (современный подход)
Скорость Низкая. Копируется каждый файл отдельно Высокая. Скачиваются только изменения (дельта)
Безопасность Пароли могут перехватываться, файлы могут повредиться при обрыве связи Защищенное SSH-соединение, гарантия целостности кода
Откат изменений Невозможен, если вы не сделали ручную резервную копию Мгновенный откат к любой предыдущей версии одной командой
Исключения Приходится вручную следить, чтобы не скопировать локальные настройки Файл .gitignore автоматически отсекает лишнее

Процесс выглядит так: вы пишете код на домашнем компьютере, отправляете его в закрытый репозиторий на GitHub, а затем ваш сервер скачивает этот код к себе.

Шаг 1: Настройка SSH-ключей для GitHub

Чтобы ваш сервер мог скачивать код из закрытого репозитория на GitHub, ему нужен пропуск. Мы не будем использовать логин и пароль — это небезопасно и неудобно. Вместо этого мы создадим SSH-ключ специально для сервера.

Подключитесь к вашему VPS по SSH и выполните команду генерации ключа. Мы будем использовать современный алгоритм шифрования ed25519:

ssh-keygen -t ed25519 -C "vps-deploy-key"

Система спросит, куда сохранить ключ и попросит ввести пароль (passphrase). Просто нажимайте Enter на все вопросы, чтобы оставить настройки по умолчанию и создать ключ без пароля (иначе автоматизация деплоя в будущем будет невозможна).

Теперь выведем публичную часть ключа на экран:

cat ~/.ssh/id_ed25519.pub

Вы увидите длинную строку, начинающуюся с ssh-ed25519. Скопируйте ее полностью.

Теперь перейдите на сайт GitHub:

  1. Откройте настройки вашего профиля (Settings).
  2. Перейдите в раздел SSH and GPG keys.
  3. Нажмите зеленую кнопку New SSH key.
  4. В поле Title введите понятное имя (например, "My Ubuntu VPS").
  5. В поле Key вставьте скопированную строку и сохраните.

Чтобы проверить, что связь установлена, выполните на сервере:

ssh -T git@github.com

Если вы видите сообщение "Hi username! You've successfully authenticated", значит, сервер готов к загрузке кода.

Шаг 2: Клонирование репозитория

В Linux-системах принято хранить файлы веб-сайтов в директории /var/www. Перейдем в нее:

cd /var/www

Теперь скачаем наш проект. Зайдите на страницу вашего репозитория на GitHub, нажмите зеленую кнопку Code, выберите вкладку SSH и скопируйте ссылку (она выглядит как git@github.com:username/project.git).

Выполните команду клонирования (замените ссылку на свою). Поскольку папка /var/www защищена системой, нам понадобится sudo:

sudo git clone git@github.com:username/project.git

После загрузки в папке /var/www появится директория с именем вашего проекта. Перейдем в нее (замените project на имя вашей папки):

cd project

Важное правило: все последующие команды в этой статье должны выполняться строго находясь внутри папки вашего проекта!

Поскольку мы клонировали проект через sudo, владельцем файлов стал суперпользователь root. Это вызовет проблемы в дальнейшем. Передадим права на файлы нашему текущему пользователю (в команде ниже $USER автоматически подставит ваш логин):

sudo chown -R $USER:$USER .

Шаг 3: Установка зависимостей PHP (Composer)

Если вы заглянете в скачанную папку, то не найдете там директории vendor, где хранятся файлы самого фреймворка Laravel и других библиотек.

Это не ошибка. Исходный код библиотек никогда не хранится в Git-репозитории, так как они занимают много места и часто обновляются. Вместо этого в проекте есть файл composer.json — это своеобразный список покупок. В нем записано, какие библиотеки и каких версий нужны проекту.

Чтобы "купить" всё по списку, мы используем пакетный менеджер Composer, который установили в прошлой статье:

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

Разберем флаги:

  • --optimize-autoloader — ускоряет загрузку классов, что критически важно для производительности на боевом сервере.
  • --no-dev — указывает не устанавливать библиотеки, нужные только для локальной разработки (например, инструменты для тестирования). Это экономит память и повышает безопасность.

Шаг 4: Настройка переменных окружения (.env)

Еще один файл, который никогда не попадает в GitHub из соображений безопасности — это .env. В нем хранятся пароли от баз данных, API-ключи и настройки среды.

К счастью, Laravel предоставляет шаблон. Скопируем его:

cp .env.example .env

Теперь откроем созданный файл в консольном текстовом редакторе nano:

nano .env

Вам нужно изменить несколько ключевых строк:

  1. APP_ENV=production (вместо local) — говорит фреймворку, что мы на боевом сервере.
  2. APP_DEBUG=false (вместо true) — Обязательно! Если оставить true, при любой ошибке пользователи увидят куски вашего кода и пароли.
  3. APP_URL=http://ваш-домен.com (или IP-адрес сервера).
  4. Блок базы данных (вспоминаем данные из предыдущей статьи):
    • DB_DATABASE=laravel_project
    • DB_USERNAME=laravel_user
    • DB_PASSWORD=SuperSecretPassword123!

Сохраните файл (в nano это Ctrl+O, затем Enter, затем Ctrl+X для выхода).

Теперь нужно сгенерировать уникальный ключ шифрования приложения. Он используется для защиты пользовательских сессий и куки-файлов:

php artisan key:generate

Шаг 5: Настройка прав доступа для веб-сервера

Это самый частый момент, на котором спотыкаются новички.

Когда пользователь заходит на ваш сайт, веб-сервер (Nginx) и PHP-FPM обрабатывают его запрос. В Ubuntu эти программы работают от имени специального системного пользователя, который называется www-data.

Laravel в процессе работы должен сохранять файлы: кэш, логи ошибок, загруженные пользователями картинки. По умолчанию у пользователя www-data нет прав на запись в папку вашего проекта. Если это не исправить, сайт выдаст ошибку 500.

Нам нужно дать права на запись в две конкретные папки: storage (здесь лежат логи и загрузки) и bootstrap/cache (здесь лежит кэш фреймворка).

Выполните две команды:

sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R 775 storage bootstrap/cache

Первая команда делает www-data владельцем этих папок. Вторая команда устанавливает права 775, разрешая владельцу и группе читать, писать и выполнять файлы.

Шаг 6: Сборка фронтенда (Node.js и NPM)

Современные Laravel-проекты (особенно сгенерированные через Lovable) активно используют JavaScript, CSS-препроцессоры и сборщик Vite. Исходные файлы фронтенда лежат в папке resources, но браузер их не понимает. Их нужно скомпилировать и положить в публичную папку public.

Для этого нам понадобится Node.js и его пакетный менеджер NPM. Установим их из официального репозитория Ubuntu:

sudo apt install -y nodejs npm

Теперь, по аналогии с Composer, установим JavaScript-зависимости (список покупок лежит в файле package.json):

npm install

И запустим процесс сборки (минификации и компиляции) для боевого сервера:

npm run build

Вы увидите, как Vite создаст оптимизированные файлы в директории public/build.

Финальный штрих: Миграции базы данных

Код на месте, база данных подключена в .env. Осталось создать структуру таблиц в MySQL. Выполняем команду:

php artisan migrate --force

Флаг --force обязателен. Поскольку мы указали APP_ENV=production, Laravel попытается защитить нас от случайного удаления данных и спросит: "Вы уверены, что хотите запустить миграции на боевом сервере?". Флаг --force дает автоматическое согласие.

Поздравляем! Ваш код полностью перенесен, настроен и готов к работе. База данных имеет нужную структуру, а фронтенд скомпилирован. В следующей, заключительной статье курса, мы настроим веб-сервер Nginx, чтобы он начал принимать запросы из интернета и направлять их в наше приложение.

Настройка веб-сервера и запуск: конфигурация Nginx и получение SSL-сертификата

Код вашего приложения уже находится на сервере, база данных настроена, а все зависимости установлены. Однако, если вы сейчас введете IP-адрес вашего сервера в браузере, вы увидите либо стандартную страницу-заглушку, либо сообщение об ошибке. Сервер пока не знает, как правильно принимать запросы от пользователей и куда их направлять.

Чтобы связать внешний мир с вашим Laravel-приложением, нам нужен веб-сервер. В нашем стеке эту роль выполняет Nginx — невероятно быстрый и надежный инструмент, который работает как умный регулировщик трафика.

Привязка домена к серверу

Прежде чем настраивать веб-сервер, необходимо убедиться, что ваш домен (например, my-awesome-project.com) указывает на IP-адрес вашего VPS.

Для этого нужно зайти в панель управления регистратора вашего домена (там, где вы его купили) и создать A-запись (Address record).

Поле Значение Описание
Тип записи A Указывает, что мы привязываем домен к IPv4-адресу
Имя (Хост) @ (или пусто) Означает основной домен
Значение (IP) 192.168.1.100 IP-адрес вашего арендованного VPS
TTL 3600 (или авто) Время обновления кэша DNS в секундах

Обновление DNS-записей по всему миру может занять от нескольких минут до 24 часов. Пока ваш компьютер не начнет перенаправлять имя домена на новый IP-адрес, получать SSL-сертификат бессмысленно.

Как Nginx управляет сайтами

Представьте себе большой офисный центр. Nginx — это администратор на ресепшене. Когда посетитель (браузер пользователя) заходит в здание и говорит: «Мне нужна компания Ромашка», администратор сверяется со своим справочником и направляет посетителя на нужный этаж и в нужный кабинет.

В терминологии Nginx этот «справочник» называется виртуальным хостом (или server block). Благодаря виртуальным хостам на одном сервере можно разместить десятки разных сайтов, и Nginx будет безошибочно распределять запросы между ними на основе доменного имени.

Конфигурационные файлы Nginx в Ubuntu хранятся в двух важных директориях:

  1. /etc/nginx/sites-available/ — здесь лежат файлы настроек для всех сайтов, которые в принципе есть на сервере (меню всех блюд ресторана).
  2. /etc/nginx/sites-enabled/ — здесь лежат ярлыки на файлы из первой папки. Если ярлык есть, сайт активен и работает (блюда, которые можно заказать прямо сейчас).

Шаг 1: Создание конфигурационного файла

Создадим новый файл конфигурации для нашего проекта. Назовем его именем вашего домена для удобства. Используем консольный редактор nano с правами суперпользователя:

sudo nano /etc/nginx/sites-available/my-domain.com

Вставьте в этот файл следующую конфигурацию (это официальный стандарт, рекомендованный разработчиками Laravel). Обязательно замените my-domain.com на ваш реальный домен, а /var/www/project на реальный путь к папке вашего проекта:

server {
    listen 80;
    server_name my-domain.com www.my-domain.com;
    root /var/www/project/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Разберем ключевые строки, чтобы вы понимали, как это работает:

  • listen 80; — сервер слушает стандартный порт для незашифрованного HTTP-трафика.
  • server_name — доменные имена, на которые должен реагировать этот блок настроек.
  • root /var/www/project/public; — Критически важный параметр! Мы указываем Nginx, что корневой папкой сайта является директория public, а не корень проекта. Это защищает ваши конфигурационные файлы (например, .env с паролями) от скачивания злоумышленниками.
  • try_files $uri $uri/ /index.php?$query_string; — сердце маршрутизации Laravel. Nginx сначала пытается найти реальный файл (например, картинку). Если файла нет, он не выдает ошибку 404, а перенаправляет весь запрос в файл index.php, где за дело берется сам фреймворк.
  • fastcgi_pass unix:/var/run/php/php8.3-fpm.sock; — Nginx сам не умеет выполнять PHP-код. Этой строкой он передает скрипты специальному переводчику — службе PHP-FPM версии 8.3.

Сохраните файл и закройте редактор (в nano это Ctrl+O, Enter, Ctrl+X).

Шаг 2: Активация конфигурации

Теперь нам нужно «включить» этот сайт, создав символическую ссылку (аналог ярлыка в Windows) из папки sites-available в папку sites-enabled.

Выполните команду:

sudo ln -s /etc/nginx/sites-available/my-domain.com /etc/nginx/sites-enabled/

По умолчанию Nginx включает тестовую страницу-заглушку. Чтобы она не мешала, удалим ее ярлык:

sudo rm /etc/nginx/sites-enabled/default

Перед тем как перезапускать веб-сервер, всегда проверяйте конфигурацию на наличие синтаксических ошибок (пропущенная точка с запятой может «уронить» все сайты на сервере):

sudo nginx -t

Если вы видите сообщение «nginx: configuration file /etc/nginx/nginx.conf test is successful», значит всё написано верно. Применяем настройки:

sudo systemctl restart nginx

Теперь, если вы перейдете по вашему домену в браузере, вы должны увидеть работающее приложение Laravel. Но в адресной строке будет написано «Не защищено».

Шаг 3: Переход на светлую сторону (HTTPS)

Работа сайта по протоколу HTTP означает, что все данные между пользователем и сервером (включая пароли при авторизации) передаются в открытом виде. Любой узел связи на пути сигнала может их прочитать.

Для шифрования трафика используется протокол HTTPS, который требует наличия SSL-сертификата. Раньше сертификаты стоили дорого и их установка была мучением. Сегодня существует некоммерческий удостоверяющий центр Let's Encrypt, который выдает надежные сертификаты абсолютно бесплатно.

Для автоматизации процесса получения и установки сертификата мы будем использовать утилиту Certbot.

Установим сам Certbot и его плагин для Nginx:

sudo apt install -y certbot python3-certbot-nginx

Запускаем процесс получения сертификата. Certbot сам прочитает ваши конфигурационные файлы Nginx, найдет там директиву server_name и предложит выпустить для нее сертификат:

sudo certbot --nginx -d my-domain.com -d www.my-domain.com

При первом запуске Certbot попросит вас:

  1. Указать email-адрес (на него придут уведомления, если сертификат забудет обновиться).
  2. Согласиться с условиями использования (введите Y).
  3. Отказаться или согласиться на рассылку новостей (введите N).

После этого Certbot свяжется с серверами Let's Encrypt, подтвердит, что вы действительно владеете этим доменом (сервер Let's Encrypt сделает тестовый запрос на ваш IP), скачает криптографические ключи и самостоятельно изменит ваш конфигурационный файл Nginx.

Он добавит туда настройки для прослушивания порта 443 (стандарт для HTTPS) и пропишет пути к скачанным ключам шифрования. Также он настроит автоматическое перенаправление (редирект) всех пользователей с небезопасного HTTP на безопасный HTTPS.

Сертификаты Let's Encrypt выдаются на 90 дней. Но вам не придется обновлять их вручную. При установке Certbot автоматически добавил системный таймер, который будет проверять срок действия сертификатов дважды в день и обновлять их за 30 дней до истечения срока.

Убедиться, что таймер автообновления работает, можно командой:

sudo systemctl status certbot.timer

Ваш проект успешно развернут! Вы прошли путь от «голого» Linux-сервера до полноценной, защищенной и оптимизированной рабочей среды. Теперь ваше приложение на базе Laravel готово принимать реальных пользователей со всего мира, обеспечивая им высокую скорость работы и безопасность данных.