[Bug] 社区版源码部署时,Celery 自定义序列化器默认密钥是 UUID 对象,导致所有异步任务无法投递
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
- Domaine
- backend, distributed-systems
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
期望
- 默认值应转换为
str,例如:
_local_secret_key = os.environ.get(
'MAXKB_HMAC_SIGNED_SERIALIZER_SECRET_KEY',
os.getenv('MAXKB_SECRET_KEY') or str(uuid.uuid7())
)
- 建议在
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
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de 1Panel-dev/MaxKB
-
[Bug] 默认用cas登录 退出后自动又登录进去了Peut-être pris @zyyfit l’a pris aujourd’hui. Ouverte
1Panel-dev/MaxKB#7828 · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
[Bug] 上传excel长文件 上传的文档跟文档内容提取的顺序不一致Peut-être pris @zyyfit l’a pris il y a 1 jour. Ouverte
1Panel-dev/MaxKB#7809 · 1 commentaire · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
[Bug] 用户组加载大量用户之后页面崩了Peut-être pris @zyyfit l’a pris il y a 1 jour. Ouverte
1Panel-dev/MaxKB#7798 · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
[Feature] 输入栏支持快捷标签Peut-être pris @baixin513 l’a pris il y a 2 jours. Ouverte
1Panel-dev/MaxKB#7747 · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
-
[Bug] 建议 增加模型的容错处理Peut-être pris @zyyfit l’a pris il y a 5 jours. Ouverte
1Panel-dev/MaxKB#7719 · 1 commentaire · 1 personne assignée ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de 1Panel-dev/MaxKB
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
UKGovernmentBEIS/inspect_ai#6512 ·
Les mainteneurs répondent en général sous 1 jour
-
area/c++ area/core kind/bug-report
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
tensorflow/quantum#1140 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 68/100
Kav-K/GPTDiscord#501 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
UKGovernmentBEIS/inspect_evals#2863 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour