<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>alchemmist — Github</title><link>https://alchemmist.xyz/ru/tags/github/</link><description>Последние записи в блоге alchemmist</description><generator>Hugo 0.163.3</generator><language>ru</language><atom:link href="https://alchemmist.xyz/ru/tags/github/index.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Tue, 24 Jun 2025 14:18:00 +0300</lastBuildDate><item><title>Прозрачное развертывание с GitHub Actions</title><link>https://alchemmist.xyz/ru/articles/deploy-gh-actions/</link><pubDate>Tue, 24 Jun 2025 14:18:00 +0300</pubDate><dc:creator>alchemmist</dc:creator><guid>https://alchemmist.xyz/ru/articles/deploy-gh-actions/</guid><description>Недавно я нашёл простой способ выполнять любые операции на своих серверах через GitHub Actions. Мне нравится прозрачность этого подхода — я могу контролировать все шаги и процессы. Сейчас я покажу, как настроить чистое развертывание, но вы можете адаптировать это под свои задачи.
Как мы разворачиваем вручную? В простейшем случае подключаемся к серверу, вытягиваем репозиторий и перезапускаем приложение.
Автоматизируем этот процесс. Начнём с подключения. Обычно это выглядит так:
ssh root@192.168.0.1 -i ~/.ssh/id_rsa25519 Нам нужны три компонента для доступа:</description><content:encoded><![CDATA[<p>Недавно я нашёл простой способ выполнять любые операции на своих серверах через GitHub Actions. Мне нравится прозрачность этого подхода — я могу контролировать все шаги и процессы. Сейчас я покажу, как настроить чистое развертывание, но вы можете адаптировать это под свои задачи.</p>
<p>Как мы разворачиваем вручную? В простейшем случае подключаемся к серверу, вытягиваем репозиторий и перезапускаем приложение.</p>
<p><img src="https://alchemmist.xyz/images/deploy-pipeline.svg" class="content-img" alt="" loading="lazy" decoding="async" /></p>
<p>Автоматизируем этот процесс. Начнём с подключения. Обычно это выглядит так:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">ssh root@192.168.0.1 -i ~/.ssh/id_rsa25519
</span></span></code></pre></div><p>Нам нужны три компонента для доступа:</p>
<ol>
<li>IP-адрес сервера</li>
<li>Имя пользователя</li>
<li>Приватный SSH-ключ
Для &ldquo;чистого&rdquo; развертывания автоматизируем все шаги. Чтобы GitHub Actions мог подключиться к серверу, передадим данные через секреты.</li>
</ol>
<p>В репозитории GitHub зайдите в <code>Settings</code> → <code>Security</code> → <code>Secrets and Variables</code> → <code>Actions</code>. Добавьте три секрета: <code>SSH_USER</code>, <code>SSH_HOST</code>, <code>SSH_KEY</code>. Не забудьте добавить публичный ключ в <code>~/.ssh/authorized_keys</code> на сервере. Первый шаг завершён.</p>
<p>Далее — вытягивание репозитория. Если сервер чистый, его нужно клонировать. Для приватных репозиториев вы можете столкнуться с ошибкой:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-txt" data-lang="txt"><span class="line"><span class="cl">git@github.com: Permission denied (publickey).
</span></span><span class="line"><span class="cl">fatal: Could not read from remote repository.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">Please make sure you have the correct access rights
</span></span><span class="line"><span class="cl">and the repository exists.
</span></span></code></pre></div><p>Сгенерируйте SSH-ключи на сервере:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sh" data-lang="sh"><span class="line"><span class="cl">ssh-keygen -C github -t ed25519
</span></span></code></pre></div><p>Добавьте публичный ключ в <code>Deploy keys</code> в настройках репозитория GitHub. Создайте секрет <code>SSH_PROJECT_PATH</code> для пути к проекту.</p>
<p>Финальный шаг — GitHub Actions. Создайте файл <code>.gitub/workflows/deploy.yaml</code> (имя не важно):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Deploy</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">on</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">push</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">branches</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">main</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">jobs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">deploy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">runs-on</span><span class="p">:</span><span class="w"> </span><span class="l">ubuntu-latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">steps</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Pull repo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">appleboy/ssh-action@master</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">with</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">host</span><span class="p">:</span><span class="w"> </span><span class="l">${{ secrets.SSH_HOST }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">username</span><span class="p">:</span><span class="w"> </span><span class="l">${{ secrets.SSH_USER }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l">${{ secrets.SSH_KEY }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">script</span><span class="p">:</span><span class="w"> </span><span class="p">|</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">            cd ${{ secrets.SSH_PROJECT_PATH }}
</span></span></span><span class="line"><span class="cl"><span class="sd">            git pull origin main --rebase</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Compose down</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">appleboy/ssh-action@master</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">with</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">host</span><span class="p">:</span><span class="w"> </span><span class="l">${{ secrets.SSH_HOST }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">username</span><span class="p">:</span><span class="w"> </span><span class="l">${{ secrets.SSH_USER }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l">${{ secrets.SSH_KEY }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">script</span><span class="p">:</span><span class="w"> </span><span class="p">|</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">            cd ${{ secrets.SSH_PROJECT_PATH }}
</span></span></span><span class="line"><span class="cl"><span class="sd">            docker compose down</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">Compose up</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">uses</span><span class="p">:</span><span class="w"> </span><span class="l">appleboy/ssh-action@master</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">with</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">host</span><span class="p">:</span><span class="w"> </span><span class="l">${{ secrets.SSH_HOST }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">username</span><span class="p">:</span><span class="w"> </span><span class="l">${{ secrets.SSH_USER }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l">${{ secrets.SSH_KEY }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">script</span><span class="p">:</span><span class="w"> </span><span class="p">|</span><span class="sd">
</span></span></span><span class="line"><span class="cl"><span class="sd">            cd ${{ secrets.SSH_PROJECT_PATH }}
</span></span></span><span class="line"><span class="cl"><span class="sd">            docker compose up -d</span><span class="w">
</span></span></span></code></pre></div><p>В этом примере я использую Docker для перезапуска сервисов. Выберите свой подход!```</p>
]]></content:encoded><category>github</category></item></channel></rss>