- 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 流程)
52 lines
2.1 KiB
Bash
52 lines
2.1 KiB
Bash
# =====================================================
|
||
# Pear Admin Flask - 生产环境变量模板
|
||
# =====================================================
|
||
# 使用方式:
|
||
# 1. 复制本文件为 .env: cp .env.example .env
|
||
# 2. 修改 SECRET_KEY 为强随机值(必填)
|
||
# 3. 邮件 / 数据库如不需要可保持注释状态
|
||
# 4. docker compose 会自动读取同级目录的 .env
|
||
# =====================================================
|
||
|
||
# ---- 运行模式 ----
|
||
# 必填:dev / pro(pro 会强制校验 SECRET_KEY)
|
||
PEAR_ENV=pro
|
||
|
||
# ---- Flask 应用入口 ----
|
||
FLASK_APP=app.py
|
||
|
||
# ---- 安全密钥(生产必填,强随机)----
|
||
# 生成命令:python -c "import secrets; print(secrets.token_urlsafe(48))"
|
||
SECRET_KEY=PLEASE_REPLACE_WITH_RANDOM_STRING
|
||
|
||
# ---- 数据库 ----
|
||
# 默认 SQLite;库文件、session、备份都收进 PEAR_DATA_DIR 指向的目录。
|
||
# docker-compose.yaml 已经把宿主 ./data 绑到容器 /app/data,PEAR_DATA_DIR 默认
|
||
# 就是 /app/data,不需要额外改。这里只是给你本地开发调整用的口子。
|
||
# PEAR_DATA_DIR=D:/bwstudio/pear-admin-flask/data
|
||
|
||
# 默认 SQLite,WAL 模式由 extensions 自动开启(多 worker 写也不容易撞锁)。
|
||
# 想换成 MySQL 就解注释下面这行;docker-compose.yaml 里也写好了 db 服务可参考:
|
||
# SQLALCHEMY_DATABASE_URI=mysql+pymysql://pear:pear@db:3306/pear?charset=utf8mb4
|
||
# SQLALCHEMY_DATABASE_URI=sqlite:///../pear.db
|
||
|
||
# ---- 时区 ----
|
||
TZ=Asia/Shanghai
|
||
|
||
# ---- 邮件(可选,未启用找回密码等功能可不填)----
|
||
# MAIL_SERVER=smtp.qq.com
|
||
# MAIL_PORT=465
|
||
# MAIL_USE_SSL=true
|
||
# MAIL_USERNAME=yourname@qq.com
|
||
# MAIL_PASSWORD=authorization_code_here
|
||
# MAIL_DEFAULT_SENDER=yourname@qq.com
|
||
|
||
# ---- 监听端口(容器内部)----
|
||
# 仅在 docker-compose.yaml 的 ports 段同步修改时使用;默认 5000
|
||
APP_PORT=5000
|
||
|
||
# ---- Gunicorn worker / thread 数 ----
|
||
# SQLite + WAL 推荐 workers=1 threads=8:单进程写最稳,线程吃满并发。
|
||
# 想更高吞吐可改 workers=2,但务必确认没有长事务(埋点已经够短)。
|
||
GUNICORN_WORKERS=1
|
||
GUNICORN_THREADS=8 |