Как сделать красивый Dashboard для своей лабы

Скорее всего у вас есть своя лаба или любая другая среда для тестирования. Там есть Proxmox, Prometheus, Portainer и много других сервисов. Их конечно удобно держать в отдельной папке в браузере, но, что если собрать все это в одном месте с красивым и информативным интерфейсом? Давайте попробуем

В реализации этой задачи нам поможет homepage — gethomepage

Я буду устанавливать его с помощью Docker на своем тестовом сервере с Ubuntu 22

Создадим отдельную папку для нашего dashboard, например dashboard-lab

Для удобства я буду работать на сервере через VSCode и здесь нам пригодится The Remote — SSH extension https://code.visualstudio.com/docs/remote/ssh

Финальная структура проекта — на скрине выше. В конце я приведу ссылку на GitHub со всеми конфигами какие у меня получились и если вы немного запутались что и куда добавлять, там вы сможете все посмотреть и сравнить.

Начнем с файла docker-compose.yml

services:
  homepage:
    image: ghcr.io/gethomepage/homepage:latest
    container_name: homepage
    ports:
      - 3000:3000
    volumes:
      - ./config:/app/config 
      - ./images:/app/public/images
      - ./icons:/app/public/icons   
    environment:
      - PUID=1000
      - PGID=1000
      - LAB_VAR_PROXMOX_USERNAME=$LAB_VAR_PROXMOX_USERNAME
      - LAB_VAR_PROXMOX_PASSWORD=$LAB_VAR_PROXMOX_PASSWORD
    restart: unless-stopped

Чтобы узнать ID пользователя и группы, введите в консоли сервера команду id

Папка config как понятно из названия предназначена для хранения файлов конфигураций, а images и icons для кастомных изображений, которых нет в стандартной библиотеке.

Теперь развернем наш проект 

docker compose up -d

docker compose ps

Проверим — в браузере введите ip адрес вашего сервера и подключитесь к порту 3000, например 192.168.1.2:3000

Уже сейчас мы видим информацию о CPU, RAM, HDD сервера и демо оформление. Давайте изменим оформление и добавим на панель какие-нибудь сервисы.

Скачайте какой-нибудь фон, например по ссылке из раздела настроек link или можете взять у меня на GitHub

После добавления новых картинок — контейнер нужно перезапустить — внимательно читаем инструкцию. Если вы все сделали правильно, а картинка не обновляется — немного подождите.

Откройте файл settings.yaml и вставьте туда, ниже секции providers, следующее

title: Homelab Dashboard

background:
  image: /images/background.png
  blur: sm 
  saturate: 50 
  brightness: 50 
  opacity: 50 

Теперь добавим закладки, например наш сайт и GitHub профиль. Откроем bookmarks.yaml и вставим туда следующее

- Developer:
    - Github:
        - abbr: GH
          href: https://github.com/networksuperman

- Social:
    - Site:
        - abbr: DL
          href: https://devopslife.ru/

Теперь изменим поисковую систему, в widgets.yaml вставим

- search:
    provider: google
    target: _blank

Добавим наши локальные сервисы. Откроем services.yaml. Я сделаю на примере нескольких своих, у вас соответственно будут другие

- Hypervisor:
    - Proxmox:
        href: https://192.168.1.3:8006
        description: Proxmox
        siteMonitor: https://192.168.1.3:8006
        icon: proxmox       
        widget:
            type: proxmox
            url: https://192.168.1.3:8006
            username: user@pam!homelab
            password: 2756xxx
            node: pve-lab

- Monitoring:
    - Uptime Kuma:
        href: http://10.0.0.5:3001
        description: Uptime Kuma
        siteMonitor: http://10.0.0.5:3001
        icon: uptime-kuma
        widget:
            type: uptimekuma
            url: http://10.0.0.5:3001
            slug: all

- Infrastructure:
    - Portainer:
        href: https://192.168.1.15:9443
        description: Portainer
        siteMonitor: https://192.168.1.15:9443
        icon: portainer
        widget:
            type: portainer
            url: https://192.168.1.15:9443
            env: 2
            key: ptr_xxx

Пример, когда все сервисы работают

А теперь выключим Uptime Kuma

Данный dashboard достаточно хорошо кастомизируется, например в части иконок для сервисов, все подробно описано в официальном мануале.

Для получения определенных метрик из наших сервисов, мы можем использовать widget как на примере выше (не файл widgets.yaml, а секцию widget в файле services.yaml). Есть готовые варианты под самые популярные.

Для хранения секретов, лучше использовать переменные, а не хранить их в открытом виде.

На примере Proxmox задаем переменные как показано выше, создаем в корне файл .env, исключаем его из git и копируем в него следующее

LAB_VAR_PROXMOX_USERNAME=здесь будет ваш логин
LAB_VAR_PROXMOX_PASSWORD=и пароль

Важно отметить, что у меня на Proxmox 8.2.7 появлялась ошибка API Error: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data при указании секретов через переменные. Нашел вот такое на GitHub — https://github.com/gethomepage/homepage/discussions/3284

Возможно это разные ошибки и где-то что-то сделал не так я (из того, что нашел, ни один из вариантов не сработал), но при указании логина и пароля без переменных все завелось.

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

В Portainer смотрим Environments и настраиваем доступ к api по инструкции.

Для получения данных из Proxmox нужно аналогично провести определенные манипуляции с API, но все они подробно описаны в официальном мануале. Так как у вас будут свои примеры, я просто показал основные возможности.

Пункт siteMonitoring используется для мониторинга URL, в случае если у вас просто IP или Hostname адрес, используйте ping.

Теперь давайте попробуем добавить в мониторинг какой-нибудь из docker контейнеров. Для этого в наш docker-compose файл добавим

dockerproxy:
    image: ghcr.io/tecnativa/docker-socket-proxy:latest
    container_name: dockerproxy
    environment:
      - CONTAINERS=1 
      - SERVICES=1 
      - TASKS=1 
      - POST=0 
    ports:
      - 127.0.0.1:2375:2375
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro 
    restart: unless-stopped

Приведите файл docker.yaml в папке configs к следующему содержанию

docker:
  host: dockerproxy
  port: 2375

Запустим самое простое — nginx

docker run -it --rm -d -p 8080:80 --name web nginx

В файл services.yaml добавим

- Containers:
    - Docker:    
        href: http://192.168.1.15:8080
        description: nginx
        server: docker
        container: web

Если он висит у вас в статусе unknown, сделайте docker compose down/up

Теперь остановим nginx контейнер и проверим

Как видите он изменил статус на exited

А если удалить контейнер, статус станет таким

Uptime Kuma на скриншотах выше в таком статусе, так как я просто ее не перезапускал, после примера с аварийным сервисом.

Таким образом мы получаем не просто красивый dashboard со всеми нашими сервисами и сайтами, но и базовую возможность мониторинга основных компонентов, что согласитесь, дает определенное удобство и преимущество.

Ссылка на конфигурации на GitHub

https://github.com/networksuperman/dashboard-lab

Успехов!