5.0 KiB
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