Self-hosted платформа обработки данных

uproj

Превращает сырые данные в решения — на вашей инфраструктуре, за дни, а не кварталы.

6Grain · Руанда

Проблема

Данные есть — пользоваться ими трудно

🛰️

Разрозненность

У каждого провайдера свой API, формат и авторизация.

🐘

Объём

Терабайты на область. Скачать на ноутбук нереально.

🧪

Разовые скрипты

Ноутбуки аналитиков не становятся повторяемым пайплайном по расписанию.

🔒

Суверенитет

Облачный SaaS — данные и результаты уезжают из страны.

🧰

Обвязка

80% любого проекта — инфраструктура: каталог, тайлинг, хранилище, доступ.

Медленно

Месяцы от «есть идея» до «работает каждую ночь».

Идея

Платформа берёт на себя скучные 80%, чтобы аналитики делали ценные 20%.

Что такое uproj

Каталог, среда исполнения и API self-hosted

🗂️

Каталог

Каждый вход и результат — элемент каталога, один индекс с поиском.

⚙️

Исполнение

Загрузил Python-скрипт → он работает в песочнице, по расписанию, масштабируемо.

🔌

API + UI

Открытые стандарты (STAC, OGC), тайлы карты, загрузки, веб-интерфейс.

Работает на ваших серверах. Данные никуда не уходят.

Что вы получаете
Дни
от идеи до пайплайна, работающего каждую ночь — не месяцы
Любой
любой источник или аналитика на Python — всё в одном каталоге
On-prem
данные и результаты никогда не покидают ваши серверы

Вся платформа на одной схеме

🌐
Браузер
веб-интерфейс
⌨️
CLI / SDK
скрипты оператора
Вход
🚪
Edge · единая точка входа
один порт, маршрутизация путей
Сервисы платформы
🖥️
Веб-интерфейс
обзор, запуск, контроль
🔌
REST + OGC API
процессы · джобы · запуски
🗂️
Каталог (STAC)
входы + результаты
🗺️
Тайлы карты
превью на карте
🔐
Авторизация
идентичность и доступ
Данные и вычисления
📦
Объектное хранилище
сцены и результаты
⚙️
Песочница исполнения
контейнер на запуск
🐘
PostgreSQL
индекс каталога + состояние
Для ваших аналитиков

Аналитик пишет Python-скрипт. Платформа делает из него сервис по расписанию с каталогом — без DevOps.

01

Что делает платформа

Один пайплайн, от и до

Загрузка
Затягиваем данные
Зеркалируем сцены из любого источника в каталог.
Подготовка
Считаем
Индексы, композиты, маски — ваша аналитика.
Публикация
Обратно в каталог
Результаты ложатся элементами каталога, готовы к работе.
Отдача
Карта · API · загрузка
Открыть на карте, спросить API, скачать файл.
Расписание
Каждую ночь
Вся цепочка перезапускается по cron, без рук.
Переиспользование
Единый источник
Входы и результаты — с поиском, в одном месте.

Подключение любых источников

📡

Публичные архивы

Открытые спутниковые и растровые архивы — затягиваются по расписанию.

🏢

Коммерческие провайдеры

API и фиды вендоров — под вашими ключами.

🗺️

Ваши данные

Дрон, аэросъёмка, векторные границы — всё, к чему есть коннектор.

Коннектор — это просто Python: новый источник = скрипт, а не проект.

Каталог — всё в одном месте

Входы и результаты — с поиском и пагинацией, превью и загрузкой.

Три понятия — вся модель

📦

Процесс

Загруженный версионируемый Python-проект. Иммутабельный — адресуется версией.

🗓️

Джоба

Сохранённая конфигурация: какой процесс, какие параметры, опциональное расписание.

▶️

Запуск

Одно исполнение — состояние, логи и полученный результат.

Открывается прямо в QGIS

Результаты открываются в QGIS по открытым стандартам — без экспорта и копий.
02

Архитектура

Сервисы за единой точкой входа

🌐
Браузер
веб-интерфейс
⌨️
CLI / SDK
скрипты оператора
Вход
🚪
Edge · единая точка входа
один порт, маршрутизация путей
Сервисы платформы
🖥️
Веб-интерфейс
обзор, запуск, контроль
🔌
REST + OGC API
процессы · джобы · запуски
🗂️
Каталог (STAC)
входы + результаты
🗺️
Тайлы карты
превью на карте
🔐
Авторизация
идентичность и доступ
Данные и вычисления
📦
Объектное хранилище
сцены и результаты
⚙️
Песочница исполнения
контейнер на запуск
🐘
PostgreSQL
индекс каталога + состояние

Каждый кусок делает одно дело хорошо

🚪

Edge

Один порт, маршруты / · /api · каталог · тайлы · auth · хранилище.

🔌

API

REST + OGC API Processes — отправить работу, забрать результат.

🗂️

Каталог

STAC поверх PostgreSQL — входы и результаты, один индекс.

📦

Хранилище

S3-совместимое объектное хранилище для каждой сцены и результата.

🗺️

Тайлы

Тайлы карты на лету прямо из сохранённых растров.

🔐

Идентичность

OIDC-вход, API-токены, доступ по ролям.

Открытые стандарты, без лок-ина

🌐

STAC

Каталог говорит на STAC — работает с QGIS и всей экосистемой.

⚙️

OGC API

Процессы и тайлы по OGC — подключается любой совместимый клиент.

🗃️

Простые форматы

Cloud-optimized GeoTIFF, JSON, S3 — ничего проприетарного.

Данные остаются портативными — вы не заперты в нашем формате.

Работает там, где нужно вам

🐳

Контейнеры

Весь стек — контейнеры, поднимается одной командой.

🔌

Air-gap

Не требует звонков наружу; работает в закрытой сети.

🖥️

Ваше железо

На серверах, которые у вас уже есть, в вашем ЦОД.

On-prem by design — суверенитет не опция, а поведение по умолчанию.

03

Как работает запуск

От клика до результата в каталоге

1 · Триггер
Кнопка или cron
Создаётся запуск — человеком или по расписанию.
2 · Допуск
Планировщик
Проверка квоты и single-active; запуск → pending.
3 · Песочница
Контейнер
Изолированный контейнер с урезанным scoped-доступом.
4 · Исполнение
Ваш Python
Читает входы, считает результат, пишет вывод.
5 · Публикация
Регистрация
Вывод сохранён и зарегистрирован элементом каталога.
6 · Готово
В каталоге
Результат, логи и статистика — видны и переиспользуемы.

Каждый запуск — песочница

🔒

Урезанные права

Без привилегий, non-root, лимиты CPU/RAM/процессов, жёсткий таймаут.

🔑

Scoped-доступ

Креды на запуск: читает свои входы, пишет только свой вывод.

🌐

Сетевая изоляция

Не видит БД и auth; опциональный allow-list исходящего трафика.

Враждебный или кривой код влияет только на свой запуск — и всё.

Надёжно по умолчанию

🗓️

Расписание

Cron на джобу; планировщик допускает запуски и держит квоты.

🚦

Без завалов

Single-active guard — медленный запуск не наслаивается сам на себя.

📜

Полный аудит

Структурные логи, статистика на запуск, состояние каждого исполнения.

04

Как аналитики пишут скрипты

Контракт крошечный

🐍

Ваш Python

src/ с вашим кодом — любые библиотеки, что объявите.

📄

pyproject.toml

Обычные зависимости. Окружение собирает платформа.

📝

process.yaml

Объявляет параметры, типы и дефолты — из него строится форма в UI.

▶️

entrypoint

Один файл на запуск. Параметры берёт из окружения.

Заархивировал, загрузил — это процесс. Без Dockerfile и инфры.

process.yaml — объявляете параметры

id: s2-ndvi
title: Sentinel-2 NDVI
category: preparation
entrypoint: src/main.py
inputs:
  - name: bbox
    type: bbox
    default: "28.8,-2.8,30.9,-1.0"
  - name: start_date
    type: string
    default: ""
  - name: max_cloud_cover
    type: integer
    default: 60
  • Типы строят форму в UI — bbox-пикер, дата, число.
  • Дефолты — джоба работает без настройки.
  • 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 — готово.
05

Платформа в работе

Каталог — все входные данные

Входы и результаты в одном браузере с поиском и пагинацией.

Карта и анализ

Любую сцену или результат — на интерактивной карте.

Джобы — конфигурации + расписание

Каждая джоба: процесс, параметры, опциональный cron, кнопка запуска.

Запуски — всё под контролем

Состояние, логи и результат в каталоге для каждого запуска.

Секреты — шифрованные, по владельцу

Креды хранятся шифрованно, привязаны ко входу процесса, не отдаются обратно.

Панель операций

Контейнеры, диск и последние запуски — оператору с одного взгляда.

Настройки — на лету, без рестарта

Лимиты, доступ и категории из UI; изменения применяются сразу.

Пользователи и доступ

Идентичность на OIDC — админы и пользователи, настоящий ролевой доступ.
06

Эксплуатация и доверие

Безопасность по слоям

🧱

Песочница запусков

Урезанные контейнеры — без привилегий, с лимитами и таймаутом.

🔑

Scoped-хранилище

Каждый запуск видит только свои данные, ничего больше.

🌐

Сетевая изоляция

Запуски не видят БД и auth; исходящий трафик опционален и по allow-list.

👤

Идентичность и RBAC

OIDC-вход, API-токены, админ vs пользователь — настоящий контроль доступа.

Эксплуатация без сюрпризов

📊

Наблюдаемость

Структурные логи, статистика на запуск, дашборд оператора.

💾

Бэкапы

Дамп БД и инвентаризация хранилища — одной командой.

⬆️

Установка и обновление

Установка и обновление — по одной команде, без ручных шагов.

07

Почему uproj

Не ноутбук. Не облачный счёт.

📓

против ноутбуков

Повторяемо, по расписанию, с каталогом, многопользовательски — не разовый скрипт.

☁️

против облачных SaaS

On-prem и суверенно — без egress-платы за сцену, на вашем железе.

🧩

Расширяемо

Любой новый источник или аналитика — просто Python, тот же контракт.

Куда движемся дальше

🛡️

Жёстче egress

Декларативные allow-list исходящего трафика на процесс.

📈

Стек наблюдаемости

Опциональные метрики и дашборды для крупных развёртываний.

GPU-вычисления

Тяжёлая аналитика на ускоренных рантаймах.

Давайте сделаем

Ваши данные, ваши серверы, ваши аналитики — в проде на следующей неделе.

6Grain · uproj.6grain.com