Библиотека девопса | DevOps, SRE, Sysadmin
10.4K subscribers
1.87K photos
76 videos
5 files
3.28K links
Все самое полезное для девопсера в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/25874ec4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/6798b4e4509aba56522d1787
Download Telegram
⚡️ Три полезных алиаса для сети

Эти bash-алиасы упрощают проверку IP и портов. Добавьте их в ~/.bashrc или ~/.zshrc, перезапустите терминал.

Внешний IP одним словом:
myip() {
curl -s ifconfig.me
}


IP домена быстро:
ipinfo() {
dig +short "$1"
}


Открытые порты:
ports() {
ss -tuln
}


Скопируйте функции в файл настроек. Теперь myip, ipinfo google.com и ports работают из коробки.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#root_prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
⚙️ Теперь можно объяснить системе, почему она ошибается

Вышел APT 3.2. Главная новость не в истории транзакций, хотя и она там есть, а в двух новых командах, которых не хватало годами.

apt why <пакет> показывает, почему пакет установлен: кто его потянул, через какую цепочку зависимостей, какой solver принял решение.

apt why-not <пакет> объясняет, почему пакет не ставится: какой конфликт мешает, какое ограничение блокирует.

Пять новых команд для работы с прошлыми операциями:

apt history-list — список всех транзакций
apt history-info — детали конкретной
apt history-undo / apt history-redo — отменить или повторить
apt history-rollback — откат к более раннему состоянию системы

Solver3 стал умнее: доработаны backtracking, обработка провайдеров и логика выбора пакетов при апгрейде. Добавлена поддержка вариантов архитектуры CPU (amd64v2, amd64v3, amd64v4) - через поле Architecture: или настройку APT::Architecture-Variants. В файлах .sources появились поля Include и Exclude для фильтрации компонентов репозитория. Система больше не засыпает во время работы dpkg.

➡️ Источник

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#пульс_индустрии
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
✏️ Вопрос с собеса по Kubernetes

Что
даёт RollingUpdate с maxUnavailable: 0 и maxSurge: 1 в Deployment

strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1


Два параметра, которые вместе определяют как именно Kubernetes будет катить обновление. maxUnavailable говорит сколько подов может быть недоступно в процессе, maxSurge говорит сколько лишних подов можно поднять сверх желаемого количества.

Ответ: спрятали тут

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#задача_со_звёздочкой
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
👨‍💻 Убить процесс на порту одной командой

Знакомая ситуация: запускаем дев-сервер и получаем address already in use, идём гуглить как найти и убить процесс.

port-kill
решает это в одну команду:
# Убить что угодно на порту 3000
port-kill 3000

# Сразу несколько
port-kill 3000 5000 8080

# С подтверждением
port-kill 3000 --safe


Инструмент вырос далеко за пределы «убить порт». Умный рестарт запоминает команду, которой запустился процесс, и может поднять его снова:
port-kill --restart 3000
port-kill --show-restart-history


Обнаружение сервисов само находит npm-скрипты, docker-compose, Procfile и Python-приложения в текущем проекте:
port-kill --detect
port-kill --start npm:dev
port-kill --start docker:web


Установить:
curl -fsSL portkill.com/install | bash


➡️ Репозиторий

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🔄 Новая директива, совместимость с OpenSSL 4.0 и два бага

Вышел nginx 1.29.8. Посмотрим что нового.

Добавлена директива max_headers. Она ограничивает максимальное количество HTTP-заголовков в запросе. При превышении лимита сервер возвращает 400 Bad Request. Идея пришла из FreeNginx.

Добавлена совместимость с OpenSSL 4.0, альфа которого вышла недавно.

Директива include внутри блока geo теперь поддерживает wildcards.

Починили обработку HTTP-ответов с кодом 103 от проксируемых бэкендов. Исправлена недоступность переменных $request_port и $is_request_port в субзапросах.

➡️ Источник

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#пульс_индустрии
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 Разрабатываете ИИ-агентов, но всё ещё не уверены в их стабильности и прогнозируемости?

Мы поговорили с десятками разработчиков ИИ-агентов и сделали отдельный курс по AgentOps.

🧠 На нём вы узнаете:

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

📅 Старт: 19 мая.

👥 Спикеры — практики с опытом в AI и Data Science в крупных IT-компаниях, таких как Яндекс, Huawei, МТС и др.

Длительность: 6-12 недель в зависимости от тарифа.


🔗 Программа курса и другие подробности
⭐️ Little Snitch вышел для Linux

Авторы macOS-файрвола Little Snitch выпустили версию для Linux. Инструмент показывает, какие процессы и куда подключаются, и позволяет блокировать соединения в один клик.

Перехват трафика реализован через eBPF на уровне ядра. Основной код написан на Rust, интерфейс сделан как веб-приложение.

Little Snitch для Linux не является инструментом безопасности в полном смысле. eBPF имеет ограничения, и обойти файрвол технически возможно.

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

➡️ Источник | Инструмент

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🔄 Релизная неделя

Вспоминаем и освежаем все релизы недели

GNU nano 9.0

Главное изменение: переработанная горизонтальная прокрутка: теперь при приближении курсора к правому краю экрана все строки сдвигаются ровно настолько, чтобы курсор оставался в поле зрения.

GParted Live 1.8.1-3

Релиз построен на свежем снапшоте Debian Sid от 4 апреля и включает ядро Linux 6.19.10-1. Из заметного: исправлена ложная детекция ZFS на целых дисках через blkid, починены контрольные суммы файлов внутри live-системы: вместо sha256 теперь используется b3sum.

SQLite 3.53.0

Главное в этом релизе: исправление серьёзного бага повреждения базы в режиме WAL, который появился ещё в 3.51.

Linux 7.0 уже скоро

Вышел APT 3.2

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#дайджест_недели
Please open Telegram to view this post
VIEW IN TELEGRAM
🤯 Представьте, что ваш AI-агент работает так же предсказуемо, как обычный микросервис. Звучит утопически, но это именно то, к чему должна прийти разработка в 2026 году.

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

Наш обновлённый курс «Разработка AI-агентов» научит, как приручить этот хаос с помощью Python и современных фреймворков. Мы не будем учить «общаться» с нейросетью, мы будем строить из неё надёжный инструмент.

Что вы получите:


— понимание того, как управлять логикой агента на уровне кода;
— навыки работы с LangChain и библиотеками оркестрации;
— готовые паттерны для обработки ошибок и галлюцинаций;
— опыт создания систем, которые реально экономят время.

Есть пара мест со скидкой до завтра, решайтесь 👈🏻
😁1
🛠 Одна функция вместо десяти команд

Каждый раз, когда нужно распаковать архив, начинается одно и то же. Это tar.gz или tar.bz2? Какие там флаги у unrar? А 7z вообще как запускается? Приходится лезть в документацию или историю команд. Самописная функция extract() решает именно эту проблему.

Скопируйте функцию в ~/.bashrc или ~/.zshrc:

extract() {
if [ -f "$1" ]; then
case "$1" in
*.tar.bz2) tar xjf "$1" ;;
*.tar.gz) tar xzf "$1" ;;
*.bz2) bunzip2 "$1" ;;
*.rar) unrar x "$1" ;;
*.gz) gunzip "$1" ;;
*.tar) tar xf "$1" ;;
*.tbz2) tar xjf "$1" ;;
*.tgz) tar xzf "$1" ;;
*.zip) unzip "$1" ;;
*.7z) 7z x "$1" ;;
*) echo "unknown archive" ;;
esac
fi
}


Потом применяете изменения:
source ~/.bashrc


Функция определяет тип архива по расширению файла и сама выбирает нужную команду. Вы просто пишете extract имя_файла и получаете распакованное содержимое. Без флагов, без гугления, без ошибок из-за опечатки в параметрах.

Поддерживаемые форматы: tar.gz, tar.bz2, bz2, rar, gz, tar, tbz2, tgz, zip, 7z.

Один синтаксис для любого формата. Если файл не распознан, функция скажет unknown archive вместо того, чтобы молча упасть.

Что можно добавить

Базовая версия уже полезна, но её можно немного доработать. Например, добавить проверку, что нужная утилита вообще установлена, или выводить имя команды перед запуском. Вот расширенный вариант:
extract() {
if [ ! -f "$1" ]; then
echo "'$1' не найден"
return 1
fi

case "$1" in
*.tar.bz2) tar xjf "$1" ;;
*.tar.gz) tar xzf "$1" ;;
*.bz2) bunzip2 "$1" ;;
*.rar) unrar x "$1" ;;
*.gz) gunzip "$1" ;;
*.tar) tar xf "$1" ;;
*.tbz2) tar xjf "$1" ;;
*.tgz) tar xzf "$1" ;;
*.zip) unzip "$1" ;;
*.7z) 7z x "$1" ;;
*) echo "Формат не поддерживается: '$1'" ; return 1 ;;
esac
}


📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#root_prompt
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
👨‍💻 Минимум, который должен быть в каждом репозитории

Ручная проверка изменений в зависимостях не работает при любом серьёзном темпе разработки. Когда в PR меняется lockfile на тысячу строк, никто не будет вручную проверять каждый пакет. Именно так проскакивают вредоносные версии.

Минимальная настройка

• Dependabot для GitHub

Включите в настройках репозитория: Settings → Security → Dependabot. Потом добавьте конфиг:
# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
labels:
- "dependencies"
- "security"


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

• npm audit в CI

Добавьте шаг в пайплайн и запускайте его до тестов, а не после:
- name: Security audit
run: npm audit --audit-level=high


Флаг --audit-level=high завалит сборку только при уязвимостях уровня high и critical. Мелкие предупреждения не будут блокировать работу, но серьёзные проблемы не пройдут незамеченными.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
23 апреля в 18:30 (мск) пройдёт офлайн-митап MWS Cloud Platform «Под капотом: инфраструктура». Также будет онлайн-трансляция. В программе доклады инженеров, которые ежедневно решают нетривиальные задачи при работе над инфраструктурными сервисами облака. 

Вы сможете:

— узнать, с какими сложными архитектурными задачами сталкивались, как выбирали технологии и почему принимали те или иные решения
— подискутировать о разных подходах к решению схожих задач, задать вопросы,  поделиться своим опытом
— понять, как лучше и эффективнее использовать облачные технологии для решения ваших рабочих задач

После основной части — нетворкинг и угощения. Регистрируйтесь на митап! Это возможность обсудить нюансы, которые всплывают только в продакшене, и будут полезны на практике.

🗓23 апреля, начало в 18:30
📍Москва, Дом Культур, ул. Сретенка, 25

Вход бесплатный, но требуется регистрация и её подтверждение — количество мест ограничено.

Зарегистрироваться
🎮 DOOM прямо в терминале через curl

Кто-то сделал DOOM, который запускается через curl и рендерится в терминале ANSI-символами. Никаких зависимостей, никакого GUI — только браузер терминала и HTTP.

Как запустить:
curl -sL http://localhost:3000 | bash


Есть и второй вариант: без bash, чистым curl. Но тут придётся вручную переключить терминал в raw mode, иначе curl не увидит нажатие клавиши до Enter:
stty -echo -icanon min 1 time 0 && curl -sN -X POST -T - localhost:3000/play


После игры терминал нужно починить командой reset.

Сессии без активности удаляются через 60 секунд. Игра стартует сразу с E1M1 на сложности «Hurt me plenty», без меню.

➡️ Репозиторий

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#пульс_индустрии
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🌐 Открываем localhost в интернет

MekongTunnel это SSH-туннель сервер, написанный на Go. Он поднимает публичный HTTPS-URL для вашего локального приложения через SSH проброс удалённого порта.

Как запустить:
sudo curl -L https://github.com/MuyleangIng/MekongTunnel/releases/download/v1.1.0/mekong-linux-amd64 \
-o /usr/local/bin/mekong
sudo chmod +x /usr/local/bin/mekong


Для Linux amd64 меняете linux-amd64 на darwin-arm64 . Windows: скачиваете .exe и добавляете в PATH.

Запуск туннеля:
mekong 3000


В терминале появится публичный URL вида https://happy-tiger-a1b2c3d4.mekongtunnel.dev, QR-код для телефона и URL уже скопирован в буфер.

Или через чистый SSH без CLI:
ssh -t -R 80:localhost:8080 mekongtunnel.dev


Сервер имеет встроенную защиту от злоупотреблений. На один IP можно открыть не больше 3 туннелей, запросы ограничены 10 в секунду с бёрстом до 20. Если клиент переподключается слишком часто, IP блокируется на 15 минут.

Чтобы не попасть в блок, держите соединение живым:
ssh -t -R 80:localhost:8080 \
-o ServerAliveInterval=60 \
-o ServerAliveCountMax=3 \
yourdomain.com


📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🔄 Deepin 25.1.0

Китайский дистрибутив Deepin выпустил новую версию, подглядываем что нового.

Самое заметное по части производительности: переход ядра с 6.12 на 6.18. Туда вошёл планировщик BORE из CachyOS, который изначально делался для игр и плавного десктопа под нагрузкой.

Из неожиданного: Claw Mode. Это режим управления всей системой голосом или текстом на естественном языке. Говоришь «открой терминал и переименуй все файлы в папке Downloads по дате» — система выполняет.

ИИ-ассистент для текстов тоже переработан: теперь он сначала строит план, показывает его пользователю, тот может поправить, и только потом идёт генерация.

➡️ Источник

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#пульс_индустрии
Please open Telegram to view this post
VIEW IN TELEGRAM
1
👨‍💻 EXPOSE vs PUBLISH в Docker

EXPOSE и -p оба про порты, но работают по-разному. Один объявляет намерение, другой реально открывает доступ.

EXPOSE это документация, не настройка

EXPOSE в Dockerfile говорит только одно: "контейнер слушает этот порт". Это подсказка для разработчика и для Docker, но не более. Трафик снаружи всё равно не пройдёт:
FROM node:18
EXPOSE 3000
CMD ["node", "index.js"]


После docker build и docker run без дополнительных флагов порт 3000 недоступен с хоста. EXPOSE ничего не открывает.

PUBLISH это реальное пробрасывание порта

Флаг -p при запуске контейнера связывает порт хоста с портом контейнера. Вот это уже работает:
# хост:контейнер
docker run -p 8080:3000 myapp


Теперь запрос на localhost:8080 попадает в контейнер на порт 3000. Без -p — не попадает, даже если EXPOSE 3000 прописан.

Варианты использования -p:
# конкретный порт хоста
docker run -p 8080:3000 myapp

# случайный свободный порт хоста
docker run -p 3000 myapp

# только на localhost хоста, не наружу
docker run -p 127.0.0.1:8080:3000 myapp

# все порты из EXPOSE на случайные порты хоста
docker run -P myapp


Последний вариант с -P это единственный случай, когда EXPOSE влияет на поведение. Docker смотрит, какие порты объявлены через EXPOSE, и пробрасывает их все на случайные порты хоста.

В Docker Compose

Та же логика, другой синтаксис. expose — только между контейнерами внутри сети. ports — наружу на хост:
services:
app:
image: myapp
expose:
- "3000" # видно другим сервисам в сети, не хосту
ports:
- "8080:3000" # видно хосту


Важный момент: контейнеры в одной Compose-сети и так видят друг друга по всем портам без expose и без ports. Директива expose в Compose нужна только для явной документации намерений.

EXPOSE — документация для людей и инструментов. На реальный трафик не влияет. -p / ports — реальное пробрасывание, без него порт снаружи недоступен.

📍 Навигация: ВакансииЗадачиСобесы

🐸 Библиотека devops'a

#арсенал_инженера
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51