docs: подробный README (разбор проекта при переносе в Gitea)

Старый README сохранён как README.upstream.md.
Этот коммит содержится в:
2026-08-20 04:18:31 +09:00
родитель 5eeafec0d2
Коммит ec259d5e52
2 изменённых файлов: 162 добавлений и 51 удалений
+94 -51
Просмотреть файл
@@ -1,68 +1,111 @@
# DevConsole
AI-driven orchestration platform for automatic development and testing of:
Веб-панель для управления сборкой и запуском Flutter/Android-проектов на одном Linux-сервере. Оператор добавляет Git-репозиторий, DevConsole клонирует его в рабочий каталог, определяет стек, ставит зависимости, и дальше по кнопке выполняет типовые команды (`git pull`, `flutter clean`, `flutter pub get`, `flutter build apk`, `flutter run --profile`, `adb logcat`) с live-выводом в браузер. Собранный APK можно поставить на подключённое по ADB устройство или выложить по SFTP на сервер обновлений вместе с `latest.json` (OTA). Дополнительно есть песочница обращений к OpenAI Responses API с автоподбором модели по типу задачи.
- websites;
- backend services;
- Linux servers;
- Android/Flutter applications.
Панель рассчитана на одного владельца сервера: аутентификации нет, всё, что открыто по HTTP, выполняется с правами сервисного пользователя.
## Stack
## Стек
- FastAPI
- OpenAI Responses API
- SQLite/PostgreSQL
- Docker
- Android SDK
- Flutter SDK
- Git integration
- WebSocket live logs
- Python 3, FastAPI, Uvicorn.
- SQLite (`sqlite3` из стандартной библиотеки) — хранилище настроек. SQLAlchemy/aiosqlite объявлены в зависимостях, но в коде не используются.
- JSON-файлы — реестр проектов и реестр APK-артефактов.
- Frontend: статический HTML + ванильный JavaScript, без сборщика.
- OpenAI SDK (Responses API), модели по умолчанию `gpt-5` / `gpt-5-mini`.
- paramiko — SFTP-публикация OTA.
- Внешние системные инструменты: `git`, `adb`, `flutter`, `sdkmanager`, `docker`, `systemctl`, `nginx`.
- Развёртывание: bash-установщик + systemd unit.
## Planned modules
## Структура
- AI Agent Orchestrator
- Workspace Manager
- Android Builder
- Git Automation
- Release Assistant
- Live Console
- Snapshot/Rollback Engine
- Persistent Dialog Database
- Task Queue
- Device Launcher
- SSH Runner
| Путь | Назначение |
| --- | --- |
| `backend/main.py` | Точка входа FastAPI, подключение роутеров, статус системы, настройки OpenAI/GitHub, эндпоинты сборки и выдачи APK |
| `backend/config_store.py` | Настройки в SQLite (`settings`): ключ OpenAI, модель, учётка GitHub, параметры SOCKS5-прокси |
| `backend/openai_client.py` | Обёртка над OpenAI Responses API |
| `backend/model_router.py` | Выбор модели по типу задачи и по ключевым словам в промпте |
| `backend/project_analyzer.py` | Клонирование/обновление репозитория, определение стека, список шагов установки зависимостей |
| `backend/projects_registry.py` | Реестр проектов в `projects_registry.json` (включая настройки OTA) |
| `backend/projects_api.py` | `/api/projects/*` — список, регистрация, настройки проекта, версия из pubspec |
| `backend/runtime_api.py` | `/api/runtime/*` — набор runtime-команд, потоковый (SSE) вывод, остановка, установка/удаление APK, рестарт приложения |
| `backend/flutter_manual_api.py` | `/api/runtime/flutter-manual-stream` и `flutter-batch-stream` — ручные и пакетные команды Flutter |
| `backend/shell_runner.py` | Запуск shell-команд с чёрным списком опасных токенов и ограничением рабочего каталога |
| `backend/android_tools.py` | `adb devices` с разбором свойств устройств, поиск APK, `flutter build apk`, установка APK |
| `backend/ota_publish.py` | Публикация APK и `latest.json` по SFTP, синхронизация версии из `pubspec.yaml` |
| `backend/artifacts_registry.py` | История собранных APK в `apk_artifacts.json` (до 50 записей на workspace) |
| `backend/pubspec_tools.py` | Чтение `version: X.Y.Z+build` из `pubspec.yaml` |
| `backend/file_workspace.py`, `backend/workspace_api.py` | `/api/files/*` — дерево, чтение и запись файлов внутри каталога проектов |
| `backend/system_api.py` | `/api/system/checks` и `/api/system/restart` — проверка Flutter/SDK/ADB/Docker/Nginx. **Роутер не подключён в `main.py`** |
| `backend/publish_files_api.py` | Загрузка `google-services.json`, keystore, `key.properties` и т.п. в проект. **Роутер не подключён в `main.py`** |
| `backend/runtime_logs.py` | Кольцевой буфер системного лога в памяти |
| `frontend/runtime.html`, `frontend/workspace.js` | Актуальный интерфейс: проекты, устройства, runtime-сценарии, логи, панель ошибок |
| `frontend/index.html`, `frontend/app.js` | Старый интерфейс редактора. Помечен в `docs/RUNTIME_UI_BASELINE.md` как legacy |
| `docs/RUNTIME_UI_BASELINE.md` | Зафиксированный baseline UI и правило: корневой маршрут отдаёт `runtime.html` |
| `scripts/install_ubuntu.sh` | Установщик под Ubuntu: пакеты, Docker, пользователь, venv, `.env`, udev-правила, systemd |
| `requirements.txt` | Python-зависимости |
## Architecture
## Как запустить
```text
frontend/
backend/
workers/
storage/
projects/
logs/
Штатный путь — установщик (требует root, ставит систему целиком и заводит systemd-сервис):
```bash
sudo bash scripts/install_ubuntu.sh
```
## Initial roadmap
Установщик создаёт пользователя `devconsole`, каталоги `/opt/devconsole`, `/var/lib/devconsole`, `/var/log/devconsole`, ставит `adb`, `fastboot`, `openjdk-17-jdk`, Docker, клонирует репозиторий с GitHub и поднимает сервис на порту 8077.
### v0.1.0
Важно: `clone_or_update_repo()` тянет код из `DEVCONSOLE_REPO_URL` (по умолчанию GitHub) и делает `git reset --hard` + `git clean -fd` в `/opt/devconsole`. При переезде на Gitea переменную нужно переопределить, иначе установщик перезапишет каталог кодом из GitHub.
- backend skeleton;
- OpenAI API integration;
- task execution;
- workspace system;
- live logs;
- persistent history.
Ручной запуск для разработки:
### v0.2.0
```bash
python3 -m venv venv
./venv/bin/pip install -r requirements.txt
DEVCONSOLE_DATA_DIR=./data ./venv/bin/uvicorn backend.main:app --host 0.0.0.0 --port 8077
```
- Android APK builder;
- GitHub integration;
- automatic testing;
- rollback snapshots.
Запускать из корня репозитория — импорты в коде абсолютные (`from backend...`). Flutter SDK и Android SDK установщиком не ставятся, их нужно поставить отдельно и указать через переменные окружения.
### v0.3.0
## Конфигурация
- multi-agent orchestration;
- AI release assistant;
- autonomous pipelines.
Часть настроек читается из `.env` (создаётся установщиком), часть хранится в SQLite и задаётся через веб-панель. Значения из SQLite имеют приоритет над переменными окружения.
| Имя | Назначение | Пример |
| --- | --- | --- |
| `DEVCONSOLE_HOST` | Адрес прослушивания (используется только в systemd unit) | `0.0.0.0` |
| `DEVCONSOLE_PORT` | Порт панели | `8077` |
| `DEVCONSOLE_DATA_DIR` | Каталог данных: БД настроек, `projects/`, реестры, артефакты | `/var/lib/devconsole` |
| `DEVCONSOLE_LOG_DIR` | Каталог логов (используется в unit-файле) | `/var/log/devconsole` |
| `DEVCONSOLE_USB_DIR` | Каталог USB-зоны отладки | `/mnt/devconsole-usb` |
| `DEVCONSOLE_RUNTIME_HOME` | HOME для runtime-команд Flutter/ADB | `/home/devconsole` |
| `FLUTTER_HOME` | Каталог Flutter SDK, подставляется в PATH runtime-команд | `/opt/flutter` |
| `ANDROID_HOME` / `ANDROID_SDK_ROOT` | Каталог Android SDK | `/opt/android-sdk` |
| `PUB_CACHE` | Кэш pub | `/home/devconsole/.pub-cache` |
| `OPENAI_API_KEY` | Ключ OpenAI. Можно не задавать в `.env` и ввести через панель | см. `.env` |
| `OPENAI_MODEL` | Модель по умолчанию | `gpt-5` |
| `GITHUB_USERNAME` | Логин для клонирования приватных репозиториев | `viktor138irk` |
| `GITHUB_TOKEN` | Токен для клонирования. Подставляется в URL вида `https://user:token@...` | см. `.env` |
| `PROXY_ENABLED` | Включение SOCKS5-прокси (`1`/`0`) | `0` |
| `PROXY_HOST`, `PROXY_PORT`, `PROXY_USERNAME`, `PROXY_PASSWORD` | Параметры SOCKS5-прокси | `127.0.0.1`, `1080` |
| `DEVCONSOLE_ALLOW_SHELL`, `DEVCONSOLE_ALLOW_DOCKER`, `DEVCONSOLE_ALLOW_ANDROID` | Пишутся установщиком в `.env` как флаги безопасности, но в коде нигде не читаются | `1` |
| `DEVCONSOLE_DATABASE_URL` | Пишется установщиком в `.env`, в коде не используется | `sqlite+aiosqlite:///...` |
Настройки OTA задаются не через окружение, а по каждому проекту в панели и хранятся в `projects_registry.json`: `sftp_host`, `sftp_port`, `sftp_username`, `sftp_password`, `remote_path`, `public_base_url`, `latest_json_name`, `latest_apk_name`, `version`, `build`, `notes`.
## Состояние
Прототип, брошенный после короткого интенсивного спринта. Вся работа уложилась в два дня: 11 и 12 мая 2026 года. 96 коммитов, последний — 12.05.2026. Версия в коде — 0.3.1, в файле `VERSION` — 0.1.0.
Основной сценарий (добавленный проект → runtime-команды → live-лог → установка APK на устройство) собран целиком. Части, добавленные последними, до конца не сведены между backend и frontend.
## Что не доделано
- В `frontend/runtime.html` есть обработчики, которых нет в `frontend/workspace.js`: `openAddProjectModal`, `closeAddProjectModal`, `analyzeProject`, `loadApkArtifacts`, `syncPubspecVersion`. То есть модалка «Добавить проект», панель APK-артефактов и кнопка чтения версии из pubspec в текущем UI не работают.
- Роутеры `system_api` и `publish_files_api` не подключены в `main.py`. Панель статусов систем в UI и загрузка `google-services.json`/keystore недоступны.
- Эндпоинты `/api/projects/analyze`, `/api/projects/install-dependencies`, `/api/android/build`, `/api/android/apks`, `/api/files/*` не вызываются из актуального интерфейса.
- Нет аутентификации и авторизации. Открытая панель даёт запуск произвольных shell-команд (`shell_runner`, `runtime_api`, `flutter_manual_api`) и запись файлов. Защита сводится к чёрному списку строк вроде `rm -rf /` и требованию, чтобы рабочий каталог лежал внутри каталога проектов.
- Пароли SFTP и токен GitHub хранятся в открытом виде: в `projects_registry.json` и в таблице `settings` SQLite.
- SOCKS5-прокси настраивается (`build_proxy_url`, `httpx-socks` в зависимостях), но нигде не применяется: `openai_client.py` создаёт клиент без прокси.
- Из `requirements.txt` фактически не используются `sqlalchemy`, `aiosqlite`, `websockets`, `httpx`, `httpx-socks`, `python-dotenv`.
- Задекларированные в исходном README модули (оркестратор агентов, snapshot/rollback, очередь задач, SSH runner, история диалогов) не реализованы.
- Тестов нет. CI нет. Миграций БД нет — таблица `settings` создаётся на лету.
- В `system_api.py` состояние сервисов определяется через `systemctl` и `docker` — на машине без systemd эти проверки бесполезны.
+68
Просмотреть файл
@@ -0,0 +1,68 @@
# DevConsole
AI-driven orchestration platform for automatic development and testing of:
- websites;
- backend services;
- Linux servers;
- Android/Flutter applications.
## Stack
- FastAPI
- OpenAI Responses API
- SQLite/PostgreSQL
- Docker
- Android SDK
- Flutter SDK
- Git integration
- WebSocket live logs
## Planned modules
- AI Agent Orchestrator
- Workspace Manager
- Android Builder
- Git Automation
- Release Assistant
- Live Console
- Snapshot/Rollback Engine
- Persistent Dialog Database
- Task Queue
- Device Launcher
- SSH Runner
## Architecture
```text
frontend/
backend/
workers/
storage/
projects/
logs/
```
## Initial roadmap
### v0.1.0
- backend skeleton;
- OpenAI API integration;
- task execution;
- workspace system;
- live logs;
- persistent history.
### v0.2.0
- Android APK builder;
- GitHub integration;
- automatic testing;
- rollback snapshots.
### v0.3.0
- multi-agent orchestration;
- AI release assistant;
- autonomous pipelines.