Boxcar Conductor: Rails deployment made easy
In a previous post, I showed how we’ve been working on an interactive deployment process for Rails applications to reduce the time it takes to deploy to a Boxcar.
We began to move our Boxcar deployment recipes into it’s own Rails plugin and just made it available on GitHub.
Introducing Boxcar Conductor
The Boxcar Conductor plugin aims to automate the entire process for deploying to your Boxcar. We’re down to just a few simple commands to run to get your application up and running. While mileage may vary with other hosting providers, we did want to open up this work to the community and centralize our work with the community of Boxcar customers who have helped us build and test these tools.
Install Boxcar Conductor
If you’re running on Edge Rails… you can take advantage of the new support for installing plugins in git repositories.
$ ./script/plugin install git://github.com/robbyrussell/boxcar-conductor.git
note: If you’re not using edge rails, you can download a tarball and install the plugin manually.
Installing the plugin will add a custom Capfile and config/deploy.rb, which has a few things for you to define based on your Boxcar subscription.
Configure Your Boxcar
Once the plugin is installed, you can run the following task:
$ cap boxcar:config
This will ask you a few questions about your deployment needs.
- Which database server will you be using? (along with db user/pass info)
- How many mongrels should run in your cluster?
After a few quick multiple choice answers, you’re application is ready to be deployed and you can run an Boxcar-specific deployment task.
$ cap deploy
We’ve also created a new public project on Lighthouse so that you can submit tickets and ideas to us. With Boxcar, we’re really aiming to remove as many steps from the deployment process that aren’t necessary.
To follow along, visit the project on lighthouse or GitHub.
If you’re interested in learning more about Rails Boxcar, feel free to drop us a line.
Related Posts
Deploying Rails with an interactive Capistrano recipe to your Boxcar 1
I wanted to share something that I’ve been meaning to share on here.
When we began planning Rails Boxcar, we really want to reduce the amount of work that it took to setup and deploy a VPS for a Rails application. During this period, we began to look at the deployment process itself and began working on an interactive tool for developers for setting up their deployment environment on their Boxcar instances. So, we worked with few customers to develop an interactive Capistrano recipe.
The Goal? Spend less time configuring the server or editing recipe files.
During the initial setup, we can have the customer provide a few details from the safety of their Rails application directory by answering the following.
- What database server will you be using? (PostgreSQL or MySQL)
- What port does your database run on? (if different than the default for your db server)
- What is your database username?
- What is your database user’s password?
- What port will your mongrel cluster start with?
- How many mongrel servers should your cluster run?
Great… setup the server and let’s deploy!
Feel free to snag our interactive Capistrano2 recipe.
We’re trying to take the pain out of deploying your Ruby on Rails applications with Boxcar.
On a side note, we’re in the process of expanding our team and recently hired Alex Malinovich. Do stay tuned as we’ll be posting important announcements about changes to our Rails hosting services in the next few weeks. (grin)
YSlow and Rails performance: Getting UJS and AssetPackager to play nice 5
Yesterday, I started to dig deeper into YSlow and decided to pick an application that we recently launched for a client. The performance grade that I saw at first was an F, which wasn’t surprising to me because we knew that there was going to be some fine tuning in the near future.

There is a lot of JavaScript in this application and we have several files to break up stuff to make it more maintainable. However, in production, we really don’t need to send the client (browser) 19 different JS files. We’ve been using mod_deflate to compress these files, but it doesn’t solve the problem of having several connections opening to download all the necessary JavaScript. The same is true for our CSS files.
At RailsConf, DHH announced that an upcoming version of Rails would bundle all the stylesheet and javascript files into one file and compress it. We’re running on 1.2.x for this application and decided to look at the AssetPackager plugin as a good solution to this problem.
I installed the plugin via piston and ran the following task, which is provided by AssetPackager.
rake asset:packager:create_yml
This went ahead and created config/assets_packager.yml. I then went ahead and updated our capistrano configuration to call the rake task after updating the code on the server when deploying.
desc "all of our other tasks/commands to run after updating the code"
task :after_update_code do
#
# all of our other tasks/commands
#
run "cd #{release_path} && rake RAILS_ENV=production asset:packager:build_all"
end
The first thing that I noticed was that the yml file that gets generated will not make any assumption as to what order the javascript libraries should be loaded. So, immediately, line 1 of our compressed javascript file was causing an error as the code was trying to reference a library that hadn’t been defined yet (showed up later in the file). So, when you do this, you’ll need to organize the yml file to load things in order that they are needed. This was also a good opportunity for us to say, “oh, we’re not using that one anymore. Let’s remove it.”
---
javascripts:
- base:
- prototype
- effects
- scriptaculous
- controls
- dragdrop
- application
- slider
- pngfix
- nav
- lowpro
- lightbox
- folder
- builder
Great, so we re-dployed and everything at first glance seemed fine… or so we thought!
We used the unobtrusive javascript plugin for this project and it seems that we couldn’t just compress every single file. Each page has a behaviors javascript file and since everything was being compressed into one file (and cached), RJS calls quickly broke throughout the site. OH NO!
So, I opted to merge all of the other javascript files and use the standard way of including unobtrusive javascript in the application layout.
<%= javascript_include_merged :base %>
<%= javascript_include_tag :unobtrusive %>
We also removed lowpro from the list of javascript files to compress since the ujs plugin is currently including this when we call <%= javascript_include_tag :unobtrusive %>. I plan to look into modifying this so we it’ll only include the page-specific behaviors and not load the lowpro javascript file (so we can compress that as well).
Once this was re-deployed, we saw that the RJS issues were resolved and everything felt to be loading quicker. But, let’s look at YSlow again for step 1 in improving the performance of the application.
side note: the following grading was also after making some other adjustments that were suggested by YSlow, which I’ll discuss in another blog post soon.
So, where we once had a grade F, we now have an D… which is due to the client having us add several (four) external javascript files for mint, google analytics, etc. We’re only loading 3 javascript files for the application, when we were originally loading many more.

Obviously, there is some more tuning to be done, but we went from a grading of 43 to 74 in about three hours of time spent reading the YSlow documentation, adding asset_packager, and making various tweaks to our web servers (as suggested by YSlow).
Until next time…
Related Posts:






