<?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>Максим Кузнецов: заметки с тегом deployment</title>
<link>https://maxkuznetsov.ru/tags/deployment/</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>Deployment: настраиваем пользователей</title>
<guid isPermaLink="false">38</guid>
<link>https://maxkuznetsov.ru/all/deployment-users/</link>
<pubDate>Fri, 27 Nov 2020 04:17:56 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/deployment-users/</comments>
<description>
&lt;h3&gt;Проблема&lt;/h3&gt;
&lt;p&gt;Под &lt;tt&gt;root&lt;/tt&gt;-пользователем работать небезопасно, равно как и делать весь проект доступным &lt;tt&gt;www-data&lt;/tt&gt;.&lt;br /&gt;
Кроме того, во многих веб-приложениях пользователи имеют возможность загружать свои файлы. И очень часто с такими файлами возникают конфликты, так как пишутся они под &lt;tt&gt;www-data:www-data&lt;/tt&gt;, а деплоим под другим пользователем. Даже если деплоить под &lt;tt&gt;root&lt;/tt&gt;, то скорее всего права на папку перепишутся и &lt;tt&gt;www-data&lt;/tt&gt; потеряет доступ к нужным файлам.&lt;/p&gt;
&lt;h3&gt;Решение&lt;/h3&gt;
&lt;p&gt;Создать нового пользователя deploy с правами на коннект к серверу по ssh, доступом только к папке с проектом и возможностью изменять файлы в &lt;tt&gt;./public/uploads&lt;/tt&gt; и &lt;tt&gt;./var&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Создаём на сервере пользователя &lt;tt&gt;deploy&lt;/tt&gt; из-под &lt;tt&gt;root&lt;/tt&gt;:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ssh root@вашсервер
useradd --create-home -s /bin/bash deploy&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Настроим доступ по ssh через ключи&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="bash"&gt;mkdir /home/deploy/.ssh
touch /home/deploy/.ssh/authorized_keys&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Вставьте содержимое одного из публичного ключа своего локального пользователя в файл &lt;tt&gt;authorized_keys&lt;/tt&gt; и сохраните. Вывести публичный ключ локально можно командой: &lt;tt&gt;cat ~/.ssh/id_rsa.pub&lt;/tt&gt; (название ключа &lt;tt&gt;id_rsa.pub&lt;/tt&gt; у вас может отличаться).&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;vim /home/deploy/.ssh/authorized_keys&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Меняем права на более строгие&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;chown -R deploy:deploy /home/deploy
chmod 600 /home/deploy/.ssh/authorized_keys&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Определим пользователя нашего веб-сервера (в примере ниже это &lt;tt&gt;www-data&lt;/tt&gt;)&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1
&amp;gt; www-data&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Добавляем пользователя &lt;tt&gt;deploy&lt;/tt&gt; в группу &lt;tt&gt;www-data&lt;/tt&gt; (группа веб-сервера)&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;usermod -a -G www-data deploy&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Выставляем права на папку проекта&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="bash"&gt;chown -R deploy:deploy /var/www/project
chmod -R 0775 /var/www/project&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Проверим, есть ли setfacl в системе &lt;tt&gt;setfacl -h&lt;/tt&gt; и установим, если его нет. Команда для Ubuntu:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="bash"&gt;sudo apt-get install acl&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Выдадим права на папки с кэшем, логами и загруженными пользовательскими файлами&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="bash"&gt;sudo setfacl -dR -m u:www-data:rwX -m u:deploy:rwX /var/www/project/var /var/www/project/public/uploads
sudo setfacl -R -m u:www-data:rwX -m u:deploy:rwX /var/www/project/var /var/www/project/public/uploads&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Готово.&lt;/p&gt;
&lt;p&gt;Для самого деплоймента я обычно использую &lt;a href="deployer.org"&gt;Deployer&lt;/a&gt; c параметром &lt;tt&gt;writable_mode=acl&lt;/tt&gt;.&lt;/p&gt;
</description>
</item>


</channel>
</rss>