DevOps Brain 🧠

DevOps Brain 🧠

Пишу про kubernetes, terraform, linux, сети, автоматизации и полезные тулзы. Без спама и щитпостинга. Хотите пообщаться? @devopsbrain_chat Автор: @itcaat

Username
@devopsbrain
Category
Technologies
Country
RussiaRussia
Created
, 2 years
Subscribers1,346+2 in 2 days
Avg views per post, 7d392−48.1% vs prev 7d
ERR29.12%last 7 days

Subscribers, 30 days

Nov 2 – Nov 4+2 (+0.1%)

Show as table
DateSubscribers
Nov 2, 20261,344
Nov 3, 20261,344
Nov 4, 20261,346

Average views per post by day

By publication day

Show as table
DateAvg views per post
Oct 28, 2026755
Nov 2, 2026447
Nov 3, 2026337

Most viewed this month

  1. 01

    🔖 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

    GIF
    Views755
    Forwards93
    Reactions29
    Comments0
  2. 02

    Интересно, а насколько 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

    Textedited
    Views447
    Forwards2
    Reactions8
    Comments1
  3. 03

    🔖 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

    Photoedited
    Views337
    Forwards6
    Reactions5
    Comments0

Latest posts

#253Photoedited

🔖 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

Open in Telegram
Views337−34%vs avg
Forwards6
Reactions5
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
4 h210
16 h293
28 h337
  1. After 6 hours210
  2. After 24 hours337
  3. Total to date337
#252Textedited

Интересно, а насколько 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

Open in Telegram
Views447−13%vs avg
Forwards2
Reactions8
Comments1
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
8 h333
33 h447
  1. Total to date447
#251GIF

🔖 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

Open in Telegram
Views755+47%vs avg
Forwards93
Reactions29
Comments0
#250Textedited

🔖 Наконец-то дождались: 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

Open in Telegram
Views1,715+234%vs avg
Forwards51
Reactions35
Comments1
#249Photo

Ребята, хочу рассказать про конференцию, которую я бы сам с удовольствием посетил. 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

Open in Telegram
Views988+93%vs avg
Forwards3
Reactions8
Comments0
#248GIFedited
Views1,179+130%vs avg
Forwards29
Reactions27
Comments0
#247Photoedited

🔖 AI больше не стыдно? Обратили внимание, как быстро мы прошли фазу от “фууу, это нейрослоп” до состояния, когда уже даже лютые AI-нигилисты сдулись? Была забавная промежуточная стадия, когда мы пытались вычленять сгенерированный контент по длинным тире, а блогеры вручную удаляли их из своих слоп-статей, чтобы не спалиться. А потом как-то очень быстро всем резко стало пофиг. Нас приучили к тому, что AI теперь с нами везде, надолго и уходить никуда не собирается. Если ещё полгода назад тебе приносили пуллик со словами “я тут нагенерил нейронкой, можете поревьювить?” – и у тебя от такого полыхало внутри, то теперь зайти с пулликом в вообще незнакомый бизнес-домен не только нормально, но и даже приветствуется. Раньше незнание домена было ограничением. Чтобы полезть что-то менять, надо было сначала разобраться: почитать код, документацию, поговорить с людьми, понять, почему оно вообще устроено именно так. Теперь порог входа почти исчез. Ты можешь утром впервые увидеть сервис, через час обсуждать с AI его архитектуру, ещё через час принести вполне осмысленный пуллик людям, которые живут с этим сервисом несколько лет. И с одной стороны – это офигенно. Количество вещей, в которые ты потенциально способен залезть, выросло на порядок. Границы между “моё” и “я в этом ничего не понимаю” становятся сильно тоньше. Но есть и обратная сторона. AI очень хорошо убирает ощущение собственного незнания. Раньше ты смотрел на незнакомую кодовую базу и был как Ольга Бузова: я ничего не понимаю вообще. И это было полезное состояние. Оно заставляло тебя задавать вопросы, анализировать и искать решение. Теперь через десять минут разговора с AI у тебя уже есть объяснение архитектуры, список проблем, план рефакторинга и даже готовый код. А понимание при этом могло вообще не появиться. Наверное, главный навык ближайшего времени будет не в том, чтобы научиться пользоваться AI. Этому как раз все научатся довольно быстро. А в том, чтобы не принять чужую уверенность нейронки за собственное понимание. Ведь самое главное помнить, что ваш мозг как бюджет – если его не освоить, то в следующий раз он будет меньше. — Telegram | Github | YouTube | X

Open in Telegram
Views1,022+99%vs avg
Forwards6
Reactions22
Comments0
#246Videoedited

Ленту моего твиттера последние 2 дня разрывает от двух вещей - складного айфона и мухи. И если с айфоном всё понятно, то релиз FlyGym 2.0 – действительно интересен. Цифровая модель плодовой мушки моделирует тело, движения, зрение, обоняние и взаимодействие с окружением. Мы уже привыкли создавать виртуальных персонажей: рисуем внешность, синтезируем голос, даём LLM характер и биографию. Но здесь интересен другой принцип: поведение возникает из взаимодействия модели нервной системы, тела и среды. Множество видео с тем как мушка водит автомобиль, играет в Mario и Doom, торгует криптой и ходит на концерты вы можете найти в твиттере. Муха буквально живёт свою лучшую жизнь. Я решил исправить эту несправедливость и заставил ее немного поработать. Представляю вашему вниманию дежурного инженера, который следит за сервисами. А если сервис падает мой мух "бежит" эскалировать в чатик. Правда пока она ходит она как devops после корпората. В общем, пока все спорят, заменит ли ИИ айтишников, у меня дежурит муха. Главное – не прихлопнуть прод 😆 — Telegram | Github | YouTube | X

Open in Telegram
Views1,028+100%vs avg
Forwards9
Reactions15
Comments3
#244Photo
Views1,064+107%vs avg
Forwards24
Reactions13
Comments3
#243Photo
Views1,330+159%vs avg
Forwards42
Reactions36
Comments0

All posts

Connections