给论坛建了个镜像

只显示deltat的文章显示全部
deltat:给论坛建了个镜像
我给这个论坛建了一个镜像:
https://mirror.chromaso.net/

动机在于解决以下问题:
  1. 最近论坛服务器不稳定,常常报出 503 Service Unavailable 错误。如果直接从镜像阅读的话,就可以避免被这种错误所打扰。
  2. 论坛没有方便的「只看该作者的回帖」的功能,导致在小说区找到原文比较费力。所以镜像中添加了这个功能。
  3. 论坛中繁体中文和简体中文混杂,降低了阅读体验。于是镜像中添加了繁简转换的选项。
为保持社区的私密性,防止镜像被滥用,第一次访问镜像时,必须是从此处点击链接跳过去;此后,就可以直接从浏览器里打开了。(这个设定已经去掉了)

前端的代码放在 https://gitlab.com/chromaso/mazochina-mirror-serve 了,而爬虫端的代码放在 https://gitlab.com/chromaso/mazochina-mirror-crawl 了,欢迎提 merge request……

有什么功能或界面上的建议或者 feature request 的话,也可以直接在这里回复……
deltat:Re: 给论坛建了个镜像
707 wrote:大佬是技术牛人啊,我有几个问题想请教下:
请问多久会同步一次论坛数据呢?
回复帖子还是跳转到原论坛吗?
是自己买的服务器还是公用的资源?

镜像站比原站快多了啊,简体字也够大,看起来很舒服,期待论坛管理员把网站迁到楼主的服务器上啊,到时给楼主点维护费帮忙运维就好
同步论坛数据的算法比较复杂。简单来说是直接用爬虫来抓网页,但是为了减少对源站服务器的压力,我尽量只做最低限度的抓取。策略大体来说是这样的:
1. 每两分钟抓取一次论坛首页,然后对比论坛首页上每个板块的最近发表时间,对于最近发表时间比镜像里要新的板块,将该板块标记为 dirty;
2. 抓取每个 ditry 板块的列表页,然后对比每个主题的最新更新时间,对于最近发表时间比镜像里要新的主题(或者是镜像里不存在的主题),将该主题标记为 dirty;如果列表页第一页的所有帖子的最近发表时间都比镜像里要新,那就再往后爬一页,直到遇到最新发表时间比镜像里要旧的帖子为止;(因此,避免了不必要的板块列表页抓取)
3. 对于每个 dirty 的帖子,抓取第一页(因为有时候第一页会被楼主编辑),然后直接跳到之前抓取过的最后一页,从那页开始往后爬,直到到达末页;(因此,避免了不必要的主题内容页抓取)

然后为了避免在高峰时段对源站服务器造成压力,会有一个全局的 throttle,一旦发现源站 503 等错误,直接暂停整个爬虫,过一会儿再重新开启;而如果开启后立刻又遇到 503 等错误,会再次暂停,并且这次暂停的时间会是第一次的 4 倍;以此类推,第 N 次连续遇到 503 等错误后,暂停的时间会是第 N-1 次连续遇到 503 等错误时的 4 倍。

考虑到论坛里发帖频率并不是非常高。因此,在非高峰时段,99% 以上的帖子应该能在发布后的两分半钟内被同步到镜像中;在高峰时段考虑到触发 throttle,应该能做到 95% 的帖子在五分钟内被同步到镜像中。

当然,实际上为了处理子板块、置顶帖、被删除帖、被移动至另一板块的帖子等 edge case,逻辑比这里说的要复杂很多,但是大体来说的逻辑是这样的。

因为镜像站是只可能读取源站的帖子,不可能对原论坛进行写入(除非用户愿意把源站的用户名和密码提供给镜像站),所以任何写入操作都只能指引用户跳转回源站操作。

服务器是 DigitalOcean 最便宜的一款 VPS 啦。
deltat:Re: 给论坛建了个镜像
百香果 wrote:
deltat wrote:我给这个论坛建了一个镜像:
为保持社区的私密性,防止镜像被滥用,第一次访问镜像时,必须是从此处点击链接跳过去;此后,就可以直接从浏览器里打开 http://mirror.chromaso.net/ 了。
好奇怎麼做的... 雖然大概猜到是cookies
但具體就抓瞎了.........
而且我用Chrome的私密無痕瀏覽也是從這連過去就可以了
好奇
噢噢这个的话你看我代码 index.js 第 25 - 32 行就是啦
deltat:Re: 给论坛建了个镜像
今天给镜像加上了标题搜索功能,并且是考虑了繁简转换的(i.e. 搜索「机车」可以同时匹配到「機車」、「機车」、「机車」等各种繁简组合)。

不过目前只是搜索标题,没有加正文搜索。
deltat:Re: 给论坛建了个镜像
源站的搜索功能有时间间隔限制,比较不方便……
所以我今天在镜像里添加了一点搜索功能。
deltat:Re: 给论坛建了个镜像
百香果:2018-05-27 14:36 這真的厲害, 不過如果這裡上不了就連不過去了 lol
嗯,所以我考虑了一下,把那个必须从这里跳转过去的限制去掉了(似乎也不是很有用)。

并且现在默认启用 HTTPS 了。
deltat:Re: 给论坛建了个镜像
kiven215:2018-06-05 01:50 是否可能提供部分api来实现方便浏览网站的app
可以啊。你直接提 merge request 就行。
deltat:Re: 给论坛建了个镜像
bluestarcn:2018-06-05 03:05 楼主的镜像这两天貌似有点问题,好几天的内容都没更新了。
抱歉,昨天才发现并且修好……
最近实在太忙了,都没注意到。
deltat:Re: 给论坛建了个镜像
gggggg000:2018-09-15 17:13 https://gitlab.com/chromaso/mazochina-m ... ster/db.js

刚才无聊翻了翻,这个db的login这么写着呆胶布?
那只是本地测试时的配置嘛

生产环境肯定是另一套配置,并且数据库只允许 localhost 连接
deltat:Re: 给论坛建了个镜像
目测镜像是被墙了

至少遭到了 DNS 污染,但是不确定是不是只有 DNS 污染
deltat:Re: 给论坛建了个镜像
wxg:2019-04-07 23:55 楼主,这个镜像是关了吗
镜像还在,只是被墙了
deltat:Re: 给论坛建了个镜像
wyx7501011:2019-09-08 10:37 SSL证书过期了,友情提醒一下233
多谢提醒
已经续上了一秒
发表回复