<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Prometheus on DevOps-инженер &amp; CloudAdmin</title><link>https://ruadmin.root.sx/ru/tags/prometheus/</link><description>Recent content in Prometheus on DevOps-инженер &amp; CloudAdmin</description><generator>Hugo -- gohugo.io</generator><language>ru-RU</language><atom:link href="https://ruadmin.root.sx/ru/tags/prometheus/index.xml" rel="self" type="application/rss+xml"/><item><title>CI/CD и инфраструктура для Dating-сервиса</title><link>https://ruadmin.root.sx/ru/posts/cicd/ci-cd-dating/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruadmin.root.sx/ru/posts/cicd/ci-cd-dating/</guid><description>&lt;h2 id="инфраструктура-и-cicd-для-продакшен-запуска-dating-сервиса"&gt;Инфраструктура и CI/CD для продакшен запуска Dating-сервиса&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="клиент"&gt;Клиент&lt;/h4&gt;
&lt;p&gt;Dating-сервис Puzzle Master&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="задача"&gt;Задача&lt;/h4&gt;
&lt;p&gt;Стартап разработал бэкенд на Nest.js + фронтенд на Angular и был готов к запуску, но не имел никакой инфраструктуры: деплой был ручным, не было CI/CD, мониторинга, бэкапов и разделения dev/prod окружений. Требовалось выстроить полный DevOps-стек с нуля под продакшен.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="решение"&gt;Решение&lt;/h4&gt;
&lt;h6 id="1-контейнеризация-приложения"&gt;1. Контейнеризация приложения&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Multi-stage Dockerfile для backend (Nest.js + Prisma, non-root пользователь)&lt;/li&gt;
&lt;li&gt;Multi-stage Dockerfile для frontend (Angular 12, legacy OpenSSL, Nginx для статики)&lt;/li&gt;
&lt;li&gt;Docker Compose с полным стеком: PostgreSQL 15, Redis 7, imgproxy, Nginx&lt;/li&gt;
&lt;li&gt;Healthchecks и &lt;code&gt;depends_on&lt;/code&gt; для правильного порядка запуска&lt;/li&gt;
&lt;li&gt;Раздельные окружения dev и prod в &lt;code&gt;/opt/dev&lt;/code&gt; и &lt;code&gt;/opt/prod&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="2-gitlab-cicd"&gt;2. GitLab CI/CD&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Миграция репозиториев с Bitbucket на GitLab&lt;/li&gt;
&lt;li&gt;Пайплайны для backend и frontend: build → push → deploy&lt;/li&gt;
&lt;li&gt;GitLab Container Registry для хранения Docker образов&lt;/li&gt;
&lt;li&gt;Автоматический деплой в dev, ручной trigger для prod&lt;/li&gt;
&lt;li&gt;SSH деплой на VPS через &lt;code&gt;SSH_PRIVATE_KEY&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="3-nginx-reverse-proxy"&gt;3. Nginx Reverse Proxy&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Универсальный конфиг через &lt;code&gt;envsubst&lt;/code&gt; для dev/prod&lt;/li&gt;
&lt;li&gt;SSL/TLS (TLSv1.2, TLSv1.3) с сертификатами Cloudflare&lt;/li&gt;
&lt;li&gt;Проксирование &lt;code&gt;/api/*&lt;/code&gt; → backend:4000, &lt;code&gt;/*&lt;/code&gt; → frontend:80&lt;/li&gt;
&lt;li&gt;Редирект www → основной домен (301)&lt;/li&gt;
&lt;li&gt;Отдельный стек imgproxy с SSL терминацией&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="4-безопасность-ansible"&gt;4. Безопасность (Ansible)&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Настройка сервера через Ansible: SSH только по ключам, отключён root&lt;/li&gt;
&lt;li&gt;UFW Firewall: открыты только порты 80, 443, кастомный SSH&lt;/li&gt;
&lt;li&gt;Доступ к БД только через SSH Tunnel (Beekeeper Studio)&lt;/li&gt;
&lt;li&gt;Секреты в переменных GitLab CI/CD&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="5-мониторинг"&gt;5. Мониторинг&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Prometheus + Grafana с автоматическим провижинингом дашбордов&lt;/li&gt;
&lt;li&gt;Exporters: Node, cAdvisor, Postgres, Redis, Nginx, Blackbox&lt;/li&gt;
&lt;li&gt;5 Grafana дашбордов: сервер, Docker контейнеры, PostgreSQL, Redis, Nginx&lt;/li&gt;
&lt;li&gt;Alertmanager с интеграцией в Telegram, алерты на CPU/RAM/Disk/API/SSL&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="6-бэкапы-бд"&gt;6. Бэкапы БД&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Автоматический &lt;code&gt;pg_dump&lt;/code&gt; каждый час&lt;/li&gt;
&lt;li&gt;Сжатие gzip и загрузка в Cloudflare R2 (S3-compatible)&lt;/li&gt;
&lt;li&gt;Prometheus метрики бэкапов: успех, размер, timestamp&lt;/li&gt;
&lt;li&gt;Алерты: &lt;code&gt;DatabaseBackupMissing&lt;/code&gt;, &lt;code&gt;DatabaseBackupFailed&lt;/code&gt;, DatabaseBackupSize`Anomaly&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="технологии"&gt;Технологии&lt;/h4&gt;
&lt;div class="row"&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/gitlab-original.svg" alt="GitLab"&gt;&lt;div&gt;GitLab CI&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/docker-original.svg" alt="Docker"&gt;&lt;div&gt;Docker&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/ansible-original.svg" alt="Ansible"&gt;&lt;div&gt;Ansible&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/prometheus-original.svg" alt="Prometheus"&gt;&lt;div&gt;Prometheus&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/nginx.svg" alt="Nginx"&gt;&lt;div&gt;Nginx&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/postgresql.svg" alt="PostgreSQL"&gt;&lt;div&gt;PostgreSQL&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h4 id="результаты"&gt;Результаты&lt;/h4&gt;
&lt;p&gt;✅ &lt;strong&gt;Деплой:&lt;/strong&gt; git push в main → автоматическая сборка и деплой на сервер&lt;br&gt;
✅ &lt;strong&gt;Окружения:&lt;/strong&gt; полное разделение dev и prod на одном VPS&lt;br&gt;
✅ &lt;strong&gt;Мониторинг:&lt;/strong&gt; 5 дашбордов, алерты в Telegram по 6 категориям&lt;br&gt;
✅ &lt;strong&gt;Бэкапы:&lt;/strong&gt; автоматический &lt;code&gt;pg_dump&lt;/code&gt; каждый час в Cloudflare R2&lt;br&gt;
✅ &lt;strong&gt;Безопасность:&lt;/strong&gt; UFW, SSH по ключам, БД закрыта извне&lt;br&gt;
✅ &lt;strong&gt;Масштабируемость:&lt;/strong&gt; архитектура готова к выносу БД на отдельный сервер&lt;/p&gt;</description></item><item><title>CI/CD и инфраструктура для веб-приложения</title><link>https://ruadmin.root.sx/ru/posts/cicd/ci-cd-js/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruadmin.root.sx/ru/posts/cicd/ci-cd-js/</guid><description>&lt;h2 id="инфраструктура-и-cicd-для-сайта-компании"&gt;Инфраструктура и CI/CD для сайта компании&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="клиент"&gt;Клиент&lt;/h4&gt;
&lt;p&gt;Компания-производитель фирменных исследовательских продуктов, которой требовался сайт для публикации каталога продукции&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="задача"&gt;Задача&lt;/h4&gt;
&lt;p&gt;Разработчики написали код обычного веб-приложения (backend NestJS + frontend Next.js), но инфраструктура полностью отсутствовала: деплой выполнялся вручную, не было CI/CD, настроенного сервера, мониторинга, бэкапов и разделения тестового и боевого окружений. Требовалось выстроить полный DevOps-стек с нуля: GitLab CI/CD, собственный сервер, два изолированных контура, HTTPS, мониторинг, оповещения и автоматические бэкапы.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="решение"&gt;Решение&lt;/h4&gt;
&lt;h6 id="1-подготовка-сервера-и-безопасность"&gt;1. Подготовка сервера и безопасность&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;VPS на Ubuntu 24.04: 4 vCPU, 6 ГБ RAM, 120 ГБ диск&lt;/li&gt;
&lt;li&gt;SSH только по ключам, отключён root, выделенный деплой-пользователь (sudo + docker)&lt;/li&gt;
&lt;li&gt;UFW Firewall: открыты только порты 80, 443, 22 и SFTP (2222/2223)&lt;/li&gt;
&lt;li&gt;Автоматические обновления безопасности (unattended-upgrades)&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="2-gitlab-cicd"&gt;2. GitLab CI/CD&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Self-hosted GitLab с групповым Container Registry&lt;/li&gt;
&lt;li&gt;Пайплайны для backend и frontend: build → push → deploy&lt;/li&gt;
&lt;li&gt;Привязка веток: &lt;code&gt;test&lt;/code&gt; → образ &lt;code&gt;:test&lt;/code&gt; → контур test; &lt;code&gt;master&lt;/code&gt; → образ &lt;code&gt;:latest&lt;/code&gt; → контур prod; теги &lt;code&gt;v*&lt;/code&gt; → релизные сборки; &lt;code&gt;dev&lt;/code&gt; → только сборка&lt;/li&gt;
&lt;li&gt;SSH-деплой на сервер через &lt;code&gt;SSH_PRIVATE_KEY&lt;/code&gt;, секреты в Protected CI-переменных&lt;/li&gt;
&lt;li&gt;Инфраструктурный репозиторий &lt;code&gt;server-devops&lt;/code&gt; с джобой &lt;code&gt;deploy-all&lt;/code&gt;: жёсткий сброс к origin + &lt;code&gt;docker compose up -d --pull always&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="3-docker-compose-и-контуры"&gt;3. Docker Compose и контуры&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Три compose-файла: &lt;code&gt;app/&lt;/code&gt; (test), &lt;code&gt;app-prod/&lt;/code&gt; (prod), &lt;code&gt;monitoring/&lt;/code&gt; на общей Docker-сети&lt;/li&gt;
&lt;li&gt;Сервисы каждого контура: backend NestJS, frontend Next.js, PostgreSQL 16, pgAdmin, SFTP&lt;/li&gt;
&lt;li&gt;Политика рестарта &lt;code&gt;on-failure:10&lt;/code&gt; для всех контейнеров приложений&lt;/li&gt;
&lt;li&gt;Все конфиги, дашборды и правила — в git, применяются пайплайном&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="4-reverse-proxy-и-https"&gt;4. Reverse Proxy и HTTPS&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Единый reverse proxy &lt;code&gt;nginx-proxy&lt;/code&gt; + &lt;code&gt;acme-companion&lt;/code&gt; на портах 80/443&lt;/li&gt;
&lt;li&gt;Автоматические сертификаты Let&amp;rsquo;s Encrypt с автопродлением&lt;/li&gt;
&lt;li&gt;Все точки входа только по HTTPS: основной сайт, тестовый контур, панель управления БД, мониторинг&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="5-мониторинг-и-алерты"&gt;5. Мониторинг и алерты&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Prometheus + Grafana с автоматическим провижинингом дашбордов из git (4 дашборда: cAdvisor, Node Exporter, Logs/App, PostgreSQL)&lt;/li&gt;
&lt;li&gt;Exporters: node, cAdvisor, postgres, nginx (stub_status + access-лог: RPS, 4xx/5xx, время ответа/апстримов), HTTP-пробы blackbox для frontend/backend&lt;/li&gt;
&lt;li&gt;Alertmanager с интеграцией в Telegram — один бот, отдельные чаты на каждый контур (test / prod)&lt;/li&gt;
&lt;li&gt;Правила алертов: падение сервисов, высокая нагрузка CPU/RAM/диск (&amp;gt;80%), циклы рестартов, ошибки 5xx backend&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="6-логирование-и-бэкапы"&gt;6. Логирование и бэкапы&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Loki + Promtail: логи всех контейнеров собираются и доступны в Grafana (Logs Drilldown)&lt;/li&gt;
&lt;li&gt;Автоматический скрипт бэкапа: &lt;code&gt;pg_dump&lt;/code&gt; БД prod + tar-стрим тома загрузок prod в единый архив&lt;/li&gt;
&lt;li&gt;Ротация 30 дней, ежедневный cron в 03:00, процедура восстановления проверена и задокументирована&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="технологии"&gt;Технологии&lt;/h4&gt;
&lt;div class="row"&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/gitlab-original.svg" alt="GitLab"&gt;&lt;div&gt;GitLab CI&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/docker-original.svg" alt="Docker"&gt;&lt;div&gt;Docker&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/prometheus-original.svg" alt="Prometheus"&gt;&lt;div&gt;Prometheus&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/grafana-original.svg" alt="Grafana"&gt;&lt;div&gt;Grafana&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/nginx.svg" alt="Nginx"&gt;&lt;div&gt;Nginx&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/postgresql.svg" alt="PostgreSQL"&gt;&lt;div&gt;PostgreSQL&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h4 id="результаты"&gt;Результаты&lt;/h4&gt;
&lt;p&gt;✅ &lt;strong&gt;Деплой:&lt;/strong&gt; merge в master → автоматическая сборка, публикация и деплой на сервер&lt;br&gt;
✅ &lt;strong&gt;Окружения:&lt;/strong&gt; полное разделение test и prod на одном VPS через общую Docker-сеть&lt;br&gt;
✅ &lt;strong&gt;HTTPS:&lt;/strong&gt; все сервисы только по HTTPS с автоматическими сертификатами Let&amp;rsquo;s Encrypt&lt;br&gt;
✅ &lt;strong&gt;Мониторинг:&lt;/strong&gt; 4 дашборда, пробы доступности, алерты в Telegram (отдельные чаты на контур)&lt;br&gt;
✅ &lt;strong&gt;Бэкапы:&lt;/strong&gt; ежедневный бэкап БД prod + тома загрузок, ротация 30 дней, восстановление проверено&lt;br&gt;
✅ &lt;strong&gt;Безопасность:&lt;/strong&gt; SSH по ключам, отключён root, UFW, секреты в Protected CI-переменных&lt;/p&gt;</description></item><item><title>Observability и Telemetry для .NET Backend</title><link>https://ruadmin.root.sx/ru/posts/sre-observability/dotnet-telemetry-observability/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruadmin.root.sx/ru/posts/sre-observability/dotnet-telemetry-observability/</guid><description>&lt;h2 id="observability-для-net-backend-интеграция-телеметрии-и-оптимизация-производительности"&gt;Observability для .NET Backend: интеграция телеметрии и оптимизация производительности&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="клиент"&gt;Клиент&lt;/h4&gt;
&lt;p&gt;E-commerce платформа с высоконагруженным .NET 8 бэкендом&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="задача"&gt;Задача&lt;/h4&gt;
&lt;p&gt;У .NET бэкенда не было наблюдаемости — никакого распределённого трассинга, централизованных метрик, структурированного логирования. Поиск медленных запросов требовал ручного разбора логов. Команда нуждалась в полном внедрении OpenTelemetry: проброс трейсов от Ingress через .NET к downstream-сервисам (PostgreSQL, Redis, RabbitMQ, HTTP upstreams), автоматическое обнаружение медленных запросов и путь к оптимизации P99 latency.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="решение"&gt;Решение&lt;/h4&gt;
&lt;h6 id="1-интеграция-opentelemetry-в-net-8"&gt;1. Интеграция OpenTelemetry в .NET 8&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Подключены NuGet-пакеты: &lt;code&gt;OpenTelemetry.Extensions.Hosting&lt;/code&gt;, &lt;code&gt;Instrumentation.AspNetCore&lt;/code&gt;, &lt;code&gt;Instrumentation.Http&lt;/code&gt;, &lt;code&gt;Instrumentation.EntityFrameworkCore&lt;/code&gt;, &lt;code&gt;Instrumentation.StackExchangeRedis&lt;/code&gt;, &lt;code&gt;Instrumentation.Runtime&lt;/code&gt;, &lt;code&gt;Instrumentation.Process&lt;/code&gt;, &lt;code&gt;Exporter.OpenTelemetryProtocol&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Настроен &lt;code&gt;ActivitySource&lt;/code&gt; с инструментацией AspNetCore, HttpClient, EF Core, Redis&lt;/li&gt;
&lt;li&gt;Включён проброс W3C &lt;code&gt;traceparent&lt;/code&gt;; добавлен middleware для возврата &lt;code&gt;X-Trace-Id&lt;/code&gt; в заголовках ответа&lt;/li&gt;
&lt;li&gt;Экспорт через OTLP/gRPC в OTel Collector (&lt;code&gt;:4317&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="2-инфраструктурный-слой-kubernetes--nginx--otel-collector"&gt;2. Инфраструктурный слой (Kubernetes / Nginx / OTel Collector)&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nginx/Ingress&lt;/strong&gt;: инъекция заголовков &lt;code&gt;traceparent&lt;/code&gt;/&lt;code&gt;tracestate&lt;/code&gt; для проброса W3C контекста&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;K8s Deployment&lt;/strong&gt;: переменные окружения &lt;code&gt;OTEL_SERVICE_NAME&lt;/code&gt;, &lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt;, конфиг семплирования (&lt;code&gt;parentbased_traceidratio&lt;/code&gt; 20%)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OTel Collector&lt;/strong&gt;: Tail-based sampling процессор — всегда захватываем ошибки (status_code: ERROR), медленные запросы (&amp;gt;1с latency), вероятностные 5% остальных; дропаем health checks&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="3-методология-поиска-медленных-запросов"&gt;3. Методология поиска медленных запросов&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Top-N Slow Endpoints (P95/P99)&lt;/strong&gt;: Grafana дашборды с &lt;code&gt;histogram_quantile(0.99, sum(rate(http_server_request_duration_seconds_bucket[5m])) by (le, http_route))&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flame Graphs &amp;amp; Span Waterfall&lt;/strong&gt;: Анализ разбивки трейса — Middleware → Controller → EF Core → Downstream API → Serialization&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runtime Metrics&lt;/strong&gt;: Мониторинг длины очереди ThreadPool, частоты Gen 2 GC, аллокаций для детекта sync-over-async блокировок&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Live Profiling&lt;/strong&gt;: &lt;code&gt;dotnet-trace&lt;/code&gt; + Speedscope/PerfView для CPU сэмплинга на проде под нагрузкой&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="4-чек-лист-оптимизаций"&gt;4. Чек-лист оптимизаций&lt;/h6&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Категория&lt;/th&gt;
&lt;th&gt;Применённые фиксы&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;База данных&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Добавлены недостающие индексы (EXPLAIN ANALYZE), устранено N+1 через &lt;code&gt;.Include()&lt;/code&gt;/&lt;code&gt;.Select()&lt;/code&gt;, &lt;code&gt;.AsNoTracking()&lt;/code&gt; для read-only, настроен connection pooling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;I/O &amp;amp; Сеть&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Полный перевод на async/await с CancellationToken, убраны &lt;code&gt;.Result&lt;/code&gt;/&lt;code&gt;.Wait()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Аллокации и GC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ArrayPool&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;Memory&amp;lt;T&amp;gt;&lt;/code&gt;, &lt;code&gt;ReadOnlySpan&amp;lt;T&amp;gt;&lt;/code&gt;, стриминг JSON в &lt;code&gt;Response.BodyWriter&lt;/code&gt;, включён Server GC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Кэширование&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Redis distributed cache (FusionCache), OutputCaching для HTTP-ответов&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTTP Clients&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;IHttpClientFactory&lt;/code&gt; / singleton &lt;code&gt;SocketsHttpHandler&lt;/code&gt; с &lt;code&gt;PooledConnectionLifetime=15m&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h4 id="технологии"&gt;Технологии&lt;/h4&gt;
&lt;div class="row"&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/dotnet.svg" alt=".NET"&gt;&lt;div&gt;.NET 8&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/opentelemetry.svg" alt="OpenTelemetry"&gt;&lt;div&gt;OpenTelemetry&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/kubernetes-plain.svg" alt="Kubernetes"&gt;&lt;div&gt;Kubernetes&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/prometheus-original.svg" alt="Prometheus"&gt;&lt;div&gt;Prometheus&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/grafana-original.svg" alt="Grafana"&gt;&lt;div&gt;Grafana&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/jaeger.svg" alt="Jaeger"&gt;&lt;div&gt;Jaeger&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/postgresql.svg" alt="PostgreSQL"&gt;&lt;div&gt;PostgreSQL&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/redis.svg" alt="Redis"&gt;&lt;div&gt;Redis&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/rabbitmq.svg" alt="RabbitMQ"&gt;&lt;div&gt;RabbitMQ&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/helm-original.svg" alt="Helm"&gt;&lt;div&gt;Helm&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h4 id="результаты"&gt;Результаты&lt;/h4&gt;
&lt;p&gt;✅ &lt;strong&gt;Полное покрытие трейсами:&lt;/strong&gt; 100% запросов имеют &lt;code&gt;traceparent&lt;/code&gt;, &lt;code&gt;X-Trace-Id&lt;/code&gt; возвращается клиентам&lt;br&gt;
✅ &lt;strong&gt;P99 latency снижен:&lt;/strong&gt; с 2.3с до 420мс (улучшение 82%) после оптимизации топ-5 эндпоинтов&lt;br&gt;
✅ &lt;strong&gt;Обнаружение ошибок:&lt;/strong&gt; Tail-sampling захватывает 100% 5xx ошибок и запросов &amp;gt;1с даже при 20% sample rate&lt;br&gt;
✅ &lt;strong&gt;Проактивный алертинг:&lt;/strong&gt; Настроены алерты на P99 &amp;gt; SLA и скачки error-rate в Grafana/Alertmanager&lt;br&gt;
✅ &lt;strong&gt;Оптимизация БД:&lt;/strong&gt; N+1 устранено, индексы добавлены, пул соединений настроен — EF Core спалы снизились на 65%&lt;br&gt;
✅ &lt;strong&gt;ThreadPool здоров:&lt;/strong&gt; Длина очереди около нуля под пиковой нагрузкой; sync-over-async устранён&lt;br&gt;
✅ &lt;strong&gt;Нагрузочное тестирование:&lt;/strong&gt; k6 soak-тест подтверждает стабильный P99 под 2x ожидаемого RPS&lt;/p&gt;</description></item><item><title>Геораспределённый кластер блокчейн-нод в Kubernetes</title><link>https://ruadmin.root.sx/ru/posts/clouds/blockchain-k8s-cluster/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruadmin.root.sx/ru/posts/clouds/blockchain-k8s-cluster/</guid><description>&lt;h2 id="геораспределённый-кластер-блокчейн-нод-в-kubernetes"&gt;Геораспределённый кластер блокчейн-нод в Kubernetes&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="клиент"&gt;Клиент&lt;/h4&gt;
&lt;p&gt;Криптовалютная платформа (Web3 / DeFi)&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="задача"&gt;Задача&lt;/h4&gt;
&lt;p&gt;Клиенту требовалась отказоустойчивая инфраструктура для запуска ETH и BSC full-нод в четырёх регионах (EU, US, AP, LatAm) с минимальной задержкой для конечных пользователей, защитой от DDoS и спама на RPC, безопасным HSM-подписанием транзакций и централизованным мониторингом. Синхронизация нод с нуля занимает 2–3 недели — требовалось решение для быстрого старта.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="решение"&gt;Решение&lt;/h4&gt;
&lt;h6 id="1-инфраструктура-и-iac-terraform--eks"&gt;1. Инфраструктура и IaC (Terraform + EKS)&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Terraform-модули: VPC, subnets, security groups для 4 регионов (Frankfurt, Virginia, Singapore, São Paulo)&lt;/li&gt;
&lt;li&gt;Managed Kubernetes (EKS 1.29+) per region с выделенными node pools: full nodes, archive nodes, signing service&lt;/li&gt;
&lt;li&gt;NVMe StorageClass (gp3) через CSI-драйвер для высокопроизводительного хранения chaindata&lt;/li&gt;
&lt;li&gt;Helm chart для geth / bsc-node с кастомными values per region&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="2-gitops-flux-cd-multi-cluster"&gt;2. GitOps: Flux CD multi-cluster&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Flux CD v2 с &lt;code&gt;Kustomization&lt;/code&gt; per region — единый источник истины для всех кластеров&lt;/li&gt;
&lt;li&gt;Secrets management: HashiCorp Vault + External Secrets Operator (ESO)&lt;/li&gt;
&lt;li&gt;Изменения в инфраструктуре применяются через git push без прямого доступа к кластерам&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="3-балансировка-и-anti-spam"&gt;3. Балансировка и Anti-Spam&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;HAProxy 2.8: sticky sessions, health checks по &lt;code&gt;eth_syncing&lt;/code&gt; — трафик только к синхронизированным нодам&lt;/li&gt;
&lt;li&gt;Nginx Ingress: rate limiting, IP reputation filtering (Lua-скрипты в стиле fail2ban)&lt;/li&gt;
&lt;li&gt;Cloudflare Workers: geo-routing + защита от DDoS L7&lt;/li&gt;
&lt;li&gt;Custom sidecar (Go): health endpoint, который возвращает ready только при полной синхронизации ноды&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="4-hsm-интеграция-для-подписания-транзакций"&gt;4. HSM-интеграция для подписания транзакций&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;AWS CloudHSM (prod) / YubiHSM2 (staging) для хранения приватных ключей&lt;/li&gt;
&lt;li&gt;Go-микросервис с PKCS#11 абстракцией — смена HSM-вендора без переписывания кода&lt;/li&gt;
&lt;li&gt;Изолированный K8s namespace + NetworkPolicy: нет egress кроме HSM endpoint&lt;/li&gt;
&lt;li&gt;gRPC API для backend: sign tx, get pubkey&lt;/li&gt;
&lt;li&gt;Аудит-лог всех операций подписания → Loki&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="5-мониторинг-и-алертинг"&gt;5. Мониторинг и алертинг&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Custom Prometheus exporter (Go): &lt;code&gt;eth_blockNumber&lt;/code&gt;, &lt;code&gt;eth_syncing&lt;/code&gt;, peer count per node&lt;/li&gt;
&lt;li&gt;Grafana dashboards: sync lag, block height per region, RPC latency, SLO 99.9%&lt;/li&gt;
&lt;li&gt;Alertmanager → PagerDuty: алерты на block lag &amp;gt; N блоков, node down, peer count &amp;lt; threshold&lt;/li&gt;
&lt;li&gt;Loki + Promtail: структурированные логи всех нод с корреляцией по region/pod&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="6-операционка-и-disaster-recovery"&gt;6. Операционка и Disaster Recovery&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Snapshot bootstrap: chaindata из S3 через rclone — нода готова за часы вместо недель&lt;/li&gt;
&lt;li&gt;DR playbook: пошаговые runbook&amp;rsquo;и для восстановления региона&lt;/li&gt;
&lt;li&gt;Chaos Engineering (Chaos Mesh): тесты на node kill, network partition, pod failure&lt;/li&gt;
&lt;li&gt;Architecture Decision Records (ADR) для всех ключевых решений&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="технологии"&gt;Технологии&lt;/h4&gt;
&lt;div class="row"&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/kubernetes-plain.svg" alt="Kubernetes"&gt;&lt;div&gt;Kubernetes&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/terraform-original.svg" alt="Terraform"&gt;&lt;div&gt;Terraform&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/helm-original.svg" alt="Helm"&gt;&lt;div&gt;Helm&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/flux-cd.svg" alt="Flux CD"&gt;&lt;div&gt;Flux CD&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/prometheus-original.svg" alt="Prometheus"&gt;&lt;div&gt;Prometheus&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/grafana-original.svg" alt="Grafana"&gt;&lt;div&gt;Grafana&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h4 id="результаты"&gt;Результаты&lt;/h4&gt;
&lt;p&gt;✅ &lt;strong&gt;Geo-routing:&lt;/strong&gt; задержка снижена за счёт маршрутизации к ближайшему региону&lt;br&gt;
✅ &lt;strong&gt;Быстрый старт:&lt;/strong&gt; нода готова за часы через snapshot из S3 вместо 2–3 недель синхронизации&lt;br&gt;
✅ &lt;strong&gt;Anti-spam:&lt;/strong&gt; rate limiting + IP reputation — публичный RPC выдерживает нагрузку ботов&lt;br&gt;
✅ &lt;strong&gt;HSM:&lt;/strong&gt; приватные ключи никогда не покидают аппаратный модуль&lt;br&gt;
✅ &lt;strong&gt;GitOps:&lt;/strong&gt; любое изменение инфраструктуры — через git, полный audit trail&lt;br&gt;
✅ &lt;strong&gt;SLO 99.9%:&lt;/strong&gt; отслеживается в Grafana, алерты в PagerDuty при деградации&lt;/p&gt;</description></item><item><title>Мониторинг Prometheus + Grafana</title><link>https://ruadmin.root.sx/ru/posts/sre-observability/monitoring-prometheus/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ruadmin.root.sx/ru/posts/sre-observability/monitoring-prometheus/</guid><description>&lt;h2 id="observability-стек-для-микросервисной-архитектуры"&gt;Observability стек для микросервисной архитектуры&lt;/h2&gt;
&lt;hr&gt;
&lt;h4 id="клиент"&gt;Клиент&lt;/h4&gt;
&lt;p&gt;Начинающий стартап&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="задача"&gt;Задача&lt;/h4&gt;
&lt;p&gt;Компания перешла на микросервисную архитектуру (15+ сервисов), но не имела централизованного мониторинга. Проблемы обнаруживались только по жалобам пользователей через 30+ минут. Требовалось внедрить полноценный observability стек для быстрого выявления и диагностики проблем.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="решение"&gt;Решение&lt;/h4&gt;
&lt;h6 id="1-архитектура-мониторинга"&gt;1. Архитектура мониторинга&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prometheus&lt;/strong&gt; для сбора метрик&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grafana&lt;/strong&gt; для визуализации&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Loki&lt;/strong&gt; для централизованных логов&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jaeger&lt;/strong&gt; для distributed tracing&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Alertmanager&lt;/strong&gt; для уведомлений&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="2-сбор-метрик"&gt;2. Сбор метрик&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Автоматическое обнаружение сервисов в Kubernetes&lt;/li&gt;
&lt;li&gt;Метрики приложений (custom metrics)&lt;/li&gt;
&lt;li&gt;Системные метрики (node-exporter)&lt;/li&gt;
&lt;li&gt;Метрики БД (postgres-exporter, redis-exporter)&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="3-визуализация-в-grafana"&gt;3. Визуализация в Grafana&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Дашборды для каждого микросервиса&lt;/li&gt;
&lt;li&gt;Общий дашборд инфраструктуры&lt;/li&gt;
&lt;li&gt;SLA/SLO метрики&lt;/li&gt;
&lt;li&gt;Business метрики (RPS, конверсия)&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="4-централизованные-логи-loki"&gt;4. Централизованные логи (Loki)&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Агрегация логов всех сервисов&lt;/li&gt;
&lt;li&gt;Поиск по логам через Grafana&lt;/li&gt;
&lt;li&gt;Корреляция логов с метриками&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="5-distributed-tracing-jaeger"&gt;5. Distributed Tracing (Jaeger)&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Трейсинг HTTP запросов между сервисами&lt;/li&gt;
&lt;li&gt;Визуализация цепочек вызовов&lt;/li&gt;
&lt;li&gt;Поиск узких мест (bottlenecks)&lt;/li&gt;
&lt;li&gt;Анализ latency по сервисам&lt;/li&gt;
&lt;/ul&gt;
&lt;h6 id="6-алертинг"&gt;6. Алертинг&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;Алерты в Telegram&lt;/li&gt;
&lt;li&gt;Эскалация критичных проблем&lt;/li&gt;
&lt;li&gt;On-call ротация&lt;/li&gt;
&lt;li&gt;Автоматическое создание инцидентов&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id="технологии"&gt;Технологии&lt;/h4&gt;
&lt;div class="row"&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/prometheus-original.svg" alt="Prometheus"&gt;&lt;div&gt;Prometheus&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/grafana-original.svg" alt="Grafana"&gt;&lt;div&gt;Grafana&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/kubernetes-plain.svg" alt="Kubernetes"&gt;&lt;div&gt;Kubernetes&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/docker-original.svg" alt="Docker"&gt;&lt;div&gt;Docker&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/helm-original.svg" alt="Helm"&gt;&lt;div&gt;Helm&lt;/div&gt;&lt;/div&gt;
&lt;div class="col-4 col-lg-2 pt-2" style="text-align: center;"&gt;&lt;img src="https://ruadmin.root.sx/icons/linux-original.svg" alt="Linux"&gt;&lt;div&gt;Linux&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h4 id="результаты"&gt;Результаты&lt;/h4&gt;
&lt;p&gt;✅ &lt;strong&gt;MTTD:&lt;/strong&gt; обнаружение проблем с 30 минут до 1 минуты&lt;br&gt;
✅ &lt;strong&gt;MTTR:&lt;/strong&gt; время восстановления сократилось на 60%&lt;br&gt;
✅ &lt;strong&gt;Алерты:&lt;/strong&gt; автоматические уведомления в Telegram&lt;br&gt;
✅ &lt;strong&gt;Visibility:&lt;/strong&gt; полная прозрачность работы всех сервисов&lt;br&gt;
✅ &lt;strong&gt;Capacity planning:&lt;/strong&gt; данные для планирования ресурсов&lt;/p&gt;</description></item></channel></rss>