fix: deploy.sh на master, legacy-префиксы, v0.48.0-dev везде
This commit is contained in:
@@ -17,7 +17,7 @@ git add -A && git commit -m "краткое описание" && git push origin
|
|||||||
Перед **каждым** деплоем APK на сервер — инкрементировать патч-версию в `android/app/build.gradle.kts`:
|
Перед **каждым** деплоем APK на сервер — инкрементировать патч-версию в `android/app/build.gradle.kts`:
|
||||||
|
|
||||||
```
|
```
|
||||||
versionName = "0.42.0-dev" → versionName = "0.43.0-dev"
|
versionName = "X.Y.Z-dev" → versionName = "X.Y+1.Z-dev"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Процедура
|
### Процедура
|
||||||
@@ -26,10 +26,10 @@ versionName = "0.42.0-dev" → versionName = "0.43.0-dev"
|
|||||||
3. Закоммитить с сообщением `"bump vX.Y.Z-dev"`
|
3. Закоммитить с сообщением `"bump vX.Y.Z-dev"`
|
||||||
4. Затем — сборка и деплой
|
4. Затем — сборка и деплой
|
||||||
|
|
||||||
### Пример
|
### Пример (актуальный)
|
||||||
```
|
```
|
||||||
Было: versionName = "0.42.0-dev"
|
Было: versionName = "0.47.0-dev"
|
||||||
Стало: versionName = "0.43.0-dev"
|
Стало: versionName = "0.48.0-dev"
|
||||||
```
|
```
|
||||||
|
|
||||||
## 3. Формат коммитов
|
## 3. Формат коммитов
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
# elmAI — Changelog / Полное описание проекта
|
# elmAI — Changelog / Полное описание проекта
|
||||||
|
|
||||||
> Файл для нового агента: прочитай — и ты в курсе всего.
|
> Файл для нового агента: прочитай — и ты в курсе всего.
|
||||||
> Актуально: v0.48.0, 7 июня 2026
|
> Актуально: v0.48.0-dev, 7 июня 2026
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +1,12 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Деплой Elmer на obdai.ru
|
# Деплой Elmer на obdai.ru
|
||||||
|
# ВНИМАНИЕ: запускать НА СЕРВЕРЕ (5.172.178.213), не локально!
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
echo "=== Установка пакетов ==="
|
echo "=== Обновление репо ==="
|
||||||
apt update && apt install -y python3-pip python3-venv nginx certbot python3-certbot-nginx
|
cd /opt/elmer || { echo "Репозиторий не найден, клонируем..."; git clone https://gitea.services.ngcloud.ru/Nail/elmer.git /opt/elmer; cd /opt/elmer; }
|
||||||
|
git checkout master
|
||||||
echo "=== Клонирование репо ==="
|
git pull origin master
|
||||||
cd /opt
|
|
||||||
git clone https://gitea.services.ngcloud.ru/Nail/elmer.git || (cd elmer && git pull)
|
|
||||||
cd elmer
|
|
||||||
git checkout fat-client
|
|
||||||
|
|
||||||
echo "=== Виртуальное окружение ==="
|
echo "=== Виртуальное окружение ==="
|
||||||
python3 -m venv venv
|
python3 -m venv venv
|
||||||
@@ -17,26 +14,8 @@ source venv/bin/activate
|
|||||||
pip install -r requirements.txt
|
pip install -r requirements.txt
|
||||||
pip install gunicorn
|
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 сервис ==="
|
echo "=== Systemd сервис ==="
|
||||||
cat > /etc/systemd/system/elmer.service << 'UNIT'
|
sudo cat > /etc/systemd/system/elmer.service << 'UNIT'
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Elmer Flask API
|
Description=Elmer Flask API
|
||||||
After=network.target
|
After=network.target
|
||||||
@@ -52,7 +31,7 @@ WantedBy=multi-user.target
|
|||||||
UNIT
|
UNIT
|
||||||
|
|
||||||
echo "=== Nginx ==="
|
echo "=== Nginx ==="
|
||||||
cat > /etc/nginx/sites-available/elmer << 'NGX'
|
sudo cat > /etc/nginx/sites-available/elmer << 'NGX'
|
||||||
server {
|
server {
|
||||||
listen 80;
|
listen 80;
|
||||||
server_name obdai.ru www.obdai.ru ai.obdai.ru test.obdai.ru;
|
server_name obdai.ru www.obdai.ru ai.obdai.ru test.obdai.ru;
|
||||||
@@ -69,18 +48,20 @@ server {
|
|||||||
}
|
}
|
||||||
NGX
|
NGX
|
||||||
|
|
||||||
ln -sf /etc/nginx/sites-available/elmer /etc/nginx/sites-enabled/
|
sudo ln -sf /etc/nginx/sites-available/elmer /etc/nginx/sites-enabled/
|
||||||
rm -f /etc/nginx/sites-enabled/default
|
sudo rm -f /etc/nginx/sites-enabled/default
|
||||||
nginx -t && systemctl reload nginx
|
sudo nginx -t && sudo systemctl reload nginx
|
||||||
|
|
||||||
echo "=== SSL ==="
|
echo "=== SSL (первичная настройка, потом не трогает) ==="
|
||||||
certbot --nginx -d obdai.ru -d www.obdai.ru --non-interactive --agree-tos -m tazet@narod.ru || true
|
sudo certbot --nginx -d obdai.ru -d www.obdai.ru --non-interactive --agree-tos -m tazet@narod.ru || true
|
||||||
|
|
||||||
echo "=== Запуск ==="
|
echo "=== Запуск ==="
|
||||||
systemctl daemon-reload
|
sudo systemctl daemon-reload
|
||||||
systemctl enable elmer
|
sudo systemctl enable elmer
|
||||||
systemctl restart elmer
|
sudo systemctl restart elmer
|
||||||
systemctl restart nginx
|
sudo systemctl restart nginx
|
||||||
|
|
||||||
|
echo "=== ПРОВЕРКА ==="
|
||||||
|
curl -s https://obdai.ru/api/v1/ping
|
||||||
|
echo ""
|
||||||
echo "=== ГОТОВО ==="
|
echo "=== ГОТОВО ==="
|
||||||
curl -s http://obdai.ru/api/v1/script | head -c 50
|
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
# Архитектура elmAI
|
# Архитектура elmAI
|
||||||
|
|
||||||
> v0.48.0, 7 июня 2026
|
> v0.48.0-dev, 7 июня 2026
|
||||||
|
|
||||||
## Общая схема
|
## Общая схема
|
||||||
|
|
||||||
|
|||||||
Executable
+86
@@ -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
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
## 4. Контекст проекта (РЕЗЮМЕ для нового чата)
|
||||||
|
|
||||||
|
### Что это
|
||||||
|
elmAI — Android-приложение + Python-сервер для диагностики авто через ELM327.
|
||||||
|
|
||||||
|
### Текущая версия
|
||||||
|
**v0.48.0** (APK: https://obdai.ru/elmer.apk)
|
||||||
|
|
||||||
|
### Репозитории
|
||||||
|
- Сервер: https://gitea.services.ngcloud.ru/Nail/elmer (ветка master)
|
||||||
|
- Android: https://github.com/Repinoid/elmer-android (ветка relay-only)
|
||||||
|
- Сервер живёт на 5.172.178.213 (SSH: naeel@5.172.178.213, ключ ~/.ssh/naeel_vm_id_ed25519)
|
||||||
|
|
||||||
|
### Деплой
|
||||||
|
```bash
|
||||||
|
# ВСЕГДА сначала bump версии в android/app/build.gradle.kts!
|
||||||
|
cd /home/naeel/elmer/android && git add -A && git commit -m "..." && git push origin master
|
||||||
|
cd /home/naeel/elmer && tar czf /tmp/android-src.tar.gz --exclude='.git' --exclude='build' --exclude='.gradle' android/
|
||||||
|
scp -i ~/.ssh/naeel_vm_id_ed25519 /tmp/android-src.tar.gz naeel@5.172.178.213:/tmp/
|
||||||
|
ssh -i ~/.ssh/naeel_vm_id_ed25519 naeel@5.172.178.213 \
|
||||||
|
"cd /opt/elmer && rm -rf android && tar xzf /tmp/android-src.tar.gz && \
|
||||||
|
cd android && gradle wrapper --gradle-version 8.7 && \
|
||||||
|
export ANDROID_SDK_ROOT=\$HOME/android-sdk && \
|
||||||
|
./gradlew clean assembleDebug && \
|
||||||
|
cp app/build/outputs/apk/debug/app-debug.apk /opt/elmer/web/static/"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Структура проекта
|
||||||
|
```
|
||||||
|
elmer/
|
||||||
|
android/ — Android-приложение (Kotlin)
|
||||||
|
.../client/
|
||||||
|
MainActivity.kt — UI + приёмники
|
||||||
|
ElmForwardService.kt — BT/TCP-реле
|
||||||
|
TestService.kt — автономный тест ELM
|
||||||
|
api/ — Flask API (Python)
|
||||||
|
db.py — БД (sessions + device_profiles)
|
||||||
|
routes.py — эндпоинты
|
||||||
|
scripts.py — скрипты L0/L1/L2
|
||||||
|
parser.py — парсинг ответов
|
||||||
|
config.py, dtc.py, ping.py
|
||||||
|
brain/ — LLM-клиент, промпты
|
||||||
|
obd/ — ELM-протокол (Python)
|
||||||
|
commands.py — каталог AT-команд
|
||||||
|
classifier.py — классификация ответов
|
||||||
|
connection.py — SerialTransport
|
||||||
|
probe.py — пробинг ELM
|
||||||
|
protocol.py — стейт-машина AndrOBD
|
||||||
|
state.py — состояния/ответы
|
||||||
|
timing.py — адаптивный таймаут
|
||||||
|
doc/ — Документация, сессии
|
||||||
|
web/ — Flask web, статика
|
||||||
|
```
|
||||||
|
|
||||||
|
### Что сделано (сессия 2026-06-07)
|
||||||
|
|
||||||
|
#### Сервер
|
||||||
|
- **Пробинг ELM**: трехуровневый каскад (L0/L1/L2), профили в БД по MAC
|
||||||
|
- **Fix init**: больше не шлём ATAT1/ATSTxx (вешало клоны)
|
||||||
|
- **Скрипты под уровень**: L0 (5 PIDs), L1 (8 + VIN), L2 (14 + калибровки)
|
||||||
|
- **Рефакторинг**: код разбит на независимые модули (commands, classifier, connection...)
|
||||||
|
|
||||||
|
#### Android
|
||||||
|
- **Вывод**: append вместо overwrite (строки не перекрываются)
|
||||||
|
- **Таймер**: отдельный TextView, тикает только во время обмена (Engine Time)
|
||||||
|
- **TestService**: адаптивные таймауты, ATS0, \r терминатор
|
||||||
|
|
||||||
|
### Что НЕ сделано (TODO)
|
||||||
|
- Полевой тест на машине ← СЕЙЧАС
|
||||||
|
- Разбить MainActivity.kt
|
||||||
|
- Разбить ElmChecker.kt
|
||||||
|
|
||||||
|
### Важные правила
|
||||||
|
- ELM327 v1.5 — фейк, НЕ слать ATAT1/AT@1/AT@2/ATST/ATCAF1/ATCFC1
|
||||||
|
- Все статусы через append("\n..."), не tvStatus.text =
|
||||||
|
- Таймер операций (opTimerStart/Stop), не сессии
|
||||||
|
- Версию поднимать ВЕЗДЕ: build.gradle.kts, index.html (2 места), CHANGELOG.md, resume.txt, doc/architecture.md
|
||||||
|
- В проекте elmer — НИЧЕГО не делать без прямого указания
|
||||||
+22
-10
@@ -4,25 +4,37 @@
|
|||||||
elmAI — Android-приложение + Python-сервер для диагностики авто через ELM327.
|
elmAI — Android-приложение + Python-сервер для диагностики авто через ELM327.
|
||||||
|
|
||||||
### Текущая версия
|
### Текущая версия
|
||||||
**v0.48.0** (APK: https://obdai.ru/elmer.apk)
|
<!-- !!! АКТУАЛЬНАЯ ВЕРСИЯ !!! -->
|
||||||
|
<!-- Перед деплоем bump в android/app/build.gradle.kts, index.html (2 места), CHANGELOG.md, resume.txt, doc/architecture.md -->
|
||||||
|
**v0.48.0-dev** (APK: https://obdai.ru/elmer.apk)
|
||||||
|
|
||||||
### Репозитории
|
### Репозитории
|
||||||
- Сервер: https://gitea.services.ngcloud.ru/Nail/elmer (ветка master)
|
- Сервер: https://gitea.services.ngcloud.ru/Nail/elmer (ветка master)
|
||||||
- Android: https://github.com/Repinoid/elmer-android (ветка relay-only)
|
- Android: https://github.com/Repinoid/elmer-android (ветка relay-only)
|
||||||
- Сервер живёт на 5.172.178.213 (SSH: naeel@5.172.178.213, ключ ~/.ssh/naeel_vm_id_ed25519)
|
- Сервер живёт на 5.172.178.213 (SSH: naeel@5.172.178.213, ключ ~/.ssh/naeel_vm_id_ed25519)
|
||||||
|
|
||||||
### Деплой
|
### Деплой (localhost → сервер)
|
||||||
```bash
|
```bash
|
||||||
# ВСЕГДА сначала bump версии в android/app/build.gradle.kts!
|
# 1. bump версии в android/app/build.gradle.kts на локальной машине!
|
||||||
cd /home/naeel/elmer/android && git add -A && git commit -m "..." && git push origin master
|
# 2. закоммитить + запушить
|
||||||
|
cd /home/naeel/elmer && git add -A && git commit -m "bump vX.Y.Z-dev" && git push origin master
|
||||||
|
|
||||||
|
# 3. залить android-исходники на сервер
|
||||||
cd /home/naeel/elmer && tar czf /tmp/android-src.tar.gz --exclude='.git' --exclude='build' --exclude='.gradle' android/
|
cd /home/naeel/elmer && tar czf /tmp/android-src.tar.gz --exclude='.git' --exclude='build' --exclude='.gradle' android/
|
||||||
scp -i ~/.ssh/naeel_vm_id_ed25519 /tmp/android-src.tar.gz naeel@5.172.178.213:/tmp/
|
scp -i ~/.ssh/naeel_vm_id_ed25519 /tmp/android-src.tar.gz naeel@5.172.178.213:/tmp/
|
||||||
ssh -i ~/.ssh/naeel_vm_id_ed25519 naeel@5.172.178.213 \
|
|
||||||
"cd /opt/elmer && rm -rf android && tar xzf /tmp/android-src.tar.gz && \
|
# 4. на сервере: обновить сервер + собрать APK
|
||||||
cd android && gradle wrapper --gradle-version 8.7 && \
|
ssh -i ~/.ssh/naeel_vm_id_ed25519 naeel@5.172.178.213 "
|
||||||
export ANDROID_SDK_ROOT=\$HOME/android-sdk && \
|
cd /opt/elmer && git checkout master && git pull origin master
|
||||||
./gradlew clean assembleDebug && \
|
pip install -r requirements.txt
|
||||||
cp app/build/outputs/apk/debug/app-debug.apk /opt/elmer/web/static/"
|
sudo systemctl restart elmer
|
||||||
|
|
||||||
|
rm -rf android && tar xzf /tmp/android-src.tar.gz
|
||||||
|
cd android && gradle wrapper --gradle-version 8.7
|
||||||
|
export ANDROID_SDK_ROOT=\$HOME/android-sdk
|
||||||
|
./gradlew clean assembleDebug
|
||||||
|
cp app/build/outputs/apk/debug/app-debug.apk /opt/elmer/web/static/
|
||||||
|
"
|
||||||
```
|
```
|
||||||
|
|
||||||
### Структура проекта
|
### Структура проекта
|
||||||
|
|||||||
@@ -13,14 +13,14 @@
|
|||||||
<img src="/static/logo.png" alt="elmAI" style="width:96px;height:96px;border-radius:20px;margin-bottom:10px;">
|
<img src="/static/logo.png" alt="elmAI" style="width:96px;height:96px;border-radius:20px;margin-bottom:10px;">
|
||||||
<h1>elmAI</h1>
|
<h1>elmAI</h1>
|
||||||
<p class="subtitle">Диагностика авто через ELM327 + ИИ</p>
|
<p class="subtitle">Диагностика авто через ELM327 + ИИ</p>
|
||||||
<p class="subtitle" style="font-size:12px;opacity:0.7;">v0.48.0 — 7 июня 2026</p>
|
<p class="subtitle" style="font-size:12px;opacity:0.7;">v0.48.0-dev — 7 июня 2026</p>
|
||||||
|
|
||||||
<div class="card" style="text-align:center;margin-bottom:20px;">
|
<div class="card" style="text-align:center;margin-bottom:20px;">
|
||||||
<p style="margin:0 0 10px 0;">📱 Скачай приложение на телефон:</p>
|
<p style="margin:0 0 10px 0;">📱 Скачай приложение на телефон:</p>
|
||||||
<a href="/static/app-debug.apk" style="color:#ff6b35;font-size:18px;font-weight:bold;text-decoration:none;">
|
<a href="/static/app-debug.apk" style="color:#ff6b35;font-size:18px;font-weight:bold;text-decoration:none;">
|
||||||
⬇️ Скачать elmAI APK
|
⬇️ Скачать elmAI APK
|
||||||
</a>
|
</a>
|
||||||
<p style="font-size:11px;opacity:0.6;margin:4px 0 0 0;">v0.48.0 • нажмите чтобы скачать</p>
|
<p style="font-size:11px;opacity:0.6;margin:4px 0 0 0;">v0.48.0-dev • нажмите чтобы скачать</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Кнопка десктоп-диагностики скрыта — только для разработчика с прямым ELM327 -->
|
<!-- Кнопка десктоп-диагностики скрыта — только для разработчика с прямым ELM327 -->
|
||||||
|
|||||||
Reference in New Issue
Block a user