Thursday 5 December 2013

Step by Step Installation of SVN (Subversion) Server


Subversion is free open source version control system to manage the files/directories and the changes of them made all time. The open source community has been using Subversion (SVN) widely of many collaborative development projects.
SVN supports several protocols for network access: SVN, SVN+SSH, HTTP, HTTPS. If you are behind a firewall, HTTP-based Subversion is advantageous since SVN traffic will go through the firewall without any additional firewall rule setting. In this tutorial, I will describe how to set up an HTTP-based Subversion server on Cent OS 5.8.

1.       Installation of Apache Server.

[root@svnserver ~]# yum install httpd*
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * addons: centos.mirror.net.in
 * base: mirror.vietoss.com
 * centosplus: mirrors.fibo.vn
 * contrib: mirrors.digipower.vn
 * extras: centos-hn.viettelidc.com.vn
 * updates: mirrors.digipower.vn
Setting up Install Process
Package httpd-2.2.3-83.el5.centos.x86_64 already installed and latest version

[root@svnserver ~]# /etc/init.d/httpd status
httpd is stopped
[root@svnserver ~]# chkconfig httpd on
[root@svnserver ~]# service httpd start
Starting httpd: httpd: apr_sockaddr_info_get() failed for svnserver
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]

[root@svnserver ~]# vi /etc/httpd/conf/httpd.conf
ServerName svnserver.example.com

[root@svnserver ~]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

2.       Installation of subversion server.
[root@svnserver ~]# yum install mod_dav_svn subversion

3.       Configure Subversion.

Open the subversion config file ‘/etc/httpd/conf.d/subversion.conf’ and edit as follows:

[root@svnserver conf.d]# vi /etc/httpd/conf.d/subversion.conf

LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

#
# Example configuration to enable HTTP access for a directory
# containing Subversion repositories, "/var/www/svn".  Each repository
# must be readable and writable by the 'apache' user.  Note that if
# SELinux is enabled, the repositories must be labelled with a context
# which httpd can write to; this will happen by default for
# directories created in /var/www.  Use "restorecon -R /var/www/svn"
# to label the repositories if upgrading from a previous release.
#

#
# To create a new repository "http://localhost/repos/stuff" using
# this configuration, run as root:
#
#   # cd /var/www/svn
#   # svnadmin create stuff
#   # chown -R apache.apache stuff
#

<Location /svn>
   DAV svn
   SVNParentPath /var/www/svn

   # Limit write permission to list of valid users.
      # Require SSL connection for password protection.
      # SSLRequireSSL
      AuthType Basic
      AuthName "Authorization Realm"
      AuthUserFile /etc/svn-auth-users
     Require valid-user
   </Location>

4.       Create a new user for Subversion called “jitendra” for instance.

[root@svnserver ~]# htpasswd -cm /etc/svn-auth-users jitendra
New password:
Re-type new password:
Adding password for user Jitendra

5.       Create and configure subversion Repository.

Create a directory for subversion repository under “/var/www/svn” directory.

[root@svnserver ~]# mkdir /var/www/svn
[root@svnserver ~]# cd /var/www/svn
[root@svnserver svn]# svnadmin create repos
[root@svnserver svn]# ls
repos
 [root@svnserver svn]# chown apache.apache -R repos
[root@svnserver svn]# service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

6.       Disable Anonymous Users.

If you want to disable the anonymous user to access the repository, just edit the following line in‘repos/conf/svnserver.conf’ file.

[root@svnserver conf.d]# vi /var/www/svn/repos/conf/svnserve.conf

anon-access = none
authz-db = authz

7.       SELINUX Settings.

 If you enabled SELinux, run the following commands to change the SELinux context security.

[root@svnserver ~]# chcon -R -t httpd_sys_content_t var/www/svn/repos/
[root@svnserver ~]# chcon -R -t httpd_sys_rw_content_t /var/www/svn/repos/

8.       IPTABLES Settings.

Make sure that you have opened the apache default port ’80 through iptables.
[root@svnserver ~]# vi /etc/sysconfig/iptables
-A INPUT -p udp -m state --state NEW --dport 80 -j ACCEPT

-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT

9.       Testing Subversion.

We can test the subversion by typing http://10.226.10.10/svn/repos in web browser.






10.   Create additional links(directories) under Subversion Repository.

Create some sample directories in any place and import them to your Subversion repository.

[root@svnserver ~]# mkdir subversion-templates
[root@svnserver ~]# cd subversion-templates/
[root@svnserver subversion-templates]#mkdir  jitendra

Now import the sub directories using the command ‘svn import’.
[root@svnserver ~]# svn import -m 'Initial import' subversion-templates/ http://10.226.10.10/svn/repos/
Authentication realm: <http://10.226.10.10:80> Subversion repositories
Username: jitendra
Password for 'jitendra':
Adding         /subversion-templates/jitendra

-----------------------------------------------------------------------
ATTENTION!  Your password for authentication realm:

   <http://10.226.10.10:80> Subversion repositories
can only be stored to disk unencrypted!  You are advised to configure
your system so that Subversion can store passwords encrypted, if
possible.  See the documentation for details.

You can avoid future appearances of this warning by setting the value
of the 'store-plaintext-passwords' option to either 'yes' or 'no' in
'/root/.subversion/servers'.
-----------------------------------------------------------------------
Store password unencrypted (yes/no)? no

Committed revision 1.


SVN Backup Script & Restore dump

I am using SVN Server and several repositories have been created under “/home/repositories/” directory. I will use below script to take all SVN repositories backup on local system under “/SVN_Backup” path.

Please find below the script for SVN repositories backup.

[root@svn02 ~]# cat /scripts/svn_backup


#!/bin/bash

# Record today’s day of week and Hour
# ---------------------------------------
bakdate=$(date +%A_%H)
echo "--------------------------------"
echo "Running SVN backup $bakdate"
echo "--------------------------------\n"

# From where to backup repos?
# ---------------------------------------

svnrepos="/home/repositories/"
echo "\nGoing to backup all SVN repos located at: $svnrepos \n"

# Where to save the dump?
# -----------------------------------------
bakdest="/SVN_Backup"


# _________NO-COFIG-REQUIRED-BELOW-THIS-LINE___________

# First go to SVN repo folder

cd $svnrepos


# Just make sure we have write access to backup-folder

if [ -d "$bakdest" ] && [ -w "$bakdest" ] ; then
  # Now $repo has folder names = project names
  for repo in *
     do
    # do svn dump for each project
    echo "Taking backup/svndump for: $repo"
    echo "Executing : svnadmin dump $repo > $bakdest/$repo-$bakdate.svn.dump \n"
    # Now finally execute the backup

    /usr/bin/svnadmin dump $repo > $bakdest/$repo-$bakdate.svn.dump
    # You can go an extra mile by applying tar-gz compression to svn-dumps
    gzip $bakdest/$repo-$bakdate.svn.dump

  done
else
  echo "Unable to continue SVN backup process."
  echo "$bakdest is *NOT* a directory or you do not have write permission."
fi

# End of backup script
echo "\n\n================================="

echo " - Backup Complete, THANK YOU :-]"



We can schedule the backup script once a day in cron job.

[root@svn02 ~]# crontab -e
00 02 * * * /scripts/svn_backup




2. Restore DUMP of subversion (SVN) Repository.

svnadmin create /path/to/repo_name

svnadmin load /path/to/repo_name < path/to/repo_name.dmp