Сила .gitignore: защита от самого себя
Коммит файлов с паролями, конфигурацией IDE или артефактами сборки — это классическая ошибка, которая случается с каждым.
Человеческая память ненадежна. Доверить ей решение, что можно коммитить, а что нет — наивно.
➤ Вариант 1 (Глобальный
➤ Вариант 2 (Специфичный для языка/инструмента): генерация или использование готовых шаблонов для Python (
➤ Вариант 3 (
Доводилось ли Вам «вычищать» историю репозитория из-за случайно закоммиченного секрета? Или .gitignore всегда стоит на страже?
🌐 @helcode
Коммит файлов с паролями, конфигурацией IDE или артефактами сборки — это классическая ошибка, которая случается с каждым.
.gitignore — это не список, это оборонительный периметр Вашего репозитория.Человеческая память ненадежна. Доверить ей решение, что можно коммитить, а что нет — наивно.
➤ Вариант 1 (Глобальный
~/.gitignore_global): для файлов, которые никогда не должны попадать ни в один репозиторий: .DS_Store, Thumbs.db, *.swp, файлы конфигурации Вашего редактора.# Настройка
git config --global core.excludesfile ~/.gitignore_global
➤ Вариант 2 (Специфичный для языка/инструмента): генерация или использование готовых шаблонов для Python (
__pycache__/, *.pyc), Node.js (node_modules/), Java (target/), Go (/vendor/).➤ Вариант 3 (
.gitignore как часть инициализации проекта): автоматическое создание адекватного .gitignore при старте нового проекта через git init или инструменты вроде cookiecutter..gitignore — это проактивная автоматизация. Это предотвращение ошибки до ее совершения. Это один из немногих файлов в проекте, который требует максимально педантичного отношения.Доводилось ли Вам «вычищать» историю репозитория из-за случайно закоммиченного секрета? Или .gitignore всегда стоит на страже?
P.S. Есть сервисы вроде git-secrets или truffleHog, которые сканируют историю на наличие ключей и паролей. Но лучше не допускать их попадания туда.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
systemd: сервисы, которые умеют себя обслуживать
Писать скрипты на Bash для запуска демонов и их перезапуска при падении — это изобретение велосипеда.
Скрипт в
➤ Вариант 1 (Базовая устойчивость): простая конфигурация юнита с
➤ Вариант 2 (Зависимости и порядок): правильное указание
➤ Вариант 3 (Ограничение ресурсов): секция
Какие возможности systemd, помимо простого start/stop, Вы используете чаще всего? Мониторинг через journalctl, cgroups или таймеры?
🌐 @helcode
Писать скрипты на Bash для запуска демонов и их перезапуска при падении — это изобретение велосипеда.
systemd — это фреймворк для управления жизненным циклом служб со встроенными возможностями самовосстановления.Скрипт в
/etc/init.d/, который не умеет корректно обрабатывать сигналы и логировать, — это наследие прошлого.➤ Вариант 1 (Базовая устойчивость): простая конфигурация юнита с
Restart=on-failure и RestartSec=5 уже делает сервис намного надежнее.[Service]
ExecStart=/usr/bin/my_daemon
Restart=on-failure
RestartSec=5
StandardOutput=journal
➤ Вариант 2 (Зависимости и порядок): правильное указание
After=network.target и Requires=postgresql.service гарантирует, что сервис запустится только когда его зависимости готовы.➤ Вариант 3 (Ограничение ресурсов): секция
[Slice] и MemoryMax позволяют ограничить потребление памяти, предотвращая «проседание» всей системы из-за одной утечки.systemd — это автоматизация управления процессами на уровне ОС. Он превращает приложение из «просто исполняемого файла» в управляемый, наблюдаемый и устойчивый сервис.Какие возможности systemd, помимо простого start/stop, Вы используете чаще всего? Мониторинг через journalctl, cgroups или таймеры?
P.S. Споры о systemd — бесконечны, но его распространенность в современном Linux-мире делает его знание обязательным. Это не всегда выбор, но это реальность.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9👎2❤1
Товарищи, приветствую!
😴 У меня был небольшой "ленивый" период, чуток утомился от всех проектов и работ. Сегодня, после длительного перерыва, зашёл на Хабр, где обнаружил весьма странную интеграцию с SourceCraft (что-то в стиле GitHub). А именно, появилась кнопка "объяснить код" под любым блоком кода.
🤯 Для меня это смешанные чувства.
С одной стороны - скорость и доступность, так как нет необходимости гуглить непонятный код, искать дополнительные источники.
С другой - теряется "хабровская" экспертиза: живые дискуссии, опыт людей, разные мнения. Да, зачастую спорные, но ценные ведь...
Очень интересно узнать Ваше отношение к этой интеграции:
⏺️ Как Вам сама идея встраивания БЯМ в платформу? Логичное развитие в связи с тенденциями или потеря уникальности площадки?
⏺️ Не вытеснит ли это человеческое взаимодействие?
⏺️ Какова дальнейшая судьба у платформы? Хороший шаг в сторону трендов или слом основной концепции?
Также, если вдруг у Вас уже есть опыт использования SourceCraft - буду очень рад услышать отзывы, кейсы, мнения. Всё, что угодно.
😊 Спасибо, что делитесь мнением - для меня это важный ориентир в понимании того, как сейчас меняется потребление технической информации.
Давайте обсудим!
С одной стороны - скорость и доступность, так как нет необходимости гуглить непонятный код, искать дополнительные источники.
С другой - теряется "хабровская" экспертиза: живые дискуссии, опыт людей, разные мнения. Да, зачастую спорные, но ценные ведь...
Очень интересно узнать Ваше отношение к этой интеграции:
Также, если вдруг у Вас уже есть опыт использования SourceCraft - буду очень рад услышать отзывы, кейсы, мнения. Всё, что угодно.
Давайте обсудим!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
Шаблонизация конфигов: один источник правды для десятков серверов
Ручное редактирование одного и того же конфигурационного файла на множестве серверов с небольшими различиями (имена хостов, IP-адреса) — это прямая дорога к рассогласованию и ошибкам.
Конфигурационный файл, хранящийся вручную на сервере, — это «дрейф конфигурации» в чистом виде.
➤ Вариант 1 (Jinja2 + Ansible): использование шаблонизатора для генерации итогового конфига из переменных. Один шаблон
➤ Вариант 2 (
➤ Вариант 3 (HashiCorp Consul Template): динамическая генерация конфигов на основе данных из Service Discovery (Consul). Конфиг обновляется автоматически при изменении сервисной сетки.
Шаблонизация — это философия «инфраструктуры как код» (IaC), примененная к конфигурациям. Это гарантия идемпотентности: применение одного и того же шаблона с одними и теми же переменными всегда дает один и тот же результат.
Как Вы управляете конфигурациями, которые должны немного отличаться на разных хостах?
🌐 @helcode
Ручное редактирование одного и того же конфигурационного файла на множестве серверов с небольшими различиями (имена хостов, IP-адреса) — это прямая дорога к рассогласованию и ошибкам.
Конфигурационный файл, хранящийся вручную на сервере, — это «дрейф конфигурации» в чистом виде.
➤ Вариант 1 (Jinja2 + Ansible): использование шаблонизатора для генерации итогового конфига из переменных. Один шаблон
nginx.conf.j2 порождает десятки корректных конфигов для разных сред.# nginx.conf.j2
server {
listen 80;
server_name {{ server_name }};
root {{ web_root }};
}
➤ Вариант 2 (
envsubst): простая замена переменных окружения прямо в файле на этапе запуска контейнера или сервиса. Идеально для Docker.# В Dockerfile или скрипте запуска
envsubst < /etc/nginx/config.template > /etc/nginx/nginx.conf
➤ Вариант 3 (HashiCorp Consul Template): динамическая генерация конфигов на основе данных из Service Discovery (Consul). Конфиг обновляется автоматически при изменении сервисной сетки.
Шаблонизация — это философия «инфраструктуры как код» (IaC), примененная к конфигурациям. Это гарантия идемпотентности: применение одного и того же шаблона с одними и теми же переменными всегда дает один и тот же результат.
Как Вы управляете конфигурациями, которые должны немного отличаться на разных хостах?
P.S. Золотое правило: в репозитории должен храниться шаблон и значения переменных, но никогда — готовый конфиг с «зашитыми» значениями для конкретного окружения.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
tar с автоматом: упаковка логов по расписанию
Ручной сбор логов с серверов в архив «перед отпуском» — это операция темных веков. Архивация должна быть предсказуемой, автоматической и не требующей внимания.
Лог-файл, который никогда не ротируется и не архивируется, — это бомба замедленного действия для дискового пространства.
➤ Вариант 1 (Cron + Bash): классический скрипт, который ищет логи старше N дней, упаковывает их в датированный архив
➤ Вариант 2 (Использование
➤ Вариант 3 (Архивация в облако): непосредственная упаковка и загрузка через CLI облачного провайдера (AWS CLI
Автоматическая архивация — это не просто спасение места. Это создание упорядоченной истории, которую в любой момент можно использовать для расследования инцидента или аудита.
Часто ли Вы возвращаетесь к старым логам? Или они обычно умирают тихо, так и не будучи прочитанными?
🌐 @helcode
Ручной сбор логов с серверов в архив «перед отпуском» — это операция темных веков. Архивация должна быть предсказуемой, автоматической и не требующей внимания.
Лог-файл, который никогда не ротируется и не архивируется, — это бомба замедленного действия для дискового пространства.
➤ Вариант 1 (Cron + Bash): классический скрипт, который ищет логи старше N дней, упаковывает их в датированный архив
tar.gz и загружает в объектное хранилище.#!/bin/bash
find /var/log/app -name "*.log" -mtime +7 | tar -czf /backup/logs-$(date +%Y%m%d).tar.gz -T -
find /var/log/app -name "*.log" -mtime +7 -delete
➤ Вариант 2 (Использование
logrotate): стандартный, но часто недооцененный инструмент. Можно настроить пост-скрипт для отправки заархивированного файла куда нужно.# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 30
compress
delaycompress
postrotate
/usr/bin/rsync /var/log/myapp/*.gz backup-server:/logs/
endscript
}
➤ Вариант 3 (Архивация в облако): непосредственная упаковка и загрузка через CLI облачного провайдера (AWS CLI
s3 cp, gcloud storage cp) в один шаг.Автоматическая архивация — это не просто спасение места. Это создание упорядоченной истории, которую в любой момент можно использовать для расследования инцидента или аудита.
Часто ли Вы возвращаетесь к старым логам? Или они обычно умирают тихо, так и не будучи прочитанными?
P.S. Всегда проверяйте, что архивируете, а не удаляете единственную копию лога, который еще нужен для отладки. Скрипт должен быть идиотодостойким.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Философия автоматизации: если задача скучна, ее не должен выполнять человек
Ключевой вопрос не «МОЖНО ли это автоматизировать?», а «СКОЛЬКО РАЗ это придется сделать?». Если ответ больше одного — это кандидат на автоматизацию.
Человеческий мозг — инструмент для творчества и решения сложных, нестандартных проблем. Его использование для рутинных, повторяющихся действий — расточительство.
➤ Этап 1 (Фиксация процесса): прежде чем автоматизировать, необходимо максимально точно описать шаги вручную. Часто уже на этом этапе обнаруживаются избыточные действия.
➤ Этап 2 (Выбор инструмента): не обязательно писать сложный скрипт. Иногда достаточно макроса в IDE, плагина для браузера, функции в
➤ Этап 3 (Итеративное улучшение): первая версия автоматизации может быть неидеальна. Важно, чтобы она уже работала и экономила время. Доработки — потом.
Автоматизация — это инвестиция. Первоначальные затраты времени окупаются с каждым последующим выполнением задачи. Это чистый выигрыш в производительности и снижение вероятности ошибки.
Какая самая простая, но самая полезная автоматизация была внедрена в Ваш рабочий процесс?
🌐 @helcode
Ключевой вопрос не «МОЖНО ли это автоматизировать?», а «СКОЛЬКО РАЗ это придется сделать?». Если ответ больше одного — это кандидат на автоматизацию.
Человеческий мозг — инструмент для творчества и решения сложных, нестандартных проблем. Его использование для рутинных, повторяющихся действий — расточительство.
➤ Этап 1 (Фиксация процесса): прежде чем автоматизировать, необходимо максимально точно описать шаги вручную. Часто уже на этом этапе обнаруживаются избыточные действия.
➤ Этап 2 (Выбор инструмента): не обязательно писать сложный скрипт. Иногда достаточно макроса в IDE, плагина для браузера, функции в
.bashrc или простого правила в cron.➤ Этап 3 (Итеративное улучшение): первая версия автоматизации может быть неидеальна. Важно, чтобы она уже работала и экономила время. Доработки — потом.
Автоматизация — это инвестиция. Первоначальные затраты времени окупаются с каждым последующим выполнением задачи. Это чистый выигрыш в производительности и снижение вероятности ошибки.
Какая самая простая, но самая полезная автоматизация была внедрена в Ваш рабочий процесс?
P.S. Иногда автоматизация одной мелкой, но раздражающей задачи приносит больше морального удовлетворения, чем большой проект.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3
Магия strace: когда приложение молчит, а система рассказывает всё
Логи приложения чистые, а оно падает или «висит». Метод тыка и перезапуска — это гадание.
Понимание, что делает программа, важнее предположений, почему она это делает.
➤ Вариант 1 (Базовый мониторинг): запуск программы под
➤ Вариант 2 (Фокусировка на проблеме): программа «висит». Запуск
➤ Вариант 3 (Статистика и профилирование): ключ
Используете ли Вы strace как последний аргумент в сложных ситуациях? Или это повседневный инструмент?
🌐 @helcode
Логи приложения чистые, а оно падает или «висит». Метод тыка и перезапуска — это гадание.
strace показывает все системные вызовы программы: что она читает, пишет и где ждет ответа.Понимание, что делает программа, важнее предположений, почему она это делает.
➤ Вариант 1 (Базовый мониторинг): запуск программы под
strace для просмотра всех системных вызовов. Ключ -f для отслеживания форков (важно для веб-серверов).strace -f -o app_trace.log ./my_mysterious_app
➤ Вариант 2 (Фокусировка на проблеме): программа «висит». Запуск
strace -p <PID> покажет, на каком системном вызове (часто read, connect, poll) она сейчас заблокирована.➤ Вариант 3 (Статистика и профилирование): ключ
-c покажет сводную статистику: какие вызовы были самыми частыми и отняли больше всего времени.strace — это инструмент для снятия покровов с абстракции. Он напоминает, что любая программа, в конечном счете, разговаривает с ядром через ограниченный набор примитивов. Понимание этого диалога — ключ к отладке.Используете ли Вы strace как последний аргумент в сложных ситуациях? Или это повседневный инструмент?
P.S. Аналоги strace есть и для других систем: dtrace (Solaris, macOS), perf trace (Linux). Принцип везде один: слежка за разговором программы с ОС.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2
nc (netcat) — швейцарский армейский нож сетевого инженера
Ручная проверка доступности порта через браузер или громоздкие GUI-утилиты — это несерьезно.
Если нужно быстро проверить, слушает ли сервер порт,
➤ Вариант 1 (Быстрая проверка порта): тест доступности порта и хоста. Если соединение устанавливается — порт открыт. Нет — проблема либо в сети, либо в сервисе.
➤ Вариант 2 (Ручная отправка HTTP-запроса): отладка веб-сервера без браузера. Можно вручную набрать заголовки и увидеть сырой ответ.
➤ Вариант 3 (Примитивный файловый сервер): передача файла между машинами, когда SCP/SFTP по каким-то причинам недоступны.
Считаете ли Вы nc must-have в наборе инструментов для диагностики сети?
🌐 @helcode
Ручная проверка доступности порта через браузер или громоздкие GUI-утилиты — это несерьезно.
netcat (или nc) — это утилита командной строки, которая умеет всё: от простейшего TCP-сканирования до создания прототипа клиент-серверного приложения.Если нужно быстро проверить, слушает ли сервер порт,
nc сделает это в одну строку.➤ Вариант 1 (Быстрая проверка порта): тест доступности порта и хоста. Если соединение устанавливается — порт открыт. Нет — проблема либо в сети, либо в сервисе.
nc -zv example.com 443
# Результат: Connection to example.com 443 port [tcp/https] succeeded!
➤ Вариант 2 (Ручная отправка HTTP-запроса): отладка веб-сервера без браузера. Можно вручную набрать заголовки и увидеть сырой ответ.
printf "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80
➤ Вариант 3 (Примитивный файловый сервер): передача файла между машинами, когда SCP/SFTP по каким-то причинам недоступны.
# На принимающей стороне:
nc -l -p 1234 > received_file.tar
# На отправляющей:
cat file_to_send.tar | nc receiver_ip 1234
nc — это воплощение философии Unix «делай одну вещь и делай ее хорошо» для сетевых операций. Это фундаментальный строительный блок, который входит в арсенал любого, кто работает с сетевыми сервисами.Считаете ли Вы nc must-have в наборе инструментов для диагностики сети?
P.S. В современных системах netcat может быть заменен на ncat (из набора Nmap) или socat (который еще мощнее), но принцип остается тем же.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤2🔥2
Автоматическое резервное копирование: не «если», а «когда» случится сбой
Мысль «бэкапы не нужны, у нас отказоустойчивый кластер» — это путь к цифровому вымиранию. Резервное копирование должно быть автоматическим, регулярным и, главное, проверяемым.
Ручной запуск бэкапа «когда будет время» — это гарантия того, что в момент катастрофы актуальной копии не окажется.
➤ Вариант 1 (Скрипт + Cron + Проверка): скрипт делает дамп БД, упаковывает его, подписывает датой и копирует на удаленный хранитель. Ключевой шаг — после копирования проверяется целостность архива.
➤ Вариант 2 (Инкрементальные бэкапы с Borg/Restic): использование специализированных инструментов, которые умеют делать дедуплицированные, зашифрованные и инкрементальные снимки файловой системы.
➤ Вариант 3 (Восстановление как часть процесса): периодический запуск тестового восстановления из бэкапа на изолированном стенде. Бэкап, который нельзя восстановить, — это не бэкап.
Автоматизация бэкапа — это не про технологии, это про дисциплину и принятие реальности: все системы ломаются. Цель — минимизировать потери и время простоя, когда это произойдет.
Как часто Вы проводите учебные тревоги по восстановлению из бэкапа?
🌐 @helcode
Мысль «бэкапы не нужны, у нас отказоустойчивый кластер» — это путь к цифровому вымиранию. Резервное копирование должно быть автоматическим, регулярным и, главное, проверяемым.
Ручной запуск бэкапа «когда будет время» — это гарантия того, что в момент катастрофы актуальной копии не окажется.
➤ Вариант 1 (Скрипт + Cron + Проверка): скрипт делает дамп БД, упаковывает его, подписывает датой и копирует на удаленный хранитель. Ключевой шаг — после копирования проверяется целостность архива.
# После создания backup.sql.gz
if gzip -t backup.sql.gz; then
echo "Архив цел. Копируем."
rsync -avz backup.sql.gz backup-server:/storage/
else
echo "ОШИБКА: архив поврежден!" | mail -s "Backup FAILED" admin@company.com
fi
➤ Вариант 2 (Инкрементальные бэкапы с Borg/Restic): использование специализированных инструментов, которые умеют делать дедуплицированные, зашифрованные и инкрементальные снимки файловой системы.
➤ Вариант 3 (Восстановление как часть процесса): периодический запуск тестового восстановления из бэкапа на изолированном стенде. Бэкап, который нельзя восстановить, — это не бэкап.
Автоматизация бэкапа — это не про технологии, это про дисциплину и принятие реальности: все системы ломаются. Цель — минимизировать потери и время простоя, когда это произойдет.
Как часто Вы проводите учебные тревоги по восстановлению из бэкапа?
P.S. Правило 3-2-1: три копии данных, на двух разных типах носителей, одна из которых в другом географическом местоположении. Автоматизация помогает соблюсти это правило.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥3❤1💯1
watch — ваш цифровой метроном для мониторинга
Постоянный повтор одной и той же команды (
Человеческое внимание — дефицитный ресурс. Его не стоит тратить на монотонное отслеживание статических выводов.
➤ Вариант 1 (Мониторинг ресурсов): слежение за использованием диска или памяти в реальном времени с подсветкой изменений.
➤ Вариант 2 (Отслеживание состояния кластера): наблюдение за тем, как поды переходят в состояние
➤ Вариант 3 (Слежение за лог-файлом с фильтром): комбинация с
Часто ли Вы используете watch или предпочитаете специализированные инструменты мониторинга для таких задач?
🌐 @helcode
Постоянный повтор одной и той же команды (
kubectl get pods, df -h, tail -f) для отслеживания изменений — это рудимент. watch — это команда, которая запускает другую команду с заданным интервалом, выводя разницу прямо в терминале.Человеческое внимание — дефицитный ресурс. Его не стоит тратить на монотонное отслеживание статических выводов.
➤ Вариант 1 (Мониторинг ресурсов): слежение за использованием диска или памяти в реальном времени с подсветкой изменений.
watch -n 2 -d 'df -h /'
# Обновляет вывод каждые 2 секунды, выделяя различия
➤ Вариант 2 (Отслеживание состояния кластера): наблюдение за тем, как поды переходят в состояние
Running после деплоя в Kubernetes.watch -n 1 'kubectl get pods -l app=my-microservice'
➤ Вариант 3 (Слежение за лог-файлом с фильтром): комбинация с
grep для отслеживания появления новых записей, соответствующих шаблону (например, ошибок).watch -n 5 'tail -20 /var/log/syslog | grep -i error'
watch — это простейшая форма автоматизированного мониторинга в реальном времени на уровне командной строки. Это инструмент для пассивного наблюдения, который освобождает когнитивные ресурсы для анализа, а не для механического повторения действий.Часто ли Вы используете watch или предпочитаете специализированные инструменты мониторинга для таких задач?
P.S. Для более сложного интерактивного дашборда в терминале можно посмотреть в сторону htop, ctop (для контейнеров) или glances.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍5
Автоматическое обновление REАDME.md: документирование без усилий
Файл
Документация, которая не синхронизирована с кодом, хуже, чем ее отсутствие. Она вводит в заблуждение.
➤ Вариант 1 (Статус сборки и покрытия): бейдж из CI/CD (GitHub Actions, GitLab CI) и сервиса вроде Codecov, встроенный прямо в
➤ Вариант 2 (Генерация из кода): использование инструментов вроде
➤ Вариант 3 (Скрипт обновления метрик): простой скрипт, который при каждом коммите обновляет в
Автоматическое документирование — это применение принципа DRY (Don't Repeat Yourself) к мета-информации о проекте. Однажды настроенный пайплайн обеспечивает актуальность данных без постоянных усилий команды.
Какие части документации в Ваших проектах удалось успешно автоматизировать?
🌐 @helcode
Файл
README.md в репозитории устаревает через неделю после написания. Ручное поддержание документации в актуальном состоянии — задача, которую всегда откладывают. Решение — заставить документацию генерироваться саму.Документация, которая не синхронизирована с кодом, хуже, чем ее отсутствие. Она вводит в заблуждение.
➤ Вариант 1 (Статус сборки и покрытия): бейдж из CI/CD (GitHub Actions, GitLab CI) и сервиса вроде Codecov, встроенный прямо в
README.md, всегда показывает актуальное состояние.➤ Вариант 2 (Генерация из кода): использование инструментов вроде
Swagger/OpenAPI для документации API или Sphinx/Doxygen для генерации описаний модулей и функций прямо из комментариев в коде.➤ Вариант 3 (Скрипт обновления метрик): простой скрипт, который при каждом коммите обновляет в
README данные о версии, дате последнего изменения или статистике (количество строк кода, тестов), используя данные из git и системы сборки.Автоматическое документирование — это применение принципа DRY (Don't Repeat Yourself) к мета-информации о проекте. Однажды настроенный пайплайн обеспечивает актуальность данных без постоянных усилий команды.
Какие части документации в Ваших проектах удалось успешно автоматизировать?
🌐 @helcode
❤3
`tcpdump` / `tshark`: когда нужно услышать, о чем говорят сети
Проблемы «сервис А не может достучаться до сервиса Б» часто не решаются логами приложений. Нужно слушать сам сетевой разговор.
Предположения о том, какие пакеты и куда уходят, — это домыслы. Захват трафика — это факты.
➤ Вариант 1 (Базовый захват): просмотр всего HTTP-трафика на определенном порту. Фильтр
➤ Вариант 2 (Поиск проблемы): захват пакетов между двумя конкретными хостами для анализа, теряются ли пакеты, идут ли ACK.
➤ Вариант 3 (Сохранение и анализ в Wireshark): запись трафика в файл
Использование
Приходилось ли Вам использовать сниффинг трафика для решения реальных проблем в продакшене?
🌐 @helcode
Проблемы «сервис А не может достучаться до сервиса Б» часто не решаются логами приложений. Нужно слушать сам сетевой разговор.
tcpdump — это стетоскоп, который прикладывают к сетевому интерфейсу, чтобы услышать его пульс.Предположения о том, какие пакеты и куда уходят, — это домыслы. Захват трафика — это факты.
➤ Вариант 1 (Базовый захват): просмотр всего HTTP-трафика на определенном порту. Фильтр
port 80 позволяет не утонуть в данных.sudo tcpdump -i any -A 'tcp port 80'
➤ Вариант 2 (Поиск проблемы): захват пакетов между двумя конкретными хостами для анализа, теряются ли пакеты, идут ли ACK.
sudo tcpdump -i eth0 'host 10.0.1.5 and host 10.0.1.6'
➤ Вариант 3 (Сохранение и анализ в Wireshark): запись трафика в файл
.pcap для последующего детального разбора в графическом интерфейсе Wireshark (tshark — его CLI-версия).sudo tcpdump -w capture.pcap -i eth0
Использование
tcpdump — это признак того, что специалист опускается на уровень ниже абстракции приложения. Это мир IP-адресов, портов, TCP-сегментов и флагов. Понимание этого мира — ключ к диагностике сложных распределенных проблем.Приходилось ли Вам использовать сниффинг трафика для решения реальных проблем в продакшене?
P.S. Захватывать трафик в продакшене нужно с осторожностью и в полном соответствии с политикой безопасности. Но для отладки на тестовых стендах — это бесценный инструмент.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤4
Автоформатирование кода: прекратить священную войну за отступы
Споры о том, ставить ли пробел после запятой или использовать табы вместо пробелов, — это архаичный ритуал, убивающий время код-ревью. Современный подход — автоматическое форматирование при каждом коммите или сохранении файла.
Стиль кода должен определяться конфигурационным файлом, а не личными предпочтенями разработчика.
➤ Вариант 1 (Pre-commit хук): использование
➤ Вариант 2 (Форматтер в IDE): настройка редактора (VS Code, IntelliJ) на автоматическое форматирование файла при сохранении с помощью встроенных или плагин-форматтеров.
➤ Вариант 3 (Форматирование в CI): этап в пайплайне, который проверяет, соответствует ли код стандарту. В случае несоответствия — падает, указывая на проблему, или даже автоматически создает коммит с исправлениями.
Автоматическое форматирование — это не про эстетику, а про предсказуемость и устранение шума. Оно убирает из диффов сотни бессмысленных изменений, связанных со стилем, позволяя сосредоточиться на смысловых правках.
Удалось ли Вам внедрить автоматическое форматирование в командной работе? С какими сложностями столкнулись?
🌐 @helcode
Споры о том, ставить ли пробел после запятой или использовать табы вместо пробелов, — это архаичный ритуал, убивающий время код-ревью. Современный подход — автоматическое форматирование при каждом коммите или сохранении файла.
Стиль кода должен определяться конфигурационным файлом, а не личными предпочтенями разработчика.
➤ Вариант 1 (Pre-commit хук): использование
pre-commit framework с форматтерами (black для Python, gofmt для Go, prettier для JS/HTML/CSS). Код приводится к единому стилю до создания коммита.# .pre-commit-config.yaml
repos:
- repo: https://github.com/psf/black
rev: 23.3.0
hooks:
- id: black
➤ Вариант 2 (Форматтер в IDE): настройка редактора (VS Code, IntelliJ) на автоматическое форматирование файла при сохранении с помощью встроенных или плагин-форматтеров.
➤ Вариант 3 (Форматирование в CI): этап в пайплайне, который проверяет, соответствует ли код стандарту. В случае несоответствия — падает, указывая на проблему, или даже автоматически создает коммит с исправлениями.
Автоматическое форматирование — это не про эстетику, а про предсказуемость и устранение шума. Оно убирает из диффов сотни бессмысленных изменений, связанных со стилем, позволяя сосредоточиться на смысловых правках.
Удалось ли Вам внедрить автоматическое форматирование в командной работе? С какими сложностями столкнулись?
P.S. `black` (для Python) носит девиз «Несоглашаемый форматтер». В этом его сила: он принимает все решения за Вас, не оставляя места для дискуссий.
Please open Telegram to view this post
VIEW IN TELEGRAM
100🔥2❤1
ssh-туннели: ваш секретный проход сквозь стены
Ручное пробрасывание портов, настройка VPN для одноразового доступа к внутреннему сервису или БД — это избыточно.
Если для доступа к внутреннему ресурсу нужно менять сетевые политики, вероятно, Вы используете не тот инструмент.
➤ Вариант 1 (Локальный проброс -L): доступ к удаленной БД, слушающей на
➤ Вариант 2 (Динамический SOCKS-прокси -D): создание безопасного прокси для всего браузерного трафика через удаленный хост.
➤ Вариант 3 (Удаленный проброс -R): публикация локального сервиса (например, веб-сервера на порту 3000) на удаленной машине для демонстрации.
Как часто Вы используете ssh не для входа на сервер, а для решения проблем с доступом к сервисам?
🌐 @helcode
Ручное пробрасывание портов, настройка VPN для одноразового доступа к внутреннему сервису или БД — это избыточно.
ssh-туннель — это быстрое, безопасное и элегантное решение для создания защищенных временных коридоров в любую точку сети.Если для доступа к внутреннему ресурсу нужно менять сетевые политики, вероятно, Вы используете не тот инструмент.
➤ Вариант 1 (Локальный проброс -L): доступ к удаленной БД, слушающей на
localhost:5432, как если бы она была локальной.ssh -L 6543:localhost:5432 user@bastion-host
# Теперь подключение к localhost:6543 на Вашей машине идёт на порт 5432 bastion-host
➤ Вариант 2 (Динамический SOCKS-прокси -D): создание безопасного прокси для всего браузерного трафика через удаленный хост.
ssh -D 1080 user@gateway
# Настройка в браузере: SOCKS v5, localhost:1080
➤ Вариант 3 (Удаленный проброс -R): публикация локального сервиса (например, веб-сервера на порту 3000) на удаленной машине для демонстрации.
ssh -R 8080:localhost:3000 user@public-server.com
# Сервис будет доступен на public-server.com:8080
ssh — это не только оболочка. Это основа сетевой безопасности, способная создавать динамические, зашифрованные соединения «на лету». Это автоматизация безопасного доступа без сложных конфигураций.Как часто Вы используете ssh не для входа на сервер, а для решения проблем с доступом к сервисам?
P.S. Ключ `-N` (не выполнять команды) полезен в сочетании с туннелями, когда нужен только проброс портов. А `autossh` поможет сделать туннель устойчивым к разрывам.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤4
git bisect: детектив, который находит виновника регрессии
Тест падает в
Метод «я помню, что в том коммите точно всё работало» — это ненадежная стратегия.
➤ Вариант 1 (Полная автоматизация): задаем «хороший» (good) коммит, где всё работало, и «плохой» (bad), где есть ошибка.
➤ Вариант 2 (Ручной режим): для сложных багов, где нужна ручная проверка. Git перемещает Вас по коммитам, а Вы отмечаете их как
➤ Вариант 3 (Спасение от мердж-коммитов):
Приходилось ли Вам использовать git bisect для поиска сложной регрессии? Сколько времени он спас?
🌐 @helcode
Тест падает в
main, но в каком из сотни коммитов появился баг? Ручной перебор и проверка — это дни работы. git bisect — это бинарный поиск по истории коммитов, который автоматически находит тот самый «плохой» коммит.Метод «я помню, что в том коммите точно всё работало» — это ненадежная стратегия.
➤ Вариант 1 (Полная автоматизация): задаем «хороший» (good) коммит, где всё работало, и «плохой» (bad), где есть ошибка.
git bisect run автоматически проверяет каждый коммит скриптом.git bisect start
git bisect bad HEAD
git bisect good v1.0
git bisect run ./test_for_bug.sh
# Git будет автоматически перемещаться по истории, запуская скрипт.
➤ Вариант 2 (Ручной режим): для сложных багов, где нужна ручная проверка. Git перемещает Вас по коммитам, а Вы отмечаете их как
good или bad, сужая диапазон поиска.➤ Вариант 3 (Спасение от мердж-коммитов):
git bisect skip позволяет пропускать коммиты, которые не компилируются или не релевантны, повышая точность поиска.git bisect — это автоматизация расследования. Это применение алгоритмического мышления к истории изменений, превращающее хаотичный поиск в предсказуемый и быстрый процесс.Приходилось ли Вам использовать git bisect для поиска сложной регрессии? Сколько времени он спас?
P.S. Этот инструмент — одна из лучших демонстраций силы, скрытой в, казалось бы, простых системах контроля версий.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤3
Автоматическое тестирование на регрессии: не дайте прошлому вернуться
Новый функционал работает, но старая функция, которую никто не трогал, ломается. Ручной прогон всех сценариев после каждого изменения — это фантастика. Регрессионное тестирование должно быть автоматическим и непрерывным.
«Надеюсь, ничего не сломалось» — это не стратегия обеспечения качества.
➤ Вариант 1 (Наборы автотестов в CI/CD): пайплайн, который при любом пуше в репозиторий запускает юнит-тесты, интеграционные и e2e-тесты, сравнивая результаты с эталоном.
➤ Вариант 2 (Снэпшот-тестирование): для UI или API ответов. Инструменты (Jest для JS и др.) сохраняют «снимок» корректного вывода и автоматически сравнивают с ним каждый новый запуск, требуя подтверждения при осознанных изменениях.
➤ Вариант 3 (Мониторинг продакшена как тест): система, которая периодически прогоняет ключевые пользовательские сценарии (через синтетические транзакции) и сравнивает метрики производительности и доступности с пороговыми значениями.
Автоматическое регрессионное тестирование — это создание «защитного поля» вокруг рабочего кода. Это гарантия того, что прогресс не оборачивается двумя шагами назад.
Какой процент регрессий в Вашем проекте отлавливается автоматически, а какие всё ещё прорываются в прод?
🌐 @helcode
Новый функционал работает, но старая функция, которую никто не трогал, ломается. Ручной прогон всех сценариев после каждого изменения — это фантастика. Регрессионное тестирование должно быть автоматическим и непрерывным.
«Надеюсь, ничего не сломалось» — это не стратегия обеспечения качества.
➤ Вариант 1 (Наборы автотестов в CI/CD): пайплайн, который при любом пуше в репозиторий запускает юнит-тесты, интеграционные и e2e-тесты, сравнивая результаты с эталоном.
➤ Вариант 2 (Снэпшот-тестирование): для UI или API ответов. Инструменты (Jest для JS и др.) сохраняют «снимок» корректного вывода и автоматически сравнивают с ним каждый новый запуск, требуя подтверждения при осознанных изменениях.
➤ Вариант 3 (Мониторинг продакшена как тест): система, которая периодически прогоняет ключевые пользовательские сценарии (через синтетические транзакции) и сравнивает метрики производительности и доступности с пороговыми значениями.
Автоматическое регрессионное тестирование — это создание «защитного поля» вокруг рабочего кода. Это гарантия того, что прогресс не оборачивается двумя шагами назад.
Какой процент регрессий в Вашем проекте отлавливается автоматически, а какие всё ещё прорываются в прод?
P.P.S. Идеальный пайплайн — тот, при котором страх перед мерджем в `main` исчезает, потому что Вы знаете: если что-то пойдет не так, автоматика Вас предупредит.
🌐 @helcode
❤4
alias и functions в shell: создайте свой собственный язык
Постоянный ввод
Настройка рабочего окружения — это тоже автоматизация. Автоматизация самого процесса взаимодействия с системой.
➤ Вариант 1 (Простые алиасы в
➤ Вариант 2 (Функции для сложной логики): алиас не может обработать аргументы сложным образом. Для этого нужны функции.
➤ Вариант 3 (Переносимые настройки): хранение файлов с алиасами и функциями в Git-репозитории с скриптом для симлинкинга в домашнюю директорию. Это позволяет синхронизировать окружение между всеми рабочими станциями.
Создание собственного набора команд — это шаг к более эффективному ментальному интерфейсу с компьютером. Вы не адаптируетесь к системе — система адаптируется под Вас.
Какая Ваша самая любимая или неочевидная пользовательская команда в shell?
🌐 @helcode
Постоянный ввод
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`) — это встроенная магия, которую знают не все.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1🌚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, который раз в неделю запускает
➤ Вариант 3 (Сканирование уязвимостей в пайплайне): этап
Автоматическое управление зависимостями — это сдвиг левостороннего подхода (shift-left) в безопасности и поддержке. Проблема обнаруживается и предлагается к решению еще до того, как станет критической.
Доверяете ли Вы автоматическим PR от ботов? Или предпочитаете ручной контроль за каждым обновлением минорной версии?
🌐 @helcode
Ручное обновление версий пакетов в файлах зависимостей — это игра в рулетку с совместимостью. Современные инструменты могут автоматически находить обновления, проверять их на безопасность и даже создавать пул-реквесты.
Зависимость с известной уязвимостью (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 должны всегда запускать полный набор тестов, давая уверенность при мердже.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3
fzf — нечеткий поиск, который меняет взаимодействие с CLI
Ручной перебор истории команд, поиск файла в глубокой директории или выбор хоста из длинного списка — это действия, требующие точности.
Скорость работы часто упирается не в процессор, а в скорость принятия решений и ввода.
➤ Вариант 1 (Поиск в истории команд): вместо
➤ Вариант 2 (Интерактивный
➤ Вариант 3 (Интеграция с git): просмотр и чекаут веток через
Пробовали ли Вы интегрировать fzf в свой рабочий процесс? Какие сценарии оказались самыми полезными?
🌐 @helcode
Ручной перебор истории команд, поиск файла в глубокой директории или выбор хоста из длинного списка — это действия, требующие точности.
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 было таким же интерактивным и отзывчивым.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍1