f55e28ee1d
按用户选定方案: 1. 多阶段 Debian bookworm-slim - builder=rust:1.96-bookworm(含 pkg-config libsqlite3-dev libssl-dev) - runtime=debian:bookworm-slim(ffmpeg libsqlite3-0 libssl3 tini ca-certificates) - 利用 Docker 层缓存:先预编译 deps 再复制 src 2. yt-dlp standalone 二进制 - ARG YTDLP_VERSION=2026.03.17 - 用 ADD --checksum=sha256 校验 - 与 README 中版本一致便于锁版本 3. 全部 bind mount - ./config → /app/config:ro(配置只读) - ./data → /app/data(secret.bin / crypto.db / cache/) 4. 单服务 docker-compose - 重启策略 unless-stopped - 资源限制 2 CPU + 1G RAM - 健康检查 pgrep - MATRIX_BOT_SECRET_PASSPHRASE 从 .env 必填 - RUST_LOG 默认 info + matrix_music_bot=debug 安全要点: - 非 root 用户(bot:bot) - tini 作为 PID 1(正确转发 SIGTERM/SIGINT) - 健康检查:仅进程存活检测(bot 没有 health endpoint) .dockerignore 排除: - /target /data /config /tests /docs 等 - 减少 build context 大小(避免每次 build 重复传输) .env.example: - 模板文件,含 MATRIX_BOT_SECRET_PASSPHRASE 默认值 - RUST_LOG 默认值 下一步:补充 README.md + CLAUDE.md 的 Docker 部署章节
91 lines
3.6 KiB
Docker
91 lines
3.6 KiB
Docker
# 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"] |