網站部署(使用 Heroku)
Tags: Ruby on Rails

Heroku

是對 Ruby/Rails 專案最友善、部署最簡單的選擇。

不只支援ruby ，還有其他Node.js 及其他 PHP 、 Go 等等，相關說明可以參考看官方介紹或是維基百科。

What is Heroku | Heroku

申請 Heroku 帳號

目前申請 Heroku 帳號是免費的，只要填寫一些簡單的基本資料即可申請。

安裝 Heroku Cli

可以參考：Getting Started on Heroku with Ruby

依照環境在終端機執行指令，目前示範macOS操作：

$brew install heroku/brew/heroku

安裝完後使用以下heroku login登錄到Heroku CLI：

$heroku login

heroku: Press any key to open up the browser to login or q to exit

› Warning: If browser does not open, visit

› <https://cli-auth.heroku.com/auth/browser/***>

heroku: Waiting for login...

Logging in... done

Logged in as me@example.com

此命令將Web瀏覽器打開到Heroku登錄頁面。

如果你的瀏覽器已經登錄到Heroku，只需單擊 Log in 頁面上顯示的按鈕。

heroku和git的指令能正常操作，必須進行此身份驗證。

準備應用

在此步驟中，先在GitHub上準備了一份專案。

$git clone <https://github.com/kyuyui/rails_blog.git>

$cd rails_blog

會要使用Git是因為…

Heroku 平台是使用 Git 進行部署，所以，專案必須要有 Git 的版本控制。

部署準備

確認好專案有Git 版控後執行 heroku create 指令：

$heroku create

Creating app... done, evening-ravine-70505

<https://secret-tor-42278.herokuapp.com/> | <https://git.heroku.com/evening-ravine-70505.git>

此指令會幫你做幾件事：

在 Heroku 上開一台伺服器(instance)，如果沒有指定名稱，Heroku 會隨機幫你搭配，例如此處我的伺服器的名字就是 evening-ravine-70505。如果在建立的時候是下 heroku create kyu-yui-1213 ，只要這個名字沒被用掉，它就可以建立 kyu-yui-1213 的伺服器。

會幫 Git 加上一個名為 heroku 的遠端節點：

$ git remote -v

heroku <https://git.heroku.com/evening-ravine-70505.git> (fetch) heroku <https://git.heroku.com/evening-ravine-70505.git> (push) origin <https://github.com/kyuyui/rails_blog.git> (fetch)

origin <https://github.com/kyuyui/rails_blog.git> (push)

另外，可以通過運行以下指令來驗證是否已將網站中的遠端節點增加到專案裡了：

$git config --list | grep heroku

remote.heroku.url=https://git.heroku.com/evening-ravine-70505.git

remote.heroku.fetch=+refs/heads/*:refs/remotes/heroku/*

如果還沒有遠端節點的話，要記得用以下指令將 Heroku 上的應用程式和 Git 做連結：

heroku git:remote -a 這裡輸入各自 Heroku 的 App 名稱

例如筆者上方建立在 Heroku 上的 App 名稱為 evening-ravine-70505 ，那指令就如下：

heroku git:remote -a evening-ravine-70505

推向 Heroku

接下來要開始上傳專案了。此時若使用使用 git push 指令來把專案推上 Heroku的話：

$git push heroku main

此時會噴出錯誤訊息！！！

remote: ! Failed to install gems via Bundler.

remote: ! Detected sqlite3 gem which is not supported on Heroku:

remote: ! <https://devcenter.heroku.com/articles/sqlite3>

remote: !

remote: ! Push rejected, failed to compile Ruby app.

remote:

remote: ! Push failed

原因是因為 Heroku 不支援 SQLite 資料庫，所以如果你的專案是使用 SQLite 的話，直接推上去就會看到這個錯誤訊息。

此時就要更改使用PostgreSQL 資料庫了！

Heroku 預設支援 PostgreSQL 資料庫，所以請在 Gemfile 裡做一下修改：

source '<https://rubygems.org>'

git_source(:github) { |repo| "<https://github.com/#{repo}.git>" } ruby '2.7.1'

...<略> group :development, :test do

# Call 'byebug' anywhere in the code to stop execution and get a debugger console

gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]

# Use sqlite3 as the database for Active Record

# gem 'sqlite3', '~> 1.4'

end group :production do

gem 'pg'

end ...<略>

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem



我把 gem ‘sqlite3’, ‘~> 1.4’ 給註解掉(直接刪除也可以)，並加入

group :production do

gem 'pg'

end

注意！另外在config/database.yml的檔案裡，

也要確認將sqlite3更改成postgresql

可以使用此指令查看：

$ cat config/database.yml

# PostgreSQL. Versions 9.1 and up are supported.

#

# Install the pg driver:

# gem install pg

# On OS X with Homebrew:

# gem install pg -- --with-pg-config=/usr/local/bin/pg_config

# On OS X with MacPorts:

# gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config

# On Windows:

# gem install pg

# Choose the win32 build.

# Install PostgreSQL and put its /bin directory on your path.

#

# Configure Using Gemfile

# gem 'pg'

...<略>

或是手動更改也可以～

原先：

更改至：

手動更改放大版：

# SQLite. Versions 3.8.0 and up are supported. # gem install sqlite3 # Ensure the SQLite 3 gem is defined in your Gemfile # gem 'sqlite3' default: &default adapter: postgresql pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> timeout: 5000

development: <<: *default database: 專案名稱_development # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: 專案名稱_test production:

<<: *default database: 專案名稱_production

以上範例，可搜尋關鍵字：Database.yml rails pg

參考至：https://gist.github.com/jwo/4512764

修改完 Gemfile 後，需要再執行 bundle install 確保每個套件都有正確安裝。

如果在 bundle 的過程發生失敗，可能是目前的環境還沒安裝 PostgreSQL 資料庫，所以在 bundle install 的過程會發生錯誤。解決方法有兩種：

就是把 PostgreSQL 資料庫安裝起來。( PostgreSQL 官網) 如果你還不想安裝PostgreSQL 資料庫，也可改執行 bundle install --without production 指令，暫時「跳過」安裝 production 這個群組裡面的套件。

把 SQLite 換成 PostgreSQL之後，也要確認Heroku上也有PostgreSQL資料庫h才能儲存～

如果是第一次部署的話，會需要執行 rails db:migrate 指令，確保所有的 Migration 都有被執行到。

但… 如果只是單純的執行本地的 rails db:migrate ，所以需要請 Heroku 執行這個指令：

$ heroku run rails db:create

$ heroku run rails db:migrate

第二次推向 Heroku

$ git push heroku main 枚舉物件: 11, 完成.

物件計數中: 100% (11/11), 完成.

使用 4 個執行緒進行壓縮

壓縮物件中: 100% (6/6), 完成.

寫入物件中: 100% (6/6), 743 位元組 | 371.00 KiB/s, 完成.

總共 6 (差異 4)，復用 0 (差異 0)，重用包 0

remote: Compressing source files... done.

remote: Building source:

remote:

remote: -----> Ruby app detected

remote: -----> Installing bundler 2.1.4

remote: -----> Removing BUNDLED WITH version in the Gemfile.lock

remote: -----> Compiling Ruby/Rails

remote: -----> Using Ruby version: ruby-2.7.1

remote: -----> Installing dependencies using bundler 2.1.4

rn-v1.22.4

remote: -----> Detecting rake tasks

remote: -----> Preparing app for Rails asset pipeline

remote: Running: rake assets:precompile

remote: yarn install v1.22.4

remote: [1/4] Resolving packages...

remote: [2/4] Fetching packages...

remote: info fsevents@2.1.3: The platform "linux" is incompatible with this module.

remote: info "fsevents@2.1.3" is an optional dependency and failed compatibility check. Excluding it from installation.

...<略>...

remote: For all available Ruby versions see:

remote: <https://devcenter.heroku.com/articles/ruby-support#supported-runtimes>

remote:

remote: ###### WARNING:

remote:

remote: No Procfile detected, using the default web server.

remote: We recommend explicitly declaring how to boot your server process via a Procfile.

remote: <https://devcenter.heroku.com/articles/ruby-default-web-server>

remote:

remote:

remote: -----> Discovering process types

remote: Procfile declares types -> (none)

remote: Default types for buildpack -> console, rake, web

remote:

remote: -----> Compressing...

remote: Done: 78.1M

remote: -----> Launching...

remote: Released v8

remote: <https://evening-ravine-70505.herokuapp.com/> deployed to Heroku

remote:

remote: Verifying deploy... done.

To <https://git.heroku.com/evening-ravine-70505.git>

8cbef6e..6d5bbf9 main -> main

接著打開瀏覽器，輸入網址https://evening-ravine-70505.herokuapp.com/ 應該就可以連上專案了，其中網址前面的 evening-ravine-70505 就是Heroku上我們這台機器的名字。

看到成功推上網站的畫面才能安心喔！

之後如果專案有任何修改，就是照著以下流程操作：

把有修改的檔案透過 git add 加進版控 git commit 把目前的進度存進 Git 的 Repository git push heroku main 必要的時候請 heroku run 幫你執行需要的指令，例如 rails db:migrate