fix: убрана кнопка десктоп-диагностики, версия на странице
This commit is contained in:
@@ -0,0 +1,86 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Деплой Elmer на obdai.ru
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "=== Установка пакетов ==="
|
||||||
|
apt update && apt install -y python3-pip python3-venv nginx certbot python3-certbot-nginx
|
||||||
|
|
||||||
|
echo "=== Клонирование репо ==="
|
||||||
|
cd /opt
|
||||||
|
git clone https://gitea.services.ngcloud.ru/Nail/elmer.git || (cd elmer && git pull)
|
||||||
|
cd elmer
|
||||||
|
git checkout fat-client
|
||||||
|
|
||||||
|
echo "=== Виртуальное окружение ==="
|
||||||
|
python3 -m venv venv
|
||||||
|
source venv/bin/activate
|
||||||
|
pip install -r requirements.txt
|
||||||
|
pip install gunicorn
|
||||||
|
|
||||||
|
echo "=== Конфигурация ==="
|
||||||
|
cp config.yaml config.yaml.bak
|
||||||
|
cat > config.yaml << 'YAML'
|
||||||
|
elm327:
|
||||||
|
port: /dev/rfcomm0
|
||||||
|
baudrate: 38400
|
||||||
|
|
||||||
|
llm:
|
||||||
|
api_key: "sk-ucI5YvOticoOQ9Kuj5K9mQ"
|
||||||
|
model: "gpt-oss-120b"
|
||||||
|
base_url: "https://api.aillm.ru/v1"
|
||||||
|
|
||||||
|
pids:
|
||||||
|
"0105": ["coolant_temp", "°C"]
|
||||||
|
"010C": ["rpm", "об/мин"]
|
||||||
|
"010D": ["speed", "км/ч"]
|
||||||
|
YAML
|
||||||
|
|
||||||
|
echo "=== Systemd сервис ==="
|
||||||
|
cat > /etc/systemd/system/elmer.service << 'UNIT'
|
||||||
|
[Unit]
|
||||||
|
Description=Elmer Flask API
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
User=naeel
|
||||||
|
WorkingDirectory=/opt/elmer
|
||||||
|
ExecStart=/opt/elmer/venv/bin/gunicorn -w 4 -b 127.0.0.1:8000 web.app:app
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
UNIT
|
||||||
|
|
||||||
|
echo "=== Nginx ==="
|
||||||
|
cat > /etc/nginx/sites-available/elmer << 'NGX'
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name obdai.ru www.obdai.ru ai.obdai.ru test.obdai.ru;
|
||||||
|
|
||||||
|
location /static/ {
|
||||||
|
alias /opt/elmer/web/static/;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:8000;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NGX
|
||||||
|
|
||||||
|
ln -sf /etc/nginx/sites-available/elmer /etc/nginx/sites-enabled/
|
||||||
|
rm -f /etc/nginx/sites-enabled/default
|
||||||
|
nginx -t && systemctl reload nginx
|
||||||
|
|
||||||
|
echo "=== SSL ==="
|
||||||
|
certbot --nginx -d obdai.ru -d www.obdai.ru --non-interactive --agree-tos -m tazet@narod.ru || true
|
||||||
|
|
||||||
|
echo "=== Запуск ==="
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable elmer
|
||||||
|
systemctl restart elmer
|
||||||
|
systemctl restart nginx
|
||||||
|
|
||||||
|
echo "=== ГОТОВО ==="
|
||||||
|
curl -s http://obdai.ru/api/v1/script | head -c 50
|
||||||
+13
-10
@@ -2,23 +2,26 @@
|
|||||||
|
|
||||||
|
|
||||||
def build_default_script() -> dict:
|
def build_default_script() -> dict:
|
||||||
"""Стандартный скрипт диагностики."""
|
"""Минимальный скрипт для отладки: 1 PID → LLM."""
|
||||||
return {
|
return {
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"title": "Базовая диагностика",
|
"title": "Экспресс-диагностика",
|
||||||
|
"steps": [
|
||||||
|
{"id": "pid_05", "cmd": "0105", "desc": "Температура ОЖ"},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def build_full_script() -> dict:
|
||||||
|
"""Полный скрипт диагностики."""
|
||||||
|
return {
|
||||||
|
"version": 1,
|
||||||
|
"title": "Полная диагностика",
|
||||||
"steps": [
|
"steps": [
|
||||||
{"id": "prompt_engine", "prompt": "Заведите двигатель (холостой ход) и нажмите «Далее»",
|
|
||||||
"wait_for_user": True},
|
|
||||||
{"id": "vin", "cmd": "0902", "desc": "VIN"},
|
|
||||||
{"id": "dtc_stored", "cmd": "03", "desc": "Ошибки (сохранённые)"},
|
|
||||||
{"id": "dtc_pending", "cmd": "07", "desc": "Ошибки (ожидающие)"},
|
|
||||||
{"id": "pid_05", "cmd": "0105", "desc": "Температура ОЖ"},
|
{"id": "pid_05", "cmd": "0105", "desc": "Температура ОЖ"},
|
||||||
{"id": "pid_0C", "cmd": "010C", "desc": "Обороты"},
|
{"id": "pid_0C", "cmd": "010C", "desc": "Обороты"},
|
||||||
{"id": "pid_0D", "cmd": "010D", "desc": "Скорость"},
|
{"id": "pid_0D", "cmd": "010D", "desc": "Скорость"},
|
||||||
{"id": "pid_11", "cmd": "0111", "desc": "Дроссель"},
|
{"id": "pid_11", "cmd": "0111", "desc": "Дроссель"},
|
||||||
{"id": "pid_0B", "cmd": "010B", "desc": "MAP"},
|
|
||||||
{"id": "pid_0F", "cmd": "010F", "desc": "IAT"},
|
|
||||||
{"id": "pid_1F", "cmd": "011F", "desc": "Время работы"},
|
|
||||||
{"id": "pid_04", "cmd": "0104", "desc": "Нагрузка"},
|
{"id": "pid_04", "cmd": "0104", "desc": "Нагрузка"},
|
||||||
{"id": "pid_06", "cmd": "0106", "desc": "STFT"},
|
{"id": "pid_06", "cmd": "0106", "desc": "STFT"},
|
||||||
{"id": "pid_07", "cmd": "0107", "desc": "LTFT"},
|
{"id": "pid_07", "cmd": "0107", "desc": "LTFT"},
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ POST /api/v1/session/upload — приём батча, LLM-анализ, воз
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
from web.script_builder import build_default_script
|
from web.script_builder import build_default_script, build_full_script
|
||||||
from web.script_parser import parse_batch, format_no_llm
|
from web.script_parser import parse_batch, format_no_llm
|
||||||
|
|
||||||
logger = logging.getLogger("elmer.script")
|
logger = logging.getLogger("elmer.script")
|
||||||
@@ -54,8 +54,10 @@ def register(app):
|
|||||||
|
|
||||||
@app.route("/api/v1/script", methods=["GET"])
|
@app.route("/api/v1/script", methods=["GET"])
|
||||||
def get_script():
|
def get_script():
|
||||||
from flask import jsonify
|
from flask import jsonify, request
|
||||||
return jsonify(build_default_script())
|
mode = request.args.get("mode", "full")
|
||||||
|
script = build_full_script() if mode == "full" else build_default_script()
|
||||||
|
return jsonify(script)
|
||||||
|
|
||||||
@app.route("/api/v1/session/upload", methods=["POST"])
|
@app.route("/api/v1/session/upload", methods=["POST"])
|
||||||
def upload_session():
|
def upload_session():
|
||||||
|
|||||||
@@ -11,18 +11,18 @@
|
|||||||
<body>
|
<body>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<h1>🔧 Elmer</h1>
|
<h1>🔧 Elmer</h1>
|
||||||
<p class="subtitle">Диагностика через ELM327 + ИИ</p>
|
<p class="subtitle">Диагностика авто через ELM327 + ИИ</p>
|
||||||
|
<p class="subtitle" style="font-size:12px;opacity:0.7;">v0.16.0-dev — 28 мая 2026</p>
|
||||||
|
|
||||||
<div class="card" style="text-align:center;margin-bottom:20px;">
|
<div class="card" style="text-align:center;margin-bottom:20px;">
|
||||||
<p style="margin:0 0 10px 0;">📱 Скачай APK прямо на телефон:</p>
|
<p style="margin:0 0 10px 0;">📱 Скачай приложение на телефон:</p>
|
||||||
<a href="/elmer.apk" style="color:#ff6b35;font-size:18px;font-weight:bold;text-decoration:none;">
|
<a href="/static/app-debug.apk" style="color:#ff6b35;font-size:18px;font-weight:bold;text-decoration:none;">
|
||||||
⬇️ Скачать Elmer APK
|
⬇️ Скачать Elmer APK
|
||||||
</a>
|
</a>
|
||||||
|
<p style="font-size:11px;opacity:0.6;margin:4px 0 0 0;">v0.16.0-dev • нажмите чтобы скачать</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button id="btn-diagnose" onclick="runDiagnose()">
|
<!-- Кнопка десктоп-диагностики скрыта — только для разработчика с прямым ELM327 -->
|
||||||
🚗 Подключить и диагностировать
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<div id="status"></div>
|
<div id="status"></div>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user