обавлен индикатор статуса сервисов (зелёный/красный квадратик после даты) на главной странице, проверка через Uptime Kuma и другие сервисы из config.yaml
This commit is contained in:
parent
7a9341fbd7
commit
3c813fa0b1
@ -21,4 +21,8 @@
|
|||||||
- Перенесены ассеты из example/home_files в static/
|
- Перенесены ассеты из example/home_files в static/
|
||||||
|
|
||||||
## [fix] Мгновенное применение изменений config.yaml на главной странице
|
## [fix] Мгновенное применение изменений config.yaml на главной странице
|
||||||
- Исправлено: после сохранения config.yaml главная страница теперь сразу отображает актуальные данные (конфиг перечитывается при каждом запросе, кэш убран)
|
- Исправлено: после сохранения config.yaml главная страница теперь сразу отображает актуальные данные (конфиг перечитывается при каждом запросе, кэш убран)
|
||||||
|
|
||||||
|
## [feature] Индикатор статуса сервисов на главной странице
|
||||||
|
- Добавлен индикатор (зелёный/красный квадратик после даты) для отображения доступности всех сервисов из config.yaml (включая Uptime Kuma)
|
||||||
|
- Проверка доступности реализована через HTTP-запросы при каждом открытии главной страницы
|
||||||
32
config.yaml
32
config.yaml
@ -119,14 +119,7 @@ bookmarks:
|
|||||||
- name: auto.ru
|
- name: auto.ru
|
||||||
url: http://auto.ru/
|
url: http://auto.ru/
|
||||||
icon_name: truck
|
icon_name: truck
|
||||||
- group: Work
|
|
||||||
links:
|
|
||||||
- name: COPART
|
|
||||||
url: https://www.copart.com/
|
|
||||||
icon_name: briefcase
|
|
||||||
- name: IAAI
|
|
||||||
url: https://www.iaai.com/
|
|
||||||
icon_name: briefcase
|
|
||||||
- group: 3D
|
- group: 3D
|
||||||
links:
|
links:
|
||||||
- name: cults3d
|
- name: cults3d
|
||||||
@ -165,6 +158,13 @@ bookmarks:
|
|||||||
- name: Salvagedb
|
- name: Salvagedb
|
||||||
url: https://salvagedb.com/
|
url: https://salvagedb.com/
|
||||||
icon_name: database
|
icon_name: database
|
||||||
|
- name: COPART
|
||||||
|
url: https://www.copart.com/
|
||||||
|
icon_name: briefcase
|
||||||
|
- name: IAAI
|
||||||
|
url: https://www.iaai.com/
|
||||||
|
icon_name: briefcase
|
||||||
|
|
||||||
- group: VPN
|
- group: VPN
|
||||||
links:
|
links:
|
||||||
- name: 3ui gui
|
- name: 3ui gui
|
||||||
@ -177,5 +177,17 @@ bookmarks:
|
|||||||
weather:
|
weather:
|
||||||
api_key: "8e548386d3c6492f8ef220308231903"
|
api_key: "8e548386d3c6492f8ef220308231903"
|
||||||
lat: 55.751244
|
lat: 55.751244
|
||||||
lon: 37,618423
|
lon: 37.618423
|
||||||
cache_ttl: 60
|
cache_ttl: 60
|
||||||
|
|
||||||
|
services:
|
||||||
|
- name: Uptime Kuma
|
||||||
|
url: http://192.168.1.222:3001/
|
||||||
|
- name: PiHole X86
|
||||||
|
url: https://192.168.1.11/admin
|
||||||
|
- name: Router
|
||||||
|
url: http://192.168.1.1/
|
||||||
|
- name: Portainer
|
||||||
|
url: https://portainer.ddl.su/
|
||||||
|
- name: Grafana
|
||||||
|
url: http://192.168.1.143:3000/
|
||||||
21
main.py
21
main.py
@ -5,6 +5,7 @@ import os
|
|||||||
import requests
|
import requests
|
||||||
import time
|
import time
|
||||||
import locale
|
import locale
|
||||||
|
import socket
|
||||||
|
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
|
||||||
@ -104,6 +105,22 @@ def get_weather_forecast():
|
|||||||
except:
|
except:
|
||||||
return {'_error': str(e)}
|
return {'_error': str(e)}
|
||||||
|
|
||||||
|
def check_services_status(services, timeout=2):
|
||||||
|
"""
|
||||||
|
Проверяет доступность всех сервисов из списка.
|
||||||
|
Возвращает True, если все доступны, иначе False.
|
||||||
|
"""
|
||||||
|
import requests
|
||||||
|
for srv in services:
|
||||||
|
url = srv.get('url')
|
||||||
|
try:
|
||||||
|
resp = requests.get(url, timeout=timeout, verify=False)
|
||||||
|
if not (200 <= resp.status_code < 400):
|
||||||
|
return False
|
||||||
|
except Exception:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
@app.route('/api/config', methods=['GET'])
|
@app.route('/api/config', methods=['GET'])
|
||||||
def get_config():
|
def get_config():
|
||||||
try:
|
try:
|
||||||
@ -151,7 +168,9 @@ def index():
|
|||||||
current_time = now.strftime('%H:%M:%S')
|
current_time = now.strftime('%H:%M:%S')
|
||||||
weather = get_weather()
|
weather = get_weather()
|
||||||
config = load_config() # Загружаем актуальный конфиг при каждом запросе
|
config = load_config() # Загружаем актуальный конфиг при каждом запросе
|
||||||
return render_template('index.html', applications=config['applications'], bookmarks=config['bookmarks'], now=now_str, current_time=current_time, weather=weather)
|
services = config.get('services', [])
|
||||||
|
all_services_up = check_services_status(services) if services else None
|
||||||
|
return render_template('index.html', applications=config['applications'], bookmarks=config['bookmarks'], now=now_str, current_time=current_time, weather=weather, all_services_up=all_services_up)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app.run(debug=True, host='0.0.0.0')
|
app.run(debug=True, host='0.0.0.0')
|
||||||
|
|||||||
@ -29,6 +29,13 @@
|
|||||||
<div style="display:flex; flex-direction:row; align-items:center; gap:12px;">
|
<div style="display:flex; flex-direction:row; align-items:center; gap:12px;">
|
||||||
<span style="font-size:1.6em; color: var(--color-primary);">{{ current_time }}</span>
|
<span style="font-size:1.6em; color: var(--color-primary);">{{ current_time }}</span>
|
||||||
<span style="font-size:1.6em; color: var(--color-primary);">{{ now }}</span>
|
<span style="font-size:1.6em; color: var(--color-primary);">{{ now }}</span>
|
||||||
|
{% if all_services_up is not none %}
|
||||||
|
{% if all_services_up %}
|
||||||
|
<span title="Статус сервисов" style="display:inline-block; width:18px; height:18px; border-radius:4px; margin-left:8px; background:#2ecc40; border:1.5px solid #444;"></span>
|
||||||
|
{% else %}
|
||||||
|
<span title="Статус сервисов" style="display:inline-block; width:18px; height:18px; border-radius:4px; margin-left:8px; background:#ff4136; border:1.5px solid #444;"></span>
|
||||||
|
{% endif %}
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="WeatherWidget_WeatherWidget__3XlYt" id="weather-area" style="cursor:pointer;">
|
<div class="WeatherWidget_WeatherWidget__3XlYt" id="weather-area" style="cursor:pointer;">
|
||||||
<div>
|
<div>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user