
Фреймворк OSINT и анализа связей с открытым исходным кодом
<div align="center"> <img src="https://assets.kitploit.com/production/public/readmes/12241/4d60ae367bb5f1d9b7d1d95df2b16186f01454c9610e40703f636923a0a70ced.png" alt="Маскот OGI" width="200" /> # OpenGraph Intel (OGI) **Открытая платформа визуального анализа связей и OSINT.** **Бесплатно, самостоятельно развертываемое и развиваемое сообществом.** [](https://www.gnu.org/licenses/agpl-3.0) [](https://github.com/khashashin/ogi/actions/workflows/ci.yml) [](https://github.com/khashashin/ogi/actions/workflows/docker-publish.yml) [](https://www.python.org) [](https://www.typescriptlang.org) [](https://react.dev) [](https://fastapi.tiangolo.com)  [Возможности](#features) • [Скриншоты](#screenshots) • [Быстрый старт](#quick-start) • [Docker](#docker) • [Transform Hub](#transform-hub) • [Архитектура](#architecture) • [Участие](#contributing) </div> --- > **Внимание:** Этот проект активно развивается. Он обладает надежными основными возможностями и покрытием тестами, и мы продолжаем улучшать документацию, защиту и функциональные возможности с каждым релизом. Приветствуются вклады, сообщения об ошибках и отзывы. ## Возможности - **Визуальное исследование графов** — перетаскивание сущностей, интерактивное исследование связей - **20+ встроенных трансформаций** — DNS, WHOIS, SSL-сертификаты, геолокация, обогащение веб/email/хэш/социальных сетей и другое - **Transform Hub** — просматривайте и устанавливайте трансформации сообщества из [реестра](https://github.com/opengraphintel/ogi-transforms) - **AI Investigator** — агентные исследования на основе подсказок, которые планируют запуски трансформаций, транслируют прогресс в реальном времени и обобщают результаты с возможностью аудита - **Импорт / Экспорт** — импорт в форматах JSON, CSV, GraphML и MTGX - **Анализ графов** — центральность, обнаружение сообществ, кратчайшие пути - **Совместная работа в реальном времени** — проекты, общий доступ и синхронизация в реальном времени через Supabase Realtime - **Асинхронные задания трансформаций** — очередь Redis/RQ с обновлениями прогресса через WebSocket - **Система плагинов** — обнаружение плагинов на основе директорий с манифестами YAML - **Инструмент CLI** — поиск, установка и управление трансформациями из терминала - **Работает везде** — локальный режим SQLite (без конфигурации) или PostgreSQL + Supabase для командных/облачных настроек - **Готов к использованию с Docker** — развертывание одной командой `docker compose up` ## Скриншоты <div align="center"> | Исследование графа | Обогащение сущности | | :-------------------------------------------: | :-----------------------------------------: | |  |  | | Transform Hub | Экспорт / Импорт | | :-------------------------------------: | :-------------------------------------: | |  |  | </div> ## Быстрый старт ### Предварительные требования | Инструмент | Версия | | -------------------------------- | ------- | | [Python](https://www.python.org) | 3.14+ | | [uv](https://docs.astral.sh/uv/) | latest | | [Node.js](https://nodejs.org) | 20+ | | [pnpm](https://pnpm.io) | latest | ### Бэкенд```bash cd backend uv sync uv run uvicorn ogi.main:app --reload ``` API будет доступен по адресу `http://localhost:8000`. Для локального выполнения трансформации также должны быть запущены Redis и transform worker. Одного Redis недостаточно. Запустите Redis:```bash docker run -d --name ogi-redis -p 6379:6379 redis:7-alpine ``` Запустите воркер преобразования во втором терминале:```bash cd backend uv run python -m ogi.worker.run_worker ``` Если вы видите `Job queue not available` или `Redis not available`, убедитесь, что: - `OGI_REDIS_URL` указывает на `redis://localhost:6379/0` для локальных запусков на хосте - бэкенд был перезапущен после запуска Redis - отдельный процесс воркера запущен - вы не используете hostname `redis`, доступный только в Docker, вне Docker Compose Если вы запускаете бэкенд с PostgreSQL (`OGI_USE_SQLITE=false`), при запуске автоматически применяются миграции Alembic перед обработкой запросов. Развертывания Docker делают то же самое в точке входа контейнера бэкенда. Запуски AI Investigator обрабатываются другим отдельным воркером:```bash cd backend uv run python -m ogi.agent.run_worker ``` ### Фронтенд```bash cd frontend pnpm install pnpm dev ``` Откройте http://localhost:5173. Вот и всё. ### AI Investigator AI Investigator — это опциональный рабочий процесс на основе провайдера, который может планировать последовательности преобразований, запрашивать утверждения и обобщать ход расследования в рабочем пространстве. - Откройте вкладку `AI Investigator` в проекте - Настройте провайдера и модель в диалоге настроек исследователя - Сохраните ключи API провайдера в разделе `API Keys` - Запустите отдельный процесс `agent-worker` вместе с бэкендом Текущая реализация поддерживает настройку провайдера для каждого пользователя и выделенный рабочий процесс, который выполняет шаги расследования независимо от основного API-сервера. ### CLI Два поддерживаемых способа запуска CLI: **Рекомендуемый** (активация не требуется):```bash cd backend uv sync uv run ogi --help ``` **Активированная virtualenv** (простая команда `ogi`):```bash cd backend uv venv # PowerShell: .\.venv\Scripts\Activate.ps1 uv pip install -e . ogi --help ``` ## Docker ### Разработка```bash cp .env.example .env docker compose up ``` ### Продуктивная среда Используйте предварительно собранные образы GHCR. Важно: [docker-compose.prod.yml](https://github.com/khashashin/ogi/blob/main/docker-compose.prod.yml) требует внешнюю базу данных PostgreSQL. Он не включает сервис `db`. Если вы хотите использовать единый локальный стек Docker со встроенными Postgres и Redis, используйте:```bash docker compose up -d ``` Используйте файл компоновки для продакшена только если у вас уже есть доступный экземпляр PostgreSQL и вы установили `OGI_DATABASE_URL` соответствующим образом:```bash docker compose -f docker-compose.prod.yml pull docker compose -f docker-compose.prod.yml up -d ``` Установите `OGI_IMAGE_TAG` в `.env`, чтобы зафиксировать конкретный тег образа релиза (например, `v0.2.6`). По умолчанию — `latest`. ### Hetzner Cloud [](https://hetzner.cloud/?ref=LspEGc99USBa) [](https://console.hetzner.com/deploy/docker-ce) Новые пользователи Hetzner могут использовать первую ссылку для регистрации с кредитами Hetzner Cloud. Это реферальная ссылка, поэтому мейнтейнер OGI также может получить кредиты Hetzner Cloud, если реферал соответствует условиям. После создания сервера используйте команды развертывания Docker выше для запуска OGI. ### Настраиваемые ограничения трансформаций OGI поставляется с разумными максимальными значениями для каждого трансформа, такими как `max_results`, `max_links`, `max_urls` и `max_content_chars`, но теперь эти ограничения можно переопределить централизованно, чтобы облачные развертывания могли применять их без жесткого кодирования локальных лимитов. Используйте `OGI_TRANSFORM_SETTING_MAX_OVERRIDES` в `.env`:```env OGI_TRANSFORM_SETTING_MAX_OVERRIDES=max_results=50,max_urls=25,max_links=40,max_content_chars=20000 ``` Для удаления определенных ограничений в локальном развертывании:```env OGI_TRANSFORM_SETTING_MAX_OVERRIDES=max_results=none,max_urls=none,max_links=none,max_content_chars=none ``` Переопределение привязано к имени настройки трансформа и применяется к встроенным трансформам и плагинам сообщества, использующим общую базу/среду выполнения трансформов OGI. ### Облачный хостинг и план Supporter Облачная версия, размещённая на [ogi.khas.app](https://ogi.khas.app), изначально создавалась, чтобы пользователи могли быстро попробовать OGI, прежде чем решить, разворачивать ли его самостоятельно. С тех пор она стала самым популярным способом использования проекта: более 350 активных облачных пользователей. Такое использование также увеличило инфраструктурные расходы для этого побочного проекта. Поэтому репозиторий включает облачную подписку Supporter и систему охлаждения запусков трансформов. В публичном облачном экземпляре бесплатные пользователи могут быть ограничены таймаутом между запусками трансформов, в то время как пользователи Supporter могут подписаться за символические 3 доллара США в месяц, чтобы помочь покрыть расходы на Supabase и VPS. Подписку Supporter можно отменить через настройки биллинга в профиле или портал биллинга Stripe. Отмена останавливает будущие списания, но оплаченные периоды подписки не возвращаются и не пересчитываются. Этот код биллинга намеренно защищён конфигурацией: он действует только при `OGI_DEPLOYMENT_MODE=cloud` и `OGI_CLOUD_BILLING_ENABLED=true`. В самостоятельно развёртываемых установках биллинг должен быть отключён, и не должно быть никакого поведения биллинга или платного доступа. ### Телеметрия OGI включает телеметрию на уровне установки, предназначенную для того, чтобы помочь нам понять реальное использование, особенно в самостоятельно развёртываемых установках. - `OGI_TELEMETRY_ENABLED=true` включает сбор телеметрии - `OGI_TELEMETRY_LEVEL=full` — уровень сбора по умолчанию - установите `OGI_TELEMETRY_ENABLED=false`, чтобы полностью отключить телеметрию - установите `OGI_TELEMETRY_LEVEL=basic`, чтобы уменьшить объём отправляемых данных `basic` отправляет: - версию OGI - ежедневный пинг активной установки `full` дополнительно отправляет: - дату создания экземпляра - агрегированные количества проектов, сущностей, связей, запусков трансформов, запусков исследователя и активных пользователей за период - установленные трансформы с их версиями Телеметрия разработана так, чтобы избегать отправки содержимого графа, значений сущностей, ключей API, промптов или других данных расследований. Текущие детали политики также опубликованы в [Политике конфиденциальности](https://ogi.khas.app/privacy#telemetry). <details> <summary><strong>Сервисы Compose для разработки</strong></summary> | Сервис | Описание | Порт | | --------------- | ------------------------------------- | ----- | | `backend` | Сервер приложений FastAPI | 8000 | | `worker` | Асинхронный обработчик заданий RQ | - | | `agent-worker` | Рабочий AI-исследователя | - | | `frontend` | React-приложение, обслуживаемое через nginx | 80 | | `db` | PostgreSQL 16 | 5432 | | `redis` | Redis 7 (очередь заданий) | 6379 | </details> <details> <summary><strong>Сервисы Compose для продакшена</strong></summary> | Сервис | Описание | Порт | | --------------- | ------------------------------------- | ----- | | `backend` | Сервер приложений FastAPI | 8000 | | `worker` | Асинхронный обработчик заданий RQ | - | | `agent-worker` | Рабочий AI-исследователя | - | | `frontend` | React-приложение, обслуживаемое через nginx | 80 | | `redis` | Redis 7 (очередь заданий) | 6379 | `docker-compose.prod.yml` ожидает внешнюю базу данных PostgreSQL через `OGI_DATABASE_URL`. </details> --- <details> <summary><strong>Зависимости плагинов при загрузке</strong></summary> Если вы используете предварительно собранные образы и плагину требуются дополнительные библиотеки Python, OGI устанавливает зависимости плагина при запуске контейнера из: 1. `plugins/requirements.txt` (предпочтительно), или 2. автоматически сгенерированных requirements, полученных из `plugins/ogi-lock.json`, когда `requirements.txt` отсутствует. **Переменные окружения:** | Переменная | Значение по умолчанию | Описание | | ---------------------------------- | -------------------------------- | --------------------------------------------- | | `OGI_BOOT_REQUIREMENTS_ENABLE` | `true` | Включить/отключить установку при загрузке | | `OGI_BOOT_REQUIREMENTS_FILE` | `/app/plugins/requirements.txt` | Путь к файлу requirements | | `OGI_BOOT_LOCK_FILE` | `/app/plugins/ogi-lock.json` | Путь к lock-файлу | | `OGI_BOOT_REQUIREMENTS_STRICT` | `false` | Завершать запуск при отсутствии requirements | | `OGI_BOOT_REQUIREMENTS_CACHE_DIR` | `/tmp/ogi-boot` | Временная/кэш-директория для сгенерированных requirements | </details> --- ## Transform Hub OpenGraph Intel имеет встроенный маркетплейс трансформов. Просматривайте, устанавливайте и управляйте трансформами из [реестра сообщества](https://github.com/opengraphintel/ogi-transforms). > **Примечание по безопасности:** Плагины, требующие ключи API, следует рассматривать как привилегированный код. Если плагин может получить доступ к вашим секретам и совершать исходящие сетевые запросы, он может неправомерно использовать или извлечь эти секреты. Перед установкой или запуском сторонних плагинов проверяйте уровень доверия, разрешения и требуемые сервисы.```bash # Search for transforms uv run ogi transform search dns # Install a transform uv run ogi transform install shodan-host-lookup ``` ### Встроенные категории преобразований | Категория | Примеры | | --------- | ------------------------------------ | | DNS | A, AAAA, MX, NS, CNAME записи | | IP & ASN | GeoIP, обратный IP, информация об ASN| | SSL/TLS | Прозрачность сертификатов, SSL labs | | Email | Валидация почтового сервера, проверки на утечки | | Web | WHOIS, информация о домене, извлечение данных с веб-страниц | | Social | Поиск имени пользователя, социальные профили | | Hash | Поиск MD5, SHA1, SHA256 | | Location | Геокодирование, погода, данные о ближайших ASN | ### Поддерживаемые типы сущностей `Person` • `Username` • `Domain` • `IPAddress` • `EmailAddress` • `PhoneNumber` • `Organization` • `URL` • `SocialMedia` • `Hash` • `Document` • `Location` • `ASNumber` • `Network` • `MXRecord` • `NSRecord` • `Nameserver` • `SSLCertificate` • `Subdomain` • `HTTPHeader` ### Создание собственных преобразований Хотите создать свои? Смотрите [руководство по участию](https://github.com/opengraphintel/ogi-transforms/blob/main/CONTRIBUTING.md). Если вашему преобразованию требуются внешние учетные данные для сервисов, укажите их в `api_keys_required`. Не храните секреты в настройках преобразования. OGI управляет ими в разделе `API Keys`, а плагины, использующие секреты, считаются привилегированным кодом. Если ваше преобразование предоставляет настраиваемые ограничения, такие как `max_results` или `max_content_chars`, по возможности отдавайте предпочтение стандартным названиям параметров, а не уникальным именам. OGI может централизованно переопределять максимальные значения с помощью `OGI_TRANSFORM_SETTING_MAX_OVERRIDES`, что помогает облачным развертываниям соблюдать лимиты, в то время как локальные пользователи могут их удалить. Каждый плагин — это директория с манифестом `plugin.yaml`:```yaml name: my-transform version: "1.0.0" display_name: My Transform description: What it does author: Your Name license: MIT category: dns input_types: [Domain] output_types: [IPAddress] permissions: network: true filesystem: false subprocess: false ``` ## Архитектура ### Технологический стек | Слой | Технология | | ------------------ | ---------------------------------------------------------------------------- | | Бэкенд | Python 3.14+, FastAPI, SQLModel, asyncpg / aiosqlite | | Фронтенд | React 19, TypeScript 5.9, Sigma.js (graphology), Zustand, Tailwind CSS 4 | | База данных | PostgreSQL 16 (основная) / SQLite (локальное резервное решение) | | Аутентификация и реальное время | Supabase Auth + JWT + Realtime (опционально в локальном режиме) | | Очередь задач | Redis 7 + RQ (асинхронные преобразования) | | ИИ-среда | Провайдерно-ориентированный ИИ-исследователь с аудированной оркестрацией преобразований | | Менеджеры пакетов | uv (бэкенд), pnpm (фронтенд) | | Развёртывание | Docker, nginx, GHCR | ### Структура проекта``` ogi/ ├── backend/ │ └── ogi/ │ ├── api/ # REST API routes │ ├── cli/ # CLI tool (Typer) │ ├── db/ # Database layer (asyncpg + aiosqlite) │ ├── engine/ # Graph engine & transform engine │ ├── models/ # SQLModel definitions │ ├── store/ # Data stores │ ├── transforms/ # Built-in transforms │ │ ├── dns/ # DNS resolution transforms │ │ ├── cert/ # SSL certificate transforms │ │ ├── email/ # Email enrichment │ │ ├── hash/ # Hash lookups │ │ ├── ip/ # IP/ASN/geolocation │ │ ├── org/ # Organization info │ │ ├── social/ # Social media │ │ └── web/ # Web scraping/extraction │ ├── worker/ # Async job queue (RQ) │ ├── config.py # Pydantic settings │ └── main.py # FastAPI entry point ├── frontend/ │ └── src/ │ ├── api/ # API client │ ├── components/ # React components │ ├── hooks/ # Custom hooks (realtime sync, etc.) │ ├── stores/ # Zustand state management │ ├── types/ # TypeScript types │ └── App.tsx # Main application ├── plugins/ # Community plugins directory ├── docs/ # Documentation & images ├── docker-compose.yml # Development deployment ├── docker-compose.prod.yml # Production deployment └── .env.example # Environment template ``` ### Конфигурация OGI использует [pydantic-settings](https://docs.pydantic.dev/latest/concepts/pydantic_settings/) с поддержкой файлов `.env`. Переменные времени выполнения/бэкенда имеют префикс `OGI_`. Настройки в виде списка принимают: - JSON-массивы, например `["plugins","../plugins"]` - строки, разделённые запятыми, например `plugins,../plugins` <details> <summary><strong>Основные переменные окружения</strong></summary> | Переменная | Описание | Значение по умолчанию | | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- | | `OGI_APP_NAME` | Имя приложения | `OGI` | | `OGI_HOST` | Хост привязки бэкенда | `0.0.0.0` | | `OGI_PORT` | Порт бэкенда | `8000` | | `OGI_CORS_ORIGINS` | Разрешённые источники фронтенда | `http://localhost:5173,http://localhost:3000` | | `OGI_USE_SQLITE` | Использовать SQLite вместо PostgreSQL | `true` | | `OGI_DB_PATH` | Путь к файлу базы данных SQLite | `ogi.db` | | `OGI_DATABASE_URL` | Строка подключения PostgreSQL | `postgresql://postgres:postgres@localhost:5432/ogi` | | `OGI_REDIS_URL` | Строка подключения Redis для RQ/задач | `redis://localhost:6379/0` | | `OGI_RQ_QUEUE_NAME` | Имя очереди для задач преобразования | `transforms` | | `OGI_TRANSFORM_TIMEOUT` | Тайм-аут задачи преобразования в секундах | `300` | | `OGI_AGENT_WORKER_POLL_INTERVAL_SEC` | Интервал опроса для рабочего AI-исследователя | `2.0` | | `OGI_AGENT_CLAIM_TIMEOUT_SEC` | Тайм-аут устаревшей блокировки шага AI-исследователя для восстановления | `120` | | `OGI_AUTO_RUN_MIGRATIONS` | Автоматический запуск Alembic при локальном запуске приложения без SQLite | `true` | | `OGI_RUN_DB_MIGRATIONS` | Запуск миграций БД в точке входа контейнера | `false` | | `OGI_DB_MIGRATION_RETRIES` | Количество повторных попыток миграции в точке входа | `30` | ``` --- [Read more](https://github.com/khashashin/ogi)