svn和git差不多 都是用来存代码的

只不过svn是部署在一台服务器上 git是每个人都维护一份完整代码仓库 svn一般都是公司内部自建一个svn服务器 用来同步每个人之间的代码以及其他ui/ux资源

用途就是保存并同步大家要协同办公的东西

比如两个ui设计师要同步设计稿

总不能通过钉钉飞书这些发送吧

涉及到公司内部文件的机密

所以就要在内网上搭建一台有svn服务的机器 大家都连上去 通过svn服务器进行文件的共享和同步

这个行为就和git是一样的

一.搭建

参考资料SVN 服务器的安装及其 HTTPS 实现_svn server.config.html-CSDN博客

安装SVN

sudo yum -y install subversion

创建版本库目录

sudo mkdir -p /var/svn/repo1

创建版本库

sudo svnadmin create /var/svn/repo1

配置帐号

sudo vim /var/svn/repo1/conf/passwd
[users]
zhangsan=svn123
lisi=svn123

配置权限

sudo vim /var/svn/repo1/conf/authz
[groups]
xm1 = zhangsan
xm2 = lisi

[repo1:/]
@xm1 = rw
@xm2 = r

配置服务

把 /var/svn/repo1/conf/svnserve.conf 文件重命名为 /var/svn/repo1/conf/svnserve.conf.bak,以此实现对原配置文件的备份。

sudo mv /var/svn/repo1/conf/svnserve.conf{,.bak}

从 svnserve.conf.bak 备份文件中过滤掉所有包含 ### 的行

sudo grep -v "###" /var/svn/repo1/conf/svnserve.conf.bak | sudo tee /var/svn/repo1/conf/svnserve.conf

对 SVN 仓库的访问权限、用户认证等进行设置

sudo vim /var/svn/repo1/conf/svnserve.conf
[general]
anon-access = none ## 匿名用户可读(关闭)
auth-access = write ## 授权用户可写
password-db = passwd ## 指定账号配置文件
authz-db = authz ## 指定权限配置文件
realm = /var/svn/repo1 ## 认证空间名

关闭 SELinux 模式

sudo vim /etc/selinux/config
# mode of SELinux: enforcing=enable, permissive=disable
# SELINUX=enforcing
SELINUX=permissive

重启生效

sudo reboot

启动服务

sudo systemctl enable svnserve
sudo systemctl start svnserve

防火墙放行

sudo vim /etc/sysconfig/firewalld
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3690 -j ACCEPT

重启生效

sudo systemctl restart firewalld

二.基本命令

启动

sudo svnserve -d -r /var/svn  # -d: 守护进程 -r: 仓库根目录

查找进程

ps aux | grep svnserve

结束进程

sudo kill <PID>  # 替换为实际的进程ID

验证端口监听

sudo netstat -tulnp | grep 3690
# 或
sudo ss -tulnp | grep 3690

测试本地连接

telnet 127.0.0.1 3690

查看日志

sudo journalctl -u svnserve --no-pager -n 20  # 查看最近日志
# 或直接检查 svnserve 输出(如果未用 systemd 管理)
sudo tail -f /var/log/messages | grep svnserve

防火墙检查

sudo firewall-cmd --list-ports | grep 3690  # 检查是否开放端口
sudo firewall-cmd --add-port=3690/tcp --permanent  # 如果未开放
sudo firewall-cmd --reload

三.开通HTTP

安装 httpd 及其 SVN 模块

sudo yum -y install deltarpm ## 增量 RPM 套件
sudo yum -y remove httpd mod_dav_svn
sudo yum -y install httpd mod_dav_svn

确认模块 dav/dav_svn 已加载

grep -E "dav_module" /etc/httpd/conf.modules.d/00-dav.conf
## 显示结果 LoadModule dav_module modules/mod_dav.so
grep -E "dav_svn_module" /etc/httpd/conf.modules.d/10-subversion.conf
## 显示结果 LoadModule dav_svn_module     modules/mod_dav_svn.so

将 SVN 版本库所有者改为 apache(httpd 进程的启动用户)

sudo chown -R apache:apache /var/svn/repo1/

SVN HTTP配置

sudo vim /etc/httpd/conf.d/subversion.conf
<Location /svn>
    DAV svn 
    SVNParentPath /var/svn
    AuthType Basic 
    AuthName "SVN repository" 
    AuthUserFile /etc/httpd/svn-auth.htpasswd 
    # AuthzSVNAccessFile /var/svn/conf/authz	
    # Authorization: Authenticated users only
    Require valid-user
</Location>

创建SVN HTTP用户

## 首个用户必须指定 -c 用于新建文件 svn-auth.htpasswd
## 后续用户必须不要指定 -c, 否则文件会被新建;-m 表示以 md5 加密密码
sudo htpasswd -cm /etc/httpd/svn-auth.htpasswd zhangsan ## 需要指定密码两次(最好与SVN的passwd一致)
sudo htpasswd -m /etc/httpd/svn-auth.htpasswd lisi ## 需要指定密码两次(最好与SVN的passwd一致)
sudo cat /etc/httpd/svn-auth.htpasswd

启动httpd服务

sudo systemctl enable httpd
sudo systemctl restart httpd
sudo tail -f /var/log/httpd/error_log

防火墙放行

sudo vim /etc/sysconfig/firewalld
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload

重启生效

sudo systemctl restart iptables

在windows客户端验证

Windows 下使用 Chrome 浏览器访问: http://服务器ip/svn/repo1
输入用户名 zhangsan 及其密码,成功。

三.HTTPS的配置和实现

安装ssl

sudo yum -y install mod_ssl openssl

生成证书

参考资料:Nginx 负载均衡及其 HTTPS 部署 | 王克锋的博客

sudo mkdir /etc/httpd/ssl

生成 X509 V3 扩展文件

vim /etc/ssl/x509v3.ext
basicConstraints=CA:FALSE
authorityKeyIdentifier=keyid,issuer
keyUsage=digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName=IP:服务器IP

生成密钥和证书文件

## 生成密钥对(nginx.key, 包含公钥和私钥)
sudo openssl genrsa -out nginx.key 2048

## 生成证书请求(nginx.csr, 包含公钥和主题信息)
## 注意:CN必须是将来的域名,否则 Chrome 访问时报错 NET::ERR_CERT_AUTHORITY_INVALID
sudo openssl req -new -sha256 -key nginx.key -out nginx.csr -subj "/CN=kefeng.wang/O=kefeng.wang/L=SHANGHAI/ST=SHANGHAI/C=CN"

## 商用证书: 把证书请求文件(nginx.csr)连同费用,交给 Verisign 等CA服务公司,CA 用它的私钥签名生成证书返还证书(nginx.crt);
## 个人证书: 个人使用密钥(nginx.key),签发证书请求(nginx.csr),生成根证书(nginx.crt);
## 商用证书的 CA 根证书已经内置在浏览器中,无需手工导入;而个人证书则需要导入。
## 注意: 必须指定 -sha256, 否则 Chrome 访问时报错 This page is insecure (broken HTTPS). SHA-1 Certificate
sudo openssl x509 -req -sha256 -days 3650 -in nginx.csr -signkey nginx.key -extfile x509v3.ext -out nginx.crt
sudo sz nginx.crt ## 下载至 Windows

# 根据密钥对(nginx.key),生成私钥(private.pem)、公钥(public.pem)、modulus(JavaScript 中可用)
sudo openssl pkcs8 -topk8 -in nginx.key -nocrypt -out private.pem
sudo openssl rsa -in nginx.key -pubout -out public.pem
openssl rsa -in nginx.key -noout -modulus | sudo tee -a modulus.js

将 Nginx 服务器使用的 SSL 私钥和证书文件复制到 Apache 服务器(httpd)的 SSL 证书目录中,从而让 Apache 服务器能够使用这些证书来提供 HTTPS 服务。

sudo cp nginx.key /etc/httpd/ssl/httpd.key
sudo cp nginx.crt /etc/httpd/ssl/httpd.crt

配置证书

sudo vim /etc/httpd/conf.d/ssl.conf

注释掉原来的路径,添加新的路径

SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key

重启服务

sudo systemctl restart httpd

防火墙放行(/iptables和/firewalld都要配置)

sudo vim /etc/sysconfig/firewalld
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload

重启生效

sudo systemctl restart firewalld

客户端验证

客户端验证(https://xxx)

Windows 下使用 Chrome 浏览器访问: https://服务器IP/svn/repo1

也可以在客户端使用TortoiseSVN

参考资料:

TortoiseSVN安装与使用_小乌龟svn-CSDN博客

在 Centos7 中搭建 SVN 服务,借助 TortoiseSVN 轻松进行合作开发_centos7+tortoisesvn-CSDN博客

更多推荐