Helcode | Хелкод | Скрипты и автоматизация
993 subscribers
52 photos
34 links
☎️ Контакты для связи: @helcodeadm
Download Telegram
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
Война с плавающим багом в CI

Ваш 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
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1
Один скрипт для владения всем. Поднимаем окружение за 60 секунд.

Тратите час на подготовку тестового окружения для нового разработчика? Или для себя на чистой машине? Пора это автоматизировать одним скриптом. "It works on my machine" должно умереть.

README.md с пунктами "установи это, сконфигурируй то, выполни вон ту команду" — это источник ошибок и потеря времени. Расхождение в версиях, пропущенные переменные окружения, забытые миграции БД.

➤ Вариант 1 (Vagrant + Shell): классика жанра. Vagrantfile описывает виртуальную машину, а вложенный shell-скрипт делает всю грязную работу.
➤ Вариант 2 (Docker Compose): идеально для микросервисных и изолированных окружений. Один файл docker-compose.yml поднимает БД, кеш, брокер сообщений и ваше приложение.
version: '3.8'
services:
db:
image: postgres:14
environment:
POSTGRES_DB: myapp
cache:
image: redis:alpine
app:
build: .
depends_on:
- db
- cache


➤ Вариант 3 (Ansible Playbook): удобно для физических серверов и тонкой настройки. Ansible тащит за собой философию идемпотентности.
- name: Set up development environment
hosts: localhost
tasks:
- name: Ensure Node.js is installed
package:
name: nodejs
state: present


Это декларативный подход в миниатюре. Вы описываете *желаемое состояние* окружения (софт, версии, конфиги), а инструмент приводит систему к этому состоянию. Больше никаких "мануалов". Этот же принцип масштабируется до Terraform для облаков и Kubernetes для оркестрации.

А вы как поднимаете дев-окружение? Старый добрый Vagrant, модный DevContainer, или может вообще Nix? Поделитесь своими кейсами.

P.S. Потратьте 4 часа на написание скрипта, который сэкономит 100 часов вашей команды. Математика простая.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍41
Самолечение для Kubernetes: Beyond `kubectl get pods`

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) систем.

А ваши поды умеют лечить себя сами? Используете только `livenessProbe` или пишете кастомные операторы? Давайте обсудим, какие сценарии самолечения самые крутые.

P.P.S. Идеал — это когда вы спокойно спите, а ваш кластер ночью сам перезапускает поды, рестартит деплоименты и даже делает кофе. Ну, почти.


*Партиции (или секции) — это отдельные физические или логические части, на которые разбиваются большие наборы данных, например, таблицы в базах данных или разделы в системах обработки данных.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
1🔥1
Идемпотентность: cкрипт не должно быть больно запустить дважды.

Боитесь запустить скрипт развертывания во второй раз? Он создаст дубликаты файлов, перезапишет конфиги и сломает всё? Поздравляю, ваш скрипт не идемпотентен. Сегодня учимся писать скрипты, которые безопасно запускать сколько угодно раз.

"Скрипт сработал, но я не уверен... Запустить еще раз на всякий случай? Ой, а теперь всё сломалось". Знакомо? Это следствие императивного подхода без проверок.

➤ Вариант 1 (Bash): проверяем существование файла, директории, запущенного процесса.
# Вместо простого touch
if [ ! -f "/etc/config.yaml" ]; then
touch /etc/config.yaml
cp default_config.yaml /etc/config.yaml
fi


➤ Вариант 2 (Ansible): вся философия Ansible построена на идемпотентности. Каждая таска сама проверяет, нужно ли что-то менять.
- name: Ensure user "deploy" exists
user:
name: deploy
state: present
groups: sudo
# Запускайте хоть 1000 раз — пользователь будет создан только один раз.


➤ Вариант 3 (Terraform): terraform apply вычисляет разницу между желаемым и текущим состоянием и применяет только необходимые изменения. Это апофеоз декларативной идемпотентности.

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

А ваши скрипты идемпотентны? Как вы этого добиваетесь? if-проверки, флаги --force, или доверяете только декларативным инструментам?

P.S. Идемпотентный скрипт — это как вежливый человек: сколько раз ни спроси, ответит одинаково и не разозлится.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6💯1
Скрипт-помощник для Git. Автоматизируем рутину.

Ваш ежедневный ритуал: git add ., git commit -m "fix", git push, git checkout dev, git pull, git merge feature/...... Пора делегировать это роботу.

Однообразные последовательности Git-команд — это идеальный кандидат для автоматизации. Они отнимают время, и в них легко ошибиться, сделав git push --force не в ту ветку.

➤ Вариант 1 (Git Aliases): просто и эффективно прямо в .gitconfig.
[alias]
co = checkout
cm = commit -m
br = branch
lol = log --oneline --graph --all
publish = !git push -u origin $(git branch --show-current)


➤ Вариант 2 (Bash/Zsh Functions): для более сложной логики.
# Поместить в ~/.bashrc или ~/.zshrc
gup() {
git add . && git commit -m "$1" && git push
}
# Использование: `gup "мой коммит"`


➤ Вариант 3 (Node.js / Python-скрипт): для комплексных операций, например, создания Pull Request. Используем GitHub CLI (gh).
// Использование: node pr.js "My feature"
const { execSync } = require('child_process');
const title = process.argv[2] || 'Default title';
execSync(`gh pr create --title "${title}" --body "" --base dev`, { stdio: 'inherit' });


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

А какие у вас есть самые полезные гитовые алиасы или скрипты? Поделитесь своими "магическими заклинаниями" в комментах!

🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
Мониторинг, который пишет сам себя. Парсим логи с jq.

Вам нужна сводка по ошибкам из логов, но влезать в Kibana/Splunk лень? Научимся за 5 минут и 3 команды в терминале получать готовые отчеты.

Логи есть, но информация похоронена под горой JSON-объектов. Ручной поиск и агрегация занимают время. Нужен быстрый способ отвечать на вопросы: "Какая самая частая ошибка за последний час?", "Сколько пользователей получили 500-ю ошибку?".

➤ Вариант 1 (Классика Bash): grep, awk, sort, uniq.
# Топ-5 самых частых ошибок
grep "ERROR" app.log | awk '{print $4}' | sort | uniq -c | sort -nr | head -5


➤ Вариант 2 (удобство jq): если логи в JSON — вы обязаны знать jq.
# Считаем 500-е ошибки по уникальным пользователям
cat nginx.log | jq -r 'select(.status == 500) | .user_id' | sort | uniq | wc -l

# Группируем ошибки по типу и считаем
cat app.log | jq -s 'group_by(.error_type) | map({type: .[0].error_type, count: length}) | sort_by(-.count)'


➤ Вариант 3 (Python-скрипт): для максимальной гибкости.
import json
from collections import Counter
errors = []
with open('app.log') as f:
for line in f:
log = json.loads(line)
if log['level'] == 'ERROR':
errors.append(log['error_type'])
print(Counter(errors).most_common(5))


Речь о событийной агрегации. Мы превращаем поток сырых событий (логов) в структурированные данные, пригодные для анализа. jq — это декларативный язык запросов для JSON, такой же мощный, как SQL для баз данных. Вы описываете, *что* хотите получить, а не *как* это искать.

А как вы быстро анализируете логи без тяжеловесных систем? Дружите с jq, или предпочитаете awk/grep? Покажите свои самые крутые команды для парсинга!

P.S. Умение быстро вытащить нужную цифру из кучи JSON — это суперспособность, которая делает вас героем митапа.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
4
"У меня работает" — убиваем фразу навсегда. Контейнеризация.

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

Разработчик работает на Mac с Node.js 18, продакшен на Ubuntu с Node.js 16. Результат — непредсказуемое поведение. Разные версии библиотек, разные системные настройки. Хаос.

➤ Вариант 1 (Простой Dockerfile): базовый сценарий для Node.js-приложения.
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
CMD ["node", "server.js"]


➤ Вариант 2 (Мультистейдж-билд): для уменьшения размера образа и повышения безопасности.
# Стадия сборки
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm run build

# Стадия продакшена
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html


➤ Вариант 3 (Docker Compose для полноценного стека): сразу описываем приложение и все его зависимости (БД, кеш).

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

А вы уже похоронили "у меня работает"? Используете "толстые" образы (ubuntu) или "тощие" (alpine, distroless)? Спорите на тему Dockerfile best practices?

P.S. После этого единственное, что "работает у вас", — это сам Docker. И это гораздо проще починить.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Автоматический деплой по тэгу. Release и забыл.

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

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

Вариант 1 (GitHub Actions): триггер на push с тэгом.
on:
push:
tags:
- 'v*'
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Deploy to production
run: |
./deploy-prod.sh


➤ Вариант 2 (GitLab CI): аналогично, используем правила.
deploy_prod:
script:
- scp ./app.tar.gz user@prod-server:/app/
- ssh user@prod-server "tar -xzf /app/app.tar.gz -C /app/"
only:
- tags
except:
- branches


➤ Вариант 3 (Скрипт на Bash): локальный хук, который при пуше тэга запускает деплой.
# В .git/hooks/post-push (примерно)
if [[ $1 == *"refs/tags/v"* ]]; then
echo "Запуск деплоя для тэга ${1##*/}..."
ssh deploy@server "cd /app && ./update.sh ${1##*/}"
fi


Это событийно-ориентированная архитектура* в CI/CD. Событие "появился новый тэг" автоматически запускает цепочку действий (пайплайн). Вам не нужно "нажимать на кнопку", система реагирует на изменения состояния сама. Это уменьшает время между готовностью кода и его доставкой.

А как у вас настроен деплой? Ручной кнопочный, автоматический по тэгу, или хитрый канарейка-деплой?

P.S. Идеальный релиз — это когда вы закоммитили тэг, пошли пить кофе, а система все сделала за вас. И не сломала.


*Архитектура, управляемая событиями (англ. event-driven architecture, EDA) является шаблоном архитектуры программного обеспечения, позволяющим создание, определение, потребление и реакцию на события (ссылка на Википедию, для интересующихся).


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2
Скрипт-уборщик: Освобождаем место на диске.

Ваш диск забит образами Docker, логами, старыми билдами. df -h вызывает панику. Пора написать скрипт-дворника, который будет делать уборку за вас.

Вручную чистить /tmp, docker system prune, удалять старые билды — скучно и легко забыть. Место заканчивается в самый неподходящий момент.

➤ Вариант 1 (Bash-скрипт + Cron):
#!/bin/bash
echo "Начинается уборка..."
docker system prune -f
find /var/log -name "*.log" -type f -mtime +7 -delete
find /tmp -type f -atime +1 -delete
echo "Уборка завершена. Свободно: $(df -h / | awk 'NR==2 {print $4}')"


➤ Вариант 2 (Ansible для множества серверов): плейбук, который запускает "уборку" на всех ваших серверах раз в неделю.
- name: Clean up old logs
hosts: all
tasks:
- name: Remove log files older than 30 days
file:
path: "/var/log/{{ item }}"
state: absent
loop:
- "*.log.1"
- "*.gz"


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

А что чистите вы? Docker, кеш пакетных менеджеров (npm, pip), старые бэкапы? Давайте составим список самых "мусорных" директорий в IT-мире.

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


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52
Декларативные конфиги: Ваша инфраструктура — это код.

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

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

➤ Вариант 1 (Terraform): описываем облачные ресурсы (VM, сети, БД) как код.
resource "aws_instance" "web" {
ami = "ami-123456"
instance_type = "t3.micro"
tags = {
Name = "HelloWorld"
}
}


➤ Вариант 2 (Ansible): описываем конфигурацию серверов (софт, файлы, службы).
- name: Install and start Nginx
hosts: webservers
tasks:
- name: Install nginx
package: name=nginx state=present
- name: Start nginx
systemd: name=nginx state=started enabled=yes


Декларативный подход. Вы говорите системе *ЧТО* вы хотите получить ("сервер с Nginx"), а не *КАК* это сделать ("залогинься по SSH, выполни apt update, потом..."). Это дает предсказуемость, версионность (конфиги в Git) и позволяет практиковать "phoenix deployments" — когда серверы не лечатся, а убиваются и создаются заново.

А ваша инфраструктура — это код? Используете Terraform, Pulumi, Ansible? Или все еще рисуете диаграмки вручную в облачной консоли?

P.S. Научившись описывать инфраструктуру кодом, вы будете с ужасом вспоминать, как раньше жили. Это точка невозврата.


🌐 @helcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51