Сервис для мониторинга информации о состоянии контейнеров.
- Склонируйте репозиторий (вместе с модулями).
git clone --recurse-submodules git@github.com:spanwalla/docker-monitoring.git
cd docker-monitoring
Альтернативный вариант, если есть проблемы с SSH-ключом:
git clone --recurse-submodules https://github.com/spanwalla/docker-monitoring
cd docker-monitoring
- Создайте файл
.envв корневом каталоге проекта, вы можете взять за основу файл .env.example - Для запуска контейнеров выполните команду
docker-compose up --build -d
- Для остановки используйте команду
docker-compose down --remove-orphans
Сервис будет доступен на портах 8080 (backend) и 35822 (frontend).
После первого запуска нужно подождать примерно две минуты.
В случае ошибок стоит посмотреть логи контейнеров (docker logs <имя контейнера>), а также лог запросов к бэкенд-серверу в каталоге backend/logs/requests.log.
- Было не совсем понятно, что именно подразумевается под фразой "пингануть контейнер". Cделал традиционный ping по IP-адресу контейнера, но так как ICMP обычно отключён, решил дополнительно взять значения полей
stateиstatusиз информации о контейнере. - В задании не говорилось про авторизацию пингеров, но мне показалось логичным добавить это, как минимум для идентификации тех, кто посылает отчёты.
- Frontend: написан на React, также используется
Viteиantd. Собирается и раздаётся с помощьюnginx. Посылает запросы на Backend с интервалом пять секунд. Информация обновляется без перезагрузки страницы. - Backend: написан на Go с использованием Echo и многих других пакетов. Написан с соблюдением принципов чистой архитектуры. Реализована JWT-авторизация, graceful shutdown, а также доступна Swagger-документация по маршруту
/swagger/index.html.- Сохранение отчётов реализовано с использованием сервиса очередей RabbitMQ, работает это так: пингер посылает REST-запрос к API, сервер возвращает
202 Acceptedи добавляет отчёт в очередь, откуда её берёт и помещает в БД параллельно работающая горутина.
- Сохранение отчётов реализовано с использованием сервиса очередей RabbitMQ, работает это так: пингер посылает REST-запрос к API, сервер возвращает
- Pinger: написан как консольная утилита, по замыслу должна запускаться на отслеживаемой хост-машине и собирать информацию о контейнерах. Здесь для демонстрации запускается вместе со всеми остальными сервисами, что, соответственно, означает, что она будет собирать информацию о backend, frontend, postgres, rabbitmq и о самом себе.
- Варианты запуска на хост-машине разные: использование бинарного файла (в
Makefileпредусмотрен сценарий сборки исполняемых файлов для основных ОС), запуск в Docker-контейнере (для этого нужны особые настройкиnetwork_mode: hostи монтирование/var/run/docker.sockс хост-машины, а также установка черезgo install. На мой взгляд, наиболее предпочтительный способ – использованиеgo install. - Предусмотрен graceful shutdown.
- Интервал отправки отчётов задаётся через конфиг (образец в config.yaml) в формате cron-строки, если путь к конфиг-файлу не указан, то будет использоваться конфиг из
$HOME/.docker-pinger.yaml(если его нет, то он будет создан со стандартными значениями).
- Варианты запуска на хост-машине разные: использование бинарного файла (в
- Без данных.
- Просмотр информации от нескольких пингеров (реализован в виде расширяемой таблицы).
- Запрос на сохранение отчёта в Postman.
- Интерактивность
- Обновление информации без перезагрузки




