Библиотека девопса | DevOps, SRE, Sysadmin
Все самое полезное для девопсера в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/25874ec4 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/6798b4e4509aba56522d1787
إظهار المزيد📈 نظرة تحليلية على قناة تيليجرام Библиотека девопса | DevOps, SRE, Sysadmin
تُعد قناة Библиотека девопса | DevOps, SRE, Sysadmin (@devopsslib) في القطاع اللغوي الروسية لاعباً نشطاً. يضم المجتمع حالياً 10 421 مشتركاً، محتلاً المرتبة 11 856 في فئة التكنولوجيات والتطبيقات والمرتبة 62 948 في منطقة روسيا.
📊 مؤشرات الجمهور والحراك
منذ تأسيسه في невідомо، حقق المشروع نمواً سريعاً وجمع 10 421 مشتركاً.
بحسب آخر البيانات بتاريخ 12 يونيو, 2026، تحافظ القناة على نشاط مستقر. خلال آخر 30 يوماً تغيّر عدد الأعضاء بمقدار -3، وفي آخر 24 ساعة بمقدار -2، مع بقاء الوصول العام مرتفعاً.
- حالة التحقق: غير موثّقة
- معدل التفاعل (ER): يبلغ متوسط تفاعل الجمهور 8.76%. وخلال أول 24 ساعة من النشر يحصد المحتوى عادةً 5.32% من ردود الفعل نسبةً إلى إجمالي المشتركين.
- وصول المنشورات: يحصل كل منشور على متوسط 914 مشاهدة. وخلال اليوم الأول يجمع عادةً 555 مشاهدة.
- التفاعلات والاستجابة: يتفاعل الجمهور بانتظام؛ متوسط التفاعلات لكل منشور يبلغ 4.
- الاهتمامات الموضوعية: يركز المحتوى على مواضيع رئيسية مثل devops'a, навигация, скрипт, docker, git.
📝 الوصف وسياسة المحتوى
يصف المؤلف القناة بأنها مساحة للتعبير عن الآراء الذاتية:
“Все самое полезное для девопсера в одном канале.
По рекламе: @proglib_adv
Учиться у нас: https://proglib.io/w/25874ec4
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/6798b4e4509aba56522d1787”
بفضل وتيرة التحديث المرتفعة (أحدث البيانات بتاريخ 13 يونيو, 2026) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.
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
#арсенал_инженераapiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list"]Добавьте Pod Security Standards:
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
pod-security.kubernetes.io/enforce: restricted
Теперь в namespace нельзя запустить контейнер от root, с privileged, без securityContext.
Если нужна более гибкая политика — Kyverno или OPA Gatekeeper. Напишете правило один раз — оно будет работать для всех подов.
🐸 Библиотека devops'a
#арсенал_инженераapiVersion: v1
kind: Service
metadata:
name: backend
spec:
selector:
app: backend
ports:
- port: 80
targetPort: 8080
Разберитесь, как поды находят друг друга через DNS. Как ClusterIP балансирует запросы. Как работает Ingress.
Когда поймёте базу, добавьте Ingress-NGINX для внешнего трафика.
🐸 Библиотека devops'a
#арсенал_инженера
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
