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:
@@ -3,14 +3,19 @@
|
||||
# =====================================================
|
||||
# 使用:
|
||||
# 1) cp .env.example .env 并修改 SECRET_KEY
|
||||
# 2) docker compose -f deploy/nas/docker-compose.yaml up -d
|
||||
# 3) 访问 http://NAS_IP:5000
|
||||
# 2) mkdir -p data && cp ../pear.db data/pear.db # 首次部署把已有库搬过来
|
||||
# 3) docker compose -f deploy/nas/docker-compose.yaml up -d
|
||||
# 4) 访问 http://NAS_IP:5000
|
||||
#
|
||||
# 数据持久化:
|
||||
# - pear_db:SQLite 数据库文件
|
||||
# - flask_logs:容器内 /app/logs(gunicorn + Flask 日志)
|
||||
# - flask_session:Flask-Session 文件会话
|
||||
# - flask_upload:上传的图片/文件
|
||||
# 数据持久化(一个目录搞定):
|
||||
# ./data → 容器内 /app/data
|
||||
# ├─ pear.db pear.db-wal pear.db-shm ← SQLite(WAL 模式)
|
||||
# ├─ backup/ ← 在线热备(VACUUM INTO 产物)
|
||||
# ├─ flask_session/ ← Flask-Session 文件
|
||||
# ├─ logs/ ← gunicorn / Flask 日志
|
||||
# └─ upload/ ← 上传图片
|
||||
#
|
||||
# 重建容器 / 换机器:整个 ./data 目录拷走就行,pear.db、备份、上传全在里面。
|
||||
# =====================================================
|
||||
|
||||
services:
|
||||
@@ -27,13 +32,14 @@ services:
|
||||
# 环境变量注入(生产环境用 .env 自动读取)
|
||||
env_file:
|
||||
- ../../.env
|
||||
environment:
|
||||
# 把容器内的 /app/data 重定向到宿主 ./data;
|
||||
# config.py 会自动把 SQLite 库、session、logs、backup 都收到这里
|
||||
PEAR_DATA_DIR: /app/data
|
||||
|
||||
# 数据持久化卷(NAS 上是命名卷;如想直挂目录,把左边改为宿主路径)
|
||||
# 数据持久化:单一绑定挂载,NAS 共享文件夹里直接看得见
|
||||
volumes:
|
||||
- pear_db:/app/pear.db # SQLite 数据库
|
||||
- flask_logs:/app/logs # gunicorn / Flask 日志
|
||||
- flask_session:/app/flask_session # Flask-Session 文件会话
|
||||
- flask_upload:/app/static/upload # 上传的图片
|
||||
- ./data:/app/data
|
||||
|
||||
# 资源限制(NAS 推荐;按需调整)
|
||||
deploy:
|
||||
@@ -61,21 +67,11 @@ services:
|
||||
- pear_net
|
||||
|
||||
# =====================================================
|
||||
# 命名卷:首次 `docker compose up` 自动创建
|
||||
# 查看: docker volume ls | grep pear
|
||||
# 备份: docker run --rm -v pear-admin-nas_pear_db:/data -v $(pwd)/bak:/backup \
|
||||
# alpine cp /data/pear.db /backup/pear-$(date +%F).db
|
||||
# 单数据卷已够用:
|
||||
# - 重建容器:只会重建容器层,./data 完全不受影响
|
||||
# - 备份:NAS 上定时把 ./data 整个 tar 走,或跑 deploy/nas/backup.sh 单独导出 pear.db
|
||||
# - 迁移:停容器、把 ./data 拷到新机器、起新容器,pear.db 内容原样可用
|
||||
# =====================================================
|
||||
volumes:
|
||||
pear_db:
|
||||
name: pear-admin-nas_pear_db
|
||||
flask_logs:
|
||||
name: pear-admin-nas_logs
|
||||
flask_session:
|
||||
name: pear-admin-nas_session
|
||||
flask_upload:
|
||||
name: pear-admin-nas_upload
|
||||
|
||||
networks:
|
||||
pear_net:
|
||||
driver: bridge
|
||||
Reference in New Issue
Block a user