С недавних пор, сделал волевое решение расширить кругозор и потихоньку уйти от CMS Drupal 7/8 на PHP-фреймворк. Выбор пал на Laravel 5. В обнимку с Laracast, уже получилось разобраться и создать свой скромный демо-проектик на этом замечательном фреймворке.
Буду признателен за мануал, советы или готовый кейс по этому вопросу!
- Похожие вопросы
- Настройка ispmanager для Bitrix на php 8
- Word Press не работает в режиме PHP fpm
- Configuring a Firewall
- Laravel Post-deployment Optimizations
- Deploying Code on the Server
- Installing PHP
- Установка Composer
- Развертывание кода с помощью Git
- Автоматизация этапов после развертывания
- Устанавливаем VirtualBox
- Настраиваем Laravel
- Устанавливаем Laravel
- Configuring a Domain Name With HTTPS
- Provisioning a New Ubuntu Server
- Создание новых ключей SSH
- Инициализация нового VPS
- Устанавливаем Vagrant
- Установка и настройка NGINX
- Настройка разрешений каталога
- Настройка Laravel Horizon
- Кодекс проекта и план развертывания
- Настраиваем Усадьбу под проект
- Разворот Усадьба
- Установка и настройка MySQL
- Устанавливаем git
- Выполнение базовой настройки
Похожие вопросы
Необходимо сделать изменения на сайте, сайт написан на cms drupal. При установке cms на сайт предупреждает об удалении данных в файле public_html. подскажите что мне делать.
Настройка ispmanager для Bitrix на php 8
Подскажите кто сталкивался — и как оптимально нстроить среду для правильной работы битрикса.
Word Press не работает в режиме PHP fpm
Developing modern full-stack web applications has become much easier thanks to Laravel but deploying them on a real server is another story.
There are just so many options.
PaaS like Heroku or AWS Elastic Beanstalk strikes a good balance between ease of usage and control, but they can be expensive at times. A standard 1x dyno from Heroku, for example, costs $25 per month and comes with only 512MB of RAM.
Unmanaged virtual private servers are affordable and provide a lot of control on the server. You can avail a server with 2GB of RAM, 20GB of SSD space, and 2TB of transfer bandwidth, costing only $15 per month.
Now the problem with unmanaged virtual private servers is that they are unmanaged. You’ll be responsible for installing all necessary software, configuring them, and keeping them updated.
In this article, I’ll guide you step-by-step in the process of how to deploy a Laravel project on an unmanaged virtual private server (we’ll refer to it as VPS from now on). If you want to check out the benefits of the framework first, go ahead and get an answer to the question of why use the Laravel framework. If you are ready, without any further ado, let’s jump in.
Configuring a Firewall
Having a properly configured firewall is very important for the security of your server. In this article, I’ll show you how you can configure the popular UFW program.
sudo ufw default deny incoming
sudo ufw default allow outgoing
Port 80, used for HTTP traffic.
Port 443, used for HTTPS traffic.
Port 22, used for SSH traffic.
sudo ufw allow http
sudo ufw allow https
sudo ufw allow ssh
sudo ufw enable
That’s pretty much it. Your server now only allows HTTP, HTTPS, and SSH traffic coming from the outside, making your server a bit more secure.
Laravel Post-deployment Optimizations
Your application is now almost ready to accept requests from all over the world. One last step that I would like to suggest is caching the Laravel configuration, views, and routes for better performance.
php artisan config:cache
php artisan route:cache
php artisan view:cache
Now, on every deployment, the caches will be cleared and renewed automatically. Also, make sure to set the APP_ENV to production and APP_DEBUG to false inside the env file. Otherwise, you may unintentionally compromise sensitive information regarding your server.
Deploying Code on the Server
After completing the basic setups, the next thing you’ll tackle is deploying code on the server. I’ve seen people cloning the repository somewhere on the production server and logging into the server to perform a pull whenever there are some new changes to the code.
There is a much better way of doing this. Instead of logging into the server to perform a pull, you can use the server itself as a repository and push code directly to the server. You can also automate the post-deployment steps like installing dependencies, running the migrations, and so on, which will make the Laravel deploy to server an effortless action. But before doing all these, you’ll first have to install PHP and Composer on the server.
Installing PHP
sudo apt install php7.4-fpm php7.4-bcmath php7.4-json php7.4-mbstring php7.4-xml -y
sudo apt install php7.4-mysql php7.4-pgsql php7.4-sqlite3 -y
sudo apt install php7.4-redis
Apart from these packages, you’ll also need php-curl, php-zip, zip, unzip, and curl utilities.
sudo apt install zip unzip php7.4-zip curl php7.4-curl -y
The question bank project uses MySQL as its database system and Redis for caching and running queues, so you’ll have to install the php7.4-mysql and the php7.4-redis packages.
В зависимости от проекта вам может потребоваться установить больше пакетов PHP. Например, проекты, работающие с изображениями, обычно зависят от пакета php-gd. Кроме того, вам не нужно указывать версию PHP с каждым именем пакета. Если вы не укажете номер версии, APT автоматически установит последнюю версию.
На момент написания этой статьи PHP 7.4 был последним в репозиториях пакетов Ubuntu, но, учитывая, что для проекта доски вопросов требуется PHP 7.4, а PHP 8 может стать по умолчанию в будущем, я указал номер версии в Эта статья.
Установка Composer
php -r «copy(‘https://getcomposer.org/installer’, ‘composer-setup.php’);»
sudo php composer-setup.php —install-dir /usr/local/bin —filename composer
php -r «отключить(‘композитор-setup.php’);»
Теперь, когда вы установили PHP и Composer на свой сервер, вы готовы настроить автоматическое развертывание вашего кода.
Развертывание кода с помощью Git
mkdir -p /home/nonroot/repo/question-board.git
Опция -p команды mkdir создаст любой несуществующий родительский репозиторий. Затем перейдите во вновь созданный каталог и инициализируйте новый голый репозиторий git.
cd /home/nonroot/repo/question-board.git
git init —bare
Bare — это то же самое, что и обычный репозиторий git, за исключением того, что у него нет рабочего дерева. Практическое использование такого репозитория git — это удаленный источник. Не волнуйтесь, если вы не понимаете, что я только что сказал. Все прояснится, если вы продолжите.
Предполагая, что вы все еще находитесь в каталоге /home/nonroot/repo/question-board.git, перейдите в подкаталог hooks и создайте новый файл с именем post-receive.
крючки для компакт-дисков
сенсорный после получения
Файлы в этом каталоге являются обычными сценариями оболочки, которые git вызывает, когда в репозитории происходит какое-то важное событие. Всякий раз, когда вы отправляете какой-либо код, git будет ждать, пока весь код не будет получен, а затем вызывать сценарий после получения.
sudo touch /sbin/deploy
sudo nano /sbin/deploy
#!/bin/sh
git —work-tree=/srv/question-board —git-dir=/home/nonroot/repo/question-board.git checkout -f
Судя по строке #!/bin/sh, это сценарий оболочки. После этой строки единственная строка кода в этом скрипте копирует содержимое репозитория /home/nonroot/repo/question-board.git в каталог /srv/question-board.
Здесь параметр —work-tree указывает каталог назначения, а параметр —git-dir указывает исходный репозиторий. Мне нравится использовать каталог /srv для хранения файлов, обслуживаемых этим сервером. Если вы хотите использовать каталог /var/www, продолжайте.
sudo chmod +x после получения
sudo mkdir /srv/доска вопросов
Теперь у вас есть правильный каталог рабочего дерева, пустой репозиторий и пост-хук, который, в свою очередь, вызывает сценарий /sbin/deploy с помощью sudo. Но как хук post-receive вызовет скрипт /sbin/deploy, используя sudo без пароля?
без полномочий root ALL=NOPASSWD: /sbin/deploy
мастер производства git push
Автоматизация этапов после развертывания
Поздравляем, вы можете развернуть проект Laravel напрямую на сервере, но достаточно ли этого? Как насчет шагов после развертывания? Такие задачи, как установка или обновление зависимостей, миграция базы данных, кэширование представлений, конфигураций и маршрутов, перезапуск воркеров и так далее.
Честно говоря, автоматизировать эти задачи намного проще, чем вы думаете. Все, что вам нужно сделать, это создать сценарий, который сделает все это за вас, установить некоторые разрешения и вызвать этот сценарий из хука post-receive.
Создайте еще один сценарий с именем post-deploy внутри каталога /sbin. После создания файла откройте его в текстовом редакторе nano.
sudo touch /sbin/post-deploy
sudo nano /sbin/post-deploy
Первая строка изменяет рабочий каталог на каталог /srv/question-board. Вторая строка создает копию файла .env.example. Параметр -n гарантирует, что команда cp не переопределит ранее существующий файл.
sudo chmod +x /sbin/post-deploy
Убедитесь, что вы вызываете сценарий после развертывания после вызова сценария развертывания. Сохраните файл, нажав Ctrl + O, и выйдите из nano, нажав комбинацию клавиш Ctrl + K.
без полномочий root ALL=NOPASSWD: /sbin/deploy, /sbin/post-deploy
Сохраните файл, нажав Ctrl+O, и выйдите из nano, нажав комбинацию клавиш Ctrl+K. При необходимости вы можете добавить в этот сценарий дополнительные шаги после развертывания.
Чтобы протестировать новый сценарий после развертывания, внесите некоторые изменения в свой код, зафиксируйте изменения и отправьте их в основную ветку производства. This time you’ll see composer packages installation progress on the terminal and outputs from other artisan calls.
sudo php artisan key:generate
If you look at the content of the .env file using the nano text editor, you’ll see the APP_KEY value populated with a long string.
Устанавливаем VirtualBox
sudo nano /etc/apt/sources.list
Вставляем в него строчку:
deb http://download.virtualbox.org/virtualbox/debian xenial contrib
sudo apt-get update
sudo apt-get install virtualbox-5.2
sudo apt-get install dkms
Если требуются пакеты libpng12-0 и libvpx3, скачиваем их и устанавливаем как deb-пакеты.
Настраиваем Laravel
Главное, что нужно помнить: главным всегда считается то, что лежит внутри нашей виртуальной машины. Файлы, которые лежат в локальной папке, служат только для работы с СОБСТВЕННЫМ кодом, синхронизации его с кодом в виртуалке и отправки его в репозиторий. Использовать Composer локально — ЗАПРЕЩЕНО.
Поднимаем виртуальную машину и заходим в нее:
Заходим в папку с файлами проекта, создаем в ней файл .env:
codeproject-name .env
И прописываем в него следующее содержимое:
В секции DB_ установите РЕАЛЬНЫЕ параметры.
Устанавливаем имя проекту (не просто устанавливаем строчку в title, а переименовываем корневой namespace!) и генерируем новый ключ доступа:
И напоследок нужно проверить, что веб-служба может писать в директории bootstrap/cache и storage.
Проделанных манипуляций вполне будет достаточно, чтобы по адресу http://project-name.local мы увидели приветственную надпись Laravel крупными буквами.
Устанавливаем Laravel
Поскольку в образе виртуальной машины пока еще нет самого Laravel — устанавливаем его.
Устанавливаем Laravel (Composer стоит по умолчанию и прописан в PATH):
composer create-project —prefer-dist laravel/laravel project-name
Выходим из виртуалки и перезагружаем ее:
vagrant reload —provision
Теперь файлы в вашей папке ~/Projects/project-name автоматически синхронизируются с файлами в виртуальной машине, а сайт доступен по адресу http://project-name.local
Однако! Laravel пока будет отдавать страницу ошибки, поскольку Laravel еще не настроен.
Configuring a Domain Name With HTTPS
For this step to work, you’ll have to own a custom domain name of your own. I’ll use the questionboard.farhan.dev domain name for this demonstration.
Log into your domain name provider of choice and go to the DNS settings for your domain name. Whenever you want a domain name to point to a server’s IP address, you need to create a DNS record of type A.
Type: A Record
Now go back to your server and open the /etc/nginx/sites-available/questionboard config file using the nano text editor. Remove the IP address from the server_name directive and write your domain name. Do not put HTTP or HTTPS at the beginning.
sudo nginx -s reload
Now you can visit your application using your domain name instead of the server’s IP address. To enable HTTPS on your application, you can use the certbot program.
sudo snap install —classic certbot
sudo certbot —nginx
First, the program will ask for your email address. Next, it’ll ask if you agree with the terms and agreements or not.
Then, It’ll ask you about sharing your email address with the Electronic Frontier Foundation.
In the third step, the program will read the NGINX configuration file and extract the domain names from the server_name directive. Look at the domain names it shows and press enter if they are all correct. After deploying the new certificate, the program will congratulate you, and now you’ve got free HTTPS protection for 90 days.
sudo certbot renew —dry-run
If the simulation succeeds, you’re good to go.
Provisioning a New Ubuntu Server
There are several VPS providers out there, such as DigitalOcean, Vultr, Linode, and Hetzner. Although working with an unmanaged VPS is more or less the same across providers, they don’t provide the same kind of services.
DigitalOcean, for example, provides managed database services. Linode and Vultr, on the other hand, don’t have such services. You don’t have to worry about these differences.
I’ll demonstrate only the unmanaged way of doing things. Таким образом, независимо от поставщика, которого вы используете, шаги должны быть идентичными.
Перед инициализацией нового сервера вам необходимо сгенерировать SSH-ключи.
Создание новых ключей SSH
Согласно Википедии — «Secure Shell (SSH) — это криптографический сетевой протокол для безопасной работы сетевых служб в незащищенной сети». Он позволяет подключаться к удаленному серверу с помощью пароля или пары ключей.
ssh-keygen -t rsa
Вы увидите несколько подсказок на терминале. Вы можете пройти через них, нажав Enter. Вам также не нужно ставить пароль. После того, как вы сгенерировали пару ключей, вы найдете файл с именем id_rsa.pub внутри каталога ~/.ssh/. Этот файл понадобится вам при подготовке нового VPS.
Инициализация нового VPS
Я уже говорил, что между поставщиками услуг VPS есть некоторые различия, поэтому, если вы хотите полностью соответствовать этой статье, используйте DigitalOcean.
Один виртуальный частный сервер в DigitalOcean известен как капля. В Vultr это называется экземпляром, а в Linode — линодом. Войдите в свой провайдер по выбору и создайте новый VPS. Используйте Ubuntu 20.04 LTS в качестве операционной системы.
В разделе SSH создайте новый ключ SSH. Скопируйте содержимое из файла ~/.ssh/id_rsa.pub и вставьте его как содержимое. Введите описательное имя для ключа и сохраните.
Остальные параметры можно не трогать. Большинство провайдеров поставляются с автоматическим сервисом резервного копирования. Для этой демонстрации оставьте этот параметр отключенным. Но в реальном сценарии это может спасти жизнь. После завершения процесса вы будете готовы подключиться к новому серверу с помощью SSH.
Устанавливаем Vagrant
sudo dpkg -i vagrant_2.1.2_x86_64.deb
Комьюнити теперь в Телеграм
Подпишитесь и будьте в курсе последних IT-новостей
Установка и настройка NGINX
Теперь, когда вы успешно отправили исходный код на сервер, следующим шагом будет установка веб-сервера и его настройка для обслуживания вашего приложения. В статье я буду использовать NGINX. Если вы хотите использовать что-то еще, например Apache, вы будете предоставлены сами себе.
Эта статья будет строго посвящена настройке веб-сервера для обслуживания приложения Laravel и не будет подробно обсуждать вещи, связанные с NGINX. N GINX сам по себе является очень сложным программным обеспечением, и если вы хотите изучить NGINX с нуля, Руководство по NGINX — это надежный ресурс.
sudo apt install nginx -y
статус sudo systemctl nginx

Вы можете восстановить контроль над терминалом, нажав q на клавиатуре. Теперь, когда NGINX запущен, вы должны увидеть страницу приветствия NGINX по умолчанию, если вы посещаете IP-адрес сервера.

Вам придется изменить конфигурацию NGINX, чтобы вместо этого обслуживать ваше приложение Laravel. Для этого создайте новый файл /etc/nginx/sites-available/question-board и откройте его с помощью текстового редактора nano.
sudo touch /etc/nginx/sites-available/quest-board
sudo nano /etc/nginx/sites-available/quest-board
Вам не нужно вносить никаких изменений в этот код, кроме первых двух строк. Убедитесь, что вы используете IP-адрес вашего сервера в качестве имени_сервера, а корень указывает на правильный каталог. Вы замените этот IP-адрес доменным именем в следующем разделе.
Если вы перейдете в каталог /etc/nginx и выведете список содержимого с помощью команды ls, вы увидите две папки с именами «сайты-доступны» и «сайты-включены».
В папке «сайты доступны» хранятся все различные файлы конфигурации, обслуживающие приложения (да, их может быть несколько) с этого сервера.
sudo ln -s /etc/nginx/sites-available/question-board /etc/nginx/sites-enabled/question-board
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
Если вы посетите IP-адрес вашего сервера, вы увидите, что NGINX правильно обслуживает ваше приложение, но приложение выдает внутреннюю ошибку сервера 500.

Настройка разрешений каталога
sudo chown -R :www-data /srv/question-board
sudo chmod -R 775 /srv/question-board/storage
sudo chmod -R 775 /srv/question-board/bootstrap/cache
Если вы сейчас вернетесь к IP-адресу сервера и обновите его, то увидите, что приложение работает нормально.
Настройка Laravel Horizon
Проект доски вопросов поставляется с предварительно установленным и настроенным Laravel Horizon. Теперь, когда Redis запущен и работает, вы готовы приступить к обработке заданий.
sudo apt install supervisor -y
Файлы конфигурации супервизора находятся в каталоге вашего сервера /etc/supervisor/conf.d. Создайте новый файл /etc/supervisor/conf.d/horizon.conf и откройте его с помощью текстового редактора nano:
sudo touch /etc/supervisor/conf.d/horizon.conf
sudo /etc/supervisor/conf.d/horizon.conf
перечитать sudo supervisorctl
обновление sudo supervisorctl
sudo supervisorctl стартовый горизонт
Одна вещь, которая застает многих людей врасплох, заключается в том, что если вы внесете изменения в свои задания, вам придется перезапустить Laravel Horizon, чтобы прочитать эти изменения. Я рекомендую добавить строку в сценарий /sbin/post-deploy, чтобы повторно инициировать процесс Laravel Horizon при каждом развертывании.
горизонт перезапуска sudo supervisorctl
Эта команда остановит и перезапустит процесс Laravel Horizon при каждом развертывании.
Кодекс проекта и план развертывания

Исходный код проекта доступен в репозитории https://github.com/fhsinchy/guide-to-deploying-laravel-on-vps. Сделайте форк этого репозитория и клонируйте его на свой локальный компьютер.
Когда у вас есть копия проекта на вашем компьютере, вы готовы начать процесс развертывания Laravel. Вы начнете с подготовки нового VPS и настройки способа передачи источника с локального компьютера на сервер.
Настраиваем Усадьбу под проект
Открываем файл Homestead/Homestead.yaml и меняем его содержимое на:
— карта: название проекта.local
После чего исчезла в etc/hosts следующую строчку:
Разворот Усадьба
бродячий ящик добавить laravel/homestead
Необходимо выбрать пункт 2, после чего можно скачать коробку размером около 1 ГБ. После того как коробка скачается:
git clone https://github.com/laravel/homestead.git Homestead
Установка и настройка MySQL
sudo apt install mysql-server -y
mysql -u корень
СОЗДАТЬ БАЗА ДАННЫХ question_board;
В этом коде question_board.* означает все таблицы базы данных question_board. Наконец, выйдите из клиента MySQL, выполнив команду q, и выйдите из корневой оболочки, вызвав команду выхода.
mysql -u без полномочий root -p
Теперь, когда у вас есть работающий сервер базы данных, пришло время настроить проект доски вопросов, чтобы использовать его. Сначала перейдите в каталог /srv/question-board и откройте файл env с помощью текстового редактора nano:
cd /srv/доска вопросов
судо нано .env
php artisan migrate —force
Параметр —force подавляет предупреждение мастера о выполнении миграций в производственной среде. В отличие от миграции, сидер должен запускаться только один раз. Если вы добавите новые сеялки в более поздние развертывания, вам придется запускать их вручную.
Устанавливаем git
Если еще не выбран:
sudo apt-get install git
Выполнение базовой настройки

rsync —archive —chown=nonroot:nonroot /root/.ssh /home/nonroot
sudo apt update && sudo apt upgrade -y && sudo apt dist-upgrade -y
Загрузка и установка обновлений займет несколько минут. Во время этого процесса, если вы видите экран под названием «Настройка openssh-сервера» с вопросом о некоторых изменениях файлов, выберите параметр «сохранить текущую установленную локальную версию» и нажмите клавишу ввода.


