DevOps Brain 🧠


Гео и язык канала: Россия, Русский
Категория: Технологии


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

Связанные каналы

Гео и язык канала
Россия, Русский
Категория
Технологии
Статистика
Фильтр публикаций


Видео недоступно для предпросмотра
Смотреть в Telegram
Делаю дорожки на даче с Linux. Профдеформация на месте 🤓

А у вас как выходные?


🔖 Кладбище 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


Видео недоступно для предпросмотра
Смотреть в 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


🔖Когда графики в 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


🔖Контейнер ≠ 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


Видео недоступно для предпросмотра
Смотреть в 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


Если вы не успели обновить свои серваки, чтобы закрыть 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

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


Короче, ребята, по поводу того, что в ядре 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


Никогда не было и вот опять... Доброе утро 🫣

‼️🚨 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


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

Возможно вам что-то из этого будет полезно 🙂

1. Grafana + Proxmox
Пошарил дашборд Multi-Cluster Proxmox Pulse Overview.
Даёт быстрый обзор нагрузки по нодам и VM — удобно для первичной диагностики без лишнего кликанья.

2. cli-stash → bulk insert
Добавил возможность массово загружать команды (спасибо sai21-learn за пулик). Напомню тем кто не знает – это тулза для часто используемых и сложных CLI-команд – сильно ускоряет работу.


# Bulk add commands
cli-stash add "echo 'hello world'" "ls -la"
cli-stash add --bulk "git status, docker ps, kubectl get pods"

# Add commands from a file
cli-stash add --file commands.txt


3. Smart Tabs 1.0.20 → виджеты
В дополнении для хрома Smart Tabs теперь можно встраивать произвольные данные (например, метрики из Prometheus) прямо в интерфейс. Будет отображаться на отдельной панели виджетов внизу.

---
Telegram | Github | YouTube | Twitter


Отпуск закончился, а вместе с ним и семейная поездка в Шанхай. Хочу поделиться с вами фотографиями и поделиться нюансами, если вы тоже решите туда сгонять. Long story short: “стоит ли туда вообще лететь? Однозначно да!”.

💳 Обязательно ставим AliPay. Я регистрировался просто по email, так как SMS не приходила. Вообще alipay must have в Китае. Вы сможете там и на наличку жить, но это очень неудобно. Например, меню большинства рестиков это qr-код на столе. Сканите прямо в alipay, закаываете, тут же платите и заказ приносят. Обязательно пройдите KYC. В интернетах есть инструкции.

Бабки загонять можно через крипту p2p в приложении HTX. Процесс максимально простой: переводите свою крипту на кошелек в HTX и дальше просто выбираете CNY → Размещаете ордер → Кидаете свой QR в чат с покупателем → Он вам переводит на алик, а вы подтверждаете получение. Ни разу не подводило.

🏝 Обязательно ставим trip.com. Супер нужное приложение для путешествия по Китаю и не только. Там вы можете за рубли купить ESIM, билеты на любые достопримечательности, поезда, авиабилеты, выставки. Также вы сможете почитать опыт других путешественников. Это такой комбайн с соцсетью внутри - прям мастхев.

ESIM активируйте до вылета в Китай. Там конечно будет WIFI в аэропорту Шанхая, но мало-ли - лучше сделать заранее. И включите роумнинг на esim, а то я затупил и ходил ругался что ничего не работает. =)

Также за день до вылета заполните арривал кард. В принципе можно и прилету сделать, но в домашней обстановке как то поспокойнее.

Я не буду описывать все достопримечательности - их вы найдете на том же trip.com, где и сможете себе выбрать что-то по душе от зоопарков до прышков с парашютом. Кстати, там же я рассказал как можно прокатиться на беспилотном такси.

🎧 В общем - не забывайте ходить, ездить или ползти в отпуска. А то тут видел недавно твит: чел радовался айфону в качестве компенсации, что он 2 года в отпуске не был.

А мой отпуск всё и я побежал делать свои задачки и пойду готовить для вас интересные посты. Кстати книгу скоро разыграем тоже - я помню =)

---
Telegram | Github | YouTube | Twitter


Какую книгу?
Опрос
  •   «Высоконагруженные приложения. Программирование, масштабирование, поддержка»
  •   «Site Reliability Engineering. Надежность и безотказность как в Google»
  •   «Основы инженерии данных»
  •   «Распределенные данные»
  •   «System Design: подготовка к интервью»
  •   «System Design: пережить интервью»
  •   «Чистая архитектура»
  •   «Семь баз данных за семь недель»
41 голосов


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

Пусть все говорят «можно спросить у ИИ». Но это как списывать решения, не понимая, как они получены. Книга в первую очередь заставляет думать. Медленно, местами больно, иногда с возвращением назад и перечитыванием.

Но именно в этот момент и происходит магия🪄 – формируется мышление. Не просто набор ответов, а способность задавать правильные вопросы, видеть причинно-следственные связи и понимать, где у решения границы применимости. Так что ИИ – это ускоритель. Книги – это база. Без базы ускорять нечего.

Я тут подумал – давайте разыграем одну из книг, которые лично мне помогали формировать ту самую базу. Единственное, что мне надо будет чуть времени, чтобы разобраться как делают розыгыши в телеге. А пока выберите какую книгу – через пару минут я скину голосовалку :loading:

• «Высоконагруженные приложения. Программирование, масштабирование, поддержка» — Мартин Клеппман.
• «Site Reliability Engineering. Надежность и безотказность как в Google» – Б. Бейер, К. Джоунс, Дж. Петофф, Н. Р. Мёрфи.
• «Основы инженерии данных» – Джо Райс, Мэтт Хаусли.
• «Распределенные данные» – Алекс Петров.
• «System Design: подготовка к интервью» – Алекс Сюй.
• «System Design: пережить интервью» – Чжиюн Тань.
• «Чистая архитектура. Искусство разработки программного обеспечения» – Роберт Мартин.
• «Семь баз данных за семь недель» – Эрик Редмонд, Джим Уилсон.

---
Telegram | Github | YouTube | Twitter

800 0 15 12 14

🔖Полезные TUI тулзы termshark

Иногда кажется, что сообщество просто постепенно переписывает весь GUI в терминал 🙂

В продолжении цикла постов про крутые TUI-тулзов сегодня на очереди инструмент termshark. Это по сути Wireshark в терминале.

Что умеет:

• открывать pcap-файлы
сниффить интерфейсы в реальном времени
• использовать display filters из Wireshark
• смотреть TCP/UDP стримы
• анализировать network conversations по протоколам
• копировать диапазоны пакетов прямо из терминала

Работает это всё через tshark, так что под капотом тот же Wireshark-движок. Особенно удобно, когда ты сидишь на удалённом сервере, а рядом лежит pcap на пару десятков гигабайт, и идея тащить его к себе через scp выглядит сомнительно.

Просто скармливаешь pcap и спокойно разбираешь трафик прямо по SSH:


termshark -r dump.pcap


https://github.com/gcla/termshark

---
Telegram | Github | YouTube | Twitter


🔖 Приватная сеть в ZeroTier за пару минут

Ребята, решил я недавно поиграться с Dokploy в рамках экспериментов n8n и AI-ассистента. Ну и пока настраивал, заодно решил показать вам ZeroTier.

ZeroTier – это сервис, который позволяет объединить устройства через интернет так, будто они находятся в одной локальной сети.

На самом деле очень крутая штука, тем более что в рамках free-тарифа можно добавить до 10 устройств. Таким образом у нас будет крутая overlay-сеть и мы можем изи-пизи объединить все наши VPS, ноутбуки и телефоны. И самое главное, что будет не важно, что они сидят за NAT. А вся настройка отнимет у вас минут 10:

1. Регаемся на сайте https://www.zerotier.com и прыгаем в личный кабинет.

2. Там создаем новую сеть. Cохраняем себе Network ID. Он понадобиться чтобы к сети присоединиться. У меня это 3b19b3a716137783.

3. Идем на страницу загрузки клиентов https://www.zerotier.com/download. Копируем команду установки и ставим на VPS сервер:

curl -s https://install.zerotier.com | sudo bash


4. Теперь подключимся сразу к новой сети pets. После выполнения получите 200 join OK.


sudo zerotier-cli join 3b19b3a716137783


5. Переходим в админку в нашу сеть pets и авторизуем клиента.

6. Теперь я добавлю локальную машинку. Качаю клиента под свою ОС чтобы оказаться в приватной сети с VPS. Там ввожу Network ID для подключения и делаю апрув в админке.

7. Zerotire нам выдаст рандомный ойпешник в приватной сети. Давайте слегка это исправим. Нырнем в админке в устройство 8b26a132b7 (это VPS) и пропишем в Managed IPs красивый ойпешник 10.75.142.1.

На этом базовая настройка завершена. Устройства будут видеть друг друга в рамках приватной сети 10.75.142.0/24.

Но для большей безопасности и удобства (иначе зачем это всё?) надо настроить firewall. У меня стоит Dokploy, поэтому я хочу сделать открытыми порты 80 и 443. А всё остальное будет открыто только в сети ZeroTier. (ens3 - это внешний интерфейс на VPS, zt+ - это интерфейсы ZeroTier)

8. Подключимся к VPS 10.75.142.1ЭТО ВАЖНО и забекапим текущие правила на всякий.

iptables-save > /root/iptables.backup.$(date +%F_%H%M).rules


9. Закрываемся от мира. Обратите внимание – после применения этих правил доступа к ssh по внешнему интерфейсу не будет. Но так и задумано!


# Сначала базовые allow (в начало)
iptables -I INPUT 1 -i zt+ -j ACCEPT
iptables -I INPUT 2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -I INPUT 3 -i lo -j ACCEPT

# Публично только 80/443 через ens3
iptables -I INPUT 4 -i ens3 -p tcp --dport 80 -j ACCEPT
iptables -I INPUT 5 -i ens3 -p tcp --dport 443 -j ACCEPT

# Всё остальное входящее — DROP
iptables -P INPUT DROP

iptables -F DOCKER-USER

# Разрешаем ответы
iptables -A DOCKER-USER -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# ZeroTier полный доступ
iptables -A DOCKER-USER -i zt+ -j ACCEPT
iptables -A DOCKER-USER -o zt+ -j ACCEPT

# Контейнерам можно инициировать соединения наружу
iptables -A DOCKER-USER -i docker0 -j ACCEPT

# Снаружи (ens3) только 80/443
iptables -A DOCKER-USER -i ens3 -p tcp --dport 80 -j ACCEPT
iptables -A DOCKER-USER -i ens3 -p tcp --dport 443 -j ACCEPT

# Остальное снаружи в docker — DROP
iptables -A DOCKER-USER -i ens3 -j DROP

iptables -A DOCKER-USER -j RETURN


Установим iptables-persistent и сохраним правила, чтобы не отрыгнуло после ребута


apt-get update && apt-get install -y iptables-persistent && netfilter-persistent save


В итоге мы получаем приватную сеть с нашими девайсами, которые видят друг друга напрямую. А для внешнего интерфейса открыт только 80 и 443 – в моем случае это Traefik в docker. И теперь на VPS если я сделаю гадость вот так:


docker run -d --name my-redis -p 6379:6379 redis:latest


То порт 6379 будет доступен только в приватной сети:


$ nmap 138.124.75.165 -p6379 -PN
PORT STATE SERVICE
6379/tcp filtered redis

$ nmap 10.75.142.1 -p6379
PORT STATE SERVICE
6379/tcp open redis


ZeroTier подходит и для более сложных кейсов. Но это уже другая история...

А статью со скриншотами можно почитать тут.

---
Telegram | Github | YouTube | Twitter


В продолжении вчерашнего поста про идею создать себе AI-ассистента на базе telegram+ n8n…Решил немного поделиться с вами к чему я пришел и где я продолбался.

👏 Скажу сразу у меня получилось собрать MVP. Из плюсов – оно работает и у меня уже есть какой-то базовый ассистент. Я могу в него голосом говорить, фотки документов отправлять (кстати надо добавить туда юриста) через телегу, могу сохранять ссылки, создавать события в календаре, есть финансовый консультант и даже DBA/Sysadmin/Sre и сетевик в одном лице =) И это ОФИГЕТЬ КАК УДОБНО!

Первым делом я выпилил selfhosted supabase (нафиг он нужон то был?!) и воткнул обычный postgres + vector extension. И теперь моей виртуалочке не так больно, а то load avarage в 178 это было жоска. Ну и прикрутил туда cloudbeaver, чтобы в базку ходить и запросики выполнять. Избыточно, но просто давно хотел посмотреть на веб-версию dbeaver.

✍️ Дальше нарисовал схемку бд со слоями памяти:

conversations (рабочая память) – всё что я говорил и что отвечал ассистент. Используется для контекста текущего и прошлых разговоров. С вектором embedding можно семантически искать релевантные прошлые сообщения.

user_rules(правила пользователя) – это для оркестратора. Если ассистенту сказали “Запомни, меня надо называть МОЙ ПОВЕЛИТЕЛЬ”, то он будет так обращаться. Еще для примера можно сказать “Запомни, всегда отвечай кратко”. Суть вы поняли – через эту штуку можно корректировать поведение.

agent_memories(память конкретных агентов) – это отдельный слой, который ты спрашиваешь. Каждый агент (путешественник, финансист, айтишник и т.д.) хранит свои наблюдения о пользователе – например, психолог запомнит "у пользователя тревожность по поводу работы”.

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

☔️ Ну а теперь где я продолбался. И это (барабанная дробь …) single-hop архитектура. Я протупил в самом начале и теперь оркестратор выбирает одного агента и на этом цепочка заканчивается. Таким образом агенты изолированы – ни один из них не может вызвать другого.

Разберем на реальном примере: "Найди когда нам надо на прививку коту и создай запись в календаре". Orchestrator может выбрать только одного. Если выберет Ветеринара – тот ответит датой, но не создаст событие. Если выберет Календарь – у него нет знаний о прививках. А это явно не то что хочется получить в конце.

Система полностью stateless, нет multi-turn диалога. Если я попрошу создать в календаре событие – агент просто это сделает. Он не проверяет, свободно ли 15:00. По хорошему надо добавить (добавить List Events перед Create) и агент должен сказать: "В 15:00 занято, создать всё равно?". Принять следующее сообщение "да" / "нет" / "тогда в 16:00" в контексте этого вопроса и действовать от этого. Что бы это решить надо pending_actions табличку чтобы контекст не терялся. Ну и прикрутить какой то таймаут для контекста.

Короче, получается как в известном меме: “Миша, всё … – давай по новой” (с)

PS И ребят, если вам интересно что в итоге получится – пролайкате пост 😕, мне хочется понять, что небольшой перекос в продуктовые эксперименты вам тоже ок.

---
Telegram | Github | YouTube | Twitter


Репост из: Devops Brain Test
В продолжении вчерашнего поста про идею создать себе AI-ассистента на базе telegram+ n8n…Решил немного поделиться с вами к чему я пришел и где я продолбался.

👏 Скажу сразу у меня получилось собрать MVP. Из плюсов – оно работает и у меня уже есть какой-то базовый ассистент. Я могу в него голосом говорить, фотки документов отправлять (кстати надо добавить туда юриста) через телегу, могу сохранять ссылки, создавать события в календаре, есть финансовый консультант и даже DBA/Sysadmin/Sre и сетевик в одном лице =) И это ОФИГЕТЬ КАК УДОБНО!

Первым делом я выпилил selfhosted supabase (нафиг он нужон то был?!) и воткнул обычный postgres + vector extension. И теперь моей виртуалочке не так больно, а то load avarage в 178 это было жоска. Ну и прикрутил туда cloudbeaver, чтобы в базку ходить и запросики выполнять. Избыточно, но просто давно хотел посмотреть на веб-версию dbveaver.

✍️ Дальше нарисовал схемку бд со слоями памяти:

conversations (рабочая память) – всё что я говорил и что отвечал ассистент. Используется для контекста текущего и прошлых разговоров. С вектором embedding можно семантически искать релевантные прошлые сообщения.

user_rules(правила пользователя) – это для оркестратора. Если ассистенту сказали “Запомни, меня надо называть МОЙ ПОВЕЛИТЕЛЬ”, то он будет так обращаться. Еще для примера можно сказать “Запомни, всегда отвечай кратко”. Суть вы поняли – через эту штуку можно корректировать поведение.

agent_memories(память конкретных агентов) – это отдельный слой, который ты спрашиваешь. Каждый агент (путешественник, финансист, айтишник и т.д.) хранит свои наблюдения о пользователе – например, психолог запомнит "у пользователя тревожность по поводу работы”.

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

☔️ Ну а теперь где я продолбался. И это (барабанная дробь …) single-hop архитектура. Я протупил в самом начале и теперь оркестратор выбирает одного агента и на этом цепочка заканчивается. Таким образом агенты изолированы – ни один из них не может вызвать другого.

Разберем на реальном примере: "Найди когда нам надо на прививку коту и создай запись в календаре". Orchestrator может выбрать только одного. Если выберет Ветеринара – тот ответит датой, но не создаст событие. Если выберет Календарь – у него нет знаний о прививках. А это явно не то что хочется получить в конце.

Система полностью stateless, нет multi-turn диалога. Если я попрошу создать в календаре событие – агент просто это сделает. Он не проверяет, свободно ли 15:00. По хорошему надо добавить (добавить List Events перед Create) и агент должен сказать: "В 15:00 занято, создать всё равно?". Принять следующее сообщение "да" / "нет" / "тогда в 16:00" в контексте этого вопроса и действовать от этого. Что бы это решить надо pending_actions табличку чтобы контекст не терялся. Ну и прикрутить какой то таймаут для контекста.

Короче, получается как в известном меме: “Миша, всё … – давай по новой” (с)

PS И ребят, если вам интересно что в итоге получится – пролайкате пост 😕, мне хочется понять, что небольшой перекос в продуктовые эксперименты вам тоже ок.

---
Telegram | Github | YouTube | Twitter


Информации стало слишком много и нужно что-то с этим делать. Сколько у вас там сохранных статей и видео, которые вы скорее всего никогда не прочитаете и не посмотрите?

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

И проблема даже не в том, что мы плохие и ленивые - дело в контексте. Мы думаем да - это классная статья, я сохраню и потом прочитаю. Но когда настает время прочитать появляется другая классная статья. А через какое-то время еще и еще… А ваш контекст уже переключился на что-то другое и вот в вашей коллекции еще один артифакт.

А что по поводу внезапных идей? Мы идем по улице и БАЦ к вам приходит какая то мысль: это может быть какое улучшение, новый сервис или вы поняли как решить проблему, которую не могли решить уже несколько дней. Хочется куда записать… В голосовухи? В телегу в Saved Messages который итак уже скоро разорвет от хаоса внутри? Короче, это боль. Я умею структурировать данные, я просто не хочу больше это делать. Мне надело быть “оператором ЭВМ” (в 90-е была такая профессия кстати).

И вчера вечером я немного завис над созданием Telegram-бота в роли персонального мультиагентного асситента с памятью о всех переписках и данных которые в него попадут. Я хочу мини-монстрика, в который кормишь просто любую инфу, узкопрофильные вопросы (например по автомобилю, бизнесу, ветеринарии для кошки и тд), свои календари, внутренню базу знаний и оно автоматом все структурирует. Пока цель MVP просто кидаю текст, голос, ссылку или документ в pdf формате в бота и потом могу обращаться через бота к этим данным, например также отправив голосовуху: “Напомни мою идею про то как починить прод =)”. А еще сразу хочу, чтобы если мог попросить ответить голосом, на случай если я за рулем, то оно слало голосовуху.

Почему не взять готовые инструменты? Не хочу. Да, вот так тупо. Мне интерсно поковыряться в векторных базках и построить что-то сложное на базе n8n. В итоге поставил selfhosted n8n + supabase на тестовую вмку где-то в Нидерландах, что бы накрутить MVP и сразу получил в бубен по утилизации =)).

Ну и вопрос к вам - вы как у себя решаете эту проблему структурирования информации и сколько оно отнимает у вас времени и сил?

---
Telegram | Github | YouTube | Twitter


🔖Полезные TUI тулзы snitch

Нашел htop для сетевых соединений - назвается snitch.

Открываешь и сразу понятно:
• кто слушает порт
• какой PID
• какой процесс
• какие соединения висят в established
• куда сервис вообще ходит
• можно прибить прямо из интерфейса

Также можно фильтровать TCP/UDP, отдельно LISTEN, отдельно ESTABLISHED, искать, сортировать.

Ставится "изи-пизи":


brew install snitch
или


go install github.com/karol-broda/snitch@latest

Забрать тут: https://github.com/karol-broda/snitch

---
Telegram | Github | YouTube | Twitter

Показано 19 последних публикаций.