🎮 Agones — Kubernetes для игровых серверов. Инструмент решает проблему масштабирования тысячи инстансов для многопользовательских игр , превращая Kubernetes в специализированную платформу для управления игровыми серверами.
Проект предлагает не просто деплой через YAML-манифесты, а полноценный жизненный цикл: от health-check до автоматического масштабирования флота серверов под нагрузку. Интеграция с Kubernetes API позволяет matchmaker-системам напрямую запрашивать новые игровые сессии — без кастомных решений.
🤖 GitHub
@devopsitsec
Проект предлагает не просто деплой через YAML-манифесты, а полноценный жизненный цикл: от health-check до автоматического масштабирования флота серверов под нагрузку. Интеграция с Kubernetes API позволяет matchmaker-системам напрямую запрашивать новые игровые сессии — без кастомных решений.
🤖 GitHub
@devopsitsec
⚡️Легкий способ получать свежие обновления и следить за трендами в разработке на вашем языке. Находите свой стек и подписывайтесь:
Python: www.tg-me.com/pythonl
Linux: www.tg-me.com/linuxacademiya
Собеседования DS: www.tg-me.com/machinelearning_interview
Нерйросети www.tg-me.com/ai_machinelearning_big_data
C++ www.tg-me.com/cpluspluc
Docker: www.tg-me.com/DevopsDocker
Хакинг: www.tg-me.com/linuxkalii
Devops: www.tg-me.com/DevOPSitsec
Data Science: www.tg-me.com/data_analysis_ml
Javascript: www.tg-me.com/javascriptv
C#: www.tg-me.com/csharp_ci
Java: www.tg-me.com/javatg
Базы данных: www.tg-me.com/sqlhub
Python собеседования: www.tg-me.com/python_job_interview
Мобильная разработка: www.tg-me.com/mobdevelop
Golang: www.tg-me.com/Golang_google
React: www.tg-me.com/react_tg
Rust: www.tg-me.com/rust_code
ИИ: www.tg-me.com/vistehno
PHP: www.tg-me.com/phpshka
Android: www.tg-me.com/android_its
Frontend: www.tg-me.com/front
Big Data: www.tg-me.com/bigdatai
МАТЕМАТИКА: www.tg-me.com/data_math
Kubernets: www.tg-me.com/kubernetc
Разработка игр: https://www.tg-me.com/gamedev
Haskell: www.tg-me.com/haskell_tg
Физика: www.tg-me.com/fizmat
💼 Папка с вакансиями: www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy
Папка ML: https://www.tg-me.com/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://www.tg-me.com/addlist/mzMMG3RPZhY2M2Iy
😆ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: www.tg-me.com/english_forprogrammers
🧠ИИ: www.tg-me.com/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://www.tg-me.com/addlist/BkskQciUW_FhNjEy
Python: www.tg-me.com/pythonl
Linux: www.tg-me.com/linuxacademiya
Собеседования DS: www.tg-me.com/machinelearning_interview
Нерйросети www.tg-me.com/ai_machinelearning_big_data
C++ www.tg-me.com/cpluspluc
Docker: www.tg-me.com/DevopsDocker
Хакинг: www.tg-me.com/linuxkalii
Devops: www.tg-me.com/DevOPSitsec
Data Science: www.tg-me.com/data_analysis_ml
Javascript: www.tg-me.com/javascriptv
C#: www.tg-me.com/csharp_ci
Java: www.tg-me.com/javatg
Базы данных: www.tg-me.com/sqlhub
Python собеседования: www.tg-me.com/python_job_interview
Мобильная разработка: www.tg-me.com/mobdevelop
Golang: www.tg-me.com/Golang_google
React: www.tg-me.com/react_tg
Rust: www.tg-me.com/rust_code
ИИ: www.tg-me.com/vistehno
PHP: www.tg-me.com/phpshka
Android: www.tg-me.com/android_its
Frontend: www.tg-me.com/front
Big Data: www.tg-me.com/bigdatai
МАТЕМАТИКА: www.tg-me.com/data_math
Kubernets: www.tg-me.com/kubernetc
Разработка игр: https://www.tg-me.com/gamedev
Haskell: www.tg-me.com/haskell_tg
Физика: www.tg-me.com/fizmat
💼 Папка с вакансиями: www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy
Папка ML: https://www.tg-me.com/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://www.tg-me.com/addlist/mzMMG3RPZhY2M2Iy
😆ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: www.tg-me.com/english_forprogrammers
🧠ИИ: www.tg-me.com/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://www.tg-me.com/addlist/BkskQciUW_FhNjEy
🚨 Задача: «Исчезающий файл Docker-контейнера»
У вас есть Docker-контейнер, который запускается с помощью следующей команды:
Приложение внутри контейнера ежедневно генерирует важный лог-файл:
В течение дня файл корректно пишется и виден в директории на хосте:
Но ежедневно ровно в 3:00 ночи файл внезапно исчезает из папки на хосте, хотя приложение продолжает работать без ошибок и даже продолжает писать логи. После перезапуска контейнера утром, файл снова появляется и снова становится видимым на хосте.
🎯 Задача для специалиста:
Выяснить причину исчезновения файла ровно в 3:00 ночи.
Объяснить, почему приложение продолжает успешно писать лог, хотя на хосте он не виден.
Предложить решение, которое предотвращает исчезновение файла.
🔍 Подсказки и ограничения (подвохи):
На хосте нет видимых cron-задач и systemd-таймеров, удаляющих файл.
Контейнер запускается без рестартов и остается активным круглосуточно.
Внутри контейнера тоже нет cron-задач.
Docker-контейнеры не пересоздаются автоматически.
Подсказка: хостовая папка /opt/app/logs монтируется на сетевой диск (NFS), и у неё есть внешнее резервное копирование с моментальными снимками (snapshots), которые делаются каждую ночь в 3:00.
🔧 Команды и подходы для расследования:
Шаг 1: Проверить состояние контейнера
Шаг 2: Проверить, есть ли файл внутри контейнера
Шаг 3: Проверить монтирование томов и слои файловой системы
Шаг 4: Исследовать NFS-папку и поведение в момент создания snapshot
Шаг 5: Проверить inode-файл внутри контейнера и на хосте
🎲 Ответ :
Файл исчезает, потому что каждую ночь в 3:00 NFS-сервер создает snapshot папки /opt/app/logs, который включает операцию очистки или пересоздания директории.
В результате на хосте директория монтирования получает новый inode, и предыдущий файл перестаёт быть доступен через старый inode, хотя внутри контейнера файл с прежним inode остаётся открыт приложением и продолжает записываться, пока не закрыт.
То есть файл есть (открыт процессом приложения в контейнере), но на хосте его inode больше не соответствует новому inode директории, и файл становится «невидимым».
✅ Решение проблемы:
Приложению необходимо после каждой операции snapshot заново открывать файлы логов, либо перезапускать контейнер после snapshot.
Либо использовать локальное монтирование (local volume) вместо NFS с snapshot, либо настроить snapshot так, чтобы он не менял inode директории.
@DevopsDocker
У вас есть Docker-контейнер, который запускается с помощью следующей команды:
docker run -d --name tricky_container -v /opt/app/logs:/app/logs my-app-image
Приложение внутри контейнера ежедневно генерирует важный лог-файл:
/app/logs/important.log
В течение дня файл корректно пишется и виден в директории на хосте:
/opt/app/logs/important.log
Но ежедневно ровно в 3:00 ночи файл внезапно исчезает из папки на хосте, хотя приложение продолжает работать без ошибок и даже продолжает писать логи. После перезапуска контейнера утром, файл снова появляется и снова становится видимым на хосте.
🎯 Задача для специалиста:
Выяснить причину исчезновения файла ровно в 3:00 ночи.
Объяснить, почему приложение продолжает успешно писать лог, хотя на хосте он не виден.
Предложить решение, которое предотвращает исчезновение файла.
🔍 Подсказки и ограничения (подвохи):
На хосте нет видимых cron-задач и systemd-таймеров, удаляющих файл.
Контейнер запускается без рестартов и остается активным круглосуточно.
Внутри контейнера тоже нет cron-задач.
Docker-контейнеры не пересоздаются автоматически.
Подсказка: хостовая папка /opt/app/logs монтируется на сетевой диск (NFS), и у неё есть внешнее резервное копирование с моментальными снимками (snapshots), которые делаются каждую ночь в 3:00.
🔧 Команды и подходы для расследования:
Шаг 1: Проверить состояние контейнера
docker ps
docker inspect tricky_container
docker logs tricky_container
Шаг 2: Проверить, есть ли файл внутри контейнера
docker exec -it tricky_container ls -l /app/logs/
docker exec -it tricky_container tail /app/logs/important.log
Шаг 3: Проверить монтирование томов и слои файловой системы
docker inspect tricky_container --format '{{json .Mounts}}' | jq
Шаг 4: Исследовать NFS-папку и поведение в момент создания snapshot
df -hT /opt/app/logs
mount | grep nfs
Шаг 5: Проверить inode-файл внутри контейнера и на хосте
docker exec tricky_container ls -li /app/logs/important.log
ls -li /opt/app/logs/important.log
🎲 Ответ :
В результате на хосте директория монтирования получает новый inode, и предыдущий файл перестаёт быть доступен через старый inode, хотя внутри контейнера файл с прежним inode остаётся открыт приложением и продолжает записываться, пока не закрыт.
То есть файл есть (открыт процессом приложения в контейнере), но на хосте его inode больше не соответствует новому inode директории, и файл становится «невидимым».
✅ Решение проблемы:
Приложению необходимо после каждой операции snapshot заново открывать файлы логов, либо перезапускать контейнер после snapshot.
Либо использовать локальное монтирование (local volume) вместо NFS с snapshot, либо настроить snapshot так, чтобы он не менял inode директории.
@DevopsDocker
▪️ 1. Всегда проверяй
journalctl
вместо dmesg
для современных систем-
dmesg
покажет только сообщения ядра с момента загрузки.- А
journalctl -k -b -1
покажет логи ядра предыдущего ребута, что критично при расследовании падений.---
▪️ 2. Используй
ss
вместо netstat
-
netstat
устарел и медленнее.-
ss -tunap
даст быстрее и подробнее информацию о соединениях и сокетах.---
▪️ 3. Всегда включай `bash`-историю с таймстемпами
Добавь в
.bashrc
:
export HISTTIMEFORMAT="%F %T "
- Теперь команда
history
покажет не только команды, но и время их выполнения — незаменимо при расследованиях.---
▪️ 4. Следи за зомби-процессами правильно
- Команда:
ps -eo pid,ppid,state,cmd | grep ' Z '
- Поможет быстро находить процессы в состоянии "zombie", которые могут накапливаться и вызывать утечки ресурсов.
---
▪️ 5. Используй
nice
и ionice
для тяжёлых задач- Чтобы не положить систему нагрузкой от
tar
, rsync
или других утилит:
nice -n 19 ionice -c2 -n7 tar -czf backup.tar.gz /big/data
- Это заставит процесс работать с минимальным приоритетом по CPU и диску.
@DevopsDocker
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Zev 🔍
Это помощник для работы с терминалом на естественном языке.
Он помогает быстро находить нужные команды и сохранять их в избранное, а его простой и понятный интерфейс делает освоение терминала доступным даже для новичков.
📌 Github
@DevopsDocker
Это помощник для работы с терминалом на естественном языке.
Он помогает быстро находить нужные команды и сохранять их в избранное, а его простой и понятный интерфейс делает освоение терминала доступным даже для новичков.
pip install zev
📌 Github
@DevopsDocker
Forwarded from Machinelearning
This media is not supported in your browser
VIEW IN TELEGRAM
Представьте, что учите язык не по учебникам, а через ситуации, в которых оказываетесь каждый день. Именно эту идею воплотила команда Google в проекте Little Language Lessons— трех экспериментах на базе Gemini API, которые делают обучение живым и контекстным.
Первый эксперимент, Tiny Lesson, решает проблему «как сказать это сейчас?». Вы описываете ситуацию — например, «потерял паспорт» — и получаете словарь и фразы в формате JSON. Всё благодаря промптам, где Gemini генерирует структурированные данные: массив терминов с транскрипцией и переводом, а также советы по грамматике.
Например, если целевой язык — японский, модель сама определит, нужна ли транскрипция ромадзи, и подготовит материал за 2 API-запроса. Это не просто список слов, а готовый микрокурс под конкретный сценарий.
Второй, Slang Hang, убирает «учебникоговорение». Тут Gemini выступает как сценарист: создаёт диалоги на целевом языке с культурными нюансами и сленгом. Все генерируется одним запросом — от контекста сцены до реплик с пояснениями. Пример: диалог продавца и туриста может включать неформальные выражения, которые не найдешь в стандартных учебниках.
Правда, иногда модель ошибается или придумывает выражения, так что без проверки носителем не обойтись. Но сам подход — дать пользователю «уши» в реальных разговорах выглядит перспективно, особенно с интеграцией Cloud Translation для мгновенного перевода.
Третий, визуальный эксперимент — Word Cam. Наводите камеру на объект, и Gemini не только определяет его (bounding box), но и предлагает слова вроде «подоконник» или «жалюзи». Детекция работает через Gemini Vision, а дополнительные дескрипторы (цвет, материал, примеры употребления) подтягиваются отдельным запросом. Для изучения бытовой лексики почти идеально, хотя точность сильно зависит от качества снимка.
Во всех экспериментах задействован Text-to-Speech — озвучка слов и фраз. Но есть нюанс: для редких языков голоса зачастую звучат неестественно или не совпадают с диалектом. Например, выберете мексиканский испанский, а синтезатор выдаст акцент из Мадрида. Разработчики честно признают: это ограничение текущих API, и над ним еще работать.
Little Language Lessons — начало переосмысления процесса обучения языкам. Проекту пока не хватает тонкой настройки под лингвистическую специфику (идиомы или региональные диалекты), но основа уже заложена.
@ai_machinelearning_big_data
#AI #ML #LLM #Gemini
Please open Telegram to view this post
VIEW IN TELEGRAM
Вышла интерсная штука — padws!
Это бесконечная онлайн-доска с встроенным редактором кода и терминалом.
Поддерживает импорт объектов из VSCode и Cursor.
Посмотреть демо можно здесь, а селф-хост версию скачать на GitHub здесь.
https://github.com/pad-ws/pad.ws
#padws #coding #onlinewhiteboard #selfhost
Это бесконечная онлайн-доска с встроенным редактором кода и терминалом.
Поддерживает импорт объектов из VSCode и Cursor.
Посмотреть демо можно здесь, а селф-хост версию скачать на GitHub здесь.
https://github.com/pad-ws/pad.ws
#padws #coding #onlinewhiteboard #selfhost
⚙️ DevOps‑челлендж «Zero‑Downtime? Серьёзно?»
Вам выдали репозиторий ShopCat (SaaS‑платформа).
Он уже «работает» в Kubernetes‑кластере AWS EKS, собирается GitHub Actions и раскатывается Helm‑чартом.
Менеджеры уверяют, что *«релизы без простоя, всё по‑мажору»* — но пользователи получают 502 при каждом деплое.
Ваша миссия — найти и устранить скрытую причину даунтайма, не внося изменений в само приложение.
📂 Что есть в репо
⚠️ Подвох № 1 (скрытый таймер)
В
но только если кеш Docker‑слоёв инвалидирован (например, при обновлении base‑image).
⚠️ Подвох № 2 (невидимая «дырка» в rolling‑update)
В шаблоне Deployment:
*
*
* В итоге старый Pod уже не принимает новые запросы, но остаётся в EndpointSlice ещё ±60 секунд.
⚠️ Подвох № 3 («сам себе злобный Буратино»)
Helm‑values указывают образ
GitHub Actions пушит тэгированный
В production во время canary‑release может внезапно оказаться незамёрженый код Pull‑Request’а.
## 🏆 Задание
1. Настройте pipeline, чтобы:
* на каждый PR собирался
* на
2. Измените манифесты так, чтобы во время rolling‑update не было 502/504:
* никакого даунтайма, даже если контейнеру нужно 60 с на graceful‑shutdown;
* сетевой трафик должен _сначала_ уходить от старых Pod’ов, а _потом_ те выключаются.
3. Ограничьте blast‑radius: превратить
4. Найдите и исправьте «застревающий» шаг в Dockerfile, чтобы кэш всегда использовался, а билд не ждал интерактива.
5. ✅ Предоставьте:
* патчи (`.diff`) или PR в репозиторий,
* скриншот успешного
* краткое Post‑mortem (≤ 300 слов): *«Почему был даунтайм и какой фикс вы сделали»*.
## 💣 Неочевидные ограничения
* Нельзя менять исходный код приложения (только инфраструктура).
* Кластер prod имеет 2 ноды t3.medium (4 vCPU, 8 GiB) — бюджету больно от лишних replica‑set’ов.
* CI‑время — ≤ 5 мин на каждый PR.
* Все секреты — только через AWS Secrets Manager; в манифестах не должно быть
🔜 Решение
@DevOPSitsec
Вам выдали репозиторий ShopCat (SaaS‑платформа).
Он уже «работает» в Kubernetes‑кластере AWS EKS, собирается GitHub Actions и раскатывается Helm‑чартом.
Менеджеры уверяют, что *«релизы без простоя, всё по‑мажору»* — но пользователи получают 502 при каждом деплое.
Ваша миссия — найти и устранить скрытую причину даунтайма, не внося изменений в само приложение.
📂 Что есть в репо
.
├─ docker/
│ └─ Dockerfile # двухступенчатая сборка
├─ helm/
│ └─ shopcat/ # Chart.yaml + values.yaml + templates/*
├─ k8s/
│ ├─ namespace.yaml
│ └─ ingress.yaml # AWS ALB Ingress Controller
├─ .github/workflows/
│ └─ deploy.yml # CI → CD
└─ terraform/
├─ eks.tf
├─ rds.tf
└─ outputs.tf
⚠️ Подвох № 1 (скрытый таймер)
В
Dockerfile
есть RUN adduser ...
с интерактивным sudo‐prompt’ом, который «застревает», но только если кеш Docker‑слоёв инвалидирован (например, при обновлении base‑image).
⚠️ Подвох № 2 (невидимая «дырка» в rolling‑update)
В шаблоне Deployment:
livenessProbe:
httpGet:
path: /healthz
port: 8080
---
readinessProbe:
httpGet:
path: /healthz
port: 8080
*
/healthz
возвращает 200 даже во время graceful‑shutdown (SIGTERM → 30 с drain). *
terminationGracePeriodSeconds
= 60
, а Ingress ALB считает Pod «живым», пока тот не закроется. * В итоге старый Pod уже не принимает новые запросы, но остаётся в EndpointSlice ещё ±60 секунд.
⚠️ Подвох № 3 («сам себе злобный Буратино»)
Helm‑values указывают образ
image: shopcat:latest
. GitHub Actions пушит тэгированный
:vX.Y.Z
, но тэг :latest
перезаписывается той же джобой PR‑preview. В production во время canary‑release может внезапно оказаться незамёрженый код Pull‑Request’а.
## 🏆 Задание
1. Настройте pipeline, чтобы:
* на каждый PR собирался
shopcat:<sha>
и катил preview‑релиз в namespace pr‑<num>
, * на
main
пушился shopcat:v<semver>
, после чего Helm делал blue/green‑deploy в prod
.2. Измените манифесты так, чтобы во время rolling‑update не было 502/504:
* никакого даунтайма, даже если контейнеру нужно 60 с на graceful‑shutdown;
* сетевой трафик должен _сначала_ уходить от старых Pod’ов, а _потом_ те выключаются.
3. Ограничьте blast‑radius: превратить
latest
в «immutable image tag» и запретить Helm обновлять release, если image.tag
уже был задеплоен (hint: .Chart.AppVersion
+ `helm.sh/hook`).4. Найдите и исправьте «застревающий» шаг в Dockerfile, чтобы кэш всегда использовался, а билд не ждал интерактива.
5. ✅ Предоставьте:
* патчи (`.diff`) или PR в репозиторий,
* скриншот успешного
kubectl rollout status deployment/shopcat ‑‑watch
,* краткое Post‑mortem (≤ 300 слов): *«Почему был даунтайм и какой фикс вы сделали»*.
## 💣 Неочевидные ограничения
* Нельзя менять исходный код приложения (только инфраструктура).
* Кластер prod имеет 2 ноды t3.medium (4 vCPU, 8 GiB) — бюджету больно от лишних replica‑set’ов.
* CI‑время — ≤ 5 мин на каждый PR.
* Все секреты — только через AWS Secrets Manager; в манифестах не должно быть
plaintext
.@DevOPSitsec
Please open Telegram to view this post
VIEW IN TELEGRAM
👾 eBPF вместо прокси: новый подход к масштабированию в Kubernetes.
Инженеры WSO2 предложили нестандартное решение для scale-to-zero в Kubernetes — отказ от прокси в пользу eBPF. Они создали прототип, где eBPF-программа на уровне XDP перехватывает пакеты, инициируя масштабирование сервисов без промежуточного слоя.
🧑💻 Как это работает?
— eBPF-драйвер отслеживает запросы к остановленным сервисам, временно блокируя их и запуская масштабирование
— После готовности POD запрос проходит напрямую, минуя прокси
— Подход работает для любых TCP-сервисов, включая базы данных
Преимущества:
— Работает для любых TCP-сервисов (не только HTTP)
— Снижение latency на 30-50% по сравнению с прокси-решениями
— Полная совместимость с существующими сетевыми политиками
— Поддержка даже stateful-сервисов вроде PostgreSQL
🔗 Ссылка - *клик*
@devopsitsec
Инженеры WSO2 предложили нестандартное решение для scale-to-zero в Kubernetes — отказ от прокси в пользу eBPF. Они создали прототип, где eBPF-программа на уровне XDP перехватывает пакеты, инициируя масштабирование сервисов без промежуточного слоя.
🧑💻 Как это работает?
— eBPF-драйвер отслеживает запросы к остановленным сервисам, временно блокируя их и запуская масштабирование
— После готовности POD запрос проходит напрямую, минуя прокси
— Подход работает для любых TCP-сервисов, включая базы данных
Преимущества:
— Работает для любых TCP-сервисов (не только HTTP)
— Снижение latency на 30-50% по сравнению с прокси-решениями
— Полная совместимость с существующими сетевыми политиками
— Поддержка даже stateful-сервисов вроде PostgreSQL
🔗 Ссылка - *клик*
@devopsitsec
🚀 Опубликована программа конференции «БеКон 2025». Глубина погружения в тему безопасности контейнеров в этом году продолжает держать планку прошлых «БеКонов».
Ключевые доклады:
☁️ Как безопасно организовать аутентификацию в облаке
🐳 Kubernetes: неочевидные подводные камни для экспертов
🌐 Cilium: расширение сетевых политик — зачем и как?
📦 Безопасная сборка образов контейнеров: инструменты и лучшие практики
🛡️ Kyverno — тонкости настройки
🖥️OS Talos: эффективная эксплуатация без головной боли
📝 Требования ФСТЭК для контейнеров и кластеров
🚫 Control Plane Kubernetes: как ограничить доступ пользователям
🐧 Настройки Linux, опасные для контейнеров
🤖 ML-кластеры: обеспечение безопасности
⚠️ Важно: Билеты подорожают после майских праздников. Бронируйте места сейчас, пока действует текущий тариф.
👉 Также будет полезно подписаться на канал конференции @bekon_conf, чтобы быть в курсе всех деталей и не пропустить розыгрыши призов.
Ключевые доклады:
☁️ Как безопасно организовать аутентификацию в облаке
🐳 Kubernetes: неочевидные подводные камни для экспертов
🌐 Cilium: расширение сетевых политик — зачем и как?
📦 Безопасная сборка образов контейнеров: инструменты и лучшие практики
🛡️ Kyverno — тонкости настройки
🖥️OS Talos: эффективная эксплуатация без головной боли
📝 Требования ФСТЭК для контейнеров и кластеров
🚫 Control Plane Kubernetes: как ограничить доступ пользователям
🐧 Настройки Linux, опасные для контейнеров
🤖 ML-кластеры: обеспечение безопасности
⚠️ Важно: Билеты подорожают после майских праздников. Бронируйте места сейчас, пока действует текущий тариф.
👉 Также будет полезно подписаться на канал конференции @bekon_conf, чтобы быть в курсе всех деталей и не пропустить розыгрыши призов.
🏗️ Гайд: Эффективная оркестрация контейнеров с Docker в продакшн-среде
Ниже — подробное руководство для продвинутых пользователей, с примерами из реальной практики, кодом и комментариями.
1️⃣ Выбор инструмента оркестрации
Docker предоставляет базовые возможности, но для продакшн-оркестрации требуется полноценный движок:
✅ Docker Swarm — встроенный, подходит для малых и средних проектов
✅ Kubernetes (K8s) — промышленный стандарт, подходит для масштабных систем
✅ Nomad (от HashiCorp) — легковесная альтернатива
👉 Для быстрого старта используй Swarm, для больших систем — Kubernetes.
2️⃣ Архитектура кластера
Рекомендуемый минимум:
• 3 manager-ноды (quorum, HA)
• 2+ worker-ноды
• overlay-сеть
• load balancer (например nginx, HAProxy)
• private registry (Harbor, GitLab Registry)
Инициализация кластера:
Создание overlay-сети:
---
3️⃣ Развёртывание сервисов
Пример
Запуск:
---
4️⃣ Zero-Downtime Updates
Добавь healthcheck в Dockerfile:
В
---
5️⃣ Резервное копирование
Полезные команды:
Бэкап Raft:
6️⃣ Мониторинг и логирование
✅ Prometheus + Grafana — метрики
✅ ELK Stack / Loki — логи
Пример запуска cAdvisor:
7️⃣ Безопасность
• Запуск от непривилегированного пользователя:
• Read-only root filesystem:
• Ограничение capability:
• Сканирование образов (Trivy):
• Не использовать
8️⃣ Оптимизация Dockerfile
✅ multi-stage build
✅ минимизируй слои
✅ данные — во внешние volume
Пример multi-stage:
9️⃣ Управление секретами
Создание секрета:
Использование в
В контейнере доступно как
🔟 CI/CD
Пример пайплайна (GitLab):
🎯 Заключение
Эффективная оркестрация =
✅ грамотная архитектура
✅ rolling updates + healthchecks
✅ безопасность (secrets, cap_drop, read_only)
✅ мониторинг и логирование
✅ CI/CD интеграция
✅ регулярный бэкап
👉 Swarm = быстрый старт, Kubernetes = масштабирование.
Ниже — подробное руководство для продвинутых пользователей, с примерами из реальной практики, кодом и комментариями.
1️⃣ Выбор инструмента оркестрации
Docker предоставляет базовые возможности, но для продакшн-оркестрации требуется полноценный движок:
✅ Docker Swarm — встроенный, подходит для малых и средних проектов
✅ Kubernetes (K8s) — промышленный стандарт, подходит для масштабных систем
✅ Nomad (от HashiCorp) — легковесная альтернатива
👉 Для быстрого старта используй Swarm, для больших систем — Kubernetes.
2️⃣ Архитектура кластера
Рекомендуемый минимум:
• 3 manager-ноды (quorum, HA)
• 2+ worker-ноды
• overlay-сеть
• load balancer (например nginx, HAProxy)
• private registry (Harbor, GitLab Registry)
Инициализация кластера:
docker swarm init --advertise-addr MANAGER_IP
docker swarm join --token <join-token> MANAGER_IP:2377
Создание overlay-сети:
docker network create --driver overlay --attachable my-overlay
---
3️⃣ Развёртывание сервисов
Пример
docker-compose.yml
(версии 3 для Swarm):
version: '3.9'
services:
web:
image: mycompany/webapp:latest
replicas: 5
deploy:
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
networks:
- frontend
ports:
- "80:80"
networks:
frontend:
driver: overlay
Запуск:
docker stack deploy -c docker-compose.yml mystack
---
4️⃣ Zero-Downtime Updates
Добавь healthcheck в Dockerfile:
HEALTHCHECK --interval=30s --timeout=10s \
CMD curl -f http://localhost/health || exit 1
В
docker-compose.yml
уже используется update_config
→ обновления происходят без даунтайма (по 2 контейнера каждые 10s, с проверкой healthcheck).---
5️⃣ Резервное копирование
Полезные команды:
docker swarm unlock-key
docker swarm join-token manager
docker node ls
Бэкап Raft:
docker container stop $(docker container ls -q --filter name=swarm)
cp -r /var/lib/docker/swarm ~/swarm-backup
6️⃣ Мониторинг и логирование
✅ Prometheus + Grafana — метрики
✅ ELK Stack / Loki — логи
Пример запуска cAdvisor:
docker run -d \
-p 9323:9323 \
--name cadvisor \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
google/cadvisor:latest
7️⃣ Безопасность
• Запуск от непривилегированного пользователя:
USER appuser
• Read-only root filesystem:
deploy:
read_only: true
• Ограничение capability:
deploy:
cap_drop:
- ALL
• Сканирование образов (Trivy):
trivy image mycompany/webapp:latest
• Не использовать
latest
тег:
image: mycompany/webapp:1.3.2
8️⃣ Оптимизация Dockerfile
✅ multi-stage build
✅ минимизируй слои
✅ данные — во внешние volume
Пример multi-stage:
FROM node:18 AS build
WORKDIR /app
COPY . .
RUN npm install && npm run build
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html
9️⃣ Управление секретами
Создание секрета:
echo "my-secret-value" | docker secret create db_password -
Использование в
docker-compose.yml
:
secrets:
- db_password
В контейнере доступно как
/run/secrets/db_password
.🔟 CI/CD
Пример пайплайна (GitLab):
stages:
- build
- deploy
build:
stage: build
script:
- docker build -t registry.example.com/myapp:$CI_COMMIT_SHA .
- docker push registry.example.com/myapp:$CI_COMMIT_SHA
deploy:
stage: deploy
script:
- docker service update --image registry.example.com/myapp:$CI_COMMIT_SHA mystack_web
🎯 Заключение
Эффективная оркестрация =
✅ грамотная архитектура
✅ rolling updates + healthchecks
✅ безопасность (secrets, cap_drop, read_only)
✅ мониторинг и логирование
✅ CI/CD интеграция
✅ регулярный бэкап
👉 Swarm = быстрый старт, Kubernetes = масштабирование.
Столкнулись с падением производительности базы данных?
Не делайте резких движений: вы можете ухудшить ситуацию.
Сначала нужно верно диагностировать причину проблемы.
Возможно вы неправильно выбрали индексы, а быть может дело вообще в самой архитектуре БД – вариантов масса!
На открытом вебинаре «Как ускорить работу и повысить надёжность PostgreSQL»
вы узнаете:
🎯как обеспечить высокую производительность и отказоустойчивость базы данных
🎯как вовремя выявить деградацию производительности с помощью диагностики
Вебинар проведёт Дмитрий Золотов, Kotlin-разработчик в «Яндексе».
Приглашаем технических руководителей, админов БД, девопсов и разработчиков.
Все участники получат в подарок видеоурок «Безопасность в PostgreSQL: защита данных, управление доступом и аудит» и скидку 7% на любой курс OTUS.
6 мая, 19:00 МСК
Бесплатно
Записаться - https://otus.pw/hgvF/
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: 2W5zFH67gB2
Не делайте резких движений: вы можете ухудшить ситуацию.
Сначала нужно верно диагностировать причину проблемы.
Возможно вы неправильно выбрали индексы, а быть может дело вообще в самой архитектуре БД – вариантов масса!
На открытом вебинаре «Как ускорить работу и повысить надёжность PostgreSQL»
вы узнаете:
🎯как обеспечить высокую производительность и отказоустойчивость базы данных
🎯как вовремя выявить деградацию производительности с помощью диагностики
Вебинар проведёт Дмитрий Золотов, Kotlin-разработчик в «Яндексе».
Приглашаем технических руководителей, админов БД, девопсов и разработчиков.
Все участники получат в подарок видеоурок «Безопасность в PostgreSQL: защита данных, управление доступом и аудит» и скидку 7% на любой курс OTUS.
6 мая, 19:00 МСК
Бесплатно
Записаться - https://otus.pw/hgvF/
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: 2W5zFH67gB2
@devopsitsec
Please open Telegram to view this post
VIEW IN TELEGRAM
🐳 Как устроен Docker: что происходит «под капотом»
Поговорим немного про базу.
Docker — одно из самых популярных средств контейнеризации. Его простота снаружи скрывает сложную архитектуру. Разберём, как он устроен внутри.
1) Что такое контейнер?
Контейнер — изолированная среда, где запускается приложение со всеми зависимостями.
⚠️ Это не виртуальная машина: контейнер делит ядро ОС с хостом, но видит только свою «песочницу» через изоляцию.
2) Основные компоненты
• Docker Engine
– Docker Daemon (`dockerd`) управляет контейнерами, образами, сетями
– Docker CLI (`docker`) — интерфейс пользователя
– REST API — взаимодействие CLI и Daemon
👉 Пример:
3) Namespaces
Механизм изоляции в Linux, создающий для контейнера:
• свой процессный ID (pid namespace)
• файловую систему (mnt namespace)
• сеть (net namespace)
• hostname (uts namespace)
• IPC (ipc namespace)
👉 Благодаря namespace контейнер видит «свою» мини-ОС, хотя на деле — это лишь виртуальные границы.
4) Cgroups
Ограничивают и учитывают ресурсы (CPU, RAM, I/O, сеть).
Пример: можно задать лимит 512 МБ RAM и 0.5 CPU.
Если приложение превышает лимит — Docker его ограничит или остановит.
5) Union File Systems (OverlayFS)
Docker использует многослойную файловую систему. Каждый шаг
При запуске контейнера создаётся верхний writable-слой, остальные read-only.
👉 10 контейнеров на одном образе разделяют слои → экономия места.
6) Container Runtime
Docker использует
Daemon вызывает
7) Docker Images
Образ — read-only слои, собранные в Union FS.
Каждый слой — изменения относительно предыдущего (например, установка пакета → новый слой).
Хранение: локально (`/var/lib/docker`) или в реестре (Docker Hub, GitLab Container Registry).
8) Docker Networking
Docker создаёт виртуальные сети (bridge, overlay, host).
По умолчанию контейнеры подключаются к bridge и получают IP из внутреннего пула.
👉 Можно пробросить порты через
В Swarm используется Overlay network (сеть между хостами).
9) Безопасность
Docker использует:
• seccomp (ограничение системных вызовов)
• AppArmor / SELinux (контроль привилегий)
• user namespaces (отображение UID контейнера в другой UID хоста)
⚠️ По умолчанию контейнеры имеют широкий доступ (например,
10) Что происходит при `docker run nginx`?
1. CLI отправляет запрос через API
2. Daemon ищет образ (локально или в registry)
3. Создаётся read-write слой контейнера
4. Создаются namespace (pid, net, mnt…)
5. Применяются cgroups
6. Вызывается
7. Контейнер подключается к сети
8. Запускается ENTRYPOINT/command
Контейнер живёт, пока жив его процесс.
11) Почему Docker — не магия?
Docker использует стандартные возможности ядра Linux (namespaces, cgroups, chroot, seccomp, overlayfs), оборачивая их в удобный интерфейс.
Контейнер — просто изолированный процесс, а не полноценная VM.
Поэтому Docker лёгкий, быстрый, удобный.
12) Заключение
Под капотом Docker:
• namespaces — изоляция
• cgroups — контроль ресурсов
• runc — запуск
• overlayfs — многослойная ФС
• REST API + Daemon + CLI — взаимодействие
Docker скрывает сложность, давая простой инструмент для запуска, сборки, развёртывания приложений.
Теперь, зная внутреннее устройство, можно глубже понять контейнеры, лучше их настраивать и оптимизировать.
➡️ Подробнее
@DevopsDocker
Поговорим немного про базу.
Docker — одно из самых популярных средств контейнеризации. Его простота снаружи скрывает сложную архитектуру. Разберём, как он устроен внутри.
1) Что такое контейнер?
Контейнер — изолированная среда, где запускается приложение со всеми зависимостями.
⚠️ Это не виртуальная машина: контейнер делит ядро ОС с хостом, но видит только свою «песочницу» через изоляцию.
2) Основные компоненты
• Docker Engine
– Docker Daemon (`dockerd`) управляет контейнерами, образами, сетями
– Docker CLI (`docker`) — интерфейс пользователя
– REST API — взаимодействие CLI и Daemon
👉 Пример:
docker run nginx
→ CLI отправляет запрос, Daemon находит образ, создаёт контейнер, запускает процесс.3) Namespaces
Механизм изоляции в Linux, создающий для контейнера:
• свой процессный ID (pid namespace)
• файловую систему (mnt namespace)
• сеть (net namespace)
• hostname (uts namespace)
• IPC (ipc namespace)
👉 Благодаря namespace контейнер видит «свою» мини-ОС, хотя на деле — это лишь виртуальные границы.
4) Cgroups
Ограничивают и учитывают ресурсы (CPU, RAM, I/O, сеть).
Пример: можно задать лимит 512 МБ RAM и 0.5 CPU.
Если приложение превышает лимит — Docker его ограничит или остановит.
5) Union File Systems (OverlayFS)
Docker использует многослойную файловую систему. Каждый шаг
Dockerfile
создаёт новый слой. При запуске контейнера создаётся верхний writable-слой, остальные read-only.
👉 10 контейнеров на одном образе разделяют слои → экономия места.
6) Container Runtime
Docker использует
runc
для запуска контейнера (соответствует OCI Runtime Spec). Daemon вызывает
runc
, который через clone()
, setns()
, chroot()
изолирует процесс.7) Docker Images
Образ — read-only слои, собранные в Union FS.
Каждый слой — изменения относительно предыдущего (например, установка пакета → новый слой).
Хранение: локально (`/var/lib/docker`) или в реестре (Docker Hub, GitLab Container Registry).
8) Docker Networking
Docker создаёт виртуальные сети (bridge, overlay, host).
По умолчанию контейнеры подключаются к bridge и получают IP из внутреннего пула.
👉 Можно пробросить порты через
-p
, создать собственные сети, объединять контейнеры через docker network connect
.В Swarm используется Overlay network (сеть между хостами).
9) Безопасность
Docker использует:
• seccomp (ограничение системных вызовов)
• AppArmor / SELinux (контроль привилегий)
• user namespaces (отображение UID контейнера в другой UID хоста)
⚠️ По умолчанию контейнеры имеют широкий доступ (например,
/proc
виден). Для production стоит ограничивать права (например, `--cap-drop`).10) Что происходит при `docker run nginx`?
1. CLI отправляет запрос через API
2. Daemon ищет образ (локально или в registry)
3. Создаётся read-write слой контейнера
4. Создаются namespace (pid, net, mnt…)
5. Применяются cgroups
6. Вызывается
runc
для изоляции процесса7. Контейнер подключается к сети
8. Запускается ENTRYPOINT/command
Контейнер живёт, пока жив его процесс.
11) Почему Docker — не магия?
Docker использует стандартные возможности ядра Linux (namespaces, cgroups, chroot, seccomp, overlayfs), оборачивая их в удобный интерфейс.
Контейнер — просто изолированный процесс, а не полноценная VM.
Поэтому Docker лёгкий, быстрый, удобный.
12) Заключение
Под капотом Docker:
• namespaces — изоляция
• cgroups — контроль ресурсов
• runc — запуск
• overlayfs — многослойная ФС
• REST API + Daemon + CLI — взаимодействие
Docker скрывает сложность, давая простой инструмент для запуска, сборки, развёртывания приложений.
Теперь, зная внутреннее устройство, можно глубже понять контейнеры, лучше их настраивать и оптимизировать.
@DevopsDocker
Please open Telegram to view this post
VIEW IN TELEGRAM
Все на «ВНЕДРЕЙД» — хакатон от Orion soft, который объединил пять крупнейших компаний страны: Т-банк, Авито, Lamoda, CDEK, Магнит.
Тебе предстоит разработать решение для одной из них. Сотни неравнодушных и всего 48 часов на решение задачи.
Когда: 7-8 июня
Где: Москва, пространство «Суперметалл»
Два трека: студенты и опытные спецы
Скорее собирай команду, мест только 300
Приз для лучших: 4-х дневный трип на покорение Эльбруса для всей команды с полной оплатой билетов, проживания и развлекательной программы
И это ещё не всё:
- быстрый найм в Orion soft для талантов
- жирный кейс в портфолио
- мощный буст по скиллам
- тонна крутого мерча
Твой код — твои правила. Залетай и покажи, на что способен.
[Подать заявку]
Тебе предстоит разработать решение для одной из них. Сотни неравнодушных и всего 48 часов на решение задачи.
Когда: 7-8 июня
Где: Москва, пространство «Суперметалл»
Два трека: студенты и опытные спецы
Скорее собирай команду, мест только 300
Приз для лучших: 4-х дневный трип на покорение Эльбруса для всей команды с полной оплатой билетов, проживания и развлекательной программы
И это ещё не всё:
- быстрый найм в Orion soft для талантов
- жирный кейс в портфолио
- мощный буст по скиллам
- тонна крутого мерча
Твой код — твои правила. Залетай и покажи, на что способен.
[Подать заявку]
@devopsitsec
Please open Telegram to view this post
VIEW IN TELEGRAM
🗺 Google maps scraper
Это Golang парсер, на основе фреймворка scrapemate который позволяет удобно парсить данные из Google Maps.
Он автоматизирует просмотр веб-страниц и позволяет извлекать: имя, адрес, номер телефона, URL-адрес веб-сайта, рейтинг и количество отзывов для каждого выбранного вами места.
Все данные сохраняются в файл CSV для удобства анализа и обработки.
Содержит код для быстрого запуска с использованием Docker.
▪Github
@devopsitsec
Это Golang парсер, на основе фреймворка scrapemate который позволяет удобно парсить данные из Google Maps.
Он автоматизирует просмотр веб-страниц и позволяет извлекать: имя, адрес, номер телефона, URL-адрес веб-сайта, рейтинг и количество отзывов для каждого выбранного вами места.
Все данные сохраняются в файл CSV для удобства анализа и обработки.
Содержит код для быстрого запуска с использованием Docker.
▪Github
@devopsitsec
Media is too big
VIEW IN TELEGRAM
🔥 Ошибка Therac-25: когда код убивает
▪ В 1980-х Therac-25 считался чудом медицины: новый линейный ускоритель для лечения рака с точной дозировкой радиации. Разработчики гордились: теперь всё управляет программное обеспечение — минимум ручной работы и максимум безопасности… казалось бы.
Но вскоре пациенты начали получать смертельные дозы радиации. Люди приходили на лечение и получали 100-кратное превышение нормы буквально за секунды. Некоторые умирали мгновенно, другие — спустя несколько недель.
Что же случилось? 👇
▪ Гонка потоков (race condition) — незаметный баг в коде. Если техник слишком быстро переключал режимы лечения, программа не успевала правильно активировать защиту. Результат: машина включала мощнейший луч без блокировки и буквально сжигала пациентов.
Разработчики уверяли, что код «идеален» и проблема не в них. Только после нескольких трагедий независимые эксперты нашли источник: баг проявлялся лишь при экстремально быстром вводе комбинаций клавиш — ситуация, которую никто даже не тестировал.
💥 Итог: Therac-25 стал примером того, что даже одна строка кода может убить, если игнорировать тестирование edge-case сценариев. Этот случай навсегда изменил стандарты разработки критически важных систем, введя новые международные нормы безопасности.
👉 Урок:
Никогда не верь, что твой код «без ошибок». Особенно когда от него зависят жизни.
#код #баги #историиИТ #therac25 #разработка #тестирование #fail
▪ В 1980-х Therac-25 считался чудом медицины: новый линейный ускоритель для лечения рака с точной дозировкой радиации. Разработчики гордились: теперь всё управляет программное обеспечение — минимум ручной работы и максимум безопасности… казалось бы.
Но вскоре пациенты начали получать смертельные дозы радиации. Люди приходили на лечение и получали 100-кратное превышение нормы буквально за секунды. Некоторые умирали мгновенно, другие — спустя несколько недель.
Что же случилось? 👇
▪ Гонка потоков (race condition) — незаметный баг в коде. Если техник слишком быстро переключал режимы лечения, программа не успевала правильно активировать защиту. Результат: машина включала мощнейший луч без блокировки и буквально сжигала пациентов.
Разработчики уверяли, что код «идеален» и проблема не в них. Только после нескольких трагедий независимые эксперты нашли источник: баг проявлялся лишь при экстремально быстром вводе комбинаций клавиш — ситуация, которую никто даже не тестировал.
💥 Итог: Therac-25 стал примером того, что даже одна строка кода может убить, если игнорировать тестирование edge-case сценариев. Этот случай навсегда изменил стандарты разработки критически важных систем, введя новые международные нормы безопасности.
👉 Урок:
Никогда не верь, что твой код «без ошибок». Особенно когда от него зависят жизни.
#код #баги #историиИТ #therac25 #разработка #тестирование #fail
🐧 Задача с подвохом: Странное поведение с `df` и `du`
Условие:
Вы замечаете, что на сервере
И видите, что диск почти полностью заполнен. Но при этом, когда проверяете размер файлов в
— оказывается, что размер логов совсем небольшой, явно не соответствующий тому, что показывает
❓ Вопрос:
Почему возникает такая ситуация? Что именно занимает место, если файлы почти пустые? Как это исправить, не перезагружая сервер?
🔍 Подсказка:
На сервере активно работают несколько приложений, которые записывают логи. Недавно был произведён
---
✅ Разбор:
💥 Подвох:
Многие думают, что после удаления файла место сразу освобождается. Но в Linux есть важный нюанс: если процесс всё ещё держит файл открытым, даже после удаления файла из файловой системы, его содержимое продолжает занимать место на диске.
Вот что происходит:
- показывает размер существующих файлов, поэтому он маленький (ведь файлы удалены).
- показывает реальное использование блочного устройства, и оно включает те данные, которые всё ещё заняты удалёнными, но открытыми файлами.
🚩 Это классическая ситуация после : старые логи удаляются, но процессы, которые их писали (например, , `mysql`), продолжают держать дескрипторы открытыми.
🔧 Как найти виновника:
Используем для поиска удалённых, но ещё открытых файлов:
```bash
lsof | grep deleted
```
Вы увидите что-то вроде:
```
nginx 1234 ... /var/log/nginx/access.log (deleted)
```
🛠 Как исправить без перезагрузки:
1️⃣ Перезапустить приложение, которое держит файл открытым:
```bash
systemctl restart nginx
```
2️⃣ Если нельзя перезапустить, можно попробовать «сбросить» файл, подменив его на новый (подходит не всегда).
---
✅ Вывод:
• и показывают разное, потому что считают разными методами:
- : что реально занято на диске (включая удалённые, но ещё открытые файлы)
- : что физически доступно через файловую систему
• Если место не освобождается после удаления файла — ищите открытые файловые дескрипторы удалённых файлов. Это классика для DevOps!
💡 Бонус-вопрос для гуру:
Что произойдёт, если в вы видите удалённый файл, но процесс — это ? Как поступить в этом случае? 😉
Условие:
Вы замечаете, что на сервере
/var/log
неожиданно «занялось» много места. Проверяете это так:
df -h /var
И видите, что диск почти полностью заполнен. Но при этом, когда проверяете размер файлов в
/var/log
:
du -sh /var/log
— оказывается, что размер логов совсем небольшой, явно не соответствующий тому, что показывает
df
.❓ Вопрос:
Почему возникает такая ситуация? Что именно занимает место, если файлы почти пустые? Как это исправить, не перезагружая сервер?
🔍 Подсказка:
На сервере активно работают несколько приложений, которые записывают логи. Недавно был произведён
logrotate
, старые логи удалились.---
✅ Разбор:
💥 Подвох:
Многие думают, что после удаления файла место сразу освобождается. Но в Linux есть важный нюанс: если процесс всё ещё держит файл открытым, даже после удаления файла из файловой системы, его содержимое продолжает занимать место на диске.
Вот что происходит:
-
du
-
df
🚩 Это классическая ситуация после
logrotate
nginx
🔧 Как найти виновника:
Используем
lsof
```bash
lsof | grep deleted
```
Вы увидите что-то вроде:
```
nginx 1234 ... /var/log/nginx/access.log (deleted)
```
🛠 Как исправить без перезагрузки:
1️⃣ Перезапустить приложение, которое держит файл открытым:
```bash
systemctl restart nginx
```
2️⃣ Если нельзя перезапустить, можно попробовать «сбросить» файл, подменив его на новый (подходит не всегда).
---
✅ Вывод:
•
df
du
-
df
-
du
• Если место не освобождается после удаления файла — ищите открытые файловые дескрипторы удалённых файлов. Это классика для DevOps!
💡 Бонус-вопрос для гуру:
Что произойдёт, если в
lsof
docker
CI/CD без боли: оптимизация пайплайнов на GitHub Actions 🚀
GitHub Actions — мощный инструмент, но без оптимизации ваш пайплайн легко превратится в тормозную мясорубку. Разбираемся, как выжать максимум из CI/CD на GitHub.
Почему это важно:
Быстрые и надёжные пайплайны — ключ к высокой скорости доставки. Медленные сборки = потеря времени, нервов и денег.
1. Кэшируй разумно
Используй
⚠️ Ключ должен быть завязан на lock-файлы, иначе можно словить конфликты версий.
2. Делай job-ы параллельными
Разделяй пайплайн на независимые шаги — unit-тесты, линтеры, сборка. Добавляй
3. Matrix strategy — must-have
Хочешь тестировать на разных версиях языка/ОС? Используй
Это масштабирует проверку без дублирования кода.
4. Отключи ненужные события
Не запускай воркфлоу на каждом чихе. Используй
Это поможет не перегружать runners.
5. Используй
Иногда надо протестить пайплайн руками — не бойся добавить ручной триггер:
6. Логи и таймауты — твои друзья
Добавляй
Вывод:
Грамотно настроенный GitHub Actions экономит время и снижает головную боль. Избегай монолитных пайплайнов, кэшируй умно и тестируй только то, что нужно. Автоматизация — это про контроль, а не хаос.
#devops #девопс
GitHub Actions — мощный инструмент, но без оптимизации ваш пайплайн легко превратится в тормозную мясорубку. Разбираемся, как выжать максимум из CI/CD на GitHub.
Почему это важно:
Быстрые и надёжные пайплайны — ключ к высокой скорости доставки. Медленные сборки = потеря времени, нервов и денег.
1. Кэшируй разумно
Используй
actions/cache
для ускорения зависимостей, но не кэшируй всё подряд. Пример для Node.js:
- uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
⚠️ Ключ должен быть завязан на lock-файлы, иначе можно словить конфликты версий.
2. Делай job-ы параллельными
Разделяй пайплайн на независимые шаги — unit-тесты, линтеры, сборка. Добавляй
needs:
там, где реально нужно, а не везде.3. Matrix strategy — must-have
Хочешь тестировать на разных версиях языка/ОС? Используй
matrix
:
strategy:
matrix:
node-version: [16, 18, 20]
Это масштабирует проверку без дублирования кода.
4. Отключи ненужные события
Не запускай воркфлоу на каждом чихе. Используй
on:
грамотно:
on:
push:
branches:
- main
pull_request:
paths:
- 'src/**'
Это поможет не перегружать runners.
5. Используй
workflow_dispatch
для ручных запусков Иногда надо протестить пайплайн руками — не бойся добавить ручной триггер:
on:
workflow_dispatch:
6. Логи и таймауты — твои друзья
Добавляй
timeout-minutes
к job-ам и выводи ключевые логи через ::group::
и ::endgroup::
, чтобы не утонуть в консоли.Вывод:
Грамотно настроенный GitHub Actions экономит время и снижает головную боль. Избегай монолитных пайплайнов, кэшируй умно и тестируй только то, что нужно. Автоматизация — это про контроль, а не хаос.
#devops #девопс