# Panel controller — production image. # Build from the repo root: docker build -f deploy/Dockerfile.controller . # (the Makefile "docker" target does exactly this, injecting VERSION) FROM golang:1.26 AS build ARG VERSION=dev WORKDIR /src # The repo is a Go workspace (go.work) spanning controller/agent/pkg/proto — # copy the whole tree so workspace resolution works. COPY . . ENV CGO_ENABLED=0 RUN go build -trimpath \ -ldflags "-s -w -X github.com/dbledeez/panel/pkg/version.Version=${VERSION}" \ -o /out/controller ./controller/cmd/controller \ && go build -trimpath \ -ldflags "-s -w -X github.com/dbledeez/panel/pkg/version.Version=${VERSION}" \ -o /out/panelctl ./controller/cmd/panelctl FROM gcr.io/distroless/static-debian12:nonroot WORKDIR /opt/panel COPY --from=build /out/controller /opt/panel/bin/controller COPY --from=build /out/panelctl /opt/panel/bin/panelctl # Module manifests: the controller's port allocator reads ./modules. COPY --from=build /src/modules /opt/panel/modules # CA, admin-token, cluster stores — persist this volume. VOLUME ["/opt/panel/data"] EXPOSE 8080 8443 ENTRYPOINT ["/opt/panel/bin/controller"] CMD ["-http", ":8080", "-grpc", ":8443", "-ca-dir", "./data/ca"]