DevOps Brain 🧠
1.35K subscribers
132 photos
17 videos
130 links
Пишу про kubernetes, terraform, linux, сети, автоматизации и полезные тулзы. Без спама и щитпостинга.

Хотите пообщаться? @devopsbrain_chat

Автор: @itcaat
Download Telegram
Никогда не было и вот опять... Доброе утро 🫣

‼️🚨 BREAKING: An AI found a Linux kernel zero-day that roots every distribution since 2017. The exploit fits in 732 bytes of Python. Patch your kernel ASAP.

https://copy.fail/

---
Telegram | Github | YouTube | Twitter
7
Короче, ребята, по поводу того, что в ядре Linux нашли критическую дыру CVE-2026-31431.

Если кратко: это локальный root за один проход. Без танцев с бубном, без рейс-кондишнов и бесконечных циклов. Просто запускаешь скрипт на 700 байт - и ты админ.

Косяк зарыт в криптографической подсистеме (режим authencesn). Там при записи влетает лишних 4 байта мимо буфера. Но самое паршивое - куда они влетают. Они ложатся прямо в page cache. То есть на диске бинарник (тот же /usr/bin/su) чистый и хеш-суммы сходятся. Но в оперативке он уже модифицирован. Ядро верит кэшу, исполняет этот мусор в памяти и дает рута. Причем можно вылезти даже из контейнера.

Я протестировал эксплойт на разных виртуалках в разных клаудах и везде мне удалось легко получить root. Поэтому, если прямо сейчас у вас есть какие-то пользователи на ваших серверах - нужно срочно установить системные обновления/патчи на ваши сервера ( с ребутом ).

Если такой возможности нет, то делаем так:


### Отключаем какашку
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif.conf
rmmod algif_aead

### Смотрим что какашки больше нет и сбрасываем кеши
lsmod | grep algif
echo 3 > /proc/sys/vm/drop_caches

### Протестировать будет ли воспроизводиться эксплойт можно еще так:
python3 -c 'import socket;
s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0);
s.bind(("aead","authencesn(hmac(sha256),cbc(aes))"));
print("algif_aead successfully loaded, mitigation not effective; remove it with: # rmmod algif_aead")'


Patch now, cry later. Хорошей пятницы 😕

---
Telegram | Github | YouTube | Twitter
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥212
Если вы не успели обновить свои серваки, чтобы закрыть CVE-2026-31431, то и правильно сделали =)). Вышла уже новая критическая уязвимость – Dirty Frag. И снова любой локальный пользователь может поднять свои права до root.

Проблема затрагивает почти все дистрибутивы Linux, вышедшие с 2017 года. Похожа на недавний Copy Fail (см. предыдущий пост). Эксплойт уже в открытом доступе на GitHub вместе с инструкцией, так что школо-хакеры и ботнеты подтянутся быстро.

На текущий момент (8 мая 2026) патчей в официальных репозиториях популярных дистрибутивов еще нет. Ждем обновлений ядра в ближайшие дни.

Пока нет патча делаем временный костыль – отключаем модули esp4, esp6 и rxrpc. Если они вам не критичны для работы, выполните в терминале:


sh -c "printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' > /etc/modprobe.d/dirtyfrag.conf; rmmod esp4 esp6 rxrpc 2>/dev/null; true"


Как только прилетят обновы ядра – сразу ставим и ребутаемся. Это единственный нормальный способ закрыть вопрос.

Технические подробности и сам код эксплойта лежат тут: https://github.com/V4bel/dirtyfrag

Что-то мне подсказывает, что будет нас еще ждет много эксплойтов веселых и рахных. Берегите свои сервера, а я пока пойду потестирую эксплойт 😕
Please open Telegram to view this post
VIEW IN TELEGRAM
9🔥5😁2
Media is too big
VIEW IN TELEGRAM
Шо опять? 😈

Пару часов назад Уильям Боулинг и команда V12 выложила свежайший эксплойт для повышения привилегий – встречайте Fragnesia.

Как это работает:
1. Создается lookup-таблица из 256 значений, сопоставляя байты кейстрима AES-GCM с нужными нам IV (nonce).
2. Сплайсятся данные из целевого файла в TCP-сокет, а затем происходит переключение его в режим espintcp.
3. Ядро пытается расшифровать данные прямо в кэше страниц. Подбирая IV, заставляем алгоритм XOR-ить именно тот байт, который нам нужен, превращая оригинальный код в наш шелл-код.
4. Заменяются первые 192 байта su в памяти на стаб, вызывающий /bin/sh с правами root. При этом файл на диске остается нетронутым

Временный фикс:

rmmod esp4 esp6 rxrpc
printf 'install esp4 /bin/false\ninstall esp6 /bin/false\ninstall rxrpc /bin/false\n' > /etc/modprobe.d/dirtyfrag.conf


Похоже, мы вошли в эпоху, когда новости о критических уязвимостях в Linux выходят чаще, чем обновления в App Store. Не успели просохнуть патчи для первого Dirty Frag, как прилетела Fragnesia.

---
Telegram | Github | YouTube | Twitter
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥92
🔖Контейнер ≠ Docker [1/3]

Представьте: вы проходите собеседование в уважаемую компанию, и вам задают «любимый» вопрос: «А чем отличаются контейнеры от виртуальных машин?»

На самом деле сама постановка вопроса уже говорит о низкой квалификации собеседующего. Почему? Сейчас объясню.

Современные контейнеры давно вышли за рамки исключительно Linux namespaces и cgroups, а официальный стандарт OCI вообще допускает контейнеры на базе виртуальных машин.

Согласно OCI-спецификации: контейнер – это изолированная среда для выполнения процессов с настраиваемыми ограничениями ресурсов и уровнями изоляции. Ключевой момент здесь – среда выполнения, а не сам процесс. То есть контейнер – это не просто “изолированный процесс Linux” как многие думают, а стандартизированная среда запуска.

Но это ещё не всё – OCI допускает контейнеры, построенные поверх виртуализации. В этом случае изоляция достигается не namespaces (cgroups, seccomp, capabilities etc), а гипервизором.

Самая известная реализация VM-контейнеров – Kata Containers. Kata запускает OCI-контейнеры внутри лёгких виртуальных машин.

Как итог это позволяет получить:

- повышенную безопасность;
- изоляцию уровня виртуальных машин;
- относительно быстрый старт – там есть оверхед, но не сильно критичный.

Более того мы можем научить docker cli использовать runtime kata. Снаружи это выглядит как обычный контейнер, а внутри – microVM:


docker run --rm -it --runtime kata --cpus 0.5 ubuntu nproc


Короче: если собеседующий задаёт этот вопрос – бегите. Он застрял в 2015 году и перепутал Docker с религией.

Ну а в следующих частях я расскажу как использовать Kata Containers и Firecracker практике. Покажу как развернуть эту всю историю на сервере и запускать microVM для достижения максимально изоляции.

Если вам интересна эта тема - ставьте 🔥 и всем хорошей пятницы.

---
Telegram | Github | YouTube | Twitter
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥47
🔖Когда графики в Grafana врут?

Хотите разобраться почему графики показывают разные данные в grafana на разных интервалах и дипазонах? Сейчас мы с вами за 4 шага разберемся почему так происходит…

Я специально сделал гремучую смесь параметров в панели, чтобы детально показать что происходит под капотом. Нам важны три цифры со скрина:

• Окно в функции PromQL: increase(...[5m]).
• Interval: 10m.
• Глобальный диапазон: Last 7 days.

1. Какую сетку строит Grafana?

Смотрим на поле Interval – Grafana уже сама все посчитала и поставила 10m.

Interval один из самых важных параметров. Grafana использует его и в запросах в PromQL, и в визуализации панели.

Тут сработала математика самой Grafana: она взяла 7 дней, разделила на ширину панели в пикселях (Max data points = 1146), получила число в районе 8.6 минут и округлила его вверх до ближайшего красивого шага – 10 мин. Формула подсчета интервала там есть прямо рядом Time range / max data points.

В данном примере Grafana выполнит range query с шагом 10 минут: 12:00, 12:10, 12:20, 12:30...

Немного отвлечемся на другой немаловажный параметр - Min interval. Представим, что мы решили посмотреть детально и выделили на графике узкий отрезок – всего в 15 мин (вместо текущих 7 дней).

Исходя из формулы Interval = Time range / max data points получились бы интервалы в 0.76 сек. и это очень мало для корректной визуализации. Тут в игру вступает Min interval = 1m:

• Grafana видит, что расчетный шаг (0.76 сек) меньше, чем лимит (1m).
• Она говорит: “Окей, я не буду частить. Буду просить данные с шагом строго 1 мин.”.

По сути Min Interval это защита от бессмысленных маленьких интервалов.

С этим вроде разобрались – погнали смотреть что в запросе PromQL.

2. Какое окно считает Prometheus?

Когда Prometheus выполняет запрос для каждой точки, он видит твою функцию increase(...[5m]). Это значит в этой конкретной точке оглянись назад ровно на 5 минут и посчитай прирост счетчика.

Складываем это вместе и смотрим на хронологию:

• Точка 12:10: Prometheus смотрит назад на 5 мин. – оценивает отрезок с 12:05 до 12:10. Отдает значение. Grafana рисует точку.
• Точка 12:20: Prometheus делает шаг в 10 мин., встает на новую точку и снова смотрит назад на 5 минут – оценивает отрезок с 12:15 до 12:20.

3. Главный инсайт – на графике появились “слепые зоны”!

Заметили, что произошло?

• 1 точка покрыла интервал 12:05 - 12:10.
• 2 точка покрыла интервал 12:15 - 12:20.

А куда делся промежуток времени с 12:10 до 12:15? Он просто выпал из расчетов. Он не попал ни в первую точку, ни во вторую.

Когда интервал шага на графике (10m) больше, чем окно в самой функции ([5m]) – наше временное окно больше не скользит с пересечением. Оно начинает прыгать через промежутки времени, оставляя слепые зоны.

Если в промежуток с 12:10 до 12:15 бахнет жесткий всплеск – график его вообще не покажет, потому что Prometheus физически не заглянет в этот пятиминутный отрезок.

4. Как это исправить, чтобы график стал адекватным?

Тут важно понимать, что я специально сделал довольно спорные параметры панели, которые в реальной жизни я бы не стал применять. Но (как я уже говорил) они отлично подходят для демонстрации того, что происходит под капотом.

Самый правильный путь – переписать запрос на rate с динамическим интервалом $__rate_interval = max( $interval + scrape_interval , 4 × scrape_interval ).

$__rate_interval значительно уменьшает вероятность появления слепых зон и делает поведение графика гораздо стабильнее при смене диапазона.


rate(postfix_smtp_messages_processed_total{...}[$__rate_interval])


На самом деле $__rate_interval довольно крут тем, что на широких дипазонах Grafana сама передаст Prometheus окно в 10m подстроившись под шаг графика. А если бы мы смотрели узкий диапазон (например, 15 мин), то:

• interval = 0.76 с.
• 4 × scrape_interval = 1 мин.
• Итоговое окно = 1 мин. (а не 0.76 сек.)

То есть $__rate_interval всегда не меньше 1 мин (или 4×scrape_interval), что защищает от слишком маленьких окон.

А на этом у меня всё – ставьте лайки, задавайте вопросы

Telegram | Github | YouTube | X
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13❤‍🔥42
Media is too big
VIEW IN TELEGRAM
🔖Полезные TUI тулзы – syswatch

Случайно на днях нашел очень прикольный тул и решил его затестить на своей малинке – замена связке htop, iostat, iftop, vm_stat, powermetrics. Автор позиционирует его как "тул, который открываешь, когда что-то пошло не так".

И у него есть 2 интересные фичи, которые лично мне очень понравились:

• Timeline – тул хранит историю текущей сессии и позволяет "перемотать время назад" стрелками. Можно посмотреть, что происходило с процессами, CPU или памятью несколько минут назад.
• Отдельная вкладка Insights – в ней тул пытается объяснить проблему человеческим языком: в видео-примере к этому посту я запустил прожорливый процесс goroutines-test и видно как syswatch это обозначил.

В общем, использовать или нет syswatch "it's up to you", как говорится. Но ссылка на репу прилагается: https://github.com/matthart1983/syswatch.

Telegram | Github | YouTube | X
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥84
🔖 Кладбище AI-экспериментов: что остается, когда гаснет хайп

Индустрия сейчас совершает ту же ошибку, что и во времена взрывного перехода на микросервисы. Тогда все бросились дробить монолиты, не умея в автоматизацию. Сегодня все бросились внедрять AI, забыв про банальную инженерную гигиену.

Внедрить AI сегодня стало слишком просто. Достаточно взять любимый язык программирования, импортировать пару библиотек, дернуть API OpenAI или развернуть локальную модельку из Hugging Face – и вуаля, у вас готов "инновационный" фичер. Но именно эта доступность порождает самый опасный вид "people-долга" – культуру одноразового кода и брошенных интеграций.

Когда первая эйфория от работающего прототипа проходит, в недрах компании обнаруживается не только промпты, зашитые хардкодом прямо в середину бизнес-логики, но и зомби-интеграции. Брошенные инструменты, которые изначально планировались просто как эксперимент жрут деньги на инфраструктуру и поддержку. Эксперимент на пазуе, но "инновационный" тул лежит просто мертвым грузом.

И мое самое любимое – коллега придумал как автоматизировать работу целого отдела, накрутил туда из говна и палок AI-MVP и удачно продал это руководству как супер-инновацию. А через какое-то время свалил в закат. И вот сидят коллеги и думают – а что с этой инновацией делать и как вообще оно работало, как вносить изменения, поддерживать это добро и почему оно стало столько стоить.

Реальность AI-долга: Накрутить AI-автоматизацию или тул – это 10% усилий и пара дней работы. Поддерживать её в проде, обновлять базы эмбеддингов, следить за версионированием промптов и очищать код от следов неудачных тестов – это 90% времени, к которому команды вообще могут быть не готовы.


Так вот чтобы не пришлось потом с лопатой заниматься ликвидаций этого AI-долга – нужно менять паттерны поведения людей в компании:

• Платформенный подход вместо анархии. Не позволяйте каждой команде изобретать свой велосипед для интеграции с LLM. Выделите Core-команду (Platform Engineering), которая создаст единый внутренний API-шлюз для AI, стандартизирует логирование, аутентификацию и кеширование запросов.

• Вводить AI-гигиену. Эксперименты должны быть изолированы. Создайте жесткое правило: под каждый пилот выделяется изолированная песочница с ограниченным сроком жизни. Эксперимент завершен? Песочница уничтожается со всеми потрохами (базами, ключами API, пайплайнами). Чтобы перенести код в прод, он должен пройти тотальный рефакторинг и аудит.

Главный риск AI-трансформации сегодня – это не то, что ваши конкуренты внедрят AI быстрее. Главный риск – это захлебнуться в поддержке сотен полурабочих, грязных AI-инструментов и брошенных интеграций, которые вы или ваши коллеги нагенерировали в порыве энтузиазма.

Telegram | Github | YouTube | X
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19
This media is not supported in your browser
VIEW IN TELEGRAM
Делаю дорожки на даче с Linux. Профдеформация на месте 🤓

А у вас как выходные?
🔥12😁7💩2
🔖 Kafka: архитектура и базовые принципы — Часть 1

Ребята, я решил написать для вас серию статей про Kafka.

Она хорошо зайдет тем, кто пока знает про Kafka только то, что “это какая-то очередь”, но хочет спокойно разобраться без перегруза терминами. Начнём с базовых идей: зачем Kafka нужна, чем она отличается от обычных очередей, что такое broker, topic, producer и consumer.

Дальше постепенно дойдём до partition, offset, репликации, consumer groups и production-паттернов и производительности. Короче, попробуем пройти путь от “ничего не понятно” до “я понял как это работает на самом деле”.

Первая часть Kafka: архитектура и базовые принципы уже опубликована. Остальные 6-7 на подходе и постараюсь доделывать по одной каждый день, чтобы контекст не терялся. Enjoy...

—
Telegram | Github | YouTube | X
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥21❤‍🔥105
Forwarded from Devops Brain Test
🔖 Kafka: Partitions и Consumer Groups — Часть 2

В первой части разобрались, зачем Kafka вообще нужна.

Теперь переходим к механике, без которой Kafka не была бы Kafka: Partitions и Consumer Groups.

В ней мы разберём вместе c вами:
• зачем топики делят на партиции;
• почему порядок сообщений гарантируется только внутри одной партиции;
• как Producer выбирает, куда записать сообщение;
• почему Key так важен;
• как Consumer Group распределяет нагрузку между обработчиками;
• что будет, если consumer-ов больше, чем partition-ов.

Kafka – from 0 to hero:
• Kafka: архитектура и базовые принципы — Часть 1
• Kafka: Partitions и Consumer Groups — Часть 2
....

Далее уже в 3-й части поговорим про то, что Kafka физически хранит внутри Partition: Record, Offset и append-only log и почему именно так, а не иначе.

—
Telegram | Github | YouTube | X
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥9🔥31
Media is too big
VIEW IN TELEGRAM
Ленту моего твиттера последние 2 дня разрывает от двух вещей - складного айфона и мухи. И если с айфоном всё понятно, то релиз FlyGym 2.0 – действительно интересен.

Цифровая модель плодовой мушки моделирует тело, движения, зрение, обоняние и взаимодействие с окружением. Мы уже привыкли создавать виртуальных персонажей: рисуем внешность, синтезируем голос, даём LLM характер и биографию. Но здесь интересен другой принцип: поведение возникает из взаимодействия модели нервной системы, тела и среды.

Множество видео с тем как мушка водит автомобиль, играет в Mario и Doom, торгует криптой и ходит на концерты вы можете найти в твиттере. Муха буквально живёт свою лучшую жизнь.

Я решил исправить эту несправедливость и заставил ее немного поработать. Представляю вашему вниманию дежурного инженера, который следит за сервисами. А если сервис падает мой мух "бежит" эскалировать в чатик. Правда пока она ходит она как devops после корпората.

В общем, пока все спорят, заменит ли ИИ айтишников, у меня дежурит муха. Главное – не прихлопнуть прод 😆

—
Telegram | Github | YouTube | X
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9🔥51
🔖 AI больше не стыдно?

Обратили внимание, как быстро мы прошли фазу от “фууу, это нейрослоп” до состояния, когда уже даже лютые AI-нигилисты сдулись?

Была забавная промежуточная стадия, когда мы пытались вычленять сгенерированный контент по длинным тире, а блогеры вручную удаляли их из своих слоп-статей, чтобы не спалиться. А потом как-то очень быстро всем резко стало пофиг.

Нас приучили к тому, что AI теперь с нами везде, надолго и уходить никуда не собирается.

Если ещё полгода назад тебе приносили пуллик со словами “я тут нагенерил нейронкой, можете поревьювить?” – и у тебя от такого полыхало внутри, то теперь зайти с пулликом в вообще незнакомый бизнес-домен не только нормально, но и даже приветствуется.

Раньше незнание домена было ограничением. Чтобы полезть что-то менять, надо было сначала разобраться: почитать код, документацию, поговорить с людьми, понять, почему оно вообще устроено именно так.

Теперь порог входа почти исчез.

Ты можешь утром впервые увидеть сервис, через час обсуждать с AI его архитектуру, ещё через час принести вполне осмысленный пуллик людям, которые живут с этим сервисом несколько лет.

И с одной стороны – это офигенно.

Количество вещей, в которые ты потенциально способен залезть, выросло на порядок. Границы между “моё” и “я в этом ничего не понимаю” становятся сильно тоньше.

Но есть и обратная сторона.

AI очень хорошо убирает ощущение собственного незнания.

Раньше ты смотрел на незнакомую кодовую базу и был как Ольга Бузова: я ничего не понимаю вообще. И это было полезное состояние. Оно заставляло тебя задавать вопросы, анализировать и искать решение.

Теперь через десять минут разговора с AI у тебя уже есть объяснение архитектуры, список проблем, план рефакторинга и даже готовый код.

А понимание при этом могло вообще не появиться.

Наверное, главный навык ближайшего времени будет не в том, чтобы научиться пользоваться AI. Этому как раз все научатся довольно быстро.

А в том, чтобы не принять чужую уверенность нейронки за собственное понимание.

Ведь самое главное помнить, что ваш мозг как бюджет – если его не освоить, то в следующий раз он будет меньше.

—
Telegram | Github | YouTube | X
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22
This media is not supported in your browser
VIEW IN TELEGRAM
Только что релизнул net-peek v0.1.8. Этот маленький, но классный 🚳 на Go я сделал, когда надо было быстро понять кто поджирает трафика на серваке.

Можно, конечно, расчехлить tcpdump, добавить tshark, немного awk, но богу тулов нужны новые тулы😈.

Он показывает по каждому удалённому IP:
- входящую и исходящую скорость;
- сколько данных уже передано;
- количество активных соединений;
- подробности по каждому соединению.

Можно смотреть конкретный интерфейс или сразу все. Есть поиск, сортировка, пауза и отдельный gateway-режим для анализа трафика на NAT-сервере.
sudo net-peek -i all


В общем, делюсь с вами аккуратным TUI-монитором трафика. Репозиторий и инструкции как установить лежат тут: https://github.com/itcaat/net-peek.

Сохраните на будущее - кто знает когда он может понадобиться 🔫
—
Telegram | Github | YouTube | X
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥27
Ребята, хочу рассказать про конференцию, которую я бы сам с удовольствием посетил.

3 октября пройдет RWB Infra x Security Meetup — про инфраструктуру и безопасность. Темы, судя по программе, подобрали довольно близкие к тому, с чем мы постоянно сталкиваемся в работе.

Из Infra особенно интересны:
- тюнинг GitLab CE при быстром росте нагрузки
- PKI на базе Vault
- Kubernetes vs Bare Metal и что там может пойти не так
- построение DCIM и компромиссы, которые приходится принимать

В Security тоже есть любопытные темы: DevSecOps, управление уязвимостями, защита данных без привычного периметра и автоматизация доступов в большую инфраструктуру.

Всего будет 8 докладов в двух треках.
📅 3 октября, начало в 13:00
📍 Москва + онлайн

Если работаете с инфраструктурой, DevOps/SRE или безопасностью — я бы как минимум посмотрел программу.

Регистрация уже открыта, офлайн-места ограничены.

👉 Подробнее и регистрация: https://linkwb.ru/81BXU
🔥53
🔖 Наконец-то дождались: git branch --delete-merged

У нас у всех есть куча проектов. Мы работаем над фичами. Каждая фича - отдельная локальная ветка. Мы её делаем, пушим, открываем PR, PR мержат, ветку на сервере удаляют.

А локальная ветка остаётся. И так каждый раз. Через полгода у тебя в git branch тридцать восемь веток:
  feature/login
feature/login-fix
fix/typo
topic/auth
topic/auth-v2
...
main


И ты такой сидишь и думаешь: “Какая из них ещё живая? Какие уже смержены? Можно ли что-то удалить или я что-то потеряю?”.

И вот ты уже пишешь скрипт на коленке, который тебе должен всё почистить. Запускаешь его и вуаля, ты слегка ошибся и больше в твоей репе нет бранчей, паника и судорожный поиск решения на https://ohshitgit.com/.

В общем, короче. Harald Nordgren походу сам задолбался с этим и ребята только что релизнули Git 2.56, в котором запилили опцию delete-merged.

Самое классное, что команда супер простая и простая как полено (хоспадепрости patch-format с 100500 аргументами).
$ git branch --delete-merged 'origin/*' --dry-run
Would delete branch feature/login (was abc1234).
Would delete branch feature/login-fix (was def5678).
Would delete branch fix/typo (was 9876fed).


Посмотрел. Всё выглядит нормально. Запускаешь без --dry-run:
$ git branch --delete-merged 'origin/*'
Deleted branch feature/login (was abc1234).
Deleted branch feature/login-fix (was def5678).
Deleted branch fix/typo (was 9876fed).

Всё. Ветки, которые уже влиты в свой origin, снесены. Ветки, где есть неотправленная работа, - остались. Ветки с deleteMerged = false - остались. Ветки, которые ты вычеканил в другом worktree, - остались.

Это безопасно. Свои скрипты можно выкинуть. Также можно точечно чистить категориями topic-*, feature/*, origin/* .

В общем, если git branch уже не помещается в терминал - обновляемся на 2.56 и теперь вы знаете что делать.

—
Telegram | Github | YouTube | X
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥36
This media is not supported in your browser
VIEW IN TELEGRAM
🔖 Kafka: от первого сообщения до production

Наконец-то закончил писать серию статей про Kafka, которую надо читать вечерочком под пледиком и с чашечкой какао. 🙈

Вместе мы пройдем путь на примере классического интернет-магазина. Сначала отправим событие о заказе, потом разберём порядок сообщений, репликацию и производительность. А дальше посмотрим, что будет происходить в случае отказа тех или иных частей нашей архитектуры.

Мы постепенно будем усложнять систему и разбираться зачем нужен тот или иной механизм. Мы не просто узнаём, что делает acks, а смотрим, почему Kafka может подтвердить запись, а покупатель всё равно не получить письмо. Не просто включаем retry, а выясняем, когда повтор поможет, а когда нарушит порядок событий или повторно зарезервирует товар.

Это не пошаговая лабораторная, а моя попытка дать понятную основу для собственных решений: что выбрать, чем за это заплатить и что произойдёт при сбое.

- Kafka: архитектура и базовые принципы — Часть 1
- Kafka: как масштабируются Partitions, Consumer Groups и порядок сообщений — Часть 2
- Kafka: Record, Offset и Append-Only Log — Часть 3
- Kafka: репликация, Leader, Follower и ISR — Часть 4
- Kafka: что делает её производительной — Часть 5
- Kafka: события, команды, Topics и Keys — Часть 6
- Kafka: Retention, Compaction и контракты событий — Часть 7
- Kafka: гарантии доставки, Outbox и идемпотентность — Часть 8
- Kafka: Retry, DLQ и эксплуатация Consumer — Часть 9

И самое классное это то, что вы можете использовать симулятор по ходу прочтения, а после сразу перейти к практике взяв за основу мой url-shortener-demo. И не стесняйтесь оставлять свой фидбек и вопросы после прочтения.

ЗЫ Отдельное спасибо за ревью статей @denis_kp

—
Telegram | Github | YouTube | X
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31
Интересно, а насколько AI уже успел изменить нашу работу в DevOps и SRE?

Мы всё чаще отдаём нейросетям написание конфигов, разбор логов, генерацию Terraform и даже диагностику инцидентов. Но вот дать AI доступ к проду и разрешить ему самостоятельно что-то чинить – тут, думаю, многие уже задумаются 😁

Ребята из DevCrowd запустили исследование про SRE, DevOps и платформенных инженеров. Лично мне любопытно посмотреть на результаты по AI и дежурствам. И больше всего: действительно ли AI снижает нагрузку на инженеров или просто позволяет навешивать на них ещё больше задач 😁

В этом году там довольно разнообразные темы:
• Насколько мы вообще доверяем AI и готовы ли пускать его в прод?
• Стало ли больше инцидентов из-за сгенерированного кода?
• Какие навыки инженера AI пока не способен заменить?
• Сколько на самом деле стоят дежурства, переработки и постоянная ответственность за прод?
• Как меняются зарплаты, обязанности и требования к инженерам?

Опрос анонимный, занимает 10-12 минут. Результаты будут в начале декабря.

➡️ https://survey.devcrowd.ru/sre-2026

Ну и вопрос к вам: вы бы уже доверили AI самостоятельно устранять инциденты в проде или рано? 🤩

—
Telegram | Github | YouTube | X
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥2❤‍🔥1
🔖 Expr для Go: динамические правила вместо цепочек if

Сегодня я хочу немного отойти от типичных тем канала и поговорить о разработке на Go, а именно о пакете Expr и задачах, которые она решает.

Вы уже наверняка написали какое-то количество сервисов или программ, дополняющих вашу инфраструктуру на GoLang.

Почти у каждого такого сервиса есть конфигурация по типу такой:


min_replicas: 3
max_error_rate: 0.05


Ну и классическая обработка выглядит примерно так:


if readyReplicas >= cfg.MinReplicas && errorRate < cfg.MaxErrorRate {
// продолжаем операцию
}


Пока конфигурация небольшая, этого достаточно. Но затем меняется уже форма правила: в production нужны три реплики, в остальных окружениях достаточно одной; во время maintenance проверку нужно пропустить; error rate учитывается только для части сервисов.

В конфигурации появляются новые флаги и через некоторое время вы обнаруживаете кучу вложенных if, что делает код просто нечитабельным.

Но что если я вам скажу, что вместо цепочки if и вложенных условий можно хранить в конфигурации само правило. Expr скомпилирует его при загрузке или обновлении конфигурации, а затем приложение будет выполнять готовую программу с актуальными входными данными (вспоминаем alertmanager):


rule: >-
environment != "production" ||
maintenanceMode ||
(readyReplicas >= 3 && errorRate < 0.05)


При компиляции Expr проверит правило по Go-типам, а готовую программу затем можно многократно запускать с разными входными данными.

Давайте опишем структуру, которая одновременно будет служить входными данными и контрактом.


type ServiceState struct {
Environment string `expr:"environment"`
MaintenanceMode bool `expr:"maintenanceMode"`
ReadyReplicas int `expr:"readyReplicas"`
ErrorRate float64 `expr:"errorRate"`
}


Теперь загрузим строку из конфигурации и скомпилируем её:


program, err := expr.Compile(
config.Rule,
expr.Env(ServiceState{}),
expr.AsBool(),
)
if err != nil {
return fmt.Errorf("compile rule: %w", err)
}


После этого программу можно выполнить с реальными значениями:


state := ServiceState{
Environment: "production",
MaintenanceMode: false,
ReadyReplicas: 3,
ErrorRate: 0.02,
}

result, err := expr.Run(program, state)
if err != nil {
return err
}

allowed := result.(bool) // true


Приложение ничего не знает о внутреннем устройстве условия. В конфигурации можно изменить порог, добавить исключение или полностью заменить правило – код вокруг expr.Run останется прежним.

Внутри expr.Compile строка сначала превращается в abstract syntax tree. Затем checker связывает имена с полями ServiceState, optimizer упрощает дерево, а compiler создаёт инструкции для stack-based virtual machine. При expr.Run VM выполняет эти инструкции с переданными значениями.

Главный практический выигрыш Expr довольно простой: меняется правило – обновляется конфигурация; меняется набор доступных данных или поведение самого приложения – тогда уже пересобирается Go-код. Эта граница позволяет убрать растущие цепочки if, не превращая конфигурацию в полноценный язык сценариев.

Такое устройство и позволяет крутить правила динамически: дорогостоящую подготовку мы выполняем один раз на reload, а не для каждого запроса.

PS Playground и самая полная документация тут: https://expr-lang.org/

—
Telegram | Github | YouTube | X
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
This media is not supported in your browser
VIEW IN TELEGRAM
Ребята, делюсь с вами интересным бесплатным митапом от Orion soft и Онтико.

На митапе будут рассказывать про AI в проде и в задачах DevOps-инженеров.

• Orion soft про AI Gateway: единая точка входа для LLM, квоты, лимиты токенов, балансировка, фейловер и трейсинг. Отдельно затронут guardrails и фильтрацию чувствительных данных.
• VK Tech про свой опыт развития AI-агентов: от локального Codex/Claude до агента, встроенного в командные процессы. Jira, мессенджеры, ревью кода и деплой на стейдж после апрува.

📍 26 ноября, 18:30–22:00 · Москва + онлайн
После докладов — ужин 🍿, нетворкинг и шоу-игра.


Участие бесплатное 👏

Зарегистрироваться 👈
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥44