I recently wanted to setup a subversion server. Initially I thought of using Beanstalk since they handle pretty much everything for you for a very small monthly fee. However, I thought I might set up my own server in order to learn the process.
I found a few online resources that outlined the process, but none of them were exactly what I needed, so I decided to write this post to go over the steps in detail. Hopefully this helps!
The steps we are going to take:
The first step is to login to the AWS Management Console.
SVN- this will create the key pair and initiate a download. Store this key in a safe place - i.e. do not lose it!
Next, click on Security Groups (under Network and Security)
Ok, now we have the “firewall” rules setup and a KeyPair (used to connect via SSH) to connect to an instance. Now we need to create a new server instance in EC2.
We now want to connect and Elastic IP to our instance (this must be done every time you start the instance…Amazon doesn’t automate this at all).
The last step would be to create an A record on your DNS server for the new IP. For the purposes of this article I’m going to assume that you’ve done this step, however while going through the rest of this post, you can simply replace
<domain> with your Elastic IP address supplied by Amazon and get the same results.
Now that we’ve got the server all setup in AWS, we need to connect to our new server and install some applications that will make things a little easier to work with.
There are loads of SSH applications out there that will let you use SSH from Windows (my preference is Putty - and it’s free). If you’re connecting from a Mac or any ‘nix system, SSH is already built-in. For this article, I’ll assume we’re using a Mac/Nix installation. If you’re using Windows, check out this post on connecting to EC2 with Putty.
Connecting from a Console
sudo chmod 600
Now that we’re connected to the instance, we need to install a few things. I should note, I’m a big fan of emacs, so I always install it. If you’re not familiar with Unix editors, stick to pico to keep things simple. For the remainder of this article, I’ll use the word editor to refer to your preferred editor of choice on Linux.
Run the following commands to install subversion and svnserve.
$ sudo yum install mod_dav_svn subversion
Next we’re going to create a few new folders:
$ sudo mkdir -p /data/svn/repos /data/svn/logins /data/svn/scripts $ sudo chown -R apache.apache /data/svn
Now we need to create a subversion account to use for connecting to a repository. To do this we are going to create a new auth file and the create a script to handle adding new users in the future. To do this, run the following commands:
$ cd /data/svn/logins $ sudo htpasswd -cm svn-auth-conf
We should now make the login file a little more secure by running
sudo chmod 600 svn-auth-conf. Next, we’re going to create a script called create_user.sh that we can use to add user’s in the future. This will make sure that we don’t forget the commands and also ensure that we don’t accidentally include -c again which will create a new file (overriding anything existing) - bad.
Using your editor, create the following script (in
/data/svn/scripts), save it to a file called create_user.sh and then run sudo chmod +x create_user.sh to add execute rights to the file.
#!/bin/bash user_name="$1" auth_file="../logins/svn-auth-conf" if [ "$user_name" = " ]; then echo -n "Enter user name: " read user_name fi chmod 700 $auth_file if [ $? -eq 0 ]; then htpasswd -m $auth_file $user_name chmod 600 $auth_file fi
We can use this script by passing in a username or allowing the script to prompt us for one:
$ sudo ./create_user.sh davidmuto # or $ sudo ./create_user.sh
Now we need a script that allows us to create repositories. The reason we make this a script is to save us from retyping the same commands every time we create a repo (very prone to error). Here’s a script that will create a repository and set all of the necessary permissions on the files for being served by apache.
#!/bin/bash repo_name="$1" path_to_repo=" if [ "$repo_name" = " ]; then echo -n "What should the repo be called?: " read repo_name fi path_to_repo="../repos/$repo_name" svnadmin create $path_to_repo if [ $? -eq 0 ]; then sudo chown -R apache.apache $path_to_repo sudo chcon -R -t httpd_sys_content_t $path_to_repo echo "Successfully create repo '$path_to_repo'" else echo "Could not create repository $path_to_repo" fi
Our last step it to set up the apache config file for servicing subversion repo requests.
Add the following Location element to the file
<Location /> DAV svn SVNParentPath /data/svn/repos AuthType Basic AuthName "My Subversion Realm" AuthUserFile /data/svn/logins/svn-auth-conf Require valid-user </Location>
Restart the apache service: sudo service httpd restart
Now let’s run through the process of creating a new repo and connecting to it.
sudo ./create_user.sh [user_name]
sudo ./create_repo.sh [repo_name]
I hope this posts helps someone in need. If you guys notice anything I’ve missed, please feel free to let me know and I’ll update this post as needed.