I use Linode for my VPS and it's cheap, simple and I've never had any problems with it. The goal of this is for me to write down how I deployed an application written using Yesod to a Linode instance. I found it wasn't as straight-forward as I'd hoped so I've tried to document all the steps I went through.
First off, create yourself a 32bit Ubuntu 10.04 image (with less than 4GB of RAM, 64 bit just wastes space). Once you've got this, ssh onto the machine and download the latest and greatest Haskell and Haskell platform.
To install GHC
wget http://www.haskell.org/ghc/dist/7.0.3/ghc-7.0.3-i386-unknown-linux.tar.bz2 tar xvf ghc-7.0.3-i386-unknown-linux.tar.bz2 cd ghc-7.0.3 sudo apt-get install gcc libgmp3-dev ./configure make install
After this has completed, fire up
ghci
and verify you can evaluate Haskell commands (print "Hello World"
ought to confirm that everything is working, missing libgmp3-dev
causes ghc to install but not run). Next the Haskell platform.wget http://lambda.galois.com/hp-tmp/2011.2.0.1/haskell-platform-2011.2.0.1.tar.gz tar xvf haskell-platform-2011.2.0.1.tar.gz sudo apt-get install zlib1g-dev libglut3-dev make make install
I had a somewhat bizarre issue where the first round of make failed to build OpenGL. Running
make
again made the troubles go away. No idea why, but it doesn't seem to have caused any problems. At this stage you should have a completely working Haskell environment, with lots of lovely packages installed from Hackage.Next step is to actually build and run the application. I've got my code up on a Mercurial instance, so I simply clone the repository onto the build server, and then I can just use cabal to build locally and end up with an executable. This reddit comment suggests that building and linking with GHC takes huge amounts of memory. I'm on the cheapest plan at Linode which only have 512MB of RAM and I had no problems, but then again I'm only deploying toy applications at the moment. As said on Reddit, if you do run into problems build locally with the same architecture and upload to the server.
The recommended way of deploiying a Yesod application is to use nginx as a reverse proxy, together with Warp. Getting nginx up and running on Linode is documented here. Nginx is the 10.04 repositories is only up to version 0.76, so I built the latest release from source.
The below is simple
nginx.conf
file adapted from the Yesod web site.daemon off; # don't run nginx in the background, good for monitoring app events { worker_connections 4096; } http { # If multiple domains are hosted on the same box, this can be used to # block everything that isn't directed at a specific host server { listen 80 default_server; server_name _; return 444; } server { # Important, serve files with the appropriate mime-type # Without this some browsers don't interpret JS, CSS correctly include /opt/nginx/conf/mime.types; listen 80; server_name search.boringtosser.co.uk; location / { proxy_pass http://127.0.0.1:3000; } # Used for serving static content location /static { root /home/jeff/code/keywordSearch; expires max; } } }
nginx comes with default start scripts in /etc/init.d.
/etc/init.d/nginx start
starts the server running with the default configuration. Swapping start for stop obviously stops it! To get your Yesod application built use cabal, making sure to build the production version with cabal -fproduction configure
. As described in the Yesod book you can use an Upstart script to keep things up and running. And that should be all there is to it!