# syntax=docker/dockerfile:1.7
#
# Dockerfile etendu — base officielle Armur-Ai/Pentest-Swarm-AI
# + outils de securite compiles (le Dockerfile upstream ne livre que le
#   binaire pentestswarm seul, 0/16 outils presents au demarrage)
#
# [Verifie 31/08/2026] nmap est disponible via apk (Alpine main/community).
# nuclei/subfinder/httpx/naabu/katana/dnsx/gau/gobuster/gitleaks/ffuf sont
# des binaires Go non empaquetes pour Alpine : compiles ici via "go install"
# dans le stage builder, puis copies dans l'image finale.
#
# [Connu, non couvert] sqlmap/semgrep (Python), nikto (Perl), jwt_tool
# (Python), ysoserial (Java), trufflehog (go.mod avec "replace" qui bloque
# "go install") et gowitness (necessite un navigateur headless) restent
# absents : ils demanderaient d'ajouter des toolchains entieres a l'image ou
# de builder depuis les sources, hors scope de cette extension. Le
# planificateur LLM peut toujours les proposer (ils sont enregistres dans le
# coordinator) mais l'executor les rejettera faute de binaire — a traiter
# separement si besoin.
#
# [Non verifie] versions exactes des modules Go (@latest) : a figer avec un
# tag de version explicite avant mise en production pour la reproductibilite
# des builds (@latest peut changer entre deux "docker compose build").

# ---------------------------------------------------------------------
# Stage 1 — build du binaire pentestswarm (inchange par rapport a l'upstream)
# ---------------------------------------------------------------------
FROM golang:1.24-alpine AS builder

RUN apk add --no-cache git ca-certificates

WORKDIR /src
COPY go.mod go.sum ./
RUN --mount=type=cache,target=/go/pkg/mod \
    go mod download

COPY . .

ARG VERSION=dev
ARG COMMIT=unknown
ARG DATE=unknown

RUN --mount=type=cache,target=/go/pkg/mod \
    --mount=type=cache,target=/root/.cache/go-build \
    CGO_ENABLED=0 GOOS=linux go build \
      -ldflags="-s -w -X main.version=${VERSION} -X main.commit=${COMMIT} -X main.date=${DATE}" \
      -o /out/pentestswarm ./cmd/pentestswarm/

# ---------------------------------------------------------------------
# Stage 2 — compilation des outils de securite Go (recon + vuln scan)
# Stage separe : evite de re-telecharger ces modules a chaque modification
# du code de pentestswarm (cache Docker distinct du stage builder).
# ---------------------------------------------------------------------
FROM golang:1.24-alpine AS tools

RUN apk add --no-cache git

# GOTOOLCHAIN=auto : certains modules (nuclei v3.11.1 exige Go >= 1.26)
# demandent une toolchain plus recente que celle de l'image de base.
# "auto" autorise "go install" a telecharger la toolchain requise a la volee
# au lieu d'echouer sous GOTOOLCHAIN=local (comportement par defaut).
ENV GOTOOLCHAIN=auto

RUN --mount=type=cache,target=/go/pkg/mod \
    --mount=type=cache,target=/root/.cache/go-build \
    CGO_ENABLED=0 go install github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest && \
    CGO_ENABLED=0 go install github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest && \
    CGO_ENABLED=0 go install github.com/projectdiscovery/httpx/cmd/httpx@latest && \
    CGO_ENABLED=0 go install github.com/projectdiscovery/naabu/v2/cmd/naabu@latest && \
    CGO_ENABLED=0 go install github.com/projectdiscovery/katana/cmd/katana@latest && \
    CGO_ENABLED=0 go install github.com/projectdiscovery/dnsx/cmd/dnsx@latest && \
    CGO_ENABLED=0 go install github.com/lc/gau/v2/cmd/gau@latest && \
    CGO_ENABLED=0 go install github.com/OJ/gobuster/v3@latest && \
    CGO_ENABLED=0 go install github.com/zricethezav/gitleaks/v8@latest && \
    CGO_ENABLED=0 go install github.com/ffuf/ffuf/v2@latest
# trufflehog omis : son go.mod contient des directives "replace" qui rendent
# "go install .../trufflehog/v3@latest" impossible (erreur go tooling connue
# en amont) — necessiterait de cloner le depot et builder depuis les sources,
# hors scope de ce simple ajout de binaires.
#
# gowitness omis : fonctionnel uniquement avec un navigateur headless
# (chromium) installe a cote, ce qui alourdirait significativement l'image
# pour un outil de capture d'ecran seulement utile en phase de reporting.

# ---------------------------------------------------------------------
# Stage 3 — runtime, non-root, minimal (base identique a l'upstream)
# ---------------------------------------------------------------------
FROM alpine:3.20

# nmap : seul outil de la liste doctor disponible directement via apk.
# libpcap requis par naabu pour le scan SYN (sinon repli sur connect scan).
RUN apk add --no-cache ca-certificates tzdata curl nmap libpcap \
    && addgroup -S swarm && adduser -S -G swarm -h /home/swarm swarm

COPY --from=builder /out/pentestswarm /usr/local/bin/pentestswarm
COPY --from=tools /go/bin/nuclei     /usr/local/bin/nuclei
COPY --from=tools /go/bin/subfinder  /usr/local/bin/subfinder
COPY --from=tools /go/bin/httpx      /usr/local/bin/httpx
COPY --from=tools /go/bin/naabu      /usr/local/bin/naabu
COPY --from=tools /go/bin/katana     /usr/local/bin/katana
COPY --from=tools /go/bin/dnsx       /usr/local/bin/dnsx
COPY --from=tools /go/bin/gau        /usr/local/bin/gau
COPY --from=tools /go/bin/gobuster   /usr/local/bin/gobuster
COPY --from=tools /go/bin/gitleaks   /usr/local/bin/gitleaks
COPY --from=tools /go/bin/ffuf       /usr/local/bin/ffuf
COPY --chown=swarm:swarm playbooks/ /usr/local/share/pentestswarm/playbooks/

USER swarm
WORKDIR /home/swarm

# Templates nuclei — telechargement au premier lancement (reseau requis ce
# jour-la uniquement). Pour un usage air-gapped, pre-telecharger les
# templates sur une machine avec acces internet et les copier dans l'image
# via un volume ou un COPY supplementaire avant build.
RUN nuclei -update-templates -silent || true

EXPOSE 8080

LABEL org.opencontainers.image.title="Pentest Swarm AI (etendu)" \
      org.opencontainers.image.source="https://github.com/Armur-Ai/Pentest-Swarm-AI" \
      org.opencontainers.image.licenses="AGPL-3.0"

ENTRYPOINT ["pentestswarm"]
CMD ["serve"]
