Proxmox 9 – Wystawienie metryk serwera przez mini serwer Python 3

Opis działania rozwiązania

Zadaniem mini serwera będzie serwowanie w sieci lokalnej na potrzeby innych aplikacji i monitoringu pliku /run/pve-extra-metrics.json tworzonego dynamicznie przez usługę pve-extra-metrics.service. Rozwiązanie to opisane jest dokładnie na stronie https://itadmin.vblog.ovh/proxmox-ve-9-1-4-wlasna-modyfikacja-okna-summary-w-konsoli-gui/

Utworzenie mini serwera w Python 3

Tworzymy skrypt python do uruchomienia mini serwera na porcie 8080 i serwowaniu tylko 1 pliku /run/pve-extra-metrics.json

#!/usr/bin/env python3
from http.server import BaseHTTPRequestHandler, HTTPServer

SRC = "/run/pve-extra-metrics.json"

class H(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path not in ("/pve_stats.json", "/pve_stats.json/"):
            self.send_response(404); self.end_headers()
            self.wfile.write(b"Not found\n")
            return
        try:
            with open(SRC, "rb") as f:
                data = f.read()
            self.send_response(200)
            self.send_header("Content-Type", "application/json")
            self.send_header("Cache-Control", "no-store")
            self.end_headers()
            self.wfile.write(data)
        except Exception as e:
            self.send_response(500); self.end_headers()
            self.wfile.write(str(e).encode() + b"\n")

    def log_message(self, *args):  # ciszej w logach
        pass

if __name__ == "__main__":
    HTTPServer(("0.0.0.0", 8080), H).serve_forever()
PY

Utworzenie usługi systemd oraz python endpoint

Aby mini serwer miał charakter trwały niezależny od sesji użytkownika należy utworzyć usługę systemową.

cat >/etc/systemd/system/pve-metrics-http.service <<'UNIT'
[Unit]
Description=PVE metrics tiny HTTP server
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/sbin/pve-metrics-http.py
Restart=always
RestartSec=2
User=root

[Install]
WantedBy=multi-user.target
UNIT

Włączenie, uruchomienie i weryfikacja działania usługi

systemctl daemon-reload
systemctl enable --now pve-metrics-http.service
systemctl status pve-metrics-http.service

● pve-metrics-http.service - PVE metrics tiny HTTP server
     Loaded: loaded (/etc/systemd/system/pve-metrics-http.service; enabled; preset: enabled)
     Active: active (running) since Thu 2026-02-12 19:21:36 CET; 7s ago
 Invocation: 1730bc160ee34143882ac79f677d4f58
   Main PID: 200257 (python3)
      Tasks: 1 (limit: 134481)
     Memory: 8.5M (peak: 9.2M)
        CPU: 71ms
     CGroup: /system.slice/pve-metrics-http.service
             └─200257 python3 /usr/local/sbin/pve-metrics-http.py

Feb 12 19:21:36 pve systemd[1]: Started pve-metrics-http.service - PVE metrics tiny HTTP server.

Weryfikacja działania mini serwera

Z innego serwera / klienta: curl -s http://192.168.8.20:8080/pve_stats.json | jq .

root@docker:~# curl -s http://192.168.8.20:8080/pve_stats.json | jq .
{
  "hostname": "pve",
  "pve_version": "pve-manager/9.1.4/5ac30304265fbd8e (running kernel: 6.17.4-2-pve)",
  "kernel": "6.17.4-2-pve",
  "uptime_seconds": 18385,
  "uptime_human": "up 5 hours, 6 minutes",
  "cpu_usage": 23,
  "sys_io_delay": 0.14,
  "sys_load": "7.14,7.00,6.83",
  "ram_usage_prc": 53,
  "ram_usage_gb": 57.81,
  "ram_available_gb": 51.86,
  "ram_total_gb": 109.66,
  "swap_usage_prc": 0,
  "swap_usage_gb": 0.00,
  "swap_total_gb": 8.00,
  "ksm_sharing_gb": 22.13,
  "sys_process": 455,
  "sys_zombie": 0,
  "users_logged": 2,
  "root_fs_used_prc": 39,
  "root_fs_used_gb": 1354.34,
  "root_fs_total_gb": 3665.98,
  "running_vms": 17,
  "running_cts": 1,
  "cpu_model": "AMD Ryzen AI 9 HX 370 w/ Radeon 890M",
  "machine_vendor": "Micro Computer (HK) Tech Limited",
  "machine_model": "AI Series 1.0",
  "bios_vendor": "American Megatrends International, LLC.",
  "bios_version": "1.05",
  "bios_date": "10/10/2025",
  "last_apt_upgrade": "2026-01-29  15:36:59",
  "last_apt_upgrade_epoch": 1769697419,
  "cpu_temp_c": 64.0,
  "gpu_name": "Advanced Micro Devices, Inc. [AMD/ATI] Strix [Radeon 880M / 890M] (rev c1)",
  "gpu_temp_c": 48.0,
  "gpu_busy_percent": 0,
  "gpu_vram_used_bytes": 151089152,
  "gpu_vram_total_bytes": 17179869184,
  "nvme_dev": "/dev/nvme0n1",
  "nvme_model": "Acer SSD FA200 4TB",
  "nvme_serial": "ASBE64050101558",
  "nvme_smart_health": "PASSED",
  "nvme_temp_c": 39,
  "nvme_percent_used": 0,
  "nvme_data_units_written_tb": 7.77,
  "nvme_tbw_total_tb": 2000,
  "nvme_written_vs_tbw": "7.77 TB / 2000 TB",
  "outlet_power_w": 26.0,
  "outlet_voltage_v": 212.0,
  "outlet_energy_total_kwh": 0.15
}