Перейти к основному содержимому

Инфраструктура

Все, что связано с конфигами инфраструктуры лежит в папке deploy

Как все устроено?

У нас все компоненты крутятся в докере. Они задаются в файле docker-compose.yml. Помимо самого журнала там можно увидеть несколько других сервисов, все они используются для мониторинга приложения (логи, дашборды, метрики).

Само приложение не обслуживает запросы напрямую, а принимает их от nginx.

Используемые сервисы

Рассмотрим каждый из сервисов и что он делает подробнее

PhysEdJournal

Собственно, само наше приложение

В конфиге сервиса указывается лейбл - logging он будет позже необходим для сбора логов через promtail. Также там указывается путь к env файлу, с которого будут подтягиваться секреты приложения,

Prometheus

Time-series база данных для хранения метрик с временными метками. Проще говоря - бд для наших метрик.

Здесь уже намного больше настроек. Самые важные из них это указание пути к конфигу и передача конфига через docker volumes. Сам конфиг лежит в соответствующей папке (prometheus/prometheus.yml). А также установка volume для хранения наших метрик (prometheus-data)

Seq

Решение для сбора и хранения логов. Предоставляет UI интерфейс для их просмотра и фильтрации, его можно найти по адресу https://api.mospolytech.ru/physedjournal/seq (Требуется авторизация)

Настройки

В конфиге promtail есть несколько настроек, на которые нужно обратить внимание. В частности секция pipeline_stages - в ней указываются стадии обработки каждого лога.

В нашем случае:

  1. Форматируем строку как json и достаем оттуда следующие значения: Properties, Level
  2. Форматируем значение ранее полученных Properties как json и достаем оттуда еще несколько значений
  3. Выставляем ранее полученные значения из лога как лейблы
подсказка

В значении Properties лежат все наши кастомные поля, которые мы передаем в самом приложении в логи

Лейбл

Лейбл как в prometheus, так и в loki это что-то вроде индекса в реляционной базе данных. Он нужен для более быстрого поиска данных по этому полю.

Grafana

Это основной интерфейс мониторинга. Здесь построены дашборды для просмотра логов, метрик и некоторой статистики по журналу в целом (кол-во посещений за определенное время, к кому ходили, когда и т.д.)

Здесь по стандарту объявлен volume для хранения данных дашбордов и помимо этого есть 2 очень важные настройки:

  • GF_SERVER_SERVE_FROM_SUB_PATH - Включить опцию обслуживание файлов из под подпути
  • GF_SERVER_ROOT_URL - Указывает url по которому будет работать графана. Т.к. само приложение хостится с префиксом /physedjournal, а графана в нем доступна по пути /physedjournal/grafana, то для того, чтобы веб-приложение графаны могло правильно выстроить свои руты необходимо ему подсказать где оно расположено.

Node exporter

Собирает метрики хоста (потребление памяти, cpu, трафик, размер диска и т.д.)

Cadvisor

Собирает метрики производительности (потребление памяти, cpu, трафик и т.д.) со всех докер контейнеров на хосте

Nginx

Точка входа во всю систему, единственный сервис, который доступен миру (открыты порты только у него). Он поддерживает SSL сертификаты и перенаправляет поступающие запросы на журнал и графану.

Руты

В конфиге nginx указано 2 перенаправления

  • location /physedjournal/grafana/ - Перенаправляет все запросы по этому руту на графану
  • location /physedjournal/ - Перенаправляет все запросы по этому руту на журнал

Секреты приложения

В файле .env.template можно указывать переменные окружения, которые мы хотим прокинуть из GitHub Secrets в запущенный контейнер журнала. Для этого нужно указывать их в формате AppVar=${GITHUB_SECRET_NAME_VAR}, где AppVar это название настройки в самом приложении, а GITHUB_SECRET_NAME_VAR название переменной в секретах гитхаба.

подсказка

В файле appsettings.json конфигурация ведется в JSON формате, для того, чтобы повторить такой формат в переменных окружения можно указывать встроенные друг в друга поля через : либо __. Пример: настройка ConnectionStrings: { DefaultConnection: "SOME CONNECTION" } в переменных окружения может быть записана как ConnectionStrings:DefaultConnection=${DB_CONNECTION} или как ConnectionStrings__DefaultConnection=${DB_CONNECTION}

Потом при деплое через Deploy to server секреты автоматически попадут в приложение.