vegwatch-dzz
MVP системы анализа временных рядов дистанционного зондирования Земли для оценки растительного покрова и поиска аномалий вегетации.
В Docker-режиме всё приложение работает в одном контейнере:
- веб-интерфейс и API;
- локальная SQLite-база для пользователей, ролей и метаданных;
- локальное объектное хранилище для GeoTIFF, CSV, GeoJSON и ZIP;
- вход по email и паролю;
- роли
admin,analystиviewer.
База и загруженные файлы сохраняются в одном Docker volume и не пропадают при обновлении контейнера.
Быстрый запуск через Docker Compose
Section titled “Быстрый запуск через Docker Compose”Требуются Docker Engine и Docker Compose v2.
cp .env.docker.example .envОткройте .env и обязательно замените тестовые значения:
VEGWATCH_PORT=8080VEGWATCH_ADMIN_EMAIL=admin@your-domain.ruVEGWATCH_ADMIN_PASSWORD=your-long-random-passwordПароль должен содержать не менее 12 символов. Значение из примера контейнер принимать не будет.
Соберите и запустите сервис:
docker compose up -d --buildОткройте http://IP_СЕРВЕРА:8080 и войдите с данными администратора из .env. Первый успешный вход создаст администратора в базе. После этого новые аккаунты создаются во вкладке «Пользователи».
Для смены пароля первого администратора измените VEGWATCH_ADMIN_PASSWORD в .env, пересоздайте контейнер командой docker compose up -d --build и войдите с новым паролем. Сохранённый хеш обновится после успешного входа.
Полезные команды:
docker compose psdocker compose logs -f vegwatchdocker compose up -d --builddocker compose downdocker compose down удаляет контейнер и сеть, но сохраняет volume с данными. Не используйте флаг -v, если не хотите удалить базу и загруженные файлы.
Запуск без Compose
Section titled “Запуск без Compose”docker build -t vegwatch-dzz:latest .docker volume create vegwatch-datadocker run -d \ --name vegwatch-dzz \ --restart unless-stopped \ -p 8080:8080 \ -e VEGWATCH_ADMIN_EMAIL=admin@your-domain.ru \ -e VEGWATCH_ADMIN_PASSWORD=your-long-random-password \ -v vegwatch-data:/data \ vegwatch-dzz:latestРазмещение в интернете
Section titled “Размещение в интернете”Для публичного сервера направьте домен через Caddy, Nginx, Traefik или Cloudflare Tunnel на 127.0.0.1:8080 и включите HTTPS. Прокси должен передавать Host и X-Forwarded-Proto; при HTTPS приложение автоматически ставит cookie с флагом Secure.
Рекомендуется не публиковать порт 8080 напрямую, ограничить частоту запросов к /api/auth/login на reverse proxy и регулярно копировать Docker volume vegwatch-data.
Данные и текущие возможности
Section titled “Данные и текущие возможности”- CSV/TSV с колонками
dateиndvi,evi,ndmiлибоvalueразбирается в браузере и сразу отображается как временной ряд. - Необязательная колонка
baselineзадаёт собственную сезонную норму. - GeoTIFF, GeoJSON и ZIP потоково сохраняются в локальном объектном хранилище.
- Робастный демонстрационный детектор использует медианную сезонную норму и MAD.
- Растровая обработка GeoTIFF пока не запускается: для неё нужно подключить отдельный вычислительный API или добавить GDAL-конвейер. Сам файл уже принимается и сохраняется.
- Во вкладке «Открытая история» собраны ссылки на Landsat, Sentinel-2, MODIS и погодные источники для построения многолетней нормы.
Уровни доступа
Section titled “Уровни доступа”| Роль | Возможности |
|---|---|
| Администратор | Пользователи, роли, все данные и запуск анализа |
| Аналитик | Загрузка данных, запуск анализа и просмотр результатов |
| Наблюдатель | Только просмотр доступных результатов |
Пароли хранятся как PBKDF2-SHA-256 хеши с индивидуальной солью. В cookie находится случайный токен, а в базе — только его SHA-256 хеш. Сессия действует семь дней.
Структура контейнерного запуска
Section titled “Структура контейнерного запуска”Dockerfile— двухэтапная сборка и непривилегированный runtime-пользователь;docker-compose.yml— один сервис и один постоянный volume;wrangler.docker.jsonc— локальные D1/R2 bindings и статические файлы;docker/entrypoint.sh— проверка настроек, применение миграций и запуск;.env.docker.example— шаблон переменных окружения.
Контейнер использует локальный Cloudflare Workers runtime, чтобы Docker-версия и размещённая Sites-версия работали из одной кодовой базы. Это удобный вариант для хакатона и пилота. Для высокой нагрузки стоит вынести базу и объектное хранилище в отдельные управляемые сервисы.
Проверка разработки
Section titled “Проверка разработки”npm cinpm run buildnpm run lintnpm run test:localtest:local проверяет миграции, первый вход администратора, создание аналитика, загрузку CSV и сохранение базы/объекта после перезапуска runtime.
Обычный облачный режим
Section titled “Обычный облачный режим”Существующая конфигурация .openai/hosting.json сохранена. При размещении через Sites приложение продолжает использовать вход ChatGPT, D1 и R2; локальные email/пароль включаются только в Docker-конфигурации.
Семейство FloraScope
Section titled “Семейство FloraScope”FloraScope и этот репозиторий — разные версии одного направления. Общая тема — florascope. Здесь используется отдельный стек Workers/D1/R2; перенос данных, моделей и API между версиями требует явного сопоставления схем и не выполняется автоматически.
Проверка чистого checkout: npm ci --include=optional, npm run lint, npm run build, npm run test:local. Smoke-тест поднимает локальный runtime Miniflare и проверяет аутентификацию и сохранение прикладных данных. Он не заменяет проверку интеграции с внешними спутниковыми источниками и достоверности научной модели. CI не публикует приложение и не выдаёт релиз.
Source · AGPL-3.0