<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Devops on Lead DevOps</title><link>https://lead-devops.blackdevhub.online/tags/devops/</link><description>Recent content in Devops on Lead DevOps</description><generator>Hugo</generator><language>ru</language><lastBuildDate>Mon, 31 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://lead-devops.blackdevhub.online/tags/devops/index.xml" rel="self" type="application/rss+xml"/><item><title>GNU Screen: сессии, которые переживают обрыв SSH</title><link>https://lead-devops.blackdevhub.online/posts/gnu-screen/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/gnu-screen/</guid><description>&lt;p&gt;Долгий &lt;code&gt;apt upgrade&lt;/code&gt;, миграция, сборка — и ноутбук ушёл в сон. SSH рвётся, процесс получает SIGHUP и умирает. &lt;strong&gt;GNU Screen&lt;/strong&gt; держит терминал на сервере: отключился, подключился снова, работа на месте.&lt;/p&gt;
&lt;p&gt;Это не замена &lt;code&gt;nohup&lt;/code&gt; и не «ещё один SSH». Это мультиплексор: именованные сессии, несколько окон внутри одной, общая сессия на двоих. На старых RHEL/Debian &lt;code&gt;screen&lt;/code&gt; часто уже стоит, когда &lt;code&gt;tmux&lt;/code&gt; ещё нет.&lt;/p&gt;
&lt;h2 id="минимальный-цикл"&gt;Минимальный цикл&lt;/h2&gt;
&lt;p&gt;На сервере:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;screen -S deploy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Дальше обычный шелл. Чтобы уйти, не убивая процессы: &lt;code&gt;Ctrl-a&lt;/code&gt;, отпустить, затем &lt;code&gt;d&lt;/code&gt;. Сессия остаётся &lt;strong&gt;Detached&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>kind: локальный Kubernetes в Docker</title><link>https://lead-devops.blackdevhub.online/posts/kind-local-kubernetes-in-docker/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/kind-local-kubernetes-in-docker/</guid><description>&lt;p&gt;Kubernetes-кластер на ноутбуке — задача нередкая: CI/CD, эксперименты с операторами, проверка манифестов без нагрузки на prod. minikube тянет виртуалку, k3s просит отдельный host, а kind поднимает управляющую плоскость в Docker-контейнерах. Развернули, поработали, удалили — без побочных эффектов.&lt;/p&gt;
&lt;h2 id="зачем-kind"&gt;Зачем kind&lt;/h2&gt;
&lt;p&gt;kind создает кластер из Docker-контейнеров: control-plane и worker-ноды — это образы &lt;code&gt;kindest/node&lt;/code&gt;. Основной use-case — локальная разработка и CI. В GitHub Actions есть официальный action &lt;code&gt;create-kind&lt;/code&gt;, что делает пайплайны с тестами поверх K8s тривиальными.&lt;/p&gt;</description></item><item><title>Свой корневой сертификат: куда его класть, чтобы ему доверяли</title><link>https://lead-devops.blackdevhub.online/posts/trust-custom-ca/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/trust-custom-ca/</guid><description>&lt;p&gt;TLS-ошибка «сертификат не доверен» почти никогда не значит, что сертификат «сломан». Обычно сломана &lt;strong&gt;точка доверия&lt;/strong&gt;: клиент смотрит не в то хранилище, куда вы положили CA.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;openssl&lt;/code&gt;, Git, Python и браузер — разные клиенты. У части из них своя база корней. Один &lt;code&gt;update-ca-certificates&lt;/code&gt; на Linux не закроет Chrome и Firefox.&lt;/p&gt;
&lt;h2 id="что-именно-добавлять"&gt;Что именно добавлять&lt;/h2&gt;
&lt;p&gt;В доверенные кладут &lt;strong&gt;корневой сертификат CA&lt;/strong&gt;, которым подписан серверный сертификат, а не сам &lt;code&gt;localhost.crt&lt;/code&gt; / &lt;code&gt;app.example.internal&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Типичный набор файлов:&lt;/p&gt;</description></item><item><title>ssh-connection-manager: TUI для хостов из ~/.ssh/config</title><link>https://lead-devops.blackdevhub.online/posts/ssh-connection-manager/</link><pubDate>Sun, 30 Aug 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/ssh-connection-manager/</guid><description>&lt;p&gt;Когда в &lt;code&gt;~/.ssh/config&lt;/code&gt; десятки стендов, bastion и jump-хостов, вспоминать алиасы уже не хочется. &lt;strong&gt;ssh-connection-manager&lt;/strong&gt; — это TUI поверх обычного OpenSSH: список хостов, фильтр, подключение штатным &lt;code&gt;ssh&lt;/code&gt;, добавление новой записи в конфиг.&lt;/p&gt;
&lt;p&gt;Команда в терминале — &lt;code&gt;ssh-connect&lt;/code&gt;. Репозиторий: &lt;a href="https://gitlab.com/public-projects-docff-devops/ssh-connection-manager"&gt;gitlab.com/unsorted-projects/ssh-connection-manager&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="зачем-не-ещё-один-ssh-клиент"&gt;Зачем не ещё один SSH-клиент&lt;/h2&gt;
&lt;p&gt;Клиент уже есть: системный &lt;code&gt;ssh&lt;/code&gt;. Нужен не новый протокол, а навигация по конфигу.&lt;/p&gt;
&lt;p&gt;Утилита:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;читает &lt;code&gt;~/.ssh/config&lt;/code&gt; или другой файл (&lt;code&gt;-c&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;показывает только конкретные &lt;code&gt;Host&lt;/code&gt;, без wildcard-шаблонов вроде &lt;code&gt;Host *&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;учитывает &lt;code&gt;Include&lt;/code&gt; (до 16 уровней вложенности);&lt;/li&gt;
&lt;li&gt;на &lt;code&gt;Enter&lt;/code&gt; приостанавливает TUI и запускает &lt;code&gt;ssh -F &amp;lt;config&amp;gt; &amp;lt;alias&amp;gt;&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;после выхода из сессии снова открывает список.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Под капотом Python 3.11+ и &lt;a href="https://textual.textualize.io/"&gt;Textual&lt;/a&gt;. Свой SSH-стек не пишется: ключи, &lt;code&gt;ProxyJump&lt;/code&gt;, агент — всё остаётся на OpenSSH.&lt;/p&gt;</description></item></channel></rss>