404 lines
24 KiB
Markdown
404 lines
24 KiB
Markdown
# Proxmox CPU Dashboard
|
||
|
||
Локальная веб-панель CPU для Proxmox. Данные читаются напрямую из `/proc` и
|
||
`/sys`, без Proxmox API. Интерфейс обновляется каждые две секунды.
|
||
|
||
## Установка для новичка — скопируйте команды целиком
|
||
|
||
### Что потребуется
|
||
|
||
- сервер Proxmox VE с доступом в интернет или к `git.myown.center`;
|
||
- вход в консоль Proxmox под пользователем `root`;
|
||
- IP-адрес Proxmox в локальной сети;
|
||
- свободный TCP-порт `9105` между вашим компьютером и Proxmox.
|
||
|
||
Go, Node.js, Docker и отдельную базу данных устанавливать не нужно. Панель
|
||
поставляется готовым Linux-бинарником, а SQLite встроен внутрь.
|
||
|
||
### 1. Подключитесь к Proxmox
|
||
|
||
На своём компьютере откройте Terminal и выполните команду, заменив IP на адрес
|
||
своего Proxmox:
|
||
|
||
```bash
|
||
ssh root@192.168.0.10
|
||
```
|
||
|
||
Введите пароль `root`. Следующие команды выполняйте уже внутри Proxmox.
|
||
|
||
### 2. Установите панель
|
||
|
||
Скопируйте весь блок и вставьте его в консоль Proxmox:
|
||
|
||
```bash
|
||
apt-get update
|
||
apt-get install -y curl ca-certificates tar smartmontools iproute2 iputils-ping
|
||
|
||
cd /tmp
|
||
curl -fL \
|
||
https://git.myown.center/maxim/ProxmoxDash/releases/download/latest/proxmox-dashboard-install-amd64.tar.gz \
|
||
-o proxmox-dashboard-install-amd64.tar.gz
|
||
|
||
tar -xzf proxmox-dashboard-install-amd64.tar.gz
|
||
cd proxmox-dashboard-install
|
||
UPDATE_MODE=notify ./scripts/install.sh
|
||
```
|
||
|
||
Готово. Установщик сам:
|
||
|
||
- положит бинарник в `/usr/local/bin`;
|
||
- создаст локальную базу настроек и истории;
|
||
- установит systemd-службу;
|
||
- запустит панель;
|
||
- настроит ежедневную проверку новых версий;
|
||
- сохранит предыдущий бинарник при будущем обновлении.
|
||
|
||
### 3. Откройте панель
|
||
|
||
В браузере на своём компьютере откройте:
|
||
|
||
```text
|
||
http://192.168.0.10:9105
|
||
```
|
||
|
||
Замените `192.168.0.10` на IP своего Proxmox. Узнать адрес можно командой:
|
||
|
||
```bash
|
||
hostname -I
|
||
```
|
||
|
||
### 4. Проверьте, что всё работает
|
||
|
||
```bash
|
||
systemctl --no-pager --full status proxmox-cpu-dashboard.service
|
||
curl -I http://127.0.0.1:9105
|
||
```
|
||
|
||
В статусе службы должно быть `active (running)`, а локальная проверка должна
|
||
вернуть HTTP-ответ `200 OK`.
|
||
|
||
### Как обновлять
|
||
|
||
В режиме `notify`, установленном командами выше, откройте в панели
|
||
`Настройки → Обновления` и нажмите `Проверить и установить обновление`.
|
||
|
||
Если нужны полностью автоматические обновления, повторно запустите установщик:
|
||
|
||
```bash
|
||
cd /tmp/proxmox-dashboard-install
|
||
UPDATE_MODE=auto ./scripts/install.sh
|
||
```
|
||
|
||
### Если репозиторий станет приватным
|
||
|
||
Создайте в Gitea токен только для чтения репозитория и передайте его
|
||
установщику. Вместо текста `ВАШ_ТОКЕН` вставьте настоящий токен:
|
||
|
||
```bash
|
||
cd /tmp/proxmox-dashboard-install
|
||
GITEA_TOKEN='ВАШ_ТОКЕН' UPDATE_MODE=notify ./scripts/install.sh
|
||
```
|
||
|
||
Токен сохраняется на Proxmox с правами `0600` и не показывается в браузере.
|
||
|
||
### Если страница не открывается
|
||
|
||
Выполните на Proxmox:
|
||
|
||
```bash
|
||
systemctl restart proxmox-cpu-dashboard.service
|
||
systemctl --no-pager --full status proxmox-cpu-dashboard.service
|
||
journalctl -u proxmox-cpu-dashboard.service -n 100 --no-pager
|
||
ss -lntp | grep 9105
|
||
```
|
||
|
||
Проверьте, что используете правильный IP, порт `9105` доступен из локальной
|
||
сети, а firewall Proxmox не блокирует подключение. Панель пока не имеет
|
||
авторизации — не публикуйте порт `9105` напрямую в интернет.
|
||
|
||
---
|
||
|
||
Панель показывает:
|
||
|
||
- изменение критичных SMART-счётчиков, результаты self-test и исчезновение дисков;
|
||
- realtime read/write IOPS, MB/s, latency, utilization и глубину очереди каждого диска;
|
||
- недельную историю IOPS/utilization и алерты при устойчивом I/O-давлении;
|
||
- вероятный источник I/O: VM/LXC, процесс хоста или активная backup/snapshot/migration-задача;
|
||
- отдельные пороги HDD, SATA SSD и NVMe с исключениями по имени или серийному номеру;
|
||
- недельные baseline-аномалии IOPS, latency, температуры, RAM, ZFS и длительности backup;
|
||
- корреляцию связанных событий в одну причинно-следственную цепочку;
|
||
- время первого появления и последнего наблюдения каждого уведомления;
|
||
- автоматический короткий SMART self-test раз в неделю для дисков без свежего теста;
|
||
- datasets, vdev-классы, ошибки read/write/checksum, scrub и ARC ZFS;
|
||
- доступность шлюза, DNS и интернета, packet loss, latency и внешний IP;
|
||
- тип, состояние, скорость, duplex и master сетевых интерфейсов;
|
||
- состояние связи с NUT/apcupsd, возраст батареи и расчётную автономность UPS;
|
||
- настраиваемый сценарий корректного выключения VM/LXC и Proxmox с безопасным dry-run;
|
||
- самоконтроль сборщика, записи истории, свободного места базы и systemd watchdog;
|
||
|
||
- модель и текущую загрузку CPU;
|
||
- количество сокетов, физических ядер и логических потоков;
|
||
- среднюю текущую частоту;
|
||
- load average за 1, 5 и 15 минут;
|
||
- uptime;
|
||
- доступные аппаратные температуры.
|
||
- использование RAM, доступную память, кэш, буферы и swap.
|
||
- заполнение системного диска `/`;
|
||
- список физических дисков, модель, серийный номер, SMART, температуру, наработку
|
||
и доступные данные об износе;
|
||
- текущую скорость и суммарные счётчики сетевого трафика.
|
||
- состояние, заполнение, фрагментацию и scrub/resilver ZFS-пулов;
|
||
- состояние UPS через NUT или apcupsd, заряд, автономность, нагрузку и напряжение.
|
||
- состояние VM и LXC, CPU, память, выделенные ядра и uptime.
|
||
- IP-адреса VM через QEMU Guest Agent, автозапуск, storage, заполнение диска и
|
||
суммарный сетевой трафик гостей;
|
||
- последнюю найденную резервную копию каждой VM/LXC, storage, размер и возраст.
|
||
- версию Proxmox, запущенное и последнее установленное ядро, доступные
|
||
обновления, необходимость перезагрузки, последнее обновление системы,
|
||
ближайшие backup и ZFS scrub.
|
||
- управляемый мониторинг HTTP/HTTPS, TCP и ping для homelab-сервисов: отклик,
|
||
ожидаемый код и текст, TLS-сертификат, uptime за сутки и неделю;
|
||
- ошибки systemd и ядра за 24 часа, упавшие службы, ошибки и drops каждого
|
||
сетевого интерфейса.
|
||
- snapshots VM/LXC с возрастом, описанием и доступным размером;
|
||
- последние задачи Proxmox: backup, start/stop, snapshot, migration, пользователь,
|
||
длительность и результат;
|
||
- сравнение размера backup с предыдущей копией и ручную безопасную проверку
|
||
читаемости локального архива или конфигурации PBS snapshot;
|
||
- карту homelab: Proxmox, VM/LXC, сервисы и используемые storage.
|
||
|
||
Через кнопку настроек можно скрывать неиспользуемые карточки и переключать
|
||
светлую или тёмную тему. Карточки можно переставлять перетаскиванием или
|
||
стрелками в настройках. Видимость, порядок и тема сохраняются локально в
|
||
браузере.
|
||
|
||
Центр уведомлений объединяет критические события, предупреждения и
|
||
информационные сообщения по CPU, памяти, storage, SMART, ZFS, UPS, VM/LXC и
|
||
резервным копиям. Критические события всегда отображаются первыми.
|
||
|
||
Во вкладке `Настройки → Почта` настраиваются SMTP-сервер, получатель и интервал
|
||
агрегированной сводки. Можно отдельно выбрать уровни важности и источники
|
||
событий — например, полностью исключить уведомления о резервных копиях. Там же
|
||
доступна отправка тестового письма. Поддерживаются STARTTLS (обычно порт 587) и
|
||
SMTP поверх TLS (порт 465).
|
||
|
||
Тема письма кодируется по MIME и корректно отображает кириллицу. Сам дайджест
|
||
оформлен как HTML-письмо и содержит только новые неподтверждённые события — уже
|
||
отправленные или принятые события повторно не рассылаются. В центре уведомлений
|
||
есть вкладки активных событий и 30-дневной истории. Кнопка `Принято` скрывает
|
||
событие из активных, не удаляя его из журнала; повторное возникновение проблемы
|
||
создаёт новое событие.
|
||
|
||
Критические события отправляются сразу, не ожидая очередной сводки. К ним
|
||
относятся недоступность сервиса, отказ SMART/ZFS/systemd, критический перегрев и
|
||
низкий заряд UPS. Переход UPS на батарею также отправляется немедленно. После
|
||
устранения уже отправленной проблемы приходит отдельное уведомление о
|
||
восстановлении.
|
||
|
||
Пороги уведомлений сохраняются в SQLite и настраиваются через вкладку
|
||
`Настройки → Уведомления`. Панель раз в минуту сохраняет историю CPU,
|
||
температуры, памяти, swap, сети, storage, ZFS, UPS и гостей. Данные старше семи
|
||
дней удаляются автоматически. В подробных окнах карточек текущие показатели и
|
||
история разделены на вкладки. Для графиков можно выбрать последний час, 24 часа
|
||
или 7 дней, а точные значения и время отображаются при наведении.
|
||
|
||
База данных по умолчанию находится здесь:
|
||
|
||
```text
|
||
/var/lib/proxmox-dashboard/dashboard.db
|
||
```
|
||
|
||
Готовые версии для Linux публикуются в разделе Releases репозитория. Бинарник
|
||
не требует установки Go или системной библиотеки SQLite.
|
||
|
||
Проверка обновлений выполняется отдельным systemd-таймером раз в сутки. Статус
|
||
виден во вкладке `Настройки → Обновления` и в центре уведомлений. Доступны два
|
||
режима: `notify` только сообщает о новой версии, `auto` скачивает её, сохраняет
|
||
предыдущий бинарник как резервный и перезапускает панель. В режиме `notify`
|
||
обновление можно запустить кнопкой `Проверить и установить обновление` в
|
||
настройках. Запрос выполняет отдельная системная служба.
|
||
|
||
На главном экране находятся компактные карточки CPU, памяти, диска и сети.
|
||
Нажатие на карточку открывает подробные показатели.
|
||
|
||
## Быстрый запуск
|
||
|
||
Скопируйте `dist/proxmox-cpu-dashboard-linux-amd64` на Proxmox, затем:
|
||
|
||
```bash
|
||
chmod +x proxmox-cpu-dashboard-linux-amd64
|
||
./proxmox-cpu-dashboard-linux-amd64
|
||
```
|
||
|
||
## Установка на сервер и обновления
|
||
|
||
Скачайте из Releases архив `proxmox-dashboard-install-amd64.tar.gz`, распакуйте
|
||
его на Proxmox и запустите от root:
|
||
|
||
```bash
|
||
tar -xzf proxmox-dashboard-install-amd64.tar.gz
|
||
cd proxmox-dashboard-install
|
||
UPDATE_MODE=notify ./scripts/install.sh
|
||
```
|
||
|
||
Для полностью автоматических обновлений используйте `UPDATE_MODE=auto`.
|
||
Приватному репозиторию нужен read-only API-токен Gitea:
|
||
|
||
```bash
|
||
GITEA_TOKEN='read-only-token' UPDATE_MODE=auto ./scripts/install.sh
|
||
```
|
||
|
||
Токен сохраняется с правами `0600` в `/etc/proxmox-dashboard/update.env`.
|
||
Проверить обновления вручную можно командой:
|
||
|
||
```bash
|
||
systemctl start proxmox-dashboard-update.service
|
||
systemctl status proxmox-dashboard-update.service
|
||
```
|
||
|
||
Откройте:
|
||
|
||
```text
|
||
http://192.168.0.10:9105
|
||
```
|
||
|
||
## Установка как службы
|
||
|
||
```bash
|
||
install -m 0755 proxmox-cpu-dashboard-linux-amd64 /usr/local/bin/proxmox-cpu-dashboard
|
||
install -m 0644 proxmox-cpu-dashboard.service /etc/systemd/system/proxmox-cpu-dashboard.service
|
||
systemctl daemon-reload
|
||
systemctl enable --now proxmox-cpu-dashboard
|
||
systemctl status proxmox-cpu-dashboard
|
||
```
|
||
|
||
По умолчанию панель слушает порт `9105` на всех интерфейсах. Другой адрес можно
|
||
задать переменной `DASHBOARD_ADDR`, например `127.0.0.1:9105`.
|
||
|
||
На веб-сервере пока нет авторизации. Не открывайте порт `9105` в интернет.
|
||
|
||
Для SMART-метрик на Proxmox должен быть установлен пакет `smartmontools`:
|
||
|
||
```bash
|
||
apt update
|
||
apt install -y smartmontools
|
||
```
|
||
|
||
Без него список дисков и их паспортные данные продолжат отображаться, а SMART
|
||
будет отмечен как недоступный.
|
||
|
||
Проверить исходные SMART-данные вручную:
|
||
|
||
```bash
|
||
smartctl -x /dev/sda
|
||
smartctl -x -j /dev/sda
|
||
smartctl -x /dev/nvme0n1
|
||
```
|
||
|
||
У HDD обычно нет показателя износа в процентах. Для NVMe используется
|
||
`Percentage Used`, а для SATA SSD — поддерживаемые накопителем атрибуты ресурса.
|
||
Если производитель не публикует такой атрибут, панель корректно показывает `—`.
|
||
|
||
## UPS
|
||
|
||
Панель автоматически пробует получить данные через NUT (`upsc`), затем через
|
||
`apcaccess`. Для проверки NUT:
|
||
|
||
```bash
|
||
upsc -l
|
||
upsc ИМЯ_UPS
|
||
```
|
||
|
||
Для проверки apcupsd:
|
||
|
||
```bash
|
||
apcaccess status
|
||
```
|
||
|
||
## API
|
||
|
||
- `GET /api/cpu` — один JSON-снимок.
|
||
- `GET /api/system` — единый JSON-снимок CPU и памяти.
|
||
- `GET /api/events` — поток метрик SSE с интервалом две секунды.
|
||
- `GET/POST/PUT/DELETE /api/services` — управление проверками сервисов.
|
||
- `GET /api/services/history` — семидневная история доступности и отклика.
|
||
- `GET/PUT/DELETE /api/settings/maintenance` — состояние, запуск и досрочное завершение плановых работ.
|
||
- `GET/DELETE /api/agents` — подключённые гостевые агенты.
|
||
- `POST /api/agents/enrollment-token` — одноразовый токен регистрации на 15 минут.
|
||
|
||
## Maintenance-режим
|
||
|
||
Во вкладке `Настройки → Maintenance` можно на заданное время отключить все
|
||
алерты либо выбрать конкретные сервисы и VM/LXC. Подавленные события не
|
||
отправляются по почте и не отображаются как активные, но сохраняются в истории
|
||
с причиной плановых работ. После окончания окна обычный мониторинг включается
|
||
автоматически.
|
||
|
||
## Агенты VM и LXC
|
||
|
||
Read-only агент показывает состояние Linux внутри VM/LXC: CPU, load average,
|
||
память, корневой раздел, uptime, ОС, ядро, IP-адреса, systemd-службы, доступные
|
||
APT-обновления и необходимость перезагрузки. Для Docker отображаются контейнеры,
|
||
health-check, число перезапусков, CPU и память. Агент сам подключается к Dashboard
|
||
каждые 10 секунд; открывать входящий порт внутри гостевой системы не нужно.
|
||
|
||
В подробностях агента systemd-службы разделяются на системные, установленные
|
||
дополнительно и локальные unit-файлы. Для каждой службы показываются пакет и путь
|
||
unit-файла, время запуска, число перезапусков, последний exit code, память и
|
||
накопленное CPU-время, когда соответствующий accounting доступен в systemd.
|
||
|
||
Расширенная диагностика агента включает последние сообщения проблемных служб,
|
||
`Requires`/`After`, PID, команду запуска и слушающие порты; выявляет частые
|
||
рестарты, OOM-kill и процессы в D-state. Отдельно отображаются top процессов по
|
||
CPU и RAM с накопленным I/O, swap, PSI pressure, все постоянные файловые системы,
|
||
их заполнение и использование inode.
|
||
|
||
Панель «Диагностика homelab» и карта сопоставляют известные IP и порты с VM/LXC,
|
||
агентом, systemd-службой или Docker-контейнером и настроенной HTTP/TCP-проверкой.
|
||
Связи по PID и порту считаются подтверждёнными; совпадения только по названию
|
||
помечаются как предположение.
|
||
|
||
Для сложных reverse proxy и Docker-сетей в управлении сервисами можно сохранить
|
||
ручную связь `сервис → агент/VMID → systemd/Docker/процесс → порт`. Она имеет
|
||
приоритет над автоматическим определением и используется для группировки
|
||
связанных уведомлений по первопричине.
|
||
|
||
Dashboard хранит семь дней истории CPU, RAM, swap, PSI и файловых систем каждого
|
||
агента. Из подробностей агента доступны только заранее разрешённые действия:
|
||
перезапуск известной systemd-службы или Docker-контейнера, `reset-failed` и
|
||
обновление списка пакетов. Агент не принимает произвольные shell-команды; каждое
|
||
действие требует подтверждения в браузере и сохраняется в журнале управления.
|
||
|
||
Откройте `Настройки → Агенты`, укажите адрес Dashboard, доступный из VM/LXC, и
|
||
VMID. Кнопка создаст готовую команду установки. Одноразовый токен действует 15
|
||
минут и после регистрации заменяется индивидуальным секретом агента.
|
||
|
||
После однократной установки агент обновляется автоматически вслед за Dashboard.
|
||
Центральный сервер отдаёт агенту собственный бинарник и SHA-256; агент проверяет
|
||
контрольную сумму, атомарно заменяет файл и перезапускается через systemd. Если
|
||
агент был удалён из Dashboard, повторная команда с новым токеном автоматически
|
||
выполнит новую регистрацию.
|
||
|
||
В первой версии агент не выполняет команды и не перезапускает службы или
|
||
контейнеры. Для чтения Docker ему требуется доступ к `/var/run/docker.sock`,
|
||
поэтому служба устанавливается от root. Сам Dashboard пока не имеет
|
||
авторизации: используйте локальную сеть или HTTPS через доверенный reverse
|
||
proxy и не публикуйте агентские API напрямую в интернет.
|
||
|
||
Полностью удалить агент из VM/LXC:
|
||
|
||
```bash
|
||
curl -fsSL https://git.myown.center/maxim/ProxmoxDash/raw/branch/main/scripts/uninstall-agent.sh | sh
|
||
```
|
||
|
||
Оформление, пороги, почта и обновления Dashboard находятся в обычных настройках.
|
||
Рабочие инструменты — сервисы, агенты, плановые работы и UPS-сценарий — вынесены
|
||
в отдельный раздел `Управление` в шапке Dashboard.
|
||
|
||
## Сборка
|
||
|
||
```bash
|
||
go test ./...
|
||
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o proxmox-cpu-dashboard .
|
||
```
|