内网后台同步到线上(番外篇)
今天做另一个后台同步到线上的时候发现一些问题,还有一些优化,特意记录下来。此篇文章基于:【内网后台同步到线上】https://www.cnblogs.com/windysai/p/14782818.html
前文有说过同步传输线路真实是这样的路线,其中我提到实现思路:内网服务器是复制一份后台代码目录文件,然后对其进行git提交测试的(就是这个图!)因为怕影响到原正式版的后台,如果测试有误,整个后台就会被我搞坏了(今天还真的遇到)
实际上整个解决问题的流程图是这样的:
从安全方面考虑,这样做挺好;但从维护管理,及方便性,要考虑周全。
第一个系统的后台同步就是下图的线路,因为是第一次做试验,就本着在保证安全的基础上实现需求,然后再考虑优化。
所以不管是内网后台代码目录,还是线上静态资源目录,都是拷贝复制进行测试的。测通之后就想着就这样解决需求吧~~~才发现登录后台之后,点最近几天的文章,页面报错不存在,如下图。原因是图上的线上静态资源B1没有及时从B里同步最新的过来,只有截至到拷贝那天的新闻数据。
于是,我就在后台代码目录线上同步的脚本,加了每次同步完之后,从静态资源B拷贝到B1,用到cp(因为当时rsync还没调清楚,权宜之计。。。)
#增量更新(该条有点问题,后面说到) rsync -alzvPu -t --delete --exclude '/home/用户/data/html/静态资源目录/.git' /home/用户/data/html/静态资源目录/* /home/用户/data/html/静态资源目录_20210517/
#这条貌似也有问题 cp -rp `ls /home/用户/data/html/静态资源目录/* | grep -v "/home/用户/data/html/静态资源目录/.git" | xargs` /home/用户/data/html/静态资源目录_20210517/
虽然报的没有文件或目录的错,但静态资源目录倒是更新过来了的(容许我还没调整这条命令过来,先放下)
但是内网后台的rsync增量更新同步,倒是通过几次试错成本搞出来了(把内网复制的后台代码目录A1搞崩了,如下图)
rsync的delete参数是为了保持目的目录跟源目录一致同步的,可以理解为目的目录A1不可能自己私藏A没有的文件或目录。我就以为跟cp一样复制的命令:
rsync -alzvP --delete --exclude "index.html" --exclude=/u --exclude=/html --exclude=/r /home/用户/data/后台源目录A/* /home/用户/data/后台目的目录A1/

终极解决大法(一个歪果仁链接:https://rakeshjain-devops.medium.com/fix-to-tip-of-your-current-branch-is-behind-its-remote-counterpart-git-error-eb75f719c2d5):
git reset --hard origin/master
看着是警告这命令是有点风险的,鉴于做测试就算了,还窃喜幸好不是对后台代码正式版A动的操作。。。而是A1,吓坏。
这条rsync命令最阔怕一点就是,把A1上的 .git 目录全部干掉了!!!所以搞坏了git,调整后的rsync命令如下,
1 rsync -alzvP --delete --exclude=/.git --exclude "index.html" --exclude=/u --exclude=/html --exclude=/r /home/用户/data/后台源目录A/ /home/用户/data/后台源目录A1/
这条命令亲测暂时没有什么大问题,所以线上的静态资源目录增量更新也可以这样用,聪明的读者肯定知道怎么依葫芦画瓢的~~~
最后一个反思:
其实对于静态资源目录增量更新其实可以不用额外做,线上直接软连接到正式版的静态资源目录上就好了。我觉得风险其实不大,因为正式版的静态资源目录是通过内网——》gitlab更新过来的,意味着即使搞坏了,假设有黑客登上服务器,改了这目录下的文件,过一会儿又会被更新成正确的。
这样直接软连接到正式版资源目录还有一个好处,假如真的停电了,因为用户正常情况下,访问网站的静态资源目录是B。复制更新的静态资源目录B1在停电时才要充当为正式版的角色,B1因后台发文章临时取代了B,B此时因为停电已经无法做gitlab内网同步,当恢复供电时候,B1新发的文章还要重新同步回B,想想是不是颇麻烦。
总的来说,优化后是这样的,内网后台需要另外复制一个作为gitlab新项目(安全保险起见),而线上同步过去的后台软连接到静态资源目录,资源目录建议直接链接到正式环境的,不要额外复制资源目录。