This article is a follow-up to Nitrous.IO: Rails Development in the Cloud published earlier. If you have not read that article, I recommend you do so. I will wait.
Although it is not a prerequisite, this tutorial assumes you have an account on Nitrous.IO and have setup a Box for Ruby.
Start with a Nitrous Box
If you have not created a Box yet on Nitrous.io, select the Boxes
menu and create a new Box.
The Nitrous Box must be connected to your Github account. These instructions in the Nitrous Help Center are the best guide to accomplish that task.
Login to Heroku
This assumes you already have an account with Heroku. If not create one now. Heroku provides a very detailed API (called Toolbelt) and it is part of the Nitrous instance when you create a Box.
$ heroku login
You are expected to provide your login email and password. This should be greeted with an acknowledgement:
Authentication successful.
If this is the first time using this Nitrous Box to deploy to Heroku, you need to add your SSH key to Heroku. If you are not sure whether this step has been accomplished in the past, it will not hurt to just run the command again.
$ heroku keys:add
Create Your App
Create a Rails Application
Next you can simply create a Rails application. We will specify a PostgreSQL database (because that is what all the ‘cool kids’ are using nowadays).
$ rails new APPNAME --database=postgresql
$ cd APPNAME
Setup Git
The usual (and should be quite familiar) initial commit in Git to get it setup goes like this:
$ git init
$ git config --global user.name "Cody Wrighter"
$ git config --global user.email "C.Wrighter@ParaHacker.com"
$ git add .
$ git commit -m "Initial Commit on Nitrous Box"
Create a New Application on Heroku
With the Heroku Toolbelt you create an app on Heroku with this simple command:
$ heroku create
It will respond with the name of the app on Heroku. I recommend you copy the peculiar (and often poetic) application name for use in a later step.
Since Bundler is also included in the Nitrous instance, add these lines in the Gemfile:
ruby '2.0.0' # to maintain parity between 'development' and 'production'
gem 'pg' #this may already exist in the Gemfile
gem 'rails_12factor', group: :production
You should use RVM to install Ruby 2.0.0 on Nitrous. RVM is also included in every Nitrous box, so this is as simple as rvm install 2.0.0
followed by rvm use 2.0.0
Setting up a PostgreSQL database on Heroku is next.
Using the Heroku Toolbelt,
$ heroku addons:add heroku-postgresql:dev
will add a PostgreSQL database (the free level) and return a HEROKU_POSTGRES_COLOR_URL. Take note of the actual COLOR that is returned.
Then
$ heroku pg:promote HEROKU_POSTGRESQL_URL
to establish the database (You need to log into your Heroku Dashboard to get the PostreSQL details).
Normally, when creating a Rails application, the next step would be to edit the config/database.yml
file. But with Heroku, your production database details are applied automatically on the Heroku server regardless of what you place in the database.yml file.
To use a Heroku PostgreSQL database for development also, follow the instructions here. If you prefer a local SQLite database for development, those instructions are at the end of this article.
Now it is time for Bundler to work its magic for us and pull all the pieces together.
$ bundle install
Setup the Asset Pipeline
Add a line in your config/application.rb
config.assets.initialize_on_precompile = false
Commit in Git
$ git add .
$ git commit -m "Heroku and Postgresql setup"
Deploy the Application to Heroku
Deploying to Heroku is the simplest part of this whole process. I truly appreciate that because it is the part that I do most often in a continuous development cycle.
$ git push heroku master
Setting Up the Server on Heroku
If you want to remain within the FREE realm, use a single dyno on Heroku.
$ heroku ps:scale web=1
$ heroku ps
Visit the App on the Server
At this point I like to perform a quick “smoke test” just to be sure we didn’t miss any of the essential steps. This saves a lot of headaches later when you are troubleshooting the application because you can be assured it works at the base level. This is where you will use the [sometimes poetic, sometimes profound] name Heroku created for your application. You can paste the name from your clipboard (if you followed my earlier advice)
$ curl http://<HEROKU_APP_NAME>.herokuapp.com/
Or you can navigate to the instance (based on the name that it returned earlier): I just open another tab in my browser that is currently connected to Nitrous.
You should get back the Rails default index.html
page. We have not yet created any models, controllers, or routes so the “About your application’s environment” link will yield a server error.
That is to be expected.
To view the application logs, with Heroku ToolBelt, use heroku logs
. The ‘status=200’ on the very last line is what we expect to see.
Now we need to migrate the database.
$ heroku run rake db:migrate
A Quick Assesment of Our Progress
You have successfully created and deployed a Rails application ENTIRELY FROM WITHIN A BROWSER !
Leveraging Nitrous.IO as a cloud-based development platform and Heroku as a cloud-based SAAS host, you can be completely divorced and indiscriminate about your client hardware and/or software.
Set Up the Development Server
In order to transform this empty, benign Rails application into your next big money-making Disruptive Web Product, we need to do some heavy testing-coding-refactoring Agile development. Let’s now get our Development environment setup.
In the Gemfile add gem 'unicorn', group: :development
and run bundle install
to install it locally.
To test (and for each iteration during development) run this command
$ bundle exec unicorn -p 3000 -E development
Use the Nitrous menu Preview -> Port 3000 to test your development environment
One Final Commit
$ git add .
$ git commit -m "use unicorn for local development"
$ git push heroku
If you prefer unicorn for production, here are details on setting it up.
Final Cleanup
Of course, it is important to rm
the public/index.html
file.
I recommend you also maintain the project in your Github account. As a public repository you can get help from the Open Source community in the form of contributions and Pull Requests. With a Private repository, you can collaborate with other developers on your team and maintain the central source control.
The Nitrous Box must be connected to your Github account. This great article in the Nitrous Help Center explains how to setup the Github Private Key.
First create the repository on Github. Then issue these two commands:
$ git remote add github git@github.com:<github_username>/nitrous_heroku.git
$ git push -u github master
Next, write some tests. And then you will create some models, controllers and views and begin actually developing the application.
Run the unicorn server with this command
$ bundle exec unicorn -p 3000 -E development
Use the Nitrous menu Preview -> Port 3000 to test your development environment
Update the Development Environment
If you prefer to use sqlite in development (which I do) then add these steps.
Modify the config/database.yml for ‘development’ (and ‘test’) like this:
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
test:
adapter: sqlite3
database: db/test.sqlite3
pool: 5
timeout: 5000
Add sqlite3 to the Gemfile
group :development, :test do #sqlite3 gem is not supported on Heroku
gem 'sqlite3'
end
Call on Bundler
$ bundle install
Then Migrate the database
$ export RAILS_ENV=development
$ rake db:migrate
Give it a test drive by calling the unicorn server
$ bundle exec unicorn -p 3000 -E development
And then use the Nitrous menu Preview -> Port 3000 to open it in a browser
You now have complete development and production environments, along with git-based deployment, and you didn’t need to install anything on your local computer.
I am excited to usher-in a new Browser-based workflow.
Frequently Asked Questions (FAQs) about Nitrous.io and Heroku
What is the difference between Nitrous.io and Heroku?
Nitrous.io and Heroku are both cloud-based development platforms, but they serve different purposes. Nitrous.io is a cloud-based development environment that allows developers to write, run, and debug code in the cloud. It supports multiple programming languages and provides a collaborative environment for teams. On the other hand, Heroku is a Platform as a Service (PaaS) that enables developers to build, run, and operate applications entirely in the cloud. It supports several programming languages and offers a range of services for app deployment, scaling, and management.
How do I install the Heroku Toolbelt?
The Heroku Toolbelt, also known as Heroku CLI (Command Line Interface), is a tool that allows you to create and manage Heroku apps directly from the terminal. To install it, you need to download the installer specific to your operating system from the Heroku website. Once downloaded, run the installer and follow the on-screen instructions. After installation, you can access the Heroku CLI by opening your terminal and typing ‘heroku’.
Can I use Nitrous.io and Heroku together?
Yes, Nitrous.io and Heroku can be used together to streamline your development process. You can write and debug your code in Nitrous.io, then deploy your application to Heroku for hosting. This combination allows you to leverage the strengths of both platforms, making your development process more efficient and effective.
What are Heroku Buildpacks?
Heroku Buildpacks are sets of scripts that specify how your application and its dependencies should be built on Heroku. They are responsible for transforming your deployed code into a slug, which is a compressed and pre-packaged copy of your application optimized for distribution to the dyno manager.
How do I use the Heroku CLI?
The Heroku CLI is a powerful tool that allows you to manage your Heroku apps directly from the terminal. After installing the Heroku CLI, you can use it by opening your terminal and typing ‘heroku’ followed by the command you want to execute. For example, ‘heroku create’ will create a new Heroku app, and ‘heroku open’ will open your app in a web browser.
What programming languages does Nitrous.io support?
Nitrous.io supports a wide range of programming languages, including but not limited to Ruby, Python, JavaScript, Go, and PHP. This makes it a versatile tool for developers working in different programming environments.
How do I deploy my application to Heroku?
Deploying your application to Heroku involves pushing your code to a Heroku repository using Git. Once your code is pushed, Heroku will automatically build and deploy your application. You can then access your application by navigating to its URL in a web browser.
Can I collaborate with my team on Nitrous.io?
Yes, Nitrous.io provides a collaborative environment where you and your team can work together on the same codebase. It supports real-time collaboration, allowing multiple developers to write and debug code simultaneously.
What services does Heroku offer for app deployment, scaling, and management?
Heroku offers a range of services for app deployment, scaling, and management. These include Heroku Runtime, Heroku DX (Developer Experience), Heroku Data Services, and Heroku Elements. These services provide a comprehensive solution for building, running, and scaling applications.
How do I troubleshoot issues with my Heroku app?
Heroku provides several tools for troubleshooting issues with your app. These include Heroku logs, which provide a real-time stream of your app’s operational events, and Heroku metrics, which provide insights into your app’s performance. You can access these tools through the Heroku Dashboard or the Heroku CLI.
A self-proclaimed ParaHacker and avid Logophile, Thom has been writing software since the days when ALL telephones had wires. Leaving Fortran and COBOL behind and having become bored with Java, Thom is currently a Serial Rails Developer living in The Sunshine State. When not working on Open Source projects, developing articles and tutorials for Learnable, or helping to manage the Sitepoint Forums as a Team Leader, Thom is playing Euro-Games. With a reputation for puns and wordplay, Thom calls himself an avid Logophile and Polyphiloprogenitive Programming Polyglot.