ubuntu+apache+subversion+LDAP:https://blog.csdn.net/qq_41566366/article/details/116701128
centos+apache+subversion+LDAP : https://blog.csdn.net/qq_41566366/article/details/117356703
例行吐槽一下当前中文社区文档实在太糟糕了,配置apahce+subversion中间遇到的太多坑,很多文章省略了很多步骤,如果第一次配根本摸不着头脑。
首先我们应该有一个大概的地图,了解我们需要些什么:
方式一:
apache:2.2.2.5 (代理svn访问,搭配mod_dav_svn这个Module实现 )
subversion:1.8.1.7 (svn服务器)
svnadmin:3.0.5 (可选,svn图形化操作界面)
openLADP:2.4.44-x64(可选,配置ladp需要)
我的版本主选择主要来源于文章【LDAP落地】Windows环境下集成SVN,文章作者说因为版本选择的问题导致出错,感谢避坑。
优点:可以搭配ladp使用;缺点:配置繁琐,坑多
方式二:
visualSVN。优点:图形化界面,傻瓜式操作,不需要配置访问路径。缺点:想搭配ladp需要花钱,而且价格很贵。
visualSVN如果想要使用Active Directory,请移步地址https://www.visualsvn.com/server/features/windows-auth/ 中 Integrated Windows Authentication 部分。
环境:
windows server 2016 64核
安装apache 2.2.2.5
下载apache,在http://archive.apache.org/dist/httpd/binaries/win32/下载 httpd-2.2.25-win32-x86-no_ssl.msi
在安装过程中,需要填写域名、邮箱,最后一项选择for All Users。
安装成功后,打开apache目录中的conf/httpd.conf,修改apache端口为8080
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 8080
添加apache bin目录到环境变量。启动服务器,访问localhost:8080,如果出现It works! 说明成功了
apache基本配置
修改apache/conf/http.conf,其中端口修改为8080
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses.
#
#Listen 12.34.56.78:80
Listen 8080
在环境变量中添加apache/bin目录,检查subversion目录是否添加成功
subversion 1.8.1.7
在https://sourceforge.net/projects/win32svn/files/中点击1.8.17,下载 Setup-Subversion-1.8.17.msi
这里也是一路下一步
subversion创建版本库
创建SVN版本库。用svnadmin命令创建库。svn存储版本数据也有2种方式:BDB和FSFS。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。默认使用的存储方式也是FSFS方式。
>D:\svn>mkdir repos
# 运行创建版本库的命令,指定数据存储为 FSFS,如果要指定为 Berkeley DB,则将 fsfs 替换为 bdb
>D:\svn > svnadmin create --fs-type fsfs repos
>D:\svn>cd repos
>D:\svn\repos>dir
驱动器 D 中的卷是 系统
卷的序列号是 A934-A3CB
D:\svn\repos 的目录
2021/03/01 19:53 <DIR> .
2021/03/01 19:53 <DIR> ..
2021/03/01 19:53 <DIR> conf
2021/03/01 19:53 <DIR> db
2021/03/01 19:53 2 format
2021/03/01 19:53 <DIR> hooks
2021/03/01 19:53 <DIR> locks
2021/03/01 19:53 251 README.txt
subversion添加项目
有了新建的版本库,就可以往里面添加项目了。不过,管理员必须考虑的问题是,应该将每一个项目分别放在不同的版本库里面,还是应该将它们放在统一的版本库里面。统一的版本库可以让管理员更加容易的升级和备份,不过,由于访问权限控制是针对整个版本库的,所以,统一的版本库也为不同项目配置不同的访问权限带来了麻烦。所以,管理员应该根据实际情况权衡考虑。
要做到这个,最好的办法就是用
svn import
命令导入已有的目录树。--用 Apache 和 Subversion 搭建安全的版本控制环境
我们以统一版本库为例,先创建下面三个项目
D:/svn
|——tmp1
|————project_1
|————project_2
|——tmp2
|————project_3
|——repos
添加tmp1/project_1和tmp1/project_2。
坑一:这里tmp其实就是临时搭建一个目录结构,tmp目录import之后就可以删除了,import其实就是相当于初始化版本库。一开始我不知道,我以为import意思是把版本库下的项目结构指向tmp,可是修改tmp下的内容,版本库中没有任何更新,资料里面没有阐述这一点,导致我理解错误
>D:\svn\repos>cd ..
>D:\svn>svn import tmp1/ file:///d:/svn/repos/ --message "init"
正在增加 tmp1\project_1
正在增加 tmp1\project_2
提交后的版本为 1。
添加tmp2/project_3
>D:\svn>svn import tmp2/ file:///d:/svn/repos/ --message "init"
正在增加 tmp2\project_3
提交后的版本为 2。
通过svn list 查看导入的项目
D:\svn>svn list --verbose file:///d:/svn/repos
2 fibocom 3月 01 20:01 ./
1 fibocom 3月 01 19:59 project_1/
1 fibocom 3月 01 19:59 project_2/
2 fibocom 3月 01 20:01 project_3/
通过svnlook查看树状结构,show-ids指定显示修改版本号
>D:\svn>svnlook tree repos
/
project_1/
project_2/
project_3/
>D:\svn>svnlook tree repos --show-ids
/ <0.0.r2/187>
project_1/ <0-1.0.r1/0>
project_2/ <2-1.0.r1/67>
project_3/ <0-2.0.r2/0>
配置apache与subversion
通过 Http 协议访问版本库是 Subversion 的亮点之一。使用 Http 协议意味着只需要打开浏览器,输入 URL 即可轻松的浏览整个版本库。灵活通常带来复杂性,Http 方式相对于 svnserve 方式来说需要更多的配置。
由于 Subversion 需要版本化的控制,因此标准的 Http 协议不能满足需求。要让 Apache 与 Subversion 协同工作,需要使用 WebDAV(Web 分布式创作和版本控制)。WebDAV 是 HTTP 1.1 的扩展,关于 WebDAV 的规范和工作原理,可以参考 IETF RFC 2518 。
为了使 Subversion 与 dav 模块通信,需要安装 mod_dav_svn 插件,可以在 Subversion 的安装目录中找到。将其拷贝到 Apache 安装目录的 modules 文件夹下。接下来就是配置 Apache 的 httpd.conf 文件,让 Apache 在启动的时候加载上述模块。
--用 Apache 和 Subversion 搭建安全的版本控制环境
Apache+SVN 配置成功后可以有两种方式:
1)单库方式:SVNPath 每个仓库单独配置各自的密码和权限文件。优点是各自分 开,互相不影响,维护方便。缺点是增加或删除仓库需要修改 apache 的 httpd.conf 后重 启。从 2.0 开始支持。
2)多库方式:SVNParentPath 指定一个父目录,所有仓库在这个父目录下,使用 一个密码文件和一个权限配置文件。优点是增加删除仓库不需要改 apache 的 httpd.conf, 不需要重启 Apache。缺点是项目多会很混乱。从 3.0 开始支持。
---svn ADMIN使用手册
mod_dav_svn 使subversion与dav通信
为了使apache能够使用subversion,需要让 Subversion 与 dav 模块通信,需要安装 mod_dav_svn 插件,可以在 Subversion 的安装目录中找到。将其拷贝到 Apache 安装目录的 modules 文件夹下。接下来就是配置 Apache 的 httpd.conf 文件,让 Apache 在启动的时候加载上述模块。
--用 Apache 和 Subversion 搭建安全的版本控制环境
下面两个模块的#去掉
#LoadModule charset_lite_module modules/mod_charset_lite.so
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so#目前没查这个模块是干嘛的,先打开
#LoadModule dav_lock_module modules/mod_dav_lock.so
增加下面的module,同时,把subversion安装目录中的/bin/下的mode_authz_svn mod_dav_svn加入到apache安装目录的module中
LoadModule dav_svn_module modules/mod_dav_svn.so
访问http://localhost:8080/repos/
多个版本库
如果想要指定多个版本库,可以用多个 Location 标签,也可以使用 SVNParentPath 代替 SVNPath,例如在 /etc/svn
下有多个版本库 repos1,repos2 等等,用如下方式指定:
D:/svn
|——tmp1
|——tmp2
|——repos
|——repos1
|——tmp3
|————project_4
>D:\svn>svnadmin create repos1
>D:\svn>svn import tmp3/ file:///d:/svn/repos1/ --message "init"
正在增加 tmp3\project_4
提交后的版本为 1。
httpd.conf最后增加Location,注意这里repos后面最好不要加‘/’ ,否则小乌龟可能会报错。
<Location /repos>
DAV svn
SVNParentPath "D:/svn"
</Location>
那么访问刚才那个目录就访问不到了
这个时候需要访问地址更改为
配置账号密码
在D盘下新建svn目录svnRepo3。切换到新建目录下,新建userfile.txt,增加用户和密码(密码都是1)。当然切换到版本库下的conf目录,使用passwd代替userfile.txt也可以。
注意:-c参数表示创建一个用户帐号文件,下一次你再创建其它的帐号的时候就不需要这个参数了。
>D:\svn>htpasswd userfile.txt test1
new password: *
re-type new password:*
>D:\svn>htpasswd passwd test2
New password: *
Re-type new password: *
Adding password for user test2
文件中
httpd.conf中增加后面四行
<Location /repos>
DAV svn
SVNParentPath "D:/svn"
AuthType Basic
AuthName "svn repos"
AuthUserFile "D:/svn/passwd"
Require valid-user
</Location>
重启apache,此时,访问http://localhost:8080/repos/repos/,弹出账号密码框,输入用户名密码后,就可以看到repos了,切换到repos1,同样可以看到
mod_authz_svn 目录访问控制
首先吧subversion中的模块mod_authz_svn复制移到apache中,修改httpd.conf,添加下面一行
LoadModule authz_svn_module modules/mod_authz_svn.so
同时修改Location,增加倒数二三行,AuthUserFile和AuthzSVNAccessFile
<Location /repos>
DAV svn
SVNParentPath "D:/svn"
AuthType Basic
AuthName "svn repos"
AuthUserFile "D:/svn/passwd"
AuthzSVNAccessFile "D:/svn/accesspolicy"
Require valid-user
</Location>
新建在D:/svn中新建accesspolicy,注意下面的 / tags /branch等是导入的项目下一级目录而言的
坑二:这里要注意几点,有时候配置权限文件authz或者accesspolicy,怎么配置都不行,报错403,这个时候你最好看看你的log日志。说说我遇到的几个问题
1、authz中不能写x权限(这个是因为log日志中说有一个字符‘x’不允许)
2、权限前面最好不要有空格(https://stackoverflow.com/questions/39343899/subversion-svn-error-cant-parse-config/43491596#43491596 里提到空格可能会产生错误,导致出错)
3、目录前面没有加/ ,比如[/branch]写成[branch](https://askubuntu.com/questions/628456/svn-over-https-broken-after-12-04lts-upgrade-to-14-04lts 里提到,是否是缺少'/'引起的)
关于权限配置的方式,建议看看svn中authz配置文件总结里面写的很详细
注:权限是有继承关系的,例如admin组成员在根目录中已经有rw权限,那么在下面的子目录中,如果没有特别说明,都是有rw权限的。在子目录中要有权限,不管是r还是rw,在上一层的父目录中也一定要有r权限。(http://www.360doc.com/content/13/0617/17/4550476_293525483.shtml 来源最后一段)
#两个分组
[groups]
tester = test1
developers = test2
#在所有项目根目录下指定所有的用户有读权限
[/]
*= rw
#追加 tester 组用户有读写权限
@tester = rw
#在 所有项目/branch 指定 tester2 组的用户有读写权限
[/branch]
@tester2 = rw
#在 所有项目/tag 下给予用户 tester1 读写执行权限
[/tag]
@tester1 = rx
重启服务器,访问localhost:8080/svn ,弹出框中输入账号密码
--------------------------------------------------------------------------------------------------------未完待续-------------------------------------------------------------------------------------------------------------
svnadmin 3.0.5
在https://code.google.com/archive/p/jsvnadmin/downloads中下载 svnadmin-3.0.5.zip
openLADP
安装openLADP介绍:https://www.maxcrc.de/en/openldap-for-windows-installation-en/ 注意图片中Database backend部分,我选择的是LADP
openLADP下载 https://www.maxcrc.de/en/download-en/
添加 E:\openLDAP 到环境变量
启动openLADP
安装完成后,打开cmd切换到安装目录,启动openLADP,按照网上介绍的方法slapd -d l 报错,找到一个11年的答案 https://bbs.csdn.net/topics/390412421?list=30729953
第一个方法——指明配置文件路径slapd.exe -d 1 -f ./slapd.conf
第二个方法——安装目录下面有个 run 目录, run 目录下面有个 run.cmd 直接双击运行;
OpenLDAP默认监听的端口是389,下面我们来看下是不是389端口,如下:
配置ldap
mod_authnz_ldap.so、mod_ldap.so,
参考资料:
用 Apache 和 Subversion 搭建安全的版本控制环境 (非常详细,推荐)
Ubuntu上配置SVN,Apache服务以及常见问题解决方法(这篇也还不错,作者有心了)
Tortoise checkout时卡死的原因,论坛第二页说可能是网络问题,这种情况最好找一下公司的网管,他们知道怎么解决:https://bbs.csdn.net/topics/391992517?page=2