160 lines
5.0 KiB
Markdown
160 lines
5.0 KiB
Markdown
# 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`
|
|
|
|
```bash
|
|
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. Зависимости сервера
|
|
|
|
```bash
|
|
cd elmer
|
|
python3 -m venv venv
|
|
source venv/bin/activate
|
|
pip install -r requirements.txt gunicorn
|
|
```
|
|
|
|
## 4. Конфигурация
|
|
|
|
`config.yaml`:
|
|
```yaml
|
|
llm:
|
|
api_key: "sk-78ec529c1eba4ba69995091046c9fa33"
|
|
model: "deepseek-v4-flash"
|
|
base_url: "https://api.deepseek.com/v1"
|
|
|
|
elm327:
|
|
port: /dev/rfcomm0
|
|
baudrate: 38400
|
|
```
|
|
|
|
## 5. Запуск локально
|
|
|
|
```bash
|
|
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`
|
|
|
|
```bash
|
|
ssh -i ~/.ssh/naeel_vm_id_ed25519 naeel@5.172.178.213
|
|
```
|
|
|
|
**Деплой сервера:**
|
|
```bash
|
|
ssh -i ~/.ssh/naeel_vm_id_ed25519 naeel@5.172.178.213 \
|
|
"cd /opt/elmer && git pull origin master && sudo systemctl restart elmer"
|
|
```
|
|
|
|
**Сборка APK (на сервере):**
|
|
```bash
|
|
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:**
|
|
```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
|