Files
elmer/doc/SETUP.md

5.0 KiB

elmAI — полная настройка для нового разработчика

v0.40.0-dev, 6 июня 2026


1. Что где лежит

elmer/                  ← сервер (gitea.services.ngcloud.ru/Nail/elmer)
├── api/                Python/Flask эндпоинты, БД, парсер, скрипты
├── brain/              LLM-клиент (Diagnoser), промпты
├── obd/                ELM327 стейт-машина (AndrOBD)
├── web/                Flask, шаблоны, статика (APK, лого)
├── android/            ← Android (github.com/Repinoid/elmer-android)
│   └── app/...         Kotlin-код, ресурсы
├── doc/                Документация, история изменений, DTC-коды
├── config.yaml         LLM API ключ, модель, порты
├── deploy.sh           Скрипт развёртывания
└── run.py              Локальный запуск

2. Git

Сервер: https://gitea.services.ngcloud.ru/Nail/elmer.git Android: https://github.com/Repinoid/elmer-android.git

git clone https://Nail:b1fe1db54be4cfcc19c38f7fee713cde6f351524@gitea.services.ngcloud.ru/Nail/elmer.git
cd elmer
git clone https://github.com/Repinoid/elmer-android.git android
# или если уже есть:
git pull origin master
cd android && git pull origin master

3. Зависимости сервера

cd elmer
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt gunicorn

4. Конфигурация

config.yaml:

llm:
  api_key: "sk-78ec529c1eba4ba69995091046c9fa33"
  model: "deepseek-v4-flash"
  base_url: "https://api.deepseek.com/v1"

elm327:
  port: /dev/rfcomm0
  baudrate: 38400

5. Запуск локально

cd elmer
source venv/bin/activate
python run.py
# → http://localhost:5005

6. Боевой сервер (obdai.ru, 5.172.178.213)

SSH ключ: ~/.ssh/naeel_vm_id_ed25519

ssh -i ~/.ssh/naeel_vm_id_ed25519 naeel@5.172.178.213

Деплой сервера:

ssh -i ~/.ssh/naeel_vm_id_ed25519 naeel@5.172.178.213 \
  "cd /opt/elmer && git pull origin master && sudo systemctl restart elmer"

Сборка APK (на сервере):

ssh -i ~/.ssh/naeel_vm_id_ed25519 naeel@5.172.178.213 \
  "export ANDROID_SDK_ROOT=\$HOME/android-sdk && \
   export ANDROID_HOME=\$ANDROID_SDK_ROOT && \
   cd /opt/elmer && rm -rf android && \
   cd /opt/elmer && \
   export ANDROID_SDK_ROOT=\$HOME/android-sdk && \
   export ANDROID_HOME=\$ANDROID_SDK_ROOT && \
   cd android && gradle wrapper --gradle-version 8.7 && \
   ./gradlew clean assembleDebug && \
   cp app/build/outputs/apk/debug/app-debug.apk /opt/elmer/web/static/"

Nginx:

location = /elmer.apk { alias /opt/elmer/web/static/app-debug.apk; }
location /static/ { alias /opt/elmer/web/static/; }
location / {
    proxy_pass http://127.0.0.1:8000;
    client_body_timeout 120s;
    proxy_read_timeout 300s;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

Systemd сервис: /etc/systemd/system/elmer.service

[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 --timeout 180 web.app:app
Restart=always

[Install]
WantedBy=multi-user.target

7. Структура БД SQLite

Файл: elmer.db (создаётся автоматически)

Таблица sessions (35+ колонок):

  • client_ip, real_ip, user_agent, content_length, created_at
  • phone_model, phone_maker, android_version, android_sdk, app_version
  • android_id, device_uuid, phone_lang, phone_tz, phone_display
  • elm_mac, elm_bt_name, obd_protocol
  • vin, dtc_count, pid_count
  • duration_ms, response_count, error_count, retry_count, timeout_count
  • script_mode, transport, mock_mode
  • diagnosis_text, diagnosis_len, llm_model, llm_duration_ms, llm_success
  • raw_responses, request_id, response_json

8. API эндпоинты

Метод Путь Описание
GET /api/v1/ping Проверка сервера
GET /api/v1/ping-llm Проверка LLM (кэш 60с)
GET /api/v1/script?mode=full/test Скрипт диагностики
POST /api/v1/session/upload Загрузка батча + LLM
POST /api/v1/chat Вопрос к LLM
POST /api/v1/dtc/decode Расшифровка DTC
POST /api/v1/dtc/upload Сохранение DTC

9. Правила работы с Copilot

См. .instructions.md в корне. Главное:

  • Вопрос → только ответ. Никаких действий.
  • Всегда читать doc/architecture.md перед действиями
  • Изменения документировать в doc/history/YYYY-MM-DD.md
  • APK отдавать через nginx, не через Flask