- 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 流程)
77 lines
3.0 KiB
YAML
77 lines
3.0 KiB
YAML
# =====================================================
|
||
# Pear Admin Flask - 个人 NAS 单机部署
|
||
# =====================================================
|
||
# 使用:
|
||
# 1) cp .env.example .env 并修改 SECRET_KEY
|
||
# 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
|
||
#
|
||
# 数据持久化(一个目录搞定):
|
||
# ./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:
|
||
flask:
|
||
build:
|
||
context: ../.. # 项目根目录(含 requirements.txt)
|
||
dockerfile: deploy/nas/Dockerfile
|
||
image: pear-admin-nas:latest
|
||
container_name: pear-admin-nas
|
||
restart: unless-stopped
|
||
ports:
|
||
- "5000:5000" # 容器 5000 → NAS 5000;可改为 127.0.0.1:5000:5000 仅本地访问
|
||
|
||
# 环境变量注入(生产环境用 .env 自动读取)
|
||
env_file:
|
||
- ../../.env
|
||
environment:
|
||
# 把容器内的 /app/data 重定向到宿主 ./data;
|
||
# config.py 会自动把 SQLite 库、session、logs、backup 都收到这里
|
||
PEAR_DATA_DIR: /app/data
|
||
|
||
# 数据持久化:单一绑定挂载,NAS 共享文件夹里直接看得见
|
||
volumes:
|
||
- ./data:/app/data
|
||
|
||
# 资源限制(NAS 推荐;按需调整)
|
||
deploy:
|
||
resources:
|
||
limits:
|
||
cpus: '2.0' # 单容器最多用 2 核
|
||
memory: 1024M # 1 GB 上限
|
||
reservations:
|
||
cpus: '0.5'
|
||
memory: 256M
|
||
|
||
# 健康检查:applications/view/health.py 提供 /healthz
|
||
# - 200:DB OK
|
||
# - 503:DB 不可达(让容器被标 unhealthy)
|
||
healthcheck:
|
||
test: ["CMD", "curl", "-fsS", "http://localhost:5000/healthz"]
|
||
interval: 30s
|
||
timeout: 10s
|
||
start_period: 40s
|
||
retries: 3
|
||
|
||
# 网络模式默认 bridge;如 NAS 上启用了 host 网络可获得更好的局域网性能:
|
||
# network_mode: host
|
||
networks:
|
||
- pear_net
|
||
|
||
# =====================================================
|
||
# 单数据卷已够用:
|
||
# - 重建容器:只会重建容器层,./data 完全不受影响
|
||
# - 备份:NAS 上定时把 ./data 整个 tar 走,或跑 deploy/nas/backup.sh 单独导出 pear.db
|
||
# - 迁移:停容器、把 ./data 拷到新机器、起新容器,pear.db 内容原样可用
|
||
# =====================================================
|
||
networks:
|
||
pear_net:
|
||
driver: bridge |