本文图文讲解在Docker中安装SVN、用正确姿势配置iF.SVNAdmin后台权限管理页面以及用Nginx代理实现https(配SSL)访问,并指出各种问题让大家少走很多路。
搜索和下载elleflorio/svn-server:latest镜像:
为什么用elleflorio的镜像呢?主要是它支持http://和svn://访问。这里经过重新封装后我把它推到我的docker hub上面,其中repository的根目录由svn改成repos,你们也可以通过pull xubingtao/svn-server:elleflorio拉取我这个,当然后续有时间我会用Dockerfile重新构造新版本的svn,届时将会push到xubingtao/svn-server:latest敬请关注。接着运行xubingtao/svn-server:elleflorio:
这里有个问题,用-v挂载进容器的目录会把包括权限和内容一起全覆盖掉容器里面原有的,比如用-v ~/docker/svn/my/html:/var/www/localhost/htdocs挂载首页目录后如果没在~/docker/svn/my/html目录下加页面通过ip:3380访问将是空白页,另外-v ~/docker/svn/my/svn:/home/svn挂载后在有的系统会出现/home/svn没写入权限,如果没用正确姿势配置iF.SVNAdmin后台权限管理页面或者是直接配conf目录下的authz、passwd、svnserve.conf会报“Error: Access to ‘/svn/Demo/!svn/me’ forbidden when commit file”而一直无法提交文件也一直找不到原因,这估计都坑了不少人不少时间,我因此都到elleflorio的github去吐槽了,当时实在不了解这个镜像的细节以及存在的问题,那时有人比我早在他的GitHub上留言报错的问题,我也去截图留言然后等十几天后重新pull他的镜像运行后配置conf目录下的文件还是相同情况我当时就很愤怒并到他GitHub喷他“What the fuck! The problem hasn’t been solved yet?”现在回想起来有点惭愧😂。
运行完svn镜像后到浏览器访问,上面说了如果挂载首页目录又没放页面会出现访问空白,我这里没挂载,默认会生成Apache的“It works!”经典首页:
下面用正确的姿势教大家配置iF.SVNAdmin后台权限管理页面,访问“http://ip:port”会跳转到iF.SVNAdmin配置页面:
估计很多人跟我当时一样,看了一脸蒙蔽以至于直接放弃这个后台配置页面,然后去配置conf目录下的三个文件,然后提交文件一直报“Error: Access to ‘/svn/Demo/!svn/me’ forbidden when commit file”,然后一直找不到原因,然后…😅,如果是拉他的或者我的镜像而且没有改动的可以直接按我下面截图那样配置,记得点Test,不用再手动去配authz、passwd、svnserve.conf:
部分系统会在“Parent directory of the repositories (SVNParentPath)”出现“The folder exists but is not writable.”,这个时候可以到svn同级目录执行:chmod a+w svn写入授权,然后再Test就显示“Test passed.”了,一定要所有都“Test passed.”了再点“Save configuration”,不然会报上面那个错误!提交后会提示默认账号密码都是admin,然后点“login now”:
登录页面会有四种语言可以切换,其实刚刚配置页面右上角也可以切换:
登录进来后会显示账号信息以及服务器信息:
接着新建仓库:
访问新建的仓库,当你用admin登录时会一直提示登录,这是因为admin只有配置后台页面权限没有访问仓库权限,这里需要注意的是如果是用他的镜像则是用“http:ip:port/svn/public”来访问:
这个时候可以新建个账号:
然后给账号分配角色:
这个时候再去登录就可以访问仓库了:
接着测试提交文件,你会发现提交的时候还是报没权限:
这是因为路径没有写入权限,按下图操作最后点“分配”:
然后再去提交就可以了,页面也可以访问到提交的文件:
这样就安装和配置完了,如果是在云服务器上搭建的要放开3380端口,下面讲解配置ssl,域名和证书自己去申请,在讲解gitlab安装已经截图过这里不再截图讲解了。我这里是用nginx做代理的,所以只要新增个svn.xubingtao.cn.conf配置文件并将证书和IP配进去即可,比较容易出错的是图中两个地方:
另外还有个问题,修改文件会报网关错误“Subversion reported an error:……Unexpected HTTP status 502 ‘Bad Gateway’ on……”:
进入容器修改httpd.conf配置文件后重启:
在httpd.conf配置文件的headers_module把原来的“RequestHeader unset Proxy early”注释掉,加入“RequestHeader edit Destination ^https: http: early”:
然后再重新提交就可以了:
如果因为迁移服务器或变更磁盘等而造成update或commit时报“svn: E160006: No such revision xxx”,可以在新目录checkout整个项目把“.svn”替换到有问题项目的该目录,操作前请先备份项目,实在不行重新checkout整个项目,然后把之前项目的代码等(不要将.svn等)文件替换过来即可。
展开阅读全文
下一篇:Docker中安装nginx
Hi Xubindtao,
May I ask you whether you could be so kind and publish English version of screenshots in your article? Text can be translated by Google, pics of course not… By the way, I’m as well not English native speaker – believe that you wouldn’t enjoyed Slovak 🙂
I’m sorry, I really don’t have time.😅