feat(UptimeMonitor): add uptime monitor scheduler settings and endpoints for improved monitoring functionality
Publish Fast Tabler Docker image / build-and-push-fast (push) Failing after 2m47s

This commit is contained in:
2026-02-22 21:10:50 +07:00
parent 1548de7064
commit 7d3804202f
5 changed files with 270 additions and 1 deletions
+40
View File
@@ -89,6 +89,8 @@ export default function SettingsPage() {
const [uptimeMonitorIntervalSeconds, setUptimeMonitorIntervalSeconds] = useState('120');
const [uptimeMonitorCheckType, setUptimeMonitorCheckType] = useState('http');
const [uptimeMonitorCacheSeconds, setUptimeMonitorCacheSeconds] = useState('120');
const [uptimeMonitorSchedulerEnabled, setUptimeMonitorSchedulerEnabled] = useState(true);
const [uptimeMonitorSchedulerIntervalMinutes, setUptimeMonitorSchedulerIntervalMinutes] = useState('2');
const [serversList, setServersList] = useState([]);
const [sidebarSearch, setSidebarSearch] = useState('');
const [activeSection, setActiveSection] = useState(() => {
@@ -272,6 +274,12 @@ export default function SettingsPage() {
setUptimeMonitorCacheSeconds(
data?.uptimeMonitorCacheSeconds != null ? String(data.uptimeMonitorCacheSeconds) : '120'
);
setUptimeMonitorSchedulerEnabled(data?.uptimeMonitorSchedulerEnabled !== false);
setUptimeMonitorSchedulerIntervalMinutes(
data?.uptimeMonitorSchedulerIntervalMinutes != null
? String(data.uptimeMonitorSchedulerIntervalMinutes)
: '2'
);
const raw = data?.trafficInterfaces;
setTrafficInterfacesSelected(
Array.isArray(raw)
@@ -391,6 +399,11 @@ export default function SettingsPage() {
0,
parseInt(uptimeMonitorCacheSeconds, 10) || 120
),
uptimeMonitorSchedulerEnabled: Boolean(uptimeMonitorSchedulerEnabled),
uptimeMonitorSchedulerIntervalMinutes: Math.max(
1,
Math.min(1440, parseInt(uptimeMonitorSchedulerIntervalMinutes, 10) || 2)
),
trafficInterfaces: Array.isArray(trafficInterfacesSelected)
? trafficInterfacesSelected.map((p) => ({
serverKey: p.serverKey,
@@ -825,6 +838,33 @@ export default function SettingsPage() {
/>
</div>
</div>
<div className="mt-3 mb-2">
<div className="form-check form-switch mb-2">
<input
className="form-check-input"
type="checkbox"
id="uptimeMonitorSchedulerEnabled"
checked={uptimeMonitorSchedulerEnabled}
onChange={(e) => setUptimeMonitorSchedulerEnabled(e.target.checked)}
disabled={saving}
/>
<label className="form-check-label" htmlFor="uptimeMonitorSchedulerEnabled">
Планировщик: обновлять кеш проверок по расписанию (после перезапуска контейнера кеш обновится автоматически)
</label>
</div>
<FormField
label="Интервал планировщика (мин)"
name="uptimeMonitorSchedulerIntervalMinutes"
type="number"
value={uptimeMonitorSchedulerIntervalMinutes}
onChange={setUptimeMonitorSchedulerIntervalMinutes}
placeholder="2"
helpText="Как часто планировщик проверяет все jumphost/home (11440 мин). По умолчанию 2 мин."
disabled={saving}
min={1}
max={1440}
/>
</div>
</>
)}
+8 -1
View File
@@ -187,7 +187,14 @@ export default function UptimeMonitorPage() {
setChecking(false);
}, [jumphosts]);
// Автопроверка по интервалу в фоне (при открытии страницы данные берём из кеша, без немедленного запуска проверки)
// Первый запуск проверки через несколько секунд после загрузки (после перезапуска контейнера кеш может быть пустым или устаревшим)
useEffect(() => {
if (jumphosts.length === 0) return;
const t = setTimeout(runChecks, 4000);
return () => clearTimeout(t);
}, [jumphosts.length, runChecks]);
// Автопроверка по интервалу в фоне
useEffect(() => {
if (jumphosts.length === 0) return;
intervalRef.current = setInterval(runChecks, checkIntervalMs);