在搬瓦工重建FARBOX2.0(续)

话接 上篇
在完成之前的配置工作后,FarBox2.0 (FB) 和 n8n 和睦地跑了起来,只需要记住

访问 admin 页面用 IP 地址登录

即可。
然而过了不多久,发现一个问题:在页面下评论地邮件提醒收不到。
于是开始排查:

  1. 按照之前的经验,到 /data/log/farbox/web.log 里面查找关于 ses 的日志,没有看到报错;
  2. 检查 SES 的配置,到 AWS 查看,发送测试邮件正常,确认服务安好;
  3. _comments 文件夹查看评论的持久化文件,发现评论记录正常,只是没有邮件通知而已;
  4. 发邮件给 FB 作者 Hepo,描述问题,感觉可能是全站 https 的原因,部分接口可能不支持(就像 admin 页面的部分功能需要只能用 http 的方式访问)。没有收到回信;
  5. 用 Nginx 作为反向代理,替换 Traefik,同时全站使用 http 请求,邮件正常,说明后端逻辑没问题;
  6. 只好重操旧业,翻起 FB 在 GitHub 的源代码。

结果在 这里send_notification_emails 方法,发现作者为了防止垃圾评论注入,做了一些预防措施,包括:

  1. 请求的 host 和 referer 地址必须一致
  2. referer 地址不许为空
  3. 只向原评论作者、bucket 设置的邮箱、admin 邮箱发送邮件,不向评论者自己发送邮件

   

http请求的标头里,可以看到 Host 和 Referer 相同,邮件正常
http请求的标头里,可以看到 Host 和 Referer 相同,邮件正常

https请求的标头里,Host 和 Referer 被隐藏,如果不特殊设置会有问题
https请求的标头里,Host 和 Referer 被隐藏,如果不特殊设置会有问题

这样的邮件通知规则导致了如下几个问题。
对于问题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
Write a Comment
'