Метроскоп¶
Живая схема московского метро, за которой стоит полный производственный контур: приложение на Java, кластер Kubernetes, конвейер сборки, метрики, логи, трейсы, цели по качеству обслуживания и канареечные релизы с автоматическим откатом.
Открыть схему Дашборды Исходный код

Каждая точка — состав. Положение рассчитывается по геометрии линий из OpenStreetMap и интервалу выпуска, который меняется по времени суток.
Зачем это сделано¶
Стенд отвечает на вопрос, который трудно раскрыть в резюме: как человек принимает инженерные решения, когда ресурсы ограничены, и что он делает, когда сервис начинает деградировать.
Поэтому здесь есть не только карта, но и:
- пульт, который ломает сервис по-настоящему — утечка памяти, замедление ответов, наплыв запросов;
- дашборды, на которых видно последствия каждого нажатия;
- правила оповещения по скорости прожигания бюджета ошибок, а не по одиночным всплескам;
- инструкция дежурного и разбор инцидента, написанные по реальному прогону, а не по шаблону.
Что внутри¶
| Слой | Технологии |
|---|---|
| Узел | Ubuntu 24.04, Ansible, ufw, fail2ban, подкачка 4 ГБ |
| Кластер | k3s, Traefik, cert-manager, Let's Encrypt |
| Инфраструктура как код | Terraform (состояние в кластере), Helm |
| Приложение | Java 21, Spring Boot 3.5, виртуальные потоки, PostgreSQL 16, Flyway |
| Интерфейс | React 19, Vite, Tailwind, Canvas 2D, поток событий SSE |
| Метрики | Prometheus, Micrometer, правила SLI, автомасштабирование по прикладной метрике |
| Логи | Alloy → Loki, структурированный JSON с идентификатором трейса |
| Трейсы | Агент OpenTelemetry → Tempo, переход из лога в трейс одним щелчком |
| Доставка | GitHub Actions, Jenkins, Argo Rollouts, канарейка с автоматическим анализом |
Ограничения, о которых честно¶
Стенд живёт на одном узле с 4 ГБ оперативной памяти. Это осознанное ограничение: интереснее показать, как уложить полный контур в скромные ресурсы, чем перечислить технологии, которые нигде не запущены. Отсюда часть решений — k3s вместо полного кластера, Loki вместо ELK, одна реплика PostgreSQL. Каждое такое решение записано в список решений вместе с ценой, которую оно стоит.
Движение составов — модель. Московский метрополитен не публикует телеметрию поездов, поэтому положение рассчитывается из настоящей геометрии линий и правдоподобных интервалов выпуска. Подробнее — в решении 0003.