Куда мигрируем?
Anonymous Poll
7%
Группа ВКонтакте
3%
Канал ВКонтакте
83%
Остаёмся в Телеграм
3%
Boosty
2%
Дзен
21%
Децентрализация (всё сразу)
Коллеги, вновь рад всех приветствовать!
По результатам вчерашнего опроса было принято решение о децентрализации, а точнее - создании клонов канала в различных социальных сетях. Данный процесс займет какое-то время, но обязательно будет реализован для вас! Важно уточнить: канал в Телеграм остаётся основным, на остальные площадки контент лишь будет дублироваться.
На данный момент создана страница на Boosty, в связи с чем возник стратегический вопрос. Интересует ли вас какой-либо "платный" контент? Если да, то в каком формате и что для вас было бы интересно? Может, подробные шпаргалки по утилитам, кейсы из моей практики по различным тематикам, "личное мнение" на какие-то вопросы? Если нет желания оставлять комментарий - можете написать лично и предложить какой-либо вариант: @helcodeadm
ВАЖНО:
Канал создавался как пространство для обмена опытом и знаниями об автоматизации. Эта задача для меня остаётся неизменной. Платный контент рассматривается не как способ "оградить знания за финансовой стеной", а как возможность создавать более глубокие, проработанные материалы, которые требуют значительных временных затрат, которые сложно делать в формате ежедневной ленты.
Если вам это не нужно - канал останется бесплатным и будет развиваться в текущем темпе. Если есть запрос на "глубину" - мы с коллегой обязательно подумаем, как организовать это технически и этически правильно.
Благодарю всех, кто найдёт время ответить. Даже один комментарий с цифрами - крайне ценный сигнал.
P.S. С завтрашнего дня возвращаемся привычным постам, спасибо за понимание и обратную связь!
По результатам вчерашнего опроса было принято решение о децентрализации, а точнее - создании клонов канала в различных социальных сетях. Данный процесс займет какое-то время, но обязательно будет реализован для вас! Важно уточнить: канал в Телеграм остаётся основным, на остальные площадки контент лишь будет дублироваться.
На данный момент создана страница на Boosty, в связи с чем возник стратегический вопрос. Интересует ли вас какой-либо "платный" контент? Если да, то в каком формате и что для вас было бы интересно? Может, подробные шпаргалки по утилитам, кейсы из моей практики по различным тематикам, "личное мнение" на какие-то вопросы? Если нет желания оставлять комментарий - можете написать лично и предложить какой-либо вариант: @helcodeadm
ВАЖНО:
Канал создавался как пространство для обмена опытом и знаниями об автоматизации. Эта задача для меня остаётся неизменной. Платный контент рассматривается не как способ "оградить знания за финансовой стеной", а как возможность создавать более глубокие, проработанные материалы, которые требуют значительных временных затрат, которые сложно делать в формате ежедневной ленты.
Если вам это не нужно - канал останется бесплатным и будет развиваться в текущем темпе. Если есть запрос на "глубину" - мы с коллегой обязательно подумаем, как организовать это технически и этически правильно.
Благодарю всех, кто найдёт время ответить. Даже один комментарий с цифрами - крайне ценный сигнал.
P.S. С завтрашнего дня возвращаемся привычным постам, спасибо за понимание и обратную связь!
👍8❤1
iperf3 — не гадаем, а измеряем пропускную способность сети
Сетевые приложения тормозят, копирование файлов медленное, а «пинг» вроде нормальный. "Гадания на кофейной гуще" и тесты скорости через загрузку файлов с облака - не метод.
Скорость сети - не ощущение, а измеримая величина. Если Вы её не измеряете, Вы ей не управляете.
➤ Вариант 1 (Базовая проверка): запуск сервера на одной машине и клиента на другой.
➤ Вариант 2 (Двунаправленное тестирование): ключ
➤ Вариант 3 (Параллельные потоки и длительность): имитация реальной многопоточной нагрузки.
➤ Вариант 4 (UDP-тест для чувствительных приложений): для VoIP или видеосвязи важны потери и джиттер.
Полезно держать
🌐 @helcode
Сетевые приложения тормозят, копирование файлов медленное, а «пинг» вроде нормальный. "Гадания на кофейной гуще" и тесты скорости через загрузку файлов с облака - не метод.
iperf3 - это профессиональный инструмент для измерения максимальной пропускной способности сети между двумя хостами, который выдаёт точные цифры: скорость, джиттер, потери пакетов.Скорость сети - не ощущение, а измеримая величина. Если Вы её не измеряете, Вы ей не управляете.
➤ Вариант 1 (Базовая проверка): запуск сервера на одной машине и клиента на другой.
# На сервере (принимающая сторона)
iperf3 -s
# На клиенте (отправляющая сторона)
iperf3 -c 192.168.1.100
➤ Вариант 2 (Двунаправленное тестирование): ключ
-R (reverse) меняет направление, позволяя увидеть асимметрию канала (часто бывает, что загрузка быстрее отдачи).iperf3 -c 192.168.1.100 -R
➤ Вариант 3 (Параллельные потоки и длительность): имитация реальной многопоточной нагрузки.
iperf3 -c 192.168.1.100 -P 4 -t 30
# -P 4: 4 параллельных потока
# -t 30: тест длится 30 секунд
➤ Вариант 4 (UDP-тест для чувствительных приложений): для VoIP или видеосвязи важны потери и джиттер.
iperf3 -c 192.168.1.100 -u -b 100M
# -u: UDP режим
# -b 100M: пытаемся отправить 100 мегабит/с
iperf3 - это автоматизация объективной сетевой диагностики. Он убирает фактор "кажется" и даёт цифры, на которые можно опираться при общении с провайдером или при поиске узкого места в инфраструктуре.Полезно держать
iperf3 в Docker-образе или установленным на всех ключевых серверах, чтобы быстро проверять связность при жалобах на скорость.P.S. Версии iperf3 должны совпадать на клиенте и сервере, иначе тест может не работать или выдавать некорректные результаты.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍4
git worktree — параллельная работа без переключения контекста
Нужно срочно исправить баг на продакшене, но текущая ветка с новой фичей не готова к коммиту?
Переключение контекста в разработке - главный пожиратель продуктивности.
➤ Вариант 1 (Создание нового worktree): добавляем новую рабочую директорию для ветки
➤ Вариант 2 (Работа с несколькими фичами): можно держать отдельные папки для
➤ Вариант 3 (Просмотр и очистка): увидеть все активные worktree и удалить ненужные.
Это инструмент для тех, кто часто работает с несколькими ветками параллельно: поддержка старых версий, срочные хотфиксы, code review в другой ветке без потери текущего состояния.
🌐 @helcode
Нужно срочно исправить баг на продакшене, но текущая ветка с новой фичей не готова к коммиту?
git stash, git checkout, а потом обратно - потеря концентрации и времени. git worktree позволяет одновременно иметь несколько рабочих копий одного репозитория, привязанных к разным веткам, на диске.Переключение контекста в разработке - главный пожиратель продуктивности.
git worktree устраняет саму необходимость переключения.➤ Вариант 1 (Создание нового worktree): добавляем новую рабочую директорию для ветки
hotfix.git worktree add ../project-hotfix hotfix
# Теперь в папке ../project-hotfix лежит код ветки hotfix
➤ Вариант 2 (Работа с несколькими фичами): можно держать отдельные папки для
feature-1, feature-2 и main, не трогая основной рабочий каталог.git worktree add ../project-feature-a feature-a
git worktree add ../project-feature-b feature-b
➤ Вариант 3 (Просмотр и очистка): увидеть все активные worktree и удалить ненужные.
git worktree list
git worktree remove ../project-hotfix
git worktree - это автоматизация управления рабочим пространством. Он позволяет мозгу не переключаться между задачами, а просто открыть новое окно терминала или редактора с уже готовым контекстом.Это инструмент для тех, кто часто работает с несколькими ветками параллельно: поддержка старых версий, срочные хотфиксы, code review в другой ветке без потери текущего состояния.
P.S. Worktree не занимают лишнего места на диске (объекты хранятся в оригинальном репозитории), только файлы рабочей директории. Это почти бесплатный параллелизм.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1🤔1
at — одноразовый cron для отложенных задач
Запустить тяжёлый скрипт через 3 часа, когда закончится рабочий день, но не хочется оставлять терминал открытым? Или напомнить себе о чём-то через 15 минут?
Не каждая автоматизация должна быть регулярной. Иногда нужно просто «выстрелить и забыть».
➤ Вариант 1 (Простое выполнение): запуск скрипта в 18:00.
➤ Вариант 2 (Интерактивный режим): можно ввести команду прямо в консоли
➤ Вариант 3 (Относительное время): запуск через 2 часа или завтра в 9 утра.
➤ Вариант 4 (Управление задачами): просмотр и удаление отложенных задач.
В современных системах есть
🌐 @helcode
Запустить тяжёлый скрипт через 3 часа, когда закончится рабочий день, но не хочется оставлять терминал открытым? Или напомнить себе о чём-то через 15 минут?
cron избыточен для одноразовых задач. at - это команда для выполнения задания один раз в указанное время.Не каждая автоматизация должна быть регулярной. Иногда нужно просто «выстрелить и забыть».
➤ Вариант 1 (Простое выполнение): запуск скрипта в 18:00.
echo "/opt/scripts/backup.sh" | at 18:00
➤ Вариант 2 (Интерактивный режим): можно ввести команду прямо в консоли
at.at 15:30
at> ./long_running_task.sh
at> ./cleanup.sh
at> <Ctrl+D>
➤ Вариант 3 (Относительное время): запуск через 2 часа или завтра в 9 утра.
at now + 2 hours
at 9:00 tomorrow
➤ Вариант 4 (Управление задачами): просмотр и удаление отложенных задач.
atq # посмотреть очередь
atrm 12 # удалить задачу с номером 12
at - это автоматизация однократных отложенных действий. Он закрывает нишу между «сделать прямо сейчас» и «сделать регулярно по расписанию», которая часто заполняется костылями вроде sleep 3600 && command в фоне.В современных системах есть
systemd-run с опцией --on-active, но at проще и вездесущ.P.S. Демон atd должен быть запущен в системе. Проверить можно командой systemctl status atd.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤1
Коллеги, приветствую! Попробуем новостные посты?
Microsoft решила поиграть с Rufus
Наткнулся на интересную историю на днях. Создатель Rufus обнаружил, что Microsoft начала охоту на скрипты автоматизации, которые тянут ISO-образы прямо с их серверов. Модуль Fido, встроенный в Rufus, перестал работать для свежих инсайдерских сборок (Canary и Server Preview).
Разработчик Rufus подозревает, что инженеры Microsoft специально изучили открытый исходный код Fido (он же open source), чтобы написать сигнатуры для его блокировки. Мол, корпорация добра пытается загнать всех в своё кривое творение Media Creation Tool.
Лично моё мнение. Если честно, эта глупость с блокировками выглядит жалко. Вместо того чтобы сделать нормальный инструмент, который люди захотят использовать, они пытаются силой загнать всех в своё корыто (знакомая история, да?). Rufus существует столько лет именно потому, что официальные инструменты Microsoft - неудобно и "больно". И вместо того чтобы сделать их удобнее, они просто режут возможности тем, кто хочет работать с системой по-человечески.
Особенно умиляет момент с открытым кодом. То есть они не придумали ничего лучше, чем изучить код проекта, который сообщество сделало для удобства людей, и написать под него блокировки. Вместо того чтобы сказать "спасибо" за бесплатный пентест своих серверов. Отличненько...
Война с удобным скачиванием - очередной этап закручивания гаек. Видимо, слишком много людей решили, что имеют право устанавливать Windows так, как им удобно. Подобными выпадами они скорее Linux в массы продвинут.
🌐 @helcode
Microsoft решила поиграть с Rufus
Наткнулся на интересную историю на днях. Создатель Rufus обнаружил, что Microsoft начала охоту на скрипты автоматизации, которые тянут ISO-образы прямо с их серверов. Модуль Fido, встроенный в Rufus, перестал работать для свежих инсайдерских сборок (Canary и Server Preview).
Разработчик Rufus подозревает, что инженеры Microsoft специально изучили открытый исходный код Fido (он же open source), чтобы написать сигнатуры для его блокировки. Мол, корпорация добра пытается загнать всех в своё кривое творение Media Creation Tool.
Лично моё мнение. Если честно, эта глупость с блокировками выглядит жалко. Вместо того чтобы сделать нормальный инструмент, который люди захотят использовать, они пытаются силой загнать всех в своё корыто (знакомая история, да?). Rufus существует столько лет именно потому, что официальные инструменты Microsoft - неудобно и "больно". И вместо того чтобы сделать их удобнее, они просто режут возможности тем, кто хочет работать с системой по-человечески.
Особенно умиляет момент с открытым кодом. То есть они не придумали ничего лучше, чем изучить код проекта, который сообщество сделало для удобства людей, и написать под него блокировки. Вместо того чтобы сказать "спасибо" за бесплатный пентест своих серверов. Отличненько...
Война с удобным скачиванием - очередной этап закручивания гаек. Видимо, слишком много людей решили, что имеют право устанавливать Windows так, как им удобно. Подобными выпадами они скорее Linux в массы продвинут.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5😱2❤1🤣1
sshfs — монтируем удалённую файловую систему как локальную
Копировать файлы по
Удалённые файлы не должны чувствоваться удалёнными. Инструменты должны стирать границы.
➤ Вариант 1 (Базовое монтирование): монтируем домашнюю директорию сервера в локальную папку.
➤ Вариант 2 (Монтирование с ключом и опциями): использование SSH-ключа и сжатия для медленных каналов.
➤ Вариант 3 (Автоматическое монтирование при доступе): настройка в
➤ Вариант 4 (Размонтирование):
Это незаменимая вещь для разработки, когда код лежит на сервере, или для администрирования, когда нужно просматривать/редактировать логи и конфиги в привычном редакторе.
🌐 @helcode
Копировать файлы по
scp туда-сюда для редактирования, или открывать их через промежуточный sftp в редакторе - это оверхед. sshfs (SSH Filesystem) позволяет смонтировать удалённую директорию по SSH как обычный локальный диск. Можно редактировать файлы прямо на сервере любым локальным редактором, без синхронизации.Удалённые файлы не должны чувствоваться удалёнными. Инструменты должны стирать границы.
➤ Вариант 1 (Базовое монтирование): монтируем домашнюю директорию сервера в локальную папку.
sshfs user@server:/home/user /mnt/remote-server
➤ Вариант 2 (Монтирование с ключом и опциями): использование SSH-ключа и сжатия для медленных каналов.
sshfs -o Compression=yes,IdentityFile=~/.ssh/id_rsa user@server:/var/www /mnt/www
➤ Вариант 3 (Автоматическое монтирование при доступе): настройка в
/etc/fstab с использованием sshfs (потребуется ключ без пароля или sshpass).user@server:/remote/path /local/mountpoint fuse.sshfs noauto,x-systemd.automount,_netdev,users,identityfile=/home/user/.ssh/id_rsa,allow_other,reconnect 0 0
➤ Вариант 4 (Размонтирование):
fusermount -u /mnt/remote-server
sshfs - это автоматизация прозрачного доступа к удалённым данным. Он основан на FUSE (Filesystem in Userspace) и использует стандартный SSH-протокол, то есть не требует ничего, кроме работающего SSH-сервера на целевой машине.Это незаменимая вещь для разработки, когда код лежит на сервере, или для администрирования, когда нужно просматривать/редактировать логи и конфиги в привычном редакторе.
P.S. Будьте осторожны с редактированием бинарных файлов или баз данных через sshfs - возможны проблемы с блокировками. Для конфигов и скриптов - идеально.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
nethogs — кто съел весь интернет?
Внезапный всплеск трафика на сервере - это либо кто-то скачивает обновления, либо сервер взломан и участвует в DDoS. Разница критическая.
➤ Вариант 1 (Базовый запуск): запуск без аргументов показывает все процессы на всех интерфейсах.
➤ Вариант 2 (Выбор интерфейса): следим только за внешним интерфейсом.
➤ Вариант 3 (Интервал обновления): медленное обновление для длительного наблюдения.
➤ Вариант 4 (Режим просмотра): переключение между суммарным и поточным отображением клавишей
Полезно как для серверов (поиск утекшего трафика, подозрительной активности), так и для рабочих станций (почему тормозит интернет, что за процесс обновляется).
🌐 @helcode
iftop показывает общую нагрузку на интерфейс, nload - графики скорости. Но когда трафик неожиданно вырастает, хочется знать не *сколько*, а *кто* именно. nethogs разбивает трафик по процессам: показывает PID, имя программы и скорость загрузки/отдачи для каждого процесса.Внезапный всплеск трафика на сервере - это либо кто-то скачивает обновления, либо сервер взломан и участвует в DDoS. Разница критическая.
➤ Вариант 1 (Базовый запуск): запуск без аргументов показывает все процессы на всех интерфейсах.
sudo nethogs
➤ Вариант 2 (Выбор интерфейса): следим только за внешним интерфейсом.
sudo nethogs eth0
➤ Вариант 3 (Интервал обновления): медленное обновление для длительного наблюдения.
sudo nethogs -d 5 eth0
# -d 5: обновление каждые 5 секунд
➤ Вариант 4 (Режим просмотра): переключение между суммарным и поточным отображением клавишей
m.nethogs - это автоматизация привязки сетевого трафика к конкретным процессам. Он отвечает на вопрос, на который iftop ответить не может: «Какая программа так активно качает?».Полезно как для серверов (поиск утекшего трафика, подозрительной активности), так и для рабочих станций (почему тормозит интернет, что за процесс обновляется).
P.S. nethogs требует прав root для просмотра процессов других пользователей. Запускайте через sudo.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤1🔥1
script — запись сессии терминала для документации или разбора инцидента
Сделали сложную последовательность действий, которая привела к починке системы. Через месяц потребуется повторить, а Вы уже не помните детали. Или нужно показать коллеге точную последовательность команд и их вывод.
Память человека - ненадёжный носитель. Сессия терминала, записанная в файл, - надёжный.
➤ Вариант 1 (Простая запись): запуск
➤ Вариант 2 (Запись с меткой времени): полезно для расследования инцидентов, чтобы понимать, в какой момент что произошло.
➤ Вариант 3 (Тихий режим): запись без сообщений о начале и конце.
➤ Вариант 4 (Дозапись): добавление к существующему логу.
➤ Приложить к постмортему.
➤ Использовать для обучения новых сотрудников.
➤ Разобрать, чтобы понять, какая именно команда что-то сломала.
➤ Воспроизвести для демонстрации.
🌐 @helcode
Сделали сложную последовательность действий, которая привела к починке системы. Через месяц потребуется повторить, а Вы уже не помните детали. Или нужно показать коллеге точную последовательность команд и их вывод.
script записывает всё, что происходит в терминале - и ввод, и вывод - в файл.Память человека - ненадёжный носитель. Сессия терминала, записанная в файл, - надёжный.
➤ Вариант 1 (Простая запись): запуск
script начинает запись, exit завершает.script session.log
# ... делаем что-то важное ...
exit
# Всё сохранено в session.log
➤ Вариант 2 (Запись с меткой времени): полезно для расследования инцидентов, чтобы понимать, в какой момент что произошло.
script --timing=timing.txt session.log
# Позже можно воспроизвести сессию с реальными задержками
scriptreplay --timing=timing.txt session.log
➤ Вариант 3 (Тихий режим): запись без сообщений о начале и конце.
script -q session.log
➤ Вариант 4 (Дозапись): добавление к существующему логу.
script -a session.log
script - это автоматизация документирования работы в терминале. Он превращает хаотичную сессию администрирования в структурированный лог, который можно:➤ Приложить к постмортему.
➤ Использовать для обучения новых сотрудников.
➤ Разобрать, чтобы понять, какая именно команда что-то сломала.
➤ Воспроизвести для демонстрации.
P.S. script записывает даже управляющие последовательности (цвета, позиционирование курсора), поэтому файл может содержать "мусор". Для просмотра лучше использовать cat или less -R, чтобы видеть оригинальное форматирование.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥5❤2
shellcheck — статический анализ для ваших bash-скриптов
Bash-скрипт написан, работает... но почему-то падает на пустых переменных или некорректно обрабатывает пробелы в именах файлов.
Bash - мощный, но коварный язык. Ошибки в нём часто проявляются не сразу, а в самый неподходящий момент.
➤ Вариант 1 (Базовая проверка): просто запустить
➤ Вариант 2 (Интеграция в редактор): плагины для VS Code, Sublime, Vim подсвечивают проблемы прямо во время написания кода.
➤ Вариант 3 (Интеграция в CI/CD): добавление шага в пайплайн, который проверяет все
➤ Вариант 4 (Подавление предупреждений): иногда нужно отключить конкретную проверку, если Вы точно знаете, что делаете.
Каждый скрипт, который живёт дольше одного дня, должен проходить через
🌐 @helcode
Bash-скрипт написан, работает... но почему-то падает на пустых переменных или некорректно обрабатывает пробелы в именах файлов.
shellcheck - это линтер для shell-скриптов, который находит сотни потенциальных ошибок, уязвимостей и неэффективностей, объясняя, что именно не так и как это исправить.Bash - мощный, но коварный язык. Ошибки в нём часто проявляются не сразу, а в самый неподходящий момент.
➤ Вариант 1 (Базовая проверка): просто запустить
shellcheck на скрипте.shellcheck deploy.sh
➤ Вариант 2 (Интеграция в редактор): плагины для VS Code, Sublime, Vim подсвечивают проблемы прямо во время написания кода.
➤ Вариант 3 (Интеграция в CI/CD): добавление шага в пайплайн, который проверяет все
.sh файлы. Если скрипт содержит ошибки — пайплайн падает.# Пример для GitLab CI
shellcheck:
script:
- apt-get install -y shellcheck
- shellcheck *.sh
➤ Вариант 4 (Подавление предупреждений): иногда нужно отключить конкретную проверку, если Вы точно знаете, что делаете.
# shellcheck disable=SC2086
some_command $variable # SC2086: Double quote to prevent globbing and word splitting
shellcheck - это автоматизация повышения качества и надёжности скриптов. Он превращает написание bash-скриптов из шаманства в инженерную дисциплину с обратной связью от инструмента.Каждый скрипт, который живёт дольше одного дня, должен проходить через
shellcheck. Это простое правило убережёт от тонн трудноотлавливаемых багов.P.S. У shellcheck есть онлайн-версия (shellcheck.net), куда можно скопировать код и мгновенно увидеть все проблемы. Полезно, если нет возможности установить локально.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤2🤔1👌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
Git Hooks: Твой личный робот-помощник
Хотите, чтобы код автоматически прогонял тесты перед каждым коммитом? Или чтобы линтер проверял стиль? Или чтобы скрипт развертывания сам запускался после пушa в
Хуки лежат в папке
Не забудьте дать файлу права на выполнение:
Git Hooks — это скрипты, которые Git запускает в ответ на определенные события (commit, push, rebase и т.д.). Они выполняются локально и позволяют автоматизировать рутину и внедрить контроль качества.
Какой самый полезный или безумный Git Hook Вы когда-либо использовали или хотели бы использовать? Поделитесь идеями!
Настроить
🌐 @helcode
Хотите, чтобы код автоматически прогонял тесты перед каждым коммитом? Или чтобы линтер проверял стиль? Или чтобы скрипт развертывания сам запускался после пушa в
main? Пора познакомиться с Git Hooks.Хуки лежат в папке
.git/hooks/. Пример пре-коммит хука (.git/hooks/pre-commit), который не даст закоммитить код, не прошедший линтинг:#!/bin/sh
echo "Запуск линтера..."
if ! eslint --cache --fix .; then
echo "Линтер нашел ошибки! Коммит отменен."
exit 1
fi
git add . # Добавляем исправления, сделанные линтером
Не забудьте дать файлу права на выполнение:
chmod +x .git/hooks/pre-commitGit Hooks — это скрипты, которые Git запускает в ответ на определенные события (commit, push, rebase и т.д.). Они выполняются локально и позволяют автоматизировать рутину и внедрить контроль качества.
Какой самый полезный или безумный Git Hook Вы когда-либо использовали или хотели бы использовать? Поделитесь идеями!
Настроить
pre-commit хук — это как нанять очень принципиального секьюрити, который не пустит Вас на работу в пижаме. Иногда раздражает, но в итоге все только выигрывают.Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3👌1
Автоматическое резервное копирование: спим спокойно
Бэкапы — это как страховка: все знают, что нужны, но мало кто их делает. Исправим это одним скриптом.
"А у нас есть бэкап?" — самый страшный вопрос, который можно услышать после "система легла". Ручные бэкапы ненадежны и забываются.
Вариант 1 (Bash-скрипт + Cron):
Вариант 2 (Python-скрипт с отправкой в облако):
Disaster Recovery — автоматизируем процессы восстановления после сбоев. Правило 3-2-1: 3 копии данных, на 2 разных носителях, 1 копия off-site.
А как у вас с бэкапами? Ручные, автоматические, или по принципу "если продакшен упадет, просто найдем новую работу"?
🌐 @helcode
Бэкапы — это как страховка: все знают, что нужны, но мало кто их делает. Исправим это одним скриптом.
"А у нас есть бэкап?" — самый страшный вопрос, который можно услышать после "система легла". Ручные бэкапы ненадежны и забываются.
Вариант 1 (Bash-скрипт + Cron):
#!/bin/bash
BACKUP_DIR="/backups"
DATE=$(date +%Y%m%d_%H%M%S)
# Бэкап базы данных
pg_dump mydb > $BACKUP_DIR/mydb_$DATE.sql
# Бэкап важных директорий
tar -czf $BACKUP_DIR/app_$DATE.tar.gz /app/data
# Удаляем старые бэкапы (старше 30 дней)
find $BACKUP_DIR -name "*.sql" -mtime +30 -delete
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
Вариант 2 (Python-скрипт с отправкой в облако):
import boto3
from datetime import datetime
s3 = boto3.client('s3')
backup_file = f"backup_{datetime.now().strftime('%Y%m%d')}.sql"
# Создаем бэкап и загружаем в S3
subprocess.run(['pg_dump', 'mydb', '-f', backup_file])
s3.upload_file(backup_file, 'my-backup-bucket', backup_file)
Disaster Recovery — автоматизируем процессы восстановления после сбоев. Правило 3-2-1: 3 копии данных, на 2 разных носителях, 1 копия off-site.
А как у вас с бэкапами? Ручные, автоматические, или по принципу "если продакшен упадет, просто найдем новую работу"?
P.S. Есть два типа людей: те, кто делают бэкапы, и те, кто еще будет их делать.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2👌2🥱1
Война с плавающим багом в CI
Ваш CI-пайплайн падает раз в два дня из-за плавающего теста, и все делают вид, что не замечают? Сегодня объявляем ему войну. Не игнорируем, а автоматизируем поимку.
Это классика: "У меня работает", "Heisenbug*", который исчезает при попытке отладки. Команда привыкает к красному статусу и перестает ему доверять, что убивает саму идею CI. Ручной перезапуск — это не решение, это признание поражения.
➤ Вариант 1 (Bash + Cron): Пишем скрипт, который дергает API вашего CI (например, Jenkins/GitLab), проверяет последний запуск падающего джоба и в случае ошибки автоматически перезапускает его, отправляя уведомление в Slack.
➤ Вариант 2 (GitHub Actions): используем
Речь об устойчивости и проактивном мониторинге. Система не должна полагаться на бдительность человека. Мы встраиваем механизм самовосстановления для известных, но трудноустранимых проблем. Это тот же принцип, что и в
А в вашей команде есть "призрачный" баг? Как вы с ним боретесь: пишете сложные логи, ставите ретраи или просто молитесь?
🌐 @helcode
Ваш CI-пайплайн падает раз в два дня из-за плавающего теста, и все делают вид, что не замечают? Сегодня объявляем ему войну. Не игнорируем, а автоматизируем поимку.
Это классика: "У меня работает", "Heisenbug*", который исчезает при попытке отладки. Команда привыкает к красному статусу и перестает ему доверять, что убивает саму идею CI. Ручной перезапуск — это не решение, это признание поражения.
➤ Вариант 1 (Bash + Cron): Пишем скрипт, который дергает API вашего CI (например, Jenkins/GitLab), проверяет последний запуск падающего джоба и в случае ошибки автоматически перезапускает его, отправляя уведомление в Slack.
# Пример для GitLab CI с использованием jq и curl
PIPELINE_STATUS=$(curl -s --header "PRIVATE-TOKEN: <your_token>" "https://gitlab.com/api/v4/projects/<project_id>/pipelines/latest" | jq -r '.status')
if [ "$PIPELINE_STATUS" = "failed" ]; then
curl --request POST --header "PRIVATE-TOKEN: <your_token>" "https://gitlab.com/api/v4/projects/<project_id>/pipelines/latest/retry"
curl -X POST -H 'Content-type: application/json' --data '{"text":"Плавающий тест снова упал. Автоперезапуск...»"}' $SLACK_WEBHOOK
fi
➤ Вариант 2 (GitHub Actions): используем
schedule и джоб с условием для автоматического перезапуска только конкретного флаки-теста.jobs:
retry_flaky_test:
if: failure() && contains(github.event.head_commit.message, 'retry flaky test')
runs-on: ubuntu-latest
steps:
- name: Retry the flaky test suite
run: |
echo "Автоматический ретрай запущен"
Речь об устойчивости и проактивном мониторинге. Система не должна полагаться на бдительность человека. Мы встраиваем механизм самовосстановления для известных, но трудноустранимых проблем. Это тот же принцип, что и в
livenessProbe в Kubernetes: если система нездорова, ее нужно перезапустить, прежде чем бить в колокола.А в вашей команде есть "призрачный" баг? Как вы с ним боретесь: пишете сложные логи, ставите ретраи или просто молитесь?
P.S. Автоматический ретрай — это не починка бага, это костыль. Но лучше автоматический костыль, чем кривые костыли ручных ретраев.
*Гейзенбаг - жаргонный термин, используемый в программировании для описания программной ошибки, которая исчезает или меняет свои свойства при попытке её обнаружения.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👌2🔥1
Мониторинг производительности: от сбора метрик до визуализации
Цель: настроить полноценную систему мониторинга серверной инфраструктуры
Архитектура: Node Exporter + Prometheus + Grafana
Установка Node Exporter
Настройка Prometheus
Дашборды Grafana
Полезные запросы PromQL:
🌐 @helcode
Цель: настроить полноценную систему мониторинга серверной инфраструктуры
Архитектура: Node Exporter + Prometheus + Grafana
Установка Node Exporter
# Скачивание и установка
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xzf node_exporter-*.tar.gz
sudo mv node_exporter-*/node_exporter /usr/local/bin/
# Создание systemd сервиса
sudo cat > /etc/systemd/system/node_exporter.service << EOF
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
EOF
# Запуск
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
Настройка Prometheus
# prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['node1:9100', 'node2:9100']
metrics_path: /metrics
Дашборды Grafana
# Импорт готовых дашбордов
# Node Exporter Full: id 1860
# Kubernetes cluster monitoring: id 315
Полезные запросы PromQL:
# Использование CPU
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# Доступная память
node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100
# Использование диска
100 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100)
🌐 @helcode
👍5❤2🔥1
Сила .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
👍5❤2🔥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 (пробный прогон) и позволяют описывать шаги отката на случай неудачи.Идемпотентность — это "суперсила" автоматизации. Она превращает настройку инфраструктуры из искусства в предсказуемую инженерную дисциплину, где результат не зависит от начального состояния и количества запусков.
P.S. Главный тест на идемпотентность: запустите плейбук дважды подряд. Во второй раз не должно быть изменений (changed=0). Если это так — Вы на правильном пути.
🌐 @helcode
👍5❤2🔥1
Самолечение для Kubernetes: beyond kubectl get pods
В сотый раз получаем алерт, что под упал. В сотый раз вручную делаем
➤ Вариант 1 (Нативные механизмы K8s):
➤ Вариант 2 (Operator Pattern): для сложных stateful приложений (БД, Kafka). Кастомный контроллер (Operator) следит за состоянием и может делать сложные вещи: делать бэкап, ребалансировать партиции*, увеличивать объем хранилища.
➤ Вариант 3 (Скрипт на Bash/Python + CronJob): если нативных механизмов мало. Например, скрипт, который проверяет логи на наличие конкретной ошибки и выполняет кастомную операцию по ее исправлению.
Это воплощение принципа "выбирай исправление, а не оповещение". Мы движемся от мониторинга ("что-то сломалось") к автоматическому реагированию ("я уже пытаюсь это починить"). Это краеугольный камень самоцелительных (self-healing) систем.
* Партиции (или секции) — это отдельные физические или логические части, на которые разбиваются большие наборы данных, например, таблицы в базах данных или разделы в системах обработки данных.
🌐 @helcode
kubectl get pods | grep CrashLoopBackOff - это не диагноз, это крик о помощи. Давайте научим кубер самолечению, чтобы он не просто сообщал о проблеме, а пытался ее исправить.В сотый раз получаем алерт, что под упал. В сотый раз вручную делаем
kubectl delete pod .... Это цифровая "яжемать :)", а не работа инженера. Система должна заботиться о себе сама.➤ Вариант 1 (Нативные механизмы K8s):
livenessProbe и readinessProbe — это основа. Если проба живучести падает, kubelet убивает и пересоздает контейнер.livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
➤ Вариант 2 (Operator Pattern): для сложных stateful приложений (БД, Kafka). Кастомный контроллер (Operator) следит за состоянием и может делать сложные вещи: делать бэкап, ребалансировать партиции*, увеличивать объем хранилища.
➤ Вариант 3 (Скрипт на Bash/Python + CronJob): если нативных механизмов мало. Например, скрипт, который проверяет логи на наличие конкретной ошибки и выполняет кастомную операцию по ее исправлению.
# Пример: поиск и лечение утечки памяти
if kubectl logs my-pod --since=10m | grep -q "OutOfMemoryError"; then
kubectl rollout restart deployment my-app
fi
Это воплощение принципа "выбирай исправление, а не оповещение". Мы движемся от мониторинга ("что-то сломалось") к автоматическому реагированию ("я уже пытаюсь это починить"). Это краеугольный камень самоцелительных (self-healing) систем.
P.S. Идеал — это когда вы спокойно спите, а ваш кластер ночью сам перезапускает поды, рестартит деплоименты и даже делает кофе. Ну, почти.
* Партиции (или секции) — это отдельные физические или логические части, на которые разбиваются большие наборы данных, например, таблицы в базах данных или разделы в системах обработки данных.
🌐 @helcode
👍4❤1🔥1👌1
Сборка самописных утилит на Go. Когда Bash уже мал.
Ваш bash-скрипт для деплоя разросся до 500 строк и стал похож на" Франкенштейна"? Пора переписать его на Go и получить одну бинарку, которую можно кинуть куда угодно.
Bash отлично справляется с маленькими задачами, но когда нужна сложная логика, работа с HTTP API, парсинг сложного JSON — он становится неуклюжим и трудночитаемым.
➤ Простой пример на Go: утилита, которая ходит в API, проверяет статус и шлет уведомление.
➤ Почему Go? Простая компиляция в один бинарный файл, кросс-компиляция, удобная стандартная библиотека (особенно для сетевых задач), нет зависимостей в рантайме.
Речь о выборе правильного инструмента. Bash — для быстрых, тексто-ориентированных задач. Python — для скриптов, где важна скорость разработки и есть много библиотек. Go — для высокопроизводительных, надежных утилит, которые должны работать без проблем в любом окружении.
P.S. Написание утилит на Go — это как собрать своего робота из Лего: удобно, надежно и невероятно приятно, когда он работает.
🌐 @helcode
Ваш bash-скрипт для деплоя разросся до 500 строк и стал похож на" Франкенштейна"? Пора переписать его на Go и получить одну бинарку, которую можно кинуть куда угодно.
Bash отлично справляется с маленькими задачами, но когда нужна сложная логика, работа с HTTP API, парсинг сложного JSON — он становится неуклюжим и трудночитаемым.
➤ Простой пример на Go: утилита, которая ходит в API, проверяет статус и шлет уведомление.
package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
resp, err := http.Get("https://api.status.io/1.0/status/xyz")
if err != nil {
panic(err)
}
defer resp.Body.Close()
var status Status
json.NewDecoder(resp.Body).Decode(&status)
if status.Status != "operational" {
fmt.Println("Сервис лежит!")
os.Exit(1)
}
fmt.Println("Всё ок!")
}
type Status struct {
Status string `json:"status"`
}
➤ Почему Go? Простая компиляция в один бинарный файл, кросс-компиляция, удобная стандартная библиотека (особенно для сетевых задач), нет зависимостей в рантайме.
Речь о выборе правильного инструмента. Bash — для быстрых, тексто-ориентированных задач. Python — для скриптов, где важна скорость разработки и есть много библиотек. Go — для высокопроизводительных, надежных утилит, которые должны работать без проблем в любом окружении.
P.S. Написание утилит на Go — это как собрать своего робота из Лего: удобно, надежно и невероятно приятно, когда он работает.
🌐 @helcode
👍3❤1🔥1👌1
Война с плавающим багом в CI
Ваш CI-пайплайн падает раз в два дня из-за плавающего теста, и все делают вид, что не замечают? Сегодня объявляем ему войну. Не игнорируем, а автоматизируем поимку.
Это классика: "У меня работает", "Heisenbug*", который исчезает при попытке отладки. Команда привыкает к красному статусу и перестает ему доверять, что убивает саму идею CI. Ручной перезапуск — это не решение, это признание поражения.
➤ Вариант 1 (Bash + Cron): Пишем скрипт, который дергает API вашего CI (например, Jenkins/GitLab), проверяет последний запуск падающего джоба и в случае ошибки автоматически перезапускает его, отправляя уведомление в Slack.
➤ Вариант 2 (GitHub Actions): используем
Речь об устойчивости и проактивном мониторинге. Система не должна полагаться на бдительность человека. Мы встраиваем механизм самовосстановления для известных, но трудноустранимых проблем. Это тот же принцип, что и в
*Гейзенбаг - жаргонный термин, используемый в программировании для описания программной ошибки, которая исчезает или меняет свои свойства при попытке её обнаружения.
🌐 @helcode
Ваш CI-пайплайн падает раз в два дня из-за плавающего теста, и все делают вид, что не замечают? Сегодня объявляем ему войну. Не игнорируем, а автоматизируем поимку.
Это классика: "У меня работает", "Heisenbug*", который исчезает при попытке отладки. Команда привыкает к красному статусу и перестает ему доверять, что убивает саму идею CI. Ручной перезапуск — это не решение, это признание поражения.
➤ Вариант 1 (Bash + Cron): Пишем скрипт, который дергает API вашего CI (например, Jenkins/GitLab), проверяет последний запуск падающего джоба и в случае ошибки автоматически перезапускает его, отправляя уведомление в Slack.
# Пример для GitLab CI с использованием jq и curl
PIPELINE_STATUS=$(curl -s --header "PRIVATE-TOKEN: <your_token>" "https://gitlab.com/api/v4/projects/<project_id>/pipelines/latest" | jq -r '.status')
if [ "$PIPELINE_STATUS" = "failed" ]; then
curl --request POST --header "PRIVATE-TOKEN: <your_token>" "https://gitlab.com/api/v4/projects/<project_id>/pipelines/latest/retry"
curl -X POST -H 'Content-type: application/json' --data '{"text":"Плавающий тест снова упал. Автоперезапуск...»"}' $SLACK_WEBHOOK
fi
➤ Вариант 2 (GitHub Actions): используем
schedule и джоб с условием для автоматического перезапуска только конкретного флаки-теста.jobs:
retry_flaky_test:
if: failure() && contains(github.event.head_commit.message, 'retry flaky test')
runs-on: ubuntu-latest
steps:
- name: Retry the flaky test suite
run: |
echo "Автоматический ретрай запущен"
Речь об устойчивости и проактивном мониторинге. Система не должна полагаться на бдительность человека. Мы встраиваем механизм самовосстановления для известных, но трудноустранимых проблем. Это тот же принцип, что и в
livenessProbe в Kubernetes: если система нездорова, ее нужно перезапустить, прежде чем бить тревогу.P.S. Автоматический ретрай — это не починка бага, это костыль. Но лучше автоматический костыль, чем кривые костыли ручных ретраев.
*Гейзенбаг - жаргонный термин, используемый в программировании для описания программной ошибки, которая исчезает или меняет свои свойства при попытке её обнаружения.
🌐 @helcode
👍4❤1👌1