DevOps Ready | IT


Гео и язык канала: Россия, Русский
Категория: Технологии


Авторский канал по DevOps разработке.
Ресурсы, обучения, задачи, шпаргалки.
Ежедневно информация пополняется!
Cотрудничество: @energy_c

Связанные каналы

Гео и язык канала
Россия, Русский
Категория
Технологии
Статистика
Фильтр публикаций


Знали, как заметить конфликтные маркеры и ошибки с пробелами до коммита?

Иногда после разрешения конфликта в файле случайно остаются строки


Проверяем срок действия TLS-сертификата до аварии!

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

Подключимся к домену через openssl s_client. Параметр servername передаёт SNI, чтобы на сервере с несколькими сайтами получить нужный сертификат:
echo | openssl s_client -connect example.com:443 \
-servername example.com 2>/dev/null

В полном выводе много технических деталей. Передадим сертификат следующей команде и покажем дату окончания:
echo | openssl s_client -connect example.com:443 \
-servername example.com 2>/dev/null \
| openssl x509 -noout -enddate

Для мониторинга удобнее не разбирать дату текстом. Ключ -checkend принимает число секунд и возвращает ненулевой код, если сертификат истечёт в пределах заданного периода. Тридцать дней составляют 2592000 секунд:
echo | openssl s_client -connect example.com:443 \
-servername example.com 2>/dev/null \
| openssl x509 -noout -checkend 2592000

Проверку можно запускать по расписанию и отправлять уведомление при ненулевом коде:
set -o pipefail
echo | openssl s_client -connect example.com:443 \
-servername example.com 2>/dev/null \
| openssl x509 -noout -checkend 2592000

Эта проверка следит именно за сроком сертификата с указанного хоста. Она не заменяет полноценную проверку цепочки доверия, совпадения имени и доступности самого приложения.

➡️ DevOps Ready | #практика


Шпаргалка по устройству GitHub Actions!

На картинке показано, как событие в репозитории запускает workflow, тот создаёт отдельные jobs, а внутри каждой job последовательно выполняются steps. Схема помогает не путать этапы автоматизации между собой.

Например, push может запустить workflow с независимыми проверками и сборкой. Если деплой должен дождаться тестов, зависимость задают между jobs, а команды внутри одной job записывают как steps.

Сохрани, чтобы не потерять!

➡️ DevOps Ready | #ресурс


Знали, почему jq без -e может пропустить неготовый сервис?

Допустим, проверка здоровья возвращает JSON с признаком готовности:
{"ready": false}

В скрипте хочется прочитать поле и продолжить работу только после готовности. Кажется логичным проверить статус команды:
jq '.ready' health.json
echo "$?"

jq напечатает false, но сама команда успешно обработала JSON и завершится с кодом 0. Если использовать её напрямую в if, скрипт ошибочно пойдёт по ветке успеха.

Для проверки результата добавьте -e:
jq -e '.ready' health.json >/dev/null
echo "$?"

Теперь false или null дают ненулевой код. Но любой другой результат, в том числе число 0 или непустая строка, считается успешным. Поэтому для строгой проверки булевого поля лучше сравнить его с true:
if jq -e '.ready == true' health.json >/dev/null; then
echo "service is ready"
else
echo "service is not ready" >&2
exit 1
fi

Если поле отсутствует, выражение тоже вернёт false. А если JSON сломан, jq завершится с ошибкой разбора, и скрипт не примет его за успешный ответ.

➡️ DevOps Ready | #совет


📂 Напоминалка по единообразию Dockerfile в команде!

Единые правила помогают сократить количество ошибок, упростить ревью и сделать сборку сервисов предсказуемой. На картинке 7 шагов: от определения базовых стандартов и общего шаблона Dockerfile до автоматических проверок в CI, использования общих образов, обучения команды и регулярного улучшения процесса. Такой подход помогает быстрее подключать новые проекты и поддерживать одинаковые практики во всей команде.

Сохрани, чтобы не потерять!

➡️ DevOps Ready | #ресурс


Изоляция процессов в Linux через Unshare без Docker и тяжелых утилит.

Мы научимся использовать системный вызов unshare для создания изолированного пространства имен (namespaces), что является фундаментом контейнеризации в Linux. Это позволяет запустить процесс с собственной таблицей хостов или файловой системой, не влияя на основную ОС. Техника незаменима для безопасного тестирования скриптов и понимания того, как работают Docker и Podman изнутри.

Сначала создадим изолированную среду с собственной сетевой петлей и новым пространством имен для имени хоста:

sudo unshare --fork --uts --net bash


Теперь вы находитесь внутри изолированного процесса, где изменения параметров сети не коснутся основной системы.

Внутри новой оболочки зададим уникальное имя хоста, чтобы убедиться в полной изоляции UTS namespace:

hostname sandbox-env && hostname


Имя хоста изменится только для этой сессии, в то время как основная система сохранит прежнее название.

Для полной демонстрации сетевой изоляции попробуем поднять интерфейс, который будет существовать только в этом пространстве:

ip link set lo up && ip addr show lo


Внутри этого пространства вы увидите чистый сетевой стек, полностью отделенный от физических интерфейсов сервера.

Проверка работоспособности:

hostname


Ожидаемый вывод: ваше старое имя хоста (подтверждает, что изоляция работает).

Использование namespaces напрямую через unshare — это мощный способ отладки и запуска недоверенных приложений с минимальным оверхедом.
Помните, что для некоторых флагов изоляции (например, монтирования) требуются права суперпользователя или настройка User Namespaces.

➡️ DevOps Ready | #практика


Видео недоступно для предпросмотра
Смотреть в Telegram
DigitalOcean Community собирает подробные руководства по Linux!

В разделе Linux Basics есть материалы про командную строку, права доступа, пользователей, процессы, сеть и администрирование сервера. Пошаговые статьи дают команды, поясняют результат и помогают пройти тему от основы до конкретной настройки.

Оставляю ссылочку на DigitalOcean Community

➡️ DevOps Ready | #ресурс


Знали, почему настройки systemd-сервиса лучше менять через systemctl edit?

Допустим, приложение установлено из пакета, а вам нужно настроить его перезапуск после сбоя. Можно открыть исходный unit-файл и дописать нужные строки, но при обновлении пакета изменения легко потерять.

Сначала посмотрите, из каких файлов сейчас складывается конфигурация сервиса:
systemctl cat myapp.service

Команда покажет основной unit и уже существующие дополнения. Так проще заметить, что нужная настройка могла быть задана раньше в другом файле.

Для своей настройки откройте редактор override-файла:
sudo systemctl edit myapp.service

Добавьте в открывшийся файл только изменяемые параметры:
[Service]
Restart=on-failure
RestartSec=5s

По умолчанию systemctl edit создаёт отдельный override.conf рядом с unit-файлом в каталоге myapp.service.d. Исходный unit при этом остаётся нетронутым.

Проверьте итоговую конфигурацию и запустите сервис заново в подходящий момент:
systemctl cat myapp.service
sudo systemctl restart myapp.service

После перезапуска убедитесь, что сервис жив и настройка применена:
systemctl status myapp.service
systemctl show myapp.service -p Restart

Если нужно отменить изменение, сначала проверьте все локальные дополнения. Команда systemctl revert удаляет не только этот override, а все локальные переопределения указанного unit, поэтому использовать её вслепую опасно.

➡️ DevOps Ready | #совет


⚡️5 фундаментальных курсов по ИБ по цене одного

Это предложение для тех, кто готов войти в новую профессию прямо сейчас!

🔥Пакет курсов за 50 000 ₽ вместо 250 000 ₽:
▪️ Linux CyberPunk - обычная цена 49 500 ₽ (+ Курс идет с официальным дипломом системного администратора!)
▪️ SQL для хакера - обычная цена 15 000 ₽
▪️ HackerPoint - обычная цена ~70 000 ₽
▪️ HackerPoint (Blue vs Red Team) - обычная цена 43 500 ₽
▪️ AI-помощники на Python - обычная цена 71 500 ₽

Вы экономите 200 000 ₽ и получаете полную базу: от работы с терминалом и базами данных до разработки ИИ-агентов и взлома систем.

🔒 Квота: набор на программу ограничен по количеству мест.

🦔Отправь промокод DevOps в чат с менеджером, чтобы закрепить за собой скидку и узнать подробности:
👉@cyacademy_support


Этот инструмент поможет поять из чего на самом деле состоит Docker-образ!

Он содержит терминальную утилиту для просмотра слоёв Docker и OCI-образов. Можно открыть конкретный слой, увидеть добавленные и удалённые файлы и найти данные, которые занимают место в образе без пользы.

Оставляю ссылочку на GitHub

➡️ DevOps Ready | #репозиторий


Проверяем итоговую конфигурацию Docker Compose перед запуском!

Когда проект использует базовый compose.yaml и отдельный файл для production, легко ошибиться с портом, переменной окружения или переопределением сервиса. Docker Compose умеет показать итоговую конфигурацию ещё до запуска контейнеров.

Пусть основной файл задаёт приложение, а второй меняет образ и параметры окружения. Посмотрим объединённый результат:
docker compose -f compose.yaml -f compose.prod.yaml config

Для проверки синтаксиса в CI не нужен длинный вывод. Достаточно тихого режима:
docker compose -f compose.yaml -f compose.prod.yaml config --quiet

Если конфигурация некорректна, команда завершится с ошибкой. Так можно остановить pipeline до попытки собрать или запустить контейнеры.

Отдельно посмотрим, какие сервисы и образы Compose получил после объединения:
docker compose -f compose.yaml -f compose.prod.yaml config --services
docker compose -f compose.yaml -f compose.prod.yaml config --images

Это помогает заметить, что нужный сервис пропал из файла или production по-прежнему ссылается на старый тег образа.

Переменные подстановки можно проверить отдельно:
docker compose -f compose.yaml -f compose.prod.yaml config --environment

Это особенно полезно после изменений в нескольких Compose-файлах или окружениях.

➡️ DevOps Ready | #практика


Шпаргалка по жизненному циклу Pod в Kubernetes!

На картинке показано, как запрос проходит через API server, как scheduler выбирает узел и что kubelet делает перед запуском контейнеров. Отдельно разобраны фазы Pod и последовательность его завершения.

Например, Pending означает, что Pod принят кластером, но контейнеры ещё не готовы к запуску. Если он долго остаётся в этой фазе, полезно проверить события, доступность образа, ресурсы узлов и ограничения планирования.

Сохрани, чтобы не потерять!

➡️ DevOps Ready | #ресурс


Видео недоступно для предпросмотра
Смотреть в Telegram
DevOps Daily собирает материалы по инфраструктуре!

На сайте есть разборы Docker, Kubernetes, Terraform, Linux, сетей и CI/CD. Отдельные разделы посвящены симуляторам, упражнениям, тестам и инструментам для повседневной работы.

Можно пройти сценарий с DNS, потренироваться в Kubernetes, открыть упражнение по Nginx или проверить себя на вопросах по Git. Материалы разнесены по темам, поэтому легко выбрать конкретную задачу и постепенно углубиться в неё.

Оставляю ссылочку на DevOps Daily


➡️ DevOps Ready | #ресурс


Разбираем SSH 7 флагов для подключения и туннелей!

SSH нужен не только для входа на сервер. Он помогает быстро проверить доступ, выбрать ключ, ограничить ожидание, пробросить локальный или удалённый порт и поднять безопасный туннель без интерактивной оболочки.

➡️ DevOps Ready | #шпора


📂 Напоминалка по построению observability-матрицы для проекта!

Наблюдаемость помогает понимать состояние сервиса, быстрее находить проблемы и не тонуть в лишних данных. На картинке показан простой подход: определить ключевые вопросы, выбрать важные метрики, подключить источники данных, настроить алерты и дашборды, документировать правила и регулярно улучшать матрицу с учётом изменений в проекте.

Сохрани, чтобы не потерять!

➡️ DevOps Ready | #ресурс


Знали, почему grep может завершить shell-скрипт без ошибки в самой команде?

grep возвращает разные коды завершения. Ноль означает, что совпадение найдено, единица означает, что совпадений нет, а код больше единицы говорит о реальной ошибке чтения.

В обычном терминале отсутствие строки часто нормально:
grep -q "READY" status.txt

Но в скрипте с set -e код 1 может прервать выполнение. Это неприятно, когда отсутствие совпадения является ожидаемой веткой, а не аварией.

Проверку лучше писать прямо в условии:
if grep -q "READY" status.txt; then
deploy
fi

Команда внутри if не остановит скрипт из-за set -e. Ветку else можно использовать для понятного сообщения или обычного пропуска шага.

Если важно отличить отсутствие данных от настоящей ошибки, сохраните exit code:
grep -q "READY" status.txt
code=$?

Теперь код 1 можно обработать спокойно, а остальные значения отправить в лог как проблему:
if [ "$code" -gt 1 ]; then
echo "grep failed" >&2
exit "$code"
fi

Такой подход особенно полезен для health-check, поиска строки в логах и проверок перед deploy. Отсутствие совпадения становится управляемым результатом, а не случайной причиной падения автоматизации.

➡️ DevOps Ready | #совет


Делаем проверяемый бэкап PostgreSQL!

Резервная копия полезна только тогда, когда её можно восстановить. Поэтому после pg_dump стоит сразу проверить содержимое архива и периодически поднимать базу из этого файла.

Сначала сохраняем параметры подключения вне команды.
export PGHOST=db.internal
export PGDATABASE=app
export PGUSER=backup

Формат custom удобен для восстановления, потому что pg_restore умеет показать состав архива и выбирать объекты. Имя с датой помогает не перезаписать вчерашний дамп.
mkdir -p backups
pg_dump --format=custom --no-owner \
--file "backups/app-$(date +%F).dump"

Проверяем архив до того, как объявлять задачу успешной. Команда выведет таблицы, схемы и другие объекты без реального восстановления.
pg_restore --list backups/app-$(date +%F).dump
test ${PIPESTATUS[0]} -eq 0

Для теста создаём отдельную базу и восстанавливаем туда копию.
createdb app_restore
pg_restore --dbname=app_restore backups/app-$(date +%F).dump

Автоматизация должна логировать дату, размер файла и результат проверки. Ещё полезно настроить хранение нескольких копий вне основного сервера, иначе поломка диска уничтожит и базу, и бэкап одновременно.

➡️ DevOps Ready | #практика


Шпаргалка по сигналам и остановке процессов в Linux!

На картинке собраны основные сигналы Unix, команды kill, killall, pgrep и pkill, а также полезные ключи для поиска по полной командной строке.

Например, kill по умолчанию отправляет SIGTERM, pgrep помогает найти PID по имени, а pkill сочетает поиск процесса и отправку сигнала в одной команде.

Сохрани, чтобы не потерять!

➡️ DevOps Ready | #ресурс


Знали, чем docker compose run отличается от exec?

Обе команды запускают процесс рядом с сервисом, поэтому их легко перепутать. Но работают они с разными контейнерами.

docker compose exec выполняет команду внутри уже запущенного контейнера. Это удобно, когда нужно открыть shell, посмотреть переменные окружения или запустить миграцию в работающем приложении.
docker compose exec api sh

Команда использует тот же контейнер, его сеть, тома и текущее состояние. Если сервис не запущен, exec не сможет подключиться.

docker compose run создаёт отдельный одноразовый контейнер на основе сервиса.
docker compose run --rm api python manage.py migrate

Такой запуск хорош для задач, которые не должны трогать основной процесс. После --rm временный контейнер будет удалён.

Важно помнить, что run по умолчанию не публикует порты сервиса. Если нужно открыть порт для отладки, его надо указать отдельно.
docker compose run --rm --service-ports api

Для проверки живого контейнера выбирай exec. Для отдельной команды, миграции или одноразового job выбирай run.

➡️ DevOps Ready | #совет


Шпаргалка по правам доступа в Linux!

Например, chmod меняет права файла, chown назначает владельца, а chgrp задаёт группу. Символьный режим помогает точечно добавить или убрать разрешение, а числовой удобен для понятных наборов вроде 600, 644 и 755.

На картинке собраны r, w и x, роли user, group и others, расшифровка ls -l, а также команды chmod, chown и chgrp с короткими примерами.

Сохрани, чтобы не потерять!

➡️ DevOps Ready | #ресурс

Показано 20 последних публикаций.