33331111/question-memorization-app

By 33331111

Updated 7 days ago

一项用来刷题的服务。

Compose
0

26

33331111/question-memorization-app repository overview

  1. 克隆并配置环境变量

    cd question-mem-app
    cp .env.example .env
    
  2. 生成密钥并填入 .env

    # JWT 密钥
    openssl rand -base64 32
    # AES-256 主密钥(必须 base64 编码的 32 字节)
    openssl rand -base64 32
    

    将生成的值填入 .envJWT_SECRETAES_MASTER_KEY

    ⚠️ 应用启动时会校验 AES_MASTER_KEY,若为 change-me* 前缀或长度不对将直接拒绝启动。

  3. 启动全部服务

    docker compose up -d --build
    

    服务列表:

    服务端口说明
    postgres5432PostgreSQL 16
    redis6379Redis 7
    minio9000 / 9001MinIO API / 控制台
    backend8000FastAPI 后端
    workerCelery 解析 worker
    frontend80(nginx)前端 SPA

    注意:docker-compose.yml 默认只编排 postgres/redis/minio/backend/worker。前端通过 frontend/Dockerfile + nginx.conf 独立构建部署。

  4. 执行数据库迁移

    docker compose exec backend alembic upgrade head
    
  5. 访问应用

    • 前端:http://localhost(nginx 托管)或开发模式 http://localhost:5174
    • 后端 API 文档:http://localhost:8000/api/docs
    • MinIO 控制台:http://localhost:9001(minioadmin / minioadmin)

所有配置通过环境变量管理,后端在 app/core/config.py 中读取 .env 文件。

环境变量默认值说明
DATABASE_URLpostgresql+asyncpg://...@localhost:5432/question_mem异步数据库连接串
DATABASE_URL_SYNCpostgresql://...@localhost:5432/question_mem同步连接串(Celery / Alembic)
REDIS_URLredis://localhost:6379/0Redis 连接串
MINIO_ENDPOINT127.0.0.1:9000MinIO 地址
MINIO_ACCESS_KEYminioadminMinIO 访问键
MINIO_SECRET_KEYminioadminMinIO 密钥
MINIO_BUCKETquestion-memMinIO 桶名
MINIO_SECUREFalse是否启用 HTTPS
STORAGE_MODEminio存储模式:miniolocal(本地文件系统)
JWT_SECRETchange-me-in-productionJWT HS256 签名密钥
JWT_ALGORITHMHS256JWT 算法
JWT_ACCESS_EXPIRE_MINUTES15访问令牌有效期(分钟)
JWT_REFRESH_EXPIRE_DAYS7刷新令牌有效期(天)
AES_MASTER_KEYchange-me-...AES-256-GCM 主密钥(base64 编码 32 字节,必填
OCR_TEXT_THRESHOLD50PDF 页面文本长度阈值,低于此值触发 OCR
OLLAMA_BASE_URLhttp://localhost:11434Ollama 本地大模型地址
LLM_CALL_TIMEOUT180单次 LLM 结构化调用超时(秒),防止挂起阻塞解析
LLM_MAX_RETRIES2瞬态错误(超时/网络/限流)最大重试次数,指数退避
INITIAL_ADMIN_EMAIL""首次注册此邮箱的用户自动设为 admin;留空则首个注册用户自动 admin
ENABLE_PUBLIC_BANKSTrue公共题库功能开关,False 时不注册 /api/public-banks 路由

安全提示AES_MASTER_KEY 必须是 base64 编码的 32 字节字符串。应用启动时若检测到 change-me* 前缀或长度不合法将直接抛错拒绝启动。生成命令:openssl rand -base64 32

LLM 调用与 Celery 任务调优

大题库(MB 级 PDF)解析涉及多次串行 LLM 调用,相关参数需协同配置以保证稳定性:

参数位置参数默认值说明
.envLLM_CALL_TIMEOUT180单次 LLM 调用超时;超时后包装为 RetryableError 触发重试
.envLLM_MAX_RETRIES2瞬态错误重试次数,指数退避(1s → 2s → 4s)
celery_app.pytask_soft_time_limit1800软超时(30分钟),触发 SoftTimeLimitExceeded 优雅标记失败
celery_app.pytask_time_limit2100硬超时(35分钟),强制终止 worker 进程
celery_app.pytask_acks_lateTrue任务完成后才 ack,worker 崩溃后任务自动重投

解析中断恢复策略:瞬态错误(超时/网络)→ 指数退避重试;输出截断 → 二分拆分块重试;worker 崩溃 → acks_late 触发重投;整体超时 → 优雅标记 parse_status="failed" 并保留最后进度。

Tag summary

Content type

Compose

Digest

sha256:86cd56c1c

Size

8.7 kB

Last updated

7 days ago