diff --git a/src/Controllers/AgentController.php b/src/Controllers/AgentController.php
index e13cf09..34292a0 100755
--- a/src/Controllers/AgentController.php
+++ b/src/Controllers/AgentController.php
@@ -50,7 +50,7 @@ echo 'Установка агента мониторинга...'
if ! command -v python3 &> /dev/null; then
echo 'Установка Python3...'
apt-get update
- apt-get install -y python3 python3-pip
+ apt-get install -y python3 python3-pip lm-sensors smartmontools
fi
# Устанавливаем psutil
diff --git a/templates/servers/detail.twig b/templates/servers/detail.twig
index e1a0462..f675ba0 100755
--- a/templates/servers/detail.twig
+++ b/templates/servers/detail.twig
@@ -188,7 +188,26 @@
-
+
+
+ {% set has_temps = false %}
+ {% for m in metrics %}{% if m starts with 'temp_' %}{% set has_temps = true %}{% endif %}{% endfor %}
+ {% if has_temps %}
+
+ {% endif %}
+
+
{% for metricName, metricData in metrics %}
{% if metricName starts with 'disk_used_' and metricName != 'disk_used' %}
@@ -834,6 +853,56 @@ document.addEventListener('mousemove', function(e) {
{% endif %}
{% endfor %}
+
+// График температур
+{% set temp_metrics = [] %}
+{% for m in metrics %}{% if m starts with 'temp_' %}{% set temp_metrics = temp_metrics|merge([m]) %}{% endif %}{% endfor %}
+{% if temp_metrics %}
+(function() {
+ var ctx = document.getElementById('chart-temperatures');
+ if (!ctx) return;
+
+ var labels = [];
+ {% if metrics[temp_metrics[0]] is defined %}
+ {% for p in metrics[temp_metrics[0]]|slice(-100) %}
+ labels.push('{{ p.time_bucket|default(p.created_at)|date("d.m H:i") }}');
+ {% endfor %}
+ {% endif %}
+
+ var datasets = [];
+ {% for m in temp_metrics %}
+ var data_{{ m }} = {
+ label: '{{ m|replace({'temp_': '', '_': ' '})|title }}',
+ data: [],
+ fill: false,
+ tension: 0.1,
+ pointRadius: 1,
+ borderWidth: 1
+ };
+ {% for p in metrics[m]|slice(-100) %}
+ data_{{ m }}.data.push({{ p.value }});
+ {% endfor %}
+ datasets.push(data_{{ m }});
+ {% endfor %}
+
+ new Chart(ctx.getContext('2d'), {
+ type: 'line',
+ data: { labels: labels, datasets: datasets },
+ options: {
+ responsive: true,
+ maintainAspectRatio: false,
+ interaction: { mode: 'index', intersect: false },
+ plugins: {
+ legend: { display: true, position: 'top' },
+ tooltip: { enabled: true, mode: 'index', intersect: false },
+ zoom: { zoom: { wheel: { enabled: true }, pinch: { enabled: true }, mode: 'x' }, pan: { enabled: true, mode: 'x' } }
+ },
+ scales: { y: { beginAtZero: false, ticks: { callback: v => v + '°C' } } }
+ }
+ });
+})();
+{% endif %}
+
// Doughnut графики для разделов дисков
{% for metricName, metricData in metrics %}
{% if metricName starts with 'disk_used_' and metricName != 'disk_used' %}