Развертывание 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).

1. Подготовка облачного сервера: аренда, базовая безопасность и настройка 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 для высокой скорости чтения/записи)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Нам нужно разрешить всего три типа подключений: * Порт 22 — для управления сервером по SSH. * Порт 80 — для обычного веб-трафика (HTTP). * Порт 443 — для защищенного веб-трафика (HTTPS).

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

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

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

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

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

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

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

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

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

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

  • PermitRootLogin no (запрещает вход суперпользователю).
  • PasswordAuthentication no (запрещает вход по паролю для всех).
  • Чтобы сохранить изменения в редакторе nano, нажмите Ctrl+O, затем Enter, а для выхода — Ctrl+X.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    !Схема взаимодействия компонентов веб-сервера: как запрос пользователя проходит через Nginx к PHP и базе данных.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    !Схема взаимодействия Laravel и базы данных

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

    Разберем каждую строку: * 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, выполните в папке проекта команду:

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

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

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

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

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

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

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

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

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

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

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

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

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

    !Схема процесса переноса кода: от локального компьютера через GitHub на VPS-сервер

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Поскольку мы клонировали проект через sudo, владельцем файлов стал суперпользователь root. Это вызовет проблемы в дальнейшем. Передадим права на файлы нашему текущему пользователю (в команде ниже USER:$USER . bash composer install --optimize-autoloader --no-dev bash cp .env.example .env bash nano .env bash php artisan key:generate bash sudo chown -R www-data:www-data storage bootstrap/cache sudo chmod -R 775 storage bootstrap/cache bash sudo apt install -y nodejs npm bash npm install bash npm run build bash php artisan migrate --force `

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

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

    5. Настройка веб-сервера и запуск: конфигурация 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

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

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

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

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

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

    * listen 80; — сервер слушает стандартный порт для незашифрованного HTTP-трафика. * server_name — доменные имена, на которые должен реагировать этот блок настроек. * root /var/www/project/public;Критически важный параметр! Мы указываем Nginx, что корневой папкой сайта является директория public, а не корень проекта. Это защищает ваши конфигурационные файлы (например, .env с паролями) от скачивания злоумышленниками. * try_files 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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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