Содержание
- Предыстория
-
Установка проектов на примере inline-ltd
2.1. Скачивание сайта по SSH
2.2. Установка на локалку
2.2.1. Настройка Nginx в m16
2.2.2. Обновление конфигурации в проектах
2.3. Установка на stage
2.3.1. Настройка Nginx в stage
2.3.2. Обновление конфигурации в проектах stage
2.4. Установка на prod - Заключение
Предыстория
На этот пост меня надтолкнул одна задача, над которой я занимался ранее.
Здесь представлен тот алгоритм по которому я устанавливал сайт inline-ltd.
Если этот пост будет кому то полезен, я буду только рад залить его в основую Wiki проекта /m16
Установка проектов на примере inline-ltd
Начну с того, что сайт inline-ltd.ru - является одностраничным ленгингом и не содержит php
файлов и для этого нам не потребуется в файлах nginx добавлять множество дополнительных строчек.
И так, приступим.
Скачивание сайта по SSH.
В моем примере, сайт уже хронится в каталоге prode сервера. И мне остается лишь скачать сайт с сервера и переместить в папку ./m16all
.
На всякий случай лучше просмотреть, где находится сайт - это может пригодиться в следующем шаге. У меня все было примерно как на рисунке 1.
И вот, зная где находится сам сайт в пустом терминале пользуемся слудующей командой:
scp -r -P 2223 [ваш_логин]@meatinfo.ru:/[место_где_находится_сайт]/ /[место_где_будет_находиться_сайт]
где параметр:
-r - отвечает за то, что будет выгружена вся папка,
-P - указывает, что выгрузка с нестандартного порта.
Если команда была введена правильно, то ситуация будет примерно как на рисунке 2. Инчае бывает, что выводится сообщение Permission denied - в этом случае можно попробовать ввести вместо логина root.
Пример: scp -r -P 2223 root@meatinfo.ru:
Рис.2 - Копирование сайта через SSH на локальную машину.
Ну если решение выше не устроило то, можно попробовать следующее...
1. Качаем FileZilla-
Добавляем новый сайт
-
Выбираем протокол SFTP
-
Заполняем данные
-
Смотрим где находится наша папка на сервере
-
Заходим как обычно через SSH на сервер и копируем сайт к себе в папку
-
После чего, с помощю FileZilla, скачиваем к себе на локалку.
Установка на локалку
После того как сайт был скачен на локальный компьютер - нужно переместить его в папку ./m16all
.
Пример на рисунке 3.
Рис.3 - Выгруженный сайт включили ко всем проектам
Далее, нужно настроить Nginx в m16, stage и prod.
Настройка Nginx в m16
Для этого необходимо перейти в дирректорию m16/configurations/m16/nginx/sites-available
и создать файл [название сайта].local.conf
. В нем будет прописанные следующие обязательные поля:
- listen - порт
- root - корневая папка проекта
- index - сам индексный файл
- server_name - домен на который будет совершено подключение
Хочу обратить внимание, что помимоinline-ltd.ru
, был еще подключенinline-ltd.m16
. Это нужно, для того чтобы на локальном компьютере зайти на сайт через браузер. - ssl_certificate [если имеется] - данные о сертификате.
Сертифика дляm16
,stage
иprod
- разные сертификаты и если их нет, то лучше не указывать. Иначе, можно их попробовать создать самостоятельно, использую Certbot.
server {
listen 80;
root /var/www/inline-ltd.ru;
# Add index.php to the list if you are using PHP
index index.html;
server_name inline-ltd.ru inline-ltd.m16;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# listen 443 ssl; # managed by Certbot
# ssl_certificate /etc/letsencrypt/live/inline-ltd.ru/fullchain.pem; # managed by Certbot
# ssl_certificate_key /etc/letsencrypt/live/inline-ltd.ru/privkey.pem; # managed by Certbot
# include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
# ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
Пример конфига для m16
Обновление конфигурации в проектах
Данная документация уже есть и в самом проекте, но здесь отражена с некоторыми уточнениями. Ссылка на первоисточник.
Чтобы в строке браузера увидеть новый проект m16
, необходимо обновить конфигурацию. Выполняется это следующим образом.
- Заходим в контейнер.
- Выполняем следующиую команду для локального сервера
sudo bash /var/www/m16/scripts/bash/updateConfigs.sh m16
После этого проект будет добавлен в sites-available
и будет создана ссылка в sites-enabled
.
На данный момент ссылка автоматически не создается, по этому пришлось использовать следующи метод.
Если это не произошло, то выполняем следующий скрипт:
ln -s /etc/nginx/sites-available/[название_сайта].local.conf /etc/nginx/sites-enabled/
После чего проверяем командой на ошибки:
nginx -t
И перезагружаем Nginx:
nginx -s reload
После чего сайт будет запущен на локальном компьютере. Пример работы на рисунке 4.
Рис.4 - Пример выполнения сайта на локалке.
Установка на stage
Для того, чтобы проект заработал на stage, нужно пройти ту же последовательность, тольно немного иначе. Основыне изменения:
- добавить файл
rsync_exclude.txt
- добавить изменения в
.gitlab-ci.yml
И так к сути дела..
Настройка Nginx в stage
Настройка в m16, stage и prod - практически не отличается, но есть малое отличие:
Параметр:
server_name inline-ltd.ru inline-ltd.a505.ru;
Так же, можно просто скопировать файл с m16
и перекинуть его в a505
. Я использовал такой же конфиг, что и в "Настройка Nginx в m16" (естественно измененный).
Обновление конфигурации в проектах stage
На локалке:
Если в нутри сайта нет файла rsync_exclude.txt
, то необходимо создать его.
В нем будут хрониться название файлов и папок, которые не нужно будет синхронизировать. Т.е. если сервер видит этот файл, то сразу же удаляет.
В моем случае, файл содержал слудющию информацию:
backups/
log/
tmp/
key.txt
rsync_exclude.txt
Далее, переходим к файлу .gitlab-ci.yml
.
Данный файл отвечает за то, как будет происходить деплой на сервере.
Есть два варианта его редактирования. Первый, самый простой (подойдет не для всех сайтов):
Создаем в папке с сайтом папку script/
и в ней создаем файл deploy.php
.
Данный файл можно либо найти в проектах m16
, либо скопировать у меня. Код будет представлен ниже.
#!/usr/bin/php
<?php
$deployIni = parse_ini_file(dirname(__DIR__) . '/deploy.ini', true);
if (! in_array($argv[1] ?? '', ['stage', 'production'])) {
die("Параметр должен указывать окружение: stage или production\n");
}
$deployEnv = $argv[1]; // production | stage
if (!isset($deployIni[$deployEnv]['host'])) {
die("Ошибка: не найдена секция [production] и настройка host в ней!\n");
}
//сервер, где размещен сайт
$host = $deployIni[$deployEnv]['host'];
$port = $deployIni[$deployEnv]['port'];
//имя пользователя
$user = $deployIni[$deployEnv]['user'];
//путь к проекту на сервере $host
$path = $deployIni[$deployEnv]['dir'];
$backupDir = $deployIni[$deployEnv]['backup_dir'];
$sshKey = $deployIni[$deployEnv]['sshKey'];
//настройки синхронихатора rsync: (man rsync)
//$rsyncOptions = " -e 'ssh -p{$port} -i key.txt -o StrictHostKeyChecking=no' -hrtzvcC --links";
//$rsyncOptions .= " --itemize-changes --include 'core' --include 'tags' --force --delete";
//$rsyncOptions .= " --exclude-from=rsync_exclude.txt --chmod=Dg+sxw,Fug+rw,o-rwx";
//$rsyncOptions .= " --backup --backup-dir=$backupDir"; //изменяемые файлы сохраняются в папке backups/
$rsyncOptions = " -e 'ssh -p{$port} -i {$sshKey} -o StrictHostKeyChecking=no'";
$rsyncOptions .= " -rzvcC --include \"core\" --include \"tags\" --force --delete -i"; // --dry-run
$rsyncOptions .= " --chmod=Dg+sxw,Fug+rw,o-rwx --exclude-from=rsync_exclude.txt";
$rsyncOptions .= " --backup --backup-dir=$backupDir"; //изменяемые файлы сохраняются в папке backups/
echo "Deploy!\n";
$emailerDir = getcwd();
$aetoolbox_dir = dirname($emailerDir) . '/m16/lib';
$m16dir = dirname($emailerDir) . '/m16';
//Изменение конфигов
echo "Изменение файла: (" . getcwd() . "/config.ini)\n";
$config = file_get_contents("./config.ini");
$config = str_replace("production = 0", "production = 1", $config);
$config = str_replace("users_host = users.inline-ltd.m16", "users_host = users.inline-ltd.ru", $config);
$saveConfig = $config;
$config = "
[Site]
; РАБОЧИЕ ДИРЕКТОРИИ
site_root = $emailerDir
m16dir = $m16dir
aetoolbox_dir = $aetoolbox_dir
";
file_put_contents('./config.ini', $config);
echo "Директория: $emailerDir\n";
echo "$aetoolbox_dir\n";
echo "$m16dir\n";
// == Синхронизация файлов ==
echo "Синхронизация файлов: (" . getcwd() . ")\n";
$cmd = "rsync $rsyncOptions ./ {$user}@{$host}:{$path}";
echo "$cmd\n";
system($cmd, $retVal);
exit($retVal);
Так же для этого файла нужны будут файл deploy.ini
в корне сайта. Так же, может быть файл config.ini
- для указания базы данных и рабочих директорий.
Пример, на рис
унке 5.
Файл deploy.ini
:
[stage]
host = 93.189.150.166
port = 2223
user = m16
dir = /var/www/inline-ltd.ru
backup_dir = /var/www/inline-ltd.ru/backups
sshKey = ../key.txt
После чего следуем алгоритму:
- Переходим в контейнер
- Идем далее в каталог сайта (именно в новую папку
script/
) - Пишим в консоль следующий скрипт:
php deploy.php stage
- И копируем команду которую выведит скрипт в файл
.gitlab-ci.yml
Рис.7 - Пример новой записи в .gitlab-ci.yml
Далее удаляем папку script/
, а так же новые файлы:
deploy.php
, deploy.ini
и config.ini
.
Второй способ - это правильно настроить все файлы так, чтобы происходило подключение к базе данных, а так же
И после этого отправляем все на тестирование в stage
, но не все так просто. Нужно повторить ту же процедуру что и на локалке но уже на stage.
Установка на prod
После выполнения всех выше перечисленных пунктов, остается сделать всего одно действие. Добавить конфиг в SSL сертификат.
Для этого повторяем ту же процедуру, но уже в папке ./ru
.
Но при этом, если на сервере уже есть SSL сертификаты для данного сайта, то указываем их в ./inline-ltd.ru.conf
.
После чего, повторяем процедуру с "Обновление конфигурации в проектах stage", но уже для prod.
Заключение
Все выше перечисленные действия на самом деле не очень сложные, но требуют очень много времени.
Так же, при развертываниие может и слететь SSL сертификат, нужно быть к этому готовым.
Ну, а кто смог дойти до конца, прошу к комментариям и если возникнут вопросы, готов к дискусиям @imaev_azat.