Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@
# Get your key at: https://console.anthropic.com/settings/keys
# ANTHROPIC_API_KEY=sk-ant-...
#
# DeepSeek (Reasonix) container (--profile deepseek / `make deepseek`):
# DeepSeek container (--profile deepseek / `make deepseek`):
# Runs the Claude Code image pointed at DeepSeek's Anthropic-compatible API.
# The key is passed to Claude Code as ANTHROPIC_AUTH_TOKEN at runtime.
# Get your key at: https://platform.deepseek.com/api_keys
# DEEPSEEK_API_KEY=sk-...

Expand Down
4 changes: 0 additions & 4 deletions .github/workflows/build-and-push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,6 @@ jobs:
dockerfile: docker/claude-code.Dockerfile
tag_prefix: "claude-code-"
scout: false
- service: deepseek
dockerfile: docker/deepseek.Dockerfile
tag_prefix: "deepseek-"
scout: false
- service: hexstrike-ai
dockerfile: docker/hexstrike-ai.Dockerfile
tag_prefix: "hexstrike-ai-"
Expand Down
20 changes: 10 additions & 10 deletions DOCKER.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ Seven custom images are published to `crhacky/blhackbox` on Docker Hub:
| **WireMCP** | `crhacky/blhackbox:wire-mcp` | `docker/wire-mcp.Dockerfile` | `debian:bookworm-slim` |
| **Screenshot MCP** | `crhacky/blhackbox:screenshot-mcp` | `docker/screenshot-mcp.Dockerfile` | `python:3.13-slim` |
| **Claude Code** | `crhacky/blhackbox:claude-code` | `docker/claude-code.Dockerfile` | `node:22-slim` |
| **DeepSeek (Reasonix)** | `crhacky/blhackbox:deepseek` | `docker/deepseek.Dockerfile` | `node:22-slim` |
| **HexStrike API** | `crhacky/blhackbox:hexstrike-ai` | `docker/hexstrike-ai.Dockerfile` | `kalilinux/kali-rolling` |
| **HexStrike MCP** | `crhacky/blhackbox:hexstrike-mcp` | `docker/hexstrike-mcp.Dockerfile` | `python:3.11-slim` |
| **BOAZ MCP** | `crhacky/blhackbox:boaz-mcp` | `docker/boaz-mcp.Dockerfile` | `python:3.11-slim` |
Expand Down Expand Up @@ -197,7 +196,7 @@ Skills are available in the container via two mechanisms:
| `boaz-mcp` | `crhacky/blhackbox:boaz-mcp` | `9005` | default | BOAZ-MCP Gamma server (Streamable HTTP) |
| `portainer` | `portainer/portainer-ce:latest` | `9443` | default | Docker management UI (HTTPS) |
| `claude-code` | `crhacky/blhackbox:claude-code` | — | `claude-code` | Claude Code CLI client (Docker) |
| `deepseek` | `crhacky/blhackbox:deepseek` | — | `deepseek` | DeepSeek (Reasonix) terminal agent (Docker) |
| `deepseek` | `crhacky/blhackbox:claude-code` | — | `deepseek` | DeepSeek agent — Claude Code image + DeepSeek API (Docker) |
| `mcp-gateway` | `docker/mcp-gateway:latest` | `8080` | `gateway` | Single MCP entry point (host clients) |
| `neo4j` | `neo4j:5` | `7474` / `7687` | `neo4j` | Cross-session knowledge graph |

Expand Down Expand Up @@ -245,7 +244,7 @@ Requires `--profile gateway` (`make up-gateway`).
| Variable | Default | Description |
|:--|:--|:--|
| `ANTHROPIC_API_KEY` | — | Required for the Claude Code container (`--profile claude-code`) |
| `DEEPSEEK_API_KEY` | — | Required for the DeepSeek/Reasonix container (`--profile deepseek`) |
| `DEEPSEEK_API_KEY` | — | Required for the DeepSeek container (`--profile deepseek`); passed to Claude Code as `ANTHROPIC_AUTH_TOKEN` |
| `MCP_GATEWAY_PORT` | `8080` | MCP Gateway host port (optional) |
| `MSF_TIMEOUT` | `300` | Metasploit command timeout in seconds |
| `NEO4J_URI` | `bolt://neo4j:7687` | Neo4j connection URI (optional) |
Expand Down Expand Up @@ -308,18 +307,19 @@ Requires `--profile gateway` (`make up-gateway`).

The Claude Code container includes the full skills system. Skills (`.claude/skills/`) and project instructions (`CLAUDE.md`) are baked into the image at build time and overridden by volume mounts at runtime for live updates.

### DeepSeek / Reasonix — `crhacky/blhackbox:deepseek`
### DeepSeek — `deepseek` profile (reuses `crhacky/blhackbox:claude-code`)

| | |
|:--|:--|
| **Base** | `node:22-slim` |
| **Agent** | [Reasonix](https://github.com/esengine/DeepSeek-Reasonix) (DeepSeek-native), installed via `npm install -g reasonix` |
| **Entrypoint** | `deepseek-entrypoint.sh` (health checks + launch) |
| **MCP config** | Auto-reads the baked Claude-style `.mcp.json`; Direct Streamable HTTP to each server (no gateway dependency) |
| **Provider** | `reasonix.toml` → DeepSeek (`https://api.deepseek.com`), key from `DEEPSEEK_API_KEY` env (never written to disk) |
| **Image** | Same as Claude Code — `crhacky/blhackbox:claude-code` (no separate image) |
| **Agent** | Claude Code CLI, pointed at the DeepSeek API |
| **Entrypoint** | `claude-code-entrypoint.sh` (health checks + launch) |
| **MCP config** | Direct Streamable HTTP to each server (no gateway dependency) |
| **Provider** | `ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic` + `ANTHROPIC_AUTH_TOKEN` from `DEEPSEEK_API_KEY` env (never written to disk) |
| **Models** | `deepseek-v4-pro` (default), `deepseek-v4-flash` (Haiku tier) — per the [DeepSeek guide](https://github.com/deepseek-ai/awesome-deepseek-agent/blob/main/docs/claude_code.md) |
| **Requires** | `DEEPSEEK_API_KEY` in `.env` |

Reasonix maps the `.mcp.json` `mcpServers` entries (`type: http`, `url: …/mcp`) field-for-field onto its plugins, so it reaches the same five MCP servers as the Claude Code container. Launch it with `make deepseek` or `docker compose --profile deepseek run --rm deepseek`. Note that Claude Code *skills* (slash commands) are not a Reasonix feature; the agent works from natural-language instructions and the mounted `CLAUDE.md` methodology.
The `deepseek` profile runs the **same Claude Code image** as `--profile claude-code`, only with environment variables that route the model backend to DeepSeek's Anthropic-compatible endpoint. There is no separate image to build, push, or maintain, and the full skills system (slash commands) works exactly as it does with Claude Code. Launch it with `make deepseek` or `docker compose --profile deepseek run --rm deepseek`.

---

Expand Down
8 changes: 3 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,9 @@ claude-code: ## Build and launch Claude Code in a Docker container
@echo ""
$(COMPOSE) --profile claude-code run --rm claude-code

# ── DeepSeek / Reasonix (Docker) ────────────────────────────────
deepseek: ## Build and launch the DeepSeek (Reasonix) agent in a Docker container
$(COMPOSE) --profile deepseek pull deepseek || $(COMPOSE) --profile deepseek build deepseek
# ── DeepSeek (Docker — Claude Code pointed at the DeepSeek API) ──
deepseek: ## Launch the DeepSeek agent in a Docker container (reuses the Claude Code image)
$(COMPOSE) --profile deepseek pull deepseek || $(COMPOSE) --profile claude-code build claude-code
@echo ""
@echo "\033[1m Pre-flight Container Status\033[0m"
@echo "\033[2m ──────────────────────────────────────\033[0m"
Expand Down Expand Up @@ -227,15 +227,13 @@ push-all: ## Build and push all custom images to Docker Hub
docker build -f docker/wire-mcp.Dockerfile -t crhacky/blhackbox:wire-mcp .
docker build -f docker/screenshot-mcp.Dockerfile -t crhacky/blhackbox:screenshot-mcp .
docker build -f docker/claude-code.Dockerfile -t crhacky/blhackbox:claude-code .
docker build -f docker/deepseek.Dockerfile -t crhacky/blhackbox:deepseek .
docker build -f docker/hexstrike-ai.Dockerfile -t crhacky/blhackbox:hexstrike-ai .
docker build -f docker/hexstrike-mcp.Dockerfile -t crhacky/blhackbox:hexstrike-mcp .
docker build -f docker/boaz-mcp.Dockerfile -t crhacky/blhackbox:boaz-mcp .
docker push crhacky/blhackbox:kali-mcp
docker push crhacky/blhackbox:wire-mcp
docker push crhacky/blhackbox:screenshot-mcp
docker push crhacky/blhackbox:claude-code
docker push crhacky/blhackbox:deepseek
docker push crhacky/blhackbox:hexstrike-ai
docker push crhacky/blhackbox:hexstrike-mcp
docker push crhacky/blhackbox:boaz-mcp
27 changes: 12 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
|---|---|
| **Getting Started** | [How It Works](#how-it-works) · [Architecture](#architecture) · [Prerequisites](#prerequisites) · [Installation](#installation) |
| **Skills** | [Skills Overview](#skills--slash-commands) · [Available Skills](#available-skills) · [How Skills Work](#how-skills-work) |
| **Tutorials** | [Claude Code (Docker)](#tutorial-1-claude-code-docker--recommended) · [DeepSeek (Reasonix)](#tutorial-1b-deepseek-reasonix-docker) · [Claude Code (Web)](#tutorial-2-claude-code-web) · [Claude Desktop](#tutorial-3-claude-desktop-host--gateway) · [ChatGPT / OpenAI](#tutorial-4-chatgpt--openai-host--gateway) |
| **Tutorials** | [Claude Code (Docker)](#tutorial-1-claude-code-docker--recommended) · [DeepSeek (Docker)](#tutorial-1b-deepseek-docker) · [Claude Code (Web)](#tutorial-2-claude-code-web) · [Claude Desktop](#tutorial-3-claude-desktop-host--gateway) · [ChatGPT / OpenAI](#tutorial-4-chatgpt--openai-host--gateway) |
| **Advanced** | [Advanced Usage & FAQ](#advanced-usage--faq) |
| **Reference** | [Components](#components) · [Output Files](#output-files) · [CLI Reference](#cli-reference) · [Makefile Shortcuts](#makefile-shortcuts) · [Docker Hub Images](#docker-hub-images) |
| **Operations** | [Prompt Flow](#how-prompts-flow-through-the-system) · [MCP Gateway](#do-i-need-the-mcp-gateway) · [Portainer Setup](#portainer-setup) · [Neo4j](#neo4j-optional) · [Troubleshooting](#troubleshooting) |
Expand Down Expand Up @@ -424,7 +424,7 @@ The entrypoint script checks each service and shows a status dashboard with avai

You are now inside an interactive Claude Code session.

> **Prefer DeepSeek?** A drop-in alternative agent is available. Set `DEEPSEEK_API_KEY` in `.env` and run `make deepseek` (or `docker compose --profile deepseek run --rm deepseek`). It launches [Reasonix](https://github.com/esengine/DeepSeek-Reasonix), a DeepSeek-native terminal agent, wired to the same five MCP servers over Streamable HTTP. See [Tutorial 1b](#tutorial-1b-deepseek-reasonix-docker).
> **Prefer DeepSeek?** Set `DEEPSEEK_API_KEY` in `.env` and run `make deepseek` (or `docker compose --profile deepseek run --rm deepseek`). This runs the **same Claude Code image** pointed at DeepSeek's Anthropic-compatible API — same MCP wiring, same skills, only the model backend differs. See [Tutorial 1b](#tutorial-1b-deepseek-docker).

### Step 3 — Verify the connection

Expand Down Expand Up @@ -470,13 +470,13 @@ Or use **Portainer** at `https://localhost:9443` for a unified dashboard.

---

## Tutorial 1b: DeepSeek (Reasonix, Docker)
## Tutorial 1b: DeepSeek (Docker)

Prefer a DeepSeek-powered agent over Claude? [Reasonix](https://github.com/esengine/DeepSeek-Reasonix) is a DeepSeek-native terminal coding agent that connects to the **same five MCP servers** over Streamable HTTP — it reads a Claude-style `.mcp.json`, so the wiring is identical to the Claude Code container. It is added as a separate `deepseek` profile and does **not** replace Claude Code.
Prefer a DeepSeek-powered agent over Claude? The `deepseek` profile runs the **same Claude Code image** as Tutorial 1, just pointed at DeepSeek's Anthropic-compatible API via `ANTHROPIC_BASE_URL` + `ANTHROPIC_AUTH_TOKEN` (following the [official DeepSeek guide](https://github.com/deepseek-ai/awesome-deepseek-agent/blob/main/docs/claude_code.md)). The MCP wiring, the skills system, and the entrypoint are identical — only the model backend changes. There is no separate image to build or maintain.

### Step 1 — Set your DeepSeek key

Put `DEEPSEEK_API_KEY` in `.env` (get one at [platform.deepseek.com/api_keys](https://platform.deepseek.com/api_keys)). `setup.sh` prompts for it, or add it manually. The key is read from the environment at runtime and never written into the image.
Put `DEEPSEEK_API_KEY` in `.env` (get one at [platform.deepseek.com/api_keys](https://platform.deepseek.com/api_keys)). `setup.sh` prompts for it, or add it manually. The key is read from the environment at runtime, passed to Claude Code as `ANTHROPIC_AUTH_TOKEN`, and never written into the image.

### Step 2 — Launch the agent

Expand All @@ -490,9 +490,9 @@ Or manually:
docker compose --profile deepseek run --rm deepseek
```

The entrypoint checks each MCP server, then drops you into an interactive Reasonix session with all the pentest tools available. The default model is **DeepSeek-V4-Flash**; type `/pro` for a single Pro turn or `/preset max` to use Pro for the whole session.
The entrypoint checks each MCP server, then drops you into an interactive session with all the pentest tools available. The default model is **deepseek-v4-pro** (background tasks use **deepseek-v4-flash**); switch the active model in-session with `/model`.

> **Note:** Slash-command *skills* (`/full-pentest`, `/quick-scan`, …) are a Claude Code feature. With Reasonix, describe your authorized target and goal in natural language and the agent calls the MCP tools directly; the methodology in `CLAUDE.md` is mounted at `/root/CLAUDE.md` for reference.
> **Note:** Because this is Claude Code under the hood, the full skills system works — `/full-pentest`, `/quick-scan`, and the rest of the slash commands behave exactly as in Tutorial 1.

---

Expand Down Expand Up @@ -761,7 +761,7 @@ STEP 7 ─ (OPTIONAL) RESULTS STORED IN NEO4J
| MCP Client | Gateway? | How it connects |
|:--|:--:|:--|
| **Claude Code (Docker)** | No | Direct Streamable HTTP to each MCP server over Docker network |
| **DeepSeek / Reasonix (Docker)** | No | Direct Streamable HTTP to each MCP server over Docker network |
| **DeepSeek (Docker)** | No | Claude Code image + DeepSeek API; direct Streamable HTTP to each MCP server over Docker network |
| **Claude Code (Web)** | No | Stdio MCP server from `.mcp.json` |
| **Claude Desktop** | **Yes** | Host GUI app → `localhost:8080/mcp` gateway |
| **ChatGPT / OpenAI** | **Yes** | Host GUI/web app → `localhost:8080/mcp` gateway |
Expand Down Expand Up @@ -882,7 +882,7 @@ blhackbox mcp # Start MCP server
| `make up-gateway` | Start with MCP Gateway for Claude Desktop (8 containers) |
| `make down` | Stop all services |
| `make claude-code` | Build and launch Claude Code in Docker |
| `make deepseek` | Build and launch the DeepSeek (Reasonix) agent in Docker |
| `make deepseek` | Launch the DeepSeek agent in Docker (Claude Code image + DeepSeek API) |
| `make status` | Container status table |
| `make health` | Quick health check of all services |
| `make test` | Run tests |
Expand Down Expand Up @@ -920,8 +920,7 @@ All custom images are published to `crhacky/blhackbox`:
| `crhacky/blhackbox:hexstrike-ai` | HexStrike Gamma API container |
| `crhacky/blhackbox:hexstrike-mcp` | Upstream HexStrike Gamma MCP server over Streamable HTTP |
| `crhacky/blhackbox:boaz-mcp` | Upstream BOAZ-MCP Gamma server over Streamable HTTP |
| `crhacky/blhackbox:claude-code` | Claude Code CLI client (direct Streamable HTTP to MCP servers) |
| `crhacky/blhackbox:deepseek` | DeepSeek (Reasonix) terminal agent (direct Streamable HTTP to MCP servers) |
| `crhacky/blhackbox:claude-code` | Claude Code CLI client (direct Streamable HTTP to MCP servers); also used by the `deepseek` profile pointed at the DeepSeek API |

Official images pulled directly:

Expand Down Expand Up @@ -986,10 +985,8 @@ blhackbox/
│ ├── kali-mcp.Dockerfile Kali Linux + Metasploit Framework
│ ├── wire-mcp.Dockerfile
│ ├── screenshot-mcp.Dockerfile
│ ├── claude-code.Dockerfile MCP client container
│ ├── claude-code-entrypoint.sh Startup script with health checks
│ ├── deepseek.Dockerfile DeepSeek (Reasonix) MCP client container
│ └── deepseek-entrypoint.sh DeepSeek startup script with health checks
│ ├── claude-code.Dockerfile MCP client container (also used by the deepseek profile)
│ └── claude-code-entrypoint.sh Startup script with health checks
├── kali-mcp/ Kali MCP server (70+ tools + Metasploit)
├── wire-mcp/ WireMCP server (tshark, 7 tools)
├── screenshot-mcp/ Screenshot MCP server (Playwright, 4 tools)
Expand Down
38 changes: 25 additions & 13 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
# docker compose up -d Start default stack (Kali, WireMCP, Screenshot, HexStrike, BOAZ, Portainer)
# docker compose --profile gateway up -d Start with MCP Gateway
# docker compose --profile claude-code up -d Start with Claude Code container
# docker compose --profile deepseek run --rm deepseek Run the DeepSeek (Reasonix) agent
# docker compose --profile deepseek run --rm deepseek Run the DeepSeek agent (Claude Code + DeepSeek API)
# docker compose --profile neo4j up -d Start with Neo4j
# docker compose build Build all custom images locally
#
Expand Down Expand Up @@ -372,26 +372,37 @@ services:
networks:
- blhackbox_net

# -- DEEPSEEK / REASONIX (OPTIONAL) ----------------------------------------
# DeepSeek-native MCP client running inside Docker -- no host install needed.
# -- DEEPSEEK (OPTIONAL) ---------------------------------------------------
# DeepSeek-powered agent running inside Docker -- no host install needed.
# Enable with: docker compose --profile deepseek run --rm deepseek
# (or `make deepseek`)
#
# Reasonix (https://github.com/esengine/DeepSeek-Reasonix) connects DIRECTLY
# to each MCP server via Streamable HTTP over the Docker network by reading
# its baked .mcp.json (Claude Code's mcpServers schema). Does NOT require the
# MCP Gateway. Requires DEEPSEEK_API_KEY (read from env, never written to disk).
# Reuses the Claude Code image and points it at DeepSeek's Anthropic-compatible
# API via ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN, following the official
# DeepSeek guide:
# https://github.com/deepseek-ai/awesome-deepseek-agent/blob/main/docs/claude_code.md
# Same MCP wiring, skills, and entrypoint as the claude-code service — only the
# model backend differs, so there is no separate image to build or maintain.
# Requires DEEPSEEK_API_KEY (read from env, never written to disk).
deepseek:
image: crhacky/blhackbox:deepseek
build:
context: .
dockerfile: docker/deepseek.Dockerfile
image: crhacky/blhackbox:claude-code
container_name: blhackbox-deepseek
profiles: ["deepseek"]
stdin_open: true
tty: true
environment:
DEEPSEEK_API_KEY: "${DEEPSEEK_API_KEY:-}"
# Route Claude Code at DeepSeek's Anthropic-compatible endpoint.
# ANTHROPIC_AUTH_TOKEN is sent as the Authorization: Bearer header.
ANTHROPIC_BASE_URL: "https://api.deepseek.com/anthropic"
ANTHROPIC_AUTH_TOKEN: "${DEEPSEEK_API_KEY:-}"
# Map Claude's model tiers onto DeepSeek models (per the DeepSeek guide).
# Switch the active model in-session with /model.
ANTHROPIC_MODEL: "deepseek-v4-pro"
ANTHROPIC_DEFAULT_OPUS_MODEL: "deepseek-v4-pro"
ANTHROPIC_DEFAULT_SONNET_MODEL: "deepseek-v4-pro"
ANTHROPIC_DEFAULT_HAIKU_MODEL: "deepseek-v4-flash"
# Don't phone home to Anthropic for telemetry/auto-update.
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1"
# Bypass egress proxies (e.g. GitHub Codespaces) for internal Docker traffic
no_proxy: "mcp-gateway,kali-mcp,wire-mcp,screenshot-mcp,hexstrike-ai,hexstrike-bridge-mcp,boaz-mcp,localhost,127.0.0.1"
NO_PROXY: "mcp-gateway,kali-mcp,wire-mcp,screenshot-mcp,hexstrike-ai,hexstrike-bridge-mcp,boaz-mcp,localhost,127.0.0.1"
Expand All @@ -404,7 +415,8 @@ services:
- ./output/sessions:/root/results
# Shared working data from Kali MCP (recon files, tool artifacts)
- shared-output:/root/kali-data:ro
# Mount project instructions so the agent has the latest methodology
# Mount skills and project instructions so Claude Code discovers them
- ./.claude/skills:/root/.claude/skills:ro
- ./CLAUDE.md:/root/CLAUDE.md:ro
depends_on:
kali-mcp:
Expand Down
Loading