Helcode | Хелкод | Скрипты и автоматизация
993 subscribers
52 photos
34 links
☎️ Контакты для связи: @helcodeadm
Download Telegram
alias и functions в shell: создайте свой собственный язык

Постоянный ввод git log --oneline --graph --all --decorate или docker-compose up -d --build — это километры лишних нажатий клавиш. Shell позволяет создавать свои собственные команды, превращая длинные операции в короткие мнемонические алиасы.

Настройка рабочего окружения — это тоже автоматизация. Автоматизация самого процесса взаимодействия с системой.

➤ Вариант 1 (Простые алиасы в .bashrc или .zshrc):

alias gs='git status'
alias gl='git log --oneline --graph --all --decorate'
alias dps='docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"'
alias k='kubectl'


➤ Вариант 2 (Функции для сложной логики): алиас не может обработать аргументы сложным образом. Для этого нужны функции.

# Поиск и убийство процесса по имени
killname() {
ps aux | grep -i $1 | grep -v grep | awk '{print $2}' | xargs kill -9
}
# Использование: killname python


➤ Вариант 3 (Переносимые настройки): хранение файлов с алиасами и функциями в Git-репозитории с скриптом для симлинкинга в домашнюю директорию. Это позволяет синхронизировать окружение между всеми рабочими станциями.

Создание собственного набора команд — это шаг к более эффективному ментальному интерфейсу с компьютером. Вы не адаптируетесь к системе — система адаптируется под Вас.

Какая Ваша самая любимая или неочевидная пользовательская команда в shell?

P.S. Не забудьте про `sudo !!` (повторить последнюю команду с `sudo`) — это встроенная магия, которую знают не все.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41🌚1
🔔 С глубоким уважением к вашему труду, титанам невидимой инфраструктуры и архитекторам цифрового мира,

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

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

Желаем вам, чтобы в новом году:
➤ Кофе был крепким, а логи — понятными.
➤ Инфраструктура росла не хаосом, а продуманным дизайном.
➤ Вдохновение находило вас не только в момент дедлайна, а в тишине утреннего терминала.
➤ Баланс между работой и жизнью был сконфигурирован так же идеально, как ваш главный конфигурационный файл.

Спасибо вам за то, что делаете невидимое — работающим, сложное — простым, а будущее — ближе.

С Новым 2026 годом! Желаем стабильного ping'а до всех жизненно важных целей и безграничной пропускной способности для всех ваших идей. 🎄

С наилучшими пожеланиями,
Helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
11🔥4🤝1
Автоматическое управление зависимостями: когда requirements.txt и package.json устарели

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

Зависимость с известной уязвимостью (CVE) в коде — это бомба замедленного действия, которую кто-то должен обезвредить.

➤ Вариант 1 (Dependabot / Renovate): боты, интегрированные в GitHub/GitLab. Они мониторят файлы зависимостей, и при появлении новых версий создают автоматические PR с обновлением, часто включая информацию о changelog и уязвимостях.
➤ Вариант 2 (Автоматический PR после тестов): скрипт в CI, который раз в неделю запускает npm audit fix --force или poetry update, и если тесты проходят — автоматически коммитит изменения и создает PR.
➤ Вариант 3 (Сканирование уязвимостей в пайплайне): этап SAST (Static Application Security Testing), который использует trivy, snyk или owasp dependency-check для анализа зависимостей на предмет известных CVE и ломает сборку при обнаружении критических проблем.

Автоматическое управление зависимостями — это сдвиг левостороннего подхода (shift-left) в безопасности и поддержке. Проблема обнаруживается и предлагается к решению еще до того, как станет критической.

Доверяете ли Вы автоматическим PR от ботов? Или предпочитаете ручной контроль за каждым обновлением минорной версии?

P.S. Главный страх — «поломает ли это что-нибудь?». Поэтому автоматические PR должны всегда запускать полный набор тестов, давая уверенность при мердже.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
3
fzf — нечеткий поиск, который меняет взаимодействие с CLI

Ручной перебор истории команд, поиск файла в глубокой директории или выбор хоста из длинного списка — это действия, требующие точности. fzf (fuzzy finder) превращает командную строку в интерактивный интерфейс, где Вы ищете неточно, а находите точно.

Скорость работы часто упирается не в процессор, а в скорость принятия решений и ввода. fzf ускоряет и то, и другое.

➤ Вариант 1 (Поиск в истории команд): вместо Ctrl+R — привязка fzf к истории. Набираете часть команды, выбираете из интерактивного списка.
# В .bashrc/.zshrc
bind '"\C-r": "\C-x\C-addi$(history | fzf +s | sed "s/ *[0-9]* *//")\C-x\C-e"'


➤ Вариант 2 (Интерактивный cd или kill):
# cd в найденную директорию
cd $(find . -type d | fzf)
# Убить процесс, выбрав его из списка
kill -9 $(ps aux | fzf | awk '{print $2}')


➤ Вариант 3 (Интеграция с git): просмотр и чекаут веток через fzf: git checkout $(git branch -a | fzf).

fzf — это не просто утилита, это новый паттерн взаимодействия. Он заменяет запоминание и точный ввод на интуитивный поиск по шаблону, что часто быстрее и соответствует тому, как работает человеческое мышление.

Пробовали ли Вы интегрировать fzf в свой рабочий процесс? Какие сценарии оказались самыми полезными?

P.P.S. `fzf` — это gateway drug. После него хочется, чтобы всё в CLI было таким же интерактивным и отзывчивым.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍1
Автоматическая ротация секретов: ключи не должны жить вечно

Сервисный пароль, токен API или SSH-ключ, созданный «навсегда» — это идеальная мишень. Ручная смена секретов происходит только после инцидента. Автоматическая ротация должна быть частью жизненного цикла.

Секрет, срок действия которого не истек, — это потенциальная угроза.

➤ Вариант 1 (Hashicorp Vault с динамическими секретами): Vault может генерировать уникальные учетные данные для БД или облачных сервисов на короткий срок для каждого приложения, автоматически отзывая их после использования.

➤ Вариант 2 (Скрипт + Cron + Secrets Manager): скрипт, который раз в месяц генерирует новый ключ для облачного сервиса (например, AWS IAM), обновляет его в менеджере секретов (AWS Secrets Manager) и по очереди перезапускает приложения, чтобы они подхватили новую версию.

➤ Вариант 3 (Интеграция с IdP): использование единой системы аутентификации (например, OIDC) вместо статических токенов. Временные токены JWT автоматически «ротируются» при каждом логине.

Автоматическая ротация секретов — это высшая форма гигиены безопасности. Это признание того, что компрометация — вопрос не «если», а «когда», и система должна быть готова минимизировать ущерб.

Насколько сложно внедрить автоматическую ротацию секретов в Вашей текущей инфраструктуре? Какие ключи самые «долгоживущие»?

P.S. Первое правило ротации: убедитесь, что у Вас есть механизм, который *точно* обновит секрет во всех местах его использования *до* того, как старый перестанет работать. Иначе это не ротация, а отключение сервисов.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
2💯1
vim макросы: одноразовая автоматизация для текстового хаоса

Нужно изменить формат 200 строк в лог-файле или добавить кавычки к каждому элементу в списке. Писать полноценный скрипт на Python или sed кажется избыточным. vim макросы позволяют записать последовательность действий один раз и применить ее ко всем нужным строкам.

Повторяющаяся текстовая правка, даже одноразовая, — это кандидат на автоматизацию. Макросы — это автоматизация внутри редактора.

➤ Вариант 1 (Запись и выполнение):
1. Переместитесь на первую строку для изменения.
2. Нажмите qq чтобы начать запись макроса в регистр q.
3. Выполните нужные действия (например, $i", <Esc>j — перейти в конец строки, вставить кавычку, перейти на следующую строку).
4. Нажмите q чтобы остановить запись.
5. Примените макрос к следующим 199 строкам: 199@q.
➤ Вариант 2 (Применение с визуальным выделением): выделите блок текста и выполните :normal @q, чтобы применить макрос к каждой строке выделения.
➤ Вариант 3 (Сохранение в .vimrc): сложные макросы можно сохранить как пользовательские команды или маппинги для частого использования.

Макросы в vim — это воплощение принципа DRY (Don't Repeat Yourself) на микроуровне. Это мощный инструмент, который превращает рутинное редактирование в быстрое и точное выполнение замысла.

Используете ли Вы макросы в повседневной работе с кодом или конфигами? Или это кажется излишней сложностью?

P.S. Практически все современные IDE (VS Code, IntelliJ) имеют аналогичную функциональность — «Record Macro» или «Edit with Multiple Cursors». Принцип тот же: не повторяй, автоматизируй.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3🤔21
Автоматическое масштабирование: когда система дышит сама

Вручную добавлять инстансы под пиковую нагрузку и убирать их ночью — это работа оператора 19-го века, который подкидывал уголь в топку паровоза. Современная система должна сама чувствовать нагрузку и регулировать свои вычислительные ресурсы.

Платить за 100% ресурсов, которые используются на 10% — это расточительство. Сидеть на 100% загрузки и падать под пиком — это профнепригодность.

➤ Вариант 1 (Горизонтальное Pod Autoscaling в Kubernetes): на основе метрик CPU, памяти или кастомных метрик (например, длины очереди сообщений) HPA автоматически увеличивает или уменьшает количество реплик приложения.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70


➤ Вариант 2 (Облачное автомасштабирование групп инстансов): AWS Auto Scaling Groups, Google Managed Instance Groups. Масштабируются на основе нагрузки на балансировщик, очередей или расписания (например, увеличение перед началом рабочего дня).

➤ Вариант 3 (Serverless как крайняя форма): функции (AWS Lambda, Cloud Functions) масштабируются до нуля и обратно автоматически для каждой отдельной операции.

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

Как настроено автомасштабирование в Вашей системе? Реагирует ли оно достаточно быстро на неожиданные всплески?

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


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
1
ansible / salt — идемпотентность как религия

Ручное выполнение одних и тех же команд на десятках серверов с риском что-то пропустить или выполнить в разном порядке — это гарантия «дрейфа конфигурации». Инструменты управления конфигурацией (CM) выполняют описание *желаемого состояния* системы, и делают это идемпотентно (повторный запуск не меняет корректно настроенную систему).

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

➤ Вариант 1 (Простая идемпотентность Ansible): модуль apt установит пакет, только если его нет. Модуль template создаст файл из шаблона, только если он изменился.
- name: Ensure nginx is installed
apt:
name: nginx
state: present

- name: Deploy nginx config
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: '0644'


➤ Вариант 2 (Сбор фактов и условия): Ansible сначала собирает информацию о системе (facts), что позволяет выполнять задачи только на определенных ОС или при определенных условиях.

➤ Вариант 3 (Откат и проверка): многие CM-инструменты имеют режим --check (пробный прогон) и позволяют описывать шаги отката на случай неудачи.

Идемпотентность — это суперсила автоматизации. Она превращает настройку инфраструктуры из искусства в предсказуемую инженерную дисциплину, где результат не зависит от начального состояния и количества запусков.

Что для Вас является основным аргументом при выборе между Ansible, SaltStack, Chef или Puppet?

P.S. Главный тест на идемпотентность: запустите плейбук дважды подряд. Во второй раз не должно быть изменений (changed=0). Если это так — Вы на правильном пути.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
Автоматическое согласование контрактов: Pact как замена ручного тестирования API

Команда А обновила свой API и «уверена», что ничего не сломала. Команда Б обнаруживает сбой в 3 часа ночи. Ручное тестирование всех интеграций после каждого изменения — это кошмар. Инструменты контрактного тестирования (Pact) автоматически проверяют, что потребители и поставщики API соблюдают «контракт».

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

➤ Вариант 1 (Рабочий процесс Pact):
1. Потребитель (Consumer) в своих юнит-тестах определяет, какие запросы он будет делать и какие ответы ожидает. Это создает «контракт» (pact-файл).
2. Контракт публикуется в брокере (Pact Broker).
3. Поставщик (Provider) в своем CI забирает контракт и прогоняет его против своего реального API, проверяя, что он удовлетворяет всем ожиданиям потребителей.

➤ Вариант 2 (Автоматическое обнаружение дрейфа): если контракт нарушен, пайплайн поставщика ломается *до* того, как изменения попадут в прод, указывая на несовместимое изменение.

➤ Вариант 3 (Визуализация зависимостей): Pact Broker показывает граф зависимостей: кто от кого зависит и какие контракты между ними существуют.

Контрактное тестирование — это автоматизация доверия в распределенной системе. Оно заменяет ручные smoke-тесты интеграций на формальные, исполняемые спецификации, которые являются частью процесса разработки.

Пробовали ли Вы внедрять контрактное тестирование? С какими сложностями столкнулись?

P.S. Pact — не панацея. Он не проверяет бизнес-логику, только форматы и типы данных. Но это мощный щит от самых глупых и болезненных ошибок интеграции.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
perf и flamegraph: найти иголку в стоге сена производительности

Приложение «тормозит». Горит 100% CPU. Где именно? Ручное логирование и предположения — это путь в никуда. perf — это профилировщик ядра Linux, который с минимальными overhead показывает, какие функции съедают время. FlameGraph превращает эти данные в наглядную визуализацию.

Оптимизация без данных — это не оптимизация, это изменение кода наугад.

➤ Вариант 1 (Запись стека вызовов):
# Записать данные perf
perf record -F 99 -p <PID> -g -- sleep 30
# Сгенерировать отчет
perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > flamegraph.svg


➤ Вариант 2 (Анализ готового flamegraph): широкие «полки» на графике указывают на функции, которые занимают больше всего времени (горячие пути). Узкие высокие «башни» — глубокие, но не обязательно проблемные стеки вызовов.

➤ Вариант 3 (Интеграция в CI): запуск профилирования на тестовом стенде при нагрузочном тестировании и прикрепление flamegraph к результатам теста для сравнения с предыдущими прогонами.

perf и FlameGraph — это автоматизация самой сложной части оптимизации: сбора точных данных о том, куда уходят ресурсы. Они переводят разговор из области чувств («кажется, медленно») в область фактов («40% времени тратится на функцию json_parse»).

Приходилось ли Вам использовать низкоуровневое профилирование для решения проблем производительности в продакшене?

P.S. Для приложений на интерпретируемых языках (Python, Ruby) лучше использовать специализированные профилировщики (cProfile, rbspy), но философия та же: визуализировать стек, а не гадать.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥31
Автоматическое документирование инцидентов (Post-Mortem) по шаблону

После тушения пожара в продакшене все устали и хотят поскорее забыть. Ручное написание детального отчета (Post-Mortem) откладывается и превращается в формальность. Автоматизация помогает собрать «сырые» данные, оставив человеку только анализ и выводы.

Инцидент, из которого не извлекли урок, обречен повториться.

➤ Вариант 1 (Скрипт-сборщик данных): скрипт, который по ID инцидента или временному диапазону собирает ключевую информацию в черновик отчета:
* Логи алертов из Alertmanager/PagerDuty.
* Графики метрик из Grafana за период инцидента.
* Списой деплоев и изменений конфигурации из Git.
* Выдержки из логов ключевых сервисов.
* Записи из чата (Slack) по тегу инцидента (через API).

# Примерная структура скрипта
generate_postmortem_draft() {
echo "# Постмортем: $INCIDENT_TITLE"
echo "## Временные рамки"
echo "## Причины"
echo "## Действия по устранению"
echo "## Собранные данные"
echo "### Метрики"
# ... curl к API Grafana ...
echo "### Логи"
# ... journalctl --since ... --until ...
}


➤ Вариант 2 (Шаблон в Confluence/Notion с переменными): cоздание шаблона отчета с макросами или полями, которые можно быстро заполнить готовыми блоками данных.

➤ Вариант 3 (Интеграция с ITSM): автоматическое создание тикета-задачи на основе инцидента, с прикрепленным шаблоном постмортема и собранными данными.

Автоматизация постмортема — это не про избегание анализа, а про устранение рутины. Это позволяет команде сосредоточиться на самом важном: понимании первопричин (root cause) и выработке действий по предотвращению, а не на выковыривании логов из разных систем.

Существует ли в Вашей компании культура написания постмортемов? Помогает ли в этом автоматизация?

P.S. Идеальный постмортем — это не поиск виноватых, а беспристрастный анализ системных сбоев. Автоматические данные помогают сохранить объективность.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41
Вопрос на посленовогоднее размышление.

Представьте: вы находите в legacy-коде или чужом пайплайне идеально работающую, но чудовищно сложную автоматизацию. Скрипт делает что-то гениальное (например, автоматически чинит рассыпающуюся БД), но состоит из 1000 строк спагетти-кода, который понимаете только вы.

Ваши действия?

1. Оставить как есть. «Работает — не трогай». Риск сломать что-то критическое выше ценности чистого кода.
2. Полный рефакторинг с переписыванием. Вложить время сейчас, чтобы спасти будущих разработчиков (и себя через полгода) от боли.
3. Постепенное улучшение (некая «бритва Оккама для кода»). Не трогать логику, но начать с малого: добавить комментарии, разбить на функции, вынести конфиги. Шаг за шагом.
4. Документировать и изолировать. Написать исчерпывающую документацию, завернуть в контейнер и забыть как страшный сон, но с инструкцией по пробуждению.

Где грань между «гениальной сложностью» и «техническим долгом» в мире автоматизации? Поделитесь вашим опытом или принципами в комментариях.

Лично для меня критерий один: если для понимания скрипта мне нужно больше 15 минут сосредоточенно в него вчитываться — это кандидат на вариант 3. Автоматизация должна экономить время, в том числе и время на её понимание.

Интересно услышать ваше мнение!

🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍1🤔1
journalctl — когда логи не файлы, а поток событий

Ручной поиск по /var/log/* и парсинг *.log файлов для расследования инцидента — это атавизм эпохи SysV. systemd принес не только споры, но и унифицированную систему журналирования, где journalctl — это единый, мощный интерфейс для работы со всеми логами системы.

Логи — это не статические файлы, это структурированный поток событий, к которому нужно уметь правильно «подключиться».

➤ Вариант 1 (Основы фильтрации): просмотр логов конкретного сервиса с «хвостом» в реальном времени.
journalctl -u nginx.service -f


➤ Вариант 2 (Детальная навигация): просмотр логов за определенный временной интервал с выводом в формате, пригодном для дальнейшего анализа.
journalctl --since "2024-12-01 09:00:00" --until "2024-12-01 10:00:00" --output json-pretty > investigation.json


➤ Вариант 3 (Связь событий): ключ -o с форматом short-precise или verbose показывает не только сообщение, но и PID, UID и другие метаданные, позволяя связать разрозненные записи в причинно-следственную цепочку.

➤ Вариант 4 (Персистентность): по умолчанию журнал хранится в /run/log/journal/ и не переживает перезагрузку. Для серьёзных систем необходимо включить постоянное хранение: mkdir -p /var/log/journal && systemctl restart systemd-journald.

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

P.S. Комбинация journalctl -p err -b (показать все ошибки с момента последней загрузки) — это первая команда при диагностике проблемной системы после ребута.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
7👍4
Автоматический failover: когда отказ — это не инцидент, а штатная ситуация

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

High Availability (HA) — это не про дорогое железо, а про архитектурные решения и правильную автоматизацию.

➤ Вариант 1 (Вип + keepalived): классика для пары серверов. Демон keepalived по протоколу VRRP управляет виртуальным IP-адресом (VIP). При падении healthcheck на мастере, VIP автоматически «переезжает» на бэкап-ноду.

➤ Вариант 2 (Кластерные решения): для более сложных сценариев — Pacemaker/Corosync. Они умеют управлять не только IP, но и целыми группами ресурсов (демоны, файловые системы), выполняя сложные сценарии переезда (stop на старом ноде -> mount FS на новом -> start сервиса).

➤ Вариант 3 (Облачные managed-сервисы): использование облачных Load Balancer (AWS ALB/NLB, GCP Cloud Load Balancing) с бэкенд-группами и healthcheck-проверками. Облачный провайдер автоматически исключает нездоровые инстансы из ротации.

Автоматический failover — это высшая форма доверия к автоматизации. Вы делегируете системе право принимать критически важные решения: что делать, когда часть инфраструктуры перестает отвечать. Это требует тщательного тестирования сценариев («chaos engineering»), потому что цена ошибки в логике failover крайне высока.

Реализация отказоустойчивости всегда является компромиссом между сложностью, стоимостью и временем восстановления (RTO).

P.S. Самый опасный сценарий — «split-brain», когда оба узла кластера считают себя активными. Правильная настройка кворума и fencing (отключение проблемного сервера на физическом уровне) — не опция, а обязательное условие.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
mtr — не ping, и не traceroute, а их осмысленный синтез

Сеть «лагает». Стандартный сценарий: ping показывает потери, traceroute — где они. Но эти инструменты дают лишь моментальный снимок. mtr (Matt's traceroute) объединяет их, непрерывно отправляя пакеты и показывая статистику потерь и задержек на каждом хопе в реальном времени.

Разовая диагностика часто не выявляет плавающие проблемы. Нужен инструмент для постоянного мониторинга пути пакета.

➤ Вариант 1 (Базовая диагностика): запуск mtr до проблемного хоста показывает не просто маршрут, а динамическую картину. Высокий loss или скачки Avg на конкретном хопе четко указывают на проблемный узел.
mtr --report-wide 8.8.8.8


➤ Вариант 2 (Сбор отчетов): ключ --report и --report-cycles позволяет запустить N циклов probes, собрать агрегированную статистику и завершить работу. Идеально для скриптов автоматической диагностики.
mtr --report --report-cycles 10 example.com > network_quality_report.txt


➤ Вариант 3 (Разрешение AS номеров): ключ -z (или --aslookup в некоторых версиях) позволяет увидеть не только IP хопа, но и номер автономной системы (AS), к которой он принадлежит. Это помогает понять, в сети какого провайдера возникает проблема.

mtr — это инструмент для доказательства. Когда провайдер утверждает, что «на нашей стороне всё чисто», отчет mtr, показывающий 40% потерь на их маршрутизаторе, становится неоспоримым аргументом.

Использование mtr переводит диагностику сетевых проблем из области предположений («видимо, где-то на магистрали») в область измеримых фактов.

P.S. В мире, где всё чаще используется Anycast (один IP на множество дата-центров), mtr может показывать разные пути при разных запусках. Это не баг, а особенность современного интернета.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍102
Идемпотентные развертывания: деплой — это не действие, а состояние

Ручной деплой через последовательность шагов (остановить сервис, скопировать файлы, запустить) на множестве серверов — это источник дрейфа и ошибок. Современный подход описывает желаемое состояние системы, а инструмент (Ansible, Salt, Chef) приводит её к этому состоянию, независимо от начальных условий.

Процесс, который можно запускать множество раз с гарантированно одинаковым результатом, — основа предсказуемости инфраструктуры.

➤ Вариант 1 (Ansible-плейбук): модули package, service, template и copy по своей природе идемпотентны. Они проверяют текущее состояние системы перед внесением изменений.
- name: Ensure web app is deployed
hosts: webservers
tasks:
- name: Deploy application JAR
copy:
src: app.jar
dest: /opt/app.jar
force: no # Копировать только если файл изменился
- name: Ensure app service is running
systemd:
name: myapp
state: started
enabled: yes


➤ Вариант 2 (Контейнеры с неизменяемыми образами): самая чистая форма идемпотентности. Деплой — это замена старого контейнера на новый, собранный из заранее подготовленного образа. Система никогда не модифицируется «на лету».

➤ Вариант 3 (Immutable Infrastructure): продолжение идеи контейнеров. Вместо обновления серверов старые инстансы (или виртуальные машины) полностью уничтожаются и создаются новые из общего золотого образа (Golden Image/AMI). Исходное состояние всегда идеально.

Идемпотентность деплоя снимает целый класс проблем: «а запустили ли мы скрипт на этом сервере?», «почему на продакшене версия библиотеки старая?». Система всегда сходится к одному, описанному в коде, состоянию.

Это фундаментальный сдвиг: инженер думает не о том, *как* что-то сделать, а о том, *каким* это должно быть.

P.S. Главный тест на идемпотентность — запустить плейбук дважды. Во второй раз количество задач с статусом changed должно быть равно нулю. Если это так — Вы на верном пути.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
4🤔1
git reflog — палочка-выручалочка для локального хаоса

Жесткий reset, переписывание истории, случайное удаление ветки — операции, после которых git log показывает, что нужные коммиты бесследно исчезли. Паника. В этот момент git reflog (reference logs) становится самым важным инструментом. Он показывает полную историю ВСЕХ действий с указателями (ветками, HEAD) в локальном репозитории.

git reflog — это журнал аудита для вашего локального Git, запись каждого движения, которое вы совершали.

➤ Вариант 1 (Восстановление после reset): сделали git reset --hard HEAD~3 и поняли, что это была ошибка. reflog покажет, где был HEAD до этого (HEAD@{1}). Восстановление — git reset --hard HEAD@{1}.
# Просмотр лога ссылок
git reflog show HEAD
# Восстановление состояния на 2 действия назад
git reset --hard HEAD@{2}


➤ Вариант 2 (Восстановление удаленной ветки): удалили ветку feature с помощью git branch -D. Она всё ещё существует в reflog как указатель HEAD, который на нее указывал перед удалением. Найдите коммит и создайте ветку заново.
git checkout -b feature-restored HEAD@{1}


➤ Вариант 3 (Понимание происходящего): когда результат git log кажется странным, reflog даёт хронологическую ленту событий, объясняющую, как система пришла в текущее состояние.

reflog — это страховочная сетка для смелых экспериментов с историей Git. Она дает уверенность: практически любую локальную ошибку можно отменить, потому что Git ничего не удаляет сразу. Объекты коммитов остаются в локальной базе данных какое-то время (до сборки мусора git gc).

Понимание и использование reflog — признак перехода от пользователя Git к его уверенному оператору, который не боится сложных операций.

P.S. Важное ограничение: reflog — исключительно локальная история. Она не синхронизируется с удаленными репозиториями. Если вы удалили коммит, уже отправленный на сервер, и затем выполнили git prune, восстановление может стать нетривиальной задачей.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥41
Коллеги, доброго времени суток!

Готовлю обновление своего инструментального стека и хочу спросить у знающего сообщества: какие утилиты или фреймворки вы открыли для себя в последнее время и без которых уже не представляете работы?

Речь не обязательно о чём-то громком вроде нового Kubernetes. Возможно, это:

➤ Маленький CLI-инструмент вроде bat (замена cat), exa (замена ls) или duf (замена df/du).
➤ Плагин для VS Code или Idea, который спас кучу времени.
➤ Скрипт на Python/Bash, который решает одну, но очень надоедливую проблему.
➤ Даже неочевидная фича в старом добром git или ssh, о которой вы недавно узнали.

Поделитесь вашими находками в комментариях! Давайте соберём коллекцию Must-Have инструментов 2024/2025 от практиков.

От себя добавлю свой недавний фаворит: tldr (клиент для проекта tldr-pages). Когда не хочется читать man на 100500 страниц, он выдаёт конкретные примеры использования команды. Банально, но невероятно экономит время.

Жду ваши рекомендации!

🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
3🤔2
etckeeper — контроль версий для /etc, который вы не знали, что вам нужен

Ручное отслеживание изменений в /etc через копирование файлов с датами или ведение дневника — это метод каменного века. etckeeper автоматически привязывает всю директорию /etc к системе контроля версий (Git, Mercurial, Bazaar), фиксируя каждое изменение, сделанное пакетным менеджером или администратором.

Конфигурация сервера без истории изменений — это система, причина поломки которой может быть навсегда утеряна.

➤ Вариант 1 (Инициализация и базовое использование): после установки etckeeper инициализирует репозиторий в /etc и настраивает хуки для apt. Каждая установка или удаление пакета автоматически создает коммит с описанием действий.
sudo etckeeper init
sudo etckeeper commit "Initial commit"
# После этого: sudo apt install nginx
# etckeeper автоматически закоммитит изменения в /etc, сделанные пакетом


➤ Вариант 2 (Ручные коммиты и тегирование): перед внесением рискованных правок в конфиги можно вручную создать контрольную точку.
sudo etckeeper commit "Before messing with PAM config"
# ... вносим изменения ...
sudo etckeeper commit "Updated PAM config for SSH"
sudo etckeeper vcs tag config-stable-2024-12


➤ Вариант 3 (Восстановление и анализ): поиск того, какое именно изменение пакета сломало настройку, или откат одной конкретной правки с помощью стандартных команд Git (git log /etc/nginx/, git diff HEAD~1).

etckeeper — это автоматизация «гигиены» системного администрирования. Он превращает самую важную директорию системы из набора статических файлов в управляемый, отслеживаемый и восстанавливаемый ресурс.

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

P.S. etckeeper не заменяет инструменты типа Ansible для управления конфигурацией, но идеально дополняет их, отслеживая «дрейф» и спонтанные изменения, внесенные в обход плейбуков.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
6
fail2ban — автоматизированный цифровой вышибала

Ручной просмотр логов на предмет подозрительных IP-адресов и их блокировка через iptables — это рутинная работа сторожа. fail2ban — это система, которая сканирует логи сервисов (SSH, Nginx, Apache) на наличие паттернов неудачных попыток (логины, прокси) и автоматически добавляет временные блокировки в фаервол.

Без fail2ban сервер в публичной сети — это мишень для низкоскоростных, но постоянных атак методом перебора.

➤ Вариант 1 (Базовая защита SSH): стандартная конфигурация отслеживает неудачные попытки входа в /var/log/auth.log и блокирует IP на 10 минут после 5 неудачных попыток.
# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 600


➤ Вариант 2 (Кастомные фильтры для веб-приложений): создание собственных регулярок для защиты, например, от брутфорса панели администратора WordPress или от сканирования уязвимостей.
# /etc/fail2ban/filter.d/myapp-auth.conf
[Definition]
failregex = ^<HOST>.*"POST /wp-login.php.* 200$
ignoreregex =


➤ Вариант 3 (Интеграция с облачными фаерволами): использование actions не только для iptables, но и для добавления правил в AWS Security Groups или Cloudflare Firewall Rules через API.

fail2ban — это пример автоматизации безопасности на уровне реакции. Он реализует принцип минимальных привилегий во времени: IP-адрес, ведущий себя подозрительно, временно лишается возможности взаимодействовать с сервисом, без вмешательства человека.

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

P.S. Главная опасность fail2ban — возможность забанить самого себя или легитимных пользователей при слишком агрессивных настройках. Всегда настраивайте ignoreip на свой IP и IP-адреса доверенных сетей.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71
prometheus + alertmanager + grafana

Ручной опрос серверов по SNMP и анализ графиков «на глазок» для предсказания проблем — это археология. Современный стек наблюдаемости построен на модели сбора метрик pull-запросами, их хранения в многомерной базе данных, гибкой визуализации и — что самое важное — на системе умных алертов, которые могут группироваться, затухать и запускать действия.

Мониторинг, который требует постоянного взгляда на дашборд, — это провал. Система должна сама сообщать о проблемах.

➤ Вариант 1 (Автообнаружение целей в Kubernetes): prometheus-operator автоматически настраивает сбор метрик со всех подов, сервисов и нод в кластере, используя метки и аннотации Kubernetes. Нет ручной конфигурации на каждое новое приложение.

➤ Вариант 2 (Правила алертов с прогнозированием): создание алертов не только на факт проблемы («диск заполнен на 95%»), но и на её приближение, используя функции прогнозирования PromQL.
# alert.rules.yml
- alert: DiskFillRate4H
expr: predict_linear(node_filesystem_free_bytes{mountpoint="/"}[1h], 4*3600) < 0
for: 5m
labels:
severity: warning
annotations:
summary: "Диск на {{ $labels.instance }} заполнится в течение 4 часов"


➤ Вариант 3 (Маршрутизация и «затухание» алертов в Alertmanager): конфигурация, которая отправляет критические алерты в PagerDuty/SMS, предупреждения — в Slack, а повторяющиеся уведомления об уже известной проблеме — «затухает», не спамя ответственным.

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

Внедрение подобного стека — это переход от «администрирования вслепую» к «инженерному управлению сложной системой на основе данных».

P.S. Золотое правило: каждый алерт должен быть сформулирован так, чтобы у инженера, получившего его, был четкий ответ на вопрос «Что мне сейчас делать?». Алёрты без ясного действия — это просто шум.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3