Bash Days | Linux | DevOps
Авторский блог от действующего девопса Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу. Автор: Роман Шубин Реклама: @maxgrue MAX: https://max.ru/bashdays Курс: @tormozilla_bot Блог: https://bashdays.ru
نمایش بیشتر📈 تحلیل کانال تلگرام Bash Days | Linux | DevOps
کانال Bash Days | Linux | DevOps (@bashdays) در بخش زبانی روسی بازیگری فعال است. در حال حاضر جامعه شامل 23 741 مشترک است و جایگاه 5 571 را در دسته فناوری و برنامهها و رتبه 27 919 را در منطقه روسيا دارد.
📊 شاخصهای مخاطب و پویایی
از زمان ایجاد در невідомо، پروژه رشد سریعی داشته و 23 741 مشترک جذب کرده است.
بر اساس آخرین دادهها در تاریخ 30 ژوئیه, 2026، کانال فعالیت پایداری دارد. در ۳۰ روز گذشته تغییر اعضا برابر 7 و در ۲۴ ساعت گذشته برابر 0 بوده و همچنان دسترسی گستردهای حفظ شده است.
- وضعیت تأیید: تأیید نشده
- نرخ تعامل (ER): میانگین تعامل مخاطب 22.02% است و در ۲۴ ساعت نخست پس از انتشار، محتوا معمولاً 12.73% واکنش نسبت به کل مشترکان کسب میکند.
- دسترسی پستها: هر پست به طور میانگین 5 228 بازدید دریافت میکند. در اولین روز معمولاً 3 023 بازدید جمعآوری میشود.
- واکنشها و تعامل: مخاطبان بهطور فعال حمایت میکنند؛ میانگین واکنش به هر پست 22 است.
- علایق موضوعی: محتوا بر موضوعات کلیدی مانند bashdays, linux, bash, docker, скрипт تمرکز دارد.
📝 توضیح و سیاست محتوایی
نویسنده این فضا را محل بیان دیدگاههای شخصی توصیف میکند:
“Авторский блог от действующего девопса
Самобытно про разработку, devops, linux, скрипты, сисадминство, техдирство и за айтишную жизу.
Автор: Роман Шубин
Реклама: @maxgrue
MAX: https://max.ru/bashdays
Курс: @tormozilla_bot
Блог: https://bashdays.r...”
به لطف بهروزرسانیهای پرتکرار (آخرین داده در تاریخ 31 ژوئیه, 2026)، کانال همواره بهروز و دارای دسترسی بالاست. تحلیلها نشان میدهد مخاطبان بهطور فعال با محتوا تعامل دارند و آن را به نقطه اثرگذاری مهم در دسته فناوری و برنامهها تبدیل کردهاند.
Один день, 500 участников, 30+ докладов, 3 трека — концентрат практического опыта, знаний и инструментов, готовых к внедрению сразу по возвращению в офис. И, конечно, мега-возможности для нетворкинга с коллегами и экспертами сообщества!Что будем обсуждать? 🔘Инструменты и примеры отладки, виртуализации, оптимизации производительности 🔘Практический опыт оптимизации сетевых решений с DPDK 🔘Эффективные методы безопасной разработки ядра Linux 🔘Реальные кейсы создания драйверов на Rust 🔘Все про GPU, NPU, ASIC и как запускать AI на железе под Linux и не только. Как AI встраивается в современную разработку 🔘Современные подходы к разработке системного и embedded ПО Участие бесплатное, но количество мест ограничено — зарегистрируйтесь прямо сейчас💻 Ждем вас на крупнейшей конференции по разработке системного ПО и Linux в России! Реклама. ООО «Конференции Олега Бунина», ИНН: 7733863233, Erid: 2Vtzquk6F9T
Как говорится — Волков бояться, в лесу не ебаться!Пишем подопытный скрипт:
#!/usr/bin/env bash
set -e
temp=$(mktemp)
echo "Создал файл: $temp"
false
echo "Удаляю файл"
rm -f "$temp"
Чмодим, запускаем, ага скрипт упал на false, но успел создать временный файл в папке /tmp == /tmp/tmp.oWQ0HiYxSV. И он не удалился. Скрипт вернул статус == 1;
Код выходы проверить так:
echo "код: $?"
Здесь я взял синтетику, показать наглядно этот случай. Суть «темки» — подчищать за собой, при любых обстоятельствах, даже если скрипт вернул ошибку, либо завершился успешно.
Снова изобретать велосипед? Неа! Всё это работает из коробки.
#!/usr/bin/env bash
set -e
temp=$(mktemp)
echo "Создал файл: $temp"
trap 'echo "Удаляю $temp"; rm -f "$temp"' EXIT
echo "Эта строка уже не выполнится"
false
В этом случае скрипт также вернет код 1, но временный файл будет удалён при любом раскладе.
Нихуя непонятно, но очень интересно.
Смотри — trap вызывает rm ПРИ ВЫХОДЕ ИЗ СКРИПТА. И похуй с каким статусом был завершен скрипт. Временный файл будет гарантированно удалён.
Давай подключим strace:
strace -e trace=process,signal bash -c '
tmp=$(mktemp)
trap "rm -f $tmp" EXIT
echo "tmp=$tmp"
'
В выхлопе видим:
openat(AT_FDCWD, "/tmp/tmp.Dn2qG3uK9V", O_RDWR|O_CREAT|O_EXCL, 0600) = 3
rt_sigaction(SIGINT, {sa_handler=0x...}, NULL, 8) = 0
rt_sigaction(SIGTERM, {sa_handler=0x...}, NULL, 8) = 0
unlink("/tmp/tmp.Dn2qG3uK9V") = 0
exit_group(0) = ?
openat(... O_EXCL) — это mktemp, создающий файл атомарно
rt_sigaction() — Bash ставит ловушки для сигналов
unlink() — это и есть выполнение trap
exit_group(0) = ? — завершает процесс
То есть Bash вызывает rm/unlink() ДО выхода из процесса.
Почему trap срабатывает?
Если скрипт упал или получил сигнал kill -TERM <pid>, то на уровне Bash:
— в обработчике сигнала вызывается registered trap
— затем Bash падает/выходит
— trap УЖЕ успел выполнить команду очистки
trap выполняется ДО того, как процесс отдаст SIGTERM ядру, если только ловушка для этого сигнала была установлена.
Да банально при выполнении скрипта ты нажал CTRL+C, скрипт остановился, НО временные файлы сразу подчистились.
➡️ Про exit codes (коды выхода) писал тут. ➡️ Про сигналы писал ранее тут и тут и тут и тут.Вот такие пироги! С пятницей и хороших тебе предстоящих выходных! 🛠 #bash #debug #strace — 💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Как говорится — «Нам нужно досье на этого мисье»Давай сразу к примерам: ➡️ Non-privileged Ты ребёнок, тебя посадили в песочницу, дали совок и формочки, сказали — слышь еблан, играть можно только здесь! Ты можешь: — лепить куличики и кренделя — копать ямки и могилки для жуков — сыпать песочек в глаза другим детям — строить свой маленький мир Ты не можешь: — вылазить из песочницы — пойти на стройку и доебывать сторожа — насрать в ладошку и кидаться этим в людей — послать всех нахуй и сделать по своему Ты работаешь строго в пределах песочницы. Безопасно, предсказуемо, контролируемо, изолировано. Ты бездушный non-privileged контейнер. ➡️ Privileged Ты ребёнок, но всем на тебя поебать, ты сам выбираешь сидеть тебе в песочнице или кидаться с балкона кирпичами в пустые головы прохожих. У тебя развязаны руки, любые безумные поступки позволительны. У тебя есть ключи от всех дверей и тебе за это ничего не будет. Всё это происходит, когда ты запускаешь:
docker run --privileged
Твой контейнер может:
— управлять сетевыми интерфейсами хоста
— лезть в /dev
— монтировать что угодно куда угодно
— работать как полноценная виртуалка
— запускать systemd, модифицировать ядро, iptables, модули и т.п
То есть, это уже не ребёнок в песочнице, а ребёнок со швейцарским армейским ножом, запертый в серверной.
➡️ Non-privileged (обычный контейнер)
- Ограниченный доступ к Linux capabilities
- Нет доступа к аппаратным устройствам
- Нет прав на управление сетью хоста
- Запуск отдельных процессов, а не мини-ОС
- Работает в namespace'ах и cgroup'ах изоляции
Используется для:
- веб-сервисов
- приложений
- баз данных
- CI/CD runner’ов (если привилегия не нужна)
- всего, что «из коробки» работает в Docker
➡️ Privileged (контейнер-всевластия)
- Доступ ко всем Linux capabilities
- Может лезть в /dev, работать с устройствами
- Может менять сетевые интерфейсы хоста
- Может работать как виртуалка
- Может запускать systemd
- Может cломать или убить сеть, firewall и модули ядра
Используется для:
- контейнеров, которым нужны реальные устройства
- low-level инструментов: tcpdump, wireshark, iptables
- Docker-in-Docker в особых сценариях
- Kubernetes kubelet / CNI плагины
- экспериментов, когда нужно «полный root над всем»
Что выбрать?
Мой алгоритм:
Задача не требует низкоуровневых операций? ⚪ всегда non-privileged. Нужно одно конкретное действие (например NET_ADMIN)? ⚪ --cap-add вместо privileged. Нужен доступ к устройству? ⚪--device вместо полного доступа. Ничего из этого не помогает? ⚪ тогда уже --privileged.В большинстве случаев лучше выдать минимум необходимых прав, чем сразу открывать ящик пандоры. Ну и для отладки
privileged прям мастхев, чтобы исключить какие-то внешние факторы, от которых могут лезть баги.
На днях продолжим…
🛠 #linuxfactory #linux #docker
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 BlogOCI это способ запускать контейнеры из Docker-образов. То есть proxmox теперь умеет скачивать Docker-образы (OCI-images) и превращать их в LXC-контейнеры.А нахуя? Чтобы проще запускать приложения, которые уже существуют в виде Docker-образов. Теперь в LXC не нужно поднимать отдельно докер демон, все работает из коробки. Ладно, отвлеклись. Про OCI отдельно распишу. Сегодня обновляем всю эту трихомудию до нужной версии. Бекапить я ничего не буду, бекапы для слабаков. Но ты меня не слушай, делай правильно и подстилай соломку.
Даже если у меня всё пойдет по пиздец, это отличный кейс, чтобы отдебажить проблему и решить её.По классике сюда всё не влезло, поэтому гоу в блог читать продолжение 👇 🅰️🅰️🅰️🅰️🅰️🅰️🅰️🅰️ ➡️ https://two.su/4ui2c 🅰️🅰️🅰️🅰️🅰️🅰️🅰️🅰️ 🛠 #proxmox #devops #selfhosting — 💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576pvetui такое можно провернуть в два счета.
Ты скажешь — дак сделай алиасы для айпишников и цепляйся к нужным виртуалкам. Справедливо, но мне лень. Тем более виртуалки у меня постоянно создаются, удаляеются и я ебал каждый раз алиасы делать.Установка и запуск:
go install github.com/devnullvoid/pvetui/cmd/pvetui@latest
/home/user/go/bin/pvetui
Под другие ОС:
yay -S pvetui-bin
yay -S pvetui-git
brew install --cask devnullvoid/pvetui/pvetui
scoop bucket add pvetui https://github.com/devnullvoid/scoop-pvetui
scoop install pvetui
# либо из исходников
git clone https://github.com/devnullvoid/pvetui.git
cd pvetui
make install
При первом запуске утилита попросит сконфигурировать её. Жмем пару раз Enter, открывается редактор конфига, заполняем необходимые поля.
Я заполнил URL, логин и пароль от панели Proxmox. Чтобы оно не орало, нужно стереть данные в полях API, тогда оно даст сохранить конфигурационный файл.
Но опять же если у тебя API ключ, делаешь под своё конфигурацию.Инициализация, закончена, видим сообщение:
✅ Configuration is ready!
🔄 Please re-run 'pvetui' to start the application with your new configuration.
🚪 Exiting.
Запускаем морду и смотрим что получилось.
/home/user/go/bin/pvetui
Эту штуку можно повесить на alias либо прописать в PATH, чтобы полные пути до бинарника каждый раз не писать.
А получилось у нас прям заебись. Теперь я нажимаю ALT+2 и попадаю в список всех своих виртуальных машин. Стрелочками выбираю нужную мне машину и нажимаю букву «m», открывается менюшка.
В менюшке можно сразу провалиться в машину по SSH, что мне и нужно. Но это еще не всё, там и ребуты и миграции, даже VNC есть (нужен xdg). Короче базовый минимум поадминить присутствует.
Да, если нажать «ESC» то откроется еще одна глобальная менюшка для конфигурации самой утилиты, выбор профилей, управление плагинами и т.п.
Короче явки-ссылки я тебе дал, дальше сам смотри, всё там гибко конфигурируется и настраивается. И тем более TUI интерфейсы сейчас прям в трендах.
Хорошей тебе рабочей недели! Не болей!
🛠 #selfhosting #linux #devops
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 BlogЕсли запамятовал, то Karpenter это штука, разработанная AWS, которая позволяет масштабировать инфраструктуру и снижать затраты.Работает это так — сервис обладает информацией о доступных ресурсах и ценах, а далее автоматически подбирает конфиги в зависимости от твоих хотелок. Киллер-фича — создание оптимальных узлов под фактическую нагрузку, а не предварительное масштабирование определенных node groups. По итогу автоскейлинг становится быстрее, дешевле и умнее. Karpenter создает идеальные ноды под конкретные поды «на лету», а не выбирает из заранее заданных node groups. Мир меняется, технологии меняются. Установи Karpenter в Managed Kubernetes и оптимизируй расходы на инфраструктуру → https://slc.tl/hr1d3
Если Karpenter молчит — это не значит, что он завис. Это значит, что он думает, как сделать ещё дешевле. 🥳Реклама, АО «Селектел», erid: 2VtzqvvWPbP
Дело пахнет писюнами…Короче, это — Multipass от Canonical. И да, полностью бесплатная и с мордой. ㅤ Выдумать ничего не буду, лови нативку с сайта:
ПолучитеРаботает под Linux, Wiundows, Mac Что же это за зверь? Multipass использует доступный гипервизор в зависимости от платформы: - Linux — KVM - macOS — HyperKit или QEMU - Windows — Hyper-V или VirtualBox (в новых версиях QEMU) Можно управлять как через морду, так и через командную строку. Это развязывает руки. Например, можно накодить себе bash скрипт и через него поднимать виртуалки под лабы. Чё прикольно, для него есть Terraform провайдер, ну прям не инструмент, а золото.по ебалумгновенную виртуальную машину Ubuntu с помощью одной команды. Multipass может запускать виртуальные машины и настраивать их с помощью cloud-init, как в общедоступном облаке. Прототип вашего облака запускается локально и бесплатно.
terraform {
required_providers {
multipass = {
source = "larstobi/multipass"
version = "~> 1.4.2"
}
}
}
Работает элементарно, если через морду — выбираешь дистрибутив, накручиваешь ползунки и жмешь Launch, через 40 секунд у тебя готовая виртуалка.
Ну либо headless (через командную):
Основные команды:
multipass launch --name foo
multipass exec foo -- lsb_release -a
multipass list
multipass stop foo bar
multipass start foo
multipass delete bar
multipass purge
multipass find
multipass launch -n bar --cloud-init cloud-config.yaml
multipass help
Из дистрибутивов только Ubuntu, но этого достаточно чтобы что-то протестировать либо погонять. Ребята в LF активно этим инструментом пользуются и создают тестовые кубер-кластера, ну и ансибл оттачивают.
Настроек там жопой ешь, так что можно и статические айпишники мутить, выбирать сетевые режимы и многое другое.
В общем рекомендую, инструмент зачетный, никакой ёбли как VBox и VMWare.
🛠 #devops #vm #linux
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blogstages:
- deploy
variables:
ENVIRONMENT:
description: "Deployment environment"
value: "N/A"
options:
- "N/A"
- "STAGE"
- "PRODUCTION"
deploy:
stage: deploy
script:
- echo "Выбрано окружение:" "${ENVIRONMENT}"
rules:
- when: manual
Это кусок НО — этот список перестал появляться. Причем избрано, у кого-то есть, у кого-то хуй с маслом.Ошибок синтаксиса в ямликах нет, каких-то разумных сообщений и наводок от гитлаба тоже нет. Чё делать? ➡️ Решение Идем:
Settings → CI/CD → Variables и кликаем в радио-батон — Developer.
Всё! Теперь выпадающие списки вновь начинают работать.
А еще людей смущает новая штука inputs, которая совсем недавно появилась. Работает она с 17й версии.
spec:
inputs:
environment:
description: "Куда деплоим?"
type: string
default: "N/A"
options:
- "N/A"
- "STAGE"
- "PRODUCTION"
---
stages:
- deploy
deploy:
stage: deploy
rules:
- when: manual
script:
- echo "Выбрано окружение: $[[ inputs.environment ]]"
Оно будет пиздеть во внутреннем редакторе - Incorrect type. Expected "string | array".yaml-schema, но будет работать если запустить пайплайн.
Ошибка возникает, потому, что Pipeline Editor использует старый YAML-валидатор. Так что, не обращай внимание на этот пиздёж.А зачем нам этот input ведь с options и так всё работает? Ну хотя бы из-за типизированных параметров:
type: string | number | boolean | array
То есть:
- можно сделать чекбокс (boolean)
- можно сделать список (array)
- можно сделать ограничение по диапазону (number)
- можно сделать строгие варианты (options)
- можно сделать regex-валидацию
А обычный variables такого не умеют.
GitLab постепенно превращает CI в настоящий «Pipeline as Functions».
Например, в проекте А:
spec:
inputs:
env:
type: string
options: [stage, prod]
---
deploy-job:
script: deploy_to $[[ inputs.env ]]
И проекте B можно вызвать:
deploy:
trigger:
project: A
inputs:
env: prod
Это как вызов функции с аргументом.
Что еще:
- Inputs работают даже при trigger-пайплайнах
- Inputs могут быть required
- Inputs отображаются отдельно и аккуратно в UI
- Inputs часть нового стандарта GitLab CI Components
Короче одни плюсы. Но есть большое НООООО!
Это пиздец усложняет процесс разработки и отладку пайплайна.
Да, стало удобнее и гибче, но всё это превращается в безумное ООП, где без базы и документации к проекту — ты хуй разберешься.
Пока тебе хватает обычных options используй их. Не лезь в это ООП, оно пока рано и избыточно, особенно если ты новичок.
Изучай!
Как говорится — и не такие метели в ебало летели!
🛠 #devops #cicd #linuxfactory
—
💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog⚪ Последнее время активно занимается мониторингом, особенно Zabbix, хотя может и в пром с графаной
⚪Помогал мне тестировать и писать шаблоны для PVE/PBS и эта штука с небольшими видоизменениями с 6го заббикса стала официальной
⚪Отлично разбирается в Linux, с закрытыми глазами разберет и соберет ядро с учетом нюансов железа и ПО
⚪Кубер не уважает, к ансиблистам относится очень настороженно
⚪Владеет светлой магией Bash, тёмной магией Perl, и немного PythonКонтакт: @egoza73 🛠 #кандидаты #кадры — 💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
Вредный совет: Если тебя спрашивают — где разместить инфраструктуру, предложи случайный и непроверенный хостинг из гугла, пусть страдают!А если серьёзно — никакой магии. Советуй надёжного провайдера с 17-летним опытом, шестью ЦОДами и инфраструктурой под любые нужды — и получай до 15% на баланс.
На эти 15% арендуешь сервачок и бесплатно хостишь на нём свой личный блог про девопс-потуги и разработку. Ну или гоняешь пайплайны в личном гитлабе.В партнерской программе Selectel всё честно, прозрачно и самое главное — надежно! Проверял сам. Год назад я ради интереса залетел в программу, и знаешь, зашло! Так что потыкай, за спрос не ударят в нос: Зарегистрироваться: https://slc.tl/mtgzq 😇🙂🙃😉😌😍🥰😘 😗😙😚😋😛😝😜🤪 🤨🧐🤓😎🤩🥳😏😒 😞😔😟😕🙁☹️😣😖 😫😩🥺😢😭😤😠😡 Серверы крутятся — проценты мутятся! в ссылке моей рефки нет, так что не ссы — навариваться на тебе я не стану… Реклама, АО «Селектел», erid: 2VtzqxCY6hn
0.30 1.20 0.80
1. За последнюю 1 минуту средняя очередь = 0.30
2. за 5 минут = 1.20
3. за 15 минут = 0.80
Сразу куча вопросов, а что такое «очередь»?
«очередь» == количество задач, которые хотят работать прямо сейчас, но процессоров не хватает, чтобы заняться всеми сразу.
➡️ Главное правило
Сравниваем Load Average с количеством ядер.
- У тебя 4 ядра → нормальная нагрузка = до 4.0
- У тебя 1 ядро → нормальная нагрузка = до 1.0
- У тебя 8 ядер → нормальная нагрузка = до 8.0
🟢 Всё в порядке: - LA ≤ количество ядер → CPU успевает всё делать, очередей нет. 🟡 Чёт уже не то, подгрузилось: - LA ≈ количество ядер × 1–2 → процессы начинают стоять в очереди, но система пока еще жива. 🔴 Жопа: - LA сильно > количества ядер → процессы стоят в очереди, всё тормозит.➡️ Теперь на котиках Ты стоишь в магазине: - 1 касса, 1 человек в очереди → заебись - 1 касса, 10 человек в очереди → жопа - 4 кассы, 6 человек → пока норм CPU = кассы, Load Average == очередь. LA это не про загрузку CPU в процентах — это просто «очередь». ➡️ Как задебажить Берем top, htop или подобное и смотрим столбец %CPU, если один процесс жрёт 100% на однопроцессорной системе — он пидарас и забил ядро. Если процесс жрёт 300% на 4-ядерной — он занял 3 ядра. Смотрим самых прожорливых пидарасов:
ps aux --sort=-%cpu | head
Если ничего не нашел, то смотрим в сторону:
- I/O wait — медленный диск / много дисковых операций
- много процессов, но каждый почти ничего не ест (fork storm)
- сеть или блокировки
Капля в море, но это базовый чеклист на ситуацию, когда сервер ушел в «полку».
А ты добавляй в комменты, что еще можно вынести в дебаг, будет полезно.🛠 #linix #devops — 💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
angie, на этот раз посмотрим на Status Page, которая отображает всю статистику по веб-серверу. Выглядит прям хорошо.
ㅤ
Устанавливаем пакет:
sudo apt install angie-console-light
В папке /usr/share/angie-console-light/html появляется статика.
Добавляем локейшен:
location /console/ {
auto_redirect on;
alias /usr/share/angie-console-light/html/;
index index.html;
location /console/api/ {
api /status/;
}
}
Теперь открываем в браузере и видим красивую мордочку. Демо мордочки можешь посмотреть здесь.
Да, не забываем включить Basic Auth чтобы хитрожопые не подглядывали.
У меня на паре пет проектов эта морда включена (графана избыточна), чисто посмотреть статусы раз в сутки, которые возвращают 500ку. Если оно горит красным, значит что-то где-то пошло по пизде.Подробнее читай в официальной документации. 🛠 #angie #devops — 💬 Bashdays 📲 MAX 🌐 LF 🔵 Blog
