Ищем самые активные IP в access.log!
Нужно быстро понять, кто сильнее всего нагружает Nginx? Соберём короткую консольную задачу: вытащим IP из access.log, посчитаем количество запросов и покажем топ самых активных клиентов.
В этой задаче:
Такой приём помогает быстро провести первичный аудит без тяжёлых систем мониторинга и дополнительных зависимостей.
➡️ DevOps Ready | #задача
Нужно быстро понять, кто сильнее всего нагружает Nginx? Соберём короткую консольную задачу: вытащим IP из access.log, посчитаем количество запросов и покажем топ самых активных клиентов.
В этой задаче:
• Проверяем доступность лог-файла;
• Достаём IP из первой колонки;
• Считаем частоту и сортируем результат.
Такой приём помогает быстро провести первичный аудит без тяжёлых систем мониторинга и дополнительных зависимостей.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤4🔥3
Почему временные файлы лучше создавать через mktemp?
В shell-скриптах часто нужен временный файл: сохранить вывод, собрать промежуточный конфиг или передать данные другой команде.
Плохой вариант выглядит так:
Проблема в том, что такое имя может уже существовать. В худшем случае скрипт перезапишет чужой файл или начнёт работать с тем, что создал другой процесс.
Чуть лучше, но всё ещё не идеально:
$$ добавляет PID процесса, но это не полноценная защита от гонок и предсказуемых имён.
Нормальный способ — mktemp:
Команда создаёт уникальный файл и сразу возвращает путь к нему:
А чтобы временный файл точно удалился при выходе из скрипта, добавляют trap:
mktemp убирает риск конфликтов имён и делает временные файлы безопаснее. Для скриптов это маленькая привычка, которая спасает от очень неприятных багов.
➡️ DevOps Ready | #совет
В shell-скриптах часто нужен временный файл: сохранить вывод, собрать промежуточный конфиг или передать данные другой команде.
Плохой вариант выглядит так:
tmp="/tmp/app.log"
echo "data" > "$tmp"
Проблема в том, что такое имя может уже существовать. В худшем случае скрипт перезапишет чужой файл или начнёт работать с тем, что создал другой процесс.
Чуть лучше, но всё ещё не идеально:
tmp="/tmp/app-$$.log"
$$ добавляет PID процесса, но это не полноценная защита от гонок и предсказуемых имён.
Нормальный способ — mktemp:
tmp="$(mktemp)"
Команда создаёт уникальный файл и сразу возвращает путь к нему:
echo "data" > "$tmp"
cat "$tmp"
А чтобы временный файл точно удалился при выходе из скрипта, добавляют trap:
tmp="$(mktemp)"
trap 'rm -f "$tmp"' EXIT
mktemp убирает риск конфликтов имён и делает временные файлы безопаснее. Для скриптов это маленькая привычка, которая спасает от очень неприятных багов.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤5🔥4
Шпаргалка по Linux Performance Observability Tools!
Например, top и vmstat помогают быстро посмотреть нагрузку на CPU и память, iostat и iotop понять проблемы с диском, а tcpdump и ss проверит сетевую активность.
На картинке карта инструментов наблюдаемости Linux по слоям системы: приложения, системные библиотеки, syscalls, VFS, файловые системы, сеть, scheduler, CPU, DRAM, диски и устройства.
Сохрани, чтобы не потерять!
➡️ DevOps Ready | #ресурс
Например, top и vmstat помогают быстро посмотреть нагрузку на CPU и память, iostat и iotop понять проблемы с диском, а tcpdump и ss проверит сетевую активность.
На картинке карта инструментов наблюдаемости Linux по слоям системы: приложения, системные библиотеки, syscalls, VFS, файловые системы, сеть, scheduler, CPU, DRAM, диски и устройства.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍4🔥4
Находим и чистим старые Docker-образы!
Со временем на сервере Docker может накопить много старых образов: после деплоев, тестовых сборок, CI/CD-прогонов и ручных экспериментов. Они занимают место, хотя контейнеры уже давно используют другие версии.
Сначала смотрим, сколько места занимает Docker:
Так можно быстро понять, что именно разрослось: images, containers, volumes или build cache.
Посмотрим список образов вместе с датой создания:
Если нужно найти dangling-образы, которые не имеют тега, используем фильтр:
Обычно такие образы остаются после пересборок, когда старый слой уже не привязан к имени и тегу.
Перед удалением лучше сделать безопасный dry-run через список ID:
Если список выглядит ожидаемо, удаляем их:
Для более агрессивной очистки можно удалить все неиспользуемые образы:
Но тут важно помнить: будут удалены не только
Если нужно ограничить очистку по времени, добавляем фильтр:
Так Docker удалит неиспользуемые образы старше 7 дней.
После очистки снова проверяем место:
Такая практика помогает держать Docker-хост в порядке и не ловить внезапное “no space left on device” во время деплоя.
➡️ DevOps Ready | #практика
Со временем на сервере Docker может накопить много старых образов: после деплоев, тестовых сборок, CI/CD-прогонов и ручных экспериментов. Они занимают место, хотя контейнеры уже давно используют другие версии.
Сначала смотрим, сколько места занимает Docker:
docker system df
Так можно быстро понять, что именно разрослось: images, containers, volumes или build cache.
Посмотрим список образов вместе с датой создания:
docker images --format \
"{{.Repository}}\t{{.Tag}}\t{{.ID}}\t{{.CreatedSince}}\t{{.Size}}"
Если нужно найти dangling-образы, которые не имеют тега, используем фильтр:
docker images -f dangling=true
Обычно такие образы остаются после пересборок, когда старый слой уже не привязан к имени и тегу.
Перед удалением лучше сделать безопасный dry-run через список ID:
docker images -f dangling=true -q
Если список выглядит ожидаемо, удаляем их:
docker image prune
Для более агрессивной очистки можно удалить все неиспользуемые образы:
docker image prune -a
Но тут важно помнить: будут удалены не только
<none>, а все образы, которые сейчас не используются контейнерами.Если нужно ограничить очистку по времени, добавляем фильтр:
docker image prune -a \
--filter "until=168h"
Так Docker удалит неиспользуемые образы старше 7 дней.
После очистки снова проверяем место:
docker system df
Такая практика помогает держать Docker-хост в порядке и не ловить внезапное “no space left on device” во время деплоя.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍4🔥2
Media is too big
VIEW IN TELEGRAM
iximiuz Labs практический DevOps-полигон прямо в браузере!
На сайте можно тренироваться на реальных Linux-серверах, Docker-хостах и Kubernetes-кластерах без локальной установки и долгой настройки окружения. Внутри есть playgrounds, guided labs, challenges, learning paths по Linux, Docker, Kubernetes и networking, плюс возможность подключаться через браузер или SSH. Это хороший ресурс, если хочется не просто читать про DevOps, а руками ломать, чинить, запускать контейнеры, проверять команды и разбираться с инфраструктурой в живой среде.
Оставляю ссылочку: iximiuz Labs
➡️ DevOps Ready | #ресурс
На сайте можно тренироваться на реальных Linux-серверах, Docker-хостах и Kubernetes-кластерах без локальной установки и долгой настройки окружения. Внутри есть playgrounds, guided labs, challenges, learning paths по Linux, Docker, Kubernetes и networking, плюс возможность подключаться через браузер или SSH. Это хороший ресурс, если хочется не просто читать про DevOps, а руками ломать, чинить, запускать контейнеры, проверять команды и разбираться с инфраструктурой в живой среде.
Оставляю ссылочку: iximiuz Labs
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍6🔥4
Почему переменные окружения лучше не подставлять без кавычек?
В shell-скриптах часто используют переменные в командах:
На вид обычная строка, но без кавычек shell сначала выполнит word splitting и glob expansion. Если в переменной есть пробелы, значение превратится в несколько аргументов.
Например:
Вывод будет не одним путём, а двумя словами:
Правильный вариант почти всегда брать переменную в кавычки:
Теперь значение передаётся как один аргумент:
То же самое касается путей, имён файлов, URL и пользовательского ввода:
Есть редкие случаи, когда разбиение по словам нужно специально, но в обычных скриптах это скорее исключение.
Для списков лучше использовать массивы:
В shell кавычки вокруг переменных это не косметика. Они защищают скрипт от пробелов, спецсимволов и случайного выполнения команды не с теми аргументами.
➡️ DevOps Ready | #практика
В shell-скриптах часто используют переменные в командах:
rm -rf $TARGET
На вид обычная строка, но без кавычек shell сначала выполнит word splitting и glob expansion. Если в переменной есть пробелы, значение превратится в несколько аргументов.
Например:
TARGET="/tmp/app cache"
printf '<%s>\n' $TARGET
Вывод будет не одним путём, а двумя словами:
</tmp/app>
<cache>
Правильный вариант почти всегда брать переменную в кавычки:
printf '<%s>\n' "$TARGET"
Теперь значение передаётся как один аргумент:
</tmp/app cache>
То же самое касается путей, имён файлов, URL и пользовательского ввода:
cp "$SOURCE" "$DEST"
grep "$PATTERN" "$LOG_FILE"
mkdir -p "$APP_DIR"
Есть редкие случаи, когда разбиение по словам нужно специально, но в обычных скриптах это скорее исключение.
Для списков лучше использовать массивы:
files=("app log.txt" "error log.txt")
printf '%s\n' "${files[@]}"В shell кавычки вокруг переменных это не косметика. Они защищают скрипт от пробелов, спецсимволов и случайного выполнения команды не с теми аргументами.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤4🔥2
Шпаргалка по GitHub Actions!
Например, on задаёт событие запуска workflow, jobs описывает набор задач, а runs-on выбирает окружение, где будет выполняться job.
На картинке базовый синтаксис GitHub Actions: структура workflow-файла, события push и pull_request, ветки и теги, jobs, needs, runs-on, env-переменные, secrets и пример YAML-конфига.
Сохрани, чтобы не потерять!
➡️ DevOps Ready | #ресурс
Например, on задаёт событие запуска workflow, jobs описывает набор задач, а runs-on выбирает окружение, где будет выполняться job.
На картинке базовый синтаксис GitHub Actions: структура workflow-файла, события push и pull_request, ветки и теги, jobs, needs, runs-on, env-переменные, secrets и пример YAML-конфига.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍4🔥4
Настраиваем простой healthcheck для Docker-контейнера!
Контейнер может быть запущен, но приложение внутри него уже не отвечает. Поэтому одного docker ps часто недостаточно: нужен healthcheck, который будет регулярно проверять состояние сервиса.
Представим простой HTTP-сервис, который отвечает на /health:
Если команда возвращает код 0, контейнер считается здоровым. Если команда падает несколько раз подряд, Docker помечает контейнер как unhealthy.
В Dockerfile можно добавить HEALTHCHECK:
Параметры задают частоту проверки, максимальное время ожидания и число неудачных попыток.
Соберём образ:
Запустим контейнер:
Теперь статус будет виден прямо в списке контейнеров:
В выводе можно увидеть состояние:
Если нужно посмотреть healthcheck подробнее, используем inspect:
А чтобы вывести только текущий статус:
Ожидаемый результат:
Healthcheck особенно полезен в связке с оркестраторами и deploy-скриптами, можно отличать “процесс запущен” от “приложение реально готово принимать запросы”.
➡️ DevOps Ready | #практика
Контейнер может быть запущен, но приложение внутри него уже не отвечает. Поэтому одного docker ps часто недостаточно: нужен healthcheck, который будет регулярно проверять состояние сервиса.
Представим простой HTTP-сервис, который отвечает на /health:
curl -f http://localhost:8080/health
Если команда возвращает код 0, контейнер считается здоровым. Если команда падает несколько раз подряд, Docker помечает контейнер как unhealthy.
В Dockerfile можно добавить HEALTHCHECK:
HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
Параметры задают частоту проверки, максимальное время ожидания и число неудачных попыток.
Соберём образ:
docker build -t app-with-health .
Запустим контейнер:
docker run -d --name app app-with-health
Теперь статус будет виден прямо в списке контейнеров:
docker ps
В выводе можно увидеть состояние:
Up 2 minutes (healthy)
Если нужно посмотреть healthcheck подробнее, используем inspect:
docker inspect --format '{{json .State.Health}}' appА чтобы вывести только текущий статус:
docker inspect --format '{{.State.Health.Status}}' appОжидаемый результат:
healthy
Healthcheck особенно полезен в связке с оркестраторами и deploy-скриптами, можно отличать “процесс запущен” от “приложение реально готово принимать запросы”.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍5🔥3
Разбираем journalctl: 7 команд для анализа логов в Linux!
Когда сервис падает, зависает или ведёт себя странно, journalctl часто помогает быстрее всего понять причину. Эти команды позволяют смотреть логи конкретного systemd-сервиса, фильтровать события по времени и уровню, читать сообщения ядра и отдавать журнал в машинно-читаемом виде.
➡️ DevOps Ready | #шпора
Когда сервис падает, зависает или ведёт себя странно, journalctl часто помогает быстрее всего понять причину. Эти команды позволяют смотреть логи конкретного systemd-сервиса, фильтровать события по времени и уровню, читать сообщения ядра и отдавать журнал в машинно-читаемом виде.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8❤4👍4
Знали, зачем в Bash иногда используют exec вместо обычного запуска команды?
Обычно команду запускают так:
Shell остаётся родительским процессом, а nginx запускается как дочерний процесс.
В обычном терминале это почти незаметно. Но в Docker-контейнерах, entrypoint-скриптах и service-wrapper’ах это может стать проблемой: сигналы приходят в shell, а не напрямую в основной процесс.
Например, такой entrypoint выглядит рабочим:
Но если контейнер останавливают через docker stop, сигнал SIGTERM сначала получает shell. Если он не передаст сигнал дочернему процессу корректно, приложение может завершаться не так, как ожидается.
Для основного процесса лучше использовать exec:
exec не создаёт новый дочерний процесс, а заменяет текущий shell указанной командой.
То есть nginx становится главным процессом:
А не так:
Это особенно важно для контейнеров:
Теперь сигнал остановки приходит напрямую в приложение, и оно может корректно завершить работу: закрыть соединения, сбросить буферы и освободить ресурсы.
exec также полезен в скриптах-обёртках:
После подготовки окружения shell больше не нужен, поэтому его можно заменить настоящим процессом приложения.
➡️ DevOps Ready | #совет
Обычно команду запускают так:
nginx -g 'daemon off;'
Shell остаётся родительским процессом, а nginx запускается как дочерний процесс.
В обычном терминале это почти незаметно. Но в Docker-контейнерах, entrypoint-скриптах и service-wrapper’ах это может стать проблемой: сигналы приходят в shell, а не напрямую в основной процесс.
Например, такой entrypoint выглядит рабочим:
#!/usr/bin/env bash
nginx -g 'daemon off;'
Но если контейнер останавливают через docker stop, сигнал SIGTERM сначала получает shell. Если он не передаст сигнал дочернему процессу корректно, приложение может завершаться не так, как ожидается.
Для основного процесса лучше использовать exec:
#!/usr/bin/env bash
exec nginx -g 'daemon off;'
exec не создаёт новый дочерний процесс, а заменяет текущий shell указанной командой.
То есть nginx становится главным процессом:
PID 1 -> nginx
А не так:
PID 1 -> bash -> nginx
Это особенно важно для контейнеров:
docker stop app
Теперь сигнал остановки приходит напрямую в приложение, и оно может корректно завершить работу: закрыть соединения, сбросить буферы и освободить ресурсы.
exec также полезен в скриптах-обёртках:
#!/usr/bin/env bash
export APP_ENV=prod
exec ./server
После подготовки окружения shell больше не нужен, поэтому его можно заменить настоящим процессом приложения.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍3🔥3
Media is too big
VIEW IN TELEGRAM
Kubernetes Basics — вход в Kubernetes от официальной документации!
На сайте собран пошаговый раздел по базовым возможностям Kubernetes: создание кластера, деплой приложения, просмотр Pod и Deployment, масштабирование сервиса, rolling update и базовая отладка. Материал хорошо подходит тем, кто хочет разобраться, как Kubernetes управляет контейнерами, сервисами и обновлениями приложения без лишней теории и хаоса.
➡️ DevOps Ready | #ресурс
На сайте собран пошаговый раздел по базовым возможностям Kubernetes: создание кластера, деплой приложения, просмотр Pod и Deployment, масштабирование сервиса, rolling update и базовая отладка. Материал хорошо подходит тем, кто хочет разобраться, как Kubernetes управляет контейнерами, сервисами и обновлениями приложения без лишней теории и хаоса.
Оставляю ссылочку: Kubernetes Basics
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2🔥2
Делаем безопасный backup конфига перед изменением!
Перед правкой nginx, systemd unit, docker-compose.yml или любого важного конфига полезно сначала сохранить копию. Это занимает секунды, но сильно упрощает откат.
Зададим путь к файлу:
Добавим timestamp:
Соберём имя backup-файла:
Перед копированием проверим, что файл существует:
Теперь создаём копию с сохранением прав и владельца:
После этого можно редактировать конфиг:
Если это nginx, сначала проверяем конфигурацию:
И только потом перезагружаем сервис:
Если что-то пошло не так, откат простой:
Для удобства можно посмотреть последнюю копию:
Backup перед изменением конфига это маленькая привычка, которая часто экономит часы восстановления после неудачной правки.
➡️ DevOps Ready | #практика
Перед правкой nginx, systemd unit, docker-compose.yml или любого важного конфига полезно сначала сохранить копию. Это занимает секунды, но сильно упрощает откат.
Зададим путь к файлу:
file="/etc/nginx/nginx.conf"
Добавим timestamp:
stamp="$(date +%Y%m%d-%H%M%S)"
Соберём имя backup-файла:
backup="${file}.${stamp}.bak"Перед копированием проверим, что файл существует:
test -f "$file" || {
echo "Файл не найден: $file"
exit 1
}Теперь создаём копию с сохранением прав и владельца:
sudo cp -a "$file" "$backup"
После этого можно редактировать конфиг:
sudo nano "$file"
Если это nginx, сначала проверяем конфигурацию:
sudo nginx -t
И только потом перезагружаем сервис:
sudo systemctl reload nginx
Если что-то пошло не так, откат простой:
sudo cp -a "$backup" "$file"
sudo systemctl reload nginx
Для удобства можно посмотреть последнюю копию:
ls -lt /etc/nginx/nginx.conf.*.bak | head
Backup перед изменением конфига это маленькая привычка, которая часто экономит часы восстановления после неудачной правки.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍4🔥4
Kubernetes The Hard Way — репозиторий для понимания Kubernetes изнутри!
В этом репозитории Kubernetes собирается вручную, без готовых скриптов и магии managed-сервисов. Материал проходит через подготовку машин, сертификаты, kubeconfig, encryption config, etcd, control plane, worker nodes, pod network routes, kubectl и smoke test. Хорошо подойдёт тем, кто уже запускал Kubernetes, но хочет понять, что реально происходит под капотом: как компоненты связаны между собой, зачем нужны сертификаты, где живёт etcd и почему кластер не ограничивается одной командой установки.
➡️ DevOps Ready | #репозиторий
В этом репозитории Kubernetes собирается вручную, без готовых скриптов и магии managed-сервисов. Материал проходит через подготовку машин, сертификаты, kubeconfig, encryption config, etcd, control plane, worker nodes, pod network routes, kubectl и smoke test. Хорошо подойдёт тем, кто уже запускал Kubernetes, но хочет понять, что реально происходит под капотом: как компоненты связаны между собой, зачем нужны сертификаты, где живёт etcd и почему кластер не ограничивается одной командой установки.
Оставляю ссылочку: GitHub
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤6🔥4👎1
This media is not supported in your browser
VIEW IN TELEGRAM
Docker Docs — официальный гид по Docker, контейнерам и образам!
На сайте собраны материалы по установке Docker, первым контейнерам, Dockerfile, образам, volumes, networking, Docker Compose, registry, best practices и деплою приложений. Это хороший ресурс для тех, кто хочет не просто выучить пару команд, а нормально понять весь путь: как собрать образ, запустить контейнер, связать сервисы, сохранить данные и подготовить приложение к запуску в реальной инфраструктуре.
➡️ DevOps Ready | #ресурс
На сайте собраны материалы по установке Docker, первым контейнерам, Dockerfile, образам, volumes, networking, Docker Compose, registry, best practices и деплою приложений. Это хороший ресурс для тех, кто хочет не просто выучить пару команд, а нормально понять весь путь: как собрать образ, запустить контейнер, связать сервисы, сохранить данные и подготовить приложение к запуску в реальной инфраструктуре.
Оставляю ссылочку: Docker Docs
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍5🔥5🤝2
Разберём tar: 7 команд для упаковки, распаковки и проверки архивов в Linux!
tar часто встречается в DevOps-задачах: бэкапы, перенос конфигов, упаковка логов, доставка артефактов и ручная установка утилит. Важно помнить разницу между обычным tar и tar.gz: первый только объединяет файлы, второй ещё и сжимает.
В этой шпоре:
Эти команды помогают аккуратно работать с архивами и не распаковывать вслепую неизвестное содержимое.
➡️ DevOps Ready | #шпора
tar часто встречается в DevOps-задачах: бэкапы, перенос конфигов, упаковка логов, доставка артефактов и ручная установка утилит. Важно помнить разницу между обычным tar и tar.gz: первый только объединяет файлы, второй ещё и сжимает.
В этой шпоре:
• создание архива;
• распаковка;
• просмотр содержимого;
Эти команды помогают аккуратно работать с архивами и не распаковывать вслепую неизвестное содержимое.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤5👍5🤝2