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

Цель: настроить эффективный мониторинг и отладку приложений в Kubernetes

Проблема: сложность диагностики проблем в распределенной среде

Решение: комплексный подход к мониторингу и отладке

1. Установка Prometheus Stack
# Добавление репозитория и установка
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# Установка kube-prometheus-stack
helm install monitoring prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace \
--set grafana.adminPassword=admin \
--set prometheus.service.type=NodePort \
--set alertmanager.service.type=NodePort


2. Конфигурация мониторинга приложений
# ServiceMonitor для кастомного приложения
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: app-monitor
namespace: default
spec:
selector:
matchLabels:
app: my-app
endpoints:
- port: web
path: /metrics
interval: 30s
relabelings:
- sourceLabels: [__meta_kubernetes_pod_name]
targetLabel: pod
- sourceLabels: [__meta_kubernetes_namespace]
targetLabel: namespace


3. Отладка и диагностика
# Просмотр логов нескольких подов
kubectl logs -f deployment/app --all-containers=true --prefix=true --tail=100

# Отладка проблем с сетью
kubectl run debug-pod --image=nicolaka/netshoot --rm -i --tty -- /bin/bash

# Проверка DNS
nslookup kubernetes.default.svc.cluster.local

# Проверка сетевой связности
curl -v http://app-service:8080/health

# Анализ ресурсов
kubectl top pods --containers
kubectl describe pod app-pod-12345
kubectl get events --sort-by=.lastTimestamp


4. Полезные PromQL запросы
# Использование CPU по неймспейсам
sum(rate(container_cpu_usage_seconds_total{namespace="production"}[5m])) by (pod)

# Использование памяти
container_memory_working_set_bytes{container!="", container!="POD"}

# Rate HTTP ошибок
rate(http_requests_total{status=~"5.."}[5m])

# Latency перцентили
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))


5. Расширенная диагностика
# Pod для отладки с полным доступом
apiVersion: v1
kind: Pod
metadata:
name: debug-pod
spec:
hostNetwork: true
hostPID: true
containers:
- name: debug
image: busybox
command: ["sleep", "3600"]
securityContext:
privileged: true
volumeMounts:
- name: host-root
mountPath: /host
volumes:
- name: host-root
hostPath:
path: /


6. Автоматическое масштабирование
# Horizontal Pod Autoscaler
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 50
periodSeconds: 60


Best Practices:
➤ Настраивать readiness и liveness пробы
➤ Использовать структурированное логирование
➤ Мониторить бизнес-метрики
➤ Настраивать автоматическое масштабирование
➤ Регулярно проводить chaos testing

🌐 @helcode
Как не сжечь репозиторий и остаться в живых?

Случалось ли Вам делать git commit и тут же понимать, что отправили в историю код, который ломает всё? Или закоммитить файл с паролями, который тут же надо спрятать? Паника? Не надо. У Git есть свои «Машина времени» и «Империус».

Вот три спасательных круга:

➤ Отмена последнего коммита (с сохранением изменений в рабочей директории):
git reset --soft HEAD~1


➤ Полная отмена коммита и всех изменений (опасно!):
git reset --hard HEAD~1


➤ Волшебная палочка для удаления одного файла из коммита (например, config.py с паролями):
git reset HEAD~1 config.py  # Вытаскиваем файл из коммита
git restore config.py # Откатываем его в рабочей директории
git commit --amend # Перезаписываем предыдущий коммит


git reset — это не кнопка удаления, а инструмент перемещения указателя HEAD на другой коммит. Флаг --soft оставляет изменения в индексе, --mixed (по умолчанию) — в рабочей директории, а --hard — безжалостно стирает.

git reset --hard — это как «Авада Кедавра» для кода. Произносить с осторожностью.

🌐 @helcode
👍6
Ветка — не дерево, или Как не заблудиться в трех соснах

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

Создаем и переключаемся на ветку для новой фичи:
git checkout -b feature/magic-button

Эквивалент новой модной команды:
git switch -c feature/magic-button

Слияние ветки в main (после ПР):
git switch main
git merge feature/magic-button


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

Название ветки patch-1 говорит о нашей фантазии так же много, как имя «Кот» для кота.

🌐 @helcode
👍31
Страшная сказка на ночь: мердж-конфликт

Вы с коллегой независимо изменили одну и ту же строку в одном файле. Вы оба делаете git merge и... Внезапно Git снимает с себя ответственность и показывает это душераздирающее сообщение: CONFLICT (content). Знакомо?

Вот как выглядит файл в состоянии конфликта:
print("Hello, World!")
<<<<<<< HEAD
print("Новая крутая фича от меня!")
=======
print("Исправление критического бага от коллеги!")
>>>>>>> branch-hotfix

Решение: необходимо вручную выбрать, что оставить, а что удалить, убрав маркеры <<<<<<<, ======= и >>>>>>>.

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

Опишите в комментарии самый эпичный или смешной мердж-конфликт в своей практике. Кто победил: фича или багфикс?


🌐 @helcode
1
Stash: карманная заглушка для беспорядка

На полпути в грязной работе над фичей, а нам срочно нужно переключиться на другую ветку, чтобы пофиксить баг. Делать коммит с сообщением «wip» (work in progress) — моветон. Что делать?

Волшебная команда, которая прячет все незакоммиченные изменения:
git stash

Вернуть спрятанное обратно:
git stash pop

Посмотреть список своих «заначек»:
git stash list

Спрятать изменения, включая неотслеживаемые файлы:
git stash -u


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

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

git stash — это аналог «быстро зашвырнуть все вещи в шкаф, когда звонит домофон и приехала теща». Главное — не забыть потом pop, иначе будем искать свои носки полгода.

🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
5🔥1
.gitignore: искусство прятать концы в воду

Сколько раз Вы видели коммиты с файлами node_modules/, .DS_Store, *.pyc или, не дай бог, .env с продакшн-ключами? Это мусор, который не должен быть в репозитории. Файл .gitignore — наш лучший друг и санитар.

Создаем в корне проекта файл .gitignore и добавляем в него шаблоны:
# Логи и кэш
*.log
.npm/

# Файлы ОС
.DS_Store
Thumbs.db

# Файлы окружения (НЕ КОММИТИТЬ НИКОГДА!)
.env
config.ini

# Зависимости (для Node.js)
node_modules/

# Артефакты сборки (для Python)
__pycache__/
*.pyc


Git проверяет файл .gitignore перед тем, как отслеживать изменения. Если имя файла или папки совпадает с шаблоном внутри — Git делает вид, что этого объекта не существует. Это экономит место, время и нервы.

Поделитесь своим самым ценным или неочевидным правилом в .gitignore! Что такого Вы добавили, о чем другие могут не знать?

Закоммитить node_modules — это как отправить посылку, предварительно наклеив на нее всю пыль и мусор со склада.

🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Rebase vs Merge: холивар, который мы заслужили

Нужно влить свою ветку в main. Два лагеря, две религии. Одни кричат: «Rebase — чистая история!». Другие: «Merge — правдивая история!». Кто прав? Давайте без драки, только хардкор.

Merge (слияние): cоздает коммит с двумя родителями.
git checkout main
git merge feature/branch

История: --o--o--o--m (где m — merge-коммит)

Rebase (перебазирование): перемещает наши коммиты на верхушку main, как будто мы начали работу только что.
git checkout feature/branch
git rebase main

История: --o--o--o--o--o (идеально прямая линия)

➤ Merge сохраняет всю историю разработки, включая факт ветвления. Безопасен для публичных веток.
➤ Rebase переписывает историю, делая ее линейной и чистой. Отлично подходит для локальной чистки перед пулл-реквестом. Опасно использовать на общих ветках.

Ставьте реакцию:

❤️ — за Merge (история должна быть правдой!).

🔥 — за Rebase (чистота и порядок превыше всего!).

Использовать git rebase на общей ветке - это как взять чужой паспорт и начать вклеивать в него новые фотографии.

🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥4
Git Hooks: Твой личный робот-помощник

Хотите, чтобы код автоматически прогонял тесты перед каждым коммитом? Или чтобы линтер проверял стиль? Или чтобы скрипт развертывания сам запускался после пуш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-commit

Git Hooks — это скрипты, которые Git запускает в ответ на определенные события (commit, push, rebase и т.д.). Они выполняются локально и позволяют автоматизировать рутину и внедрить контроль качества.

Какой самый полезный или безумный Git Hook Вы когда-либо использовали или хотели бы использовать? Поделитесь идеями!

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

🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61
Параллельное выполнение задач с xargs

Нужно обработать много файлов или выполнить много команд параллельно?

xargs с параллельным выполнением

# Поиск и удаление старых логов параллельно
find /var/log -name "*.log" -mtime +30 | xargs -P 4 -I {} rm -v {}

# Параллельная загрузка URL из файла
cat urls.txt | xargs -P 8 -I {} curl -O {}

# Массовое конвертирование изображений
find ./images -name "*.jpg" | xargs -P 2 -I {} convert {} -resize 50% resized/{}

# Обработка с пробелами в именах файлов
find . -name "*.txt" -print0 | xargs -0 -P 4 -I {} wc -l {}


Ключевые параметры:
-P N - количество параллельных процессов
-I {} - замена входящих данных
-0 - для работы с именами с пробелами
-n 1 - передавать по одному аргументу

🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👌3👍2
xargs: для тех, кто устал копировать вывод команд

Знакомо: ls | grep .txt показывает файлы, а чтобы удалить их все, приходится либо копировать каждый, либо писать сложную конструкцию? xargs — это мост между stdout одной команды и аргументами другой.

Найдем все .tmp файлы и удалим их одной командой:
find . -name "*.tmp" | xargs rm

Или более безопасный вариант с обработкой пробелов в именах:
find . -name "*.tmp" -print0 | xargs -0 rm


xargs берет поток данных с входа (например, список файлов от find) и превращает его в аргументы для указанной команды (rm). Без xargs команда rm не знала бы, что делать со списком файлов из stdin.

А вы часто используете xargs? Или предпочитаете другие способы (циклы for, -exec в find)?


xargs — это как шеф-повар, который берет ингредиенты (список файлов) и готовит из них блюдо (выполняет команду). Без него пришлось бы все делать вручную.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
xargs -I: Когда нужно подставить аргумент именно В ТО САМОЕ МЕСТО

А что если команда ожидает аргумент не в конце, а в середине? Например, нужно переименовать файлы или выполнить сложную операцию? Обычный xargs не справится — тут нужен флаг -I.

Допустим, хотим создать бэкапы всех .py файлов:
find . -name "*.py" | xargs -I {} cp {} {}.backup

Или переименовать файлы, добавив префикс:
ls *.txt | xargs -I FILE mv FILE PREFIX_FILE


Флаг -I позволяет задать placeholder (обычно {}), который будет заменен на каждый элемент входа. Это дает полный контроль над тем, куда подставляются аргументы в команде.

Попробуйте сами! Создайте тестовые файлы и переименуйте их с помощью xargs -I. Какой placeholder Вы используете?
1. {} — классика
2. FILE — для ясности
3. Что-то свое — напишите в комментах!


xargs -I {} — это как заказать бургер "все кроме котлеты" — полный контроль над тем, что и куда попадает.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🤔1
xargs + parallel: скорость света для массовых операций

Нужно обработать 1000 файлов, но делать это последовательно — слишком долго? xargs может запускать процессы параллельно, используя все ядра процессора!

Скачаем несколько URL параллельно (4 процесса одновременно):
cat urls.txt | xargs -n 1 -P 4 wget


Или обработаем изображения параллельно:
find . -name "*.jpg" | xargs -n 1 -P 8 convert -resize 50%


- -P N — запускает N процессов параллельно
- -n 1 — передает по одному аргументу каждому процессу
Это превращает линейную обработку в конвейерную, ускоряя работу в разы!

А вы используете параллельное выполнение? Поделитесь своими кейсами!

Параллельный xargs — это как нанять бригаду рабочих вместо одного. Главное — не переборщить, а то устроите DDoS самому себе!


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81🔥1
xargs в бою: реальные сценарии из жизни DevOps

Теория — это хорошо, но давайте посмотрим, как xargs спасает в реальных рабочих ситуациях. От массового деплоя до экстренного фикса проблем.

Сценарий 1: массовый деплой на несколько серверов
cat servers.txt | xargs -I SERVER ssh SERVER "cd /app && git pull && systemctl restart myapp"


Сценарий 2: поиск и убийство заблокированных процессов
ps aux | grep "zombie_process" | awk '{print $2}' | xargs kill -9


Сценарий 3: пакетное обновление Docker контейнеров
docker ps -aq | xargs docker stop
docker ps -aq | xargs docker rm


Сила xargs в комбинации с другими утилитами: find, grep, awk, docker. Он становится клеем, который связывает отдельные команды в мощные автоматизированные пайплайны.

Поделитесь своим самым крутым или неочевидным использованием xargs! Какой пайплайн с xargs вы считаете своим козырем?

xargs в руках опытного инженера — это как швейцарский нож: может и консервную банку открыть, и палатку поставить, и даже починить машину в крайнем случае. 🔧


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍61
Пароли — не главное? Почему двухфакторка важнее сложного пароля

Ставим 20-символьный пароль с иероглифами, но все равно попадаем на фишинговый сайт. Реальность: пароль — самый уязвимый фактор аутентификации. Пора поговорить про 2FA.

Пример настройки 2FA в командной строке Linux (для SSH):
# Устанавливаем Google Authenticator PAM
sudo apt install libpam-google-authenticator

# Настраиваем для пользователя
google-authenticator

Ответь (y - yes):
➤ y — использовать time-based tokens
➤ y — обновлять конфиг
➤ y — разрешить только одно использование кода
➤ y — разрешить 3 попытки за 30 секунд

2FA (Two-Factor Authentication) — это «что-то, что Вы знаете» (пароль) + «что-то, что у Вас есть» (телефон/токен). Даже если украдут пароль, без второго фактора злоумышленник не войдет.

А какой 2FA вы используете?

P.S. Если интересна тема ИБ - сообщайте в комментарии, раскрою всё подробнее!


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73🤔1
Шифрование дисков: что будет, если ноутбук украдут в аэропорту?

Представим: Вы работали в кафе, отошли на 5 минут, а ноутбука нет. Без шифрования злоумышленник за 10 минут получит все Ваши данные, пароли и доступ к корпоративной сети.

BitLocker (Windows):
# Проверить статус BitLocker
Manage-bde -status C:

# Включить шифрование
Manage-bde -on C: -RecoveryPassword "Добавить_сюда_ключ"


VeraCrypt (кроссплатформенный аналог):
# Создание зашифрованного контейнера
veracrypt -t -c


Полное шифрование диска преобразует все данные в нечитаемый формат без ключа дешифрования. Даже при физическом доступе к диску данные защищены.

А вы шифруете свои диски? Поделитесь опытом!

Шифрование диска — это как хранить драгоценности в сейфе, а не под подушкой. Вору будет проще унести весь сейф, чем открыть его.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
2🤝1🫡1
PowerShell vs CMD: пора переезжать?

Все еще пишете батники? PowerShell — это не просто замена CMD, а полноценная среда автоматизации с доступом ко всей мощи .NET.

CMD (ограниченно):
dir | find "txt"


PowerShell:
# Найти файлы и отсортировать по размеру
Get-ChildItem -Filter "*.txt" | Sort-Object Length -Descending

# Работа с объектами, а не текстом
Get-Process | Where-Object { $_.CPU -gt 100 }


PowerShell работает с объектами .NET, а не с текстом как CMD. Это дает невероятную гибкость: можно фильтровать, сортировать, группировать данные на лету.

А вы уже перешли на PowerShell? Что стало главным открытием?

Переход с CMD на PowerShell — как пересаживаться с велосипеда на спортивный автомобиль. Оба едут, но с разной скоростью и комфортом.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Автоматизация рутины: планировщик задач на стероидах

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

Создание задачи через PowerShell:
$Action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\scripts\backup.ps1"
$Trigger = New-ScheduledTaskTrigger -Daily -At "02:00"
Register-ScheduledTask -TaskName "NightlyBackup" -Action $Action -Trigger $Trigger -Description "Automated nightly backup"


Ежедневный бэкап (backup.ps1):
Copy-Item "C:\ImportantData" "D:\Backups\Data_$(Get-Date -Format 'yyyyMMdd')" -Recurse


Планировщик задач Windows — это cron для бедных? Нет, это мощный инструмент, который может запускать задачи по событиям, расписанию, при простое системы.

Какую рутину вы автоматизировали через Планировщик? Поделитесь самыми полезными сценариями!

Планировщик задач — это личный ассистент, который работает 24/7 без отпуска и больничных. Главное — правильно поставить ему задачи.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥32😁1🥴1
Windows Subsystem for Linux: лучшее из двух миров

Нужны утилиты Linux, но переустанавливать ОС не хочется? WSL2 позволяет запускать настоящий Linux внутри Windows без виртуализации.

Установка WSL:
# Одна команда для установки
wsl --install

# Или конкретный дистрибутив
wsl --install -d Ubuntu


Пример автоматизации:
# В WSL: мониторинг файлов Windows
inotifywait -m /mnt/c/Users/MyUser/Downloads | while read path action file; do
echo "New file: $file"
# Автоматическая обработка загруженных файлов
done


WSL2 — это не эмулятор, а полноценное ядро Linux, работающее параллельно с Windows. Можно запускать любые Linux-утилиты и даже Docker.

А вы используете WSL? Для каких задач он незаменим?

WSL — это как иметь секретную комнату с Linux, куда можно сбежать из Windows, когда нужен grep или ssh.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣43
Автогенерация отчетов: PowerShell + Excel

Каждую неделю тратите часы на сбор одинаковых отчетов? PowerShell может автоматически собирать данные и выгружать в красивый Excel-файл.

Пример:
# Создание Excel через COM объект
$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
$workbook = $excel.Workbooks.Add()
$worksheet = $workbook.Worksheets.Item(1)

# Заполнение данными о системе
$worksheet.Cells.Item(1,1) = "Computer Name"
$worksheet.Cells.Item(1,2) = $env:COMPUTERNAME

$worksheet.Cells.Item(2,1) = "Disk Space"
$disks = Get-WmiObject Win32_LogicalDisk
$row = 2
foreach ($disk in $disks) {
$worksheet.Cells.Item($row,1) = $disk.DeviceID
$worksheet.Cells.Item($row,2) = "{0:N2} GB" -f ($disk.FreeSpace/1GB)
$row++
}

# Сохранение
$workbook.SaveAs("C:\Reports\SystemReport_$(Get-Date -Format 'yyyyMMdd').xlsx")
$excel.Quit()


Через COM-объекты PowerShell может управлять любыми приложениями Windows: Excel, Word, Outlook. Это открывает безграничные возможности для автоматизации отчетности.

А вы автоматизируете создание отчетов? Какие данные чаще всего нужно собирать?

PowerShell + Excel — это как нанять стажера, который идеально оформляет таблицы и никогда не ошибается. Только без зарплаты и с гарантией результата.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
3
Мониторинг без бюджета: своя система на PowerShell

Нет денег на дорогие системы мониторинга? Можно создать свою за несколько часов на PowerShell с уведомлениями в Telegram.

# Мониторинг свободного места на диске
function Check-DiskSpace {
$disks = Get-WmiObject Win32_LogicalDisk -Filter "DriveType=3"
foreach ($disk in $disks) {
$freePercent = ($disk.FreeSpace / $disk.Size) * 100
if ($freePercent -lt 10) {
Send-TelegramAlert "⚠️ LOW DISK SPACE: $($disk.DeviceID) - $freePercent% free"
}
}
}

# Отправка в Telegram
function Send-TelegramAlert {
param($Message)
$token = "YOUR_BOT_TOKEN"
$chatId = "YOUR_CHAT_ID"
$url = "https://api.telegram.org/bot$token/sendMessage"

Invoke-RestMethod -Uri $url -Method Post -Body @{
chat_id = $chatId
text = $Message
} | Out-Null
}

# Бесконечный цикл проверки
while ($true) {
Check-DiskSpace
Start-Sleep -Seconds 300 # Проверка каждые 5 минут
}


С помощью PowerShell можно мониторить: место на дисках, загрузку CPU, память, сервисы, логи событий. А через REST API отправлять уведомления куда угодно.

Что бы вы добавили в самодельную систему мониторинга? Делитесь идеями!

Самодельный мониторинг на PowerShell — это как собрать сигнализацию из детского конструктора. Работает неидеально, но зато бесплатно и точно знаешь, как починить.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
12🔥2👎1🤔1