DevOps Ready | IT
7.38K subscribers
857 photos
75 videos
478 links
Авторский канал по DevOps разработке.
Ресурсы, обучения, задачи, шпаргалки.
Ежедневно информация пополняется!

Cотрудничество: @energy_c
Download Telegram
Разбираем SSH 7 команд для подключения и диагностики!

SSH нужен не только для входа на сервер. С ним удобно проверять проблемы подключения, ходить через bastion-host, пробрасывать локальные порты, копировать ключи и переносить файлы.

Полезно для ежедневной работы с серверами, staging-средами, приватными сетями и диагностики доступа.

➡️ DevOps Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15🤝12👍5❤3
Test Your Sysadmin Skills - большая база вопросов для Linux и DevOps!

В этом репозитории собраны сотни вопросов и ответов по Linux, сетям, безопасности, webops, базам данных, системным задачам и диагностике. Материал удобно использовать для самопроверки, подготовки к собеседованиям и поиска тем, которые стоит подтянуть.

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

➡️ DevOps Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥8❤3👎2
Знали, зачем перед rsync --delete почти всегда делать dry-run?

rsync часто используют для деплоя, бэкапов и синхронизации директорий. Команда быстрая, удобная и хорошо переносит только изменившиеся файлы.

Ключ --delete полезен, когда целевая папка должна точно совпадать с источником. Например, в dist удалили старый JS-файл, значит на сервере он тоже должен исчезнуть.

Обычный деплой может выглядеть так.
rsync -av --delete ./dist/ server:/var/www/app/


Но именно --delete делает команду опасной. Если перепутать путь, слеш или переменную окружения, можно удалить не те файлы на удалённой стороне.

Особенно часто ошибаются с завершающим слешем. Эти две команды выглядят почти одинаково, но смысл у них разный.
rsync -av ./dist/ server:/var/www/app/
rsync -av ./dist server:/var/www/app/


В первом случае копируется содержимое папки dist. Во втором случае внутрь назначения может попасть сама папка dist.

Перед реальным запуском лучше посмотреть план изменений.
rsync -av --delete --dry-run ./dist/ server:/var/www/app/


--dry-run показывает, что команда собирается скопировать и удалить, но ничего не меняет. Это хороший предохранитель перед первым запуском или изменением пути.

Для более читаемого вывода можно добавить --itemize-changes.
rsync -av --delete --dry-run --itemize-changes ./dist/ server:/var/www/app/


Так проще увидеть, какие файлы будут добавлены, изменены или удалены. Особенно полезно смотреть строки удаления перед запуском без --dry-run.

Если команда собирается из переменных, dry-run становится ещё важнее.
SRC="./dist/"
DST="server:/var/www/app/"
rsync -av --delete --dry-run "$SRC" "$DST"


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

Когда вывод выглядит нормально, можно запустить ту же команду без --dry-run.
rsync -av --delete ./dist/ server:/var/www/app/


В CI/CD удобно делать dry-run отдельным ручным шагом для новых deploy-команд. А для регулярных задач стоит хотя бы использовать его при первом запуске после изменения путей.

Перед опасной синхронизацией можно отдельно проверить, сколько удалений планируется.
rsync -av --delete --dry-run --itemize-changes "$SRC" "$DST" | grep "^\*deleting"


Если удалений внезапно слишком много, запуск лучше остановить и перепроверить переменные.

Ещё полезно держать источник и назначение в логах.
echo "SRC=$SRC"
echo "DST=$DST"


Это звучит просто, но в реальном deploy-скрипте такая печать часто экономит много времени при разборе инцидента.

➡️ DevOps Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍5🔥4
40 собесов и оффер за 1 месяц

Алексей разработчик.

Искал работу с декабря - написание сопроводов и отклики занимали очень много времени.

Выхлоп - почти нулевой.

В какой-то момент понял:
так можно искать бесконечно.

И по совету друга попробовал ии-ассистента для автооткликов - Софи.

▫️За ~1 месяц прошел около 40 собеседований
▫️Получил оффер с вакансии, на которую, по его словам, не откликнулся бы сам

В описании она выглядела скучно, а по факту - одна из самых интересных компаний, с которыми я общался.


Весь процесс - от первого собеседования до оффера - занял 4 дня.

Зарегистрироваться и попробовать Софи можно здесь.

3 дня - бесплатно.
👍3
Запускаем скрипт по расписанию через systemd timer!

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

Пусть есть простой скрипт обслуживания:
/opt/jobs/cleanup.sh


Сначала сделаем его исполняемым:
sudo chmod +x /opt/jobs/cleanup.sh


Теперь создадим service-unit. Именно он описывает, что запускать:
sudo nano /etc/systemd/system/cleanup.service


Минимально нужен тип oneshot:
Type=oneshot


Команду запуска указываем отдельно:
ExecStart=/opt/jobs/cleanup.sh


Теперь создаём timer-unit:
sudo nano /etc/systemd/system/cleanup.timer


Например, ежедневный запуск можно описать так:
OnCalendar=daily


Если сервер был выключен во время расписания, полезен Persistent:
Persistent=true


После создания файлов перечитываем конфигурацию systemd:
sudo systemctl daemon-reload


Включаем таймер:
sudo systemctl enable --now cleanup.timer


Проверить расписание можно так:
systemctl list-timers cleanup.timer


А логи последнего запуска смотрятся через journalctl:
journalctl -u cleanup.service


Service отвечает за действие, timer отвечает за расписание. Поэтому одну и ту же задачу можно запускать вручную, по расписанию и удобно проверять через стандартные инструменты systemd.

➡️ DevOps Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥5❤3
📂 Напоминалка по постепенному внедрению мониторинга в проект!

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

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

➡️ DevOps Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥8❤7
Шпаргалка по Ansible!

Например, ad-hoc команды помогают быстро выполнить действие на группе серверов, inventory описывает хосты, а playbook позволяет хранить автоматизацию в YAML-файле.

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

➡️ DevOps Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍8🔥5
Проверяем свободное место перед backup-скриптом!

Очень частая проблема в автоматизации. Backup запускается по cron, архив начинает писаться, а потом диск заканчивается посередине процесса. В итоге получается битый файл, лишняя нагрузка и непонятная ошибка в логах.

Перед созданием архива лучше заранее проверить, хватает ли места.

Сначала зададим директорию и минимальный запас в килобайтах:
backup_dir="/var/backups/app"
min_free_kb=1048576


Теперь получим свободное место через df. Ключ -P делает вывод предсказуемым для скриптов:
free_kb=$(df -Pk "$backup_dir" | awk "NR == 2 {print $4}")


Если места меньше нужного, завершаем скрипт с ошибкой:
if [ "$free_kb" -lt "$min_free_kb" ]; then
echo "not enough disk space" >&2
exit 1
fi


После проверки можно спокойно запускать архивирование:
tar -czf "$backup_dir/app.tar.gz" /opt/app/data


Для cron полезно добавить дату в имя файла, чтобы старые архивы не перезаписывались:
stamp=$(date +%Y%m%d-%H%M%S)
archive="$backup_dir/app-$stamp.tar.gz"


И использовать переменную archive:
tar -czf "$archive" /opt/app/data


Если нужно контролировать размер каталога заранее, можно примерно оценить его через du:
need_kb=$(du -sk /opt/app/data | awk "{print $1}")


Тогда проверка станет ближе к реальности:
if [ "$free_kb" -lt "$need_kb" ]; then
echo "backup may not fit" >&2
exit 1
fi


Такой скрипт не делает backup умнее сам по себе, но убирает неприятный класс ошибок. Лучше упасть до начала операции, чем получить недописанный архив и узнать об этом только при восстановлении.

➡️ DevOps Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤7🔥6
Разбираем TLS-сертификаты через консоль!

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

В этой шпоре собраны openssl s_client, openssl x509, curl -vI, curl --cacert, update-ca-certificates, keytool и nmap ssl-enum-ciphers.

➡️ DevOps Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13🤝7❤3👍1
This media is not supported in your browser
VIEW IN TELEGRAM
☁️☁️☁️☁️☁️☁️☁️

24 сентября Yandex Cloud проведёт Yandex Scale 2026 — флагманскую технологическую конференцию, посвящённую облачным технологиям, инфраструктуре и искусственному интеллекту.

🎨🎨🎨🎨🎨🎨🎨🎨🎨🎨
🎨🎨🎨🎨🎨🎨🎨🎨🎨🎨
🎨🎨🎨🎨🎨🎨🎨🎨🎨
В программе четыре продуктовых трека — AI, Data, Security и Hybrid Infrastructure & DevOps, — и отдельный углублённый технологический трек DeepTech, который пройдёт только онлайн.

В треке Hybrid Infrastructure & DevOps откроем программу рассказом про главные инфраструктурные анонсы и новинки 2026 года. На примере Stackland расскажем, как построить свою внутреннюю платформу по методологии Platform Engineering и ускорить time to market. Разберём, зачем бизнесу кластеры Yandex Managed Service for Kubernetes на тысячи нод — на реальном продакшн-кейсе Mindbox. Расскажем, как получить предсказуемую и безопасную ИИ‑разработку с ИИ‑командой на платформе SourceCraft и максимизировать возврат инвестиций от ИИ. Разберём возможности построения реальной гибридной инфраструктуры на базе единой технологической платформы и то, как полноценно объединить локальную и облачную среды, включая выделенные серверы BareMetal. И на примере крупного банка рассмотрим, как создать полноценный гибрид, соблюдая требования безопасности, регуляторов и бизнеса одновременно.

🎨🎨🎨🎨🎨🎨🎨🎨🎨🎨
🎨🎨🎨🎨🎨🎨🎨🎨🎨🎨
🎨🎨🎨🎨🎨🎨🎨🎨🎨
Отдельно пройдут воркшопы по Hybrid Infrastructure & DevOps. Смоделируем аварию на физическом сервере и проверим, как гибридная архитектура на облаке и BareMetal держит отказоустойчивость. Научим разворачивать корпоративную ИИ-систему с RAG-сценарием на Yandex BareMetal и Stackland — чтобы модель работала с внутренней документацией и базами знаний. Разберём, как эффективно делить GPU-ресурсы Yandex Managed Service for Kubernetes между параллельными задачами обучения моделей. И покажем, как команда ИИ-агентов SourceCraft проходит путь от бизнес-требований до безопасного релиза — с проверкой на уязвимости на каждом шаге.

🎨🎨🎨🎨🎨🎨🎨🎨🎨🎨
🎨🎨🎨🎨🎨🎨🎨🎨🎨🎨

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


Программа целиком — на сайте конференции, регистрация там же, а участие бесплатное!
Please open Telegram to view this post
VIEW IN TELEGRAM
👎3👍1
Знали, зачем в Bash-скриптах включать set -u?

В deploy-скриптах и автоматизации часто используются переменные окружения. Например, путь к артефакту, имя окружения, адрес сервера или токен.

Проблема в том, что Bash по умолчанию спокойно подставляет пустую строку, если переменная не задана.

Например, такой код может выглядеть безобидно.
rm -rf "$TARGET_DIR"/*


Если TARGET_DIR внезапно пустой, команда может начать работать совсем не с тем путём, который ожидался.

Для защиты от таких ошибок включают set -u.
set -u


После этого обращение к незаданной переменной завершит скрипт ошибкой, а не превратится в пустую строку.

Пример.
set -u
echo "$DEPLOY_ENV"


Если DEPLOY_ENV не задана, скрипт остановится сразу. Это намного лучше, чем продолжить деплой в непонятное окружение.

Но иногда переменная может быть необязательной. Тогда для неё лучше явно задать значение по умолчанию.
LOG_LEVEL="${LOG_LEVEL:-info}"


Так код говорит, что отсутствие LOG_LEVEL допустимо, и в этом случае используется info.

Для обязательных переменных удобно использовать проверку с понятным сообщением.
: "${DEPLOY_ENV:?DEPLOY_ENV is required}"
: "${TARGET_DIR:?TARGET_DIR is required}"


Такая запись завершит скрипт, если переменная не задана или пустая, и сразу покажет нормальную причину ошибки.

В реальных скриптах set -u часто используют вместе с set -e и pipefail.
set -euo pipefail


Но важно не включать режимы механически. Если в скрипте есть необязательные переменные, для них нужно использовать безопасные формы вроде ${VAR:-default}.

➡️ DevOps Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤7🔥6🤝1
Media is too big
VIEW IN TELEGRAM
DevOpsPath - интерактивная карта навыков для DevOps-инженера!

На сайте собраны направления, которые помогают выстроить обучение по инфраструктуре без хаоса. Есть Linux, networking, containers, Kubernetes, CI/CD, cloud, monitoring, security и практические ориентиры для роста.

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


➡️ DevOps Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍6🔥5
Делаем безопасный backup конфига перед изменением!

Перед правкой 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 перед изменением конфига это маленькая привычка, которая часто экономит часы восстановления после неудачной правки.

➡️ DevOps Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍5🔥4
Знали, зачем в Bash-скриптах иногда включают noclobber?

В shell-скриптах легко случайно перезаписать файл через обычное перенаправление. Особенно если путь собирается из переменных или скрипт запускается в cron.

Например, такая команда всегда перезапишет файл:
echo "ready" > report.txt


Если report.txt уже существовал, старое содержимое пропадёт без предупреждения.

Для защиты можно включить режим noclobber:
set -o noclobber


После этого обычное перенаправление через > не сможет перезаписать существующий файл:
set -o noclobber
echo "ready" > report.txt


Если файл уже есть, shell завершит команду ошибкой. Это полезно для отчётов, lock-файлов, backup-метаданных и любых артефактов, которые нельзя случайно затереть.

Когда перезапись действительно нужна, её можно сделать явно через >|:
echo "ready" >| report.txt


Так в коде сразу видно намерение. Обычный путь защищён, а опасное действие становится заметным.

Часто noclobber используют локально в небольшом блоке:
set -o noclobber
echo "$payload" > "$target"


А если скрипт должен продолжить работу с обычным поведением, режим можно выключить:
set +o noclobber


Важно помнить, что noclobber защищает именно перенаправление shell. Он не мешает программе внутри команды самой открыть файл на запись.

➡️ DevOps Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤5🔥4🤝1
Netshoot - набор сетевых инструментов для диагностики контейнеров!

В репозитории собран Docker-образ для сетевой отладки в Docker и Kubernetes. Внутри есть tcpdump, tshark, termshark, curl, httpie, grpcurl, nmap, netcat, socat, iproute2, mtr, iperf, openssl и другие утилиты.

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

➡️ DevOps Ready | #репозиторий
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍5❤3
Знали, зачем для одноразовых контейнеров часто добавляют docker run --rm?

Когда контейнер запускают для короткой проверки, он после завершения остаётся в системе. Сам процесс уже не работает, но запись о контейнере и его writable layer остаются.

Например так:
docker run alpine echo ready


Если делать такие запуски часто, docker ps ничего лишнего не покажет, потому что контейнеры уже остановлены. Но они всё ещё видны через docker ps -a.

Проверить можно так:
docker ps -a


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

Для одноразовых команд добавляют --rm:
docker run --rm alpine echo ready


Теперь контейнер автоматически удалится после завершения команды. Это удобно для curl-проверок, временных shell-сессий, миграций, утилит и быстрых запусков.

Например для сетевой проверки:
docker run --rm curlimages/curl \
curl -I https://example.com


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

Для отладки иногда лучше оставить контейнер:
docker run --name debug-app my-image


Для коротких одноразовых команд --rm помогает держать Docker чистым. Для расследования падений лучше сначала сохранить контейнер и удалить его вручную позже.

➡️ DevOps Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍4🔥1
📂 Шпаргалка по организации конфигурации DevOps окружений!

Грамотная структура конфигов помогает избежать путаницы между development, staging и production, снизить риск ошибок и упростить сопровождение инфраструктуры. На картинке 7 практик: от разделения конфигураций и секретов до использования переменных среды, слоёв и переопределений, автоматизации загрузки, документации и регулярных проверок окружений.

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

➡️ DevOps Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥6❤4🤝1