Files

1 line
143 KiB
JSON

{"repo": "602019023uksw/gireng", "files": {".env.template": {"1acc48ae947d7c44a28845b9b80fa4c33e0b8c9f": {"t": 1785746731.741591, "n": 3654, "h": "3f9453754c2300f8", "c": "# ╔══════════════════════════════════════════════════════════════╗\n# ║ gireng — Environment Configuration ║\n# ║ Copy this file: cp .env.template .env ║\n# ║ Then fill in your API key below and run docker compose up ║\n# ╚══════════════════════════════════════════════════════════════╝\n\n# ── LLM API Key (REQUIRED) ──────────────────────────────────────\n# Get your key from your LLM provider (DeepSeek, OpenAI-compatible, etc.)\n#\n# Default DeepSeek configuration:\n# - API format: OpenAI-compatible Chat Completions\n# - Endpoint: https://api.deepseek.com\n# - Model: deepseek-v4-pro\n# - Thinking mode is enabled by default; set LLM_THINKING_MODE=disabled to turn it off.\nLLM_PROVIDER=openai\nLLM_API_KEY=<your-deepseek-api-key>\nLLM_BASE_URL=https://api.deepseek.com\nLLM_MODEL_NAME=deepseek-v4-pro\nLLM_REASONING_EFFORT=high\nLLM_THINKING_MODE=enabled\n\n# Provider-specific aliases are also supported. You can switch providers\n# without code changes by changing the env values above or these aliases.\nDEEPSEEK_API_KEY=<your-deepseek-api-key>\nDEEPSEEK_BASE_URL=https://api.deepseek.com\nDEEPSEEK_MODEL=deepseek-v4-pro\n\n# OpenAI-compatible override example:\n# OPENAI_API_KEY=<your-openai-compatible-api-key>\n# OPENAI_BASE_URL=https://api.openai.com/v1\n# OPENAI_MODEL=gpt-4o\n\n# Anthropic-compatible override example:\n# LLM_PROVIDER=anthropic\n# ANTHROPIC_API_KEY=<your-anthropic-compatible-api-key>\n# ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic\n# ANTHROPIC_MODEL=deepseek-v4-pro\n\n# ── Public Host Placeholder (used by UI/API/Langfuse URLs) ──────\n# Change HOST once and all browser-facing URLs follow it.\nHOST=localhost\nAPI_PORT=8080\nUI_PORT=4173\nLANGFUSE_PORT=3100\n\n# ── CORS Origins ────────────────────────────────────────────────\n# Comma-separated list of allowed origins for the backend API.\n# CORS_ORIGINS=http://localhost:4173,http://localhost:3000\n\n# ── Resource Limits ─────────────────────────────────────────────\n# Max uploaded binary size in bytes (default: 209715200 = 200 MB)\nMAX_UPLOAD_BYTES=209715200\nDEFAULT_USER_QUOTA=10\n\n# ── LLM Retry Configuration ─────────────────────────────────────\nLLM_TIMEOUT=1200\nLLM_MAX_RETRIES=2\n\n# ── Memory / Semantic Search ────────────────────────────────────\n# Directory for local memory storage and embedding model name.\n# MEMORY_DIR=./memory\n# EMBEDDING_MODEL=text-embedding-3-small\n\n# Optional explicit URL overrides (leave commented in most setups)\n# VITE_API_BASE_URL=http://localhost:8080\n# VITE_WS_URL=ws://localhost:8080/stream\n# LANGFUSE_URL=http://localhost:3100\n\n# ── Ghidra Runner Image ─────────────────────────────────────────\nRUNNER_IMAGE=danilid/ireng-runner:2.0.1\n\n# ── Function Prioritization Weights ─────────────────────────────\n# score = alpha * norm(xrefs) + beta * norm(size)\nFUNCTION_PRIORITY_ALPHA=0.7\nFUNCTION_PRIORITY_BETA=0.3\n\n# ── Optional Dynamic Analyzer (Qiling) ──────────────────────────\n# Qiling runs inside its own container and adds runtime behavior traces.\nENABLE_QILING=true\nQILING_TIMEOUT=60\n\n# ── Radare2 Resource Limits ─────────────────────────────────────\n# Cap Radare2 so it does not consume excessive host CPU/RAM.\nR2_CPU_LIMIT=2.0\nR2_MEM_LIMIT=2g\nR2_MEMSWAP_LIMIT=2g\n# Per-command timeout (seconds) and hard cap for full R2 pipeline.\nR2_TIMEOUT=60\nR2_PIPELINE_TIMEOUT=420\n\n# ── PostgreSQL (defaults are fine for local dev) ────────────────\n# POSTGRES_PASSWORD=gireng_secret\n\n# ── Langfuse Tracing (optional — auto-configured in docker) ────\n# LANGFUSE_PUBLIC_KEY=\n# LANGFUSE_SECRET_KEY=\n# LANGFUSE_HOST=http://langfuse:3000\n# LANGFUSE_NEXTAUTH_SECRET=changeme-langfuse-secret\n# LANGFUSE_SALT=changeme-langfuse-salt\n"}, "606be7e20bc6dbe514edee0324d122a111fc5c27": {"t": 1785767370.3145645, "n": 3654, "h": "3f9453754c2300f8", "c": "# ╔══════════════════════════════════════════════════════════════╗\n# ║ gireng — Environment Configuration ║\n# ║ Copy this file: cp .env.template .env ║\n# ║ Then fill in your API key below and run docker compose up ║\n# ╚══════════════════════════════════════════════════════════════╝\n\n# ── LLM API Key (REQUIRED) ──────────────────────────────────────\n# Get your key from your LLM provider (DeepSeek, OpenAI-compatible, etc.)\n#\n# Default DeepSeek configuration:\n# - API format: OpenAI-compatible Chat Completions\n# - Endpoint: https://api.deepseek.com\n# - Model: deepseek-v4-pro\n# - Thinking mode is enabled by default; set LLM_THINKING_MODE=disabled to turn it off.\nLLM_PROVIDER=openai\nLLM_API_KEY=<your-deepseek-api-key>\nLLM_BASE_URL=https://api.deepseek.com\nLLM_MODEL_NAME=deepseek-v4-pro\nLLM_REASONING_EFFORT=high\nLLM_THINKING_MODE=enabled\n\n# Provider-specific aliases are also supported. You can switch providers\n# without code changes by changing the env values above or these aliases.\nDEEPSEEK_API_KEY=<your-deepseek-api-key>\nDEEPSEEK_BASE_URL=https://api.deepseek.com\nDEEPSEEK_MODEL=deepseek-v4-pro\n\n# OpenAI-compatible override example:\n# OPENAI_API_KEY=<your-openai-compatible-api-key>\n# OPENAI_BASE_URL=https://api.openai.com/v1\n# OPENAI_MODEL=gpt-4o\n\n# Anthropic-compatible override example:\n# LLM_PROVIDER=anthropic\n# ANTHROPIC_API_KEY=<your-anthropic-compatible-api-key>\n# ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic\n# ANTHROPIC_MODEL=deepseek-v4-pro\n\n# ── Public Host Placeholder (used by UI/API/Langfuse URLs) ──────\n# Change HOST once and all browser-facing URLs follow it.\nHOST=localhost\nAPI_PORT=8080\nUI_PORT=4173\nLANGFUSE_PORT=3100\n\n# ── CORS Origins ────────────────────────────────────────────────\n# Comma-separated list of allowed origins for the backend API.\n# CORS_ORIGINS=http://localhost:4173,http://localhost:3000\n\n# ── Resource Limits ─────────────────────────────────────────────\n# Max uploaded binary size in bytes (default: 209715200 = 200 MB)\nMAX_UPLOAD_BYTES=209715200\nDEFAULT_USER_QUOTA=10\n\n# ── LLM Retry Configuration ─────────────────────────────────────\nLLM_TIMEOUT=1200\nLLM_MAX_RETRIES=2\n\n# ── Memory / Semantic Search ────────────────────────────────────\n# Directory for local memory storage and embedding model name.\n# MEMORY_DIR=./memory\n# EMBEDDING_MODEL=text-embedding-3-small\n\n# Optional explicit URL overrides (leave commented in most setups)\n# VITE_API_BASE_URL=http://localhost:8080\n# VITE_WS_URL=ws://localhost:8080/stream\n# LANGFUSE_URL=http://localhost:3100\n\n# ── Ghidra Runner Image ─────────────────────────────────────────\nRUNNER_IMAGE=danilid/ireng-runner:2.0.1\n\n# ── Function Prioritization Weights ─────────────────────────────\n# score = alpha * norm(xrefs) + beta * norm(size)\nFUNCTION_PRIORITY_ALPHA=0.7\nFUNCTION_PRIORITY_BETA=0.3\n\n# ── Optional Dynamic Analyzer (Qiling) ──────────────────────────\n# Qiling runs inside its own container and adds runtime behavior traces.\nENABLE_QILING=true\nQILING_TIMEOUT=60\n\n# ── Radare2 Resource Limits ─────────────────────────────────────\n# Cap Radare2 so it does not consume excessive host CPU/RAM.\nR2_CPU_LIMIT=2.0\nR2_MEM_LIMIT=2g\nR2_MEMSWAP_LIMIT=2g\n# Per-command timeout (seconds) and hard cap for full R2 pipeline.\nR2_TIMEOUT=60\nR2_PIPELINE_TIMEOUT=420\n\n# ── PostgreSQL (defaults are fine for local dev) ────────────────\n# POSTGRES_PASSWORD=gireng_secret\n\n# ── Langfuse Tracing (optional — auto-configured in docker) ────\n# LANGFUSE_PUBLIC_KEY=\n# LANGFUSE_SECRET_KEY=\n# LANGFUSE_HOST=http://langfuse:3000\n# LANGFUSE_NEXTAUTH_SECRET=changeme-langfuse-secret\n# LANGFUSE_SALT=changeme-langfuse-salt\n"}, "751dec4693073452fb6ed2a919e27805f10ccbff": {"t": 1785767371.7165504, "n": 3190, "h": "49264763d1cd0a4a", "c": "# ╔══════════════════════════════════════════════════════════════╗\n# ║ gireng — Environment Configuration ║\n# ║ Copy this file: cp .env.template .env ║\n# ║ Then fill in your API key below and run docker compose up ║\n# ╚══════════════════════════════════════════════════════════════╝\n\n# ── LLM API Key (REQUIRED) ──────────────────────────────────────\n# Get your key from your LLM provider (Z.AI, OpenAI-compatible, etc.)\n#\n# GLM-5 Configuration for enhanced binary analysis:\n# - Model: glm-5 (supports deep reasoning and preserved thinking)\n# - Endpoint: https://api.z.ai/api/paas/v4 (standard chat completions)\n# - Features: Deep thinking enabled, preserved thinking for multi-turn context\n# - Max context: 200K tokens, Max output: 128K tokens\nLLM_API_KEY=<your-zai-api-key>\nLLM_BASE_URL=https://api.z.ai/api/paas/v4\nLLM_MODEL_NAME=glm-5\nLLM_TIMEOUT=1200\n\n# Legacy aliases (for backward compatibility)\nANTHROPIC_API_KEY=<your-zai-api-key>\nANTHROPIC_BASE_URL=https://api.z.ai/api/paas/v4\nANTHROPIC_MODEL=glm-5\n\n# ── Public Host Placeholder (used by UI/API/Langfuse URLs) ──────\n# Change HOST once and all browser-facing URLs follow it.\nHOST=localhost\nAPI_PORT=8080\nUI_PORT=4173\nLANGFUSE_PORT=3100\n\n# ── CORS Origins ────────────────────────────────────────────────\n# Comma-separated list of allowed origins for the backend API.\n# CORS_ORIGINS=http://localhost:4173,http://localhost:3000\n\n# ── Resource Limits ─────────────────────────────────────────────\n# Max uploaded binary size in bytes (default: 209715200 = 200 MB)\nMAX_UPLOAD_BYTES=209715200\nDEFAULT_USER_QUOTA=10\n\n# ── LLM Retry Configuration ─────────────────────────────────────\nLLM_TIMEOUT=630\nLLM_MAX_RETRIES=2\n\n# ── Memory / Semantic Search ────────────────────────────────────\n# Directory for local memory storage and embedding model name.\n# MEMORY_DIR=./memory\n# EMBEDDING_MODEL=text-embedding-3-small\n\n# Optional explicit URL overrides (leave commented in most setups)\n# VITE_API_BASE_URL=http://localhost:8080\n# VITE_WS_URL=ws://localhost:8080/stream\n# LANGFUSE_URL=http://localhost:3100\n\n# ── Ghidra Runner Image ─────────────────────────────────────────\nRUNNER_IMAGE=danilid/ireng-runner:2.0.1\n\n# ── Function Prioritization Weights ─────────────────────────────\n# score = alpha * norm(xrefs) + beta * norm(size)\nFUNCTION_PRIORITY_ALPHA=0.7\nFUNCTION_PRIORITY_BETA=0.3\n\n# ── Optional Dynamic Analyzer (Qiling) ──────────────────────────\n# Qiling runs inside its own container and adds runtime behavior traces.\nENABLE_QILING=true\nQILING_TIMEOUT=60\n\n# ── Radare2 Resource Limits ─────────────────────────────────────\n# Cap Radare2 so it does not consume excessive host CPU/RAM.\nR2_CPU_LIMIT=2.0\nR2_MEM_LIMIT=2g\nR2_MEMSWAP_LIMIT=2g\n# Per-command timeout (seconds) and hard cap for full R2 pipeline.\nR2_TIMEOUT=60\nR2_PIPELINE_TIMEOUT=420\n\n# ── PostgreSQL (defaults are fine for local dev) ────────────────\n# POSTGRES_PASSWORD=gireng_secret\n\n# ── Langfuse Tracing (optional — auto-configured in docker) ────\n# LANGFUSE_PUBLIC_KEY=\n# LANGFUSE_SECRET_KEY=\n# LANGFUSE_HOST=http://langfuse:3000\n# LANGFUSE_NEXTAUTH_SECRET=changeme-langfuse-secret\n# LANGFUSE_SALT=changeme-langfuse-salt\n\n"}, "f459e7cc788398d6ae85d5bf1d658eec7c21e729": {"t": 1785767373.1739802, "n": 2053, "h": "898562a77ef0ace7", "c": "# ╔══════════════════════════════════════════════════════════════╗\n# ║ gireng — Environment Configuration ║\n# ║ Copy this file: cp .env.template .env ║\n# ║ Then fill in your API key below and run docker compose up ║\n# ╚══════════════════════════════════════════════════════════════╝\n\n# ── LLM API Key (REQUIRED) ──────────────────────────────────────\n# Get your key from your LLM provider (Anthropic, OpenAI-compatible, etc.)\nANTHROPIC_API_KEY=<your-api-key-here>\nANTHROPIC_BASE_URL=\nANTHROPIC_MODEL=glm-4.7\n\n# ── Public Host Placeholder (used by UI/API/Langfuse URLs) ──────\n# Change HOST once and all browser-facing URLs follow it.\nHOST=localhost\nAPI_PORT=8080\nUI_PORT=4173\nLANGFUSE_PORT=3100\n\n# Optional explicit URL overrides (leave commented in most setups)\n# VITE_API_BASE_URL=http://localhost:8080\n# VITE_WS_URL=ws://localhost:8080/stream\n# LANGFUSE_URL=http://localhost:3100\n\n# ── Ghidra Runner Image ─────────────────────────────────────────\nRUNNER_IMAGE=danilid/ireng-runner:2.0.1\n\n# ── Function Prioritization Weights ─────────────────────────────\n# score = alpha * norm(xrefs) + beta * norm(size)\nFUNCTION_PRIORITY_ALPHA=0.7\nFUNCTION_PRIORITY_BETA=0.3\n\n# ── Optional Dynamic Analyzer (Qiling) ──────────────────────────\n# Qiling runs inside its own container and adds runtime behavior traces.\nENABLE_QILING=true\nQILING_TIMEOUT=60\n\n# ── Radare2 Resource Limits ─────────────────────────────────────\n# Cap Radare2 so it does not consume excessive host CPU/RAM.\nR2_CPU_LIMIT=2.0\nR2_MEM_LIMIT=2g\nR2_MEMSWAP_LIMIT=2g\n# Per-command timeout (seconds) and hard cap for full R2 pipeline.\nR2_TIMEOUT=60\nR2_PIPELINE_TIMEOUT=420\n\n# ── PostgreSQL (defaults are fine for local dev) ────────────────\n# POSTGRES_PASSWORD=gireng_secret\n\n# ── Langfuse Tracing (optional — auto-configured in docker) ────\n# LANGFUSE_PUBLIC_KEY=\n# LANGFUSE_SECRET_KEY=\n# LANGFUSE_HOST=http://langfuse:3000\n# LANGFUSE_NEXTAUTH_SECRET=changeme-langfuse-secret\n# LANGFUSE_SALT=changeme-langfuse-salt\n# LANGFUSE_ENVIRONMENT=development\n"}, "f0b6d815ef9c14b5712cb6f83ae4ea06d25c1129": {"t": 1785767374.537316, "n": 1766, "h": "0c830963e715ef27", "c": "# ╔══════════════════════════════════════════════════════════════╗\n# ║ gireng — Environment Configuration ║\n# ║ Copy this file: cp .env.template .env ║\n# ║ Then fill in your API key below and run docker compose up ║\n# ╚══════════════════════════════════════════════════════════════╝\n\n# ── LLM API Key (REQUIRED) ──────────────────────────────────────\n# Get your key from your LLM provider (Anthropic, OpenAI-compatible, etc.)\nANTHROPIC_API_KEY=<your-api-key-here>\nANTHROPIC_BASE_URL=\nANTHROPIC_MODEL=glm-4.7\n\n# ── Public Host Placeholder (used by UI/API/Langfuse URLs) ──────\n# Change HOST once and all browser-facing URLs follow it.\nHOST=localhost\nAPI_PORT=8080\nUI_PORT=4173\nLANGFUSE_PORT=3100\n\n# Optional explicit URL overrides (leave commented in most setups)\n# VITE_API_BASE_URL=http://localhost:8080\n# VITE_WS_URL=ws://localhost:8080/stream\n# LANGFUSE_URL=http://localhost:3100\n\n# ── Ghidra Runner Image ─────────────────────────────────────────\nRUNNER_IMAGE=danilid/ireng-runner:2.0.1\n\n# ── Function Prioritization Weights ─────────────────────────────\n# score = alpha * norm(xrefs) + beta * norm(size)\nFUNCTION_PRIORITY_ALPHA=0.7\nFUNCTION_PRIORITY_BETA=0.3\n\n# ── Optional Dynamic Analyzer (Qiling) ──────────────────────────\n# Qiling runs inside its own container and adds runtime behavior traces.\nENABLE_QILING=true\nQILING_TIMEOUT=60\n\n# ── PostgreSQL (defaults are fine for local dev) ────────────────\n# POSTGRES_PASSWORD=gireng_secret\n\n# ── Langfuse Tracing (optional — auto-configured in docker) ────\n# LANGFUSE_PUBLIC_KEY=\n# LANGFUSE_SECRET_KEY=\n# LANGFUSE_HOST=http://langfuse:3000\n# LANGFUSE_NEXTAUTH_SECRET=changeme-langfuse-secret\n# LANGFUSE_SALT=changeme-langfuse-salt\n# LANGFUSE_ENVIRONMENT=development\n"}, "679d702e1624e77dc6f836b64a0df1b9b4fcf329": {"t": 1785767375.9062972, "n": 1588, "h": "ce9a4ec143135d80", "c": "# ╔══════════════════════════════════════════════════════════════╗\n# ║ gireng — Environment Configuration ║\n# ║ Copy this file: cp .env.template .env ║\n# ║ Then fill in your API key below and run docker compose up ║\n# ╚══════════════════════════════════════════════════════════════╝\n\n# ── LLM API Key (REQUIRED) ──────────────────────────────────────\n# Get your key from your LLM provider (Anthropic, OpenAI-compatible, etc.)\nANTHROPIC_API_KEY=<your-api-key-here>\nANTHROPIC_BASE_URL=\nANTHROPIC_MODEL=glm-4.7\n\n# ── Public Host Placeholder (used by UI/API/Langfuse URLs) ──────\n# Change HOST once and all browser-facing URLs follow it.\nHOST=localhost\nAPI_PORT=8080\nUI_PORT=4173\nLANGFUSE_PORT=3100\n\n# Optional explicit URL overrides (leave commented in most setups)\n# VITE_API_BASE_URL=http://localhost:8080\n# VITE_WS_URL=ws://localhost:8080/stream\n# LANGFUSE_URL=http://localhost:3100\n\n# ── Ghidra Runner Image ─────────────────────────────────────────\nRUNNER_IMAGE=danilid/ireng-runner:2.0.1\n\n# ── Function Prioritization Weights ─────────────────────────────\n# score = alpha * norm(xrefs) + beta * norm(size)\nFUNCTION_PRIORITY_ALPHA=0.7\nFUNCTION_PRIORITY_BETA=0.3\n\n# ── PostgreSQL (defaults are fine for local dev) ────────────────\n# POSTGRES_PASSWORD=gireng_secret\n\n# ── Langfuse Tracing (optional — auto-configured in docker) ────\n# LANGFUSE_PUBLIC_KEY=\n# LANGFUSE_SECRET_KEY=\n# LANGFUSE_HOST=http://langfuse:3000\n# LANGFUSE_NEXTAUTH_SECRET=changeme-langfuse-secret\n# LANGFUSE_SALT=changeme-langfuse-salt\n# LANGFUSE_ENVIRONMENT=development\n"}, "68ca66db1d87b45b96498c6ad03a97a2075ee2da": {"t": 1785767377.3160439, "n": 1575, "h": "cf225a79f44cebbd", "c": "# ╔══════════════════════════════════════════════════════════════╗\n# ║ gireng — Environment Configuration ║\n# ║ Copy this file: cp .env.template .env ║\n# ║ Then fill in your API key below and run docker compose up ║\n# ╚══════════════════════════════════════════════════════════════╝\n\n# ── LLM API Key (REQUIRED) ──────────────────────────────────────\n# Get your key from your LLM provider (Anthropic, OpenAI-compatible, etc.)\nANTHROPIC_API_KEY=<your-api-key-here>\nANTHROPIC_BASE_URL=\nANTHROPIC_MODEL=glm-4.7\n\n# ── Public Host Placeholder (used by UI/API/Langfuse URLs) ──────\n# Change HOST once and all browser-facing URLs follow it.\nHOST=localhost\nAPI_PORT=8080\nUI_PORT=4173\nLANGFUSE_PORT=3100\n\n# Optional explicit URL overrides (leave commented in most setups)\n# VITE_API_BASE_URL=http://localhost:8080\n# VITE_WS_URL=ws://localhost:8080/stream\n# LANGFUSE_URL=http://localhost:3100\n\n# ── Ghidra Runner Image ─────────────────────────────────────────\nRUNNER_IMAGE=gireng-runner\n\n# ── Function Prioritization Weights ─────────────────────────────\n# score = alpha * norm(xrefs) + beta * norm(size)\nFUNCTION_PRIORITY_ALPHA=0.7\nFUNCTION_PRIORITY_BETA=0.3\n\n# ── PostgreSQL (defaults are fine for local dev) ────────────────\n# POSTGRES_PASSWORD=gireng_secret\n\n# ── Langfuse Tracing (optional — auto-configured in docker) ────\n# LANGFUSE_PUBLIC_KEY=\n# LANGFUSE_SECRET_KEY=\n# LANGFUSE_HOST=http://langfuse:3000\n# LANGFUSE_NEXTAUTH_SECRET=changeme-langfuse-secret\n# LANGFUSE_SALT=changeme-langfuse-salt\n# LANGFUSE_ENVIRONMENT=development\n"}, "aa11cf09c7f305c9c024c9eed4bf52d299c13b69": {"t": 1785767378.5695283, "n": 1163, "h": "ea9ac9fc794fb8c4", "c": "# ╔══════════════════════════════════════════════════════════════╗\n# ║ gireng — Environment Configuration ║\n# ║ Copy this file: cp .env.template .env ║\n# ║ Then fill in your API key below and run docker compose up ║\n# ╚══════════════════════════════════════════════════════════════╝\n\n# ── LLM API Key (REQUIRED) ──────────────────────────────────────\n# Get your key from your LLM provider (Anthropic, OpenAI-compatible, etc.)\nANTHROPIC_API_KEY=<your-api-key-here>\nANTHROPIC_BASE_URL=\nANTHROPIC_MODEL=glm-4.7\n\n# ── Ghidra Runner Image ─────────────────────────────────────────\nRUNNER_IMAGE=gireng-runner\n\n# ── Function Prioritization Weights ─────────────────────────────\n# score = alpha * norm(xrefs) + beta * norm(size)\nFUNCTION_PRIORITY_ALPHA=0.7\nFUNCTION_PRIORITY_BETA=0.3\n\n# ── PostgreSQL (defaults are fine for local dev) ────────────────\n# POSTGRES_PASSWORD=gireng_secret\n\n# ── Langfuse Tracing (optional — auto-configured in docker) ────\n# LANGFUSE_PUBLIC_KEY=\n# LANGFUSE_SECRET_KEY=\n# LANGFUSE_NEXTAUTH_SECRET=changeme-langfuse-secret\n# LANGFUSE_SALT=changeme-langfuse-salt\n# LANGFUSE_ENVIRONMENT=development\n"}, "55ea6cce388f808c4c09e24d26e55c1376859210": {"t": 1785767380.458181, "n": 1161, "h": "4f6b62142a88ca47", "c": "# ╔══════════════════════════════════════════════════════════════╗\n# ║ IrengSec — Environment Configuration ║\n# ║ Copy this file: cp .env.template .env ║\n# ║ Then fill in your API key below and run docker compose up ║\n# ╚══════════════════════════════════════════════════════════════╝\n\n# ── LLM API Key (REQUIRED) ──────────────────────────────────────\n# Get your key from your LLM provider (Anthropic, OpenAI-compatible, etc.)\nANTHROPIC_API_KEY=<your-api-key-here>\nANTHROPIC_BASE_URL=\nANTHROPIC_MODEL=glm-4.7\n\n# ── Ghidra Runner Image ─────────────────────────────────────────\nRUNNER_IMAGE=ireng-runner\n\n# ── Function Prioritization Weights ─────────────────────────────\n# score = alpha * norm(xrefs) + beta * norm(size)\nFUNCTION_PRIORITY_ALPHA=0.7\nFUNCTION_PRIORITY_BETA=0.3\n\n# ── PostgreSQL (defaults are fine for local dev) ────────────────\n# POSTGRES_PASSWORD=ireng_secret\n\n# ── Langfuse Tracing (optional — auto-configured in docker) ────\n# LANGFUSE_PUBLIC_KEY=\n# LANGFUSE_SECRET_KEY=\n# LANGFUSE_NEXTAUTH_SECRET=changeme-langfuse-secret\n# LANGFUSE_SALT=changeme-langfuse-salt\n# LANGFUSE_ENVIRONMENT=development\n"}, "8124469496ba0e293ef82e1bd0f40a42f5246f9f": {"t": 1785767381.6639426, "n": 265, "h": "bfe4e3a15a27b372", "c": "# Agent settings\nANTHROPIC_API_KEY=\nANTHROPIC_BASE_URL=\nANTHROPIC_MODEL=glm-4.7\n\n# Ghidra runner image\nRUNNER_IMAGE=ireng-runner\n\n# Function prioritization weights (score = alpha*norm(xrefs) + beta*norm(size))\nFUNCTION_PRIORITY_ALPHA=0.7\nFUNCTION_PRIORITY_BETA=0.3\n"}, "fa01aaecfde6345bce9814d9051da64847993f3f": {"t": 1785767382.80951, "n": 129, "h": "14565eabdbb7fd53", "c": "# Agent settings\nANTHROPIC_API_KEY=\nANTHROPIC_BASE_URL=\nANTHROPIC_MODEL=glm-4.7\n\n# Ghidra runner image\nRUNNER_IMAGE=ireng-runner\n"}}, "docker-compose.yml": {"1acc48ae947d7c44a28845b9b80fa4c33e0b8c9f": {"t": 1785747390.9283636, "n": 8525, "h": "da836e358eb807be", "c": "services:\n ghidra:\n image: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n container_name: ghidra_headless\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n set -e\n export XDG_CONFIG_HOME=/data/shared/ghidra-config\n mkdir -p /data/shared/ghidra-config\n\n # Remove PEP 668 externally-managed marker\n rm -f /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true\n\n # Install python3-venv (needed for venv creation with pip)\n apt-get update 2>/dev/null && \\\n apt-get install -y --no-install-recommends python3-venv 2>/dev/null || true\n\n # Detect Ghidra application ID for the venv path\n GHIDRA_PROPS=$$(find /usr/share/ghidra -name \"application.properties\" -path \"*/application/*\" 2>/dev/null | head -1)\n if [ -n \"$$GHIDRA_PROPS\" ]; then\n APP_NAME=$$(grep \"^application.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2 | tr ' ' '_')\n APP_VER=$$(grep \"^application.version\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n APP_REL=$$(grep \"^application.release.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n GHIDRA_ID=\"$${APP_NAME}_$${APP_VER}_$${APP_REL}\"\n else\n GHIDRA_ID=\"ghidra_12.0.1_DEV\"\n fi\n\n VENV_PATH=\"/data/shared/ghidra-config/ghidra/$${GHIDRA_ID}/venv\"\n PYGHIDRA_DIST=\"/usr/share/ghidra/Ghidra/Features/PyGhidra/pypkg/dist\"\n\n # Only set up if pyghidra is not already importable in the venv\n if ! \"$$VENV_PATH/bin/python3\" -c \"import pyghidra\" 2>/dev/null; then\n echo \"Setting up PyGhidra venv at $$VENV_PATH ...\"\n rm -rf \"$$VENV_PATH\" 2>/dev/null || true\n python3 -m venv \"$$VENV_PATH\"\n \"$$VENV_PATH/bin/pip\" install --no-index -f \"$$PYGHIDRA_DIST\" pyghidra\n \"$$VENV_PATH/bin/python3\" -c \"import pyghidra; print('pyghidra', pyghidra.__version__, 'installed')\"\n else\n echo \"PyGhidra already installed in venv\"\n fi\n\n echo \"Ghidra container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n healthcheck:\n test: [ \"CMD\", \"sh\", \"-c\", \"test -f /data/shared/ghidra-config/ghidra/*/venv/bin/python3 || python3 -c 'import pyghidra' 2>/dev/null\" ]\n interval: 10s\n timeout: 5s\n retries: 30\n start_period: 30s\n\n radare2:\n image: radare/radare2:latest\n container_name: radare2\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n # Install decompiler plugins (best-effort)\n r2pm -Ui r2ghidra 2>/dev/null || echo \"r2ghidra not available\"\n r2pm -Ui r2dec 2>/dev/null || echo \"r2dec not available\"\n touch /tmp/.r2_ready\n echo \"Radare2 container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n # Limit Radare2 resource usage to avoid host saturation.\n cpus: \"${R2_CPU_LIMIT:-2.0}\"\n mem_limit: \"${R2_MEM_LIMIT:-2g}\"\n memswap_limit: \"${R2_MEMSWAP_LIMIT:-2g}\"\n healthcheck:\n test: [ \"CMD\", \"cat\", \"/tmp/.r2_ready\" ]\n interval: 5s\n timeout: 3s\n retries: 10\n\n qiling:\n build:\n context: ./backend\n dockerfile: Dockerfile.qiling\n container_name: qiling_emulator\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n python3 -c \"import qiling; print('Qiling', qiling.__version__)\"\n touch /tmp/.qiling_ready\n echo \"Qiling container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n - ./backend/qiling_scripts:/opt/qiling/scripts\n healthcheck:\n test: [ \"CMD\", \"cat\", \"/tmp/.qiling_ready\" ]\n interval: 10s\n timeout: 5s\n retries: 10\n\n postgres:\n image: postgres:16-alpine\n container_name: ireng_postgres\n environment:\n POSTGRES_USER: ireng\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ireng_secret}\n POSTGRES_DB: ireng\n POSTGRES_MULTIPLE_DATABASES: langfuse\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-multi-db.sh:/docker-entrypoint-initdb.d/init-multi-db.sh\n healthcheck:\n test: [ \"CMD-SHELL\", \"pg_isready -U ireng\" ]\n interval: 5s\n timeout: 3s\n retries: 10\n\n langfuse:\n image: langfuse/langfuse:2\n container_name: ireng_langfuse\n depends_on:\n postgres:\n condition: service_healthy\n environment:\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/langfuse\n NEXTAUTH_URL: ${LANGFUSE_URL:-http://${HOST:-localhost}:${LANGFUSE_PORT:-3100}}\n NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET:-changeme-langfuse-secret}\n SALT: ${LANGFUSE_SALT:-changeme-langfuse-salt}\n TELEMETRY_ENABLED: \"true\"\n LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: \"false\"\n HOSTNAME: \"0.0.0.0\"\n ports:\n - \"${LANGFUSE_PORT:-3100}:3000\"\n healthcheck:\n test: [ \"CMD-SHELL\", \"wget -qO- http://0.0.0.0:3000/api/public/health || exit 1\" ]\n interval: 10s\n timeout: 10s\n retries: 15\n start_period: 60s\n\n agent:\n build:\n context: .\n dockerfile: backend/Dockerfile\n depends_on:\n ghidra:\n condition: service_healthy\n radare2:\n condition: service_healthy\n postgres:\n condition: service_healthy\n langfuse:\n condition: service_healthy\n environment:\n GHIDRA_DOCKER_IMAGE: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n GHIDRA_PROJECT_ROOT: /data/projects\n GHIDRA_SHARED_ROOT: /data/shared\n GHIDRA_VOLUME_CONTAINER: ghidra_headless\n GHIDRA_SCRIPTS_ROOT: /data/shared/scripts\n GHIDRA_SCRIPTS_SOURCE: /app/ghidra_scripts\n GHIDRA_HEADLESS_SCRIPT_PATH: /usr/share/ghidra/support/pyghidraRun\n GHIDRA_INSTALL_PATH: /usr/share/ghidra\n DOCKER_CLI_PATH: /usr/bin/docker\n LLM_MODEL_NAME: ${LLM_MODEL_NAME:-${DEEPSEEK_MODEL:-deepseek-v4-pro}}\n LLM_TIMEOUT: ${LLM_TIMEOUT:-1200}\n LLM_PROVIDER: ${LLM_PROVIDER:-openai}\n LLM_REASONING_EFFORT: ${LLM_REASONING_EFFORT:-high}\n LLM_THINKING_MODE: ${LLM_THINKING_MODE:-enabled}\n MAX_DECOMPILATION_TIME: \"30\"\n DEFAULT_ANALYSIS_TIMEOUT: \"120\"\n LLM_API_KEY: ${LLM_API_KEY:-${DEEPSEEK_API_KEY:-${OPENAI_API_KEY:-${ANTHROPIC_API_KEY:-}}}}\n LLM_BASE_URL: ${LLM_BASE_URL:-${DEEPSEEK_BASE_URL:-https://api.deepseek.com}}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n DEEPSEEK_BASE_URL: ${DEEPSEEK_BASE_URL:-https://api.deepseek.com}\n OPENAI_API_KEY: ${OPENAI_API_KEY:-}\n OPENAI_BASE_URL: ${OPENAI_BASE_URL:-}\n ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}\n ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL:-}\n R2_CONTAINER_NAME: radare2\n R2_SHARED_ROOT: /data/shared\n R2_TIMEOUT: \"${R2_TIMEOUT:-60}\"\n R2_PIPELINE_TIMEOUT: \"${R2_PIPELINE_TIMEOUT:-420}\"\n ENABLE_R2: \"true\"\n QILING_CONTAINER_NAME: qiling_emulator\n QILING_SHARED_ROOT: /data/shared\n QILING_SCRIPTS_ROOT: /opt/qiling/scripts\n QILING_ROOTFS_BASE: /opt/qiling/rootfs\n QILING_TIMEOUT: \"${QILING_TIMEOUT:-60}\"\n ENABLE_QILING: \"${ENABLE_QILING:-true}\"\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/ireng\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-http://langfuse:3000}\n LANGFUSE_ENABLED: \"true\"\n JWT_SECRET: ${JWT_SECRET:-changeme-gireng-jwt-secret-key}\n JWT_ALGORITHM: HS256\n JWT_EXPIRE_MINUTES: \"1440\"\n ADMIN_EMAIL: ${ADMIN_EMAIL:-admin@gireng.local}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin}\n REGISTRATION_ENABLED: \"true\"\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n - ./backend:/app\n - ./backend/ghidra_scripts:/app/ghidra_scripts\n - ./docs.md:/app/docs.md:ro\n - /var/run/docker.sock:/var/run/docker.sock\n ports:\n - \"${API_PORT:-8080}:8080\"\n\n ui:\n build:\n context: .\n dockerfile: app/Dockerfile.ui\n args:\n # Leave VITE_API_BASE_URL empty → frontend uses relative URLs\n # The Vite preview proxy (server-side) forwards to BACKEND_INTERNAL_URL\n VITE_API_BASE_URL: \"\"\n VITE_WS_URL: \"\"\n VITE_APP_NAME: ${VITE_APP_NAME:-IrengSec}\n BACKEND_INTERNAL_URL: \"http://agent:8080\"\n environment:\n # Runtime env for the Vite preview Node.js process (proxy target)\n BACKEND_INTERNAL_URL: \"http://agent:8080\"\n ports:\n - \"${UI_PORT:-4173}:4173\"\n\nvolumes:\n ghidra_projects:\n ghidra_shared:\n pgdata:\n"}, "606be7e20bc6dbe514edee0324d122a111fc5c27": {"t": 1785767370.4869206, "n": 8525, "h": "da836e358eb807be", "c": "services:\n ghidra:\n image: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n container_name: ghidra_headless\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n set -e\n export XDG_CONFIG_HOME=/data/shared/ghidra-config\n mkdir -p /data/shared/ghidra-config\n\n # Remove PEP 668 externally-managed marker\n rm -f /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true\n\n # Install python3-venv (needed for venv creation with pip)\n apt-get update 2>/dev/null && \\\n apt-get install -y --no-install-recommends python3-venv 2>/dev/null || true\n\n # Detect Ghidra application ID for the venv path\n GHIDRA_PROPS=$$(find /usr/share/ghidra -name \"application.properties\" -path \"*/application/*\" 2>/dev/null | head -1)\n if [ -n \"$$GHIDRA_PROPS\" ]; then\n APP_NAME=$$(grep \"^application.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2 | tr ' ' '_')\n APP_VER=$$(grep \"^application.version\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n APP_REL=$$(grep \"^application.release.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n GHIDRA_ID=\"$${APP_NAME}_$${APP_VER}_$${APP_REL}\"\n else\n GHIDRA_ID=\"ghidra_12.0.1_DEV\"\n fi\n\n VENV_PATH=\"/data/shared/ghidra-config/ghidra/$${GHIDRA_ID}/venv\"\n PYGHIDRA_DIST=\"/usr/share/ghidra/Ghidra/Features/PyGhidra/pypkg/dist\"\n\n # Only set up if pyghidra is not already importable in the venv\n if ! \"$$VENV_PATH/bin/python3\" -c \"import pyghidra\" 2>/dev/null; then\n echo \"Setting up PyGhidra venv at $$VENV_PATH ...\"\n rm -rf \"$$VENV_PATH\" 2>/dev/null || true\n python3 -m venv \"$$VENV_PATH\"\n \"$$VENV_PATH/bin/pip\" install --no-index -f \"$$PYGHIDRA_DIST\" pyghidra\n \"$$VENV_PATH/bin/python3\" -c \"import pyghidra; print('pyghidra', pyghidra.__version__, 'installed')\"\n else\n echo \"PyGhidra already installed in venv\"\n fi\n\n echo \"Ghidra container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n healthcheck:\n test: [ \"CMD\", \"sh\", \"-c\", \"test -f /data/shared/ghidra-config/ghidra/*/venv/bin/python3 || python3 -c 'import pyghidra' 2>/dev/null\" ]\n interval: 10s\n timeout: 5s\n retries: 30\n start_period: 30s\n\n radare2:\n image: radare/radare2:latest\n container_name: radare2\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n # Install decompiler plugins (best-effort)\n r2pm -Ui r2ghidra 2>/dev/null || echo \"r2ghidra not available\"\n r2pm -Ui r2dec 2>/dev/null || echo \"r2dec not available\"\n touch /tmp/.r2_ready\n echo \"Radare2 container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n # Limit Radare2 resource usage to avoid host saturation.\n cpus: \"${R2_CPU_LIMIT:-2.0}\"\n mem_limit: \"${R2_MEM_LIMIT:-2g}\"\n memswap_limit: \"${R2_MEMSWAP_LIMIT:-2g}\"\n healthcheck:\n test: [ \"CMD\", \"cat\", \"/tmp/.r2_ready\" ]\n interval: 5s\n timeout: 3s\n retries: 10\n\n qiling:\n build:\n context: ./backend\n dockerfile: Dockerfile.qiling\n container_name: qiling_emulator\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n python3 -c \"import qiling; print('Qiling', qiling.__version__)\"\n touch /tmp/.qiling_ready\n echo \"Qiling container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n - ./backend/qiling_scripts:/opt/qiling/scripts\n healthcheck:\n test: [ \"CMD\", \"cat\", \"/tmp/.qiling_ready\" ]\n interval: 10s\n timeout: 5s\n retries: 10\n\n postgres:\n image: postgres:16-alpine\n container_name: ireng_postgres\n environment:\n POSTGRES_USER: ireng\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ireng_secret}\n POSTGRES_DB: ireng\n POSTGRES_MULTIPLE_DATABASES: langfuse\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-multi-db.sh:/docker-entrypoint-initdb.d/init-multi-db.sh\n healthcheck:\n test: [ \"CMD-SHELL\", \"pg_isready -U ireng\" ]\n interval: 5s\n timeout: 3s\n retries: 10\n\n langfuse:\n image: langfuse/langfuse:2\n container_name: ireng_langfuse\n depends_on:\n postgres:\n condition: service_healthy\n environment:\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/langfuse\n NEXTAUTH_URL: ${LANGFUSE_URL:-http://${HOST:-localhost}:${LANGFUSE_PORT:-3100}}\n NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET:-changeme-langfuse-secret}\n SALT: ${LANGFUSE_SALT:-changeme-langfuse-salt}\n TELEMETRY_ENABLED: \"true\"\n LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: \"false\"\n HOSTNAME: \"0.0.0.0\"\n ports:\n - \"${LANGFUSE_PORT:-3100}:3000\"\n healthcheck:\n test: [ \"CMD-SHELL\", \"wget -qO- http://0.0.0.0:3000/api/public/health || exit 1\" ]\n interval: 10s\n timeout: 10s\n retries: 15\n start_period: 60s\n\n agent:\n build:\n context: .\n dockerfile: backend/Dockerfile\n depends_on:\n ghidra:\n condition: service_healthy\n radare2:\n condition: service_healthy\n postgres:\n condition: service_healthy\n langfuse:\n condition: service_healthy\n environment:\n GHIDRA_DOCKER_IMAGE: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n GHIDRA_PROJECT_ROOT: /data/projects\n GHIDRA_SHARED_ROOT: /data/shared\n GHIDRA_VOLUME_CONTAINER: ghidra_headless\n GHIDRA_SCRIPTS_ROOT: /data/shared/scripts\n GHIDRA_SCRIPTS_SOURCE: /app/ghidra_scripts\n GHIDRA_HEADLESS_SCRIPT_PATH: /usr/share/ghidra/support/pyghidraRun\n GHIDRA_INSTALL_PATH: /usr/share/ghidra\n DOCKER_CLI_PATH: /usr/bin/docker\n LLM_MODEL_NAME: ${LLM_MODEL_NAME:-${DEEPSEEK_MODEL:-deepseek-v4-pro}}\n LLM_TIMEOUT: ${LLM_TIMEOUT:-1200}\n LLM_PROVIDER: ${LLM_PROVIDER:-openai}\n LLM_REASONING_EFFORT: ${LLM_REASONING_EFFORT:-high}\n LLM_THINKING_MODE: ${LLM_THINKING_MODE:-enabled}\n MAX_DECOMPILATION_TIME: \"30\"\n DEFAULT_ANALYSIS_TIMEOUT: \"120\"\n LLM_API_KEY: ${LLM_API_KEY:-${DEEPSEEK_API_KEY:-${OPENAI_API_KEY:-${ANTHROPIC_API_KEY:-}}}}\n LLM_BASE_URL: ${LLM_BASE_URL:-${DEEPSEEK_BASE_URL:-https://api.deepseek.com}}\n DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}\n DEEPSEEK_BASE_URL: ${DEEPSEEK_BASE_URL:-https://api.deepseek.com}\n OPENAI_API_KEY: ${OPENAI_API_KEY:-}\n OPENAI_BASE_URL: ${OPENAI_BASE_URL:-}\n ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}\n ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL:-}\n R2_CONTAINER_NAME: radare2\n R2_SHARED_ROOT: /data/shared\n R2_TIMEOUT: \"${R2_TIMEOUT:-60}\"\n R2_PIPELINE_TIMEOUT: \"${R2_PIPELINE_TIMEOUT:-420}\"\n ENABLE_R2: \"true\"\n QILING_CONTAINER_NAME: qiling_emulator\n QILING_SHARED_ROOT: /data/shared\n QILING_SCRIPTS_ROOT: /opt/qiling/scripts\n QILING_ROOTFS_BASE: /opt/qiling/rootfs\n QILING_TIMEOUT: \"${QILING_TIMEOUT:-60}\"\n ENABLE_QILING: \"${ENABLE_QILING:-true}\"\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/ireng\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-http://langfuse:3000}\n LANGFUSE_ENABLED: \"true\"\n JWT_SECRET: ${JWT_SECRET:-changeme-gireng-jwt-secret-key}\n JWT_ALGORITHM: HS256\n JWT_EXPIRE_MINUTES: \"1440\"\n ADMIN_EMAIL: ${ADMIN_EMAIL:-admin@gireng.local}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin}\n REGISTRATION_ENABLED: \"true\"\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n - ./backend:/app\n - ./backend/ghidra_scripts:/app/ghidra_scripts\n - ./docs.md:/app/docs.md:ro\n - /var/run/docker.sock:/var/run/docker.sock\n ports:\n - \"${API_PORT:-8080}:8080\"\n\n ui:\n build:\n context: .\n dockerfile: app/Dockerfile.ui\n args:\n # Leave VITE_API_BASE_URL empty → frontend uses relative URLs\n # The Vite preview proxy (server-side) forwards to BACKEND_INTERNAL_URL\n VITE_API_BASE_URL: \"\"\n VITE_WS_URL: \"\"\n VITE_APP_NAME: ${VITE_APP_NAME:-IrengSec}\n BACKEND_INTERNAL_URL: \"http://agent:8080\"\n environment:\n # Runtime env for the Vite preview Node.js process (proxy target)\n BACKEND_INTERNAL_URL: \"http://agent:8080\"\n ports:\n - \"${UI_PORT:-4173}:4173\"\n\nvolumes:\n ghidra_projects:\n ghidra_shared:\n pgdata:\n"}, "e901b366b2c4c3949f287a66f4a171440e3ab65c": {"t": 1785767371.879939, "n": 8156, "h": "413ccdb67290e90b", "c": "services:\n ghidra:\n image: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n container_name: ghidra_headless\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n set -e\n export XDG_CONFIG_HOME=/data/shared/ghidra-config\n mkdir -p /data/shared/ghidra-config\n\n # Remove PEP 668 externally-managed marker\n rm -f /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true\n\n # Install python3-venv (needed for venv creation with pip)\n apt-get update 2>/dev/null && \\\n apt-get install -y --no-install-recommends python3-venv 2>/dev/null || true\n\n # Detect Ghidra application ID for the venv path\n GHIDRA_PROPS=$$(find /usr/share/ghidra -name \"application.properties\" -path \"*/application/*\" 2>/dev/null | head -1)\n if [ -n \"$$GHIDRA_PROPS\" ]; then\n APP_NAME=$$(grep \"^application.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2 | tr ' ' '_')\n APP_VER=$$(grep \"^application.version\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n APP_REL=$$(grep \"^application.release.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n GHIDRA_ID=\"$${APP_NAME}_$${APP_VER}_$${APP_REL}\"\n else\n GHIDRA_ID=\"ghidra_12.0.1_DEV\"\n fi\n\n VENV_PATH=\"/data/shared/ghidra-config/ghidra/$${GHIDRA_ID}/venv\"\n PYGHIDRA_DIST=\"/usr/share/ghidra/Ghidra/Features/PyGhidra/pypkg/dist\"\n\n # Only set up if pyghidra is not already importable in the venv\n if ! \"$$VENV_PATH/bin/python3\" -c \"import pyghidra\" 2>/dev/null; then\n echo \"Setting up PyGhidra venv at $$VENV_PATH ...\"\n rm -rf \"$$VENV_PATH\" 2>/dev/null || true\n python3 -m venv \"$$VENV_PATH\"\n \"$$VENV_PATH/bin/pip\" install --no-index -f \"$$PYGHIDRA_DIST\" pyghidra\n \"$$VENV_PATH/bin/python3\" -c \"import pyghidra; print('pyghidra', pyghidra.__version__, 'installed')\"\n else\n echo \"PyGhidra already installed in venv\"\n fi\n\n echo \"Ghidra container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n healthcheck:\n test: [ \"CMD\", \"sh\", \"-c\", \"test -f /data/shared/ghidra-config/ghidra/*/venv/bin/python3 || python3 -c 'import pyghidra' 2>/dev/null\" ]\n interval: 10s\n timeout: 5s\n retries: 30\n start_period: 30s\n\n radare2:\n image: radare/radare2:latest\n container_name: radare2\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n # Install decompiler plugins (best-effort)\n r2pm -Ui r2ghidra 2>/dev/null || echo \"r2ghidra not available\"\n r2pm -Ui r2dec 2>/dev/null || echo \"r2dec not available\"\n touch /tmp/.r2_ready\n echo \"Radare2 container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n # Limit Radare2 resource usage to avoid host saturation.\n cpus: \"${R2_CPU_LIMIT:-2.0}\"\n mem_limit: \"${R2_MEM_LIMIT:-2g}\"\n memswap_limit: \"${R2_MEMSWAP_LIMIT:-2g}\"\n healthcheck:\n test: [ \"CMD\", \"cat\", \"/tmp/.r2_ready\" ]\n interval: 5s\n timeout: 3s\n retries: 10\n\n qiling:\n build:\n context: ./backend\n dockerfile: Dockerfile.qiling\n container_name: qiling_emulator\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n python3 -c \"import qiling; print('Qiling', qiling.__version__)\"\n touch /tmp/.qiling_ready\n echo \"Qiling container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n - ./backend/qiling_scripts:/opt/qiling/scripts\n healthcheck:\n test: [ \"CMD\", \"cat\", \"/tmp/.qiling_ready\" ]\n interval: 10s\n timeout: 5s\n retries: 10\n\n postgres:\n image: postgres:16-alpine\n container_name: ireng_postgres\n environment:\n POSTGRES_USER: ireng\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ireng_secret}\n POSTGRES_DB: ireng\n POSTGRES_MULTIPLE_DATABASES: langfuse\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-multi-db.sh:/docker-entrypoint-initdb.d/init-multi-db.sh\n healthcheck:\n test: [ \"CMD-SHELL\", \"pg_isready -U ireng\" ]\n interval: 5s\n timeout: 3s\n retries: 10\n\n langfuse:\n image: langfuse/langfuse:2\n container_name: ireng_langfuse\n depends_on:\n postgres:\n condition: service_healthy\n environment:\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/langfuse\n NEXTAUTH_URL: ${LANGFUSE_URL:-http://${HOST:-localhost}:${LANGFUSE_PORT:-3100}}\n NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET:-changeme-langfuse-secret}\n SALT: ${LANGFUSE_SALT:-changeme-langfuse-salt}\n TELEMETRY_ENABLED: \"true\"\n LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: \"false\"\n HOSTNAME: \"0.0.0.0\"\n ports:\n - \"${LANGFUSE_PORT:-3100}:3000\"\n healthcheck:\n test: [ \"CMD-SHELL\", \"wget -qO- http://0.0.0.0:3000/api/public/health || exit 1\" ]\n interval: 10s\n timeout: 10s\n retries: 15\n start_period: 60s\n\n agent:\n build:\n context: .\n dockerfile: backend/Dockerfile\n depends_on:\n ghidra:\n condition: service_healthy\n radare2:\n condition: service_healthy\n postgres:\n condition: service_healthy\n langfuse:\n condition: service_healthy\n environment:\n GHIDRA_DOCKER_IMAGE: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n GHIDRA_PROJECT_ROOT: /data/projects\n GHIDRA_SHARED_ROOT: /data/shared\n GHIDRA_VOLUME_CONTAINER: ghidra_headless\n GHIDRA_SCRIPTS_ROOT: /data/shared/scripts\n GHIDRA_SCRIPTS_SOURCE: /app/ghidra_scripts\n GHIDRA_HEADLESS_SCRIPT_PATH: /usr/share/ghidra/support/pyghidraRun\n GHIDRA_INSTALL_PATH: /usr/share/ghidra\n DOCKER_CLI_PATH: /usr/bin/docker\n LLM_MODEL_NAME: ${ANTHROPIC_MODEL:-glm-5}\n LLM_TIMEOUT: ${LLM_TIMEOUT:-1200}\n LLM_PROVIDER: openai\n MAX_DECOMPILATION_TIME: \"30\"\n DEFAULT_ANALYSIS_TIMEOUT: \"120\"\n LLM_API_KEY: ${ANTHROPIC_API_KEY}\n # LLM_BASE_URL: https://api.z.ai/api/coding/paas/v4/\n LLM_BASE_URL: ${ANTHROPIC_BASE_URL:-https://api.z.ai/api/coding/paas/v4/}\n ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}\n ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL}\n R2_CONTAINER_NAME: radare2\n R2_SHARED_ROOT: /data/shared\n R2_TIMEOUT: \"${R2_TIMEOUT:-60}\"\n R2_PIPELINE_TIMEOUT: \"${R2_PIPELINE_TIMEOUT:-420}\"\n ENABLE_R2: \"true\"\n QILING_CONTAINER_NAME: qiling_emulator\n QILING_SHARED_ROOT: /data/shared\n QILING_SCRIPTS_ROOT: /opt/qiling/scripts\n QILING_ROOTFS_BASE: /opt/qiling/rootfs\n QILING_TIMEOUT: \"${QILING_TIMEOUT:-60}\"\n ENABLE_QILING: \"${ENABLE_QILING:-true}\"\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/ireng\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-http://langfuse:3000}\n LANGFUSE_ENABLED: \"true\"\n JWT_SECRET: ${JWT_SECRET:-changeme-gireng-jwt-secret-key}\n JWT_ALGORITHM: HS256\n JWT_EXPIRE_MINUTES: \"1440\"\n ADMIN_EMAIL: ${ADMIN_EMAIL:-admin@gireng.local}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin}\n REGISTRATION_ENABLED: \"true\"\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n - ./backend:/app\n - ./backend/ghidra_scripts:/app/ghidra_scripts\n - ./docs.md:/app/docs.md:ro\n - /var/run/docker.sock:/var/run/docker.sock\n ports:\n - \"${API_PORT:-8080}:8080\"\n\n ui:\n build:\n context: .\n dockerfile: app/Dockerfile.ui\n args:\n # Leave VITE_API_BASE_URL empty → frontend uses relative URLs\n # The Vite preview proxy (server-side) forwards to BACKEND_INTERNAL_URL\n VITE_API_BASE_URL: \"\"\n VITE_WS_URL: \"\"\n VITE_APP_NAME: ${VITE_APP_NAME:-IrengSec}\n BACKEND_INTERNAL_URL: \"http://agent:8080\"\n environment:\n # Runtime env for the Vite preview Node.js process (proxy target)\n BACKEND_INTERNAL_URL: \"http://agent:8080\"\n ports:\n - \"${UI_PORT:-4173}:4173\"\n\nvolumes:\n ghidra_projects:\n ghidra_shared:\n pgdata:\n"}, "751dec4693073452fb6ed2a919e27805f10ccbff": {"t": 1785767373.146688, "n": 8122, "h": "5801cfb0c9cb0f39", "c": "services:\n ghidra:\n image: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n container_name: ghidra_headless\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n set -e\n export XDG_CONFIG_HOME=/data/shared/ghidra-config\n mkdir -p /data/shared/ghidra-config\n\n # Remove PEP 668 externally-managed marker\n rm -f /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true\n\n # Install python3-venv (needed for venv creation with pip)\n apt-get update 2>/dev/null && \\\n apt-get install -y --no-install-recommends python3-venv 2>/dev/null || true\n\n # Detect Ghidra application ID for the venv path\n GHIDRA_PROPS=$$(find /usr/share/ghidra -name \"application.properties\" -path \"*/application/*\" 2>/dev/null | head -1)\n if [ -n \"$$GHIDRA_PROPS\" ]; then\n APP_NAME=$$(grep \"^application.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2 | tr ' ' '_')\n APP_VER=$$(grep \"^application.version\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n APP_REL=$$(grep \"^application.release.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n GHIDRA_ID=\"$${APP_NAME}_$${APP_VER}_$${APP_REL}\"\n else\n GHIDRA_ID=\"ghidra_12.0.1_DEV\"\n fi\n\n VENV_PATH=\"/data/shared/ghidra-config/ghidra/$${GHIDRA_ID}/venv\"\n PYGHIDRA_DIST=\"/usr/share/ghidra/Ghidra/Features/PyGhidra/pypkg/dist\"\n\n # Only set up if pyghidra is not already importable in the venv\n if ! \"$$VENV_PATH/bin/python3\" -c \"import pyghidra\" 2>/dev/null; then\n echo \"Setting up PyGhidra venv at $$VENV_PATH ...\"\n rm -rf \"$$VENV_PATH\" 2>/dev/null || true\n python3 -m venv \"$$VENV_PATH\"\n \"$$VENV_PATH/bin/pip\" install --no-index -f \"$$PYGHIDRA_DIST\" pyghidra\n \"$$VENV_PATH/bin/python3\" -c \"import pyghidra; print('pyghidra', pyghidra.__version__, 'installed')\"\n else\n echo \"PyGhidra already installed in venv\"\n fi\n\n echo \"Ghidra container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n healthcheck:\n test: [ \"CMD\", \"sh\", \"-c\", \"test -f /data/shared/ghidra-config/ghidra/*/venv/bin/python3 || python3 -c 'import pyghidra' 2>/dev/null\" ]\n interval: 10s\n timeout: 5s\n retries: 30\n start_period: 30s\n\n radare2:\n image: radare/radare2:latest\n container_name: radare2\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n # Install decompiler plugins (best-effort)\n r2pm -Ui r2ghidra 2>/dev/null || echo \"r2ghidra not available\"\n r2pm -Ui r2dec 2>/dev/null || echo \"r2dec not available\"\n touch /tmp/.r2_ready\n echo \"Radare2 container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n # Limit Radare2 resource usage to avoid host saturation.\n cpus: \"${R2_CPU_LIMIT:-2.0}\"\n mem_limit: \"${R2_MEM_LIMIT:-2g}\"\n memswap_limit: \"${R2_MEMSWAP_LIMIT:-2g}\"\n healthcheck:\n test: [ \"CMD\", \"cat\", \"/tmp/.r2_ready\" ]\n interval: 5s\n timeout: 3s\n retries: 10\n\n qiling:\n build:\n context: ./backend\n dockerfile: Dockerfile.qiling\n container_name: qiling_emulator\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n python3 -c \"import qiling; print('Qiling', qiling.__version__)\"\n touch /tmp/.qiling_ready\n echo \"Qiling container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n - ./backend/qiling_scripts:/opt/qiling/scripts\n healthcheck:\n test: [ \"CMD\", \"cat\", \"/tmp/.qiling_ready\" ]\n interval: 10s\n timeout: 5s\n retries: 10\n\n postgres:\n image: postgres:16-alpine\n container_name: ireng_postgres\n environment:\n POSTGRES_USER: ireng\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ireng_secret}\n POSTGRES_DB: ireng\n POSTGRES_MULTIPLE_DATABASES: langfuse\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-multi-db.sh:/docker-entrypoint-initdb.d/init-multi-db.sh\n healthcheck:\n test: [ \"CMD-SHELL\", \"pg_isready -U ireng\" ]\n interval: 5s\n timeout: 3s\n retries: 10\n\n langfuse:\n image: langfuse/langfuse:2\n container_name: ireng_langfuse\n depends_on:\n postgres:\n condition: service_healthy\n environment:\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/langfuse\n NEXTAUTH_URL: ${LANGFUSE_URL:-http://${HOST:-localhost}:${LANGFUSE_PORT:-3100}}\n NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET:-changeme-langfuse-secret}\n SALT: ${LANGFUSE_SALT:-changeme-langfuse-salt}\n TELEMETRY_ENABLED: \"true\"\n LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: \"false\"\n HOSTNAME: \"0.0.0.0\"\n ports:\n - \"${LANGFUSE_PORT:-3100}:3000\"\n healthcheck:\n test: [ \"CMD-SHELL\", \"wget -qO- http://0.0.0.0:3000/api/public/health || exit 1\" ]\n interval: 10s\n timeout: 10s\n retries: 15\n start_period: 60s\n\n agent:\n build:\n context: .\n dockerfile: backend/Dockerfile\n depends_on:\n ghidra:\n condition: service_healthy\n radare2:\n condition: service_healthy\n postgres:\n condition: service_healthy\n langfuse:\n condition: service_healthy\n environment:\n GHIDRA_DOCKER_IMAGE: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n GHIDRA_PROJECT_ROOT: /data/projects\n GHIDRA_SHARED_ROOT: /data/shared\n GHIDRA_VOLUME_CONTAINER: ghidra_headless\n GHIDRA_SCRIPTS_ROOT: /data/shared/scripts\n GHIDRA_SCRIPTS_SOURCE: /app/ghidra_scripts\n GHIDRA_HEADLESS_SCRIPT_PATH: /usr/share/ghidra/support/pyghidraRun\n GHIDRA_INSTALL_PATH: /usr/share/ghidra\n DOCKER_CLI_PATH: /usr/bin/docker\n LLM_MODEL_NAME: ${ANTHROPIC_MODEL:-glm-5}\n LLM_TIMEOUT: ${LLM_TIMEOUT:-1200}\n LLM_PROVIDER: openai\n MAX_DECOMPILATION_TIME: \"30\"\n DEFAULT_ANALYSIS_TIMEOUT: \"120\"\n LLM_API_KEY: ${ANTHROPIC_API_KEY}\n # LLM_BASE_URL: https://api.z.ai/api/coding/paas/v4/\n LLM_BASE_URL: ${ANTHROPIC_BASE_URL:-https://api.z.ai/api/coding/paas/v4/}\n ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}\n ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL}\n R2_CONTAINER_NAME: radare2\n R2_SHARED_ROOT: /data/shared\n R2_TIMEOUT: \"${R2_TIMEOUT:-60}\"\n R2_PIPELINE_TIMEOUT: \"${R2_PIPELINE_TIMEOUT:-420}\"\n ENABLE_R2: \"true\"\n QILING_CONTAINER_NAME: qiling_emulator\n QILING_SHARED_ROOT: /data/shared\n QILING_SCRIPTS_ROOT: /opt/qiling/scripts\n QILING_ROOTFS_BASE: /opt/qiling/rootfs\n QILING_TIMEOUT: \"${QILING_TIMEOUT:-60}\"\n ENABLE_QILING: \"${ENABLE_QILING:-true}\"\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/ireng\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-http://langfuse:3000}\n LANGFUSE_ENABLED: \"true\"\n JWT_SECRET: ${JWT_SECRET:-changeme-gireng-jwt-secret-key}\n JWT_ALGORITHM: HS256\n JWT_EXPIRE_MINUTES: \"1440\"\n ADMIN_EMAIL: ${ADMIN_EMAIL:-admin@gireng.local}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin}\n REGISTRATION_ENABLED: \"true\"\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n - ./backend:/app\n - ./backend/ghidra_scripts:/app/ghidra_scripts\n - /var/run/docker.sock:/var/run/docker.sock\n ports:\n - \"${API_PORT:-8080}:8080\"\n\n ui:\n build:\n context: .\n dockerfile: app/Dockerfile.ui\n args:\n # Leave VITE_API_BASE_URL empty → frontend uses relative URLs\n # The Vite preview proxy (server-side) forwards to BACKEND_INTERNAL_URL\n VITE_API_BASE_URL: \"\"\n VITE_WS_URL: \"\"\n VITE_APP_NAME: ${VITE_APP_NAME:-IrengSec}\n BACKEND_INTERNAL_URL: \"http://agent:8080\"\n environment:\n # Runtime env for the Vite preview Node.js process (proxy target)\n BACKEND_INTERNAL_URL: \"http://agent:8080\"\n ports:\n - \"${UI_PORT:-4173}:4173\"\n\nvolumes:\n ghidra_projects:\n ghidra_shared:\n pgdata:\n"}, "c4d84af564802bef012d423479683ae7125eeca8": {"t": 1785767374.491392, "n": 8131, "h": "d0ccaaf9ee04f8be", "c": "services:\n ghidra:\n image: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n container_name: ghidra_headless\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n set -e\n export XDG_CONFIG_HOME=/data/shared/ghidra-config\n mkdir -p /data/shared/ghidra-config\n\n # Remove PEP 668 externally-managed marker\n rm -f /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true\n\n # Install python3-venv (needed for venv creation with pip)\n apt-get update 2>/dev/null && \\\n apt-get install -y --no-install-recommends python3-venv 2>/dev/null || true\n\n # Detect Ghidra application ID for the venv path\n GHIDRA_PROPS=$$(find /usr/share/ghidra -name \"application.properties\" -path \"*/application/*\" 2>/dev/null | head -1)\n if [ -n \"$$GHIDRA_PROPS\" ]; then\n APP_NAME=$$(grep \"^application.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2 | tr ' ' '_')\n APP_VER=$$(grep \"^application.version\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n APP_REL=$$(grep \"^application.release.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n GHIDRA_ID=\"$${APP_NAME}_$${APP_VER}_$${APP_REL}\"\n else\n GHIDRA_ID=\"ghidra_12.0.1_DEV\"\n fi\n\n VENV_PATH=\"/data/shared/ghidra-config/ghidra/$${GHIDRA_ID}/venv\"\n PYGHIDRA_DIST=\"/usr/share/ghidra/Ghidra/Features/PyGhidra/pypkg/dist\"\n\n # Only set up if pyghidra is not already importable in the venv\n if ! \"$$VENV_PATH/bin/python3\" -c \"import pyghidra\" 2>/dev/null; then\n echo \"Setting up PyGhidra venv at $$VENV_PATH ...\"\n rm -rf \"$$VENV_PATH\" 2>/dev/null || true\n python3 -m venv \"$$VENV_PATH\"\n \"$$VENV_PATH/bin/pip\" install --no-index -f \"$$PYGHIDRA_DIST\" pyghidra\n \"$$VENV_PATH/bin/python3\" -c \"import pyghidra; print('pyghidra', pyghidra.__version__, 'installed')\"\n else\n echo \"PyGhidra already installed in venv\"\n fi\n\n echo \"Ghidra container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n healthcheck:\n test: [ \"CMD\", \"sh\", \"-c\", \"test -f /data/shared/ghidra-config/ghidra/*/venv/bin/python3 || python3 -c 'import pyghidra' 2>/dev/null\" ]\n interval: 10s\n timeout: 5s\n retries: 30\n start_period: 30s\n\n radare2:\n image: radare/radare2:latest\n container_name: radare2\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n # Install decompiler plugins (best-effort)\n r2pm -Ui r2ghidra 2>/dev/null || echo \"r2ghidra not available\"\n r2pm -Ui r2dec 2>/dev/null || echo \"r2dec not available\"\n touch /tmp/.r2_ready\n echo \"Radare2 container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n # Limit Radare2 resource usage to avoid host saturation.\n cpus: \"${R2_CPU_LIMIT:-2.0}\"\n mem_limit: \"${R2_MEM_LIMIT:-2g}\"\n memswap_limit: \"${R2_MEMSWAP_LIMIT:-2g}\"\n healthcheck:\n test: [ \"CMD\", \"cat\", \"/tmp/.r2_ready\" ]\n interval: 5s\n timeout: 3s\n retries: 10\n\n qiling:\n build:\n context: ./backend\n dockerfile: Dockerfile.qiling\n container_name: qiling_emulator\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n python3 -c \"import qiling; print('Qiling', qiling.__version__)\"\n touch /tmp/.qiling_ready\n echo \"Qiling container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n - ./backend/qiling_scripts:/opt/qiling/scripts\n healthcheck:\n test: [ \"CMD\", \"cat\", \"/tmp/.qiling_ready\" ]\n interval: 10s\n timeout: 5s\n retries: 10\n\n postgres:\n image: postgres:16-alpine\n container_name: ireng_postgres\n environment:\n POSTGRES_USER: ireng\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ireng_secret}\n POSTGRES_DB: ireng\n POSTGRES_MULTIPLE_DATABASES: langfuse\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-multi-db.sh:/docker-entrypoint-initdb.d/init-multi-db.sh\n healthcheck:\n test: [ \"CMD-SHELL\", \"pg_isready -U ireng\" ]\n interval: 5s\n timeout: 3s\n retries: 10\n\n langfuse:\n image: langfuse/langfuse:2\n container_name: ireng_langfuse\n depends_on:\n postgres:\n condition: service_healthy\n environment:\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/langfuse\n NEXTAUTH_URL: ${LANGFUSE_URL:-http://${HOST:-localhost}:${LANGFUSE_PORT:-3100}}\n NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET:-changeme-langfuse-secret}\n SALT: ${LANGFUSE_SALT:-changeme-langfuse-salt}\n TELEMETRY_ENABLED: \"true\"\n LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: \"false\"\n HOSTNAME: \"0.0.0.0\"\n ports:\n - \"${LANGFUSE_PORT:-3100}:3000\"\n healthcheck:\n test: [ \"CMD-SHELL\", \"wget -qO- http://0.0.0.0:3000/api/public/health || exit 1\" ]\n interval: 10s\n timeout: 10s\n retries: 15\n start_period: 60s\n\n agent:\n build:\n context: .\n dockerfile: backend/Dockerfile\n depends_on:\n ghidra:\n condition: service_healthy\n radare2:\n condition: service_healthy\n qiling:\n condition: service_healthy\n postgres:\n condition: service_healthy\n langfuse:\n condition: service_healthy\n environment:\n GHIDRA_DOCKER_IMAGE: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n GHIDRA_PROJECT_ROOT: /data/projects\n GHIDRA_SHARED_ROOT: /data/shared\n GHIDRA_VOLUME_CONTAINER: ghidra_headless\n GHIDRA_SCRIPTS_ROOT: /data/shared/scripts\n GHIDRA_SCRIPTS_SOURCE: /app/ghidra_scripts\n GHIDRA_HEADLESS_SCRIPT_PATH: /usr/share/ghidra/support/pyghidraRun\n GHIDRA_INSTALL_PATH: /usr/share/ghidra\n DOCKER_CLI_PATH: /usr/bin/docker\n LLM_MODEL_NAME: ${ANTHROPIC_MODEL:-glm-5}\n LLM_PROVIDER: openai\n MAX_DECOMPILATION_TIME: \"30\"\n DEFAULT_ANALYSIS_TIMEOUT: \"120\"\n LLM_API_KEY: ${ANTHROPIC_API_KEY}\n # LLM_BASE_URL: https://api.z.ai/api/coding/paas/v4/\n LLM_BASE_URL: ${ANTHROPIC_BASE_URL:-https://api.z.ai/api/coding/paas/v4/}\n ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}\n ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL}\n R2_CONTAINER_NAME: radare2\n R2_SHARED_ROOT: /data/shared\n R2_TIMEOUT: \"${R2_TIMEOUT:-60}\"\n R2_PIPELINE_TIMEOUT: \"${R2_PIPELINE_TIMEOUT:-420}\"\n ENABLE_R2: \"true\"\n QILING_CONTAINER_NAME: qiling_emulator\n QILING_SHARED_ROOT: /data/shared\n QILING_SCRIPTS_ROOT: /opt/qiling/scripts\n QILING_ROOTFS_BASE: /opt/qiling/rootfs\n QILING_TIMEOUT: \"${QILING_TIMEOUT:-60}\"\n ENABLE_QILING: \"${ENABLE_QILING:-true}\"\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/ireng\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-http://langfuse:3000}\n LANGFUSE_ENABLED: \"true\"\n JWT_SECRET: ${JWT_SECRET:-changeme-gireng-jwt-secret-key}\n JWT_ALGORITHM: HS256\n JWT_EXPIRE_MINUTES: \"1440\"\n ADMIN_EMAIL: ${ADMIN_EMAIL:-admin@gireng.local}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin}\n REGISTRATION_ENABLED: \"true\"\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n - ./backend:/app\n - ./backend/ghidra_scripts:/app/ghidra_scripts\n - /var/run/docker.sock:/var/run/docker.sock\n ports:\n - \"${API_PORT:-8080}:8080\"\n\n ui:\n build:\n context: .\n dockerfile: app/Dockerfile.ui\n args:\n # Leave VITE_API_BASE_URL empty → frontend uses relative URLs\n # The Vite preview proxy (server-side) forwards to BACKEND_INTERNAL_URL\n VITE_API_BASE_URL: \"\"\n VITE_WS_URL: \"\"\n VITE_APP_NAME: ${VITE_APP_NAME:-IrengSec}\n BACKEND_INTERNAL_URL: \"http://agent:8080\"\n environment:\n # Runtime env for the Vite preview Node.js process (proxy target)\n BACKEND_INTERNAL_URL: \"http://agent:8080\"\n ports:\n - \"${UI_PORT:-4173}:4173\"\n\nvolumes:\n ghidra_projects:\n ghidra_shared:\n pgdata:\n"}, "f459e7cc788398d6ae85d5bf1d658eec7c21e729": {"t": 1785767375.911895, "n": 7992, "h": "8fb4c5e8df7bc9c2", "c": "services:\n ghidra:\n image: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n container_name: ghidra_headless\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n set -e\n export XDG_CONFIG_HOME=/data/shared/ghidra-config\n mkdir -p /data/shared/ghidra-config\n\n # Remove PEP 668 externally-managed marker\n rm -f /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true\n\n # Install python3-venv (needed for venv creation with pip)\n apt-get update 2>/dev/null && \\\n apt-get install -y --no-install-recommends python3-venv 2>/dev/null || true\n\n # Detect Ghidra application ID for the venv path\n GHIDRA_PROPS=$$(find /usr/share/ghidra -name \"application.properties\" -path \"*/application/*\" 2>/dev/null | head -1)\n if [ -n \"$$GHIDRA_PROPS\" ]; then\n APP_NAME=$$(grep \"^application.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2 | tr ' ' '_')\n APP_VER=$$(grep \"^application.version\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n APP_REL=$$(grep \"^application.release.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n GHIDRA_ID=\"$${APP_NAME}_$${APP_VER}_$${APP_REL}\"\n else\n GHIDRA_ID=\"ghidra_12.0.1_DEV\"\n fi\n\n VENV_PATH=\"/data/shared/ghidra-config/ghidra/$${GHIDRA_ID}/venv\"\n PYGHIDRA_DIST=\"/usr/share/ghidra/Ghidra/Features/PyGhidra/pypkg/dist\"\n\n # Only set up if pyghidra is not already importable in the venv\n if ! \"$$VENV_PATH/bin/python3\" -c \"import pyghidra\" 2>/dev/null; then\n echo \"Setting up PyGhidra venv at $$VENV_PATH ...\"\n rm -rf \"$$VENV_PATH\" 2>/dev/null || true\n python3 -m venv \"$$VENV_PATH\"\n \"$$VENV_PATH/bin/pip\" install --no-index -f \"$$PYGHIDRA_DIST\" pyghidra\n \"$$VENV_PATH/bin/python3\" -c \"import pyghidra; print('pyghidra', pyghidra.__version__, 'installed')\"\n else\n echo \"PyGhidra already installed in venv\"\n fi\n\n echo \"Ghidra container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n healthcheck:\n test: [ \"CMD\", \"sh\", \"-c\", \"test -f /data/shared/ghidra-config/ghidra/*/venv/bin/python3 || python3 -c 'import pyghidra' 2>/dev/null\" ]\n interval: 10s\n timeout: 5s\n retries: 30\n start_period: 30s\n\n radare2:\n image: radare/radare2:latest\n container_name: radare2\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n # Install decompiler plugins (best-effort)\n r2pm -Ui r2ghidra 2>/dev/null || echo \"r2ghidra not available\"\n r2pm -Ui r2dec 2>/dev/null || echo \"r2dec not available\"\n touch /tmp/.r2_ready\n echo \"Radare2 container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n # Limit Radare2 resource usage to avoid host saturation.\n cpus: \"${R2_CPU_LIMIT:-2.0}\"\n mem_limit: \"${R2_MEM_LIMIT:-2g}\"\n memswap_limit: \"${R2_MEMSWAP_LIMIT:-2g}\"\n healthcheck:\n test: [ \"CMD\", \"cat\", \"/tmp/.r2_ready\" ]\n interval: 5s\n timeout: 3s\n retries: 10\n\n qiling:\n build:\n context: ./backend\n dockerfile: Dockerfile.qiling\n container_name: qiling_emulator\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n python3 -c \"import qiling; print('Qiling', qiling.__version__)\"\n touch /tmp/.qiling_ready\n echo \"Qiling container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n - ./backend/qiling_scripts:/opt/qiling/scripts\n healthcheck:\n test: [ \"CMD\", \"cat\", \"/tmp/.qiling_ready\" ]\n interval: 10s\n timeout: 5s\n retries: 10\n\n postgres:\n image: postgres:16-alpine\n container_name: ireng_postgres\n environment:\n POSTGRES_USER: ireng\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ireng_secret}\n POSTGRES_DB: ireng\n POSTGRES_MULTIPLE_DATABASES: langfuse\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-multi-db.sh:/docker-entrypoint-initdb.d/init-multi-db.sh\n healthcheck:\n test: [ \"CMD-SHELL\", \"pg_isready -U ireng\" ]\n interval: 5s\n timeout: 3s\n retries: 10\n\n langfuse:\n image: langfuse/langfuse:2\n container_name: ireng_langfuse\n depends_on:\n postgres:\n condition: service_healthy\n environment:\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/langfuse\n NEXTAUTH_URL: ${LANGFUSE_URL:-http://${HOST:-localhost}:${LANGFUSE_PORT:-3100}}\n NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET:-changeme-langfuse-secret}\n SALT: ${LANGFUSE_SALT:-changeme-langfuse-salt}\n TELEMETRY_ENABLED: \"true\"\n LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: \"false\"\n HOSTNAME: \"0.0.0.0\"\n ports:\n - \"${LANGFUSE_PORT:-3100}:3000\"\n healthcheck:\n test: [ \"CMD-SHELL\", \"wget -qO- http://0.0.0.0:3000/api/public/health || exit 1\" ]\n interval: 10s\n timeout: 10s\n retries: 15\n start_period: 60s\n\n agent:\n build:\n context: .\n dockerfile: backend/Dockerfile\n depends_on:\n ghidra:\n condition: service_healthy\n radare2:\n condition: service_healthy\n qiling:\n condition: service_healthy\n postgres:\n condition: service_healthy\n langfuse:\n condition: service_healthy\n environment:\n GHIDRA_DOCKER_IMAGE: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n GHIDRA_PROJECT_ROOT: /data/projects\n GHIDRA_SHARED_ROOT: /data/shared\n GHIDRA_VOLUME_CONTAINER: ghidra_headless\n GHIDRA_SCRIPTS_ROOT: /data/shared/scripts\n GHIDRA_SCRIPTS_SOURCE: /app/ghidra_scripts\n GHIDRA_HEADLESS_SCRIPT_PATH: /usr/share/ghidra/support/pyghidraRun\n GHIDRA_INSTALL_PATH: /usr/share/ghidra\n DOCKER_CLI_PATH: /usr/bin/docker\n LLM_MODEL_NAME: glm-5\n LLM_PROVIDER: openai\n MAX_DECOMPILATION_TIME: \"30\"\n DEFAULT_ANALYSIS_TIMEOUT: \"120\"\n LLM_API_KEY: ${ANTHROPIC_API_KEY}\n LLM_BASE_URL: https://api.z.ai/api/coding/paas/v4/\n ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}\n ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL}\n R2_CONTAINER_NAME: radare2\n R2_SHARED_ROOT: /data/shared\n R2_TIMEOUT: \"${R2_TIMEOUT:-60}\"\n R2_PIPELINE_TIMEOUT: \"${R2_PIPELINE_TIMEOUT:-420}\"\n ENABLE_R2: \"true\"\n QILING_CONTAINER_NAME: qiling_emulator\n QILING_SHARED_ROOT: /data/shared\n QILING_SCRIPTS_ROOT: /opt/qiling/scripts\n QILING_ROOTFS_BASE: /opt/qiling/rootfs\n QILING_TIMEOUT: \"60\"\n ENABLE_QILING: \"true\"\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/ireng\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-http://langfuse:3000}\n LANGFUSE_ENABLED: \"true\"\n JWT_SECRET: ${JWT_SECRET:-changeme-gireng-jwt-secret-key}\n JWT_ALGORITHM: HS256\n JWT_EXPIRE_MINUTES: \"1440\"\n ADMIN_EMAIL: ${ADMIN_EMAIL:-admin@gireng.local}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin}\n REGISTRATION_ENABLED: \"true\"\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n - ./backend:/app\n - ./backend/ghidra_scripts:/app/ghidra_scripts\n - /var/run/docker.sock:/var/run/docker.sock\n ports:\n - \"${API_PORT:-8080}:8080\"\n\n ui:\n build:\n context: .\n dockerfile: app/Dockerfile.ui\n args:\n # Leave VITE_API_BASE_URL empty → frontend uses relative URLs\n # The Vite preview proxy (server-side) forwards to BACKEND_INTERNAL_URL\n VITE_API_BASE_URL: \"\"\n VITE_WS_URL: \"\"\n VITE_APP_NAME: ${VITE_APP_NAME:-IrengSec}\n BACKEND_INTERNAL_URL: \"http://agent:8080\"\n environment:\n # Runtime env for the Vite preview Node.js process (proxy target)\n BACKEND_INTERNAL_URL: \"http://agent:8080\"\n ports:\n - \"${UI_PORT:-4173}:4173\"\n\nvolumes:\n ghidra_projects:\n ghidra_shared:\n pgdata:\n"}, "bebe4f72e0f4117b13a61e7a0efd3293725a917e": {"t": 1785767377.314235, "n": 7744, "h": "75605dfbc38ee67b", "c": "services:\n ghidra:\n image: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n container_name: ghidra_headless\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n set -e\n export XDG_CONFIG_HOME=/data/shared/ghidra-config\n mkdir -p /data/shared/ghidra-config\n\n # Remove PEP 668 externally-managed marker\n rm -f /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true\n\n # Install python3-venv (needed for venv creation with pip)\n apt-get update 2>/dev/null && \\\n apt-get install -y --no-install-recommends python3-venv 2>/dev/null || true\n\n # Detect Ghidra application ID for the venv path\n GHIDRA_PROPS=$$(find /usr/share/ghidra -name \"application.properties\" -path \"*/application/*\" 2>/dev/null | head -1)\n if [ -n \"$$GHIDRA_PROPS\" ]; then\n APP_NAME=$$(grep \"^application.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2 | tr ' ' '_')\n APP_VER=$$(grep \"^application.version\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n APP_REL=$$(grep \"^application.release.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n GHIDRA_ID=\"$${APP_NAME}_$${APP_VER}_$${APP_REL}\"\n else\n GHIDRA_ID=\"ghidra_12.0.1_DEV\"\n fi\n\n VENV_PATH=\"/data/shared/ghidra-config/ghidra/$${GHIDRA_ID}/venv\"\n PYGHIDRA_DIST=\"/usr/share/ghidra/Ghidra/Features/PyGhidra/pypkg/dist\"\n\n # Only set up if pyghidra is not already importable in the venv\n if ! \"$$VENV_PATH/bin/python3\" -c \"import pyghidra\" 2>/dev/null; then\n echo \"Setting up PyGhidra venv at $$VENV_PATH ...\"\n rm -rf \"$$VENV_PATH\" 2>/dev/null || true\n python3 -m venv \"$$VENV_PATH\"\n \"$$VENV_PATH/bin/pip\" install --no-index -f \"$$PYGHIDRA_DIST\" pyghidra\n \"$$VENV_PATH/bin/python3\" -c \"import pyghidra; print('pyghidra', pyghidra.__version__, 'installed')\"\n else\n echo \"PyGhidra already installed in venv\"\n fi\n\n echo \"Ghidra container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n healthcheck:\n test: [ \"CMD\", \"sh\", \"-c\", \"test -f /data/shared/ghidra-config/ghidra/*/venv/bin/python3 || python3 -c 'import pyghidra' 2>/dev/null\" ]\n interval: 10s\n timeout: 5s\n retries: 30\n start_period: 30s\n\n radare2:\n image: radare/radare2:latest\n container_name: radare2\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n # Install decompiler plugins (best-effort)\n r2pm -Ui r2ghidra 2>/dev/null || echo \"r2ghidra not available\"\n r2pm -Ui r2dec 2>/dev/null || echo \"r2dec not available\"\n touch /tmp/.r2_ready\n echo \"Radare2 container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n healthcheck:\n test: [ \"CMD\", \"cat\", \"/tmp/.r2_ready\" ]\n interval: 5s\n timeout: 3s\n retries: 10\n\n qiling:\n build:\n context: ./backend\n dockerfile: Dockerfile.qiling\n container_name: qiling_emulator\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n python3 -c \"import qiling; print('Qiling', qiling.__version__)\"\n touch /tmp/.qiling_ready\n echo \"Qiling container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n - ./backend/qiling_scripts:/opt/qiling/scripts\n healthcheck:\n test: [ \"CMD\", \"cat\", \"/tmp/.qiling_ready\" ]\n interval: 10s\n timeout: 5s\n retries: 10\n\n postgres:\n image: postgres:16-alpine\n container_name: ireng_postgres\n environment:\n POSTGRES_USER: ireng\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ireng_secret}\n POSTGRES_DB: ireng\n POSTGRES_MULTIPLE_DATABASES: langfuse\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-multi-db.sh:/docker-entrypoint-initdb.d/init-multi-db.sh\n healthcheck:\n test: [ \"CMD-SHELL\", \"pg_isready -U ireng\" ]\n interval: 5s\n timeout: 3s\n retries: 10\n\n langfuse:\n image: langfuse/langfuse:2\n container_name: ireng_langfuse\n depends_on:\n postgres:\n condition: service_healthy\n environment:\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/langfuse\n NEXTAUTH_URL: ${LANGFUSE_URL:-http://${HOST:-localhost}:${LANGFUSE_PORT:-3100}}\n NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET:-changeme-langfuse-secret}\n SALT: ${LANGFUSE_SALT:-changeme-langfuse-salt}\n TELEMETRY_ENABLED: \"true\"\n LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: \"false\"\n HOSTNAME: \"0.0.0.0\"\n ports:\n - \"${LANGFUSE_PORT:-3100}:3000\"\n healthcheck:\n test: [ \"CMD-SHELL\", \"wget -qO- http://0.0.0.0:3000/api/public/health || exit 1\" ]\n interval: 10s\n timeout: 10s\n retries: 15\n start_period: 60s\n\n agent:\n build:\n context: .\n dockerfile: backend/Dockerfile\n depends_on:\n ghidra:\n condition: service_healthy\n radare2:\n condition: service_healthy\n qiling:\n condition: service_healthy\n postgres:\n condition: service_healthy\n langfuse:\n condition: service_healthy\n environment:\n GHIDRA_DOCKER_IMAGE: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n GHIDRA_PROJECT_ROOT: /data/projects\n GHIDRA_SHARED_ROOT: /data/shared\n GHIDRA_VOLUME_CONTAINER: ghidra_headless\n GHIDRA_SCRIPTS_ROOT: /data/shared/scripts\n GHIDRA_SCRIPTS_SOURCE: /app/ghidra_scripts\n GHIDRA_HEADLESS_SCRIPT_PATH: /usr/share/ghidra/support/pyghidraRun\n GHIDRA_INSTALL_PATH: /usr/share/ghidra\n DOCKER_CLI_PATH: /usr/bin/docker\n LLM_MODEL_NAME: glm-5\n LLM_PROVIDER: openai\n MAX_DECOMPILATION_TIME: \"30\"\n DEFAULT_ANALYSIS_TIMEOUT: \"120\"\n LLM_API_KEY: ${ANTHROPIC_API_KEY}\n LLM_BASE_URL: https://api.z.ai/api/coding/paas/v4/\n ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}\n ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL}\n R2_CONTAINER_NAME: radare2\n R2_SHARED_ROOT: /data/shared\n R2_TIMEOUT: \"60\"\n ENABLE_R2: \"true\"\n QILING_CONTAINER_NAME: qiling_emulator\n QILING_SHARED_ROOT: /data/shared\n QILING_SCRIPTS_ROOT: /opt/qiling/scripts\n QILING_ROOTFS_BASE: /opt/qiling/rootfs\n QILING_TIMEOUT: \"60\"\n ENABLE_QILING: \"true\"\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/ireng\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-http://langfuse:3000}\n LANGFUSE_ENABLED: \"true\"\n JWT_SECRET: ${JWT_SECRET:-changeme-gireng-jwt-secret-key}\n JWT_ALGORITHM: HS256\n JWT_EXPIRE_MINUTES: \"1440\"\n ADMIN_EMAIL: ${ADMIN_EMAIL:-admin@gireng.local}\n ADMIN_USERNAME: ${ADMIN_USERNAME:-admin}\n ADMIN_PASSWORD: ${ADMIN_PASSWORD:-admin}\n REGISTRATION_ENABLED: \"true\"\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n - ./backend:/app\n - ./backend/ghidra_scripts:/app/ghidra_scripts\n - /var/run/docker.sock:/var/run/docker.sock\n ports:\n - \"${API_PORT:-8080}:8080\"\n\n ui:\n build:\n context: .\n dockerfile: app/Dockerfile.ui\n args:\n # Leave VITE_API_BASE_URL empty → frontend uses relative URLs\n # The Vite preview proxy (server-side) forwards to BACKEND_INTERNAL_URL\n VITE_API_BASE_URL: \"\"\n VITE_WS_URL: \"\"\n VITE_APP_NAME: ${VITE_APP_NAME:-IrengSec}\n BACKEND_INTERNAL_URL: \"http://agent:8080\"\n environment:\n # Runtime env for the Vite preview Node.js process (proxy target)\n BACKEND_INTERNAL_URL: \"http://agent:8080\"\n ports:\n - \"${UI_PORT:-4173}:4173\"\n\nvolumes:\n ghidra_projects:\n ghidra_shared:\n pgdata:\n"}, "ebe20dd96fb2f89f5af8c3d8625abc159625ffa5": {"t": 1785767378.7127707, "n": 7437, "h": "4bb35509e98c797c", "c": "services:\n ghidra:\n image: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n container_name: ghidra_headless\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n set -e\n export XDG_CONFIG_HOME=/data/shared/ghidra-config\n mkdir -p /data/shared/ghidra-config\n\n # Remove PEP 668 externally-managed marker\n rm -f /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true\n\n # Install python3-venv (needed for venv creation with pip)\n apt-get update 2>/dev/null && \\\n apt-get install -y --no-install-recommends python3-venv 2>/dev/null || true\n\n # Detect Ghidra application ID for the venv path\n GHIDRA_PROPS=$$(find /usr/share/ghidra -name \"application.properties\" -path \"*/application/*\" 2>/dev/null | head -1)\n if [ -n \"$$GHIDRA_PROPS\" ]; then\n APP_NAME=$$(grep \"^application.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2 | tr ' ' '_')\n APP_VER=$$(grep \"^application.version\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n APP_REL=$$(grep \"^application.release.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n GHIDRA_ID=\"$${APP_NAME}_$${APP_VER}_$${APP_REL}\"\n else\n GHIDRA_ID=\"ghidra_12.0.1_DEV\"\n fi\n\n VENV_PATH=\"/data/shared/ghidra-config/ghidra/$${GHIDRA_ID}/venv\"\n PYGHIDRA_DIST=\"/usr/share/ghidra/Ghidra/Features/PyGhidra/pypkg/dist\"\n\n # Only set up if pyghidra is not already importable in the venv\n if ! \"$$VENV_PATH/bin/python3\" -c \"import pyghidra\" 2>/dev/null; then\n echo \"Setting up PyGhidra venv at $$VENV_PATH ...\"\n rm -rf \"$$VENV_PATH\" 2>/dev/null || true\n python3 -m venv \"$$VENV_PATH\"\n \"$$VENV_PATH/bin/pip\" install --no-index -f \"$$PYGHIDRA_DIST\" pyghidra\n \"$$VENV_PATH/bin/python3\" -c \"import pyghidra; print('pyghidra', pyghidra.__version__, 'installed')\"\n else\n echo \"PyGhidra already installed in venv\"\n fi\n\n echo \"Ghidra container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n healthcheck:\n test: [ \"CMD\", \"sh\", \"-c\", \"test -f /data/shared/ghidra-config/ghidra/*/venv/bin/python3 || python3 -c 'import pyghidra' 2>/dev/null\" ]\n interval: 10s\n timeout: 5s\n retries: 30\n start_period: 30s\n\n radare2:\n image: radare/radare2:latest\n container_name: radare2\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n # Install decompiler plugins (best-effort)\n r2pm -Ui r2ghidra 2>/dev/null || echo \"r2ghidra not available\"\n r2pm -Ui r2dec 2>/dev/null || echo \"r2dec not available\"\n touch /tmp/.r2_ready\n echo \"Radare2 container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n healthcheck:\n test: [ \"CMD\", \"cat\", \"/tmp/.r2_ready\" ]\n interval: 5s\n timeout: 3s\n retries: 10\n\n qiling:\n build:\n context: ./backend\n dockerfile: Dockerfile.qiling\n container_name: qiling_emulator\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n python3 -c \"import qiling; print('Qiling', qiling.__version__)\"\n touch /tmp/.qiling_ready\n echo \"Qiling container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n - ./backend/qiling_scripts:/opt/qiling/scripts\n healthcheck:\n test: [ \"CMD\", \"cat\", \"/tmp/.qiling_ready\" ]\n interval: 10s\n timeout: 5s\n retries: 10\n\n postgres:\n image: postgres:16-alpine\n container_name: ireng_postgres\n environment:\n POSTGRES_USER: ireng\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ireng_secret}\n POSTGRES_DB: ireng\n POSTGRES_MULTIPLE_DATABASES: langfuse\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-multi-db.sh:/docker-entrypoint-initdb.d/init-multi-db.sh\n healthcheck:\n test: [ \"CMD-SHELL\", \"pg_isready -U ireng\" ]\n interval: 5s\n timeout: 3s\n retries: 10\n\n langfuse:\n image: langfuse/langfuse:2\n container_name: ireng_langfuse\n depends_on:\n postgres:\n condition: service_healthy\n environment:\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/langfuse\n NEXTAUTH_URL: ${LANGFUSE_URL:-http://${HOST:-localhost}:${LANGFUSE_PORT:-3100}}\n NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET:-changeme-langfuse-secret}\n SALT: ${LANGFUSE_SALT:-changeme-langfuse-salt}\n TELEMETRY_ENABLED: \"true\"\n LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: \"false\"\n HOSTNAME: \"0.0.0.0\"\n ports:\n - \"${LANGFUSE_PORT:-3100}:3000\"\n healthcheck:\n test: [ \"CMD-SHELL\", \"wget -qO- http://0.0.0.0:3000/api/public/health || exit 1\" ]\n interval: 10s\n timeout: 10s\n retries: 15\n start_period: 60s\n\n agent:\n build:\n context: .\n dockerfile: backend/Dockerfile\n depends_on:\n ghidra:\n condition: service_healthy\n radare2:\n condition: service_healthy\n qiling:\n condition: service_healthy\n postgres:\n condition: service_healthy\n langfuse:\n condition: service_healthy\n environment:\n GHIDRA_DOCKER_IMAGE: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n GHIDRA_PROJECT_ROOT: /data/projects\n GHIDRA_SHARED_ROOT: /data/shared\n GHIDRA_VOLUME_CONTAINER: ghidra_headless\n GHIDRA_SCRIPTS_ROOT: /data/shared/scripts\n GHIDRA_SCRIPTS_SOURCE: /app/ghidra_scripts\n GHIDRA_HEADLESS_SCRIPT_PATH: /usr/share/ghidra/support/pyghidraRun\n GHIDRA_INSTALL_PATH: /usr/share/ghidra\n DOCKER_CLI_PATH: /usr/bin/docker\n LLM_MODEL_NAME: glm-5\n LLM_PROVIDER: openai\n MAX_DECOMPILATION_TIME: \"30\"\n DEFAULT_ANALYSIS_TIMEOUT: \"120\"\n LLM_API_KEY: ${ANTHROPIC_API_KEY}\n LLM_BASE_URL: https://api.z.ai/api/coding/paas/v4/\n ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}\n ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL}\n R2_CONTAINER_NAME: radare2\n R2_SHARED_ROOT: /data/shared\n R2_TIMEOUT: \"60\"\n ENABLE_R2: \"true\"\n QILING_CONTAINER_NAME: qiling_emulator\n QILING_SHARED_ROOT: /data/shared\n QILING_SCRIPTS_ROOT: /opt/qiling/scripts\n QILING_ROOTFS_BASE: /opt/qiling/rootfs\n QILING_TIMEOUT: \"60\"\n ENABLE_QILING: \"true\"\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/ireng\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-http://langfuse:3000}\n LANGFUSE_ENABLED: \"true\"\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n - ./backend:/app\n - ./backend/ghidra_scripts:/app/ghidra_scripts\n - /var/run/docker.sock:/var/run/docker.sock\n ports:\n - \"${API_PORT:-8080}:8080\"\n\n ui:\n build:\n context: .\n dockerfile: app/Dockerfile.ui\n args:\n # Leave VITE_API_BASE_URL empty → frontend uses relative URLs\n # The Vite preview proxy (server-side) forwards to BACKEND_INTERNAL_URL\n VITE_API_BASE_URL: \"\"\n VITE_WS_URL: \"\"\n VITE_APP_NAME: ${VITE_APP_NAME:-IrengSec}\n BACKEND_INTERNAL_URL: \"http://agent:8080\"\n environment:\n # Runtime env for the Vite preview Node.js process (proxy target)\n BACKEND_INTERNAL_URL: \"http://agent:8080\"\n ports:\n - \"${UI_PORT:-4173}:4173\"\n\nvolumes:\n ghidra_projects:\n ghidra_shared:\n pgdata:\n"}, "f0b6d815ef9c14b5712cb6f83ae4ea06d25c1129": {"t": 1785767380.9393213, "n": 7217, "h": "6aa56853315b97c5", "c": "services:\n ghidra:\n image: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n container_name: ghidra_headless\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n set -e\n export XDG_CONFIG_HOME=/data/shared/ghidra-config\n mkdir -p /data/shared/ghidra-config\n\n # Remove PEP 668 externally-managed marker\n rm -f /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true\n\n # Install python3-venv (needed for venv creation with pip)\n apt-get update 2>/dev/null && \\\n apt-get install -y --no-install-recommends python3-venv 2>/dev/null || true\n\n # Detect Ghidra application ID for the venv path\n GHIDRA_PROPS=$$(find /usr/share/ghidra -name \"application.properties\" -path \"*/application/*\" 2>/dev/null | head -1)\n if [ -n \"$$GHIDRA_PROPS\" ]; then\n APP_NAME=$$(grep \"^application.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2 | tr ' ' '_')\n APP_VER=$$(grep \"^application.version\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n APP_REL=$$(grep \"^application.release.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n GHIDRA_ID=\"$${APP_NAME}_$${APP_VER}_$${APP_REL}\"\n else\n GHIDRA_ID=\"ghidra_12.0.1_DEV\"\n fi\n\n VENV_PATH=\"/data/shared/ghidra-config/ghidra/$${GHIDRA_ID}/venv\"\n PYGHIDRA_DIST=\"/usr/share/ghidra/Ghidra/Features/PyGhidra/pypkg/dist\"\n\n # Only set up if pyghidra is not already importable in the venv\n if ! \"$$VENV_PATH/bin/python3\" -c \"import pyghidra\" 2>/dev/null; then\n echo \"Setting up PyGhidra venv at $$VENV_PATH ...\"\n rm -rf \"$$VENV_PATH\" 2>/dev/null || true\n python3 -m venv \"$$VENV_PATH\"\n \"$$VENV_PATH/bin/pip\" install --no-index -f \"$$PYGHIDRA_DIST\" pyghidra\n \"$$VENV_PATH/bin/python3\" -c \"import pyghidra; print('pyghidra', pyghidra.__version__, 'installed')\"\n else\n echo \"PyGhidra already installed in venv\"\n fi\n\n echo \"Ghidra container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n healthcheck:\n test: [\"CMD\", \"sh\", \"-c\", \"test -f /data/shared/ghidra-config/ghidra/*/venv/bin/python3 || python3 -c 'import pyghidra' 2>/dev/null\"]\n interval: 10s\n timeout: 5s\n retries: 30\n start_period: 30s\n\n radare2:\n image: radare/radare2:latest\n container_name: radare2\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n # Install decompiler plugins (best-effort)\n r2pm -Ui r2ghidra 2>/dev/null || echo \"r2ghidra not available\"\n r2pm -Ui r2dec 2>/dev/null || echo \"r2dec not available\"\n touch /tmp/.r2_ready\n echo \"Radare2 container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n healthcheck:\n test: [\"CMD\", \"cat\", \"/tmp/.r2_ready\"]\n interval: 5s\n timeout: 3s\n retries: 10\n\n qiling:\n build:\n context: ./backend\n dockerfile: Dockerfile.qiling\n container_name: qiling_emulator\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n python3 -c \"import qiling; print('Qiling', qiling.__version__)\"\n touch /tmp/.qiling_ready\n echo \"Qiling container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n - ./backend/qiling_scripts:/opt/qiling/scripts\n healthcheck:\n test: [\"CMD\", \"cat\", \"/tmp/.qiling_ready\"]\n interval: 10s\n timeout: 5s\n retries: 10\n\n postgres:\n image: postgres:16-alpine\n container_name: ireng_postgres\n environment:\n POSTGRES_USER: ireng\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ireng_secret}\n POSTGRES_DB: ireng\n POSTGRES_MULTIPLE_DATABASES: langfuse\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-multi-db.sh:/docker-entrypoint-initdb.d/init-multi-db.sh\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U ireng\"]\n interval: 5s\n timeout: 3s\n retries: 10\n\n langfuse:\n image: langfuse/langfuse:2\n container_name: ireng_langfuse\n depends_on:\n postgres:\n condition: service_healthy\n environment:\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/langfuse\n NEXTAUTH_URL: ${LANGFUSE_URL:-http://${HOST:-localhost}:${LANGFUSE_PORT:-3100}}\n NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET:-changeme-langfuse-secret}\n SALT: ${LANGFUSE_SALT:-changeme-langfuse-salt}\n TELEMETRY_ENABLED: \"true\"\n LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: \"false\"\n HOSTNAME: \"0.0.0.0\"\n ports:\n - \"${LANGFUSE_PORT:-3100}:3000\"\n healthcheck:\n test: [\"CMD-SHELL\", \"wget -qO- http://0.0.0.0:3000/api/public/health || exit 1\"]\n interval: 10s\n timeout: 10s\n retries: 15\n start_period: 60s\n\n agent:\n build:\n context: .\n dockerfile: backend/Dockerfile\n depends_on:\n ghidra:\n condition: service_healthy\n radare2:\n condition: service_healthy\n qiling:\n condition: service_healthy\n postgres:\n condition: service_healthy\n langfuse:\n condition: service_healthy\n environment:\n GHIDRA_DOCKER_IMAGE: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n GHIDRA_PROJECT_ROOT: /data/projects\n GHIDRA_SHARED_ROOT: /data/shared\n GHIDRA_VOLUME_CONTAINER: ghidra_headless\n GHIDRA_SCRIPTS_ROOT: /data/shared/scripts\n GHIDRA_SCRIPTS_SOURCE: /app/ghidra_scripts\n GHIDRA_HEADLESS_SCRIPT_PATH: /usr/share/ghidra/support/pyghidraRun\n GHIDRA_INSTALL_PATH: /usr/share/ghidra\n DOCKER_CLI_PATH: /usr/bin/docker\n LLM_MODEL_NAME: glm-4.7\n LLM_PROVIDER: openai\n MAX_DECOMPILATION_TIME: \"30\"\n DEFAULT_ANALYSIS_TIMEOUT: \"120\"\n LLM_API_KEY: ${ANTHROPIC_API_KEY}\n LLM_BASE_URL: https://api.z.ai/api/coding/paas/v4/\n ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}\n ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL}\n R2_CONTAINER_NAME: radare2\n R2_SHARED_ROOT: /data/shared\n R2_TIMEOUT: \"60\"\n ENABLE_R2: \"true\"\n QILING_CONTAINER_NAME: qiling_emulator\n QILING_SHARED_ROOT: /data/shared\n QILING_SCRIPTS_ROOT: /opt/qiling/scripts\n QILING_ROOTFS_BASE: /opt/qiling/rootfs\n QILING_TIMEOUT: \"60\"\n ENABLE_QILING: \"true\"\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/ireng\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-http://langfuse:3000}\n LANGFUSE_ENABLED: \"true\"\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n - ./backend:/app\n - ./backend/ghidra_scripts:/app/ghidra_scripts\n - /var/run/docker.sock:/var/run/docker.sock\n ports:\n - \"${API_PORT:-8080}:8080\"\n\n ui:\n build:\n context: .\n dockerfile: app/Dockerfile.ui\n args:\n VITE_API_BASE_URL: ${VITE_API_BASE_URL:-http://${HOST:-localhost}:${API_PORT:-8080}}\n VITE_WS_URL: ${VITE_WS_URL:-ws://${HOST:-localhost}:${API_PORT:-8080}/stream}\n VITE_APP_NAME: ${VITE_APP_NAME:-IrengSec}\n ports:\n - \"${UI_PORT:-4173}:4173\"\n\nvolumes:\n ghidra_projects:\n ghidra_shared:\n pgdata:\n"}, "679d702e1624e77dc6f836b64a0df1b9b4fcf329": {"t": 1785767382.3145623, "n": 6369, "h": "5cfa4069dc913999", "c": "services:\n ghidra:\n image: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n container_name: ghidra_headless\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n set -e\n export XDG_CONFIG_HOME=/data/shared/ghidra-config\n mkdir -p /data/shared/ghidra-config\n\n # Remove PEP 668 externally-managed marker\n rm -f /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true\n\n # Install python3-venv (needed for venv creation with pip)\n apt-get update 2>/dev/null && \\\n apt-get install -y --no-install-recommends python3-venv 2>/dev/null || true\n\n # Detect Ghidra application ID for the venv path\n GHIDRA_PROPS=$$(find /usr/share/ghidra -name \"application.properties\" -path \"*/application/*\" 2>/dev/null | head -1)\n if [ -n \"$$GHIDRA_PROPS\" ]; then\n APP_NAME=$$(grep \"^application.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2 | tr ' ' '_')\n APP_VER=$$(grep \"^application.version\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n APP_REL=$$(grep \"^application.release.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n GHIDRA_ID=\"$${APP_NAME}_$${APP_VER}_$${APP_REL}\"\n else\n GHIDRA_ID=\"ghidra_12.0.1_DEV\"\n fi\n\n VENV_PATH=\"/data/shared/ghidra-config/ghidra/$${GHIDRA_ID}/venv\"\n PYGHIDRA_DIST=\"/usr/share/ghidra/Ghidra/Features/PyGhidra/pypkg/dist\"\n\n # Only set up if pyghidra is not already importable in the venv\n if ! \"$$VENV_PATH/bin/python3\" -c \"import pyghidra\" 2>/dev/null; then\n echo \"Setting up PyGhidra venv at $$VENV_PATH ...\"\n rm -rf \"$$VENV_PATH\" 2>/dev/null || true\n python3 -m venv \"$$VENV_PATH\"\n \"$$VENV_PATH/bin/pip\" install --no-index -f \"$$PYGHIDRA_DIST\" pyghidra\n \"$$VENV_PATH/bin/python3\" -c \"import pyghidra; print('pyghidra', pyghidra.__version__, 'installed')\"\n else\n echo \"PyGhidra already installed in venv\"\n fi\n\n echo \"Ghidra container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n healthcheck:\n test: [\"CMD\", \"sh\", \"-c\", \"test -f /data/shared/ghidra-config/ghidra/*/venv/bin/python3 || python3 -c 'import pyghidra' 2>/dev/null\"]\n interval: 10s\n timeout: 5s\n retries: 30\n start_period: 30s\n\n radare2:\n image: radare/radare2:latest\n container_name: radare2\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n # Install decompiler plugins (best-effort)\n r2pm -Ui r2ghidra 2>/dev/null || echo \"r2ghidra not available\"\n r2pm -Ui r2dec 2>/dev/null || echo \"r2dec not available\"\n touch /tmp/.r2_ready\n echo \"Radare2 container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n healthcheck:\n test: [\"CMD\", \"cat\", \"/tmp/.r2_ready\"]\n interval: 5s\n timeout: 3s\n retries: 10\n\n postgres:\n image: postgres:16-alpine\n container_name: ireng_postgres\n environment:\n POSTGRES_USER: ireng\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ireng_secret}\n POSTGRES_DB: ireng\n POSTGRES_MULTIPLE_DATABASES: langfuse\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-multi-db.sh:/docker-entrypoint-initdb.d/init-multi-db.sh\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U ireng\"]\n interval: 5s\n timeout: 3s\n retries: 10\n\n langfuse:\n image: langfuse/langfuse:2\n container_name: ireng_langfuse\n depends_on:\n postgres:\n condition: service_healthy\n environment:\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/langfuse\n NEXTAUTH_URL: ${LANGFUSE_URL:-http://${HOST:-localhost}:${LANGFUSE_PORT:-3100}}\n NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET:-changeme-langfuse-secret}\n SALT: ${LANGFUSE_SALT:-changeme-langfuse-salt}\n TELEMETRY_ENABLED: \"true\"\n LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: \"false\"\n HOSTNAME: \"0.0.0.0\"\n ports:\n - \"${LANGFUSE_PORT:-3100}:3000\"\n healthcheck:\n test: [\"CMD-SHELL\", \"wget -qO- http://0.0.0.0:3000/api/public/health || exit 1\"]\n interval: 10s\n timeout: 10s\n retries: 15\n start_period: 60s\n\n agent:\n build:\n context: .\n dockerfile: backend/Dockerfile\n depends_on:\n ghidra:\n condition: service_healthy\n radare2:\n condition: service_healthy\n postgres:\n condition: service_healthy\n langfuse:\n condition: service_healthy\n environment:\n GHIDRA_DOCKER_IMAGE: ${RUNNER_IMAGE:-danilid/ireng-runner:2.0.1}\n GHIDRA_PROJECT_ROOT: /data/projects\n GHIDRA_SHARED_ROOT: /data/shared\n GHIDRA_VOLUME_CONTAINER: ghidra_headless\n GHIDRA_SCRIPTS_ROOT: /data/shared/scripts\n GHIDRA_SCRIPTS_SOURCE: /app/ghidra_scripts\n GHIDRA_HEADLESS_SCRIPT_PATH: /usr/share/ghidra/support/pyghidraRun\n GHIDRA_INSTALL_PATH: /usr/share/ghidra\n DOCKER_CLI_PATH: /usr/bin/docker\n LLM_MODEL_NAME: glm-4.7\n LLM_PROVIDER: openai\n MAX_DECOMPILATION_TIME: \"30\"\n DEFAULT_ANALYSIS_TIMEOUT: \"120\"\n LLM_API_KEY: ${ANTHROPIC_API_KEY}\n LLM_BASE_URL: https://api.z.ai/api/coding/paas/v4/\n ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}\n ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL}\n R2_CONTAINER_NAME: radare2\n R2_SHARED_ROOT: /data/shared\n R2_TIMEOUT: \"60\"\n ENABLE_R2: \"true\"\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/ireng\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-http://langfuse:3000}\n LANGFUSE_ENABLED: \"true\"\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n - ./backend:/app\n - ./backend/ghidra_scripts:/app/ghidra_scripts\n - /var/run/docker.sock:/var/run/docker.sock\n ports:\n - \"${API_PORT:-8080}:8080\"\n\n ui:\n build:\n context: .\n dockerfile: app/Dockerfile.ui\n args:\n VITE_API_BASE_URL: ${VITE_API_BASE_URL:-http://${HOST:-localhost}:${API_PORT:-8080}}\n VITE_WS_URL: ${VITE_WS_URL:-ws://${HOST:-localhost}:${API_PORT:-8080}/stream}\n VITE_APP_NAME: ${VITE_APP_NAME:-IrengSec}\n ports:\n - \"${UI_PORT:-4173}:4173\"\n\nvolumes:\n ghidra_projects:\n ghidra_shared:\n pgdata:\n"}, "68ca66db1d87b45b96498c6ad03a97a2075ee2da": {"t": 1785767383.6210268, "n": 6341, "h": "c564903d7ba4f3b5", "c": "services:\n ghidra:\n image: ${RUNNER_IMAGE:-ireng-runner}\n container_name: ghidra_headless\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n set -e\n export XDG_CONFIG_HOME=/data/shared/ghidra-config\n mkdir -p /data/shared/ghidra-config\n\n # Remove PEP 668 externally-managed marker\n rm -f /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true\n\n # Install python3-venv (needed for venv creation with pip)\n apt-get update 2>/dev/null && \\\n apt-get install -y --no-install-recommends python3-venv 2>/dev/null || true\n\n # Detect Ghidra application ID for the venv path\n GHIDRA_PROPS=$$(find /usr/share/ghidra -name \"application.properties\" -path \"*/application/*\" 2>/dev/null | head -1)\n if [ -n \"$$GHIDRA_PROPS\" ]; then\n APP_NAME=$$(grep \"^application.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2 | tr ' ' '_')\n APP_VER=$$(grep \"^application.version\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n APP_REL=$$(grep \"^application.release.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n GHIDRA_ID=\"$${APP_NAME}_$${APP_VER}_$${APP_REL}\"\n else\n GHIDRA_ID=\"ghidra_12.0.1_DEV\"\n fi\n\n VENV_PATH=\"/data/shared/ghidra-config/ghidra/$${GHIDRA_ID}/venv\"\n PYGHIDRA_DIST=\"/usr/share/ghidra/Ghidra/Features/PyGhidra/pypkg/dist\"\n\n # Only set up if pyghidra is not already importable in the venv\n if ! \"$$VENV_PATH/bin/python3\" -c \"import pyghidra\" 2>/dev/null; then\n echo \"Setting up PyGhidra venv at $$VENV_PATH ...\"\n rm -rf \"$$VENV_PATH\" 2>/dev/null || true\n python3 -m venv \"$$VENV_PATH\"\n \"$$VENV_PATH/bin/pip\" install --no-index -f \"$$PYGHIDRA_DIST\" pyghidra\n \"$$VENV_PATH/bin/python3\" -c \"import pyghidra; print('pyghidra', pyghidra.__version__, 'installed')\"\n else\n echo \"PyGhidra already installed in venv\"\n fi\n\n echo \"Ghidra container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n healthcheck:\n test: [\"CMD\", \"sh\", \"-c\", \"test -f /data/shared/ghidra-config/ghidra/*/venv/bin/python3 || python3 -c 'import pyghidra' 2>/dev/null\"]\n interval: 10s\n timeout: 5s\n retries: 30\n start_period: 30s\n\n radare2:\n image: radare/radare2:latest\n container_name: radare2\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n # Install decompiler plugins (best-effort)\n r2pm -Ui r2ghidra 2>/dev/null || echo \"r2ghidra not available\"\n r2pm -Ui r2dec 2>/dev/null || echo \"r2dec not available\"\n touch /tmp/.r2_ready\n echo \"Radare2 container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n healthcheck:\n test: [\"CMD\", \"cat\", \"/tmp/.r2_ready\"]\n interval: 5s\n timeout: 3s\n retries: 10\n\n postgres:\n image: postgres:16-alpine\n container_name: ireng_postgres\n environment:\n POSTGRES_USER: ireng\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ireng_secret}\n POSTGRES_DB: ireng\n POSTGRES_MULTIPLE_DATABASES: langfuse\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-multi-db.sh:/docker-entrypoint-initdb.d/init-multi-db.sh\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U ireng\"]\n interval: 5s\n timeout: 3s\n retries: 10\n\n langfuse:\n image: langfuse/langfuse:2\n container_name: ireng_langfuse\n depends_on:\n postgres:\n condition: service_healthy\n environment:\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/langfuse\n NEXTAUTH_URL: ${LANGFUSE_URL:-http://${HOST:-localhost}:${LANGFUSE_PORT:-3100}}\n NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET:-changeme-langfuse-secret}\n SALT: ${LANGFUSE_SALT:-changeme-langfuse-salt}\n TELEMETRY_ENABLED: \"true\"\n LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: \"false\"\n HOSTNAME: \"0.0.0.0\"\n ports:\n - \"${LANGFUSE_PORT:-3100}:3000\"\n healthcheck:\n test: [\"CMD-SHELL\", \"wget -qO- http://0.0.0.0:3000/api/public/health || exit 1\"]\n interval: 10s\n timeout: 10s\n retries: 15\n start_period: 60s\n\n agent:\n build:\n context: .\n dockerfile: backend/Dockerfile\n depends_on:\n ghidra:\n condition: service_healthy\n radare2:\n condition: service_healthy\n postgres:\n condition: service_healthy\n langfuse:\n condition: service_healthy\n environment:\n GHIDRA_DOCKER_IMAGE: ${RUNNER_IMAGE:-ireng-runner}\n GHIDRA_PROJECT_ROOT: /data/projects\n GHIDRA_SHARED_ROOT: /data/shared\n GHIDRA_VOLUME_CONTAINER: ghidra_headless\n GHIDRA_SCRIPTS_ROOT: /data/shared/scripts\n GHIDRA_SCRIPTS_SOURCE: /app/ghidra_scripts\n GHIDRA_HEADLESS_SCRIPT_PATH: /usr/share/ghidra/support/pyghidraRun\n GHIDRA_INSTALL_PATH: /usr/share/ghidra\n DOCKER_CLI_PATH: /usr/bin/docker\n LLM_MODEL_NAME: glm-4.7\n LLM_PROVIDER: openai\n MAX_DECOMPILATION_TIME: \"30\"\n DEFAULT_ANALYSIS_TIMEOUT: \"120\"\n LLM_API_KEY: ${ANTHROPIC_API_KEY}\n LLM_BASE_URL: https://api.z.ai/api/coding/paas/v4/\n ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}\n ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL}\n R2_CONTAINER_NAME: radare2\n R2_SHARED_ROOT: /data/shared\n R2_TIMEOUT: \"60\"\n ENABLE_R2: \"true\"\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/ireng\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: ${LANGFUSE_HOST:-http://langfuse:3000}\n LANGFUSE_ENABLED: \"true\"\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n - ./backend:/app\n - ./backend/ghidra_scripts:/app/ghidra_scripts\n - /var/run/docker.sock:/var/run/docker.sock\n ports:\n - \"${API_PORT:-8080}:8080\"\n\n ui:\n build:\n context: .\n dockerfile: app/Dockerfile.ui\n args:\n VITE_API_BASE_URL: ${VITE_API_BASE_URL:-http://${HOST:-localhost}:${API_PORT:-8080}}\n VITE_WS_URL: ${VITE_WS_URL:-ws://${HOST:-localhost}:${API_PORT:-8080}/stream}\n VITE_APP_NAME: ${VITE_APP_NAME:-IrengSec}\n ports:\n - \"${UI_PORT:-4173}:4173\"\n\nvolumes:\n ghidra_projects:\n ghidra_shared:\n pgdata:\n"}, "c5953901eb61f1da1d30d2ccbb3e7eb71b3e250f": {"t": 1785767385.1180203, "n": 6134, "h": "cec24cc6fc0718fb", "c": "services:\n ghidra:\n image: ${RUNNER_IMAGE:-ireng-runner}\n container_name: ghidra_headless\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n set -e\n export XDG_CONFIG_HOME=/data/shared/ghidra-config\n mkdir -p /data/shared/ghidra-config\n\n # Remove PEP 668 externally-managed marker\n rm -f /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true\n\n # Install python3-venv (needed for venv creation with pip)\n apt-get update 2>/dev/null && \\\n apt-get install -y --no-install-recommends python3-venv 2>/dev/null || true\n\n # Detect Ghidra application ID for the venv path\n GHIDRA_PROPS=$$(find /usr/share/ghidra -name \"application.properties\" -path \"*/application/*\" 2>/dev/null | head -1)\n if [ -n \"$$GHIDRA_PROPS\" ]; then\n APP_NAME=$$(grep \"^application.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2 | tr ' ' '_')\n APP_VER=$$(grep \"^application.version\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n APP_REL=$$(grep \"^application.release.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n GHIDRA_ID=\"$${APP_NAME}_$${APP_VER}_$${APP_REL}\"\n else\n GHIDRA_ID=\"ghidra_12.0.1_DEV\"\n fi\n\n VENV_PATH=\"/data/shared/ghidra-config/ghidra/$${GHIDRA_ID}/venv\"\n PYGHIDRA_DIST=\"/usr/share/ghidra/Ghidra/Features/PyGhidra/pypkg/dist\"\n\n # Only set up if pyghidra is not already importable in the venv\n if ! \"$$VENV_PATH/bin/python3\" -c \"import pyghidra\" 2>/dev/null; then\n echo \"Setting up PyGhidra venv at $$VENV_PATH ...\"\n rm -rf \"$$VENV_PATH\" 2>/dev/null || true\n python3 -m venv \"$$VENV_PATH\"\n \"$$VENV_PATH/bin/pip\" install --no-index -f \"$$PYGHIDRA_DIST\" pyghidra\n \"$$VENV_PATH/bin/python3\" -c \"import pyghidra; print('pyghidra', pyghidra.__version__, 'installed')\"\n else\n echo \"PyGhidra already installed in venv\"\n fi\n\n echo \"Ghidra container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n healthcheck:\n test: [\"CMD\", \"sh\", \"-c\", \"test -f /data/shared/ghidra-config/ghidra/*/venv/bin/python3 || python3 -c 'import pyghidra' 2>/dev/null\"]\n interval: 10s\n timeout: 5s\n retries: 30\n start_period: 30s\n\n radare2:\n image: radare/radare2:latest\n container_name: radare2\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n # Install decompiler plugins (best-effort)\n r2pm -Ui r2ghidra 2>/dev/null || echo \"r2ghidra not available\"\n r2pm -Ui r2dec 2>/dev/null || echo \"r2dec not available\"\n touch /tmp/.r2_ready\n echo \"Radare2 container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n healthcheck:\n test: [\"CMD\", \"cat\", \"/tmp/.r2_ready\"]\n interval: 5s\n timeout: 3s\n retries: 10\n\n postgres:\n image: postgres:16-alpine\n container_name: ireng_postgres\n environment:\n POSTGRES_USER: ireng\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ireng_secret}\n POSTGRES_DB: ireng\n POSTGRES_MULTIPLE_DATABASES: langfuse\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-multi-db.sh:/docker-entrypoint-initdb.d/init-multi-db.sh\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U ireng\"]\n interval: 5s\n timeout: 3s\n retries: 10\n\n langfuse:\n image: langfuse/langfuse:2\n container_name: ireng_langfuse\n depends_on:\n postgres:\n condition: service_healthy\n environment:\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/langfuse\n NEXTAUTH_URL: http://localhost:3100\n NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET:-changeme-langfuse-secret}\n SALT: ${LANGFUSE_SALT:-changeme-langfuse-salt}\n TELEMETRY_ENABLED: \"true\"\n LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: \"false\"\n HOSTNAME: \"0.0.0.0\"\n ports:\n - \"3100:3000\"\n healthcheck:\n test: [\"CMD-SHELL\", \"wget -qO- http://0.0.0.0:3000/api/public/health || exit 1\"]\n interval: 10s\n timeout: 10s\n retries: 15\n start_period: 60s\n\n agent:\n build:\n context: .\n dockerfile: backend/Dockerfile\n depends_on:\n ghidra:\n condition: service_healthy\n radare2:\n condition: service_healthy\n postgres:\n condition: service_healthy\n langfuse:\n condition: service_healthy\n environment:\n GHIDRA_DOCKER_IMAGE: ${RUNNER_IMAGE:-ireng-runner}\n GHIDRA_PROJECT_ROOT: /data/projects\n GHIDRA_SHARED_ROOT: /data/shared\n GHIDRA_VOLUME_CONTAINER: ghidra_headless\n GHIDRA_SCRIPTS_ROOT: /data/shared/scripts\n GHIDRA_SCRIPTS_SOURCE: /app/ghidra_scripts\n GHIDRA_HEADLESS_SCRIPT_PATH: /usr/share/ghidra/support/pyghidraRun\n GHIDRA_INSTALL_PATH: /usr/share/ghidra\n DOCKER_CLI_PATH: /usr/bin/docker\n LLM_MODEL_NAME: glm-4.7\n LLM_PROVIDER: openai\n MAX_DECOMPILATION_TIME: \"30\"\n DEFAULT_ANALYSIS_TIMEOUT: \"120\"\n LLM_API_KEY: ${ANTHROPIC_API_KEY}\n LLM_BASE_URL: https://api.z.ai/api/coding/paas/v4/\n ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}\n ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL}\n R2_CONTAINER_NAME: radare2\n R2_SHARED_ROOT: /data/shared\n R2_TIMEOUT: \"60\"\n ENABLE_R2: \"true\"\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/ireng\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: http://langfuse:3000\n LANGFUSE_ENABLED: \"true\"\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n - ./backend:/app\n - ./backend/ghidra_scripts:/app/ghidra_scripts\n - /var/run/docker.sock:/var/run/docker.sock\n ports:\n - \"8080:8080\"\n\n ui:\n build:\n context: .\n dockerfile: app/Dockerfile.ui\n environment:\n VITE_API_BASE_URL: http://localhost:8080\n VITE_WS_URL: ws://localhost:8080/stream\n VITE_APP_NAME: IrengSec\n ports:\n - \"4173:4173\"\n\nvolumes:\n ghidra_projects:\n ghidra_shared:\n pgdata:"}, "aa11cf09c7f305c9c024c9eed4bf52d299c13b69": {"t": 1785767386.4894733, "n": 6210, "h": "94f19ca057383548", "c": "services:\n ghidra:\n image: ${RUNNER_IMAGE:-gireng-runner}\n container_name: ghidra_headless\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n set -e\n export XDG_CONFIG_HOME=/data/shared/ghidra-config\n mkdir -p /data/shared/ghidra-config\n\n # Remove PEP 668 externally-managed marker\n rm -f /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true\n\n # Install python3-venv (needed for venv creation with pip)\n apt-get update 2>/dev/null && \\\n apt-get install -y --no-install-recommends python3-venv 2>/dev/null || true\n\n # Detect Ghidra application ID for the venv path\n GHIDRA_PROPS=$$(find /usr/share/ghidra -name \"application.properties\" -path \"*/application/*\" 2>/dev/null | head -1)\n if [ -n \"$$GHIDRA_PROPS\" ]; then\n APP_NAME=$$(grep \"^application.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2 | tr ' ' '_')\n APP_VER=$$(grep \"^application.version\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n APP_REL=$$(grep \"^application.release.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n GHIDRA_ID=\"$${APP_NAME}_$${APP_VER}_$${APP_REL}\"\n else\n GHIDRA_ID=\"ghidra_12.0.1_DEV\"\n fi\n\n VENV_PATH=\"/data/shared/ghidra-config/ghidra/$${GHIDRA_ID}/venv\"\n PYGHIDRA_DIST=\"/usr/share/ghidra/Ghidra/Features/PyGhidra/pypkg/dist\"\n\n # Only set up if pyghidra is not already importable in the venv\n if ! \"$$VENV_PATH/bin/python3\" -c \"import pyghidra\" 2>/dev/null; then\n echo \"Setting up PyGhidra venv at $$VENV_PATH ...\"\n rm -rf \"$$VENV_PATH\" 2>/dev/null || true\n python3 -m venv \"$$VENV_PATH\"\n \"$$VENV_PATH/bin/pip\" install --no-index -f \"$$PYGHIDRA_DIST\" pyghidra\n \"$$VENV_PATH/bin/python3\" -c \"import pyghidra; print('pyghidra', pyghidra.__version__, 'installed')\"\n else\n echo \"PyGhidra already installed in venv\"\n fi\n\n echo \"Ghidra container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n healthcheck:\n test: [\"CMD\", \"sh\", \"-c\", \"test -f /data/shared/ghidra-config/ghidra/*/venv/bin/python3 || python3 -c 'import pyghidra' 2>/dev/null\"]\n interval: 10s\n timeout: 5s\n retries: 30\n start_period: 30s\n\n radare2:\n image: radare/radare2:latest\n container_name: radare2\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n # Install decompiler plugins (best-effort)\n r2pm -Ui r2ghidra 2>/dev/null || echo \"r2ghidra not available\"\n r2pm -Ui r2dec 2>/dev/null || echo \"r2dec not available\"\n touch /tmp/.r2_ready\n echo \"Radare2 container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n healthcheck:\n test: [\"CMD\", \"cat\", \"/tmp/.r2_ready\"]\n interval: 5s\n timeout: 3s\n retries: 10\n\n postgres:\n image: postgres:16-alpine\n container_name: gireng_postgres\n environment:\n POSTGRES_USER: gireng\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-gireng_secret}\n POSTGRES_DB: gireng\n POSTGRES_MULTIPLE_DATABASES: langfuse\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-multi-db.sh:/docker-entrypoint-initdb.d/init-multi-db.sh\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U gireng\"]\n interval: 5s\n timeout: 3s\n retries: 10\n\n langfuse:\n image: langfuse/langfuse:2\n container_name: gireng_langfuse\n depends_on:\n postgres:\n condition: service_healthy\n environment:\n DATABASE_URL: postgresql://gireng:${POSTGRES_PASSWORD:-gireng_secret}@postgres:5432/langfuse\n NEXTAUTH_URL: http://localhost:3100\n NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET:-changeme-langfuse-secret}\n SALT: ${LANGFUSE_SALT:-changeme-langfuse-salt}\n TELEMETRY_ENABLED: \"true\"\n LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: \"false\"\n HOSTNAME: \"0.0.0.0\"\n ports:\n - \"3100:3000\"\n healthcheck:\n test: [\"CMD-SHELL\", \"wget -qO- http://0.0.0.0:3000/api/public/health || exit 1\"]\n interval: 10s\n timeout: 10s\n retries: 15\n start_period: 60s\n\n agent:\n build:\n context: .\n dockerfile: backend/Dockerfile\n depends_on:\n ghidra:\n condition: service_healthy\n radare2:\n condition: service_healthy\n postgres:\n condition: service_healthy\n langfuse:\n condition: service_healthy\n environment:\n GHIDRA_DOCKER_IMAGE: ${RUNNER_IMAGE:-gireng-runner}\n GHIDRA_PROJECT_ROOT: /data/projects\n GHIDRA_SHARED_ROOT: /data/shared\n GHIDRA_VOLUME_CONTAINER: ghidra_headless\n GHIDRA_SCRIPTS_ROOT: /data/shared/scripts\n GHIDRA_SCRIPTS_SOURCE: /app/ghidra_scripts\n GHIDRA_HEADLESS_SCRIPT_PATH: /usr/share/ghidra/support/pyghidraRun\n GHIDRA_INSTALL_PATH: /usr/share/ghidra\n DOCKER_CLI_PATH: /usr/bin/docker\n LLM_MODEL_NAME: glm-4.7\n LLM_PROVIDER: openai\n MAX_DECOMPILATION_TIME: \"30\"\n DEFAULT_ANALYSIS_TIMEOUT: \"120\"\n LLM_API_KEY: ${ANTHROPIC_API_KEY}\n LLM_BASE_URL: https://api.z.ai/api/coding/paas/v4/\n ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}\n ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL}\n R2_CONTAINER_NAME: radare2\n R2_SHARED_ROOT: /data/shared\n R2_TIMEOUT: \"60\"\n ENABLE_R2: \"true\"\n DATABASE_URL: postgresql://gireng:${POSTGRES_PASSWORD:-gireng_secret}@postgres:5432/gireng\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: http://langfuse:3000\n LANGFUSE_ENABLED: \"true\"\n LANGFUSE_ENVIRONMENT: ${LANGFUSE_ENVIRONMENT:-development}\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n - ./backend:/app\n - ./backend/ghidra_scripts:/app/ghidra_scripts\n - /var/run/docker.sock:/var/run/docker.sock\n ports:\n - \"8080:8080\"\n\n ui:\n build:\n context: .\n dockerfile: app/Dockerfile.ui\n environment:\n VITE_API_BASE_URL: http://localhost:8080\n VITE_WS_URL: ws://localhost:8080/stream\n VITE_APP_NAME: gireng\n ports:\n - \"4173:4173\"\n\nvolumes:\n ghidra_projects:\n ghidra_shared:\n pgdata:"}, "1271251477291c4f800e8a4909708c03005b60d4": {"t": 1785767388.046175, "n": 6199, "h": "7f46772d32424f8b", "c": "services:\n ghidra:\n image: ${RUNNER_IMAGE:-ireng-runner}\n container_name: ghidra_headless\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n set -e\n export XDG_CONFIG_HOME=/data/shared/ghidra-config\n mkdir -p /data/shared/ghidra-config\n\n # Remove PEP 668 externally-managed marker\n rm -f /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true\n\n # Install python3-venv (needed for venv creation with pip)\n apt-get update 2>/dev/null && \\\n apt-get install -y --no-install-recommends python3-venv 2>/dev/null || true\n\n # Detect Ghidra application ID for the venv path\n GHIDRA_PROPS=$$(find /usr/share/ghidra -name \"application.properties\" -path \"*/application/*\" 2>/dev/null | head -1)\n if [ -n \"$$GHIDRA_PROPS\" ]; then\n APP_NAME=$$(grep \"^application.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2 | tr ' ' '_')\n APP_VER=$$(grep \"^application.version\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n APP_REL=$$(grep \"^application.release.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n GHIDRA_ID=\"$${APP_NAME}_$${APP_VER}_$${APP_REL}\"\n else\n GHIDRA_ID=\"ghidra_12.0.1_DEV\"\n fi\n\n VENV_PATH=\"/data/shared/ghidra-config/ghidra/$${GHIDRA_ID}/venv\"\n PYGHIDRA_DIST=\"/usr/share/ghidra/Ghidra/Features/PyGhidra/pypkg/dist\"\n\n # Only set up if pyghidra is not already importable in the venv\n if ! \"$$VENV_PATH/bin/python3\" -c \"import pyghidra\" 2>/dev/null; then\n echo \"Setting up PyGhidra venv at $$VENV_PATH ...\"\n rm -rf \"$$VENV_PATH\" 2>/dev/null || true\n python3 -m venv \"$$VENV_PATH\"\n \"$$VENV_PATH/bin/pip\" install --no-index -f \"$$PYGHIDRA_DIST\" pyghidra\n \"$$VENV_PATH/bin/python3\" -c \"import pyghidra; print('pyghidra', pyghidra.__version__, 'installed')\"\n else\n echo \"PyGhidra already installed in venv\"\n fi\n\n echo \"Ghidra container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n healthcheck:\n test: [\"CMD\", \"sh\", \"-c\", \"test -f /data/shared/ghidra-config/ghidra/*/venv/bin/python3 || python3 -c 'import pyghidra' 2>/dev/null\"]\n interval: 10s\n timeout: 5s\n retries: 30\n start_period: 30s\n\n radare2:\n image: radare/radare2:latest\n container_name: radare2\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n # Install decompiler plugins (best-effort)\n r2pm -Ui r2ghidra 2>/dev/null || echo \"r2ghidra not available\"\n r2pm -Ui r2dec 2>/dev/null || echo \"r2dec not available\"\n touch /tmp/.r2_ready\n echo \"Radare2 container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n healthcheck:\n test: [\"CMD\", \"cat\", \"/tmp/.r2_ready\"]\n interval: 5s\n timeout: 3s\n retries: 10\n\n postgres:\n image: postgres:16-alpine\n container_name: ireng_postgres\n environment:\n POSTGRES_USER: ireng\n POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ireng_secret}\n POSTGRES_DB: ireng\n POSTGRES_MULTIPLE_DATABASES: langfuse\n volumes:\n - pgdata:/var/lib/postgresql/data\n - ./init-multi-db.sh:/docker-entrypoint-initdb.d/init-multi-db.sh\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U ireng\"]\n interval: 5s\n timeout: 3s\n retries: 10\n\n langfuse:\n image: langfuse/langfuse:2\n container_name: ireng_langfuse\n depends_on:\n postgres:\n condition: service_healthy\n environment:\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/langfuse\n NEXTAUTH_URL: http://localhost:3100\n NEXTAUTH_SECRET: ${LANGFUSE_NEXTAUTH_SECRET:-changeme-langfuse-secret}\n SALT: ${LANGFUSE_SALT:-changeme-langfuse-salt}\n TELEMETRY_ENABLED: \"true\"\n LANGFUSE_ENABLE_EXPERIMENTAL_FEATURES: \"false\"\n HOSTNAME: \"0.0.0.0\"\n ports:\n - \"3100:3000\"\n healthcheck:\n test: [\"CMD-SHELL\", \"wget -qO- http://0.0.0.0:3000/api/public/health || exit 1\"]\n interval: 10s\n timeout: 10s\n retries: 15\n start_period: 60s\n\n agent:\n build:\n context: .\n dockerfile: backend/Dockerfile\n depends_on:\n ghidra:\n condition: service_healthy\n radare2:\n condition: service_healthy\n postgres:\n condition: service_healthy\n langfuse:\n condition: service_healthy\n environment:\n GHIDRA_DOCKER_IMAGE: ${RUNNER_IMAGE:-ireng-runner}\n GHIDRA_PROJECT_ROOT: /data/projects\n GHIDRA_SHARED_ROOT: /data/shared\n GHIDRA_VOLUME_CONTAINER: ghidra_headless\n GHIDRA_SCRIPTS_ROOT: /data/shared/scripts\n GHIDRA_SCRIPTS_SOURCE: /app/ghidra_scripts\n GHIDRA_HEADLESS_SCRIPT_PATH: /usr/share/ghidra/support/pyghidraRun\n GHIDRA_INSTALL_PATH: /usr/share/ghidra\n DOCKER_CLI_PATH: /usr/bin/docker\n LLM_MODEL_NAME: glm-4.7\n LLM_PROVIDER: openai\n MAX_DECOMPILATION_TIME: \"30\"\n DEFAULT_ANALYSIS_TIMEOUT: \"120\"\n LLM_API_KEY: ${ANTHROPIC_API_KEY}\n LLM_BASE_URL: https://api.z.ai/api/coding/paas/v4/\n ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}\n ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL}\n R2_CONTAINER_NAME: radare2\n R2_SHARED_ROOT: /data/shared\n R2_TIMEOUT: \"60\"\n ENABLE_R2: \"true\"\n DATABASE_URL: postgresql://ireng:${POSTGRES_PASSWORD:-ireng_secret}@postgres:5432/ireng\n LANGFUSE_PUBLIC_KEY: ${LANGFUSE_PUBLIC_KEY:-}\n LANGFUSE_SECRET_KEY: ${LANGFUSE_SECRET_KEY:-}\n LANGFUSE_HOST: http://langfuse:3000\n LANGFUSE_ENABLED: \"true\"\n LANGFUSE_ENVIRONMENT: ${LANGFUSE_ENVIRONMENT:-development}\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n - ./backend:/app\n - ./backend/ghidra_scripts:/app/ghidra_scripts\n - /var/run/docker.sock:/var/run/docker.sock\n ports:\n - \"8080:8080\"\n\n ui:\n build:\n context: .\n dockerfile: app/Dockerfile.ui\n environment:\n VITE_API_BASE_URL: http://localhost:8080\n VITE_WS_URL: ws://localhost:8080/stream\n VITE_APP_NAME: IrengSec\n ports:\n - \"4173:4173\"\n\nvolumes:\n ghidra_projects:\n ghidra_shared:\n pgdata:"}, "7bd3a8c83f8a8e49b55f7bfa82ca80b6122adced": {"t": 1785767389.635998, "n": 4496, "h": "ecf82fcbedbf0fce", "c": "services:\n ghidra:\n image: ${RUNNER_IMAGE:-ireng-runner}\n container_name: ghidra_headless\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n set -e\n export XDG_CONFIG_HOME=/data/shared/ghidra-config\n mkdir -p /data/shared/ghidra-config\n\n # Remove PEP 668 externally-managed marker\n rm -f /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true\n\n # Install python3-venv (needed for venv creation with pip)\n apt-get update 2>/dev/null && \\\n apt-get install -y --no-install-recommends python3-venv 2>/dev/null || true\n\n # Detect Ghidra application ID for the venv path\n GHIDRA_PROPS=$$(find /usr/share/ghidra -name \"application.properties\" -path \"*/application/*\" 2>/dev/null | head -1)\n if [ -n \"$$GHIDRA_PROPS\" ]; then\n APP_NAME=$$(grep \"^application.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2 | tr ' ' '_')\n APP_VER=$$(grep \"^application.version\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n APP_REL=$$(grep \"^application.release.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n GHIDRA_ID=\"$${APP_NAME}_$${APP_VER}_$${APP_REL}\"\n else\n GHIDRA_ID=\"ghidra_12.0.1_DEV\"\n fi\n\n VENV_PATH=\"/data/shared/ghidra-config/ghidra/$${GHIDRA_ID}/venv\"\n PYGHIDRA_DIST=\"/usr/share/ghidra/Ghidra/Features/PyGhidra/pypkg/dist\"\n\n # Only set up if pyghidra is not already importable in the venv\n if ! \"$$VENV_PATH/bin/python3\" -c \"import pyghidra\" 2>/dev/null; then\n echo \"Setting up PyGhidra venv at $$VENV_PATH ...\"\n rm -rf \"$$VENV_PATH\" 2>/dev/null || true\n python3 -m venv \"$$VENV_PATH\"\n \"$$VENV_PATH/bin/pip\" install --no-index -f \"$$PYGHIDRA_DIST\" pyghidra\n \"$$VENV_PATH/bin/python3\" -c \"import pyghidra; print('pyghidra', pyghidra.__version__, 'installed')\"\n else\n echo \"PyGhidra already installed in venv\"\n fi\n\n echo \"Ghidra container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n healthcheck:\n test: [\"CMD\", \"sh\", \"-c\", \"test -f /data/shared/ghidra-config/ghidra/*/venv/bin/python3 || python3 -c 'import pyghidra' 2>/dev/null\"]\n interval: 10s\n timeout: 5s\n retries: 30\n start_period: 30s\n\n radare2:\n image: radare/radare2:latest\n container_name: radare2\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n # Install decompiler plugins (best-effort)\n r2pm -Ui r2ghidra 2>/dev/null || echo \"r2ghidra not available\"\n r2pm -Ui r2dec 2>/dev/null || echo \"r2dec not available\"\n touch /tmp/.r2_ready\n echo \"Radare2 container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_shared:/data/shared\n healthcheck:\n test: [\"CMD\", \"cat\", \"/tmp/.r2_ready\"]\n interval: 5s\n timeout: 3s\n retries: 10\n\n agent:\n build:\n context: .\n dockerfile: backend/Dockerfile\n depends_on:\n ghidra:\n condition: service_healthy\n radare2:\n condition: service_healthy\n environment:\n GHIDRA_DOCKER_IMAGE: ${RUNNER_IMAGE:-ireng-runner}\n GHIDRA_PROJECT_ROOT: /data/projects\n GHIDRA_SHARED_ROOT: /data/shared\n GHIDRA_VOLUME_CONTAINER: ghidra_headless\n GHIDRA_SCRIPTS_ROOT: /data/shared/scripts\n GHIDRA_SCRIPTS_SOURCE: /app/ghidra_scripts\n GHIDRA_HEADLESS_SCRIPT_PATH: /usr/share/ghidra/support/pyghidraRun\n GHIDRA_INSTALL_PATH: /usr/share/ghidra\n DOCKER_CLI_PATH: /usr/bin/docker\n LLM_MODEL_NAME: glm-4.7\n LLM_PROVIDER: openai\n MAX_DECOMPILATION_TIME: \"30\"\n DEFAULT_ANALYSIS_TIMEOUT: \"120\"\n LLM_API_KEY: ${ANTHROPIC_API_KEY}\n LLM_BASE_URL: https://api.z.ai/api/coding/paas/v4/\n ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}\n ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL}\n R2_CONTAINER_NAME: radare2\n R2_SHARED_ROOT: /data/shared\n R2_TIMEOUT: \"60\"\n ENABLE_R2: \"true\"\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n - ./backend:/app\n - ./backend/ghidra_scripts:/app/ghidra_scripts\n - /var/run/docker.sock:/var/run/docker.sock\n ports:\n - \"8080:8080\"\n\n ui:\n build:\n context: .\n dockerfile: app/Dockerfile.ui\n environment:\n VITE_API_BASE_URL: http://localhost:8080\n VITE_WS_URL: ws://localhost:8080/stream\n VITE_APP_NAME: IrengSec\n ports:\n - \"4173:4173\"\n\nvolumes:\n ghidra_projects:\n ghidra_shared:\n"}, "fa01aaecfde6345bce9814d9051da64847993f3f": {"t": 1785767391.0499256, "n": 3484, "h": "b38093d29cc0411d", "c": "services:\n ghidra:\n image: ${RUNNER_IMAGE:-ireng-runner}\n container_name: ghidra_headless\n entrypoint:\n - \"/bin/sh\"\n - \"-c\"\n - |\n set -e\n export XDG_CONFIG_HOME=/data/shared/ghidra-config\n mkdir -p /data/shared/ghidra-config\n\n # Remove PEP 668 externally-managed marker\n rm -f /usr/lib/python3*/EXTERNALLY-MANAGED 2>/dev/null || true\n\n # Install python3-venv (needed for venv creation with pip)\n apt-get update 2>/dev/null && \\\n apt-get install -y --no-install-recommends python3-venv 2>/dev/null || true\n\n # Detect Ghidra application ID for the venv path\n GHIDRA_PROPS=$$(find /usr/share/ghidra -name \"application.properties\" -path \"*/application/*\" 2>/dev/null | head -1)\n if [ -n \"$$GHIDRA_PROPS\" ]; then\n APP_NAME=$$(grep \"^application.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2 | tr ' ' '_')\n APP_VER=$$(grep \"^application.version\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n APP_REL=$$(grep \"^application.release.name\" \"$$GHIDRA_PROPS\" | cut -d= -f2)\n GHIDRA_ID=\"$${APP_NAME}_$${APP_VER}_$${APP_REL}\"\n else\n GHIDRA_ID=\"ghidra_12.0.1_DEV\"\n fi\n\n VENV_PATH=\"/data/shared/ghidra-config/ghidra/$${GHIDRA_ID}/venv\"\n PYGHIDRA_DIST=\"/usr/share/ghidra/Ghidra/Features/PyGhidra/pypkg/dist\"\n\n # Only set up if pyghidra is not already importable in the venv\n if ! \"$$VENV_PATH/bin/python3\" -c \"import pyghidra\" 2>/dev/null; then\n echo \"Setting up PyGhidra venv at $$VENV_PATH ...\"\n rm -rf \"$$VENV_PATH\" 2>/dev/null || true\n python3 -m venv \"$$VENV_PATH\"\n \"$$VENV_PATH/bin/pip\" install --no-index -f \"$$PYGHIDRA_DIST\" pyghidra\n \"$$VENV_PATH/bin/python3\" -c \"import pyghidra; print('pyghidra', pyghidra.__version__, 'installed')\"\n else\n echo \"PyGhidra already installed in venv\"\n fi\n\n echo \"Ghidra container ready\"\n tail -f /dev/null\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n\n agent:\n build:\n context: .\n dockerfile: backend/Dockerfile\n depends_on:\n - ghidra\n environment:\n GHIDRA_DOCKER_IMAGE: ${RUNNER_IMAGE:-ireng-runner}\n GHIDRA_PROJECT_ROOT: /data/projects\n GHIDRA_SHARED_ROOT: /data/shared\n GHIDRA_VOLUME_CONTAINER: ghidra_headless\n GHIDRA_SCRIPTS_ROOT: /data/shared/scripts\n GHIDRA_SCRIPTS_SOURCE: /app/ghidra_scripts\n GHIDRA_HEADLESS_SCRIPT_PATH: /usr/share/ghidra/support/pyghidraRun\n GHIDRA_INSTALL_PATH: /usr/share/ghidra\n DOCKER_CLI_PATH: /usr/bin/docker\n LLM_MODEL_NAME: glm-4.7\n LLM_PROVIDER: openai\n MAX_DECOMPILATION_TIME: \"30\"\n DEFAULT_ANALYSIS_TIMEOUT: \"120\"\n LLM_API_KEY: ${ANTHROPIC_API_KEY}\n LLM_BASE_URL: https://api.z.ai/api/coding/paas/v4/\n ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY}\n ANTHROPIC_BASE_URL: ${ANTHROPIC_BASE_URL}\n volumes:\n - ghidra_projects:/data/projects\n - ghidra_shared:/data/shared\n - ./backend:/app\n - ./backend/ghidra_scripts:/app/ghidra_scripts\n - /var/run/docker.sock:/var/run/docker.sock\n ports:\n - \"8080:8080\"\n\n ui:\n build:\n context: .\n dockerfile: app/Dockerfile.ui\n environment:\n VITE_API_BASE_URL: http://localhost:8080\n VITE_WS_URL: ws://localhost:8080/stream\n VITE_APP_NAME: IrengSec\n ports:\n - \"4173:4173\"\n\nvolumes:\n ghidra_projects:\n ghidra_shared:\n"}}}}