<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Главная on Lead DevOps</title><link>https://lead-devops.blackdevhub.online/</link><description>Recent content in Главная on Lead DevOps</description><generator>Hugo</generator><language>ru-RU</language><lastBuildDate>Sun, 04 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://lead-devops.blackdevhub.online/index.xml" rel="self" type="application/rss+xml"/><item><title>исправление утечек памяти в python-сервисах: диагностика и сбор дампов</title><link>https://lead-devops.blackdevhub.online/posts/python-memory-leaks-diagnostics/</link><pubDate>Sun, 04 Oct 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/python-memory-leaks-diagnostics/</guid><description>&lt;p&gt;Python-сервисы под нагрузкой могут silently расходовывать память до hitting cgroup limit и OOM-kill. Без систематического сбора дампов и интроспекции root-cause hunt превращается в перебор гипотез. Ниже — проверенный набор команд и скриптов для диагностики, сбора хит-дампов и устранения типичных утечек.&lt;/p&gt;&#10;&lt;h2 id="1-команды-диагностики-потребления-памяти"&gt;1. Команды диагностики потребления памяти&#10;&lt;/h2&gt;&#10;&lt;p&gt;Базовый уровень — &lt;code&gt;psutil&lt;/code&gt;. Устанавливается одной строкой и работает без перезапуска процесса.&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-7f583895-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-7f583895-fence-0-viewport" data-td-code-viewport&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;pip install psutil&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Текущее потребление текущего процесса:&lt;/p&gt;</description></item><item><title>Лучшие практики SSH-ключей</title><link>https://lead-devops.blackdevhub.online/posts/post/</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/post/</guid><description>&lt;p&gt;SSH-ключи являются де-факто стандартом аутентификации в инфраструктуре, но их неправильное управление превращает каждый деплой в потенциальную уязвимость. В этой заметке собраны проверенные практики: от генерации ключей до их отзыва и ротации без простоя сервисов.&lt;/p&gt;&#10;&lt;h2 id="введение"&gt;Введение&#10;&lt;/h2&gt;&#10;&lt;p&gt;SSH-ключи работают как долгосрочные учетные данные, и их lifecycle напрямую влияет на безопасность всей цепочки поставок. В отличие от паролей, ключи часто создаются один раз и забываются, что приводит накоплению «зомби-ключей» с правами, выходящими за рамки текущих нужд. Правильная генерация, привязка к агенту и регулярная ротация минимизируют атакучную поверхность и обеспечивают аудит изменений. В следующих разделах описаны конкретные команды и конфигурации, используемые в эксплуатации.&lt;/p&gt;</description></item><item><title>kubectl cheatsheet: основные команды для работы с Kubernetes</title><link>https://lead-devops.blackdevhub.online/posts/kubectl-cheatsheet/</link><pubDate>Thu, 24 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/kubectl-cheatsheet/</guid><description>&lt;p&gt;kubectl — основной инструмент взаимодействия с Kubernetes-кластером. Ниже собрана шпаргалка по рутинным операциям: от настройки контекста до отладки подов и переключения между namespace. Все команды проверены на актуальных версиях kubectl (1.28+).&lt;/p&gt;&#10;&lt;h2 id="установка-и-настройка-контекста"&gt;Установка и настройка контекста&#10;&lt;/h2&gt;&#10;&lt;p&gt;Установка зависит от ОС. На Linux через пакетный менеджер или бинарник:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-3a900753-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="3"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-3a900753-fence-0-viewport" data-td-code-viewport&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;curl -LO &lt;span class="s2"&gt;&amp;#34;https://dl.k8s.io/release/&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -L -s https://dl.k8s.io/release/stable.txt&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/bin/linux/amd64/kubectl&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x kubectl &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo mv kubectl /usr/local/bin/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl version --client&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Конфигурация хранится в &lt;code&gt;~/.kube/config&lt;/code&gt;. Контекст определяет кластер, пользователя и namespace по умолчанию.&lt;/p&gt;</description></item><item><title>Git Tag: разметка релизов и закладки в истории</title><link>https://lead-devops.blackdevhub.online/posts/git-tag/</link><pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/git-tag/</guid><description>&lt;h2 id="git-tag-разметка-релизов-и-закладки-в-истории"&gt;Git Tag: разметка релизов и закладки в истории&#10;&lt;/h2&gt;&#10;&lt;p&gt;Теги — это механизм Git для присвоения осмысленных меток конкретным коммитам. В отличие от веток, теги не двигаются: они зафиксированы в точке коммита и служат якорями для релизов, версий и важных контрольных точек. Без тегов релизная история превращается в поиск по хешам — и это прямой путь к ошибкам деплоя.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="типы-тегов-lightweight-vs-annotated"&gt;Типы тегов: lightweight vs annotated&#10;&lt;/h2&gt;&#10;&lt;p&gt;Существует два типа тегов. Lightweight — это просто имя, привязанное к коммиту, без дополнительных метаданных. Annotated — полноценный объект Git с автором, датой, сообщением и возможностью подписи.&lt;/p&gt;</description></item><item><title>Создание пользователя, роли в Kubernetes и их связка через RBAC</title><link>https://lead-devops.blackdevhub.online/posts/k8s-user-role-rbac/</link><pubDate>Wed, 23 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/k8s-user-role-rbac/</guid><description>&lt;p&gt;В Kubernetes нет отдельных «пользователей» в классическом смысле — есть ServiceAccount&amp;rsquo;ы и сертификаты, привязанные к ролям через RBAC. Без правильной настройки любой, у кого есть kubeconfig, получает доступ ко всему кластеру. Ниже — полный цикл: создаём ServiceAccount, определяем права, привязываем и проверяем.&lt;/p&gt;&#10;&lt;h2 id="создание-serviceaccount-и-генерация-kubeconfig"&gt;Создание ServiceAccount и генерация kubeconfig&#10;&lt;/h2&gt;&#10;&lt;p&gt;Сначала создаём ServiceAccount в нужном namespace:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-e68aa1fb-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-e68aa1fb-fence-0-viewport" data-td-code-viewport&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;kubectl create serviceaccount devops-sa -n staging&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Для генерации kubeconfig берём токен из secrets и формируем файл:&lt;/p&gt;</description></item><item><title>Git hook post-receive для деплоя на сервере</title><link>https://lead-devops.blackdevhub.online/posts/git-hook-post-receive-dlya-deploya/</link><pubDate>Sat, 19 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/git-hook-post-receive-dlya-deploya/</guid><description>&lt;p&gt;Деплой через CI — это хорошо, но иногда нужно просто закинуть код на сервер одним &lt;code&gt;git push&lt;/code&gt;. &lt;code&gt;post-receive&lt;/code&gt; hook в bare-репозитории решает эту задачу без лишних зависимостей: пушитшь на сервер — хук автоматически вытягивает файлы в рабочую директорию.&lt;/p&gt;&#10;&lt;h2 id="схема-bare-repo-как-деплой-триггер"&gt;Схема: bare repo как деплой-триггер&#10;&lt;/h2&gt;&#10;&lt;p&gt;Логика простая:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;На сервере создаётся bare-репозиторий (например, &lt;code&gt;/srv/deploy/app.git&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;Разработчик добавляет его как remote и делает &lt;code&gt;git push origin main&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Git принимает данные и запускает &lt;code&gt;hooks/post-receive&lt;/code&gt;.&lt;/li&gt;&#10;&lt;li&gt;Скрипт хука делает &lt;code&gt;git --work-tree=/var/www/app --git-dir=/srv/deploy/app.git checkout -f main&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="td-callout td-callout--note" role="note"&gt;&#10; &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-circle-info" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;Примечание&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="td-callout__body"&gt;&#10;&lt;p&gt;Bare-репозиторий не содержит рабочей директории. Именно поэтому в &lt;code&gt;post-receive&lt;/code&gt; нужно явно указывать &lt;code&gt;--work-tree&lt;/code&gt;, чтобы &lt;code&gt;checkout&lt;/code&gt; знал, куда записать файлы.&lt;/p&gt;</description></item><item><title>ulimit и systemd LimitNOFILE — почему ulimit -n в unit не живёт</title><link>https://lead-devops.blackdevhub.online/posts/ulimit-i-systemd-limitnofile/</link><pubDate>Sat, 19 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/ulimit-i-systemd-limitnofile/</guid><description>&lt;h2 id="что-такое-nofile-и-где-он-живёт"&gt;Что такое nofile и где он живёт&#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;nofile&lt;/code&gt; — максимальное количество открытых файловых дескрипторов на один процесс. Это не только обычные файлы, а сокеты, pipe, stdin/stdout/stderr, логи через journald — всё считается. Когда nginx или Go-приложение падает с &lt;code&gt;too many open files&lt;/code&gt;, дело в этом лимите.&lt;/p&gt;&#10;&lt;p&gt;Лимиты живут на трёх уровнях:&lt;/p&gt;&#10;&lt;div class="td-table-scroll td-table-scroll--static"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th scope="col"&gt;Уровень&lt;/th&gt;&#10; &lt;th scope="col"&gt;Где смотреть&lt;/th&gt;&#10; &lt;th scope="col"&gt;Что контролирует&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;Ядро (системный)&lt;/td&gt;&#10; &lt;td&gt;&lt;code&gt;/proc/sys/fs/file-max&lt;/code&gt;, &lt;code&gt;/proc/sys/fs/nr_open&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Абсолютный потолок по всей системе&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;PAM / login&lt;/td&gt;&#10; &lt;td&gt;&lt;code&gt;/etc/security/limits.conf&lt;/code&gt;, &lt;code&gt;/etc/security/limits.d/&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Для сессий через &lt;code&gt;pam_limits.so&lt;/code&gt;&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;systemd&lt;/td&gt;&#10; &lt;td&gt;&lt;code&gt;LimitNOFILE=&lt;/code&gt; в unit, &lt;code&gt;DefaultLimitNOFILE=&lt;/code&gt; в &lt;code&gt;system.conf&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Для сервисов, управляемых systemd&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;div class="td-callout td-callout--note" role="note"&gt;&#10; &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-circle-info" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;Примечание&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="td-callout__body"&gt;&#10;&lt;p&gt;&lt;code&gt;/proc/sys/fs/nr_open&lt;/code&gt; — верхняя граница, до которой можно поднять &lt;code&gt;nofile&lt;/code&gt; для одного процесса. По умолчанию обычно &lt;code&gt;1073741816&lt;/code&gt; (≈1B), но на практике редко нужно больше &lt;code&gt;1048576&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>coredumpctl: найти падение бинаря</title><link>https://lead-devops.blackdevhub.online/posts/coredumpctl-naiti-padenie-binarya/</link><pubDate>Fri, 18 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/coredumpctl-naiti-padenie-binarya/</guid><description>&lt;h2 id="что-такое-coredumpctl-и-как-он-работает"&gt;Что такое coredumpctl и как он работает&#10;&lt;/h2&gt;&#10;&lt;p&gt;Когда бинарь падает с SEGV, ядро может сохранить core dump — снимок памяти процесса в момент креша. В systemd-based дистрибутивах за сбор, хранение и поиск этих дампов отвечёт &lt;code&gt;coredumpctl&lt;/code&gt;, обёртка над &lt;code&gt;systemd-coredump&lt;/code&gt;. Он хранит дампы в &lt;code&gt;/var/lib/systemd/coredump/&lt;/code&gt; и индексирует метаданные через journald.&lt;/p&gt;&#10;&lt;div class="td-callout td-callout--note" role="note"&gt;&#10; &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-circle-info" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;Примечание&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="td-callout__body"&gt;&#10;&lt;p&gt;Для работы нужен &lt;code&gt;systemd-coredump&lt;/code&gt; и включённый journald. В минимальных контейнерах без systemd этот инструмент недоступен.&lt;/p&gt;</description></item><item><title>curl --resolve и SNI: проверка виртуального хоста без /etc/hosts</title><link>https://lead-devops.blackdevhub.online/posts/curl-resolve-i-sni/</link><pubDate>Fri, 18 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/curl-resolve-i-sni/</guid><description>&lt;p&gt;Когда нужно проверить виртуальный хост на конкретном IP, но править &lt;code&gt;/etc/hosts&lt;/code&gt; нет желания — ни из-за прав, ни из-за конфликтов с другими сервисами — &lt;code&gt;curl --resolve&lt;/code&gt; решает обе задачи: подменяет DNS-запись и корректно отправляет SNI в TLS-хендшейке.&lt;/p&gt;&#10;&lt;h2 id="проблема-виртуальный-хост-без-правки-etchosts"&gt;Проблема: виртуальный хост без правки /etc/hosts&#10;&lt;/h2&gt;&#10;&lt;p&gt;На одном IP может висеть десяток виртуальных хостов, и сервер выбирает нужный по Host-заголовке (HTTP/1.1) и по SNI (TLS). Если в &lt;code&gt;/etc/hosts&lt;/code&gt; нет записи, curl сначала попробует резолвить имя через DNS — и получит не тот IP, или вовсе не получит ответ.&lt;/p&gt;</description></item><item><title>Docker logs и journald: выбор драйвера логирования</title><link>https://lead-devops.blackdevhub.online/posts/docker-logs-i-journald/</link><pubDate>Fri, 18 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/docker-logs-i-journald/</guid><description>&lt;p&gt;Когда контейнер падает, логи — первое, что нужно увидеть. &lt;code&gt;docker logs&lt;/code&gt; выглядит просто, но под капотом работает разные драйверы логирования, и выбор влияет на то, как хранятся, вращаются и доступны логи. Вот что стоит знать перед тем, как доверять дефолту.&lt;/p&gt;&#10;&lt;h2 id="как-работает-docker-logs"&gt;Как работает docker logs&#10;&lt;/h2&gt;&#10;&lt;p&gt;Команда &lt;code&gt;docker logs &amp;lt;container&amp;gt;&lt;/code&gt; читает поток stdout/stderr контейнера и выдаёт его в терминал. За этим стоит &lt;strong&gt;драйвер логирования&lt;/strong&gt; — компонент, который определяет, куда именно пишутся данные. По умолчанию это &lt;code&gt;json-file&lt;/code&gt;: каждый контейнер получает JSON-файл на хосте, в который записываются все строки вывода.&lt;/p&gt;</description></item><item><title>scp — передача файлов по SSH</title><link>https://lead-devops.blackdevhub.online/posts/scp/</link><pubDate>Fri, 18 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/scp/</guid><description>&lt;p&gt;scp — утилита для копирования файлов по SSH поверх протокола SSH. Работает из терминала, не требует настройки сервера сверху — достаточно работающего sshd и авторизации. В эпоху rsync и bat SCP живёт как простой инструмент для разовых передач, когда не хочется возиться с daemon-ами или конфигурацией.&lt;/p&gt;&#10;&lt;h2 id="синтаксис-и-базовые-сценарии"&gt;Синтаксис и базовые сценарии&#10;&lt;/h2&gt;&#10;&lt;p&gt;Общий вид:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-cd2a58fd-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-cd2a58fd-fence-0-viewport" data-td-code-viewport&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;scp &lt;span class="o"&gt;[&lt;/span&gt;флаги&lt;span class="o"&gt;]&lt;/span&gt; источник назначение&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Источник и назначение могут быть локальными путями или remote-адресами в формате &lt;code&gt;user@host:path&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Sudoers: NOPASSWD без дыр</title><link>https://lead-devops.blackdevhub.online/posts/sudoers-nopasswd-bez-dyr/</link><pubDate>Fri, 18 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/sudoers-nopasswd-bez-dyr/</guid><description>&lt;h2 id="почему-nopasswd--all--это-не-решение-а-дыра"&gt;Почему NOPASSWD + ALL — это не решение, а дыра&#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;%admin ALL=(ALL) NOPASSWD: ALL&lt;/code&gt; — самая частая ошибка в sudoers. Пользователь получает неограниченный root-доступ без пароля. Любой скрипт, любая утилита, любая уязвимость в окружении пользователя становится прямым путём к полному контролю машины. NOPASSWD без ограничений по командам — это не удобство, это бэкдор в явном виде.&lt;/p&gt;&#10;&lt;p&gt;Правильный подход: разрешить конкретные команды через &lt;code&gt;Cmnd_Alias&lt;/code&gt; и повесить &lt;code&gt;NOPASSWD&lt;/code&gt; только на них. Тогда пользователь может перезапустить сервис, но не сможет читать &lt;code&gt;/etc/shadow&lt;/code&gt; или запустить &lt;code&gt;su&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>ThinLinc: удалённый доступ к Linux-рабочим столам</title><link>https://lead-devops.blackdevhub.online/posts/thinlinc/</link><pubDate>Fri, 18 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/thinlinc/</guid><description>&lt;h2 id="thinlinc-удалённый-доступ-к-linux-рабочим-столам"&gt;ThinLinc: удалённый доступ к Linux-рабочим столам&#10;&lt;/h2&gt;&#10;&lt;p&gt;В корпоративной среде удалённый доступ к Linux-рабочим столам часто сводится к VNC с нестабильным шифрованием или RDP-прокси, требующим костылей. ThinLinc от Cendio — это полноценное решение для удалённого доступа к Linux-десктопам, которое работает поверх VNC, поддерживает RDP-клиентов и предоставляет веб-интерфейс администрирования без лишней возни с сертификатами и файрволами.&lt;/p&gt;&#10;&lt;h2 id="что-такое-thinlinc"&gt;Что такое ThinLinc&#10;&lt;/h2&gt;&#10;&lt;p&gt;ThinLinc — сервер удалённого доступа к рабочим столам с архитектурой «сервер + клиенты». Сервер запускает сессии VNC на бэкенде, а клиенты подключаются через веб-браузер или нативные ThinLinc-клиенты. Протокол между клиентом и сервером туннелируется через SSH, что решает проблему шифрования «из коробки».&lt;/p&gt;</description></item><item><title>Chrony вместо ntpd</title><link>https://lead-devops.blackdevhub.online/posts/chrony-vmesto-ntpd/</link><pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/chrony-vmesto-ntpd/</guid><description>&lt;p&gt;В Debian/Ubuntu и RHEL/CentOS &lt;code&gt;ntpd&lt;/code&gt; давно пора менять на &lt;code&gt;chrony&lt;/code&gt;. Он быстрее сходится к точному времени, лучше работает при нестабильных сетях и меньше нагружает систему. В современных дистрибутивах &lt;code&gt;chrony&lt;/code&gt; уже стоит по умолчанию — но если он ещё не развёрнут, переход занимает минуту.&lt;/p&gt;&#10;&lt;h2 id="установка"&gt;Установка&#10;&lt;/h2&gt;&#10;&lt;p&gt;На RHEL-подобных:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-918d4a83-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="2"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-918d4a83-fence-0-viewport" data-td-code-viewport&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;sudo dnf install chrony -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now chronyd&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;На Debian/Ubuntu:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-918d4a83-fence-1" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="2"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-918d4a83-fence-1-viewport" data-td-code-viewport&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;sudo apt install chrony -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now chronyd&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Если на машине раньше работал &lt;code&gt;ntpd&lt;/code&gt;, остановите и отключите его, чтобы не было конфликта портов:&lt;/p&gt;</description></item><item><title>fail2ban: jail для sshd</title><link>https://lead-devops.blackdevhub.online/posts/fail2ban-jail-dlya-sshd/</link><pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/fail2ban-jail-dlya-sshd/</guid><description>&lt;p&gt;Защита SSH от брутфорса — один из первых шагов при укреплении сервера. fail2ban сканирует логи, находит повторные неудачные попытки входа и блокирует источник через iptables или nftables. В заметке разберём jail для sshd: от установки до тонкой настройки времени бана.&lt;/p&gt;&#10;&lt;h2 id="установка-и-базовая-конфигурация"&gt;Установка и базовая конфигурация&#10;&lt;/h2&gt;&#10;&lt;p&gt;Устанавливаем из стандартного репозитория:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-c45e97e5-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="5"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-c45e97e5-fence-0-viewport" data-td-code-viewport&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;&lt;span class="c1"&gt;# Debian/Ubuntu&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install fail2ban&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# RHEL/CentOS&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yum install fail2ban&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Включаем и запускаем сервис:&lt;/p&gt;</description></item><item><title>journalctl: фильтры и follow</title><link>https://lead-devops.blackdevhub.online/posts/journalctl-filtry-i-follow/</link><pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/journalctl-filtry-i-follow/</guid><description>&lt;p&gt;Системный журнал systemd — это первое место, куда нужно смотреть, когда сервис упал или узел начал жрать CPU. &lt;code&gt;journalctl&lt;/code&gt; умеет гораздо больше, чем вывести весь лог подряд: фильтровать по юнитам, приоритетам, временным окнам и читать в реальном времени. Ниже — рабочий набор, который я использую ежедневно.&lt;/p&gt;&#10;&lt;h2 id="follow-in-real-time"&gt;Follow in real time&#10;&lt;/h2&gt;&#10;&lt;p&gt;Поведение, аналогичное &lt;code&gt;tail -f&lt;/code&gt;, но с учётом структурированного формата journald:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-3fa377c3-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-3fa377c3-fence-0-viewport" data-td-code-viewport&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;journalctl -f&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Флаг &lt;code&gt;-f&lt;/code&gt; (short for &lt;code&gt;--follow&lt;/code&gt;) выводит новые записи по мере их появления. По умолчанию показывает все юниты — удобно, когда не знаешь, где именно горит.&lt;/p&gt;</description></item><item><title>nftables: базовый набор правил</title><link>https://lead-devops.blackdevhub.online/posts/nftables-bazovyi-nabor-pravil/</link><pubDate>Thu, 17 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/nftables-bazovyi-nabor-pravil/</guid><description>&lt;div class="td-callout td-callout--note" role="note"&gt;&#10; &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-circle-info" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;Примечание&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="td-callout__body"&gt;&#10;&lt;p&gt;Все команды проверены на Debian/Ubuntu с пакетом &lt;code&gt;nftables&lt;/code&gt; и на RHEL/CentOS 8+. На старых системах может потребоваться &lt;code&gt;apt install nftables&lt;/code&gt; или &lt;code&gt;yum install nftables&lt;/code&gt;.&lt;/p&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;nftables пришёл на смену iptables, но документация по базовому набору правил часто разрознена. Вот конспект, который использую сам, когда поднимаю файрволл на новой машине.&lt;/p&gt;&#10;&lt;h2 id="создание-таблицы-inet-filter"&gt;Создание таблицы inet filter&#10;&lt;/h2&gt;&#10;&lt;p&gt;Таблица семейства &lt;code&gt;inet&lt;/code&gt; объединяет IPv4 и IPv6 в одном пространстве имён. Это предпочтительный подход, если на хосте оба стека активны.&lt;/p&gt;</description></item><item><title>Debian — Швейцарский нож в мире Linux</title><link>https://lead-devops.blackdevhub.online/posts/debian-swiss-army-knife-linux/</link><pubDate>Tue, 15 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/debian-swiss-army-knife-linux/</guid><description>&lt;p&gt;Debian — это не самый яркий дистрибутив, но самый надёжный фундамент в мире Linux. За ним стоит крупнейшее сообщество волонтёров-разработчиков, а за его плечами — десятилетия безотказной работы серверов, встраиваемых систем и облачной инфраструктуры. Если ты управляешь Linux-машинами в продакшене, Debian (или его производные) уже присутствует в твоём стеке — осознанно или нет.&lt;/p&gt;&#10;&lt;h2 id="управление-пакетами-apt-и-dpkg"&gt;Управление пакетами: apt и dpkg&#10;&lt;/h2&gt;&#10;&lt;p&gt;Два инструмента формируют ядро пакетной системы Debian. &lt;code&gt;apt&lt;/code&gt; — высокоуровневый интерфейс для работы с репозиториями, разрешения зависимостей и обновления системы. &lt;code&gt;dpkg&lt;/code&gt; — низкоуровневый движок, который устанавливает, удаляет и анализирует отдельные &lt;code&gt;.deb&lt;/code&gt;-файлы без обращения к репозиториям.&lt;/p&gt;</description></item><item><title>pipx: изолированные Python-утилиты без боли</title><link>https://lead-devops.blackdevhub.online/posts/pipx/</link><pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/pipx/</guid><description>&lt;p&gt;pipx решает простую, но хроническую проблему: когда нужно запустить Python-утилиту однажды или разово, а &lt;code&gt;pip install&lt;/code&gt; засоряет глобальное окружение или требует виртуальное окружение, которое потом забываешь удалить. pipx создаёт изолированное venv для каждой утилиты, устанавливает туда зависимости и делает бинарник доступным в &lt;code&gt;$PATH&lt;/code&gt;. Одна команда — и утилита работает, не конфликтуя ни с чем.&lt;/p&gt;&#10;&lt;h2 id="что-такое-pipx-и-зачем-он-нужен"&gt;Что такое pipx и зачем он нужен&#10;&lt;/h2&gt;&#10;&lt;p&gt;pipx — это инструмент для установки и запуска Python-приложений в изолированных виртуальных окружениях. Каждая утилита живёт в своём venv под &lt;code&gt;~/.local/pipx/venvs/&lt;/code&gt;, а её console-scripts симлинкуются в &lt;code&gt;~/.local/bin/&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>uv — быстрый менеджер пакетов Python</title><link>https://lead-devops.blackdevhub.online/posts/uv-python-package-manager/</link><pubDate>Wed, 09 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/uv-python-package-manager/</guid><description>&lt;h2 id="что-такое-uv"&gt;Что такое uv&#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; — менеджер пакетов Python, написанный на Rust. Решает одну проблему: стандартный &lt;code&gt;pip&lt;/code&gt; медленно разрешает зависимости, а &lt;code&gt;poetry&lt;/code&gt; добавляет свою модель проектов поверх PEP 621. &lt;code&gt;uv&lt;/code&gt; работает поверх &lt;code&gt;pyproject.toml&lt;/code&gt;, совместим с PEP 621 и PEP 508, и делает это в разы быстрее.&lt;/p&gt;&#10;&lt;p&gt;Под капотом — кэширующий резолвер на Rust, который переиспользует данные из pip-совместимых индексов (PyPI по умолчанию). &lt;code&gt;uv&lt;/code&gt; может заменить &lt;code&gt;pip&lt;/code&gt;, &lt;code&gt;pip-tools&lt;/code&gt;, &lt;code&gt;virtualenv&lt;/code&gt; и &lt;code&gt;poetry&lt;/code&gt; в одном инструменте.&lt;/p&gt;</description></item><item><title>logrotate для своих демонов</title><link>https://lead-devops.blackdevhub.online/posts/logrotate-custom-daemons/</link><pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/logrotate-custom-daemons/</guid><description>&lt;p&gt;Логи демона разрастаются, а ротации нет — файл достигает десятков гигабайт, диск забивается, мониторинг ругается. systemd-journald и syslog-ng умеют вращать сами, но если у тебя свой демон пишет напрямую в файл, ротацию несёт logrotate. Вот как его настроить под конкретный сервис.&lt;/p&gt;&#10;&lt;h2 id="зачем-писать-свой-конфиг-logrotate"&gt;Зачем писать свой конфиг logrotate&#10;&lt;/h2&gt;&#10;&lt;p&gt;Пакеты из репозитория обычно ставят конфиг в &lt;code&gt;/etc/logrotate.d/&lt;/code&gt;, но для自建 демонов или собранных из исходников его нет. Без конфига файл растёт бесконтрольно. logrotate запускается через systemd-таймер (&lt;code&gt;logrotate.timer&lt;/code&gt;) или cron и читает все файлы из &lt;code&gt;/etc/logrotate.d/&lt;/code&gt;. Достаточно создать один файл — и цикл ротации заработает.&lt;/p&gt;</description></item><item><title>Rsync: бэкап каталога по SSH</title><link>https://lead-devops.blackdevhub.online/posts/rsync-ssh-backup/</link><pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/rsync-ssh-backup/</guid><description>&lt;h2 id="rsync-бэкап-каталога-по-ssh"&gt;Rsync: бэкап каталога по SSH&#10;&lt;/h2&gt;&#10;&lt;p&gt;Классический способ переложить каталог на удалённую машину — &lt;code&gt;rsync&lt;/code&gt; поверх SSH. Не нужно открывать дополнительных портов, трафик шифруется, а сам инструмент умеет докачивать изменения и сохранять метаданные. Одна команда — и бэкап готов.&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="базовая-команда-rsync-через-ssh"&gt;Базовая команда rsync через SSH&#10;&lt;/h2&gt;&#10;&lt;p&gt;Минимальный вызов для копирования локального каталога на удалённый хост:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-59164858-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-59164858-fence-0-viewport" data-td-code-viewport&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;rsync -avz /path/to/source/ user@host:/path/to/dest/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Слеш в конце у source имеет значение: без него rsync создаст на удалённой стороне подпапку &lt;code&gt;source/&lt;/code&gt;, с ним — скопирует содержимое напрямую в &lt;code&gt;dest/&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>tmux на проде после Screen</title><link>https://lead-devops.blackdevhub.online/posts/tmux-after-screen/</link><pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/tmux-after-screen/</guid><description>&lt;h2 id="почему-перешли-с-screen-на-tmux"&gt;Почему перешли с Screen на tmux&#10;&lt;/h2&gt;&#10;&lt;p&gt;Screen был нашим инструментом номер один ещё лет пять назад. Но после миграции кластера на новые серверы стало очевидно: &lt;code&gt;screen&lt;/code&gt; теряет сессию при обрыве SSH, если не настроен &lt;code&gt;hardstatus&lt;/code&gt;, а восстановление через &lt;code&gt;screen -r&lt;/code&gt; иногда ловит race condition при одновременном подключении нескольких админов. tmux решает оба вопроса из коробки — сессия живёт в памяти сервера, привязана к сокету, и подключение к ней не зависит от состояния TCP-соединения.&lt;/p&gt;</description></item><item><title>Создание своего SSH-бастион-сервера</title><link>https://lead-devops.blackdevhub.online/posts/ssh-bastion-server/</link><pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/ssh-bastion-server/</guid><description>&lt;h2 id="зачем-нужен-бастион-и-где-он-живёт"&gt;Зачем нужен бастион и где он живёт&#10;&lt;/h2&gt;&#10;&lt;p&gt;Бастион — единственная точка входа в приватный сегмент сети. Вместо того чтобы открывать SSH на каждом сервере из интернета, вы пускаете трафик через один хост, на котором настроена жёсткая политика доступа. Типичная схема: интернет → bastion (публичный IP) → внутренние серверы (только private subnet, SSH слушает на 127.0.0.1 или private interface).&lt;/p&gt;&#10;&lt;p&gt;Бастион живёт в демилитаризованной зоне (DMZ) или публичном подсети провайдера. Внутренние машины не имеют маршрута в интернет через бастион — обратный трафик идёт по инициированным соединениям. Это базовая модель, которую можно развернуть на любом VPS за 15 минут.&lt;/p&gt;</description></item><item><title>bpftrace: один процесс против тысячи syscalls</title><link>https://lead-devops.blackdevhub.online/posts/bpftrace-one-liners-replace-strace/</link><pubDate>Mon, 07 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/bpftrace-one-liners-replace-strace/</guid><description>&lt;p&gt;strace подвешивает процесс при каждом syscall. На live-сервере с 2000 RPS это означает таймауты и alerts. bpftrace работает через eBPF в ядре — трассировка идёт параллельно, без остановки процессов. Разница в накладных расходах — на порядки.&lt;/p&gt;&#10;&lt;h2 id="установка"&gt;Установка&#10;&lt;/h2&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-8ab7156d-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="11"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-8ab7156d-fence-0-viewport" data-td-code-viewport&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;&lt;span class="c1"&gt;# Debian / Ubuntu&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install bpftrace&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# RHEL / CentOS / Fedora&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dnf install bpftrace&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Arch&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -S bpftrace&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Проверка&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo bpftrace -V&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Для полного набора probe-ов нужны debug symbols:&lt;/p&gt;</description></item><item><title>ip: сетевая настройка и диагностика в CLI</title><link>https://lead-devops.blackdevhub.online/posts/ip-command-network-cli/</link><pubDate>Mon, 07 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/ip-command-network-cli/</guid><description>&lt;p&gt;Когда привычный ifconfig выдаёт пустую строку, а настройка маршрута через route требует отдельной команды — это не баг системы. Это iproute2, который в современных дистрибутивах вытеснил net-tools. Утилита ip из пакета iproute2 — стандартный интерфейс управления сетевым стеком Linux. Она покрывает интерфейсы, адреса, маршруты, ARP-кеш, правила маршрутизации и изоляцию через namespace.&lt;/p&gt;&#10;&lt;h2 id="зачем-iproute2-заменил-net-tools"&gt;Зачем iproute2 заменил net-tools&#10;&lt;/h2&gt;&#10;&lt;p&gt;net-tools (ifconfig, route, arp, netstat, nameif) появились в BSD и перешли в Linux в 90-х. К 2000-м стало очевидно: они не поддерживают VLAN, IPsec, QoS, multicast-маршрутизацию и Policy Routing. Каждая задача требовала отдельной команды с несвязанным синтаксисом.&lt;/p&gt;</description></item><item><title>nslookup и drill: DNS-разрешение в терминале</title><link>https://lead-devops.blackdevhub.online/posts/nslookup-drill-dns-resolution/</link><pubDate>Mon, 07 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/nslookup-drill-dns-resolution/</guid><description>&lt;p&gt;Сервер не резолвит домен, а пинги летят. Привычный dig под рукой нет — в BIOS уже грузится минимальный busybox. Или на хосте без bind-tools. nslookup и drill закрывают эту щель: первый встроен почти везде, второй даёт больше контекста при отладке.&lt;/p&gt;&#10;&lt;h2 id="nslookup-интерактивный-и-однострочный-режим"&gt;nslookup: интерактивный и однострочный режим&#10;&lt;/h2&gt;&#10;&lt;p&gt;nslookup входит в состав bind-utils и isc-dhcp-client. Работает в двух режимах.&lt;/p&gt;&#10;&lt;p&gt;Однострочный запрос:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-9194f769-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="" data-td-line-count="2"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-9194f769-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nslookup example.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nslookup example.com 8.8.8.8&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Интерактивный режим запускается без аргументов. Типичная сессия:&lt;/p&gt;</description></item><item><title>journalctl: фильтрация и форматирование логов systemd</title><link>https://lead-devops.blackdevhub.online/posts/journalctl-filtering-formatting/</link><pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/journalctl-filtering-formatting/</guid><description>&lt;p&gt;Логи пропали. Сервер перезагрузили — и привычный &lt;code&gt;less /var/log/syslog&lt;/code&gt; молчит. В современных дистрибутивах с systemd логи собирает journald, а читает их &lt;code&gt;journalctl&lt;/code&gt;. Если не знать его фильтры, работа с системой превращается в гадание.&lt;/p&gt;&#10;&lt;h2 id="почему-логи-исчезают-после-перезагрузки"&gt;Почему логи исчезают после перезагрузки&#10;&lt;/h2&gt;&#10;&lt;p&gt;По умолчанию journal хранит данные в &lt;code&gt;/run/log/journal/&lt;/code&gt; — это tmpfs, сбрасывается при ребуте. Чтобы логи переживали перезагрузку, создайте директорию:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-25fc14eb-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="2"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-25fc14eb-fence-0-viewport" data-td-code-viewport&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;sudo mkdir -p /var/log/journal&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemd-tmpfiles --create --prefix /var/log/journal&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;После этого перезапустите systemd-journald:&lt;/p&gt;</description></item><item><title>OpenSSL: проверка и разбор TLS-сертификатов в CLI</title><link>https://lead-devops.blackdevhub.online/posts/openssl-check-tls-certificates/</link><pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/openssl-check-tls-certificates/</guid><description>&lt;p&gt;Уже забыли, когда последний раз сертификат на проде протухал неожиданно? Знакомо. OpenSSL умеет отвечать на вопросы о TLS-сертификатах быстрее, чем любой чекер из маркетплейса. Разбираем ключевые сценарии без воды.&lt;/p&gt;&#10;&lt;h2 id="базовый-разбор-сертификата"&gt;Базовый разбор сертификата&#10;&lt;/h2&gt;&#10;&lt;p&gt;Первая команда, с которой начинается любая диагностика — текстовый дамп сертификата.&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-aee942c7-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-aee942c7-fence-0-viewport" data-td-code-viewport&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;openssl x509 -text -noout -in cert.pem&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Вывод показывает Subject, Issuer, сроки валидности, алгоритм подписи и публичный ключ. Для быстрой справки без простыни:&lt;/p&gt;</description></item><item><title>ProxyJump и bastion-хосты через ~/.ssh/config</title><link>https://lead-devops.blackdevhub.online/posts/ssh-proxyjump-bastion-config/</link><pubDate>Sun, 06 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/ssh-proxyjump-bastion-config/</guid><description>&lt;p&gt;Иногда сервер живет в приватной сети, без публичного IP. Единственная точка входа — bastion host с белым адресом. Руками набирать &lt;code&gt;ssh -J user@bastion user@private&lt;/code&gt; каждый раз — лишняя боль. Разберу, как настроить всё через &lt;code&gt;~/.ssh/config&lt;/code&gt;, чтобы ходить в приватные сети в одно касание.&lt;/p&gt;&#10;&lt;h2 id="зачем-нужен-bastion-host"&gt;Зачем нужен bastion host&#10;&lt;/h2&gt;&#10;&lt;p&gt;Bastion (jump host, jump box) — промежуточный сервер с публичным доступом, через который проксируются соединения к инфраструктуре без внешних адресов. Типичная схема:&lt;/p&gt;</description></item><item><title>auditd: логирование доступа к файлам и вызовам</title><link>https://lead-devops.blackdevhub.online/posts/auditd-file-syscall-logging/</link><pubDate>Sat, 05 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/auditd-file-syscall-logging/</guid><description>&lt;p&gt;Linux не пишет в syslog факт каждого обращения к &lt;code&gt;/etc/shadow&lt;/code&gt; или вызова &lt;code&gt;unlink&lt;/code&gt;. Для расследования инцидентов и compliance это критично. auditd решает эту задачу: подсистема ядра Linux Audit, которая фиксирует системные вызовы, доступ к файлам и не только.&lt;/p&gt;&#10;&lt;h2 id="установка-и-запуск"&gt;Установка и запуск&#10;&lt;/h2&gt;&#10;&lt;p&gt;auditd входит в пакет &lt;code&gt;audit&lt;/code&gt; и есть в любом дистрибутиве.&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-3e1bf69e-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="8"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-3e1bf69e-fence-0-viewport" data-td-code-viewport&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;&lt;span class="c1"&gt;# Debian/Ubuntu&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install auditd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# RHEL/CentOS/Alma&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yum install audit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Arch&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pacman -S audit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;После установки сервис запускается через systemd.&lt;/p&gt;</description></item><item><title>logrotate: автоматическая ротация и архивация логов</title><link>https://lead-devops.blackdevhub.online/posts/logrotate-auto-rotation/</link><pubDate>Sat, 05 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/logrotate-auto-rotation/</guid><description>&lt;p&gt;Логи приложений забивают диск за неделю, а rm *.log вручную — путь к проблемам. logrotate решает это сам: ротирует, сжимает и удаляет старые файлы по расписанию. Разберёмся, как это работает и как настроить за пять минут.&lt;/p&gt;&#10;&lt;h2 id="как-это-устроено"&gt;Как это устроено&#10;&lt;/h2&gt;&#10;&lt;p&gt;logrotate вызывается через cron ежедневно. Конфиг по умолчанию живёт в &lt;code&gt;/etc/logrotate.conf&lt;/code&gt;, а дополнительные конфиги подключаются из &lt;code&gt;/etc/logrotate.d/&lt;/code&gt;. При ротации текущий файл переименовывается, создаётся новый пустой, старые копии сжимаются и нумеруются.&lt;/p&gt;</description></item><item><title>sshd_config: минимум для стенда</title><link>https://lead-devops.blackdevhub.online/posts/sshd-config-baseline/</link><pubDate>Sat, 05 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/sshd-config-baseline/</guid><description>&lt;p&gt;SSH-доступ к стенду обычно открывают по-быстрому, а потом удивляются брутфорсу в логах. Базовый sshd_config, который отсекает типовые проблемы, укладывается в пять параметров и двадцать минут.&lt;/p&gt;&#10;&lt;h2 id="зачем-менять-умолчания"&gt;Зачем менять умолчания&#10;&lt;/h2&gt;&#10;&lt;p&gt;Дистрибутивные sshd идут с permissive-настройками: root-вход по паролю, без ограничений пользователей, три попытки авторизации. На стенде это терпимо, пока не появится в логах:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-5d23de63-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="" data-td-line-count="3"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-5d23de63-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Failed password for root from 1.2.3.4 port 42341 ssh2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Failed password for root from 1.2.3.4 port 42342 ssh2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Failed password for root from 1.2.3.4 port 42343 ssh2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Локальная сеть не означает доверенную. Конфигурация по умолчанию — это риск и шум в мониторинге.&lt;/p&gt;</description></item><item><title>systemd-run: запуск сервиса без unit-файла</title><link>https://lead-devops.blackdevhub.online/posts/systemd-run-transient-services/</link><pubDate>Sat, 05 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/systemd-run-transient-services/</guid><description>&lt;p&gt;Иногда нужно быстро поднять процесс под systemd, но писать unit-файл и класть его в /etc/systemd/system лень или нельзя — контейнер без systemd, чужая машина, временный запуск. На этот случай есть &lt;code&gt;systemd-run&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="зачем-systemd-run"&gt;Зачем systemd-run&#10;&lt;/h2&gt;&#10;&lt;p&gt;Инструмент создает &lt;strong&gt;transient unit&lt;/strong&gt; — юнит, который существует только в памяти systemd, без файла на диске. Это удобно, когда:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;нужен контроль ресурсов (cgroup) над разовым процессом;&lt;/li&gt;&#10;&lt;li&gt;важно, чтобы процесс пережил закрытие терминала;&lt;/li&gt;&#10;&lt;li&gt;хочется изолировать команду в отдельном слайсе.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;По сути, это обертка над &lt;code&gt;systemctl start&lt;/code&gt; для юнитов, которые никто не сохраняет.&lt;/p&gt;</description></item><item><title>curl: отладка HTTP в терминале</title><link>https://lead-devops.blackdevhub.online/posts/curl-http-debugging-cli/</link><pubDate>Fri, 04 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/curl-http-debugging-cli/</guid><description>&lt;p&gt;cURL — стандартный инструмент отладки HTTP в терминале. Работает из коробки в Linux и macOS, есть в большинстве Docker-образов. Если нужно быстро проверить API, посмотреть заголовки ответа или отловить проблему с редиректом — одной строки достаточно.&lt;/p&gt;&#10;&lt;h2 id="базовые-флаги-отладки"&gt;Базовые флаги отладки&#10;&lt;/h2&gt;&#10;&lt;p&gt;Самый частый сценарий — получить ответ и увидеть, что сервер отдал. Ключ &lt;code&gt;-i&lt;/code&gt; выводит заголовки перед телом, &lt;code&gt;-v&lt;/code&gt; включает подробный режим с деталями соединения.&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-38d1e288-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="2"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-38d1e288-fence-0-viewport" data-td-code-viewport&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;curl -i https://api.example.com/health&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -v https://api.example.com/health&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Разница: &lt;code&gt;-i&lt;/code&gt; показывает заголовки + тело, &lt;code&gt;-v&lt;/code&gt; добавляет DNS-резолв, TLS-handshake и отладочную информацию до запроса.&lt;/p&gt;</description></item><item><title>ethtool: диагностика и тюнинг сетевого интерфейса</title><link>https://lead-devops.blackdevhub.online/posts/ethtool-diagnosis-tuning-network-interface/</link><pubDate>Fri, 04 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/ethtool-diagnosis-tuning-network-interface/</guid><description>&lt;p&gt;Проблемы с сетевой картой редко видны снаружи — интерфейс поднят, IP назначен, iptables молчит, а потери пакетов или микрофризы проявляются только под нагрузкой. ethtool даёт прямой доступ к состоянию железа, драйвера и offload-механизмов, которые не показывает ни ip, ни netstat.&lt;/p&gt;&#10;&lt;h2 id="базовый-вывод-состояние-линка"&gt;Базовый вывод: состояние линка&#10;&lt;/h2&gt;&#10;&lt;p&gt;Установка элементарна:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-7bbcd663-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="5"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-7bbcd663-fence-0-viewport" data-td-code-viewport&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;&lt;span class="c1"&gt;# RHEL/Alma/Rocky&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dnf install ethtool -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Debian/Ubuntu&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install ethtool&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Без флагов ethtool выводит сводку по интерфейсу:&lt;/p&gt;</description></item><item><title>lsof: какие процессы слушают порт и держат файл</title><link>https://lead-devops.blackdevhub.online/posts/lsof-port-file-processes/</link><pubDate>Fri, 04 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/lsof-port-file-processes/</guid><description>&lt;p&gt;Сервис не стартует — порт 8080 занят. Разбираешься, кто именно его держит, и попутно выясняется, что тот же процесс держит конфиг, который ты хотел отредактировать. lsof отвечает на оба вопроса: какие процессы открыли файлы и сокеты.&lt;/p&gt;&#10;&lt;h2 id="слушающие-порты"&gt;Слушающие порты&#10;&lt;/h2&gt;&#10;&lt;p&gt;Классическая задача — найти, кто слушает конкретный порт.&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-99ae9cf6-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-99ae9cf6-fence-0-viewport" data-td-code-viewport&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;lsof -i -n -P&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="td-table-scroll td-table-scroll--static"&gt;&#10;&lt;table&gt;&#10; &lt;thead&gt;&#10; &lt;tr&gt;&#10; &lt;th scope="col"&gt;Флаг&lt;/th&gt;&#10; &lt;th scope="col"&gt;Действие&lt;/th&gt;&#10; &lt;/tr&gt;&#10; &lt;/thead&gt;&#10; &lt;tbody&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;-i&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Показать интернет-сокеты&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;-n&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Без DNS-резолва (IP вместо hostname)&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;tr&gt;&#10; &lt;td&gt;&lt;code&gt;-P&lt;/code&gt;&lt;/td&gt;&#10; &lt;td&gt;Без преобразования портов (80 вместо http)&lt;/td&gt;&#10; &lt;/tr&gt;&#10; &lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&#10;&lt;p&gt;Без &lt;code&gt;-n -P&lt;/code&gt; lsof тратит время на DNS и резолвит порты в имена сервисов из /etc/services. На продакшене это лишние секунды.&lt;/p&gt;</description></item><item><title>mc — консольный клиент S3</title><link>https://lead-devops.blackdevhub.online/posts/minio-mc-s3-client-usage/</link><pubDate>Fri, 04 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/minio-mc-s3-client-usage/</guid><description>&lt;p&gt;S3-хранилища — стандарт де-факто для объектных бакетов, бэкапов и статики. Когда AWS CLI кажется избыточным, а веб-консоль неудобной, выручает MinIO Client (&lt;code&gt;mc&lt;/code&gt;). Это консольный инструмент для любого S3-совместимого хранилища: MinIO, Yandex Cloud, AWS S3, Backblaze B2. Работает из коробки, не требует Python и настраивается за минуту.&lt;/p&gt;&#10;&lt;h2 id="установка"&gt;Установка&#10;&lt;/h2&gt;&#10;&lt;p&gt;Скачиваю бинарник и делаю исполняемым:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-44f02fc9-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="2"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-44f02fc9-fence-0-viewport" data-td-code-viewport&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;curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -o /usr/local/bin/mc &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; chmod +x /usr/local/bin/mc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Проверяю версию:&lt;/p&gt;</description></item><item><title>nftables: современный firewall для Linux-сервера</title><link>https://lead-devops.blackdevhub.online/posts/nftables-modern-firewall-linux/</link><pubDate>Fri, 04 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/nftables-modern-firewall-linux/</guid><description>&lt;div class="td-callout td-callout--warning" role="note"&gt;&#10; &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-triangle-exclamation" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;Предупреждение&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="td-callout__body"&gt;&#10;&lt;p&gt;Перед работой с nftables убедитесь, что есть физический или console-доступ к серверу. Ошибочная цепочка input может заблокировать SSH и отсечь от машины.&lt;/p&gt;&#10; &lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;nftables пришёл на смену iptables в ядре Linux начиная с версии 3.13. Если вы всё ещё пишете правила в стиле iptables — пора пересмотреть подход. nftables быстрее, имеет встроенную поддержку IPv4/IPv6 в одном интерфейсе и позволяет работать с ruleset как с целым, а не набирать команды по одной.&lt;/p&gt;</description></item><item><title>ss: socket statistics вместо устаревшего netstat</title><link>https://lead-devops.blackdevhub.online/posts/ss-replace-netstat/</link><pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/ss-replace-netstat/</guid><description>&lt;p&gt;Если &lt;code&gt;netstat&lt;/code&gt; зависает на сервере с десятками тысяч соединений — пора переходить на &lt;code&gt;ss&lt;/code&gt;. Утилита из пакета &lt;code&gt;iproute2&lt;/code&gt; работает напрямую с ядром через netlink, а не парсит &lt;code&gt;/proc/net/*&lt;/code&gt;. Результат — мгновенный вывод и меньше накладных расходов.&lt;/p&gt;&#10;&lt;h2 id="зачем-переходить-с-netstat"&gt;Зачем переходить с netstat&#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;netstat&lt;/code&gt; из &lt;code&gt;net-tools&lt;/code&gt; использует устаревшую схему: читает файлы из &lt;code&gt;/proc/net/tcp&lt;/code&gt;, &lt;code&gt;/proc/net/unix&lt;/code&gt; и преобразует числовые ID в символические имена. На сервере с активными соединениями это занимает секунды и нагружает CPU.&lt;/p&gt;</description></item><item><title>SSH Config: wildcards и подстановка переменных</title><link>https://lead-devops.blackdevhub.online/posts/ssh-config-wildcards-dynamic-variables/</link><pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/ssh-config-wildcards-dynamic-variables/</guid><description>&lt;p&gt;SSH-клиент читает ~/.ssh/config строчку за строчкой, но без переменных файл быстро превращается в копипасту. Разбираю, как Host *, Match exec и подстановки %h, %r, %l сокращают конфиг в разы и закрывают реальные сценарии — от динамической маршрутизации до проброса агента через bastion.&lt;/p&gt;&#10;&lt;h2 id="шаблоны-и-wildcards-в-ssh-config"&gt;Шаблоны и wildcards в SSH config&#10;&lt;/h2&gt;&#10;&lt;p&gt;SSH поддерживает glob-подобные шаблоны в директиве Host. Самая популярная — &lt;code&gt;Host *&lt;/code&gt;, но работают и составные паттерны.&lt;/p&gt;</description></item><item><title>strace: трассировка системных вызовов для диагностики зависаний и утечек</title><link>https://lead-devops.blackdevhub.online/posts/strace-syscall-troubleshooting/</link><pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/strace-syscall-troubleshooting/</guid><description>&lt;p&gt;При зависании сервиса стандартные инструменты — top, htop, ps — показывают состояние, но не причину. Если процесс в state D (uninterruptible sleep), значит он ждёт syscall. strace подключается к живому процессу и выводит каждый системный вызов в реальном времени. Это превращает загадочное зависание в конкретный syscall, его аргументы и код возврата.&lt;/p&gt;&#10;&lt;div class="td-callout td-callout--note" role="note"&gt;&#10; &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-circle-info" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;Примечание&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="td-callout__body"&gt;&#10;&lt;p&gt;strace работает через ptrace — механизм ядра для отладки. На продакшене трассировка замедляет процесс в 2–10 раз. Используйте точечно, на отдельном PID.&lt;/p&gt;</description></item><item><title>tcpdump и tshark: захват и анализ пакетов в CLI</title><link>https://lead-devops.blackdevhub.online/posts/tcpdump-tshark-cli-packet-capture/</link><pubDate>Thu, 03 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/tcpdump-tshark-cli-packet-capture/</guid><description>&lt;p&gt;При отладке сетевых проблем в Linux-инфраструктуре недостаточно &lt;code&gt;ping&lt;/code&gt; и &lt;code&gt;curl&lt;/code&gt;. Иногда нужно посмотреть, что реально ходит по проводу. tcpdump — стандартный инструмент для захвата пакетов из CLI. tshark — его побратим из набора Wireshark, удобный для скриптов.&lt;/p&gt;&#10;&lt;h2 id="быстрый-старт-с-tcpdump"&gt;Быстрый старт с tcpdump&#10;&lt;/h2&gt;&#10;&lt;p&gt;Проверим, что пакеты идут до хоста:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-557c0495-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-557c0495-fence-0-viewport" data-td-code-viewport&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;tcpdump -i eth0 host 10.0.0.5&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Утилита поднимает интерфейс в promiscuous mode и печатает каждую строку при прохождении пакета. По умолчанию работает с первым интерфейсом, который найдёт, но лучше указывать явно.&lt;/p&gt;</description></item><item><title>CasaOS: веб-панель для домашней лаборатории</title><link>https://lead-devops.blackdevhub.online/posts/casaos-home-lab/</link><pubDate>Wed, 02 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/casaos-home-lab/</guid><description>&lt;p&gt;Если у тебя несколько Docker-контейнеров на домашнем сервере и ты заходишь в веб-морду через порт каждого, пора что-то менять. CasaOS — это минималистичная веб-панель, которая объединяет контейнеры в единый интерфейс, позволяет ставить приложения в пару кликов и не требует настройки Nginx или Portainer.&lt;/p&gt;&#10;&lt;h2 id="установка"&gt;Установка&#10;&lt;/h2&gt;&#10;&lt;p&gt;CasaOS ставится на чистую систему одной командой. Поддерживает Debian 10+, Ubuntu 18.04+, Raspbian. Если Docker уже есть — сначала снеси его или ставь в отдельный контейнер.&lt;/p&gt;</description></item><item><title>cockpit-ufw-module: Uncomplicated Firewall в Cockpit</title><link>https://lead-devops.blackdevhub.online/posts/cockpit-ufw-module/</link><pubDate>Wed, 02 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/cockpit-ufw-module/</guid><description>&lt;p&gt;UFW на домашнем или небольшом сервере обычно настраивают по SSH: &lt;code&gt;ufw status numbered&lt;/code&gt;, затем &lt;code&gt;ufw allow 443/tcp&lt;/code&gt;. &lt;a href="https://gitlab.com/cockpit-modules/cockpit-ufw-module"&gt;cockpit-ufw-module&lt;/a&gt; закрывает тот же цикл в браузере: пакет, статус, политики, правила. Это одна из панелей группы &lt;a href="https://lead-devops.blackdevhub.online/posts/cockpit-modules/"&gt;cockpit-modules&lt;/a&gt; — пункт &lt;strong&gt;UFW&lt;/strong&gt; в разделе &lt;strong&gt;Tools&lt;/strong&gt;.&lt;/p&gt;&#10;&lt;p&gt;Интерфейс на русском, в стиле PatternFly v5. Нужны Cockpit &lt;strong&gt;264+&lt;/strong&gt; и права администратора для записи. Лицензия MIT, актуальный релиз — тег &lt;code&gt;v.1.0.1&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="зачем-панель-если-есть-ufw"&gt;Зачем панель, если есть &lt;code&gt;ufw&lt;/code&gt;&#10;&lt;/h2&gt;&#10;&lt;p&gt;Клиент уже есть: системный &lt;code&gt;ufw&lt;/code&gt;. Не хватает обзора без терминала и безопасного ввода: порт, CIDR, номер правила.&lt;/p&gt;</description></item><item><title>kubectl whoami и проверка прав сервис-аккаунта</title><link>https://lead-devops.blackdevhub.online/posts/kubectl-whoami-check-sa-rights/</link><pubDate>Wed, 02 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/kubectl-whoami-check-sa-rights/</guid><description>&lt;p&gt;При деплое приложения в Kubernetes самая частая ошибка — сервис-аккаунт не может сделать то, что должен. Permission denied при создании секрета, запрет на list pods, отказ на update. kubectl whoami и kubectl auth can-i позволяют быстро понять, кто именно и что именно не может.&lt;/p&gt;&#10;&lt;h2 id="утилита-kubectl-whoami"&gt;Утилита kubectl whoami&#10;&lt;/h2&gt;&#10;&lt;div class="td-callout td-callout--note" role="note"&gt;&#10; &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-circle-info" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;Примечание&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="td-callout__body"&gt;&#10;&lt;p&gt;kubectl whoami — это не встроенная команда kubectl. Это плагин из krew или отдельный бинарь. Установка: &lt;code&gt;kubectl krew install whoami&lt;/code&gt; или скачать с GitHub.&lt;/p&gt;</description></item><item><title>ngrep: grep по сетевым пакетам в реальном времени</title><link>https://lead-devops.blackdevhub.online/posts/ngrep-setevoy-grep/</link><pubDate>Wed, 02 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/ngrep-setevoy-grep/</guid><description>&lt;p&gt;Ngrep — утилита, которая ищет паттерны в сетевых пакетах так же, как grep ищет строки в файлах. Когда нужно понять, что конкретно передаётся по сети между двумя сервисами, а tcpdump выдаёт слишком много шума, ngrep позволяет отфильтровать только нужное содержимое.&lt;/p&gt;&#10;&lt;h2 id="установка"&gt;Установка&#10;&lt;/h2&gt;&#10;&lt;p&gt;Ngrep есть в стандартных репозиториях большинства дистрибутивов.&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-a9b0bdab-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="8"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-a9b0bdab-fence-0-viewport" data-td-code-viewport&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;&lt;span class="c1"&gt;# Debian/Ubuntu&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install ngrep&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# RHEL/CentOS/Alma&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yum install ngrep&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# macOS&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install ngrep&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Для работы требует root-привилегий илиcapabilities &lt;code&gt;CAP_NET_RAW&lt;/code&gt; и &lt;code&gt;CAP_NET_ADMIN&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>socat: проброс Unix-сокетов через TCP</title><link>https://lead-devops.blackdevhub.online/posts/socat-unix-socket-tcp-forwarding/</link><pubDate>Wed, 02 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/socat-unix-socket-tcp-forwarding/</guid><description>&lt;p&gt;Иногда нужно обратиться к Unix-сокету с хоста, где этот сокет физически не существует. SSH-туннель не поможет — он работает с TCP-портами. socat решает эту задачу: поднимает TCP- listener и пробрасывает соединения в Unix-сокет, а клиенту достаточно подключиться по сети.&lt;/p&gt;&#10;&lt;h2 id="установка"&gt;Установка&#10;&lt;/h2&gt;&#10;&lt;p&gt;Пакет есть в любом крупном дистрибутиве. На Debian/Ubuntu:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-f78a06f1-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="1"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-f78a06f1-fence-0-viewport" data-td-code-viewport&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;apt install socat&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;На RHEL/CentOS:&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-f78a06f1-fence-1" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="3"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-f78a06f1-fence-1-viewport" data-td-code-viewport&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;yum install socat&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# или&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf install socat&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;Alpine:&lt;/p&gt;</description></item><item><title>SSH escape-последовательности: оживление зависшего терминала</title><link>https://lead-devops.blackdevhub.online/posts/ssh-escape-sequences-frozen-terminal/</link><pubDate>Wed, 02 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/ssh-escape-sequences-frozen-terminal/</guid><description>&lt;p&gt;SSH-сессия зависла, &lt;code&gt;Ctrl+C&lt;/code&gt; не помогает, &lt;code&gt;Ctrl+D&lt;/code&gt; вываливает мусор — знакомая картина. Прежде чем закрывать терминал и терять сессию, попробуй встроенные escape-последовательности. Они работают на уровне SSH-клиента до того, как данные попадут на удалённый хост.&lt;/p&gt;&#10;&lt;h2 id="как-вызвать-escape-последовательность"&gt;Как вызвать escape-последовательность&#10;&lt;/h2&gt;&#10;&lt;p&gt;Escape-символ по умолчанию — тильда (&lt;code&gt;~&lt;/code&gt;). Комбинация срабатывает только в начале строки. Нажал Enter, затем &lt;code&gt;~&lt;/code&gt;, затем нужный символ. Например, &lt;code&gt;~.&lt;/code&gt; рвёт соединение.&lt;/p&gt;&#10;&lt;div class="td-callout td-callout--note" role="note"&gt;&#10; &lt;div class="td-callout__title"&gt;&lt;i class="td-callout__icon fa-solid fa-circle-info" aria-hidden="true"&gt;&lt;/i&gt;&lt;span class="td-callout__label"&gt;Примечание&lt;/span&gt;&lt;/div&gt;&#10; &lt;div class="td-callout__body"&gt;&#10;&lt;p&gt;Если тильда не срабатывает — проверь, что нажал Enter перед ней. В середине вывода терминала последовательность игнорируется.&lt;/p&gt;</description></item><item><title>Создание собственной службы Systemd</title><link>https://lead-devops.blackdevhub.online/posts/custom-systemd-service/</link><pubDate>Wed, 02 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/custom-systemd-service/</guid><description>&lt;p&gt;Приложение нужно запускать при старте сервера, перезапускать при падении и вести логи. Shell-скрипты в /etc/rc.local не дают ни перезапуска, ни зависимостей. Systemd решает всё это одной декларацией.&lt;/p&gt;&#10;&lt;h2 id="зачем-писать-свой-unit-файл"&gt;Зачем писать свой unit-файл&#10;&lt;/h2&gt;&#10;&lt;p&gt;Вместо скриптов и супервизоров вроде supervisord systemd даёт единый интерфейс управления службами. Он знает о сокетах, зависимостях, ресурсных лимитах и имеет встроенный journald для логов.&lt;/p&gt;&#10;&lt;h2 id="структура-unit-файла"&gt;Структура unit-файла&#10;&lt;/h2&gt;&#10;&lt;p&gt;Unit-файл — ini-подобный файл в &lt;code&gt;/etc/systemd/system/&lt;/code&gt; или &lt;code&gt;/run/systemd/system/&lt;/code&gt; для runtime. Имя формата &lt;code&gt;имя.service&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Что такое Self-Hosted и почему она так популярна</title><link>https://lead-devops.blackdevhub.online/posts/what-is-self-hosted/</link><pubDate>Wed, 02 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/what-is-self-hosted/</guid><description>&lt;p&gt;Вы платите за подписку на Notion, Dropbox и Google Drive. Затем Notion повышает цену, Dropbox ограничивает хранилище, а Google «улучшает» интерфейс Docs. Самостоятельный хостинг — это когда вы берёте инфраструктуру в свои руки и перестаёте зависеть от решений вендора.&lt;/p&gt;&#10;&lt;h2 id="определение-не-ваше-облако"&gt;Определение: не ваше облако&#10;&lt;/h2&gt;&#10;&lt;p&gt;Self-hosted — это модель, при которой вы разворачиваете и эксплуатируете приложения на собственных серверах или VPS вместо использования SaaS-аналогов. Сервер может стоять дома, в дата-центре или быть виртуалкой у хостера — главное, что железо под вашим контролем, а не у третьей стороны.&lt;/p&gt;</description></item><item><title>cockpit-modules: веб-панели для повседневной эксплуатации</title><link>https://lead-devops.blackdevhub.online/posts/cockpit-modules/</link><pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/cockpit-modules/</guid><description>&lt;p&gt;&lt;a href="https://cockpit-project.org/"&gt;Cockpit&lt;/a&gt; закрывает базовое администрирование Linux из браузера: сервисы, логи, сеть, аккаунты. Для файервола, fail2ban, cron и Let&amp;rsquo;s Encrypt штатного набора уже не хватает — либо нет панели, либо она слишком общая.&lt;/p&gt;&#10;&lt;p&gt;Группа &lt;a href="https://gitlab.com/cockpit-modules"&gt;cockpit-modules&lt;/a&gt; — набор отдельных модулей под эти задачи и магазин, через который их ставят на хост. Каждый модуль живёт в своём репозитории; ниже — карта группы, без разбора UI и команд. Про отдельные панели будут отдельные статьи.&lt;/p&gt;&#10;&lt;h2 id="зачем-отдельные-модули"&gt;Зачем отдельные модули&#10;&lt;/h2&gt;&#10;&lt;p&gt;Cockpit расширяется пакетами в &lt;code&gt;/usr/share/cockpit/&lt;/code&gt; (или в &lt;code&gt;~/.local/share/cockpit/&lt;/code&gt; для текущего пользователя). Модуль — это &lt;code&gt;manifest.json&lt;/code&gt;, HTML и JS, которые вызывают хостовые утилиты через &lt;code&gt;cockpit.spawn&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>dig: отладка DNS-запросов в CLI</title><link>https://lead-devops.blackdevhub.online/posts/dig-dns-cli-debugging/</link><pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/dig-dns-cli-debugging/</guid><description>&lt;p&gt;DNS- resolver отдал не тот адрес, клиенты не видят обновление, или просто непонятно, какой сервер сейчас отвечает на запросы. &lt;code&gt;dig&lt;/code&gt; (Domain Information Groper) — стандартный инструмент для диагностики DNS из терминала. Работает на Linux, macOS, есть в Windows через WSL.&lt;/p&gt;&#10;&lt;p&gt;Установка&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-a0aefd8a-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="bash" data-td-line-count="8"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-a0aefd8a-fence-0-viewport" data-td-code-viewport&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;&lt;span class="c1"&gt;# Debian/Ubuntu&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install dnsutils&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# RHEL/CentOS/Alma&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dnf install bind-utils&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# macOS — уже в системе&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Windows — через WSL или официальный бинарник ISC&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="базовые-флаги"&gt;Базовые флаги&#10;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;dig&lt;/code&gt; имеет два класса опций: короткие флаги (начинаются с &lt;code&gt;-&lt;/code&gt;) и ключевые слова с &lt;code&gt;+&lt;/code&gt;. Первые управляют поведением запроса, вторые — форматом вывода.&lt;/p&gt;</description></item><item><title>MkDocs: генератор документации из Markdown</title><link>https://lead-devops.blackdevhub.online/posts/mkdocs-quick-start/</link><pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/mkdocs-quick-start/</guid><description>&lt;p&gt;Документация в репозитории устаревает быстрее, чем её читают: ссылки в README ведут в никуда, разделы разбросаны по &lt;code&gt;docs/&lt;/code&gt;, &lt;code&gt;wiki/&lt;/code&gt; и confluence, а поиск по сайту не работает. MkDocs решает это предсказуемо — берёт папку с &lt;code&gt;.md&lt;/code&gt; файлами и собирает статический сайт. Один конфиг, одна команда для прода, привычный Markdown.&lt;/p&gt;&#10;&lt;h2 id="что-такое-mkdocs"&gt;Что такое MkDocs&#10;&lt;/h2&gt;&#10;&lt;p&gt;MkDocs — статический генератор сайта документации на Python. На входе: каталог с Markdown-файлами и YAML-конфиг. На выходе: готовый &lt;code&gt;site/&lt;/code&gt; с HTML, который отдаётся любым веб-сервером или хостится на GitHub Pages, GitLab Pages, S3. Сам MkDocs ядро рендеринга, а внешний вид и фичи задаёт тема. Стандарт де-факто — &lt;a href="https://squidfunk.github.io/mkdocs-material/"&gt;Material for MkDocs&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Squid: проброс интернета на удалённую ВМ</title><link>https://lead-devops.blackdevhub.online/posts/squid-proxy-remote-vm/</link><pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/squid-proxy-remote-vm/</guid><description>&lt;p&gt;Бывает так: твоя ВМ в облаке не имеет публичного IP или доступ в интернет через NAT закрыт, а деплой требует wget/curl изнутри. Squid на промежуточном хосте с нормальным каналом решает проблему за десять минут.&lt;/p&gt;&#10;&lt;h2 id="зачем-это-нужно"&gt;Зачем это нужно&#10;&lt;/h2&gt;&#10;&lt;p&gt;Пробрасываю интернет через Squid, когда ВМ в изолированном сегменте сети. Промежуточный хост с белым IP и доступом в сеть становится прокси-сервером. Приложение на удалённой машине ходит в интернет через туннель.&lt;/p&gt;</description></item><item><title>SSH-сертификаты вместо authorized_keys</title><link>https://lead-devops.blackdevhub.online/posts/ssh-certificates-instead-of-authorized-keys/</link><pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/ssh-certificates-instead-of-authorized-keys/</guid><description>&lt;p&gt;authorized_keys — это классика, но когда серверов больше десятка, начинается хаос. Добавление нового разработчика превращается в ручное скачивание ключей и раскладку по десяткам машин. SSH-сертификаты решают проблему: один CA-ключ подписывает все публичные ключи, и ни один authorized_keys не нужен.&lt;/p&gt;&#10;&lt;h2 id="зачем-authorized_keys--это-боль"&gt;Зачем authorized_keys — это боль&#10;&lt;/h2&gt;&#10;&lt;p&gt;Схема с authorized_keys требует, чтобы публичный ключ пользователя физически присутствовал на каждом сервере. При масштабировании это означает:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;отдельный шаг деплоя ключей при онбординге;&lt;/li&gt;&#10;&lt;li&gt;единая точка отзыва отсутствует — удаление из authorized_keys делается вручную на каждом хосте;&lt;/li&gt;&#10;&lt;li&gt;ротация ключей затрагивает все машины;&lt;/li&gt;&#10;&lt;li&gt;нет ограничения по времени действия ключа.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;SSH-сертификат подписывает публичный ключ пользователя или хоста центральным CA-ключом. Серверу достаточно доверять этому CA — сам ключ подкладывать не нужно.&lt;/p&gt;</description></item><item><title>systemd-timer: планирование вместо cron</title><link>https://lead-devops.blackdevhub.online/posts/systemd-timer-scheduling/</link><pubDate>Tue, 01 Sep 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/systemd-timer-scheduling/</guid><description>&lt;p&gt;cron работает, но его логи — текстовый файл без структуры, а зависимости от сервисов приходится городить через костыли вроде &lt;code&gt;Requires=&lt;/code&gt; в shell-скрипте. systemd-timer решает это: единый интерфейс управления, логи в journald, зависимости через familiar &lt;code&gt;After=&lt;/code&gt;, &lt;code&gt;WantedBy=&lt;/code&gt; — и всё в одном стеке.&lt;/p&gt;&#10;&lt;h2 id="структура-service-и-timer"&gt;Структура .service и .timer&#10;&lt;/h2&gt;&#10;&lt;p&gt;Таймер — это отдельный юнит, который запускает &lt;code&gt;.service&lt;/code&gt;. Разделение故意的: сервис можно вызывать и вручную, и по расписанию.&lt;/p&gt;&#10;&lt;div class="td-code td-code--untitled" id="td-code-7c9ce898-fence-0" data-td-code data-td-code-auto-id&#10; data-td-language="" data-td-line-count="3"&gt;&#10; &lt;div class="td-code__viewport" id="td-code-7c9ce898-fence-0-viewport" data-td-code-viewport&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/systemd/system/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── backup.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── backup.timer&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;backup.service — обычный юнит, можно запустить через &lt;code&gt;systemctl start backup.service&lt;/code&gt;.&lt;/p&gt;</description></item><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;&#10;&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;&#10;&lt;h2 id="минимальный-цикл"&gt;Минимальный цикл&#10;&lt;/h2&gt;&#10;&lt;p&gt;На сервере:&lt;/p&gt;</description></item><item><title>Kafka: проверка работоспособности кластера</title><link>https://lead-devops.blackdevhub.online/posts/kafka-cluster-health-check/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/kafka-cluster-health-check/</guid><description>&lt;p&gt;Kafka-кластер в KRaft-режиме не прощает, когда о нём забывают до первого инцидента. Проверять здоровье нужно регулярно и короткими командами — без графиков и дашбордов, прямо из консоли. Ниже — набор команд, которые закрывают типовой чек-лист: процессы, кворум, лидеры партиций, ISR и быстрый «светофор» одним вызовом.&lt;/p&gt;&#10;&lt;h2 id="проверка-процессов-kraft"&gt;Проверка процессов KRaft&#10;&lt;/h2&gt;&#10;&lt;p&gt;В режиме KRaft отдельного ZooKeeper нет, и роль &lt;code&gt;controller&lt;/code&gt; совмещена с ролью &lt;code&gt;broker&lt;/code&gt; или вынесена на отдельные ноды. Сначала убедимся, что JVM-процессы вообще живы, и посмотрим, в каком режиме стартовал каждый узел.&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;&#10;&lt;h2 id="зачем-kind"&gt;Зачем kind&#10;&lt;/h2&gt;&#10;&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>Too many authentication failures: SSH исчерпал попытки</title><link>https://lead-devops.blackdevhub.online/posts/ssh-too-many-authentication-failures/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/ssh-too-many-authentication-failures/</guid><description>&lt;p&gt;&lt;code&gt;Received disconnect from 10.0.0.5 port 22:2: Too many authentication failures&lt;/code&gt; и следом &lt;code&gt;Permission denied (publickey)&lt;/code&gt; — это не «сервер сломан» и не обязательно неверный пароль. Клиент &lt;strong&gt;потратил лимит попыток&lt;/strong&gt;, пока перебирал ключи из агента, и до нужного метода так и не дошёл.&lt;/p&gt;&#10;&lt;p&gt;Лимит задаёт &lt;code&gt;MaxAuthTries&lt;/code&gt; на сервере (по умолчанию &lt;strong&gt;6&lt;/strong&gt;). Каждый предложенный публичный ключ — отдельная попытка. Пять ключей в &lt;code&gt;ssh-agent&lt;/code&gt; плюс ещё один «не тот» — и соединение рвётся до пароля и до правильного ключа.&lt;/p&gt;</description></item><item><title>Настройка Cron: практический разбор</title><link>https://lead-devops.blackdevhub.online/posts/cron-setup/</link><pubDate>Mon, 31 Aug 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/posts/cron-setup/</guid><description>&lt;p&gt;Cron — стандартный планировщик в Linux, который встречается в каждой инфраструктуре. Задачи сыплются, логи копятся, окружение подводит. Разберём, как настраивать cron надёжно и где он не подходит.&lt;/p&gt;&#10;&lt;h2 id="когда-cron-нужен-а-когда-нет"&gt;Когда cron нужен, а когда нет&#10;&lt;/h2&gt;&#10;&lt;p&gt;Cron подходит для простых периодических задач: бэкапы, ротация логов, чистка временных файлов, периодические уведомления. Это демон, который спит между запусками — никаких ресурсов не ест.&lt;/p&gt;&#10;&lt;p&gt;Не используйте cron для:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;задач, требующих миллисекундной точности (cron запускает с точностью до минуты)&lt;/li&gt;&#10;&lt;li&gt;задач с жёсткими зависимостями от других сервисов (systemd-юниты с &lt;code&gt;After=&lt;/code&gt;)&lt;/li&gt;&#10;&lt;li&gt;долгих процессов, которые могут наложиться друг на друга (нужен lock)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="anatomy-of-a-crontab-entry"&gt;Anatomy of a crontab entry&#10;&lt;/h2&gt;&#10;&lt;p&gt;Формат строки:&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;&#10;&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;&#10;&lt;h2 id="что-именно-добавлять"&gt;Что именно добавлять&#10;&lt;/h2&gt;&#10;&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;</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;&#10;&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;&#10;&lt;h2 id="зачем-не-ещё-один-ssh-клиент"&gt;Зачем не ещё один SSH-клиент&#10;&lt;/h2&gt;&#10;&lt;p&gt;Клиент уже есть: системный &lt;code&gt;ssh&lt;/code&gt;. Нужен не новый протокол, а навигация по конфигу.&lt;/p&gt;&#10;&lt;p&gt;Утилита:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;читает &lt;code&gt;~/.ssh/config&lt;/code&gt; или другой файл (&lt;code&gt;-c&lt;/code&gt;);&lt;/li&gt;&#10;&lt;li&gt;показывает только конкретные &lt;code&gt;Host&lt;/code&gt;, без wildcard-шаблонов вроде &lt;code&gt;Host *&lt;/code&gt;;&lt;/li&gt;&#10;&lt;li&gt;учитывает &lt;code&gt;Include&lt;/code&gt; (до 16 уровней вложенности);&lt;/li&gt;&#10;&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;&#10;&lt;li&gt;после выхода из сессии снова открывает список.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&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><item><title>Обо мне</title><link>https://lead-devops.blackdevhub.online/about/</link><pubDate>Sun, 30 Aug 2026 00:00:00 +0000</pubDate><guid>https://lead-devops.blackdevhub.online/about/</guid><description>&lt;p&gt;Я Lead DevOps. Здесь пишу про IT: инфраструктуру, эксплуатацию и утилиты, которые реально использую в работе.&lt;/p&gt;&#10;&lt;h2 id="манифест"&gt;Манифест&#10;&lt;/h2&gt;&#10;&lt;p&gt;Этот проект создан для повышения квалификации специалистов DevOps.&lt;/p&gt;&#10;&lt;p&gt;Заметки — рабочие конспекты, а не витрина инструментов. В них разбирается эксплуатация так, как она выглядит на стенде: команды, настройки, типичные ошибки. Читать их стоит с намерением повторить приём у себя и увереннее держать инфраструктуру.&lt;/p&gt;</description></item></channel></rss>