[Bug] 社区版源码部署时,Celery 自定义序列化器默认密钥是 UUID 对象,导致所有异步任务无法投递

Ouverte Adaptée aux débutants
#7,780 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
76/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
python

Piste de recherche

Commencez par apps/ops/celery/hmac_signed_serializer.py et suivez la manière dont _local_secret_key est choisi avant que secure_dumps appelle .encode(). Reproduisez l’échec avec le script autonome de l’issue, puis recherchez des tests proches ou des vérifications au démarrage pour ce sérialiseur. Le travail est terminé lorsque la clé par défaut fonctionne comme chaîne et que la sérialisation réussit sans nécessiter de variable d’environnement.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

环境

  • MaxKB 版本:2.10.8(镜像)/ 源码 HEAD 2ac52b3(2026-11-09)仍在
  • 部署方式:Docker Engine(WSL2),从源码构建,未使用官方商用镜像(无 xpack)
  • Python 3.11,celery 5.5.3,uuid-utils 0.14.0
  • 相关文件:apps/ops/celery/hmac_signed_serializer.py

现象

文档上传成功、记录能创建,但永远停在「待处理 / 0 段落」,后台不执行任何向量化任务。
前端无任何报错,日志中仅有一行被吞掉的 AttributeError。

排查后确认:所有 Celery 任务都无法投递(不只是文档解析)。

根因

apps/ops/celery/hmac_signed_serializer.py:

import uuid_utils.compat as uuid
...
_local_secret_key = os.environ.get(
    'MAXKB_HMAC_SIGNED_SERIALIZER_SECRET_KEY',
    os.getenv('MAXKB_SECRET_KEY', uuid.uuid7())   # ← 默认值是 UUID 对象,不是 str
)
...
def secure_dumps(obj):
    data = pickle.dumps(obj)
    signature = hmac.new(_local_secret_key.encode(), data, hashlib.sha256).digest()
    #                        ^^^^^^^^ UUID 没有 encode() → AttributeError

uuid_utils.compat.uuid7() 的返回值是 uuid.UUID 对象(已实测,见下),没有 .encode() 方法。

日志里没有明显报错,是因为任务投递点被 try/except 包住,
异常只落一条 error 日志,文档状态停在「待处理」——用户侧看起来就是「卡住了」。

复现

不启动 Django / Celery / Redis,直接加载上面这个真实文件即可复现:

import sys, types, importlib.util
kombu = types.ModuleType('kombu'); ser = types.ModuleType('kombu.serialization')
ser.register = lambda *a, **k: None
kombu.serialization = ser
sys.modules['kombu'] = kombu; sys.modules['kombu.serialization'] = ser

spec = importlib.util.spec_from_file_location(
    's', 'apps/ops/celery/hmac_signed_serializer.py')
m = importlib.util.module_from_spec(spec); spec.loader.exec_module(m)
m.secure_dumps({'task': 'x'})

输出:

_local_secret_key : type='UUID'  value=UUID('80d34868-8213-47e9-b353-e0fadd316c1c')
AttributeError: 'UUID' object has no attribute 'encode'
  File ".../apps/ops/celery/hmac_signed_serializer.py", line 17, in secure_dumps

设置环境变量后正常:

$ MAXKB_HMAC_SIGNED_SERIALIZER_SECRET_KEY=dev-secret python repro.py
_local_secret_key : type='str'  value='dev-local-secret'
secure_dumps(...) -> OK, 185 bytes

期望

  1. 默认值应转换为 str,例如:
_local_secret_key = os.environ.get(
    'MAXKB_HMAC_SIGNED_SERIALIZER_SECRET_KEY',
    os.getenv('MAXKB_SECRET_KEY') or str(uuid.uuid7())
)
  1. 建议在 ok/启动自检里显式校验 _local_secret_key 类型,或至少把它变成显式必填配置,
    避免不同部署方式(源码 / 官方镜像 / 含 xpack 的版本)表现不一致。

临时规避

-e MAXKB_HMAC_SIGNED_SERIALIZER_SECRET_KEY=<任意字符串>

补充说明(供维护者判断)

  • 该文件第 9–13 行有一个 from xpack import get_md5 的兜底:
    含 xpack 的版本会用它覆盖密钥,因此官方商用镜像可能不受影响;
    而源码构建 / 自行打镜像的社区用户会稳定踩到。
  • MAXKB_SECRET_KEY 在全仓库中除本文件外没有任何写入点(README 的 docker run
    也不传它),所以未设置环境变量是默认路径。
Langage dominant
Python
Étoiles
23.1k
Forks
3.2k
Merge moyen
41 min
PR mergées (30 j)
480

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de 1Panel-dev/MaxKB

Toutes les issues de 1Panel-dev/MaxKB

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.