kita / notes

约 2 分钟

日志说文件生成成功,下一行说上传失败

日志里有两行挨着的话。前一行:

文件已生成: /tmp/astrbot_jmdownloader/xxx.pdf

后一行:

QQ 文件上传失败
retcode=1200 / 识别URL失败

生成成功、上传失败。这两句放一起其实已经把答案给出来了——问题不在"有没有生成",而在"发文件的那一方能不能拿到它"。我花了很久才想到这一层,前面一直在怀疑下载器和 QQ 接口。

这套东西里有两个容器:AstrBot 负责干活、生成文件;NapCat 负责发 QQ 消息、读文件。它们的挂载完全是两套:

宿主机上的目录 AstrBot 容器里看到 NapCat 容器里看到
/root/astrbot/data /AStrBot/data /root/astrbot/data
—— /tmp(容器私有) 不存在

所以有两个问题叠在一起。

第一,PDF 生成在 AstrBot 容器的 /tmp 里。容器私有的临时目录,宿主机都看不到,NapCat 更不可能看到。

第二,就算把文件放进 data 目录,两个容器对同一个目录的内部路径也不一样:AstrBot 看到的是 /AStrBot/data,NapCat 看到的是 /root/astrbot/data。NapCat 按自己那套路径去找,一样是空。

文件没丢,是两边对"文件在哪"的说法不一致。

修法是给 NapCat 也挂上同一个目录,在 compose 里加一行:

napcat:
  volumes:
    - ./data:/root/astrbot/data
    - ./data/jmdownloader:/AStrBot/data/jmdownloader

最后那行是关键:让同一个目录在两边都能被同一串路径命中。

临时救急可以用软链,在 NapCat 容器里:

ln -s /root/astrbot/data/jmdownloader /AStrBot/data/jmdownloader

治本是改插件的输出目录,让它别写 /tmp、直接写共享卷。但插件升级会把源码覆盖,改的东西全丢,长期不靠谱。我最后用的是"输出到共享卷 + 两边内部路径对齐"。


这事我前后踩了三次,第三次才彻底想明白:下载器、日报、还有表情包上传,都是同一类。

日报当时的报错是:

资源文件不存在: /AStrBot/data/plugins/.../res/image/anime1.jpg

路径不一致的老毛病。我顺手把渲染倍率从 5 降到 3,图小一点、快一点,出图失败的概率也跟着降了。

现在只要看到"文件已生成但发送失败",我的第一反应是进两个容器各 ls 一下那个路径。日志里那个路径是"真的",只是它是另一个容器的坐标。

← 回到全部笔记