
ogi v0.8.0
오픈소스 링크 분석 & OSINT 프레임워크
OpenGraph Intel (OGI)
오픈 소스 시각적 링크 분석 및 OSINT 프레임워크. 무료, 자체 호스팅 가능, 커뮤니티 주도.
주의: 이 프로젝트는 활발히 발전 중입니다. 견고한 핵심 기능과 테스트 범위를 갖추고 있으며, 각 릴리스마다 문서, 보안 강화, 기능 깊이를 계속 개선하고 있습니다. 기여, 버그 신고, 피드백을 환영합니다.
기능
- 시각적 그래프 조사 — 엔티티 드래그 앤 드롭, 대화형으로 연결 탐색
- 20개 이상의 내장 변환 — DNS, WHOIS, SSL 인증서, 지리적 위치, 웹/이메일/해시/소셜 인리치먼트 등
- Transform Hub — 레지스트리에서 커뮤니티 변환 탐색 및 설치
- AI 조사관 — 프롬프트 기반 에이전트 조사로 변환 실행 계획, 실시간 진행 스트리밍, 감사 가능한 결과 요약
- 가져오기 / 내보내기 — JSON, CSV, GraphML, MTGX 형식 가져오기
- 그래프 분석 — 중심성, 커뮤니티 탐지, 최단 경로
- 실시간 협업 — Supabase Realtime을 통한 프로젝트, 공유, 실시간 동기화
- 비동기 변환 작업 — WebSocket 진행 업데이트가 포함된 Redis/RQ 큐
- 플러그인 시스템 — YAML 매니페스트를 사용한 디렉터리 기반 플러그인 검색
- CLI 도구 — 터미널에서 변환 검색, 설치, 관리
- 어디서나 실행 — 로컬 SQLite 모드(설정 불필요) 또는 팀/클라우드 설정용 PostgreSQL + Supabase
- Docker 지원 —
docker compose up한 번으로 배포
스크린샷
| 그래프 조사 | 엔티티 인리치먼트 |
|---|---|
![]() | ![]() |
| Transform Hub | 내보내기 / 가져오기 |
|---|---|
![]() | ![]() |
빠른 시작
사전 요구 사항
백엔드```bash
cd backend uv sync uv run uvicorn ogi.main:app --reload
API는 `http://localhost:8000`에서 사용할 수 있습니다.
로컬 변환 실행을 위해서는 Redis와 변환 작업자도 실행 중이어야 합니다. 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가 실행된 후 백엔드가 재시작되었는지
- 별도의 worker 프로세스가 실행 중인지
- Docker Compose 외부에서 Docker 전용 호스트명 `redis`를 사용하지 않는지
PostgreSQL (`OGI_USE_SQLITE=false`)에 대해 백엔드를 실행하면 시작 시 요청을 처리하기 전에 Alembic 마이그레이션이 자동으로 적용됩니다. Docker 배포도 백엔드 컨테이너 진입점에서 동일하게 수행합니다.
AI Investigator 실행은 또 다른 별도의 worker에 의해 처리됩니다:```bash
cd backend
uv run python -m ogi.agent.run_worker
프론트엔드```bash
cd frontend pnpm install pnpm dev
Open 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은 외부 PostgreSQL 데이터베이스가 필요합니다. db 서비스를 포함하지 않습니다.
내장 Postgres 및 Redis가 포함된 올인원 로컬 Docker 스택을 원하신다면 다음을 사용하세요:```bash docker compose up -d
도달 가능한 PostgreSQL 인스턴스가 이미 있고 `OGI_DATABASE_URL`을 적절히 설정한 경우에만 프로덕션 compose 파일을 사용하세요:```bash
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -d
.env 파일에서 OGI_IMAGE_TAG를 설정하여 특정 릴리스 이미지 태그를 고정할 수 있습니다 (예: v0.2.6). 기본값은 latest입니다.
Hetzner Cloud
새로운 Hetzner 사용자는 첫 번째 링크를 사용하여 Hetzner Cloud 크레딧으로 가입할 수 있습니다. 이 링크는 추천 링크이므로, 추천이 적격할 경우 OGI 유지 관리자도 Hetzner Cloud 크레딧을 받을 수 있습니다. 서버를 생성한 후 위의 Docker 배포 명령어를 사용하여 OGI를 실행하세요.
구성 가능한 변환 상한
OGI는 max_results, max_links, max_urls, max_content_chars와 같은 항목에 대해 합리적인 변환별 최대값을 제공하지만, 이제 이러한 상한을 중앙에서 재정의할 수 있어 클라우드 배포에서 로컬 제한을 하드코딩하지 않고도 적용할 수 있습니다.
.env에서 OGI_TRANSFORM_SETTING_MAX_OVERRIDES를 사용하세요:```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의 공유 변환 기반/런타임을 사용하는 내장 변환 및 커뮤니티 플러그인에 적용됩니다.
Hosted cloud instance and Supporter plan
ogi.khas.app에서 제공되는 호스티드 클라우드 버전은 사용자가 셀프 호스팅 여부를 결정하기 전에 OGI를 빠르게 사용해볼 수 있도록 처음 구축되었습니다. 이후 350명 이상의 활성 클라우드 사용자를 보유한 이 프로젝트의 가장 인기 있는 사용 방식이 되었습니다.
이러한 사용량은 이 사이드 프로젝트의 인프라 비용도 증가시켰습니다. 따라서 저장소에는 클라우드 전용 Supporter 구독 및 변환 실행 쿨다운 시스템이 포함되어 있습니다. 공용 클라우드 인스턴스에서 무료 사용자는 변환 실행 간 시간 제한이 있을 수 있으며, Supporter 사용자는 Supabase 및 VPS 비용을 지원하기 위해 상징적인 월 3 USD의 구독료를 낼 수 있습니다.
Supporter 구독은 프로필 청구 컨트롤 또는 Stripe 청구 포털에서 취소할 수 있습니다. 취소는 향후 청구를 중단하지만, 유료 구독 기간은 환불되지 않거나 비례 배분되지 않습니다.
이 청구 코드는 의도적으로 구성에 의해 보호됩니다. OGI_DEPLOYMENT_MODE=cloud 및 OGI_CLOUD_BILLING_ENABLED=true인 경우에만 효과가 있습니다. 자체 호스팅 배포는 청구를 비활성화된 상태로 두어야 하며, 청구 또는 페이월 동작이 표시되지 않아야 합니다.
Telemetry
OGI에는 실제 사용 현황, 특히 자체 호스팅 배포 전반에 걸친 사용을 이해하는 데 도움이 되는 설치 수준의 제품 텔레메트리가 포함되어 있습니다.
OGI_TELEMETRY_ENABLED=true는 텔레메트리 수집을 활성화합니다.OGI_TELEMETRY_LEVEL=full은 기본 수집 레벨입니다.OGI_TELEMETRY_ENABLED=false로 설정하면 텔레메트리 수집을 완전히 비활성화합니다.OGI_TELEMETRY_LEVEL=basic으로 설정하면 전송되는 데이터를 줄입니다.
basic 전송 내용:
- OGI 버전
- 일일 활성 설치 핑
full 추가 전송 내용:
- 인스턴스 생성 날짜
- 해당 기간의 프로젝트, 엔티티, 엣지, 변환 실행, 조사자 실행 및 활성 사용자에 대한 집계 수
- 설치된 변환 및 해당 버전
텔레메트리는 그래프 내용, 엔티티 값, API 키, 프롬프트 또는 기타 조사 데이터를 전송하지 않도록 설계되었습니다. 현재 정책 세부 사항은 개인정보처리방침에도 게시되어 있습니다.
개발 Compose 서비스
| 서비스 | 설명 | 포트 |
|---|---|---|
backend | FastAPI 애플리케이션 서버 | 8000 |
worker | RQ 비동기 작업 워커 | - |
agent-worker | AI 조사자 워커 | - |
frontend | nginx를 통해 제공되는 React 앱 | 80 |
db | PostgreSQL 16 | 5432 |
redis | Redis 7 (작업 큐) | 6379 |
프로덕션 Compose 서비스
| 서비스 | 설명 | 포트 |
|---|---|---|
backend | FastAPI 애플리케이션 서버 | 8000 |
worker | RQ 비동기 작업 워커 | - |
agent-worker | AI 조사자 워커 | - |
frontend | nginx를 통해 제공되는 React 앱 | 80 |
redis | Redis 7 (작업 큐) | 6379 |
docker-compose.prod.yml은 OGI_DATABASE_URL을 통해 외부 PostgreSQL 데이터베이스를 필요로 합니다.
부팅 시 플러그인 종속성
사전 빌드된 이미지를 사용하고 플러그인에 추가 Python 라이브러리가 필요한 경우, OGI는 컨테이너 시작 시 다음에서 플러그인 종속성을 설치합니다.
plugins/requirements.txt(권장), 또는requirements.txt가 없을 때plugins/ogi-lock.json에서 파생된 자동 생성 요구 사항.
환경 변수:
| 변수 | 기본값 | 설명 |
|---|---|---|
OGI_BOOT_REQUIREMENTS_ENABLE | true | 부팅 시 설치 활성화/비활성화 |
OGI_BOOT_REQUIREMENTS_FILE | /app/plugins/requirements.txt | 요구 사항 파일 경로 |
OGI_BOOT_LOCK_FILE | /app/plugins/ogi-lock.json | 잠금 파일 경로 |
OGI_BOOT_REQUIREMENTS_STRICT | false | 요구 사항이 없으면 시작 실패 |
OGI_BOOT_REQUIREMENTS_CACHE_DIR | /tmp/ogi-boot | 생성된 요구 사항의 임시/캐시 디렉터리 |
변환 허브
OpenGraph Intel에는 내장된 변환 마켓플레이스가 있습니다. 커뮤니티 레지스트리에서 변환을 찾아보고, 설치하고, 관리하세요.
보안 참고 사항: 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 랩스 |
| 이메일 | 메일 서버 검증, 침해 점검 |
| 웹 | WHOIS, 도메인 정보, 웹 추출 |
| 소셜 | 사용자명 열거, 소셜 프로필 |
| 해시 | MD5, SHA1, SHA256 조회 |
| 위치 | 지오코딩, 날씨, 인근 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 (비동기 변환) |
| AI 런타임 | 공급자 지원 AI 조사 워커 (감사된 변환 오케스트레이션 포함) |
| 패키지 관리자 | 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
### Configuration
OGI는 `.env` 파일을 지원하는 [pydantic-settings](https://docs.pydantic.dev/latest/concepts/pydantic_settings/)를 사용합니다. 런타임/백엔드 변수는 `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` | 허용된 프론트엔드 출처(origin) | `http://localhost:5173,http://localhost:3000` |
| `OGI_USE_SQLITE` | PostgreSQL 대신 SQLite 사용 | `true` |
| `OGI_DB_PATH` | SQLite 데이터베이스 파일 경로 | `ogi.db` |
| `OGI_DATABASE_URL` | PostgreSQL 연결 문자열 | `postgresql://postgres:postgres@localhost:5432/ogi` |
| `OGI_REDIS_URL` | RQ/작업을 위한 Redis 연결 문자열 | `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` | 로컬 비SQLite 앱 시작 시 Alembic 자동 실행 | `true` |
| `OGI_RUN_DB_MIGRATIONS` | 컨테이너 진입점에서 DB 마이그레이션 실행 | `false` |
| `OGI_DB_MIGRATION_RETRIES` | 진입점 마이그레이션 재시도 횟수 | `30` |
| `OGI_DB_MIGRATION_DELAY_SECONDS` | 진입점 마이그레이션 재시도 간 지연(초) | `2` |
| `OGI_PLUGIN_DIRS` | 플러그인 검색 디렉터리 | `plugins,../plugins` |
| `OGI_DEPLOYMENT_MODE` | 배포 모드 (`self-hosted` 또는 `cloud`) | `self-hosted` |
| `OGI_CLOUD_BILLING_ENABLED` | 클라우드 전용 서포터 청구 및 변환 쿨다운 시행 활성화 | `false` |
| `OGI_FREE_TRANSFORM_COOLDOWN_SECONDS` | 무료 클라우드 사용자의 변환기 실행 간 쿨다운(초) | `1800` |
| `OGI_PAID_TRANSFORM_COOLDOWN_SECONDS` | 유료 클라우드 사용자의 변환기 실행 간 쿨다운(초) | `0` |
| `OGI_STRIPE_SECRET_KEY` | Checkout 및 포털 세션을 위한 Stripe 서버 측 비밀 키 | 설정되지 않음 |
| `OGI_STRIPE_WEBHOOK_SECRET` | Stripe 웹훅 서명 비밀 | 설정되지 않음 |
| `OGI_STRIPE_SUPPORTER_PRICE_ID` | 서포터 플랜을 위한 Stripe 정기 가격 ID | 설정되지 않음 |
| `OGI_STRIPE_SUPPORTER_AMOUNT_CENTS` | 서포터 플랜 표시 금액(센트) | `300` |
| `OGI_STRIPE_SUPPORTER_CURRENCY` | 서포터 플랜 표시 통화 | `usd` |
| `OGI_BILLING_SUCCESS_URL` | 선택적 Stripe Checkout 성공 리디렉션 | 요청에서 파생 |
| `OGI_BILLING_CANCEL_URL` | 선택적 Stripe Checkout 취소 리디렉션 | 요청에서 파생 |
| `OGI_BILLING_PORTAL_RETURN_URL` | 선택적 Stripe 청구 포털 반환 URL | 요청에서 파생 |
| `OGI_REGISTRY_REPO` | 변환 레지스트리 GitHub 저장소 | `opengraphintel/ogi-transforms` |
| `OGI_REGISTRY_CACHE_TTL` | 레지스트리 캐시 TTL(초) | `3600` |
| `OGI_TRANSFORM_SETTING_MAX_OVERRIDES` | 변환 설정에 대한 선택적 전역 최대 재정의 맵 | 비어 있음 |
| `OGI_GITHUB_TOKEN` | 레지스트리/API 속도 제한을 위한 선택적 GitHub 토큰 | 설정되지 않음 |
| `OGI_SUPABASE_URL` | Supabase 프로젝트 URL | 설정되지 않음 |
| `OGI_SUPABASE_ANON_KEY` | Supabase 익명/공개 키 | 설정되지 않음 |
| `OGI_SUPABASE_SERVICE_ROLE_KEY` | Supabase 서비스 역할 키 | 설정되지 않음 |
| `OGI_SUPABASE_JWT_SECRET` | Supabase JWT 시크릿 | 설정되지 않음 |
| `OGI_SUPABASE_REDIRECT_URL` | 프론트엔드 인증 흐름에서 사용하는 리디렉션 URL | 설정되지 않음 |
| `OGI_ADMIN_EMAILS` | 레지스트리/플러그인 관리를 위한 관리자 사용자 | 설정되지 않음 |
| `OGI_TELEMETRY_ENABLED` | 설치 수준 텔레메트리 활성화 또는 비활성화 | `true` |
| `OGI_TELEMETRY_LEVEL` | 텔레메트리 수준 (`basic` 또는 `full`) | `full` |
| `OGI_API_KEY_ENCRYPTION_KEY` | 암호화된 API 키 저장소를 위한 Fernet 키 | 설정되지 않음 (강력 권장) |
| `OGI_API_KEY_INJECTION_ALLOW_COMMUNITY_PLUGINS` | 커뮤니티 플러그인이 저장된 API 키를 받도록 허용 | `true` |
| `OGI_API_KEY_INJECTION_TRUSTED_TIERS_ONLY` | 저장된 키 주입을 신뢰할 수 있는 등급으로만 제한 | `false` |
| `OGI_API_KEY_INJECTION_ALLOWED_TIERS` | 신뢰 전용 모드에서 허용되는 등급 | `official,verified` |
| `OGI_API_KEY_SERVICE_ALLOWLIST` | 저장된 키 주입을 위한 선택적 허용 서비스 | 비어 있음 |
| `OGI_API_KEY_SERVICE_BLOCKLIST` | 저장된 키 주입을 위한 선택적 차단 서비스 | 비어 있음 |
| `OGI_LLM_PROVIDER` | 기본 AI 조사관 제공자 대체 | `openai` |
| `OGI_LLM_MODEL` | 기본 AI 조사관 모델 대체 | `gpt-4.1-mini` |
| `OGI_EXPOSE_ERROR_DETAILS` | 500 응답에 내부 세부 정보 포함 | `false` |
| `OGI_SANDBOX_ENABLED` | 샌드박스 실행 모드 활성화 | `false` |
| `OGI_SANDBOX_TIMEOUT` | 샌드박스 제한 시간(초) | `30` |
| `OGI_SANDBOX_MEMORY_MB` | 샌드박스 메모리 제한(MB) | `256` |
| `OGI_SANDBOX_ALLOWED_TIERS` | 클라우드 샌드박스 모드에서 허용되는 등급 | `official,verified` |
| `OGI_BOOT_REQUIREMENTS_ENABLE` | 부트 시 플러그인 종속성 설치 활성화 | `true` |
| `OGI_BOOT_REQUIREMENTS_FILE` | 부트 요구사항 파일 경로 | `/app/plugins/requirements.txt` |
| `OGI_BOOT_LOCK_FILE` | 부트 잠금 파일 경로 | `/app/plugins/ogi-lock.json` |
| `OGI_BOOT_REQUIREMENTS_STRICT` | 플러그인 요구사항이 누락된 경우 시작 실패 | `false` |
| `OGI_BOOT_REQUIREMENTS_CACHE_DIR` | 부트 요구사항 생성을 위한 임시/캐시 디렉터리 | `/tmp/ogi-boot` |
| `OGI_FRONTEND_PORT` | 로컬 Docker 프론트엔드 포트 매핑 | `3000` |
| `OGI_IMAGE_TAG` | compose/Coolify 스타일 배포용 프로덕션 이미지 태그 | `latest` |
| `OGI_BACKEND_IMAGE` | 선택적 백엔드 이미지 재정의 | `ghcr.io/khashashin/ogi-backend` |
| `OGI_WORKER_IMAGE` | 선택적 워커 이미지 재정의. 워커와 백엔드가 동일한 이미지 빌드를 공유하므로 기본값은 백엔드 이미지입니다. | `ghcr.io/khashashin/ogi-backend` |
| `OGI_FRONTEND_IMAGE` | 선택적 프론트엔드 이미지 재정의 | `ghcr.io/khashashin/ogi-frontend` |
| `OGI_CLI_BEARER_TOKEN` | 인증이 활성화된 백엔드용 선택적 CLI Bearer 토큰 | 설정되지 않음 |
전체 목록은 [`.env.example`](https://github.com/khashashin/ogi/blob/HEAD/.env.example)을 참조하세요.
</details>
## 개발
### 테스트 실행```bash
# Backend
cd backend
OGI_DB_PATH=":memory:" OGI_USE_SQLITE=true uv run pytest
# Frontend
cd frontend
pnpm test
린팅 & 타입 검사```bash
Backend
cd backend uv run ruff check # Linting uv run mypy # Type checking
Frontend
cd frontend pnpm lint # ESLint
### CI 파이프라인
모든 풀 리퀘스트에서 [CI 워크플로우](https://github.com/khashashin/ogi/blob/HEAD/.github/workflows/ci.yml)가 실행됩니다:
- **백엔드:** ruff 린트, mypy 타입 체크, pytest
- **프론트엔드:** vitest, eslint, vite 빌드
## 기여하기
PR 환영합니다! 버그를 발견하거나 아이디어가 있으면 [이슈를 열어주세요](https://github.com/khashashin/ogi/issues).
새로운 트랜스폼의 경우 [ogi-transforms](https://github.com/opengraphintel/ogi-transforms)에 기여해주세요.
### 시작하기
1. 저장소를 포크합니다
2. 기능 브랜치를 생성합니다 (`git checkout -b feature/my-feature`)
3. 변경사항을 적용합니다
4. 테스트와 린팅을 실행합니다
5. 풀 리퀘스트를 제출합니다
## 법적 및 책임 있는 사용
OGI는 범용 OSINT 및 그래프 분석 도구입니다. **사용 방법에 대한 모든 책임은 사용자에게 있습니다.** 전체 법적 고지는 [LEGAL.md](https://github.com/khashashin/ogi/blob/HEAD/LEGAL.md)를 참조하세요.
- **타사 서비스 약관을 준수하세요.** 외부 서비스(DNS, WHOIS, 웹 스크래핑, 사용자 이름 조회 등)를 쿼리하는 트랜스폼은 해당 서비스의 약관에 따라 사용해야 합니다. 금지된 사이트에 대한 자동 또는 대량 쿼리는 약관 위반이 될 수 있습니다.
- **데이터 보호법을 존중하세요.** EU에 거주하거나 EU 거주자의 데이터를 처리하는 경우, GDPR이 데이터 컨트롤러로서 적용됩니다. 개인 데이터(이름, 이메일 주소, IP 주소 등)를 수집, 저장 또는 처리하려면 합법적인 근거가 필요합니다. OGI 자체는 로컬 인스턴스 외부에 데이터를 저장하지 않습니다 — 수집 및 보관하는 데이터에 대한 책임은 사용자에게 있습니다.
- **합법적인 목적으로만 사용하세요.** OGI는 합법적인 보안 연구, 조사, 위협 인텔리전스 및 교육 목적으로 사용됩니다. 개인을 괴롭히거나, 무단 액세스를 하거나, 해당 법률을 위반하는 데 사용하지 마십시오.
- **파일 형식 호환성.** OGI는 MTGX 그래프 교환 형식의 가져오기를 지원합니다. 이는 순전히 데이터 상호 운용성을 위해 제공되며, 이 형식을 사용하는 도구 제작자와의 제휴나 보증을 의미하지 않습니다.
> **면책 조항:** OGI는 어떠한 종류의 보증 없이 "있는 그대로" 제공됩니다. 작성자는 이 소프트웨어 사용으로 인한 오용이나 손해에 대해 책임을 지지 않습니다.
## 라이선스
이 프로젝트는 [GNU Affero General Public License v3.0](https://github.com/khashashin/ogi/blob/HEAD/LICENSE)에 따라 라이선스가 부여됩니다.
---
<div align="center">
**[버그 신고](https://github.com/khashashin/ogi/issues) • [기능 요청](https://github.com/khashashin/ogi/issues) • [토론](https://github.com/opengraphintel/ogi-transforms/discussions)**
OGI 커뮤니티가 💜로 만들었습니다
</div>



