Развертывание Laravel 8 с нулевым временем простоя (2 часть)

Доброго времени суток!
Мы продолжаем создание нашего «конвейера» непрерывного развертывания приложения Laravel.
Хочу сразу сказать, что во всех своих статьях я оставляю реферальные ссылки на сервисы, которые здесь фигурируют. Ваш переход по ним и регистрация — благодарность мне за труд, который я изложил здесь. Заранее спасибо 😉
Сегодня мы с Вами закажем облачный сервер, установим и настроим все самое необходимое для нас.
В качестве веб-сервера будем использовать Nginx, а в качестве СУБД — MySQL. Также, мы получим SSL сертификат и настроим его автоматический перевыпуск.
Этот урок будет весьма долгим и для кого то сложным, по этому, не будем затягивать и начнем!
Создание сервера
Как я говорил в первом уроке, буду использовать услуги компании Selectel.ru.Если вы планируете размещать проект для зарубежного сегмента пользователей, рекомендую использовать в качестве альтернативы воспользоваться услугами DigitalOcean.com. Суть у обоих провайдеров весьма схожа.
- Выбираем «Облачная платформа»
- Предпочтительный для Вас дата центр
- Создаем сервер

- Имя сервера, которое будет отображено в панели управления
- Тип и версия ОС (в моем случае это Ubuntu 20.04)
- Конфигурация сервера


- Выбираем размер диска
- ВАЖНО. Приватная подсеть + плавающий IP. Это необходимо для того, чтобы в будущем можно было подключить домен к нашему серверу и при этом у нас была приватная подсеть для возможного масштабирования в будущем
- Загружаем публичный SSH ключ (~/.ssh/id_rsa.pub)
- Подтверждаем создание сервера

В течении пары минут сервер будет создан.
Важно понимать, что у Вас может быть иная конфигурация сервера. Я выбрал самый минимальный вариант для демонстрации. Selectel позволяет очень гибко менять конфигурацию сервера. И здесь вы платите не за месяц, а за час работы сервера.
Это не срытая реклама сервиса. Я правда, искренне, рекомендую его. Он очень удобен!)

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

Подключение домена
Скажу сразу, что обновление DNS записей и соответственно доступ к Вашему сайту через домен, а не IP, может занять до 72 часов. Обычно, сервер становится доступен по домену в течении 6 часов.
Добавляем домен, следуя шагам ниже (домен указываете свой):

Далее нам необходимо «склеить» домен и сервер. Для этого нужно добавить NS запись типа A для нашего домена и домена с www.
- Повторяем действия указанные ниже
- Указываем плавающий IP своего сервера
- Сохраняем запись
- Проделываем ту же операцию, но в «Имя записи» указываем www

Итого, у нас должно появится 2 новые записи типа A:

Настройка сервера
Давайте попробуем подключиться к нашему серверу. Для этого, в терминале вашей ОС прописываем
ssh root@плавающий_ip_вашего_сервера
Если вы все сделали правильно, Вам зададут вопрос, на который следует написать yes и нажать клавишу ввод.
Я надеюсь Вы добавили публичный SSH ключ при создании сервера и по этому, у вас не запросит пароль и сразу впустит на сервер 🙂

Установка NGINX
Обновляем все пакеты сервера:
apt update
Устанавливаем NGINX:
apt install nginx
Активируем автозапуск сервера:
systemctl enable nginx
Проверяем, выполнив следующую команду. Если ответ enabled — все отлично!
systemctl is-enabled nginx
Запускаем наш веб-сервер:
service nginx start
Проверяем статус (должен быть active):
service nginx status
Перейдя, по плавающему IP (в моем случае это 92.53.69.30), должны увидеть такую картину:

Давайте теперь настроим NGINX. Выполним команду, чтобы перейти в наш пакет:
cd /etc/nginx
Удалим тестовые конфиги сайтов:
rm -rf sites-available/* sites-enabled/*
Создадим свой конфиг. Для этого нам нужно выполнить следующую команду, в которой Вы замените домен сайта на свой (это очень важно).
vim sites-available/testmysite.pro
Содержимое конфига должно быть следующим. Замените в нем домен на свой и версию PHP также:
server {
server_name testmysite.pro www.testmysite.pro;
root /var/www/testmysite.pro/current/public;
index index.html index.htm index.php;
charset utf-8;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
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; }
access_log off;
error_log /var/log/nginx/testmysite.pro-error.log error;
error_page 404 /index.php;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_pass unix:/run/php/php8.0-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
Создадим символическую ссылку, выполнив следующий команды:
cd sites-enabled
ln -s ../sites-available/testmysite.pro testmysite.pro
Перезапустим наш NGINX и PHP-FPM:
service nginx restart
service php8.0-fpm reload
Установка MySQL
Теперь займемся установкой СУБД MySQL. Если у вас командная строка сейчас недоступна для записи, после предыдущей команды, нажмите один или два раза сочетание клавиш CTRL+C.
Выполним следующую команду:
sudo apt install mysql-server
Мы всегда подтверждаем установку пакетов вводом буквы «y«.
Далее установим сложность пароля командой:
sudo mysql_secure_installation
Далее вводим «y«. После, нужно выбрать сложность пароля, указав значение от 0 до 2. Для демонстрации, я укажу «0″, но рекомендую указывать как минимум «1″.
Далее указываем наш придуманный root пароль. После, подтверждаем его еще раз.
Все остальные вопросы установщика просто подтверждаем клавишей ENTER.
В конце, мы должны увидеть такую картину:

Проверить работу можно, выполнив команду:
sudo systemctl status mysql
Для начала войдем в оболочку, выполнив команду:
mysql -uroot -p
Создадим базу данных (название давайте свое):
CREATE DATABASE testmysite;
Создадим нового пользователя, выполнив следующие команды (имя и пароль указывайте свои):
# Создание пользователя.
CREATE USER 'testmysite'@'localhost' IDENTIFIED BY 'YOUR_PASSWORD';
# Даем все разрешения этому пользователю.
GRANT ALL PRIVILEGES ON *.* TO 'testmysite'@'localhost';
# Перезапускаем разрешения.
FLUSH PRIVILEGES;
Установка PHP
Я буду ставить 8 версию PHP. В вашем же случае, версия может быть иная. Выполняем следующие команды:
# Добавляем PHP репозиторий.
add-apt-repository -y ppa:ondrej/php
# Обновляем репозитории сервера.
apt update -y
# Устанавливаем PHP со всеми необходимыми зависимостями.
apt install -y php8.0 php8.0-common php8.0-gd php8.0-intl php8.0-zip php8.0-sqlite3 php8.0-mysql php8.0-fpm php8.0-mbstring php8.0-xml php8.0-curl php8.0-memcached unzip zip composer
Проверить версию PHP, после установки, можно, командой:
php -v
Установка NodeJS
Если для вашего проекта необходим NodeJS — установим его следующими командами:
# Обновляем репозитории сервера.
apt update -y
# Устанавливаем acl и npm.
apt install -y acl nodejs npm
Установка SSL сертификата
Выполняем следующие команды, заменив домен на свой:
certbot --nginx -d testmysite.pro —d www.testmysite.pro
Certbot обеспечивает автоматическое обновление ваших сертификатов с помощью задания CRON.
Запустите, certbot renew —dry-run чтобы убедиться, что CRON будет работать правильно в следующий раз, когда ему потребуется обновить сертификат.
Если все прошло хорошо, вы должны увидеть некоторые специальные строки, отмеченные как #managed by Certbot в вашем файле конфигурации Nginx:
cat /etc/nginx/sites-available/testmysite.pro
После выполнения действий выше, необходимо создать структуру папок, идентичной той, которую указали в конфиге NGINX. Домен разумеется заменить на свой:
mkdir /var/www/testmysite.pro/current/public
После, поместите туда файл с названием index.php, содержимое которого будет:
<?php
phpinfo();
После, перейдя на сайт, вы должны будете увидеть окно конфигурации PHP.
Это будет означать, что мы все сделали правильно!)
Самое сложное позади 😁.
В следующем эпизоде мы настроим инструмент Deployer.
Всем хорошего дня и адекватных заказчиков!