Symfttpd: symfony's long-awaited lightweight server
December 10, 2010Laurent Bachelier3 min read
A project is never finished, and at Theodo we often have to quickly alter a project, in a small way. The issue is that the time required to having the project ready on a developer's machine can be greater that the time required to do the the rest! But worse, setting up a project is boring.
This is why we decided to automate as much as possible the low added-value aspects of setting up a project.
There are usually four aspects to setting up a project:
- Configuration files
- A database
- A web server, configured for the website, including the URL rewriting
In our case, it usually means only "Symfony, version 1.x". For Python projects, a pip dependencies file is provided, and running a script will create a virtualenv and install the dependencies: no root access or hunting on the web is needed.
For Symfony projects, it's easy to have all major versions at hand. However, these projects usually require multiple symbolic links to be created, in non-standardized places. Thankfully, we chose to adopt convention over configuration and only one line of configuration is actually needed for mksymlinks to do its magic.
If you chose to install Symfony other than in
lib/vendor (likely with versions under 1.2), you can of course configure
mksymlinks to handle it.
The configuration of a project on the production servers and on the developer's machines usually differ; database passwords, mail and database servers location, etc. The configuration files are therefore not versioned, only sample versions of them are, designed for a standard development environment.
A simple script can find the "sample" configuration files and create symbolic links (ideal for developers) or copies of these sample files. The developer shouldn't need to alter these files to setup the project.
Running the script will for instance create a symlink from
While recent versions of Symfony and Doctrine can create a database, older versions and Propel can't. Also, database users and their credentials still have to be created, and it is really annoying to set them up. We use a simple script which will write a SQL script, and will try to run it using the credentials of
An alternative is to use SQLite, but it can quickly become a limitation for bigger projects.
The database is then filled with meaningful and useful fixtures.
The web server
Last but not least, the web server. Frameworks like Ruby on Rails or Django come with their own servers. These are not for production use, but are perfect for developer's needs: no root access required, instant startup, no configuration… In the PHP world, nothing similar to be found. However, it is very well possible to configure and start a small server automatically.
That's the job of symfttpd and its command spawn: run it and it will configure and start a lighttpd-based server, then tell you where you can view the project, and what applications are present.
The scripts handling the sample configuration and database are rather crude and around 50 lines of code; you should be able to write your own in no time if you are too impatient for a proper release of our own.
Let's not forget documentation
While all of this works great, nothing replaces an INSTALL file with all the necessary steps, especially the unusual ones. It's also nice to provide scripts to run all the required commands in one go; run it and your project is ready! (There's still time to get a nice cup of coffee especially with our new awesome coffee machine.)
There is more to come
On the same principles, we use some of the tools mentioned above in our continuous integration platform, to be able to add any project in no time.
Symfttpd with its tools spawn and mksymlinks has been publicly released: https://github.com/laurentb/symfttpd. You can use them to accelerate the deployment of your development environment. As for the small scripts which automate the rest of our needs, we will surely release them in an upcoming post about continuous integration. More about it will follow, so be sure to subcribe!