🐌 Когда сервер превратился в калькулятор из 90-х: детективная история

Звонок в 9 утра: “Прод тормозит так, будто работает на картошке!” Симптомы: Nginx отвечает по 5-10 секунд SSH коннект устанавливается минуту Load Average зашкаливает при минимальной нагрузке Первые подозреваемые: DDoS? - Нет, трафик обычный Память забита? - Свободно 80% Диск умирает? - iostat в норме Сеть? - ping до соседних серверов 0.2ms Копаем глубже: cat /proc/cpuinfo | grep "cpu MHz" # cpu MHz : 200.000 # cpu MHz : 200.000 ЧЕГО?! 😱 Процессор работает на 200 MHz вместо 3200! Проверяем режим работы CPU: ...

July 21, 2025

Linux для джунов: Load Average, процессы и память простыми словами

Когда я начинал, меня пугали загадочные цифры в выводе top и htop. Что такое Load Average? Почему свободной памяти почти нет, но система работает? Давайте разберёмся с основами Linux, которые должен знать каждый DevOps. Load Average - пульс вашей системы Что это? $ uptime 14:22:01 up 45 days, 3:14, 2 users, load average: 0.45, 0.67, 0.82 Три цифры - это средняя нагрузка за 1, 5 и 15 минут. Как читать? Load 1.0 = один процесс полностью загружает одно ядро 4 ядра, Load 4.0 = все ядра заняты на 100% 4 ядра, Load 8.0 = 4 процесса работают, 4 ждут в очереди Пример из жизни Представьте кассы в магазине: ...

July 20, 2025

Dive (docker)

Dive: Как я нашел 800MB мусора в Docker образе и уменьшил его на 45% Docker образы имеют свойство незаметно распухать. Сегодня расскажу про инструмент, который помог мне найти почти гигабайт лишних файлов в production образе, и покажу, как использовать Dive для оптимизации ваших контейнеров. История началась с алерта Утро понедельника началось с сообщения от команды платформы: “Ваши образы занимают 40% места в registry. Можете оптимизировать?” Проверяю размеры: docker images | grep my-app my-app latest 3d4f5g6h 2 hours ago 1.82GB my-app v1.2.3 1a2b3c4d 1 week ago 1.79GB my-app v1.2.2 9z8y7x6w 2 weeks ago 1.81GB Node.js приложение весит почти 2GB? Что-то тут не так. ...

July 19, 2025

Полезняшка дня: команды и скрипты, которые экономят время

Короткие команды и однострочники, которые использую каждый день. Без воды - только то, что реально работает. Найти большие файлы # Топ-10 больших файлов find / -type f -exec du -h {} + 2>/dev/null | sort -rh | head -10 # Или через ncdu (нужно установить) ncdu / Быстрый бэкап перед правками # Бэкап с датой в имени cp nginx.conf{,.bak.$(date +%Y%m%d_%H%M%S)} # Результат: nginx.conf.bak.20240724_143022 Мониторинг в реальном времени # Следить за логом и подсвечивать ERROR tail -f /var/log/app.log | grep --color=auto -E "ERROR|$" # Обновляющийся вывод команды watch -n 1 'docker ps' watch -d 'kubectl get pods' # -d подсветит изменения Массовое переименование # Убрать пробелы из имён файлов for f in *\ *; do mv "$f" "${f// /_}"; done # Изменить расширение for f in *.txt; do mv "$f" "${f%.txt}.md"; done Работа с процессами # Найти процесс по части имени pgrep -f "part_of_name" # Убить все процессы пользователя pkill -u username # Дерево процессов ps auxf # или красивее pstree -p Сетевая магия # Кто слушает порт ss -tlnp | grep :80 lsof -i :80 # Проверить доступность порта nc -zv hostname 443 timeout 2 bash -c "</dev/tcp/google.com/443" && echo "Port open" # Простой веб-сервер для тестов python3 -m http.server 8080 Git лайфхаки # Отменить последний коммит (оставить изменения) git reset --soft HEAD~1 # Исправить сообщение последнего коммита git commit --amend # Показать изменения в последнем коммите git show --stat # Удалить все локальные ветки кроме main git branch | grep -v "main" | xargs git branch -D Docker однострочники # Удалить все остановленные контейнеры docker container prune -f # Логи с таймстампами docker logs -t --since 30m container_name # Выполнить команду во всех контейнерах docker ps -q | xargs -I {} docker exec {} df -h # Размер образов и контейнеров docker system df Быстрый анализ логов # Топ IP адресов в access.log awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20 # Количество 4xx и 5xx ошибок awk '$9 ~ /^[45]/ {print $9}' access.log | sort | uniq -c # Запросы медленнее 1 секунды (nginx) awk '$NF > 1' access.log | wc -l Полезные алиасы # Добавить в ~/.bashrc alias ll='ls -alh' alias ..='cd ..' alias ...='cd ../..' alias ports='netstat -tulanp' alias myip='curl -s ifconfig.me' alias serve='python3 -m http.server' # Docker алиасы alias dps='docker ps' alias dpsa='docker ps -a' alias dex='docker exec -it' alias dlog='docker logs -f' # K8s алиасы alias k='kubectl' alias kgp='kubectl get pods' alias kgs='kubectl get svc' alias kdp='kubectl describe pod' Проверка ресурсов # CPU и память топ процессов ps aux --sort=-%cpu | head -10 ps aux --sort=-%mem | head -10 # Использование диска по директориям du -h --max-depth=1 / 2>/dev/null | sort -hr # iostat для дисков iostat -x 1 Работа с текстом # Удалить пустые строки sed '/^$/d' file.txt # Заменить во всех файлах find . -type f -name "*.conf" -exec sed -i 's/old/new/g' {} + # Посчитать строки кода (без пустых) find . -name "*.py" -exec cat {} + | sed '/^$/d' | wc -l Безопасность # Генерация паролей openssl rand -base64 32 # или tr -dc 'A-Za-z0-9!@#$%' < /dev/urandom | head -c 20 # Проверить SSL сертификат echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -dates Дебаг и тестирование # HTTP запрос с заголовками curl -I https://example.com curl -H "Host: example.com" http://localhost # DNS lookup dig +short example.com # Все записи dig example.com ANY # Трассировка системных вызовов strace -e open,read,write -p PID Бонус: полезные функции для .bashrc # Распаковать любой архив extract() { if [ -f $1 ]; then case $1 in *.tar.bz2) tar xjf $1 ;; *.tar.gz) tar xzf $1 ;; *.tar.xz) tar xJf $1 ;; *.bz2) bunzip2 $1 ;; *.rar) unrar x $1 ;; *.gz) gunzip $1 ;; *.tar) tar xf $1 ;; *.tbz2) tar xjf $1 ;; *.tgz) tar xzf $1 ;; *.zip) unzip $1 ;; *.Z) uncompress $1;; *.7z) 7z x $1 ;; *) echo "'$1' cannot be extracted" ;; esac else echo "'$1' is not a valid file" fi } # Создать директорию и перейти в неё mkcd() { mkdir -p "$1" && cd "$1" } Сохраните эти команды - они точно пригодятся! ...

July 18, 2025

Ошибки конфигурации, которые стоили нервов (и как их избежать)

За годы работы накопилась коллекция граблей, на которые наступал я и мои коллеги. Вот топ ошибок конфигурации, которые заставляли тратить часы на дебаг, хотя исправление занимало 30 секунд. 1. Кавычки в переменных окружения Было: # .env файл DATABASE_URL="postgresql://user:pass@localhost/db" API_KEY='super-secret-key' Проблема: Node.js приложение читает переменные вместе с кавычками. База не подключается, API возвращает 401. Решение: # .env файл - БЕЗ кавычек! DATABASE_URL=postgresql://user:pass@localhost/db API_KEY=super-secret-key Урок: В .env файлах кавычки НЕ нужны (если это не Docker Compose). ...

July 16, 2025

Первый пост

🚀 Привет! Добро пожаловать в мой уголок DevOps! Меня зовут Сергей, и я DevOps инженер, который каждый день сталкивается с тем же, с чем и вы: упавшими продами в пятницу вечером, загадочными ошибками в CI/CD, и вечным вопросом “а почему оно работает на моей машине?” Зачем еще один блог о DevOps? Когда я начинал свой путь в DevOps, мне катастрофически не хватало реальных историй из практики. Везде были либо сухие мануалы, либо статьи уровня “как установить Docker” без объяснения, зачем он вообще нужен. А хотелось читать про то, как люди реально работают, какие грабли собирают и как их обходят. ...

July 15, 2025