Deploy Rails App On Heroku

Đối với rails, chúng ta có thể dễ dàng tạo ra một trang web đơn giản. Và nhiều khi chúng ta muốn có một trang web nho nhỏ để chia sẻ cho bạn bè nhưng lại rất ngại trong việc deploy, hay là tìm kiếm một server riêng để chạy nó hay là bạn không muốn chi ra khoản tiền để mua một host riêng. Nhưng chúng ra có thể dễ dàng deploy chúng với heroku và có thể chia sẻ thành quả của mình với người khác.

Với từ khóa tìm kiến Deploy Rails App On Heroku thì chúng ta có thể dễ dàng thấy ra rất nhiều kết quả và với kết quả đầu tiên chính là https://devcenter.heroku.com/articles/getting-started-with-rails4. Mình sẽ sử dụng một ví dụ đơn giản để deploy một Rails App trên Heroku theo hướng dẫn đó.

Thông thường khi tạo một app mới chúng ta thường chạy lệnh rails new heroku_deploy (heroku_deploy là tên của app). Khi đó ta thường không để ý tới database mà ta sẽ sử dụng là gì: mysql, sqlite hay postgresql... Khi đó ta thường sử dụng mặc định mà rails tạo ra đó là sqlite3.

Trong hướng dẫn có ghi:

If already have an app that was created without specifying --database=postgresql you will need to add the pg gem to your Rails project. Edit your Gemfile and change this line:

gem 'sqlite3'

To this:

gem 'pg'

Như vậy, ta mặc định nghiễm nhiên là sửa dòng gem 'sqlite3' thành gem 'pg' và chạy lệnh bundle install ngay sau đó. Khi đó bạn sẽ thấy báo lỗi và đâm đầu đi fix lỗi đó mặc dù là không cần thiết. Vì đối với môi trường develop của mình thì bạn có thể sử dụng bất cứ database dạng nào mà bạn muốn (mysql2 hay sqlite3) đều được. Và gem 'pg' thì chạy trên heroku lại không bị lỗi do môi trường đã được hỗ trợ.

Ở đây bạn chỉ cần chuyển gem 'sqlite3' vào group :development và gem 'pg' vào group :production.

Lý do: Vì trên môi trường production (hay chính là trên heroku) thì không hỗ trợ sqlite3 mà chỉ hỗ trợ postgresql.

Khi bundle bạn thêm option --without production là có thể cài đặt được các gem mà không gặp bất cứ lỗi gì.

bundle install --without production

Hơn nữa bạn cũng không cần phải cài đặt các gem của môi trường production làm gì cả.

Tiếp theo, thay vì chạy lệnh

rails generate controller welcome

thì ta chạy lệnh

rails generate controller welcome index khi đó thì rails sẽ tự tạo cho ta các thư mục, file cần thiết cho trang index với controllerwelcome. Phần này ắt hẳn các bạn học về rails đều biết nên mình sẽ không đi vào chi tiết.

Tiếp theo ta làm các bước như ở đây: https://devcenter.heroku.com/articles/getting-started-with-rails4#welcome-page

In file app/views/welcome/index.html.erb write:


<h2>Hello World</h2>
<p>
  The time is now: <%= Time.now %>
</p>

In file config/routes.rb, on line 2 add:


	root 'welcome#index'

Đối với rails 4.0 thì bạn phải cài nodejs để có thể khởi động được rails s. Nếu không bạn sẽ gặp phải báo lỗi Could not find a javascript runtime

Chúng ta có thể sử dụng lệnh


sudo apt-get install nodejs

``` để cài đặt với ubuntu.

Khi vào http://localhost:3000/ bạn sẽ nhìn thấy trang web như sau:
![Screenshot from 2015-12-29 01:34:11.png](/uploads/9e758c5d-efa4-4612-8edc-a7fe82ec73c3.png)
Nó chỉ đơn giản là một trang hiển thị ngày tháng và giờ.

Bây giờ bạn muốn share nó cho những người bạn mình.

Đó chính là đến bước cài heroku gem vào rails app của bạn.
Bạn chỉ việc thêm gem 'rails_12factor' vào group :production là xong.
```ruby

group :production do
  gem "pg"
  gem 'rails_12factor'
end

Để có thể deploy lên heroku ta cần phải cài đặt và đăng ký một tài khoản heroku để có thể deploy lên đó, và bạn có thể deploy một cách dễ dàng hoàn toàn miễn phí:


wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh

Bạn có thể dùng lệnh trên để cài đặt. Việc chuẩn bị để deploy đã xong. Giờ chúng ta thực hiện các thao tác cần thiết để deploy. (Các thao tác đều thực hiện trong folder app).

Đầu tiên: heroku login để login vào tài khoản mà bạn vừa đăng ký.


~/heroku_deploy $ heroku login
heroku-cli: Installing Toolbelt v4... done
For more information on Toolbelt v4: https://github.com/heroku/heroku-cli
heroku-cli: Adding dependencies... done
heroku-cli: Installing core plugins... done
Enter your Heroku credentials.
Email: [email protected]
Password (typing will be hidden):
Logged in as [email protected]

Sau khi đăng nhập thành công thì ta gõ tiếp lệnh heroku create để tạo một app trên heroku. Và số lượng app trên heroku với mỗi tài khoản free đều có giới hạn. Mình nhớ ko nhầm thì là 5 app.


heroku create
Creating rocky-scrubland-9525... done, stack is cedar-14
https://rocky-scrubland-9525.herokuapp.com/ | https://git.heroku.com/rocky-scrubland-9525.git
Git remote heroku added

Lệnh này sẽ tự động tạo cho bạn một remote https://git.heroku.com/rocky-scrubland-9525.git như github để quản lý. Bây giờ chúng ta chỉ cần việc đẩy code lên git remote đó thì heroku sẽ tự deploy. Và heroku chỉ deploy tự động trên branch master. Khi đẩy branch khác lên thì heroku chỉ lưu lại chứ ko deploy code ở đó.

Việc đẩy code lên ta thao tác như git bình thường với tên remote là heroku và branch là master


git push heroku master

Sau khi chạy xong thì sẽ có log trả về dạng như sau


....
remote: Verifying deploy... done.
To https://git.heroku.com/rocky-scrubland-9525.git
 * [new branch]      master -> master

Đây là thông báo đã deploy thành công với branch master. Như vậy bạn đã có một trang web để đi khoe với bạn bè, nhưng link để truy cập vào ở đâu. 😄 Hay xem lại các bước tạo, ta thấy lúc chạy lệnh heroku create thì nó đã trả ra cho ta đường dẫn đến app của mình cùng với link git rồi. Nếu không nhớ thì chúng ta có thể gõ


 heroku open

để mở trang web tự động và đi khoe với bạn bè.

https://rocky-scrubland-9525.herokuapp.com/

đây chính là trang web mà chúng ta vừa làm theo các bước ở trên.

Và dưới đây là một số lệnh ta hay dùng khi deploy với heroku:

  • heroku run rake db:migrate: migrate database trên heroku
  • heroku logs: In log trên server
  • heroku logs --tail: Xem log một các real time.
  • heroku run rails console: Vào rails console trên heroku ...

Toàn bộ code được đẩy lên link github tại đây

Note: Khi bạn không truy cập vào server trên herok 5' thì server sẽ tự động bị ngắt. Và lần đầu tiên sau 5' bạn truy cập lại thì sẽ phải đợi một thời gian khá lâu để server khởi động lại.