# 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