Библиотека девопса | DevOps, SRE, Sysadmin
Все самое полезное для девопсера в одном канале. Наши курсы: https://clc.to/ZJ7Z1w По рекламе: @tproger_sales_bot Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/6798b4e4509aba56522d1787 Заявка: 8137718351
Show more📈 Analytical overview of Telegram channel Библиотека девопса | DevOps, SRE, Sysadmin
Channel Библиотека девопса | DevOps, SRE, Sysadmin (@devopsslib) in the Russian language segment is an active participant. Currently, the community unites 10 336 subscribers, ranking 11 813 in the Technologies & Applications category and 61 444 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 10 336 subscribers.
According to the latest data from 29 October, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -47 over the last 30 days and by -3 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 10.47%. Within the first 24 hours after publication, content typically collects 4.97% reactions from the total number of subscribers.
- Post reach: On average, each post receives 1 082 views. Within the first day, a publication typically gains 514 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 1.
- Thematic interests: Content is focused on key topics such as devops'a, навигация, скрипт, docker, git.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“Все самое полезное для девопсера в одном канале.
Наши курсы: https://clc.to/ZJ7Z1w
По рекламе: @tproger_sales_bot
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/6798b4e4509aba56522d1787
Заявка: 8137718351”
Thanks to the high frequency of updates (latest data received on 30 October, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
FROM node:22
# Создаем пользователя appuser
RUN useradd -m appuser
# Переключаемся на пользователя appuser
USER appuser
CMD ["node", "server.js"]
Такой подход соответствует принципу наименьших привилегий и помогает защитить вашу систему от потенциальных угроз.
🐸 Библиотека devops'a
#root@prompt[Unit] Description=Пример сервиса [Service] ExecStart=/usr/bin/your-app Restart=always [Install] WantedBy=multi-user.targetsystemd стал де-факто стандартом для большинства дистрибутивов Linux благодаря своей функциональности и удобству. Он избавляет от множества рутинных операций и упрощает управление системой. 🐸 Библиотека devops'a #арсенал_инженера
export TEST_SCHEMA="t_$(uuidgen | tr -d '-')"
psql -c "CREATE SCHEMA ${TEST_SCHEMA};"
pytest --db-schema="${TEST_SCHEMA}" ; rc=$?
psql -c "DROP SCHEMA ${TEST_SCHEMA} CASCADE;"
exit $rc
Схема создаётся перед тестами, используется, например, в pytest через параметр --db-schema, а затем удаляется.
🐸 Библиотека devops'a
#root@promptname: Jira Triggered Job
on:
repository_dispatch:
types: [jira-trigger]
jobs:
handle-trigger:
runs-on: ubuntu-latest
steps:
# Парсим labels из payload'a
- name: Parse Jira event
id: parse
run: |
LABELS="${{ fromJSON(github.event.client_payload).labels }}"
ISSUE="${{ fromJSON(github.event.client_payload).issueKey }}"
echo "issue=$ISSUE" >> $GITHUB_OUTPUT
echo "labels=$LABELS" >> $GITHUB_OUTPUT
echo "Получены labels: $LABELS для issue: $ISSUE"
# Если в labels есть 'rebuild-docker', запускаем пересборку
- name: Rebuild Docker
if: contains(steps.parse.outputs.labels, 'rebuild-docker')
run: |
echo "🐳 Пересобираем Docker для ${{ steps.parse.outputs.issue }}"
docker build -t myapp:latest .
docker push myapp:latest
echo "DOCKER_STATUS=✅ Docker образ успешно пересобран" >> $GITHUB_ENV
# Если в labels есть 'run-tests', запускаем тесты
- name: Run Tests
if: contains(steps.parse.outputs.labels, 'run-tests')
run: |
echo "✅ Запускаем тесты для ${{ steps.parse.outputs.issue }}"
npm test
echo "TESTS_STATUS=✅ Тесты пройдены успешно" >> $GITHUB_ENV
# Если в labels есть 'security-scan', запускаем проверку безопасности
- name: Security Scan
if: contains(steps.parse.outputs.labels, 'security-scan')
run: |
echo "🔒 Security scan для ${{ steps.parse.outputs.issue }}"
npm audit
echo "SECURITY_STATUS=✅ Security scan завершен" >> $GITHUB_ENV
# Пишем результаты комментарием в Jira
- name: Comment in Jira
if: always()
uses: actions/github-script@v7
with:
script: |
const issue = context.payload.client_payload.issueKey;
const labels = context.payload.client_payload.labels;
let comment = '🤖 Автоматизированные действия:\n\n';
if (labels.includes('rebuild-docker')) {
comment += '✅ rebuild-docker: Docker образ пересобран\n';
}
if (labels.includes('run-tests')) {
comment += '✅ run-tests: Тесты запущены\n';
}
if (labels.includes('security-scan')) {
comment += '✅ security-scan: Проверка безопасности завершена\n';
}
Затем добавьте триггер в Jira, который будет отправлять пейлод:
{
"event_type": "jira-trigger",
"client_payload": {
"issueKey": "{{issue.key}}",
"labels": "{{issue.labels}}"
}
}
на урл:
https://api.github.com/repos/ВАШ_НИК/ВАШ_РЕПО/dispatchesс headers:
Authorization: token ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxx Accept: application/vnd.github.v3+raw+json Content-Type: application/jsonЗамените ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxx на ваш GitHub токен, который можно получить по пути GitHub → Settings → Developer settings → Personal access tokens → Tokens. Это особенно полезно в больших командах, где не все имеют доступ к GitHub Actions, но все работают с Jira. QA может добавить security-scan — и проверка запустится автоматически. 🐸 Библиотека devops'a #арсенал_инженера
kubelet выполняет аккуратное завершение: отправляет SIGTERM, ждёт до истечения terminationGracePeriodSeconds, останавливает контейнеры, размонтирует тома и сетевые пространства имён. Финальный шаг — удаление пода с ноды и из API.
Но если размонтирование не удаётся из-за ошибки "device or resource busy", процесс завершения зависает. API-объект остаётся в лимбо состояния Terminating навсегда.
Корень проблемы обычно один: рантайм контейнера оставил утечку — смонтированный том или процесс, который по-прежнему держит файловые дескрипторы.
Быстрая диагностика
Посмотреть есть ли на поде финализаторы:
kubectl get pod <POD> -o jsonpath='{.metadata.finalizers}'
Если они есть — не рубите их сплеча. Это обычно finalizer-ы хранилища (PVC, CSI), которые блокируют удаление до завершения очистки.
Нет финализаторов? Тогда ищем утечку монтирования на уровне хоста.
Подключитесь к ноде, где запускался под:
POD=pod-186o2
NS=default
UID=$(kubectl get pod $POD -n $NS -o jsonpath='{.metadata.uid}')
# На ноде смотрим, что смонтировано
grep -F "$UID" /proc/mounts || true
findmnt | grep "$UID" || true
Если видите записи типа /var/lib/kubelet/pods/<UID>/volumes/... — это ваш виновник.
Теперь узнаем, кто держит монтирование:
lsof +D /var/lib/kubelet/pods/$UID 2>/dev/null | head
Чистим руками
Для Docker:
docker ps --no-trunc | grep $POD
docker stop <containerID>
# Если совсем ничего не помогает (лаха!):
systemctl restart docker
Для containerd:
crictl ps | grep $POD
crictl stopp <containerID>
crictl rmp <containerID>
# Последняя линия защиты:
systemctl restart containerd
Если контейнер мёртв, но монтирование остаётся:
umount -l /var/lib/kubelet/pods/$UID/volumes/<driver>/<vol> || true
Теперь, когда освободили держание:
kubectl delete pod $POD -n $NS
Если всё ещё не уходит:
kubectl delete pod $POD -n $NS --grace-period=0 --force
Это API-уровневый молот. Безопасен для очистки зависшей записи, но используйте только после того, как разобрались с утечками на ноде. С особой осторожностью для StatefulSet.
Видите Terminating, который не уходит? Не спешите с --force. В девяти случаях из десяти kubelet вам что-то говорит: что-то остаётся смонтированным или используется.
🐸 Библиотека devops'a
#арсенал_инженера