diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..b7ec436 --- /dev/null +++ b/deploy.sh @@ -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 diff --git a/web/script_builder.py b/web/script_builder.py index 68be13c..28a8ccb 100644 --- a/web/script_builder.py +++ b/web/script_builder.py @@ -2,23 +2,26 @@ def build_default_script() -> dict: - """Стандартный скрипт диагностики.""" + """Минимальный скрипт для отладки: 1 PID → LLM.""" return { "version": 1, - "title": "Базовая диагностика", + "title": "Экспресс-диагностика", + "steps": [ + {"id": "pid_05", "cmd": "0105", "desc": "Температура ОЖ"}, + ], + } + + +def build_full_script() -> dict: + """Полный скрипт диагностики.""" + return { + "version": 1, + "title": "Полная диагностика", "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_0C", "cmd": "010C", "desc": "Обороты"}, {"id": "pid_0D", "cmd": "010D", "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_06", "cmd": "0106", "desc": "STFT"}, {"id": "pid_07", "cmd": "0107", "desc": "LTFT"}, diff --git a/web/script_endpoint.py b/web/script_endpoint.py index 7fd73a8..f85cb83 100644 --- a/web/script_endpoint.py +++ b/web/script_endpoint.py @@ -5,7 +5,7 @@ POST /api/v1/session/upload — приём батча, LLM-анализ, воз """ 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 logger = logging.getLogger("elmer.script") @@ -54,8 +54,10 @@ def register(app): @app.route("/api/v1/script", methods=["GET"]) def get_script(): - from flask import jsonify - return jsonify(build_default_script()) + from flask import jsonify, request + 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"]) def upload_session(): diff --git a/web/templates/index.html b/web/templates/index.html index 898f309..32bb228 100644 --- a/web/templates/index.html +++ b/web/templates/index.html @@ -11,18 +11,18 @@

🔧 Elmer

-

Диагностика через ELM327 + ИИ

+

Диагностика авто через ELM327 + ИИ

+

v0.16.0-dev — 28 мая 2026

-

📱 Скачай APK прямо на телефон:

- +

📱 Скачай приложение на телефон:

+
⬇️ Скачать Elmer APK +

v0.16.0-dev • нажмите чтобы скачать

- +