Setting up simple but easy to work with LAMP development environment
I’ve recently changed the way I work so I figured I would detail it here.
First off all let me describe the setup. Basically all my code resides in a subversion repository on server X. My development environment is a virtual server run on virtualbox, a default ubuntu server with a LAMP stack. On my client I run the PDT edition of eclipse with subclips installed.
The client side:
- Install PDT eclipse, you can download it from http://www.eclipse.org/pdt/downloads/.
- Go to http://subclipse.tigris.org/ and follow the text to install it into your eclipse installation.
- In your eclipse choose import from the file menu and select “checkout project from SVN”
- You now should have a checkout on disk inside a project to work from in eclipse
Development environment side:
- Create and setup a LAMP based virtual server. (I’m going to assume ubuntu because that’s what I’ve used)
- Create a virtual host for your project.
The actual interesting bit:
Now the above is really standard stuff, so that’s why it’s a bit brief, but now comes the interesting bit.
What we want to do is mount the code checkout from your client machine as the serving directory of your development environment. Because I’m lazy I want to be able to do this with one click of the button, so we are going to break some security things to be able to do this via the browser.
We want the apache user (www-data in my case) to be able to mount via sshfs and unmount. This will enable it to mount the checkout from my client pc to the serving directory of apache on the virtual server.
First we want to add www-data to the fuse usergroup, we do this via the following command.
sudo usermod -G fuse www-data
Now the www-data user will be allowed to use sshfs.
Next we create the file /var/www/index.php and put some code into it. The following code is really simple and could probably be made more elegant but currently I don’t care
if ($_GET['mount']=='myproject' )
`sshfs firstname.lastname@example.org:/home/demo/workspace/myproject /var/www/myproject`;
`sudo umount /var/www/myproject/`;
myproject is currently mounted -- <a href="?umount=myproject" />umount</a>
myproject is currently not mounted -- <a href="?mount=myproject" />mount</a>
What this allows us to do is to go to the default hosts index.php and remotely tell the server to mount or unmount the environment. There are a few things we need to do to actually make the above code work though.
First the mounting.
sshfs uses ssh, so since we want to use it without user interaction we need to create a private and public key for www-data.
sudo su - www-data
After that you should have a set of keys, then copy the public key to your client and add it in ~/.ssh/authorized_keys of the user you need to log into.
Now the mounting of the repository should work.
However for the unmounting we need to use sudo to get the rights to do that. So for that we need to edit /etc/sudoers on the virtual server and add the following line somewhere.
www-data ALL = NOPASSWD: ALL
Yes, it would be much safer to not allow ALL, but only the umount, but for my virtual development box i’m really not concerned with security, I just want a trouble free and quick fix.
So now I created a simple script that will let me mount and unmount my working copy of the code on the virtual server.
I typed this all up rather quickly so if anyone wants some parts explained in some more detail just leave a comment.