将WordPress发布到静态GitLab页面站点
通过 GitLab 或 GitHub Pages 来提供一个 WordPress 镜像站点, 从而最小化安全问题。
很久以前,我为一个家庭成员建立了一个 WordPress 博客。如今有很多选择,但是当时如果你需要一个带有所见即所得的编辑器的基于 Web 的 CMS,那么就没什么像样的的选择了。而一切运行良好的不幸的副作用是随着时间的推移该博客产生了很多内容。这意味着我要经常更新 WordPress 以防止不断出现的漏洞。
因此,当我决定劝说家人切换到 Hugo 会相对容易,然后可以在 GitLab 上托管博客。但是尝试提取所有内容并将其转换为 Markdown 变成了一个巨大的麻烦。有自动脚本完成了 95% 的工作,但并不完美。手动更新所有帖子不是我想做的事情,所以最终,我放弃了试图移动博客。
最近,我又开始考虑这个问题,并意识到有一个我没有考虑过的解决方案:我可以继续维护 WordPress 服务器,但将其设置为发布静态镜像,并使用 GitLab Pages(或 GitHub Pages ,如果你喜欢的话)提供服务。这能让我自动化 Let’s Encrypt 证书续订并消除与托管 WordPress 站点相关的安全问题。然而,这意味着评论将无法使用,但在这种情况下感觉就像是一个小损失,因为博客没有收到很多评论。
这是我提出的解决方案,到目前为止似乎运作良好:
- 托管 WordPress 站点中的 URL 没有链接到或来自其他任何地方,以减少它被利用的几率。在此例中,我们将使用 http://private.localconspiracy.com(即使此站点实际上是使用 Pelican 构建的)。
- 将公共 URL https://www.localconspiracy.com 托管到 GitLab Pages 上。
- 添加 cron 任务,确定两个 URL 之间的最后构建日期何时不同。如果构建日期不同,则镜像 WordPress 版本。
- 使用
wget
镜像后,将所有链接从“私有”更新成“公共”。 - 运行
git push
来发布新内容。
这是我使用的两个脚本:
check-diff.sh
(cron 每 15 分钟调用一次):
<span class="com">#</span><span class="pun">!</span><span class="str">/bin/</span><span class="kwd">bash</span>
<span class="pln">ORIGINDATE</span><span class="pun">=</span><span class="str">"$(curl -v --silent http://private.localconspiracy.com/feed/ 2>&1|grep lastBuildDate)"</span>
<span class="pln">PUBDATE</span><span class="pun">=</span><span class="str">"$(curl -v --silent https://www.localconspiracy.com/feed/ 2>&1|grep lastBuildDate)"</span>
<span class="kwd">if</span><span class="pun">[</span><span class="str">"$ORIGINDATE"</span><span class="pun">!=</span><span class="pln"> </span><span class="str">"$PUBDATE"</span><span class="pun">]</span>
<span class="kwd">then</span>
<span class="pln"> </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">doc</span><span class="pun">/</span><span class="pln">repos</span><span class="pun">/</span><span class="pln">localconspiracy</span><span class="pun">/</span><span class="pln">mirror</span><span class="pun">.</span><span class="pln">sh</span>
<span class="kwd">fi</span>
mirror.sh
:
<span class="com">#</span><span class="pun">!</span><span class="str">/bin/</span><span class="pln">sh</span>
<span class="kwd">cd</span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">doc</span><span class="pun">/</span><span class="pln">repos</span><span class="pun">/</span><span class="pln">localconspiracy</span>
<span class="kwd">wget</span><span class="pln"> \</span>
<span class="pun">--</span><span class="pln">mirror \</span>
<span class="pun">--</span><span class="pln">convert</span><span class="pun">-</span><span class="pln">links \</span>
<span class="pun">--</span><span class="pln">adjust</span><span class="pun">-</span><span class="pln">extension \</span>
<span class="pun">--</span><span class="pln">page</span><span class="pun">-</span><span class="pln">requisites \</span>
<span class="pun">--</span><span class="kwd">retry</span><span class="pun">-</span><span class="pln">connrefused \</span>
<span class="pun">--</span><span class="pln">exclude</span><span class="pun">-</span><span class="pln">directories</span><span class="pun">=</span><span class="pln">comments \</span>
<span class="pun">--</span><span class="pln">execute robots</span><span class="pun">=</span><span class="pln">off \</span>
<span class="pln">http</span><span class="pun">:</span><span class="com">//private.localconspiracy.com</span>
<span class="kwd">git</span><span class="kwd">rm</span><span class="pun">-</span><span class="pln">rf </span><span class="kwd">public</span><span class="com">/*</span>
<span class="com">mv private.localconspiracy.com/* public/.</span>
<span class="com">rmdir private.localconspiracy.com</span>
<span class="com">find ./public/ -type f -exec sed -i -e 's|http://private.localconspiracy|https://www.localconspiracy|g' {} \;</span>
<span class="com">find ./public/ -type f -exec sed -i -e 's|http://www.localconspiracy|https://www.localconspiracy|g' {} \;</span>
<span class="com">git add public/*</span>
<span class="com">git commit -m "new snapshot"</span>
<span class="com">git push origin master</span>
就是这些了!现在,当博客发生变化时,在 15 分钟内将网站镜像到静态版本并推送到仓库,这将在 GitLab Pages 中反映出来。
如果你想在本地运行 WordPress,这个概念可以进一步扩展。在这种情况下,你不需要服务器来托管你的 WordPress 博客。你可以在本机运行它。在这种情况下,你的博客不可能被攻击利用。只要你可以在本地运行 wget
,就可以使用上面的方法在 GitLab Pages 上托管 WordPress 站点。
这篇文章最初发表于 Local Conspiracy。允许转载。