I had to setup a Ubuntu (8.04) Server virtual machine and get Rails up-to-speed on it this morning, so I thought I would document my steps for those who find the need to repeat. Here is what I needed:
- A production server, not a development server, with only what is necessary
- A virtual machine that runs under VMware Player
- Ubuntu Server, 8.04 is the current, referred to as Hardy Heron
- Apache2 with Phusion Passenger to handle Rails applications
- Ruby, Rubygems, Ruby on Rails, a full Rails stack
- MySQL Server and SQLite, with phpMyAdmin to admin MySQL server
- All native drivers for Rails (MySQL and SQLite)
- OpenSSH server to access the server
- Postfix to send (only) emails
What you need to start:
- VMware Player installed. Download it from VMware directly and follow their instructions (aptitude has older version 1.x)
- Download the Ubuntu 8.04 Server ISO file for your machine. For torrent users, download the current i386 torrent file.
- Download my VMX and VMDK files (vmplayer config and empty virtual disk).
Step 1: Setup Directory and Config File
Create a new directory somwhere (I called mine ‘Ubuntu840Server’) and copy the Ubuntu ISO file and the VMX and VMDK (don’t forget to unzip) files into it. You will need to do some quick editing to the Ubuntu840Server.vmx file, so fire up your favorite editor (in Ubuntu Desktop, right-click and Open with “Text Editor”). The only sections you may need to edit are:
- ide1:1.filename, make sure it matches the name of your ISO file, something like “ubuntu-8.04.1-serverr-i386.iso”
- fileSearchPath, change to the path of the directory you created
Step 2: Run VMWare Player
Run VMware Player and open the Ubuntu840Server.vmx. If all the config settings are correct and the ISO files is in the directory, you should boot into Ubuntu Installer.
Step 3: Install Ubuntu Server
I won’t go into details here because Ubuntu has step-by-step instructions on how to install. But the short story is: accept the defaults.
There is one selection that will make installation easier, select LAMP Server when asked for the Software selection. LAMP stands for Linux/Apache/MySQL/PHP. It will install all those packages and configure them automatically for you.
Note: even though I selected a LAMP server, for some reason it did not install Apache/Mysql/PHP. If this happens to you, just do the following after the server re-boots:
sudo apt-get install apache mysql-server php5 libapache2-mod-php5 php5-mysql
Step 4: Get the Latest Updates
If everything went well, you should reboot into Ubuntu Server and see the login: prompt. Go ahead and login with the username and password you supplied during the installation. Make sure you have the latest updates for Ubuntu by running (this may take a while):
sudo apt-get update
sudo apt-get upgrade
Step 5: Install OpenSSH
I like to administer my VMs from the terminal via SSH. Ubuntu Server does not come preconfigured with an SSH server, so lets install one:
sudo apt-get install openssh-client
sudo apt-get install openssh-server
You don’t really need the openssh-client, but I like to have it in case I ever need to ssh from the server to somewhere else. I can’t recommend enough that you secure your SSH server. If you server is exposed to the internet, it will be attacked, and one of the favorite vulnerabilities is SSH. Read this article on how to Secure an OpenSSH Server!
Step 6: Install phpMyAdmin
Since we are using MySQL, having a graphic administration program is nice and it’s hard to beat phpMyAdmin. I installed it from aptitude, but it did not set the proper aliases for apache2, so there are a few extra steps:
sudo apt-get install phpmyadmin
# create a site file for apache2
sudo pico /etc/apache2/sites-available/phpmyadmin
# enter the following in pico
Alias /phpmyadmin/ "/usr/share/phpmyadmin/"
Alias /phpmyadmin "/usr/share/phpmyadmin/"
<Directory "/usr/share/phpmyadmin/" >
Options Indexes FollowSymLinks MultiViews
Allow from all
Deny from none
# close and save pico, then enter this to enable the phpmyadmin site
sudo a2ensite phpmyadmin
sudo /etc/init.d/apache2 restart
Step 7: Install Ruby
Next we need to install ruby. We’ll use the aptitude pre-built binaries to save time and make it easier to update in the future, but you may wish to install it from source. We also install the sqlite3 database because it is the default used by Rails 2.X and many test packages, but you can omit if you want.
sudo aptitude install ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8 libreadline-ruby1.8 libruby1.8 libopenssl-ruby sqlite3 libsqlite3-ruby1.8 build-essential mysql-client libmysqlclient15-dev postfix
Note that we installed the ‘build-essential’ package. This package is necessary for you to install any other software from source (like native msql drivers and phusion passenger). We also install the postfix package, you can just accept the defaults.
Next you will need to set some symlinks so that the libraries will be located when needed.
sudo ln -s /usr/bin/ruby1.8 /usr/bin/ruby
sudo ln -s /usr/bin/ri1.8 /usr/bin/ri
sudo ln -s /usr/bin/rdoc1.8 /usr/bin/rdoc
sudo ln -s /usr/bin/irb1.8 /usr/bin/irb
Now, when you should see your ruby package when you check the version from the terminal.
karl@ubuntuserver:~$ ruby -v
ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux]
Step 8: Install RubyGems
RubyGems is a package manager like aptitude that makes is trivial to add/update/delete resources that ruby (and Rails) will need. It’s also how you will install and update Rails. We are going to install RubyGems from source as the aptitude package is quite out-of-date. RubyGems is a self-updating application, and when installed from aptitude, aptitude will complain and you may accidentally downgrade RubyGems.
# create a sources directory in your home
#download gem package, see rubygems homepage for the latest
# decompress the files and setup rubygems
tar xzvf rubygems-1.2.0.tgz
sudo ruby setup.rb
# add a symlink
sudo ln -s /usr/bin/gem1.8 /usr/bin/gem
sudo gem update --system
sudo gem update
Step 9: Install Ruby on Rails
All this work, and we are finally here. Too bad installing Rails is so easy. Just this one line.
sudo gem install rails
and a couple more gems you will probably need…
# install the native (faster) mysql driver
sudo gem install mysql
# if you want native (faster) sqlite3 drivers, for production
sudo apt-get install libsqlite3-dev
sudo gem install sqlite3-ruby
You can install any more gems you may need at this time with ‘sudo gem install package-name‘, but if you are using rails 2.1 or greater, you can now add rubygem requirements to your environment.rb file and use rake to automatically installed gem dependencies.
Step 10: Install Phusion Passenger
There are many ways to host a Rails application, but at this time, Phusion Passenger gets the nod for the easiest to deploy and our experience has been rock-solid in reliability. These install steps are from the Passenger website installation instructions:
sudo gem install passenger
sudo apt-get install apache2-prefork-dev
# and follow the instructions
# after phusion installs, you will see instructions to edit your Apache configuration file
# to add lines to the end of the file
sudo pico /etc/apache2/apache2.conf
# add the lines given in the installation screen, because they can be different for each machine, I can't post the instructions here
# restart apache webserver
sudo /etc/init.d/apache2 restart
You will also be given a sample virtual host file to setup your Rails application. At this point you can copy an existing Rails app over to the new server, or follow along for a quick setup of a new Rails app.
Step 11: Create a Rails Application (optional)
We are going to create a very quick Rails application to test that our installation is working.
script/generate scaffold Blog name:string content:text
rake db:migrate RAILS_ENV=production
# setup apache
sudo a2dissite default # we don't need this anymore
sudo pico /etc/apache2/sites-available/tester
#enter the following in pico
# activate this site
sudo a2ensite tester
sudo /etc/init.d/apache2 restart
Now you can visit your site by going to http://address_of_server/ and you should see your rails application!