# syntax=docker/dockerfile:1.7
ARG NODE_IMAGE=node:22.23.3-bookworm-slim
ARG GO_IMAGE=golang:1.26.8-bookworm
ARG RUNTIME_IMAGE=debian:bookworm-20260918-slim

FROM ${NODE_IMAGE} AS source
WORKDIR /src
COPY . .
ARG VERSION=0.1.0
ARG SOURCE_REVISION=local
ARG SOURCE_DATE_EPOCH=0
RUN node scripts/build-source.mjs --root /src --output /out/orbitmail-source.tar.gz \
    --version "$VERSION" --revision "$SOURCE_REVISION" --epoch "$SOURCE_DATE_EPOCH"

FROM source AS frontend
ENV CYPRESS_INSTALL_BINARY=0
WORKDIR /src/frontend/email-builder
RUN yarn install --frozen-lockfile --non-interactive && yarn build
WORKDIR /src/frontend
RUN yarn install --frozen-lockfile --non-interactive && yarn build \
    && mkdir -p dist/static/email-builder \
    && cp -a email-builder/dist/. dist/static/email-builder/

FROM ${GO_IMAGE} AS backend
ENV CGO_ENABLED=0 GOTOOLCHAIN=local
WORKDIR /src
COPY go.mod go.sum ./
COPY internal/third_party/smtppool/go.mod ./internal/third_party/smtppool/go.mod
RUN --mount=type=cache,target=/go/pkg/mod go mod download \
    && go install github.com/knadh/stuffbin/stuffbin@v1.3.0
COPY --from=source /src /src
COPY --from=frontend /src/frontend/dist /src/frontend/dist
COPY --from=frontend /src/frontend/email-builder/dist /src/frontend/email-builder/dist
COPY --from=frontend /src/static/public/static/altcha.umd.js /src/static/public/static/altcha.umd.js
COPY --from=source /out/orbitmail-source.tar.gz /src/static/public/static/orbitmail-source.tar.gz
COPY --from=source /out/orbitmail-release.json /src/static/public/static/orbitmail-release.json
ARG VERSION=0.1.0
ARG SOURCE_REVISION=local
RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build \
    go build -trimpath -buildvcs=false \
    -ldflags="-s -w -X main.versionString=v${VERSION} -X main.buildString=OrbitMail-v${VERSION}-${SOURCE_REVISION}" \
    -o /out/orbitmail.unstuffed ./cmd \
    && stuffbin -a stuff -in /out/orbitmail.unstuffed -out /out/orbitmail \
    ./config.toml.sample:/config.toml.sample ./schema.sql:/schema.sql \
    ./permissions.json:/permissions.json ./queries:/queries ./i18n:/i18n \
    ./static/email-templates:/static/email-templates ./static/public:/public \
    ./frontend/dist:/admin ./VERSION:/VERSION \
    && chmod 0755 /out/orbitmail && /out/orbitmail --version

FROM ${RUNTIME_IMAGE} AS runtime
RUN apt-get update && apt-get install --no-install-recommends -y ca-certificates curl \
    && rm -rf /var/lib/apt/lists/* \
    && groupadd --gid 10001 orbitmail \
    && useradd --uid 10001 --gid 10001 --no-create-home --shell /usr/sbin/nologin orbitmail \
    && install -d -o 10001 -g 10001 /app/uploads /usr/share/doc/orbitmail
WORKDIR /app
COPY --from=backend --chown=10001:10001 /out/orbitmail /app/orbitmail
COPY scripts/deploy.config.toml /app/config.toml
COPY LICENSE NOTICE /usr/share/doc/orbitmail/
COPY frontend/email-builder/LICENSE /usr/share/doc/orbitmail/email-builder-LICENSE
COPY internal/third_party/smtppool/LICENSE /usr/share/doc/orbitmail/smtppool-LICENSE
ARG VERSION=0.1.0
ARG SOURCE_REVISION=local
LABEL org.opencontainers.image.title="OrbitMail" \
      org.opencontainers.image.source="https://github.com/moolbneid-org/OrbitMail" \
      org.opencontainers.image.licenses="AGPL-3.0-only" \
      org.opencontainers.image.version="${VERSION}" \
      org.opencontainers.image.revision="${SOURCE_REVISION}"
USER 10001:10001
EXPOSE 9000
HEALTHCHECK --interval=20s --timeout=5s --start-period=20s --retries=5 \
    CMD curl --fail --silent --show-error http://127.0.0.1:9000/health >/dev/null || exit 1
ENTRYPOINT ["/app/orbitmail", "--config", "/app/config.toml"]
