# syntax=docker/dockerfile:1.7

# ============================================================
# Stage 1: builder —— 编译 matrix-music-bot (Linux native)
# ============================================================
FROM rust:1.96-bookworm AS builder

# 安装编译期依赖：
#   - pkg-config + libsqlite3-dev：matrix-sdk-sqlite 需要
#   - libssl-dev：matrix-sdk-crypto 的某些依赖可能需要
#   - build-essential：少数 crate 的 build.rs 链 C 代码
#   - ca-certificates：编译期 + 运行时 HTTPS 调用都需要
RUN apt-get update && apt-get install -y --no-install-recommends \
        pkg-config \
        libsqlite3-dev \
        libssl-dev \
        build-essential \
        ca-certificates \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /build

# 先复制 Cargo.toml/Cargo.lock 并预编译依赖（利用 Docker 层缓存）
COPY Cargo.toml Cargo.lock ./
RUN mkdir -p src && \
    echo 'fn main() { println!("placeholder"); }' > src/main.rs && \
    echo '' > src/lib.rs && \
    cargo build --release --locked && \
    rm -rf src target/release/deps/matrix_music_bot* target/release/matrix-music-bot

# 复制真实源码并编译
COPY src ./src
# 使用与项目一致的 GNU 工具链（rust:bookworm 是 glibc，无需 .cargo/config.toml）
RUN cargo build --release --locked --bin matrix-music-bot && \
    strip target/release/matrix-music-bot

# ============================================================
# Stage 2: runtime —— 最小化运行时镜像
# ============================================================
FROM debian:bookworm-slim AS runtime

# 安装运行时依赖：
#   - ffmpeg：音频转码
#   - libsqlite3-0：matrix-sdk-sqlite 链接的运行时
#   - libssl3：matrix-sdk-crypto 链接的运行时
#   - ca-certificates：matrix-sdk HTTPS 调用
#   - tini：PID 1 信号转发（处理 Ctrl-C / SIGTERM）
RUN apt-get update && apt-get install -y --no-install-recommends \
        ffmpeg \
        libsqlite3-0 \
        libssl3 \
        ca-certificates \
        tini \
    && rm -rf /var/lib/apt/lists/*

# 下载 yt-dlp standalone 二进制（最新 stable）
ARG YTDLP_VERSION=2026.03.17
ARG TARGETARCH=amd64
# yt-dlp 官方 Linux 构建为通用二进制，musl 兼容，直接下载即可
ADD --checksum=sha256:https://github.com/yt-dlp/yt-dlp/releases/download/${YTDLP_VERSION}/yt-dlp_sha256sums.txt \
    https://github.com/yt-dlp/yt-dlp/releases/download/${YTDLP_VERSION}/yt-dlp \
    /usr/local/bin/yt-dlp
RUN chmod +x /usr/local/bin/yt-dlp && \
    /usr/local/bin/yt-dlp --version

# 创建非 root 用户（安全）
RUN groupadd -r bot && useradd -r -g bot -d /app -s /sbin/nologin bot && \
    mkdir -p /app/data /app/config && \
    chown -R bot:bot /app

# 从 builder 复制编译产物
COPY --from=builder --chown=bot:bot /build/target/release/matrix-music-bot /usr/local/bin/matrix-music-bot

# 设置工作目录与用户
WORKDIR /app
USER bot

# 数据卷（建议通过 docker-compose bind mount）
#   /app/config   配置目录（bot.toml 等）
#   /app/data     运行时数据（secret.bin / crypto.db / cache/）
VOLUME ["/app/data"]

# 健康检查：matrix-music-bot 没有内置健康端点，仅做进程存活检查
# 注：本 bot 的"健康"是 homeserver 连接 + sync 状态，目前只能通过 process 状态判断
HEALTHCHECK --interval=60s --timeout=10s --start-period=30s --retries=3 \
    CMD pgrep -x matrix-music-bot > /dev/null || exit 1

# tini 作为 PID 1，正确转发 SIGTERM/SIGINT 给 bot 进程
ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/matrix-music-bot"]
# 默认子命令；docker-compose 可通过 command 覆盖
CMD ["run"]