Files
matrix/Dockerfile
T
Matrix Music Bot Dev f55e28ee1d docker: 多阶段 Dockerfile + docker-compose.yml + .dockerignore + .env.example
按用户选定方案:

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 部署章节
2026-07-02 23:54:36 +08:00

91 lines
3.6 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# syntax=docker/dockerfile:1.7
# ============================================================
# Stage 1: builder —— 编译 matrix-music-bot (Linux native)
# ============================================================
FROM rust:1.96-bookworm AS builder
# 安装编译期依赖:
# - pkg-config + libsqlite3-devmatrix-sdk-sqlite 需要
# - libssl-devmatrix-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-0matrix-sdk-sqlite 链接的运行时
# - libssl3matrix-sdk-crypto 链接的运行时
# - ca-certificatesmatrix-sdk HTTPS 调用
# - tiniPID 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"]