使用 Heroku 部署 Ruby on Rails 專案

紀錄首次使用 Heroku 部署的 Trial and Error 過程。

先說結論:

  1. 使用 Heroku 部署 Rails 專案時,DB 要使用 pg, 本機電腦也要安裝。
    $ brew install postgresql

  2. 專案裡的 database.yml 檔案配置, production 的 adapter 要使用 postgresql 。

  3. 要注意 Heroku 的 stack 版本,如果一開始 $ heroku create 時,並沒有指定 stack 的版本,導致後面在跑 migrate 時,可能會出現相容性問題。

  4. Heroku 部署 Rails 時,要預編譯 (precompile) assets 檔。


專案基本版本配置:


Ruby '2.6.3'
Rails '5.0.2'
mysql2 '0.5'

在 Heroku 建立一台伺服器。
$ heroku create

如果沒有指定名稱,Heroku 便會隨機產生。

這邊我指定我的伺服器名稱為 kjd-rails-exercise

部署專案。
$ git push heroku master

出現錯誤了,看起來是 Psych 這個 Gem 出問題,使用對應的版本並安裝它。
gem 'psych', '~> 2.2', '>= 2.2.4'

再次部署。
$ git add .
$ git commit -m 'fix: Gem Psych errors'
$ git push heroku master

看起來在 assets 的編譯上出了錯誤,預編譯它並且指定環境為 production。
$ rails assets:precompile RAILS_ENV=production

通過編譯的錯誤了,出現 Verifying deploy… done 字樣,即表示專案部署成功。

而在這裡的訊息裡,也有出現某些 Heroku 提供的服務,在 2022/11/28 後將不再免費,提醒使用者升級到付費方案等等。

建立 migration。
$ heroku run rails db:migrate

  1. 安裝 Gem pg、指定使用在 production,並將原本使用的 mysql2 移至開發環境。
    記得 bundle install
  2. 更改 database.yml production 設置。

再次部署至 Heroku。
$ git add .
$ git commit -m 'fix: database errors'
$ git push heroku master

看起來是 add-modifier 的錯誤,關於此錯誤有 查到一篇 是因為 Rails 5.x.x 在 Ruby 3.x.x 是不相容的,確認一下 Heroku 上使用的 Ruby 版本: $ heroku run ruby -v

果然是與我們專案上 Rails 版本不相容的 Ruby 3.x.x 版本。 ( 這邊自己踩了坑,本機下的 $ ruby -v,其實是本機開發使用的版本,並不代表 Heroku 上的。)

指定 Ruby 版本。
$ bundle install

在 Gemfile 裡指定使用與本地相同的 Ruby version。

通過編譯的錯誤了。

再次部署至 Heroku。
$ git push heroku master

再重新跑一次 migration。
$ heroku run rails db:migrate

看起來是在 Heroku 上找不到 postgresql 的 DATABASE_URL,因為在 Heroku 上的 Database,需要一個完整的連線 URL,如:

DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase"

production:
  url: <%= ENV['DATABASE_URL'] %>

以上也可以直接在專案的 database.yml 檔設置; 但這邊我們用指令建立它。
$ heroku addons:create heroku-postgresql

建立成功。

再重新跑一次 migration。
$ heroku run rails db:migrate

可以看到 migration 的 log。

開啟我們建立的專案。
$ heroku open

成功 !


👇👇👇 以下補充幾個 Heroku 常用的指令 👇👇👇。

查看 Heroku Git Log。
$ git log heroku/master

即時顯示專案的 Log。
$ heroku logs --tail

專案 Log 僅顯示 50 行。
$ heroku logs -n 50

打開遠端專案的 Console。
$ heroku run rails console

切換 Heroku stack 版本。
heroku stack:set heroku-22

其他

heroku push 時發生的 gemfile.lock platform 問題

解法:
$ bundle lock --add-platform x86_64-linux --add-platform ruby