紀錄首次使用 Heroku 部署的 Trial and Error 過程。
先說結論:
-
使用 Heroku 部署 Rails 專案時,DB 要使用 pg, 本機電腦也要安裝。
$ brew install postgresql
。 -
專案裡的 database.yml 檔案配置, production 的 adapter 要使用 postgresql 。
-
要注意 Heroku 的 stack 版本,如果一開始
$ heroku create
時,並沒有指定 stack 的版本,導致後面在跑 migrate 時,可能會出現相容性問題。 -
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
- 安裝 Gem pg、指定使用在 production,並將原本使用的 mysql2 移至開發環境。
記得bundle install
- 更改 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