Объявляет параметры, типы и дефолты — из него строится форма в UI.
▶️
entrypoint
Один файл на запуск. Параметры берёт из окружения.
Заархивировал, загрузил — это процесс. Без Dockerfile и инфры.
Python, R или Java — один контракт
🐍
Python
pyproject.toml + entrypoint. Платформа собирает venv через uv и запускает.
📊
R
renv.lock + entrypoint .R. renv::restore() восстанавливает тот же набор пакетов и запускает.
☕
Java
Maven-проект pom.xml. Платформа выполняет mvn package и запускает собранный jar.
Один контракт запуска для всех языков: те же параметры, то же хранилище, тот же каталог. Рантайм выбирается в process.yaml — платформа монтирует нужный образ и кэш зависимостей.
Один результат, три языка
🧮
Одна аналитика, три порта
Один и тот же NDVI-демо есть на Python, R и Java — те же входы, тот же контракт.
📦
Идентичный бандл на выходе
Каждый пишет один и тот же продукт: COG, превью PNG, CSV со статистикой и PDF-отчёт на одну страницу.
🗂️
Один элемент каталога
Все три публикуют результат одинаково — каталог не отличает, на каком языке он получен.
Доказательство: рантайм — это выбор, а не ограничение; команда пишет на привычном языке.
category задаёт расписание и поведение по умолчанию.
Никакой обвязки параметров — их передаёт платформа.
Категория задаёт поведение
📥
ingest
Затягивает внешние данные в каталог. По умолчанию — ночью.
🧮
preparation
Выводит продукты из данных каталога. Запускается после ingest.
📊
compute
Аналитика с результатами — по требованию или по расписанию.
Выбрал категорию — разумное расписание и публикация уже настроены.
SDK — это просто переменные окружения
import os, json
params = json.loads(os.environ["UPROJ_PARAMS"])
bbox = params["bbox"]
# read inputs straight from object storage via GDAL
src = "/vsis3/inputs/s2-l2a/.../red.tif"
# where to write + how to call back
out_dir = os.environ["UPROJ_OUTPUT_DIR"]
api = os.environ["UPROJ_API_URL"]
token = os.environ["UPROJ_SERVICE_TOKEN"]
Параметры приходят как JSON — без фреймворка парсинга.
Растры читаются на месте из хранилища — без скачивания.
Короткоживущий токен авторизует вызовы каталога.
Обычный Python — любые библиотеки на ваш вкус.
Разбор — ingest-скрипт
# 1. search the source for new scenes in the window
scenes = search(bbox, since=window_start)
# 2. mirror each asset into the catalog's storage
for s in scenes:
for asset in s.assets:
copy_to_storage(asset.url, key=object_key(s, asset))
# 3. register the scene as a catalog item
register_item(stac_item(s))
Поиск → зеркалирование → регистрация. Это ingest.
Уже зеркалированные сцены пропускаются — перезапуск дёшев.
Задал дату старта — бэкфилл; дальше катится вперёд по ночам.
Разбор — preprocess-скрипт
# read bands in place, compute the index
red = read("/vsis3/inputs/s2-l2a/.../red.tif")
nir = read("/vsis3/inputs/s2-l2a/.../nir.tif")
ndvi = (nir - red) / (nir + red)
# write a cloud-optimized GeoTIFF + register it
write_cog(ndvi, f"{out_dir}/ndvi.tif")
register_item(stac_item("s2-ndvi", scene_id))
Читает исходники из хранилища, пишет COG.
Публикует обратно в каталог как новый продукт.
Тот же шаблон для любого индекса, маски или композита.
Загрузка — авто-версионирование
Каждая загрузка — новая иммутабельная версия; в проде ничего не ломается.
Свяжите джобу с расписанием
Выбрал процесс, заполнил форму (дефолты уже стоят), добавил cron — готово.
06
Платформа в работе
Каталог — все входные данные
Входы и результаты в одном браузере с поиском и пагинацией.
Карта и анализ
Сцены и результаты на одной интерактивной карте — наложение, перекраска, инспекция.
Maps · Analysis — анализ результатов на месте
🗺️
Стек слоёв
Накладывайте любое число растров каталога; перетаскивание для порядка, прозрачность и палитра на слой.
🎚️
Легенды в реальных единицах
Шкала каждого слоя — в физических единицах; классовые карты получают подписанный чип на категорию.
🎯
Клик — и видно значение
Один клик показывает значение пикселя сразу по всем видимым слоям.
🛰️
Подложки и поиск
Подложки OSM, спутник или топо, поиск места для перехода куда угодно.
Джобы — конфигурации + расписание
Каждая джоба: процесс, параметры, опциональный cron, кнопка запуска.
Запуски — всё под контролем
Состояние, логи и результат в каталоге для каждого запуска.
Секреты — шифрованные, по владельцу
Креды хранятся шифрованно, привязаны ко входу процесса, не отдаются обратно.
Панель операций
Контейнеры, диск и последние запуски — оператору с одного взгляда.
Настройки — на лету, без рестарта
Лимиты, доступ и категории из UI; изменения применяются сразу.
Пользователи и доступ
Идентичность на OIDC — админы и пользователи, настоящий ролевой доступ.
07
Эксплуатация и доверие
Безопасность по слоям
🧱
Песочница запусков
Урезанные контейнеры — без привилегий, с лимитами и таймаутом.
🔑
Изолированное хранилище
Каждый запуск видит только свои данные, ничего больше.
🌐
Сетевая изоляция
Запуски не видят БД и сервис авторизации; исходящий трафик закрыт, при необходимости — по белому списку.
👤
Идентичность и RBAC
OIDC-вход, API-токены, админ vs пользователь — настоящий контроль доступа.
Делитесь осознанно, по умолчанию — приватно
👤
Видно владельцу
Процесс виден владельцу и админам — ничего не открывается случайно.
🤝
Шаринг по желанию
Один флаг — и процесс виден остальной команде.
🌍
Публичные ссылки, fail-closed
Открыть результат или его тайлы по анонимной ссылке можно только через явный белый список — выключено, пока сами не включите.
Любое расширение аудитории — осознанное действие, а не поведение по умолчанию.
Эксплуатация без сюрпризов
📊
Наблюдаемость
Структурированные логи, статистика по каждому запуску, дашборд оператора.
💾
Бэкапы
Дамп БД и инвентаризация хранилища — одной командой.
⬆️
Установка и обновление
Установка и обновление — по одной команде, без ручных шагов.
08
Почему uproj
Не ноутбук. Не облачный счёт.
📓
против ноутбуков
Повторяемо, по расписанию, с каталогом, многопользовательски — не разовый скрипт.
☁️
против облачных SaaS
On-prem и суверенно — без egress-платы за сцену, на вашем железе.
🧩
Расширяемо
Любой новый источник или аналитика — это просто код на Python, R или Java; тот же контракт.
Куда движемся дальше
🛡️
Строже по исходящему трафику
Декларативные белые списки исходящего трафика на процесс.
📈
Стек наблюдаемости
Опциональные метрики и дашборды для крупных развёртываний.
⚡
GPU-вычисления
Тяжёлая аналитика на ускоренных рантаймах.
Давайте сделаем
Ваши данные, ваши серверы, ваши аналитики — в проде на следующей неделе.