|
|
|
# Введение
|
|
|
|
|
|
|
|
1. [Предыстория](#предыстория)
|
|
|
|
2. [Установка проектов на примере inline-ltd](#установка-проектов-на-примере-inline-ltd)
|
|
|
|
2.1. [Скачивание сайта по SSH](#скачивание-сайта-по-ssh)
|
|
|
|
2.2. [Установка на локалку](#установка-на-локалку)
|
|
|
|
2.2.1. [Настройка Nginx в m16](#настройка-nginx-в-m16)
|
|
|
|
2.2.2. [Обновление конфигурации в проектах](#обновление-конфигурации-в-проектах)
|
|
|
|
2.3. [Установка на stage](#установка-на-stage)
|
|
|
|
2.3.1. [Настройка Nginx в stage](#настройка-nginx-в-stage)
|
|
|
|
2.3.2. [Обновление конфигурации в проектах stage](#обновление-конфигурации-в-проектах-stage)
|
|
|
|
2.4. [Установка на stage](#установка-на-prod)
|
|
|
|
3. [Заключение](#заключение)
|
|
|
|
|
|
|
|
## Предыстория
|
|
|
|
|
|
|
|
На этот пост меня надтолкнул одна [задача](http://lab.inline-ltd.ru/m16tech/m16all/-/merge_requests/3258), над которой я занимался ранее.:computer:
|
|
|
|
|
|
|
|
Здесь представлен тот алгоритм по которому я устанавливал сайт inline-ltd.
|
|
|
|
|
|
|
|
Если этот пост будет кому то полезен, я буду только рад залить его в основую Wiki проекта /m16
|
|
|
|
|
|
|
|
## Установка проектов на примере inline-ltd
|
|
|
|
Начну с того, что сайт [inline-ltd.ru](http://inline-ltd.ru/) - является одностраничным ленгингом и не содержит `php` файлов и для этого нам не потребуется в файлах nginx добавлять множество дополнительных строчек.
|
|
|
|
|
|
|
|
И так, приступим.
|
|
|
|
|
|
|
|
### Скачивание сайта по SSH.
|
|
|
|
В моем примере, сайт уже хронится в каталоге prode сервера. И мне остается лишь скачать сайт с сервера и переместить в папку `./m16all`.
|
|
|
|
|
|
|
|
На всякий случай лучше просмотреть, где находится сайт - это может пригодиться в следующем шаге. У меня все было примерно как на рисунке 1.
|
|
|
|
|
|
|
|
![изображение](uploads/304c79944ed16870cc411c04df675b23/изображение.png)
|
|
|
|
Рис.1 - Расположение папки
|
|
|
|
|
|
|
|
И вот, зная где находится сам сайт в пустом терминале пользуемся слудующей командой:
|
|
|
|
```cmd
|
|
|
|
scp -r -P 2223 [ваш_логин]@meatinfo.ru:/[место_где_находится_сайт]/ /[место_где_будет_находиться_сайт]
|
|
|
|
```
|
|
|
|
|
|
|
|
где параметр:
|
|
|
|
-r - отвечает за то, что будет выгружена вся папка,
|
|
|
|
-P - указывает, что выгрузка с нестандартного порта.
|
|
|
|
|
|
|
|
Если команда была введена правильно, то ситуация будет примерно как на рисунке 2. Инчае бывает, что выводится сообщение ***Permission denied*** - в этом случае можно попробовать ввести вместо логина root.
|
|
|
|
Пример: `scp -r -P 2223 root@meatinfo.ru:`
|
|
|
|
|
|
|
|
![изображение](uploads/e0df64b1cf329fb4a07323d046c31d7e/изображение.png)
|
|
|
|
Рис.2 - Копирование сайта через SSH на локальную машину.
|
|
|
|
|
|
|
|
<details><summary>Ну если решение выше не устроило то, можно попробовать следующее...</summary>
|
|
|
|
1. Качаем FileZilla
|
|
|
|
|
|
|
|
2. Добавляем новый сайт
|
|
|
|
|
|
|
|
3. Выбираем протокол SFTP
|
|
|
|
|
|
|
|
4. Заполняем данные
|
|
|
|
|
|
|
|
5. Смотрим где находится наша папка на сервере
|
|
|
|
|
|
|
|
6. Заходим как обычно через SSH на сервер и копируем сайт к себе в папку
|
|
|
|
|
|
|
|
7. После чего, с помощю FileZilla, скачиваем к себе на локалку.
|
|
|
|
</details>
|
|
|
|
|
|
|
|
### Установка на локалку
|
|
|
|
После того как сайт был скачен на локальный компьютер - нужно переместить его в папку `./m16all`.
|
|
|
|
Пример на рисунке 3.
|
|
|
|
|
|
|
|
![изображение](uploads/8e7a2ac55ed3416c336fe2fa86e7f886/изображение.png)
|
|
|
|
Рис.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*.
|
|
|
|
|
|
|
|
```conf
|
|
|
|
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`
|
|
|
|
|
|
|
|
#### Обновление конфигурации в проектах
|
|
|
|
Данная документация уже есть и в самом проекте, но здесь отражена с некоторыми уточнениями. [Ссылка на первоисточник](http://lab.inline-ltd.ru/m16tech/m16all/-/blob/master/m16/configurations/README.md).
|
|
|
|
Чтобы в строке браузера увидеть новый проект `m16`, необходимо обновить конфигурацию. Выполняется это следующим образом.
|
|
|
|
|
|
|
|
1. Заходим в контейнер.
|
|
|
|
2. Выполняем следующиую команду для локального сервера
|
|
|
|
```
|
|
|
|
sudo bash /var/www/m16/scripts/bash/updateConfigs.sh m16
|
|
|
|
```
|
|
|
|
|
|
|
|
После этого проект будет добавлен в `sites-available` и будет создана ссылка в `sites-enabled`.
|
|
|
|
> На данный момент ссылка автоматически не создается, по этому пришлось использовать следующи метод.
|
|
|
|
|
|
|
|
Если это не произошло, то выполняем следующий скрипт:
|
|
|
|
```cmd
|
|
|
|
ln -s /etc/nginx/sites-available/[название_сайта].local.conf /etc/nginx/sites-enabled/
|
|
|
|
```
|
|
|
|
|
|
|
|
После чего проверяем командой на ошибки:
|
|
|
|
```
|
|
|
|
nginx -t
|
|
|
|
```
|
|
|
|
И перезагружаем Nginx:
|
|
|
|
```
|
|
|
|
nginx -s reload
|
|
|
|
```
|
|
|
|
После чего сайт будет запущен на локальном компьютере. Пример работы на рисунке 4.
|
|
|
|
|
|
|
|
![изображение](uploads/1dca6385fbcf969a960badb182b6cf1b/изображение.png)
|
|
|
|
Рис.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"](#настройка-nginx-в-m16) (естественно измененный).
|
|
|
|
|
|
|
|
#### Обновление конфигурации в проектах stage
|
|
|
|
На локалке:
|
|
|
|
Если в нутри сайта нет файла `rsync_exclude.txt`, то необходимо создать его.
|
|
|
|
> В нем будут хрониться название файлов и папок, которые не нужно будет синхронизировать. Т.е. если сервер видит этот файл, то сразу же удаляет.
|
|
|
|
|
|
|
|
В моем случае, файл содержал слудющию информацию:
|
|
|
|
```txt
|
|
|
|
backups/
|
|
|
|
log/
|
|
|
|
tmp/
|
|
|
|
key.txt
|
|
|
|
rsync_exclude.txt
|
|
|
|
```
|
|
|
|
|
|
|
|
Далее, переходим к файлу `.gitlab-ci.yml`.
|
|
|
|
Данный файл отвечает за то, как будет происходить деплой на сервере.
|
|
|
|
|
|
|
|
Есть два варианта его редактирования. Первый, самый простой (подойдет не для всех сайтов):
|
|
|
|
Создаем в папке с сайтом папку `script/` и в ней создаем файл `deploy.php`.
|
|
|
|
|
|
|
|
Данный файл можно либо найти в проектах `m16`, либо скопировать у меня. Код будет представлен ниже.
|
|
|
|
|
|
|
|
```php
|
|
|
|
#!/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.
|
|
|
|
|
|
|
|
![изображение](uploads/51af713d65d9dd63635ef82718593d7f/изображение.png)
|
|
|
|
Рис.5 - Расположение файлов.
|
|
|
|
|
|
|
|
Файл `deploy.ini`:
|
|
|
|
```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
|
|
|
|
```
|
|
|
|
|
|
|
|
После чего следуем алгоритму:
|
|
|
|
1. Переходим в контейнер
|
|
|
|
2. Идем далее в каталог сайта (именно в новую папку `script/`)
|
|
|
|
3. Пишим в консоль следующий скрипт:
|
|
|
|
```
|
|
|
|
php deploy.php stage
|
|
|
|
```
|
|
|
|
|
|
|
|
![изображение](uploads/d4431bc75b519cee5c6c84809b7525c5/изображение.png)
|
|
|
|
Рис.6 - Пример вывода команды
|
|
|
|
|
|
|
|
4. И копируем команду которую выведит скрипт в файл `.gitlab-ci.yml`
|
|
|
|
|
|
|
|
![изображение](uploads/5993ef56c4b80370bd7d3377a8bc6a68/изображение.png)
|
|
|
|
Рис.7 - Пример новой записи в `.gitlab-ci.yml`
|
|
|
|
|
|
|
|
Далее удаляем папку `script/`, а так же новые файлы:
|
|
|
|
`deploy.php`, `deploy.ini` и `config.ini`.
|
|
|
|
|
|
|
|
Второй способ - это правильно настроить все файлы так, чтобы происходило подключение к базе данных, а так же
|
|
|
|
|
|
|
|
И после этого отправляем все на тестирование в `stage`, но не все так просто. Нужно повторить ту же процедуру что и на локалке но уже на [stage](#бновление-конфигурации-в-проектах).
|
|
|
|
|
|
|
|
|
|
|
|
### Установка на prod
|
|
|
|
После выполнения всех выше перечисленных пунктов, остается сделать всего одно действие. Добавить конфиг в SSL сертификат.
|
|
|
|
|
|
|
|
Для этого повторяем [ту же процедуру](#настройка-nginx-в-stage), но уже в папке `./ru`.
|
|
|
|
Но при этом, если на сервере уже есть SSL сертификаты для данного сайта, то указываем их в `./inline-ltd.ru.conf`.
|
|
|
|
После чего, повторяем процедуру с ["Обновление конфигурации в проектах stage"](#обновление конфигурации в проектах stage), но уже для prod.
|
|
|
|
|
|
|
|
## Заключение
|
|
|
|
Все выше перечисленные действия на самом деле не очень сложные, но требуют очень много времени.
|
|
|
|
|
|
|
|
Так же, при развертываниие может и слететь **SSL** сертификат, нужно быть к этому готовым.
|
|
|
|
|
|
|
|
Ну, а кто смог дойти до конца, прошу к комментариям и если возникнут вопросы, готов к дискусиям @imaev_azat. |