SVN服务器部署并实现双机同步及禁止普通用户删除文件

时间:2022-08-22 06:29:57

下面来布署svn服务器

所有文件下载地址: http://pan.baidu.com/share/link?shareid=395023&uk=2501966565

环境:CentOS5.8 x64 ,开发包组已安装,iptables,selinux已经关闭

一.安装配置apache

1.1 下载编译安装apache

 
  1. tar xvf httpd-2.2.22.tar.bz2 
  2. cd httpd-2.2.22 
  3. ./configure  --prefix=/opt/apache \ 
  4. --enable-so \    
  5. --enable-dav \    
  6. --enable-dav-fs \  
  7. --enable-maintainer-mode \  
  8. --with-included-apr \ 
  9. --enable-rewrite \ 
  10. --enable-ssl \ 
  11. --enable-proxy \ 
  12. --enable-proxy-http 
  13.  
  14. make && make install 

1.2 配置apache 

添加apache 用户

 
  1. useradd -r apache 

以apache身份运行httpd

 
  1. sed -i 's@User daemon@User apache@g' /opt/apache2/conf/httpd.conf 
  2. sed -i 's@Group daemon@Group apache@g' /opt/apache2/conf/httpd.conf 

1.3 为了方便将apache命令加入PATH,并将apache库导出

 
  1. echo 'export PATH=$PATH:/opt/apache2/bin' > /etc/profile.d/httpd.sh 
  2. . /etc/profile.d/httpd.sh 
  3.  
  4. echo '/opt/apache2/lib' > /etc/ld.so.conf.d/apache.conf 

导出 

 
  1. ldconfig  
  2. rm -rf httpd-2.2.22 

二.安装MySQL

2.1安装cmake

 
  1. tar xvf cmake-2.8.4.tar.gz 
  2. cd cmake-2.8.4 
  3. ./configure 
  4. make && make install 
  5. cd .. 
  6. rm -rf cmake-2.8.4 

2.2 安装mysql

 
  1. tar xf mysql-5.5.28.tar.gz 
  2. cd mysql-5.5.28 
  3.  
  4. cmake -DCMAKE_INSTALL_PREFIX=/opt/mysql \ 
  5. -DSYSCONFDIR=/opt/mysql/etc \ 
  6. -DMYSQL_DATADIR=/opt/mysql/data \ 
  7. -DMYSQL_TCP_PORT=3306 \ 
  8. -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock \ 
  9. -DMYSQL_USER=mysql \ 
  10. -DEXTRA_CHARSETS=all \ 
  11. -DWITH_READLINE=1 \ 
  12. -DWITH_SSL=system \ 
  13. -DWITH_EMBEDDED_SERVER=1 \ 
  14. -DENABLED_LOCAL_INFILE=1 \ 
  15. -DWITH_INNOBASE_STORAGE_ENGINE=1 
  16.  
  17. make && make install 
 
  1. cd .. 
  2. rm -Rf  mysql-5.5.28 

配置文件与启动脚本

 
  1. cd /opt/mysql 
  2. cp support-files/my-huge.cnf /etc/my.cnf 
  3. cp support-files/mysql.server /etc/init.d/mysqld 

2.3 以mysql用户运行mysql,修改PATH并导出库

 
  1. useradd -r mysql 
  2. chown -R mysql:root . 
  3. ./scripts/mysql_install_db --user=mysql --datadir=data/ 
 
  1. echo 'export PATH=$PATH:/opt/mysql/bin' > /etc/profile.d/mysql.sh 
  2. . /etc/profile.d/mysql.sh 
 
  1. echo '/opt/mysql/lib' > /etc/ld.so.conf.d/mysql.conf 
  2. ldconfig  

启动mysql

 
  1. service mysqld start 

三.安装php

3.1 安装php,安装它是因为svnmanager需要

 
  1. cd /root/svn 
  2. tar xvf php-5.3.18.tar.gz 
  3. cd php-5.3.18 
  4.  
  5. ./configure --prefix=/opt/php \ 
  6. --with-apxs2=/opt/apache2/bin/apxs \ 
  7. --with-mysql=/opt/mysql \ 
  8. --enable-mbstring  
  9.  
  10. make && make install 
 
  1. cp php.ini-production /etc/php.ini 
 
  1. cd .. 
  2. rm -Rf php-5.3.18 

添加apache的php支持

 
  1. sed -i '/AddType application\/x-gzip .gz .tgz/a\ 
  2. AddType application/x-httpd-php .php' /opt/apache2/conf/httpd.conf 
  3.  
  4. sed -i 's@DirectoryIndex index.html@DirectoryIndex index.php index.html@g' /opt/apache2/conf/httpd.conf 

启动apache测试



  1. rm -f /opt/apache2/htdocs/index.html 
  2.  
  3. echo '<?php 
  4. phpinfo() 
  5. ?>> /opt/apache2/htdocs/index.php 
 
  1. apachectl start 

访问http://$IP/测试apache,php,mysql是否部署下确

四.安装subversion

4.1 解压安装subversion

 
  1. tar xf subversion-1.6.13.tar.bz2   
  2. tar xf subversion-deps-1.6.13.tar.bz2 
  3. cd subversion-1.6.13 
 
  1. ./configure --prefix=/opt/subversion \ 
  2. --with-apxs=/opt/apache2/bin/apxs \ 
  3. --with-apr=/opt/apache2/bin/apr-1-config \ 
  4. --with-apr-util=/opt/apache2/bin/apu-1-config 
  5.  
  6. make && make install 
 
  1. echo 'export PATH=$PATH:/opt/subversion/bin' > /etc/profile.d/svn.sh 
  2. . /etc/profile.d/svn.sh 
 
  1. cd .. 
  2. rm -rf subversion-1.6.13 

4.2 让apache与svn结合

 
  1. sed -i '/httpd-default.conf/a\ 
  2. Include conf/extra/httpd-svn.conf' /opt/apache2/conf/httpd.conf 
 
  1. echo ' 
  2. <Location /svn> 
  3. DAV svn 
  4. SVNListParentPath On 
  5. SVNParentPath /opt/svn_repos 
  6. AuthType Basic 
  7. AuthName "Subversion Repository" 
  8. AuthUserFile /opt/subversion/conf/passwdfile 
  9. AuthzSVNAccessFile /opt/subversion/conf/accessfile 
  10. Require valid-user 
  11. </Location> ' > /opt/apache2/conf/extra/httpd-svn.conf 

4.3 创建提到的文件

 
  1. mkdir /opt/subversion/conf 
  2. touch /opt/subversion/conf/passwdfile 
  3. touch /opt/subversion/conf/accessfile 
  4. mkdir /opt/svn_repos 

4.4 创建一个repo,添加一个测试账户,配置权限,测试

 
  1. svnadmin create /opt/svn_repos/test/  ##创建一个repo
  2. chown -R apache:apache /opt/subversion/  ##我们通过apache来管理svn的
  3. chown -R apache:apache /opt/svn_repos/ 
  4. htpasswd -bm /opt/subversion/conf/passwdfile test  "admin" 
 
  1. echo ' 
  2. [test:/] 
  3. * = r 
  4. test = rw ' > /opt/subversion/conf/accessfile  ##access文件是权限控制文件

4.5 重启apache测试

 
  1. apachectl restart 

访问http://$IP/svn/test 

输入账号,密码

如果看到test - Revision 0: / 证明没问题,继续

五.安装svnmanager,以图形化的方式管理svn

5.1 安装VersionControl_SVN,svnmanager需要它

 
  1. /opt/php/bin/pear install VersionControl_SVN-0.3.4 

出现ok,等代表成功

5.2 安装svnmanager

 
  1. tar xf svnmanager-1.08.tar.gz 
  2. mv svnmanager-1.08 /opt/apache2/htdocs/svnman 

5.3 修改配置文件 

 
  1. cp /opt/apache2/htdocs/svnman/config.php.linux /opt/apache2/htdocs/svnman/config.php 
  2.  
  3. vim /opt/apache2/htdocs/svnman/config.php 
  4.  
  5. $htpassword_cmd                         =       "/opt/apache2/bin/htpasswd"; ##意思很明显
  6. $svn_cmd                                        =      "/opt/subversion/bin/svn"
  7. $svnadmin_cmd                           =       "/opt/subversion/bin/svnadmin"
  8.  
  9. //Subversion locations 
  10. $svn_config_dir                         =       "/opt/subversion/conf"
  11. $svn_repos_loc                          =       "/opt/svn_repos"
  12. $svn_passwd_file                        =       "/opt/subversion/conf/passwdfile"
  13. $svn_access_file                        =       "/opt/subversion/conf/accessfile"
  14. $dsn                   =      "mysql://svnmanager:admin@localhost/svnmanager";  ##mysql,去掉i
  15. $admin_name                                             =       "admin"; ##初始的账号密码
  16. $admin_temp_password                    =       "admin"

5.4 创建数据库

 
  1. mysql  
  2. mysql> create database svnmanager; 
  3. mysql> grant all on svnmanager.* to 'svnmanager'@'localhost' identified by 'admin'; 
  4. mysql> flush privileges; 

5.5 将VersionControl_SVN拷到svnmanager中

 
  1. tar xvf VersionControl_SVN-0.3.4.tgz 
  2. mv VersionControl_SVN-0.3.4 /opt/apache2/htdocs/svnman/VersionControl 
  3.  
  4. chown -R apache:apache /opt/apache2 

5.6 访问测试

http://$IP/svnman

初始账号:admin

初始密码:admin 

建立新的管理账号后旧的就停用了

svnmanager用法见http://wenku.baidu.com/view/4d95d0303968011ca30091a2.html

建立库,与用户后测试。到此svn服务器构建完毕

 

六.配置svn双机同步

原来有svn服务器,现在做一个镜像服务器,当原来的服务器down掉后可以代替它

源服务器:192.168.17.140

镜像服务器:192.168.17.139

实例同步的为源服器为crm的项目到镜像服务器

6.1 在镜像服务器上建立一新库crm,与具有读写权限的用户

用svnmanager来建,svnadmin create 的话svnmanager中看不到

这个就不写了,假设源上是http://192.168.17.140/svn/crm,镜像的为http://192.168.17.139/svn/crm,用户为:laoguang,密码为:admin 对两个项目都可读可写

6.2 修改镜像服务下项目hook目录下的脚本并启用

 
  1. cp /opt/svn_repos/crm/hooks/pre-revprop-change.tmpl /opt/svn_repos/crm/hooks/pre-revprop-change 
  2.  
  3. vim /opt/svn_repos/crm/hooks/pre-revprop-change 
  4. 把最后的exit 1改为exit 0 即可 

6.3 镜像服务器执行初始化

 
  1. svnsync init file:///opt/svn_repos/crm/ http://192.168.17.140/svn/crm/ 

输入具有读写账号密码,root的好像写的不对也没事

比如,我在192.168.17.140的一个账号laoguang 密码 admin

出现Copied properties for revision 0. 代表正确

6.4 开始同步源服务器上的数据

 
  1. svnsync sync file:///opt/svn_repos/crm/ 
 
  1. --------------------------- 
  2. Store password unencrypted (yes/no)? yes  
  3. Transmitting file data ..............................  
  4. Committed revision 1.  
  5. Copied properties for revision 1.  
  6. Transmitting file data .  
  7. Committed revision 2. 
  8. Copied properties for revision 2.  
  9. Transmitting file data .  
  10. Committed revision 3.  
  11. Copied properties for revision 3.  
  12. ----------------------------- 
  13.  
  14. 代表同步成功 

6.5 配置当源版本改变时自动同步

下面开始在源服器上操作

 
  1. cp /opt/svn_repos/crm/hooks/post-commit.tmpl /opt/svn_repos/crm/hooks/post-commit 
  2.  
  3. chmod 755 /opt/svn_repos/crm/hooks/post-commit 

删除未注释的内容

在最下面写上

 
  1. /opt/subversion/bin/svnsync sync --non-interactive http://192.168.17.139/svn/crm/ --username laoguang --password admin

升级源svn版本,测试镜像上同步了没。

七.配置svn 禁止普能用记删除文件

7.1修改源上的钩子脚本

 
  1. cp /opt/svn_repos/crm/hooks/pre-commit.tmpl /opt/svn_repos/crm/hooks/pre-commit 
  2. chmod +x /opt/svn_repos/crm/hooks/pre-commit 
  3. vim /opt/svn_repos/crm/hooks/pre-commit 
  4.  
  5. REPOS="$1"  ##库位置
  6. TXN="$2"  ##版本
  7.  
  8. SVNLOOK=/opt/subversion/bin/svnlook  ##svnlook的位置
  9. SCMLIST="admin"  ##允许删除的用记
  10. C_USER=`$SVNLOOK info -t $TXN $REPOS | sed -n "1p"`  ##执行commit的用户
  11.  
  12. if [ -z `echo $SCMLIST | grep $C_USER` ];then  ## 如果commit的用户没在允许的里面
  13.     echo `$SVNLOOK changed -t $TXN $REPOS` > /opt/svn_repos/qingdao/commit_log  ##将操作写入日志
  14.    if  cat /opt/svn_repos/crm/commit_log|cut -d" " -f1|uniq -u|grep "^D";then ##如果日志开头包含D(D代表删除)
  15.       echo "You do not have permisson to delete a file" > /dev/stderr ##提示错误
  16.       rm -rf /opt/svn_repos/crm/commit_log  ##删除文件
  17.       exit 1  ##错误退出
  18.    fi 
  19. fi 
  20.  
  21. exit 0 

到此本文完毕,构建svn主要参考 http://300second.blog.51cto.com/7582/1065758,感谢300second