团队用版本控制时,很多人会在Git和SVN之间纠结。Git做分布式协作很顺手,但项目里美术素材、文档、大体积二进制文件较多时,SVN的集中式结构反而更省心。如果团队已经习惯SVN,或者公司有老项目要延续,在阿里云上自建一台阿里云svn服务器,通常是比较稳妥的选择。

阿里云没有开箱即用的托管SVN服务,一般做法是在云服务器ECS上自己部署。好处是权限、备份、网络都在自己手里,代价是系统补丁和安全策略也得自己盯。下面用一台Alibaba Cloud Linux系统的ECS走一遍流程。
准备工作
先把基础条件备齐。ECS建议至少2核4G,再单独挂一块数据盘存放代码仓库,别让仓库和系统盘混在一起,重装系统时容易丢数据。操作系统用CentOS兼容系统或Alibaba Cloud Linux都可以。访问方式要提前定好:只在内网用,就放进专有网络VPC;需要从外网连接,就绑定弹性公网IP。
安全组最容易被随手放开。svnserve默认监听3690端口,只对办公网出口IP放行即可,别图省事开成0.0.0.0/0。
安装SVN并创建仓库
登录ECS后,用包管理器装好subversion。然后在数据盘上建目录,比如/data/svn,用svnadmin create新建仓库。仓库建议按项目拆开,例如/data/svn/finance-doc、/data/svn/app-web。拆开之后,权限、备份和迁移都能单独处理,不会一个仓库出问题牵连全部。
仓库建好后进入conf目录,有三个文件要记住:svnserve.conf管服务行为,passwd存账号密码,authz管访问规则。后面的配置基本都围绕这三个文件展开。
配置认证并启动服务
打开svnserve.conf,把anon-access设为none关闭匿名访问,再开启password-db和authz-db,分别指向passwd和authz文件。passwd里的密码要够复杂,并且定期更换。明文保存的密码一旦泄露,整个仓库都会暴露,这一步别省。
配置完成后,服务要做三件事:
- 后台运行:执行svnserve -d -r /data/svn,用-r指定根目录,客户端就看不到服务器上的完整路径。
- 开机自启:写一个systemd服务单元。实例重启后服务要自动拉起,否则团队早上可能发现提交不上去。
- 端口确认:启动后用ss -lnt查看3690端口是否在监听。netstat也能用,但新系统里ss更常见。
权限怎么分
权限是SVN服务器最容易出问题的地方。authz采用分组加路径的方式授权:先在[groups]下定义dev、qa、admin之类的用户组,再对具体仓库路径配规则,比如在[finance-doc:/]下给dev组读写,给qa组只读。路径可以细到子目录,这正是分权限最实用的地方。
实际操作时按最小权限来。开发只开自己负责的目录,外包和供应商只给只读或指定子目录。人员离职当天就从passwd和authz里删掉,别等下次查日志才想起来。权限改动后无需重启服务,但要通知相关同事,否则有人提交被拒,只会一头雾水地反复重试。
一个设计团队的做法
下面这个团队的做法可以参考,具体配置要按自己的人数和数据量调整。一个十余人的设计团队,原来用网盘共享UI素材,经常出现文件被覆盖、版本对不上的情况。他们在阿里云上买了一台2核4G的ECS,挂了100GB数据盘,部署SVN后按项目建了三个仓库,分别对应官网、App和营销物料。
权限上,设计师读写,产品经理只读,外部供应商只能进指定子目录。备份方面,每天凌晨用定时任务执行svnadmin hotcopy,把仓库复制到另一块数据盘,每周再同步一份到OSS对象存储。备份建好不等于能用,他们后来加了恢复演练,确认备份文件真的可以恢复。
运行几个月后,最明显的变化是误删文件可以直接回滚到历史版本。以前花半天找的素材,现在几分钟就能定位。
安全与运维
自建意味着安全责任在自己身上。下面几件事建议先做:
- 限制来源IP:安全组只放行办公网和VPN出口地址。VPN出口IP变动后要同步更新,否则同事会突然连不上。
- 加密传输:对外提供访问时,优先考虑svn+ssh,或者用Apache加mod_dav_svn并开启HTTPS。svnserve默认方式下的密码传输安全性有限,不适合直接暴露在公网。
- 备份要能恢复:仓库目录和conf目录都要纳入备份,并定期用备份实际恢复一次。没演练过的备份,真出事时未必能用。
- 及时打补丁:系统和subversion版本定期更新,关注官方安全公告。
- 开启访问日志:记录登录和提交行为,出现异常提交时,才能追查是谁、什么时候做的。
整体看,在ECS上搭阿里云svn服务器并不复杂,难的是权限规划和长期运维。认证、授权、备份、网络限制这四件事做扎实,一台普通云服务器就能支撑中小团队的版本管理。如果团队规模扩大到需要复杂分支和代码审查,再考虑迁移到Git平台也不迟。