<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Максим Кузнецов: заметки с тегом devops</title>
<link>https://maxkuznetsov.ru/tags/devops/</link>
<description>Простыми словами о веб-разработке</description>
<author>Максим Кузнецов</author>
<language>ru</language>
<generator>E2 (v3559; Aegea)</generator>

<itunes:owner>
<itunes:name>Максим Кузнецов</itunes:name>
<itunes:email></itunes:email>
</itunes:owner>
<itunes:subtitle>Простыми словами о веб-разработке</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>[Инструкция] Как деплоить проект через Deployer</title>
<guid isPermaLink="false">48</guid>
<link>https://maxkuznetsov.ru/all/kak-deploit-proekt-cherez-deployer/</link>
<pubDate>Tue, 15 Jul 2025 10:54:36 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/kak-deploit-proekt-cherez-deployer/</comments>
<description>
&lt;p&gt;(Инструкция, которую приходится копировать из проекта в проект, поэтому пусть будет и в блоге.)&lt;/p&gt;
&lt;p&gt;Предполагается, что Deployer доступен уже в проекте, либо как файл `./dep`, либо как установленный composer пакет через `./vendor/bin/dep`. Он добавляется и хранится в гит-репозитории.&lt;/p&gt;
&lt;p&gt;Также важно настроить конфиги, указав хост в `./deploy.php`. Они также хранятся в репозитории.&lt;/p&gt;
&lt;h2&gt;Обычные / регулярные деплои&lt;/h2&gt;
&lt;p&gt;`./dep deploy &lt;host&gt;`, где в качестве &lt;host&gt; можно выбрать любой хост из deploy.php файла. В этом файле у хоста указана нужная ветка. Однако, делать это обычно не нужно, так как на проекте настрое Gitlab CI (см файл `.gitlab-ci.yaml`), который зарелизит код по коммиту.&lt;/p&gt;
&lt;h2&gt;Как сменить деплой-ветку для хоста&lt;/h2&gt;
&lt;p&gt;Предположим, вы хотите сменить на `dev` ветку с `develop` на `feature/TASK-82-history-mypractice`.&lt;/p&gt;
&lt;h3&gt;Простой и быстрый вариант для быстрых тестов&lt;/h3&gt;
&lt;p&gt;Вы можете это сделать, поменяв `→set(’branch’, ’feature/TASK-82-history-mypractice’)` в deploy.php для хоста `dev`, а потом запустить `./dep deploy dev`.&lt;/p&gt;
&lt;p&gt;Этот способ хорош, если хочется быстро показать ветку, и мы не ожидаем, что будет много фиксов, так как Gitlab CI всё ещё останется настроен на `develop` ветку. И поэтому:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;при коммите в `develop` ветку, Gitlab CI запустит `./dep deploy dev` и задеплоит `feature/TASK-82-history-mypractice` на `dev`. Но это неправильно, так как мы не хотим деплоить эту ветку на дев по коммиту в `develop`, мы хотим деплоить по коммиту в ветку `feature/TASK-82-history-mypractice`&lt;/li&gt;
&lt;li&gt;при коммите в `feature/TASK-82-history-mypractice` ветку CI ничего не сделает, так как в версии конфига `.gitlab-ci.yaml` из этой ветки нет никакого правила для ветки `feature/TASK-82-history-mypractice`.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Правильный вариант с обновлением Gitlab CI правил&lt;/h3&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Переключиться в `develop` ветку, изменить branch в deploy.php для нужного хоста и в `.gitlab-ci.yaml` изменить параметр `only:` для этого же хоста.&lt;/li&gt;
&lt;li&gt;Закоммитить. CI теперь не запустит деплой на `dev`, так как мы поменяли ветку на `feature/TASK-82-history-mypractice`.&lt;/li&gt;
&lt;li&gt;Переключиться в ветку `feature/TASK-82-history-mypractice` в git и вмерджить в неё свежий `develop`. Вместе с develop придут изменения для `deploy.php` и `.gitlab-ci.yaml`. Поэтому если сразу закоммитить вмёрдженное, то Gitlab CI запустит деплой feature-ветки на `dev`.&lt;/li&gt;
&lt;li&gt;Важно! Перед мерджем ветки в `develop` нужно изменить `deploy.php` и `.gitlab-ci.yaml` и заменить feature-ветку в них обратно на `develop`. Потом смерджить и Gitlab CI, увидев этот коммит в develop, сразу продеплоит `develop` на `dev`.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Как переключить хост с feature1-ветки на другую feature-2 ветку:&lt;/h3&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Переключиться в develop ветку и изменить в ней `deploy.php` и `.gitlab-ci.yaml`, указав feature2 вместо feature1 для нужного хоста.&lt;/li&gt;
&lt;li&gt;Вмерджить develop ветку сначала в feature1 ветку, потом в feature2 ветку.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Удобные команды&lt;/h2&gt;
&lt;ol start="1"&gt;
&lt;li&gt;`./dep ssh &lt;host&gt;` — команда подключится к хосту по конфигу из deploy.php и сделает перейдёт в папку current релиза.&lt;/li&gt;
&lt;li&gt;`./dep run «&lt;command&gt;»` — запускает команду на удалённых серверах. После запуска она спросит на каких серверах запустить.&lt;/li&gt;
&lt;li&gt;`./dep &lt;task&gt; &lt;host&gt;` — запускает любую определённую в deploy.php `task(’&lt;name&gt;’, &lt;callback&gt;)` на нужно сервере.&lt;/li&gt;
&lt;li&gt;Можно указать «теги» для серверов и запускать всё выше написанное сразу пачками.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Первый деплой / создание окружения&lt;/h2&gt;
&lt;ol start="1"&gt;
&lt;li&gt;`./dep deploy develop2` — первый раз закончится с ошибкой, но Deployer создаст структуру файлов по пути из deploy.php для develop2. Он создаст папки
&lt;ol start="1"&gt;
  &lt;li&gt;`/var/www/dev.project.name/releases` — тут будут располагаться папки с каждым новым релизом и копиться последние N штук.&lt;/li&gt;
  &lt;li&gt;`/var/www/dev.project.name/shared` — тут хранятся файлы, которые должны быть сохранены и перенесены между релизами. Например, логи, web/assets, storage, etc. Эти папки задаются в deploy.php как shared_folder и shared_files. Во время деплоя эти папки будут заменены на симлинки из shared папки.&lt;/li&gt;
  &lt;li&gt;`/var/www/dev.project.name/current` — симлинк на последний успешный релиз из папки releases.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;После создания структуры нужно перенести/создать файлы в shared:
&lt;ol start="1"&gt;
  &lt;li&gt;`./shared/.env`&lt;/li&gt;
  &lt;li&gt;`./shared/web/XXXXXXX` — можно посмотреть, какие папки создадутся на сервере, либо какие папки указаны в shared_folder в deploy.php (с учётом тех, что указаны во фреймворк-специфичном recipe, подключённом в deploy.php).&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Повторить деплой `./dep deploy develop2`&lt;/li&gt;
&lt;li&gt;Также нужно залить данные в БД / импортнуть из sql дампа по параметрам из `.env`.&lt;/li&gt;
&lt;/ol&gt;
</description>
</item>

<item>
<title>Установка и настройка Clickhouse на EC2</title>
<guid isPermaLink="false">46</guid>
<link>https://maxkuznetsov.ru/all/ustanovka-i-nastroyka-clickhouse-na-ec2/</link>
<pubDate>Mon, 13 Nov 2023 15:14:10 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/ustanovka-i-nastroyka-clickhouse-na-ec2/</comments>
<description>
&lt;p&gt;Нашёл отличный и исчерпывающий гайд по установке и подготовке Clickhouse для продакшена на AWS EC2.&lt;br /&gt;
Допустим, у нас уже есть VPC, в которую хочется добавиться сервер с CH.&lt;br /&gt;
Единственно, в качестве инстанса я взял машину попроще — m7g.large (~$60/mo) на Ubuntu и Arch64 архитектуре.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://anthonynsimon.com/blog/clickhouse-deployment/"&gt;https://anthonynsimon.com/blog/clickhouse-deployment/&lt;/a&gt;&lt;/p&gt;
</description>
</item>

<item>
<title>Как добавить новый сервис в systemd/systemctl и запускать его при старте  Ubuntu</title>
<guid isPermaLink="false">44</guid>
<link>https://maxkuznetsov.ru/all/ubuntu-systemd-systemctl-on-startup/</link>
<pubDate>Wed, 10 May 2023 17:35:55 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/ubuntu-systemd-systemctl-on-startup/</comments>
<description>
&lt;h3&gt;Задача&lt;/h3&gt;
&lt;p&gt;Есть docker-compose файл, поднимающий Zabbix. Есть небольшая обёртка в виде Makefile, которая позволяет запускать и останавливать docker-compose. Нужно добавить запуск этой команды при старте/рестарте системы.&lt;/p&gt;
&lt;h3&gt;Дано&lt;/h3&gt;
&lt;p&gt;Всё лежит в `/var/www/zabbix-server/`.&lt;br /&gt;
Содержание файла Makefile:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;...
docker-up:
        docker-compose up -d

docker-down:
        docker-compose stop&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Решение&lt;/h3&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Создать новый файл `vim /etc/systemd/system/zabbix.service`.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;[Unit]
Description=Run Zabbix Docker Containers on Startup

[Service]
RemainAfterExit=True
Restart=always
RestartSec=1
WorkingDirectory=/var/www/zabbix-server
ExecStart=/usr/bin/make docker-up
ExecStop=/usr/bin/make docker-down

[Install]
WantedBy=default.target&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;chmod 644 /etc/systemd/system/zabbix.service&lt;/li&gt;
&lt;li&gt;systemctl enable zabbix.service&lt;/li&gt;
&lt;li&gt;systemctl start zabbix.service&lt;/li&gt;
&lt;/ol&gt;
</description>
</item>


</channel>
</rss>