# ===================================================== # 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