# 编译独立 ComfyUI Bridge 下载产物。
ARG GO_IMAGE=golang:1.25-alpine
ARG BUN_IMAGE=oven/bun:1.3.14
ARG NODE_IMAGE=node:22-bookworm-slim
ARG GOPROXY=https://goproxy.cn,direct
FROM ${GO_IMAGE} AS bridge-build
ARG GOPROXY
ENV GOPROXY=${GOPROXY}

WORKDIR /app/canvas-agent/native/comfy-bridge
COPY canvas-agent/native/comfy-bridge ./
RUN mkdir -p /bridge && GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -o /bridge/InfiniteCanvas-ComfyBridge.exe . \
    && GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o /bridge/InfiniteCanvas-ComfyBridge-linux-amd64 . \
    && GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o /bridge/InfiniteCanvas-ComfyBridge-linux-arm64 .

# 构建 Next.js 前端产物。
FROM ${BUN_IMAGE} AS web-build

WORKDIR /app/web
COPY web/package.json web/bun.lock ./
ARG BUN_REGISTRY=https://registry.npmmirror.com
RUN --mount=type=cache,target=/root/.bun/install/cache bun install --frozen-lockfile --registry=${BUN_REGISTRY} --cache-dir=/root/.bun/install/cache
COPY VERSION /app/VERSION
COPY CHANGELOG.md /app/CHANGELOG.md
COPY web ./
COPY canvas-agent/scripts /app/canvas-agent/scripts
COPY --from=bridge-build /bridge/ /app/web/public/
ENV CANVAS_PREBUILT_BRIDGE=1
ARG CANVAS_BYOK_ONLY=false
ENV NEXT_PUBLIC_CANVAS_BYOK_ONLY=${CANVAS_BYOK_ONLY}
ENV NEXT_TELEMETRY_DISABLED=1
RUN bun run typecheck && bun run build

# 构建 Go 后端入口。
FROM ${GO_IMAGE} AS api-build
ARG GOPROXY
ENV GOPROXY=${GOPROXY}

WORKDIR /app
COPY go.mod go.sum ./
COPY config ./config
COPY handler ./handler
COPY middleware ./middleware
COPY model ./model
COPY repository ./repository
COPY router ./router
COPY service ./service
COPY main.go ./
RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build CGO_ENABLED=0 go build -o /server .

FROM ${BUN_IMAGE} AS source-build
WORKDIR /source
COPY . .
RUN tar -czf /source.tar.gz .

# 运行镜像：Next.js 对外监听 3000，Go 只在容器内部监听 8080。
FROM ${NODE_IMAGE}

WORKDIR /app
COPY VERSION /app/VERSION
COPY CHANGELOG.md /app/CHANGELOG.md
COPY --from=api-build /server /app/server
COPY docker-entrypoint.sh /app/docker-entrypoint.sh
RUN chmod +x /app/docker-entrypoint.sh
COPY --from=web-build /app/web/public /app/web/public
COPY --from=web-build /app/web/.next/standalone /app/web
COPY --from=web-build /app/web/.next/static /app/web/.next/static
COPY --from=source-build /source.tar.gz /app/web/public/source/source.tar.gz
ARG BUILD_REVISION=development
ARG CANVAS_BYOK_ONLY=false
LABEL org.opencontainers.image.revision=${BUILD_REVISION}
LABEL org.opencontainers.image.source="https://github.com/tigerowo/infinite-canvas"
ENV CANVAS_BUILD_REVISION=${BUILD_REVISION}
ENV CANVAS_BYOK_ONLY=${CANVAS_BYOK_ONLY}
ENV NEXT_TELEMETRY_DISABLED=1
ENV NODE_ENV=production
ENV HOSTNAME=0.0.0.0
ENV PORT=3000
ENV PROMPT_DATA_DIR=/app/data/prompts
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && rm -rf /var/lib/apt/lists/*
RUN mkdir -p /app/data/prompts

EXPOSE 3000
# 先启动内部 Go API，再由 Next.js 提供页面并代理 /api/*。
CMD ["/app/docker-entrypoint.sh"]
