一、介绍
最近公司服务器做了些调整,SVN服务器搭建在内网服务器上,但在云服务器上做一个备份。然后就想到了SVN主从仓库的搭建了。
二、环境
操作系统
CentOS 7.6
主服务器
局域网服务器 IP: 192.168.0.100
从服务器
阿里云服务器 IP: 47.97.208.x
svn版本
svnserve, version 1.7.14 (r1542130)
三、步骤
1、 安装svn环境
分别在二台服务器上安装SVN环境,并创建对应的仓库(这里可以是单仓库也可以是多仓库,二边保持一致就行了。如果是多仓库,每个创建的配置需要按下面步骤分别走一遍)。
svn环境搭建及配置Nginx转发和数据迁移可以参考之前写的文章,这里就不在复述了
Linux中svn服务器安装与使用
SVN服务器跨平台迁移
Nginx转发SVN
实验环境
- 主服务器svn仓库:
/home/svn/test
,配置http协议:http://192.168.0.100/test/
- 从服务器svn仓库:
/home/svn/test_backup
,因为只作备份,直接使用svn协议:svn://47.97.208.x/test_backup/
- 二台服务都有相同的账号和权限管理文件。账号
zengwu=zw123.
、guoke=gk123.
都有test仓库所有读写权限
2、 在备份机上,修改刚刚创建的SVN库里的钩子脚本pre-revprop-change
cd /home/svn/test_backup
cp pre-revprop-change.tmpl pre-revprop-change
chmod +x pre-revprop-change
vim pre-revprop-change
#!/bin/sh
# 直接在脚本最前面加入exit 0退出程序就可以了
exit 0
3、 在主机上,初始化版本
因为主机在内网,外网无穿透情况下无法访问内网,所以同步操作在主机上执行。
svnsync init svn://47.97.208.x/test svn://192.168.0.103/test --username zengwu --password zw123. --no-auth-cache
- svnsync init 从库的URL 主库的URL
- --username --password: svn账号密码
- --no-auth-cache: 不缓存账号密码
4、在主机上,开始同步主库的SVN数据
svnsync sync --non-interactive svn://47.97.208.x/test --username zengwu --password zw123.
5、在主机上,修改hooks下的post-commit脚本进行SVN实时同步
svn每次提交成功后,会调用hooks下的post-commit脚本,所以在这里将同步数据语句加入其中就可以了。
cd /home/svn/test
cp post-commit.tmpl post-commit
chmod +x post-commit
vim post-commit
#!/bin/sh
# 直接在脚本最前面加入
svnsync sync --non-interactive svn://47.97.208.x/test --username zengwu --password zw123.
# 如果没有其他调整直接退出,默认的后面的代码可以不用执行
exit 0
四、测试
本地Checkout: http://192.168.0.100/test/
为 test目录
本地Checkout: svn://47.97.208.x/test_backup/
为test_back目录
在test目录中创建测试.txt
文件并以zengwu账号提交
在test目录中创建测试1.txt
文件并以guoke账号提交
在test_backup目录中update能更新到测试.txt
和测试1.txt
文件。
查看二个目录的日志也是一样的。
五、题外话
如果换过来,主服务器在外网云服上,从服务器在内网中,因为外网服务器无法使用svn://192.168.0.100/test/
内网IP来访问时,该如何实现。
这里可以借助内网穿透服务来实现,如我们可以搭建一个frp内网穿。
外网服务器为frp服务器,内网服务为frp客户端,在内网frp客户配置加入svn的tcp协议穿透
[SVN]
type = tcp
local_ip = 0.0.0.0
local_port = 3690
remote_port = 3691
然后外网服务器可以使用svn://127.0.0.1:3691/test/
来访问内网svn仓库了,其他配置和前面一样.