mirror of
https://github.com/JefferyHcool/BiliNote.git
synced 2026-07-12 16:11:34 +08:00
fix(docker): 预构建镜像持久化数据库/笔记,修升级丢配置与历史
README 的 docker run 只挂了 -v …:/app/backend/data(仅媒体缓存),但 SQLite 库在 /app/backend/bili_note.db、笔记在 /app/backend/note_results 都不在该卷下 → 用户删容器重建(如 docker pull 升级镜像)会丢失 LLM 供应商配置和全部笔记历史。 - Dockerfile.complete:DATABASE_URL 重定向到 /app/backend/data/bili_note.db、 NOTE_OUTPUT_DIR 改到 data/note_results,并预建 /app/backend/data 目录; 两条 supervisord environment 行同步(兜底默认值 + %(ENV_*)s 透传)。 - README:docker run 改挂 data(库+笔记)/ config(供应商·Cookie·转写配置)/ static(截图)/ models(模型缓存,可选)四个数据卷,并警告不要挂整个 /app/backend(命名卷会固化镜像内代码,导致 docker pull 升级不生效)。 - docker-build.yml:同步发布说明里 echo 的 run 命令。 截图仍留在 /app/backend/static(static_dir 硬编码服务,不能重定向),单独挂卷。 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
3
.github/workflows/docker-build.yml
vendored
3
.github/workflows/docker-build.yml
vendored
@@ -66,6 +66,9 @@ jobs:
|
|||||||
echo "Run the container:"
|
echo "Run the container:"
|
||||||
echo " docker run -d -p 80:80 \\"
|
echo " docker run -d -p 80:80 \\"
|
||||||
echo " -v bilinote-data:/app/backend/data \\"
|
echo " -v bilinote-data:/app/backend/data \\"
|
||||||
|
echo " -v bilinote-config:/app/backend/config \\"
|
||||||
|
echo " -v bilinote-static:/app/backend/static \\"
|
||||||
|
echo " -v bilinote-models:/app/backend/models \\"
|
||||||
echo " --name bilinote \\"
|
echo " --name bilinote \\"
|
||||||
echo " ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest"
|
echo " ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest"
|
||||||
echo ""
|
echo ""
|
||||||
|
|||||||
@@ -95,14 +95,16 @@ COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
|
|||||||
# 在 [supervisord] 块用 environment= 设兜底默认值;在 [program:backend] 用
|
# 在 [supervisord] 块用 environment= 设兜底默认值;在 [program:backend] 用
|
||||||
# %(ENV_*)s 显式引用,等价于「把 host 通过 docker run -e 或 env_file 传进来的
|
# %(ENV_*)s 显式引用,等价于「把 host 通过 docker run -e 或 env_file 传进来的
|
||||||
# 变量再透传给 python main.py」。漏掉这一步就是用户「改 .env 没反应」的根因。
|
# 变量再透传给 python main.py」。漏掉这一步就是用户「改 .env 没反应」的根因。
|
||||||
RUN mkdir -p /var/log/supervisor
|
# /app/backend/data 用于持久化数据库与笔记(见下方 DATABASE_URL / NOTE_OUTPUT_DIR),
|
||||||
|
# 预建好目录,避免不挂卷启动时 sqlite 因父目录不存在而创建库失败。
|
||||||
|
RUN mkdir -p /var/log/supervisor /app/backend/data
|
||||||
COPY <<EOF /etc/supervisor/conf.d/supervisord.conf
|
COPY <<EOF /etc/supervisor/conf.d/supervisord.conf
|
||||||
[supervisord]
|
[supervisord]
|
||||||
nodaemon=true
|
nodaemon=true
|
||||||
user=root
|
user=root
|
||||||
logfile=/var/log/supervisor/supervisord.log
|
logfile=/var/log/supervisor/supervisord.log
|
||||||
pidfile=/var/run/supervisord.pid
|
pidfile=/var/run/supervisord.pid
|
||||||
environment=BACKEND_PORT="8483",BACKEND_HOST="0.0.0.0",TRANSCRIBER_TYPE="fast-whisper",WHISPER_MODEL_SIZE="tiny",FFMPEG_BIN_PATH="",HF_ENDPOINT="https://hf-mirror.com",STATIC="/static",OUT_DIR="./static/screenshots",DATA_DIR="data",NOTE_OUTPUT_DIR="note_results",IMAGE_BASE_URL="/static/screenshots",ENV="production",GROQ_TRANSCRIBER_MODEL="whisper-large-v3-turbo"
|
environment=BACKEND_PORT="8483",BACKEND_HOST="0.0.0.0",TRANSCRIBER_TYPE="fast-whisper",WHISPER_MODEL_SIZE="tiny",FFMPEG_BIN_PATH="",HF_ENDPOINT="https://hf-mirror.com",STATIC="/static",OUT_DIR="./static/screenshots",DATA_DIR="data",NOTE_OUTPUT_DIR="data/note_results",DATABASE_URL="sqlite:////app/backend/data/bili_note.db",IMAGE_BASE_URL="/static/screenshots",ENV="production",GROQ_TRANSCRIBER_MODEL="whisper-large-v3-turbo"
|
||||||
|
|
||||||
[program:nginx]
|
[program:nginx]
|
||||||
command=nginx -g "daemon off;"
|
command=nginx -g "daemon off;"
|
||||||
@@ -118,7 +120,7 @@ stdout_logfile=/var/log/supervisor/backend.log
|
|||||||
stderr_logfile=/var/log/supervisor/backend.log
|
stderr_logfile=/var/log/supervisor/backend.log
|
||||||
autorestart=true
|
autorestart=true
|
||||||
priority=20
|
priority=20
|
||||||
environment=BACKEND_PORT="%(ENV_BACKEND_PORT)s",BACKEND_HOST="%(ENV_BACKEND_HOST)s",TRANSCRIBER_TYPE="%(ENV_TRANSCRIBER_TYPE)s",WHISPER_MODEL_SIZE="%(ENV_WHISPER_MODEL_SIZE)s",FFMPEG_BIN_PATH="%(ENV_FFMPEG_BIN_PATH)s",HF_ENDPOINT="%(ENV_HF_ENDPOINT)s",STATIC="%(ENV_STATIC)s",OUT_DIR="%(ENV_OUT_DIR)s",DATA_DIR="%(ENV_DATA_DIR)s",NOTE_OUTPUT_DIR="%(ENV_NOTE_OUTPUT_DIR)s",IMAGE_BASE_URL="%(ENV_IMAGE_BASE_URL)s",ENV="%(ENV_ENV)s",GROQ_TRANSCRIBER_MODEL="%(ENV_GROQ_TRANSCRIBER_MODEL)s"
|
environment=BACKEND_PORT="%(ENV_BACKEND_PORT)s",BACKEND_HOST="%(ENV_BACKEND_HOST)s",TRANSCRIBER_TYPE="%(ENV_TRANSCRIBER_TYPE)s",WHISPER_MODEL_SIZE="%(ENV_WHISPER_MODEL_SIZE)s",FFMPEG_BIN_PATH="%(ENV_FFMPEG_BIN_PATH)s",HF_ENDPOINT="%(ENV_HF_ENDPOINT)s",STATIC="%(ENV_STATIC)s",OUT_DIR="%(ENV_OUT_DIR)s",DATA_DIR="%(ENV_DATA_DIR)s",NOTE_OUTPUT_DIR="%(ENV_NOTE_OUTPUT_DIR)s",DATABASE_URL="%(ENV_DATABASE_URL)s",IMAGE_BASE_URL="%(ENV_IMAGE_BASE_URL)s",ENV="%(ENV_ENV)s",GROQ_TRANSCRIBER_MODEL="%(ENV_GROQ_TRANSCRIBER_MODEL)s"
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# 修改 nginx 配置以使用本地 backend
|
# 修改 nginx 配置以使用本地 backend
|
||||||
|
|||||||
14
README.md
14
README.md
@@ -163,10 +163,17 @@ docker pull ghcr.io/jefferyhcool/bilinote:latest
|
|||||||
|
|
||||||
docker run -d -p 80:80 \
|
docker run -d -p 80:80 \
|
||||||
-v bilinote-data:/app/backend/data \
|
-v bilinote-data:/app/backend/data \
|
||||||
|
-v bilinote-config:/app/backend/config \
|
||||||
|
-v bilinote-static:/app/backend/static \
|
||||||
|
-v bilinote-models:/app/backend/models \
|
||||||
--name bilinote \
|
--name bilinote \
|
||||||
ghcr.io/jefferyhcool/bilinote:latest
|
ghcr.io/jefferyhcool/bilinote:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
|
上面四个卷分别持久化:`data`(SQLite 数据库 + 生成的笔记)、`config`(LLM 供应商配置 / Cookie / 转写设置)、`static`(笔记引用的视频截图)、`models`(Whisper 模型缓存,可选,避免每次重新下载)。这样 `docker pull` 升级新镜像、删旧容器重建后,配置和历史都不会丢。
|
||||||
|
|
||||||
|
> ⚠️ **不要**用 `-v 卷名:/app/backend` 挂整个后端目录——命名卷会用首次启动时的镜像内容固化,之后 `docker pull` 升级也会被旧代码盖住,导致「升级不生效」。只挂上面这些数据子目录即可。
|
||||||
|
|
||||||
访问:`http://localhost`
|
访问:`http://localhost`
|
||||||
|
|
||||||
也可以使用 docker-compose 本地构建:
|
也可以使用 docker-compose 本地构建:
|
||||||
@@ -302,10 +309,17 @@ docker pull ghcr.io/jefferyhcool/bilinote:latest
|
|||||||
# 运行容器
|
# 运行容器
|
||||||
docker run -d -p 80:80 \
|
docker run -d -p 80:80 \
|
||||||
-v bilinote-data:/app/backend/data \
|
-v bilinote-data:/app/backend/data \
|
||||||
|
-v bilinote-config:/app/backend/config \
|
||||||
|
-v bilinote-static:/app/backend/static \
|
||||||
|
-v bilinote-models:/app/backend/models \
|
||||||
--name bilinote \
|
--name bilinote \
|
||||||
ghcr.io/jefferyhcool/bilinote:latest
|
ghcr.io/jefferyhcool/bilinote:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
|
上面四个卷分别持久化:`data`(SQLite 数据库 + 生成的笔记)、`config`(LLM 供应商配置 / Cookie / 转写设置)、`static`(笔记引用的视频截图)、`models`(Whisper 模型缓存,可选,避免每次重新下载)。这样 `docker pull` 升级新镜像、删旧容器重建后,配置和历史都不会丢。
|
||||||
|
|
||||||
|
> ⚠️ **不要**用 `-v 卷名:/app/backend` 挂整个后端目录——命名卷会用首次启动时的镜像内容固化,之后 `docker pull` 升级也会被旧代码盖住,导致「升级不生效」。只挂上面这些数据子目录即可。
|
||||||
|
|
||||||
访问:`http://localhost`
|
访问:`http://localhost`
|
||||||
|
|
||||||
也可以使用 docker-compose 本地构建:
|
也可以使用 docker-compose 本地构建:
|
||||||
|
|||||||
Reference in New Issue
Block a user