# Luminary AI Gateway（Go + Vue 管理台）
#
# 构建:
#   docker build -t luminary:latest .
#
# 运行:
#   docker run -d --name luminary \
#     -p 8293:8293 \
#     -v luminary-data:/data \
#     luminary:latest
#
# 生产镜像由 Gitea Actions 构建，见 README 与 .gitea/README.md

# syntax=docker/dockerfile:1

# 基础镜像默认 Docker Hub；CI 默认 1Panel 加速（docker.1panel.live），本地可传：
#   docker build --build-arg IMAGE_PREFIX=docker.1panel.live/library/ -t luminary:latest .
ARG IMAGE_PREFIX=

FROM --platform=$BUILDPLATFORM ${IMAGE_PREFIX}node:20-alpine AS web-builder

WORKDIR /src/web
COPY web/package.json web/package-lock.json web/.npmrc ./
RUN npm ci
COPY web/src ./src
COPY web/public ./public
COPY web/index.html web/tsconfig.json web/vite.config.ts ./
RUN npm run build

FROM --platform=$BUILDPLATFORM ${IMAGE_PREFIX}golang:1.25-alpine AS go-builder

ARG TARGETARCH=amd64
ARG GOPROXY=https://goproxy.cn,direct
ARG GOSUMDB=sum.golang.google.cn
ENV CGO_ENABLED=0 GOPROXY=${GOPROXY} GOSUMDB=${GOSUMDB}

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

COPY cmd/ ./cmd/
COPY internal/ ./internal/
COPY web/static_embed.go ./web/
COPY --from=web-builder /src/web/dist ./web/dist

RUN --mount=type=cache,target=/go/pkg/mod \
    --mount=type=cache,target=/root/.cache/go-build \
    GOOS=linux GOARCH="$TARGETARCH" \
    go build -trimpath -ldflags="-w -s" -o /luminary ./cmd/luminary \
    && go build -trimpath -ldflags="-w -s" -o /luminary-recover ./cmd/luminary-recover

ARG IMAGE_PREFIX=
FROM ${IMAGE_PREFIX}alpine:3.20

ARG APK_MIRROR=mirrors.aliyun.com
RUN sed -i "s/dl-cdn.alpinelinux.org/${APK_MIRROR}/g" /etc/apk/repositories \
    && apk add --no-cache ca-certificates tzdata tini

ENV LUMINARY_DATA=/data \
    LUMINARY_ADDR=:8293

COPY --from=go-builder /luminary /usr/local/bin/luminary
COPY --from=go-builder /luminary-recover /usr/local/bin/luminary-recover
COPY docker/entrypoint.sh /entrypoint.sh
COPY scripts/luminary-recover.sh /usr/local/bin/luminary-recover.sh
RUN chmod +x /entrypoint.sh /usr/local/bin/luminary-recover.sh

VOLUME ["/data"]
EXPOSE 8293
ENTRYPOINT ["/sbin/tini", "--", "/entrypoint.sh"]
