feat(data): 数据库搬到 data/ 目录 + SQLite WAL + 单卷绑定挂载

- config.py 新增 PEAR_DATA_DIR(默认 <项目根>/data),SQLite 库、Flask-Session
  统一收进 DATA_DIR;不设时本地开发行为不变
- applications/__init__.py 顶部先 load_dotenv,保证 .env 里的 PEAR_DATA_DIR
  在 config 导入时就生效
- extensions/init_sqlalchemy.py 接 SQLite connect 事件:WAL + synchronous=NORMAL
  + busy_timeout=30s(多 worker 写不再撞锁)
- config.py 注入 SQLALCHEMY_ENGINE_OPTIONS(pool_pre_ping + SQLite connect_args
  超时;MySQL 路径下自动跳过 connect_args 防止参数错误)
- 新增 alembic 迁移 a47a5d2a3f1b 建 site_nav_click(含 anon_id 字段),
  解决之前该表只由 db.create_all 建、不在迁移链里的隐患
- .gitignore / .dockerignore 加 data/ 排除规则(且把 migrations/ 从
  ignore 里重新放行 —— 否则新加的迁移进不了库)
- NAS Docker 部署全面重写:
  - compose 唯一绑定挂载 ./data:/app/data,宿主 File Station 看得见
  - start.sh 自检 data 目录 + 子目录;workers 默认改为 1 threads 8
    (SQLite 写串行,单进程最稳)
  - 新增 backup.sh:sqlite3 .backup 在线热备(确保 WAL 一致性)+ 压缩
    + 保留 14 天
  - Dockerfile 安装 sqlite3 客户端备用,建 /app/data 子目录并 chown
- docs/deployment-nas.md 重写数据持久化章节(路径表 + 热备命令 +
  恢复步骤 + 整库迁移 tar/untar 流程)
This commit is contained in:
bwstudio
2026-09-06 19:43:28 +08:00
parent 34e8010830
commit be99b8a925
12 changed files with 347 additions and 95 deletions
+9 -2
View File
@@ -16,12 +16,13 @@ ENV TZ=Asia/Shanghai \
PIP_DISABLE_PIP_VERSION_CHECK=1 \
PIP_NO_CACHE_DIR=1 \
PEAR_ENV=pro \
PEAR_DATA_DIR=/app/data \
FLASK_APP=app.py
# 安装时区数据 + 健康检查用的 curl
# (curl 在 slim 里已有,但保持显式声明便于以后切到 alpine)
RUN apt-get update \
&& apt-get install -y --no-install-recommends curl tzdata \
&& apt-get install -y --no-install-recommends curl tzdata sqlite3 \
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
&& echo $TZ > /etc/timezone \
&& rm -rf /var/lib/apt/lists/*
@@ -39,8 +40,14 @@ RUN pip install -r requirements.txt \
# 再 copy 全部源码
COPY --chown=appuser:appuser . .
# 数据目录单独建好并 chown 给 appuseruid 1001)。
# /app/data 由卷挂载覆盖,但容器刚启动时如果宿主目录是空的,
# 子目录(backup/ flask_session/ 等)需要 appuser 自己能写。
RUN mkdir -p /app/data/backup /app/data/flask_session /app/data/logs /app/data/upload \
&& chown -R appuser:appuser /app/data
# 启动脚本加执行权限
RUN chmod +x /app/deploy/nas/start.sh
RUN chmod +x /app/deploy/nas/start.sh /app/deploy/nas/backup.sh
# 切换到非 root
USER appuser