Files
pear-admin-flask/deploy/nas/docker-compose.yaml
T
bwstudio be99b8a925 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 流程)
2026-09-06 19:43:28 +08:00

77 lines
3.0 KiB
YAML
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.
# =====================================================
# 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 ← SQLiteWAL 模式)
# ├─ 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
# - 200DB OK
# - 503DB 不可达(让容器被标 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