# =============================================================================
# Dockerfile — Construction multi-stage du démon ja4ebpf
# Stage 1 : compilation eBPF (Rocky Linux 9 + clang + bpftool)
# Stage 2 : compilation Go + génération des bindings bpf2go
# Stage 3 : image finale minimale (Rocky Linux 9 minimal)
# =============================================================================

# --- Stage 1 : eBPF builder ---
FROM rockylinux:9 AS ebpf-builder

# Installation des outils de compilation eBPF
# libbpf-devel est dans le dépôt CRB (CodeReady Builder) de Rocky Linux 9
RUN dnf install -y epel-release dnf-plugins-core && \
    dnf config-manager --enable crb && \
    dnf install -y \
        clang \
        llvm \
        bpftool \
        kernel-headers \
        libbpf-devel \
        make \
        && \
    dnf clean all

WORKDIR /build

# Copier les sources eBPF
COPY services/ja4ebpf/bpf/ ./bpf/

# Créer le répertoire des headers et générer vmlinux.h depuis le BTF du kernel
RUN mkdir -p bpf/headers && \
    bpftool btf dump file /sys/kernel/btf/vmlinux format c > bpf/headers/vmlinux.h 2>/dev/null || \
    echo "/* vmlinux.h placeholder — généré au runtime */" > bpf/headers/vmlinux.h

# --- Stage 2 : Go builder ---
FROM rockylinux:9 AS go-builder

# Installation de Go et des outils nécessaires
# libbpf-devel est dans le dépôt CRB (CodeReady Builder) de Rocky Linux 9
RUN dnf install -y epel-release dnf-plugins-core && \
    dnf config-manager --enable crb && \
    dnf install -y \
        golang \
        clang \
        llvm \
        libbpf-devel \
        kernel-headers \
        bpftool \
        make \
        && \
    dnf clean all

WORKDIR /build

# Copier les headers eBPF générés au stage précédent
COPY --from=ebpf-builder /build/bpf/headers/ ./services/ja4ebpf/bpf/headers/

COPY services/ja4ebpf/ ./services/ja4ebpf/

WORKDIR /build/services/ja4ebpf

# Générer les bindings Go depuis le bytecode eBPF
RUN go generate ./internal/loader/

# Compilation du binaire final
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o /out/ja4ebpf ./cmd/ja4ebpf/

# --- Stage 3 : image finale ---
FROM rockylinux:9-minimal AS final

# Copier uniquement le binaire compilé
COPY --from=go-builder /out/ja4ebpf /usr/local/bin/ja4ebpf

# Créer le répertoire de configuration
RUN mkdir -p /etc/ja4ebpf

ENTRYPOINT ["/usr/local/bin/ja4ebpf"]
