话接 上篇。
在完成之前的配置工作后,FarBox2.0 (FB) 和 n8n 和睦地跑了起来,只需要记住
访问 admin 页面用 IP 地址登录
即可。
然而过了不多久,发现一个问题:在页面下评论地邮件提醒收不到。
于是开始排查:
- 按照之前的经验,到
/data/log/farbox/web.log
里面查找关于 ses 的日志,没有看到报错; - 检查 SES 的配置,到 AWS 查看,发送测试邮件正常,确认服务安好;
- 到
_comments
文件夹查看评论的持久化文件,发现评论记录正常,只是没有邮件通知而已; - 发邮件给 FB 作者 Hepo,描述问题,感觉可能是全站 https 的原因,部分接口可能不支持(就像 admin 页面的部分功能需要只能用 http 的方式访问)。没有收到回信;
- 用 Nginx 作为反向代理,替换 Traefik,同时全站使用 http 请求,邮件正常,说明后端逻辑没问题;
- 只好重操旧业,翻起 FB 在 GitHub 的源代码。
结果在 这里 的 send_notification_emails
方法,发现作者为了防止垃圾评论注入,做了一些预防措施,包括:
- 请求的 host 和 referer 地址必须一致
- referer 地址不许为空
- 只向原评论作者、bucket 设置的邮箱、admin 邮箱发送邮件,不向评论者自己发送邮件
这样的邮件通知规则导致了如下几个问题。
对于问题1、2,需要在 http 请求中带有正确的 referer 信息。为此专门学习了什么是 referer(这个拼错的词竟然成了行业标准你敢信?正确拼写应该是 referrer),怎么查看 host 和 client 请求的地址。
正常的 referrerPolicy 有好几种,见 阮一峰的网络日志
由于 FB 除了源码,仅存的日志并不打印每个方法的调用链以及输出,因此只能挖空心思在黑盒外面灌不同的输入,对比输出,总结结论。总之,经过多番尝试,对 Traefik 设置做了几个变更:
farbox: image: hepochen/farbox_bucket:latest restart: always ports: - "7788:80" - "127.0.0.1:8443:443" - "127.0.0.1:8080:80" labels: - traefik.enable=true - traefik.http.routers.farbox.entrypoints=websecure - traefik.http.routers.farbox.rule=Host(`life2.wellwellsleep.com`,`tech.wellwellsleep.com`,`life.wellwellsleep.com`) - traefik.http.routers.farbox.tls.certresolver=mytlschallenge - traefik.http.routers.farbox_flat.entrypoints=web,fb7788 - traefik.http.routers.farbox_flat.rule=Host(`life2.wellwellsleep.com`,`tech.wellwellsleep.com`,`life.wellwellsleep.com`) - traefik.http.middlewares.farbox.headers.SSLRedirect=false - traefik.http.middlewares.farbox.headers.referrerPolicy=origin-when-cross-origin # 避免 http 转向 https 而跨域的设置 - traefik.http.middlewares.farbox.headers.hostsproxyheaders=X-Forwarded-Host # 重要,把 host 放到 referer 的字段上,类似 nginx 里的 proxy_set_header Host $host - traefik.http.middlewares.farbox.headers.sslproxyheaders.X-Forwarded-Proto=https # 大概重要,因为流量都是 https - traefik.http.middlewares.farbox.headers.STSSeconds=315360000 - traefik.http.middlewares.farbox.headers.browserXSSFilter=true - traefik.http.middlewares.farbox.headers.contentTypeNosniff=true - traefik.http.middlewares.farbox.headers.forceSTSHeader=false - traefik.http.middlewares.farbox.headers.SSLHost=${DOMAIN_NAME} - traefik.http.middlewares.farbox.headers.STSIncludeSubdomains=false - traefik.http.middlewares.farbox.headers.STSPreload=false - traefik.http.routers.farbox.middlewares=farbox@docker volumes: - /home/run/farbox/configs:/mt/web/configs - /data/log/farbox:/mt/web/log - /data/farbox:/mt/web/data - /data/farbox_ssdb:/mt/ssdb/data - /static/farbox:/mt/web/static - /log/docker:/mt/docker/log
对于问题3,我只能说「这或许是我测试时的一个失误」。因为 admin、bucket 和评论者邮箱都相同的时候,程序逻辑会判定不需要发送邮件提醒,因而只记录评论,不发送邮件……咬舌自尽
总之,这一次大概真的补完了整个 FB 的迁移。好在有源码,好在本人依然可以读懂源码,好在最近两年搞的 web 开发项目学会了在浏览器里按 F12 查看请求详情。
希望 FB 的坑到此为止,再搬家就考虑换框架了。
Comments