Библиотека девопса | DevOps, SRE, Sysadmin
Все самое полезное для девопсера в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/25874ec4 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/6798b4e4509aba56522d1787
إظهار المزيد📈 نظرة تحليلية على قناة تيليجرام Библиотека девопса | DevOps, SRE, Sysadmin
تُعد قناة Библиотека девопса | DevOps, SRE, Sysadmin (@devopsslib) في القطاع اللغوي الروسية لاعباً نشطاً. يضم المجتمع حالياً 10 431 مشتركاً، محتلاً المرتبة 11 852 في فئة التكنولوجيات والتطبيقات والمرتبة 62 915 في منطقة روسيا.
📊 مؤشرات الجمهور والحراك
منذ تأسيسه في невідомо، حقق المشروع نمواً سريعاً وجمع 10 431 مشتركاً.
بحسب آخر البيانات بتاريخ 10 يونيو, 2026، تحافظ القناة على نشاط مستقر. خلال آخر 30 يوماً تغيّر عدد الأعضاء بمقدار 0، وفي آخر 24 ساعة بمقدار 0، مع بقاء الوصول العام مرتفعاً.
- حالة التحقق: غير موثّقة
- معدل التفاعل (ER): يبلغ متوسط تفاعل الجمهور 8.49%. وخلال أول 24 ساعة من النشر يحصد المحتوى عادةً 5.65% من ردود الفعل نسبةً إلى إجمالي المشتركين.
- وصول المنشورات: يحصل كل منشور على متوسط 886 مشاهدة. وخلال اليوم الأول يجمع عادةً 589 مشاهدة.
- التفاعلات والاستجابة: يتفاعل الجمهور بانتظام؛ متوسط التفاعلات لكل منشور يبلغ 4.
- الاهتمامات الموضوعية: يركز المحتوى على مواضيع رئيسية مثل devops'a, навигация, скрипт, docker, git.
📝 الوصف وسياسة المحتوى
يصف المؤلف القناة بأنها مساحة للتعبير عن الآراء الذاتية:
“Все самое полезное для девопсера в одном канале.
По рекламе: @proglib_adv
Учиться у нас: https://proglib.io/w/25874ec4
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/6798b4e4509aba56522d1787”
بفضل وتيرة التحديث المرتفعة (أحدث البيانات بتاريخ 11 يونيو, 2026) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.
max_headers. Она ограничивает максимальное количество HTTP-заголовков в запросе. При превышении лимита сервер возвращает 400 Bad Request. Идея пришла из FreeNginx.
Добавлена совместимость с OpenSSL 4.0, альфа которого вышла недавно.
Директива include внутри блока geo теперь поддерживает wildcards.
Починили обработку HTTP-ответов с кодом 103 от проксируемых бэкендов. Исправлена недоступность переменных $request_port и $is_request_port в субзапросах.
➡️ Источник
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#пульс_индустрии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
#арсенал_инженераRollingUpdate с maxUnavailable: 0 и maxSurge: 1 в Deployment
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
Два параметра, которые вместе определяют как именно Kubernetes будет катить обновление. maxUnavailable говорит сколько подов может быть недоступно в процессе, maxSurge говорит сколько лишних подов можно поднять сверх желаемого количества.
Ответ: спрятали тут
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#задача_со_звёздочкой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
#пульс_индустрииmyip() {
curl -s ifconfig.me
}
IP домена быстро:
ipinfo() {
dig +short "$1"
}
Открытые порты:
ports() {
ss -tuln
}
Скопируйте функции в файл настроек. Теперь myip, ipinfo google.com и ports работают из коробки.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#root_prompt0 это успех. Всё остальное — ошибка.
Что происходит без системы
Скрипт упал с кодом 1. Что это значит? Непонятно. Другой скрипт упал с 1. Тоже непонятно и это уже другой скрипт. CI/CD pipeline ловит ошибку и не знает, что делать дальше. Дебаггинг превращается в угадайку.
Как сделать нормально: диапазоны
Разбейте коды на логические группы:
0 -> успех 1-9 -> общие ошибки 10-19 -> плохие аргументы / входные данные 20-29 -> ошибки файловой системы 30-39 -> сеть 40-49 -> права доступа 50-99 -> внутренние ошибкиКоды 126-255 зарезервированы системой. Не трогайте. Дайте кодам имена Не пишите
exit 20. Напишите так:
EXIT_FILE_NOT_FOUND=20
EXIT_PERMISSION_DENIED=40
EXIT_NETWORK_FAIL=30
Скрипт становится самодокументируемым. Через полгода вы скажете себе спасибо.
Вынесите коды в отдельный файл
Если скриптов несколько, то создайте exit_codes.sh и подключайте его через source exit_codes.sh.
Всегда проверяйте внешние команды:
cp file1 file2
if [ $? -ne 0 ]; then
echo "Копирование не удалось" >&2
exit $EXIT_FILE_WRITE_ERROR
fi
Никогда не игнорируйте статус выхода внешних команд. Молчаливые ошибки это худшие ошибки.
Документируйте ошибки. Тестируйте сценарии падений, а не только успех. Оставляйте зазоры в диапазонах для будущих случаев.
Маленькая деталь, которая отличает скрипт на коленке от production-ready инструмента.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#арсенал_инженераnpm install может подтянуть новые версии из диапазонов ^ и ~, если кто-то запустит команду в неподходящий момент.
Было:
{
"dependencies": {
"axios": "^1.7.9", // любой 1.x.x
"express": "~4.18.0", // только 4.18.x
"react": "^19.0.0" // любой 19.x.x
}
}
Стало:
{
"dependencies": {
"axios": "1.7.9",
"express": "4.18.2",
"react": "19.0.0"
}
}
Безопасность патчей
"А как же security updates?" Лучше получать их осознанно через PR, чем во время сборки. Автоматические обновления приносят не только фиксы, но и риски сломать проект.
Dependabot или Renovate создают pull request с обновлениями. Команда проверяет diff, прогоняет тесты, мерджит вручную.
Что делать
1. Убрать все ^ и ~ из package.json
2. Зафиксировать точные версии (npm i package@x.y.z)
3. Настроить Dependabot/Renovate
4. Проверять все обновления тестами
Такая схема убирает магию из сборки. Проще дебажить релизы и ловить настоящие баги.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#арсенал_инженераrm -rf? Это случается даже с опытными разработчиками. Один неверный путь и данные пропали.
Простая обёртка над rm решает эту проблему без установки сторонних утилит:
rm() {
ls -FCsd -- "$@"
read -p 'Delete? [y/N] ' ans
if [ "$ans" = "y" ]; then
command rm -rf -- "$@"
fi
}
Функция перехватывает вызов rm, показывает список файлов и спрашивает подтверждение. Если не ответить y, то ничего не удалится.
Добавьте функцию в ~/.bashrc или ~/.zshrc и перезагрузите конфиг:
source ~/.bashrc
Подтверждение помогает, но файлы всё равно удаляются сразу. Если хочется подстраховаться ещё раз, можно сделать подобие корзины: перемещать файлы во временную папку вместо немедленного удаления:
rm() {
local trash="/tmp/.trash"
mkdir -p "$trash"
ls -FCsd -- "$@"
read -p 'Move to trash? [y/N] ' ans
if [ "$ans" = "y" ]; then
mv -- "$@" "$trash"
echo "Moved to $trash"
fi
}
Файлы будут лежать в /tmp/.trash до следующей перезагрузки или ручной очистки. Это даёт время одуматься.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#root_prompttrap решает её в одну строчку.
Что делает trap
Регистрирует функцию, которая запустится при выходе из скрипта — неважно, нормальном или аварийном.
Вы один раз описываете логику очистки и забываете об этом:
#!/bin/bash
set -euo pipefail
tmpfile=$(mktemp)
cleanup() {
rm -f "$tmpfile"
echo "Cleaned up temporary files"
}
trap cleanup EXIT # сработает при любом выходе
# Основная работа
echo "Processing..." > "$tmpfile"
cat "$tmpfile"
EXIT это сигнал, который bash отправляет при завершении скрипта. Функция cleanup удалит временный файл, даже если скрипт упал на середине.
Что можно убирать через trap
Временные файлы и директории, lock-файлы, открытые соединения с базой, фоновые процессы, которые скрипт запустил сам.
Почему это лучше, чем rm в конце скрипта
rm в конце не выполнится, если скрипт упадёт раньше. trap cleanup EXIT выполнится всегда — это гарантия на уровне интерпретатора.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#root_promptnpm install, он каждый раз ходит в живой реестр npm и разрешает диапазоны версий заново. Это открывает окно для подмены пакета.
Если в package.json написано "axios": "^1.7.9", npm install может поставить 1.14.1 — версию, которой не было в вашем lockfile. Вредоносную версию, опубликованную 31 марта, многие поставили именно так.
Почему npm ci безопаснее
npm ci устанавливает ровно то, что записано в package-lock.json. Если lockfile расходится с package.json — упадёт с ошибкой. В реестр за новыми версиями не ходит. Новый вредоносный пакет попасть не может, пока вы сами не обновите lockfile.
Как заменить в CI/CD:
# Было
- name: Install dependencies
run: npm install
# Стало
- name: Install dependencies
run: npm ci
Бонус — скорость
npm ci удаляет node_modules и ставит заново, без попытки согласовать существующее состояние. Это быстрее на 20–40% по сравнению с npm install.
Это одно изменение — и ваш пайплайн уже не подхватит внезапно опубликованную вредоносную версию. Lockfile при этом нужно хранить в репозитории и обновлять осознанно, а не позволять CI делать это автоматически.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#арсенал_инженера$() вместо обратных кавычек для подстановки команд
Обратные кавычки работают. Но они же и мешают: плохо читаются и не дают вложить одну команду в другую без боли.
Проблема
Когда нужно подставить вывод команды в переменную или другую команду, оба синтаксиса технически делают одно и то же. Но обратные кавычки визуально сливаются с апострофами, их тяжело заметить в длинной строке, а при попытке вложить одну подстановку в другую всё быстро превращается в нечитаемый код.
Что делает $()
$() это современный способ подстановки команд в bash.
Он выполняет команду внутри скобок и подставляет её вывод на место:
# Устаревший стиль — сложно читать, сложно вкладывать
today=`date '+%Y-%m-%d'`
# Современный и читаемый вариант
today=$(date '+%Y-%m-%d')
echo "Today is $today"
Разница небольшая, но когда команды усложняются, $() выигрывает однозначно.
Вложенность где это особенно важно
Главное преимущество $() проявляется при вложении. С обратными кавычками вложенность либо невозможна, либо требует экранирования обратным слешем, что делает код трудночитаемым.
С $() вложение выглядит естественно:
# Вложение — работает чисто только с $()
lines=$(wc -l < "$(find . -name '*.log' | head -1)")
Здесь сначала выполняется внутренняя команда find, которая ищет первый .log файл. Её вывод передаётся в wc -l, и результат подсчёта строк записывается в переменную lines.
Попробуйте написать то же самое на обратных кавычках, получите либо ошибку, либо код, который никто не разберёт через неделю.
Обратные кавычки можно встретить в старых скриптах — это нормально. Но для нового кода стоит использовать $(). Читаемость лучше, вложенность работает, и это соответствует стандарту POSIX для современных оболочек.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#root_promptdocker exec, запускаете mysqldump локально, и всё.
Для этого нужны два условия: на хосте установлен MySQL-клиент, и в конфигурации контейнера прописан проброс порта.
Настройка Docker Compose
В docker-compose.yml должна быть секция ports:
services:
mysql:
image: mysql:8
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: yourpassword
volumes:
- mysql-data:/var/lib/mysql
Запуск дампа с хоста:
mysqldump -h 127.0.0.1 -P 3306 \
-u root -p'yourpassword' \
--single-transaction \
mydatabase > backup.sql
Флаг --single-transaction важен для InnoDB: он снимает дамп без блокировок таблиц.
Когда это имеет смысл
Версия mysqldump на хосте может отличаться от той, что внутри контейнера. Это важно, потому что поведение флагов и формат дампа меняются от версии к версии. Если вы хотите точно контролировать, какая версия утилиты делает дамп, этот способ даёт такую возможность.
Ещё один плюс: если у вас уже есть скрипты резервного копирования на хосте, этот подход встраивается в них без лишних правок.
Про безопасность
В разработке открытый порт не проблема. В продакшне стоит убедиться, что 3306 слушает только 127.0.0.1, а не все интерфейсы. Иначе база доступна снаружи, что плохо.
В docker-compose.yml это выглядит так:
ports:
- "127.0.0.1:3306:3306"
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#root_promptiptables-nft переименован в iptables, а старый legacy-бэкенд теперь доступен как iptables-legacy.
При переключении между пакетами нужно проверить наличие .pacsave-файлов в /etc/iptables/ и при необходимости восстановить правила вручную:
/etc/iptables/iptables.rules.pacsave /etc/iptables/ip6tables.rules.pacsaveБольшинство конфигураций продолжит работать без изменений. Но если вы используете нестандартные xtables-расширения или поведение, специфичное для legacy-бэкенда, стоит проверить всё вручную и при необходимости переключиться на
iptables-legacy.
➡️ Источник
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#пульс_индустрииsheets budget.csv
Прочитать конкретную ячейку или диапазон без открытия интерфейса:
sheets budget.csv B9
sheets budget.csv B1:B3
Изменить ячейку из командной строки:
sheets budget.csv B7=10 B8=20
Передать данные через stdin:
sheets <<< "ID,Name,Age
1,Alice,24
2,Bob,32"
Как это работает внутри
Навигация сделана под vim-пользователей: h/j/k/l для перемещения, gg/G для прыжка к началу или концу, / для поиска. Редактирование через i, выделение через v, отмена через u. Сохранение по :w, выход по :q. Если вы привыкли к vim, освоите sheets за пять минут.
Есть поддержка undo/redo, буфер обмена, визуальное выделение диапазонов и даже формулы в visual mode через =.
Установка:
go install github.com/maaslalani/sheets@main
Для тех, кто работает в терминале и не хочет переключаться в GUI ради CSV. Полезно при отладке экспортов, быстром просмотре логов в табличном формате или в CI-скриптах, где нужно вытащить конкретное значение.
➡️ Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#арсенал_инженера
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
