# Dockerfile.tenant — combined platform (Go) + canvas (Next.js) image. # # Serves both the API (Go on :8080) and the UI (Node.js on :3000) in a # single container. Go reverse-proxies unknown routes to canvas. # # Templates are cloned from standalone GitHub repos at build time so the # monorepo doesn't need to carry them. The repos are public; no auth. # # Build context: repo root. # # docker buildx build --platform linux/amd64 \ # -f workspace-server/Dockerfile.tenant \ # -t registry.fly.io/molecule-tenant:latest \ # --push . # ── Stage 1: Go platform binary ────────────────────────────────────── FROM golang:1.25-alpine AS go-builder WORKDIR /app COPY molecule-ai-plugin-github-app-auth/ /plugin/ COPY workspace-server/go.mod workspace-server/go.sum ./ RUN echo 'replace github.com/Molecule-AI/molecule-ai-plugin-github-app-auth => /plugin' >> go.mod RUN go mod download COPY workspace-server/ . RUN CGO_ENABLED=0 GOOS=linux go build -o /platform ./cmd/server # ── Stage 2: Canvas Next.js standalone ──────────────────────────────── FROM node:20-alpine AS canvas-builder WORKDIR /canvas COPY canvas/package.json canvas/package-lock.json* ./ RUN npm install COPY canvas/ . ARG NEXT_PUBLIC_PLATFORM_URL="" ARG NEXT_PUBLIC_WS_URL="" ENV NEXT_PUBLIC_PLATFORM_URL=$NEXT_PUBLIC_PLATFORM_URL ENV NEXT_PUBLIC_WS_URL=$NEXT_PUBLIC_WS_URL RUN npm run build # ── Stage 3: Clone templates + plugins from manifest.json ───────────── FROM alpine:3.20 AS templates RUN apk add --no-cache git jq COPY manifest.json /manifest.json COPY scripts/clone-manifest.sh /scripts/clone-manifest.sh RUN chmod +x /scripts/clone-manifest.sh && /scripts/clone-manifest.sh /manifest.json /workspace-configs-templates /org-templates /plugins # ── Stage 4: Runtime ────────────────────────────────────────────────── FROM node:20-alpine RUN apk add --no-cache ca-certificates git tzdata # Go platform binary COPY --from=go-builder /platform /platform COPY workspace-server/migrations /migrations # Templates + plugins (cloned from GitHub in stage 3) COPY --from=templates /workspace-configs-templates /workspace-configs-templates COPY --from=templates /org-templates /org-templates COPY --from=templates /plugins /plugins # Canvas standalone WORKDIR /canvas COPY --from=canvas-builder /canvas/.next/standalone ./ COPY --from=canvas-builder /canvas/.next/static ./.next/static COPY --from=canvas-builder /canvas/public ./public COPY workspace-server/entrypoint-tenant.sh /entrypoint.sh RUN chmod +x /entrypoint.sh EXPOSE 8080 CMD ["/entrypoint.sh"]