mirror of
https://github.com/Heretek-AI/heretek-rigs.git
synced 2026-11-07 10:55:57 -10:00
M9: all 10 sidecar images tag@digest-pinned with on-host-resolved digests (4 phantom refs fixed: socket-proxy v0.5.0, browserless/chromium v2.26.0, firecrawl/firecrawl 2.10.19, blacktop/ghidra 12.1.4, radare/radare2, sonarqube 25.10.0.114319-community); Dockerfile OPENRIG 0.6.13 + catalog alignment; git-archive vendoring with dirty-clone refusal; DIRTY- provenance stamp; Not-tested attestation default; V13 gate block (S2a tuple-sync, image pins+existence, MCP flags/pins/deny-lists, roster/pod, stub scan). Co-Authored-By: Claude Opus 4.8 <[email protected]> Claude-Session: https://claude.ai/code/session_014wevSWHET5eqHNVNTYZ9W
198 lines
7.5 KiB
YAML
198 lines
7.5 KiB
YAML
# Heretek-Rigs sidecar suite (restored minimal fail-closed baseline).
|
|
# Full 1,025-line Heretek-Crew original blocked by external-path read (see docs/NOTES.md M4).
|
|
# This baseline satisfies the fail-closed invariants enforced by scripts/verify-rigs.sh:
|
|
# loopback-only ports, pinned images (zero :latest), GET-only docker-socket-proxy,
|
|
# heretek-devsec / heretek-mobile isolation with :ro samples mounts.
|
|
# HR-7.3 coexistence matrix (authoritative): `sonarqube` intentionally co-resides
|
|
# on `heretek-devsec` (code-review findings feed SAST triage on the same isolated
|
|
# tenant net; it never mounts ./workspaces/binaries and never joins
|
|
# heretek-mobile). `devsec x web-research` co-scheduling is ALLOWED (separate
|
|
# `internal:true` vs public nets, no privileged emulator). `mobile x devsec` and
|
|
# `mobile x web-research` are FORBIDDEN by `make guard-profiles` (privileged
|
|
# /dev/kvm emulator must stay isolated); `make sidecars-up` always runs the
|
|
# guard first, but direct `docker compose --profile` bypasses make by design —
|
|
# CI must invoke via make, never raw compose.
|
|
name: heretek-rigs-sidecars
|
|
services:
|
|
docker-socket-proxy:
|
|
# Pinned 2026-10-24 (M9 #70): the `:0.5.0` tag never existed upstream
|
|
# (only `v0.5.0`); digest resolved live via skopeo inspect. The digest
|
|
# wins; `v0.5.0` stays as the human-readable provenance.
|
|
image: tecnativa/docker-socket-proxy:v0.5.0@sha256:1f5038b54f06c3e18422902cf00ba21803d1c97805aae032e5e6673d532d3459
|
|
profiles: ["qa-testing"]
|
|
# HR-7.2 (fail-closed): every Tecnativa toggle pinned explicitly to "0".
|
|
# Unset toggles fall back to upstream image defaults — EVENTS, PING and
|
|
# VERSION default to 1 upstream, so all three are denied here. The 20-key
|
|
# set is enumerated per tecnativa/docker-socket-proxy:0.5.0 README/haproxy.cfg.
|
|
environment:
|
|
POST: "0"
|
|
BUILD: "0"
|
|
EXEC: "0"
|
|
VOLUMES: "0"
|
|
NETWORKS: "0"
|
|
SWARM: "0"
|
|
SYSTEM: "0"
|
|
AUTH: "0"
|
|
CONTAINERS: "0"
|
|
IMAGES: "0"
|
|
INFO: "0"
|
|
PING: "0"
|
|
SERVICES: "0"
|
|
TASKS: "0"
|
|
NODES: "0"
|
|
CONFIGS: "0"
|
|
SECRETS: "0"
|
|
PLUGINS: "0"
|
|
EVENTS: "0"
|
|
VERSION: "0"
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
networks:
|
|
- heretek
|
|
restart: unless-stopped
|
|
|
|
searxng:
|
|
# Pinned 2026-10-24 (M9 #70): the `:2026.10.18-2c9b2d4` tag never existed
|
|
# upstream; tagless digest adopted from the sibling-tested Heretek-Crew
|
|
# pin and verified live via skopeo inspect.
|
|
image: searxng/searxng@sha256:79180616c984f39524f6f27f19625a46f82c8ad4aa6a2e553db52b14e1b4a768
|
|
profiles: ["web-research"]
|
|
ports:
|
|
- 127.0.0.1:8888:8080
|
|
environment:
|
|
SEARXNG_SECRET: ${SEARXNG_SECRET:?set SEARXNG_SECRET in .env}
|
|
networks:
|
|
- heretek
|
|
restart: unless-stopped
|
|
|
|
browserless:
|
|
# Pinned 2026-10-24 (M9 #70): `browserless/chrome:1.66.0` never existed
|
|
# (no bare semver tags; wrong repo — the published repo is
|
|
# ghcr.io/browserless/chromium). Adopted the sibling-tested
|
|
# v2.26.0 pin, verified live via skopeo inspect. The digest wins;
|
|
# `v2.26.0` stays as the human-readable provenance.
|
|
image: ghcr.io/browserless/chromium:v2.26.0@sha256:899026f6995003a35989dc32e240711735ac17069a9d476376081bcc20b24da9
|
|
profiles: ["web-research"]
|
|
ports:
|
|
- 127.0.0.1:3000:3000
|
|
environment:
|
|
TOKEN: ${BROWSERLESS_TOKEN:?set BROWSERLESS_TOKEN in .env}
|
|
networks:
|
|
- heretek
|
|
restart: unless-stopped
|
|
|
|
firecrawl:
|
|
# Pinned 2026-10-24 (M9 #70): `ghcr.io/mendable/firecrawl:1.6.0` never
|
|
# existed (no `mendable` org; the project moved mendableai->firecrawl
|
|
# and publishes no 1.x tags). Adopted the sibling-tested 2.10.19 pin,
|
|
# verified live via skopeo inspect. PORT/INTERNAL_PORT preserve the
|
|
# 3002 mapping (the image defaults to 8080); REDIS_URL still points at
|
|
# the firecrawl-redis service below. Caveat: upstream runs a full
|
|
# backing stack (rabbitmq/nuq-postgres/playwright-service) — this
|
|
# minimal profile's standalone boot is unverified (see NOTES).
|
|
image: ghcr.io/firecrawl/firecrawl:2.10.19@sha256:50446cbc0bc700a78cc588c96bd38a97f01cc4299c99b349c7bfa1ba57b6d7ed
|
|
profiles: ["web-research"]
|
|
ports:
|
|
- 127.0.0.1:3002:3002
|
|
environment:
|
|
PORT: "3002"
|
|
INTERNAL_PORT: "3002"
|
|
REDIS_URL: redis://firecrawl-redis:6379/0
|
|
networks:
|
|
- heretek
|
|
depends_on:
|
|
- firecrawl-redis
|
|
restart: unless-stopped
|
|
|
|
# HR-7.1-firecrawl-redis (fail-closed): backend for firecrawl's REDIS_URL.
|
|
# No published ports (reachable only inside the compose net); pinned image.
|
|
firecrawl-redis:
|
|
image: redis:8.0.3@sha256:be0a135f1955140436b9114da96dd22fbedb874469400b6ef458cc0d42155de0
|
|
profiles: ["web-research"]
|
|
networks:
|
|
- heretek
|
|
restart: unless-stopped
|
|
|
|
ghidra:
|
|
# Pinned 2026-10-24 (M9 #70): `ghcr.io/ghidra/ghidra:11.4.2` never
|
|
# existed (no `ghidra` GitHub org). Adopted the sibling-tested
|
|
# blacktop/ghidra:12.1.4 pin, verified live via skopeo inspect, with
|
|
# upstream's entrypoint/command (`server` serves :1337; the image
|
|
# default cmd is `client`). The digest wins; `12.1.4` stays as the
|
|
# human-readable provenance.
|
|
image: blacktop/ghidra:12.1.4@sha256:b2479177bd6a10d974da1bff30cc911ea2856843d858ad0ba02a608152ca193c
|
|
profiles: ["devsec"]
|
|
ports:
|
|
- 127.0.0.1:1337:1337
|
|
entrypoint: ["/entrypoint.sh"]
|
|
command: ["server"]
|
|
volumes:
|
|
- ./workspaces/binaries:/samples:ro
|
|
networks:
|
|
- heretek-devsec
|
|
restart: unless-stopped
|
|
|
|
radare2:
|
|
# Pinned 2026-10-24 (M9 #70): `radareorg/radare2:5.9.8` never existed
|
|
# (wrong org — the published repo is `radare/radare2`). Tagless digest
|
|
# adopted from the sibling-tested pin and verified live via skopeo.
|
|
image: radare/radare2@sha256:88b7ff67710e12f430b269abc7714490e3a0c37e391521523148cbd6f9d2ae37
|
|
profiles: ["devsec"]
|
|
ports:
|
|
- 127.0.0.1:9090:9090
|
|
volumes:
|
|
- ./workspaces/binaries:/samples:ro
|
|
networks:
|
|
- heretek-devsec
|
|
restart: unless-stopped
|
|
|
|
sonarqube:
|
|
# Pinned 2026-10-24 (M9 #70): `:25.10.0-community` never existed; the
|
|
# resolved tag is `25.10.0.114319-community`, digest verified live via
|
|
# skopeo inspect. The digest wins; the tag stays as provenance.
|
|
image: sonarqube:25.10.0.114319-community@sha256:ef0290a2deabad86a2623552712033a7107a9f5b310af00519b4ddd5b348ef4e
|
|
profiles: ["devsec"]
|
|
ports:
|
|
- 127.0.0.1:9000:9000
|
|
networks:
|
|
- heretek-devsec
|
|
restart: unless-stopped
|
|
|
|
qdrant:
|
|
image: qdrant/qdrant:v1.15.3@sha256:31407c0e8e32eb771b71718f1a4772e2ad47a07557917b21ac96792f40eb8007
|
|
profiles: ["ai-gateway"]
|
|
ports:
|
|
- 127.0.0.1:6333:6333
|
|
environment:
|
|
QDRANT_API_KEY: ${QDRANT_API_KEY:?set QDRANT_API_KEY in .env}
|
|
networks:
|
|
- heretek
|
|
restart: unless-stopped
|
|
|
|
docker-android:
|
|
image: budtmo/docker-android:emulator_14.0@sha256:8ee678cf831fdf7c03fb391ca036922f3b78b89fdc992be3b815e1c70b372d2a
|
|
profiles: ["mobile"]
|
|
privileged: false
|
|
ports:
|
|
- 127.0.0.1:6080:6080
|
|
networks:
|
|
- heretek-mobile
|
|
restart: unless-stopped
|
|
|
|
networks:
|
|
# Explicit `name:` keys so network names are deterministic regardless of the
|
|
# Compose project name. External containers (e.g. the heretek-rigs fleet
|
|
# image) join with `--network heretek`.
|
|
heretek:
|
|
name: heretek
|
|
driver: bridge
|
|
internal: false
|
|
heretek-devsec:
|
|
name: heretek-devsec
|
|
driver: bridge
|
|
internal: true
|
|
heretek-mobile:
|
|
name: heretek-mobile
|
|
driver: bridge
|
|
internal: true
|