# syntax=docker/dockerfile:1
#
# 正式環境映像（GCP VM 部署用）。
# 與上游 live_server/Dockerfile 的差異只有一處：最終階段多一行
# `COPY live_server/app ./app`，讓映像「自帶程式碼」，這樣每個映像
# 標籤（commit sha）才是完整、可回滾的版本（上游映像不含 app，靠 volume 掛載）。
#
# 建置（build context 必須是 repo 根目錄）：
#   docker build -f deploy/Dockerfile -t app:test .

# 1. Build Stage：把相依套件裝進虛擬環境（沿用上游）
FROM python:3.11-slim AS build

# 釘版本，避免 latest 造成不可重現的建置
COPY --from=ghcr.io/astral-sh/uv:0.11.6 /uv /uvx /bin/

WORKDIR /app

RUN uv venv

COPY live_server/pyproject.toml live_server/uv.lock ./

RUN --mount=type=cache,target=/root/.cache/uv \
    uv sync

# 2. Final Stage：正式映像
FROM python:3.11-slim

WORKDIR /app

# 來源標示（OCI labels）：標示本映像由哪個上游版本修改而來（上游基底）。
# 工作流程會依 deploy/site.env 的 UPSTREAM_SOURCE_URL 覆寫這兩個值。
# 使用者取得原始碼的管道不是這裡，而是網站的 /source/（見 deploy/README.md 第 3 節）。
ARG SOURCE_REPOSITORY_URL="https://github.com/g0v/OpenTransLive"
ARG SOURCE_REVISION="a4ced36a4e80467ccc81007ab719c3ade590651b"
LABEL org.opencontainers.image.source="${SOURCE_REPOSITORY_URL}" \
      org.opencontainers.image.revision="${SOURCE_REVISION}"

COPY --from=build /app/.venv ./.venv

# 程式碼進映像。app/secret/config.toml 被 Dockerfile.dockerignore 排除，
# 執行時由 compose 以唯讀 volume 掛入 deploy/config.prod.toml。
COPY live_server/app ./app

EXPOSE 5000

# 與上游 docker-compose.yml 的 command 完全相同：
#   單 worker（Socket.IO 與轉錄 session 狀態在程序記憶體內）、
#   timeout-graceful-shutdown 5（SSE 長連線不會自己結束）。
CMD ["./.venv/bin/uvicorn", "app:socket_app", "--host", "0.0.0.0", "--port", "5000", "--workers", "1", "--ws", "websockets", "--timeout-graceful-shutdown", "5"]
