Herokuデプロイ（自分メモ）

#はじめに
個人アプリ開発において本番環境をherokuに指定し、デプロイを行いました。
（様々な文献を参照し、最終的に自分なりにデプロイ成功を収めた）
（自分は無の状態だったため、いろんな壁にぶち当たった。壁となったところは※印）

#環境
Rails 5.0系
macOS Big Sur 11.01
herokuアカウント作成

#Heroku CLIインストール
ホームディレクトリにてHeroku CLI(コマンドインターフェース）をインストールします。

```php:ターミナル.
% brew install heroku/brew/heroku
```

#Herokuログイン
下記コマンドにてログインをする。
Herokuアカウントとパスワードを使用します。

```php:ターミナル.
% heroku: Enter your Heroku credentials
Email:
Password:
Could not find an existing public key.
Would you like to generate one? [Yn]
Generating new SSH public key.
Uploading ssh public key /Users/adam/.ssh/id_rsa.pub
```


#Railsアプリ新規作成
今回、僕は記事を色々と拝見しRails5系でアプリを作成することにしました。
バージョンの確認は下記サイトを参照に行いました。（下記URL）
[RubyとRailsのバージョンの変更方法](https://qiita.com/seijMAN/items/ac363f6688c72f4ea186)

```php:ターミナル.
% rails _バージョン指定_ new アプリ名 --database=postgresql
```
```php:ターミナル.
% cd アプリ名
```
```php:ターミナル.（アプリ）
% rails db:create
Database 'アプリ名_development' already exists
Database 'アプリ名_test' already exists
```

#gem追加
gemファイルにて'sqlite3'→'pg'に変更する。

※bundle installする前にPostgresをインストール
既にインストールして入ればスルー。(下記URL)
[Heroku Postgres](https://devcenter.heroku.com/articles/heroku-postgresql#local-setup)

```php:VScode.
% gem 'sqlite3',バージョン  #変更前
% gem 'pg',バージョン       #変更後
```
```php:ターミナル.
% bundle install
```

#PostgreSQLアダプターの確認
config/database.ymlファイルがpostgresqlアダプターを使用していることを確認

```php: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'
#
default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: アプリ名_development

  # The specified database role being used to connect to postgres.
  # To create additional roles in postgres see `$ createuser --help`.
  # When left blank, postgres will use the default role. This is
  # the same name as the operating system user that initialized the database.
  #username: アプリ名

  # The password associated with the postgres role (username).
  #password:

  # Connect on a TCP socket. Omitted by default since the client uses a
  # domain socket that doesn't need configuration. Windows does not have
  # domain sockets, so uncomment these lines.
  #host: localhost

  # The TCP port the server listens on. Defaults to 5432.
  # If your server runs on a different port number, change accordingly.
  #port: 5432

  # Schema search path. The server defaults to $user,public
  #schema_search_path: myapp,sharedapp,public

  # Minimum log levels, in increasing order:
  #   debug5, debug4, debug3, debug2, debug1,
  #   log, notice, warning, error, fatal, and panic
  # Defaults to warning.
  #min_messages: notice

# 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

# As with config/secrets.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
# ever seen by anyone, they now have access to your database.
#
# Instead, provide the password as a unix environment variable when you boot
# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database
# for a full rundown on how to provide these environment variables in a
# production deployment.
#
# On Heroku and other platform providers, you may have a full connection URL
# available as an environment variable. For example:
#
#   DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase"
#
# You can use this database configuration with:
#
#   production:
#     url: <%= ENV['DATABASE_URL'] %>
#
production:
  <<: *default
  database: アプリ名_production
  username: アプリ名
  password: <%= ENV['アプリ名_DATABASE_PASSWORD'] %>
```
#ホームページの作成
indexアクションを作成していない状態でローカル環境でエラーが発生します。
僕はscaffold使用してroutes.rbでホームページとなるアクションを指定しました。(下記URL)
[覚えておくと超便利！Ruby on Railsのscaffoldの使い方【初心者向け】](https://techacademy.jp/magazine/7204)

ざっと、コントローラー、アクション、ルーティング(MVC)の編集を終えましたら
サーバーを立ち上げてページが存在するか確認する。
app/views/コントローラー名/index.html.hamlの内容が出ていればローカル環境の設定は完了。

```php:ターミナル.（アプリ）
% rails s
```

#Rubyバージョン指定
Ruby５はRuby2.2.0以降が必要なため確認し、Gemファイルに記述する。

```php:ターミナル.
% ruby -v
```
```php:Gemfile.
% ruby '確認したバージョン' #記述する
```
#アプリをGitに保存する。
※デスクトップGithubがあれば、以下の内容を省略できます。
まずGitがインストールされているか確認する。
以下の様な内容が出ればOkay。
何も表示されなかったり、command not foundと表示される場合は下記URLからgitをインストールする必要がある。

```php:ターミナル.
% $ git --help
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]
```

```php:ターミナル.（アプリ）
% ls
Gemfile
Gemfile-e
Gemfile.lock
README.md
Rakefile
app
bin
config
config.ru
db
lib
log
package.json
public
storage
test
tmp
vendor
----------------------------------------------
$ git init        #コードを初期化してGitにコミット
$ git add .
$ git commit -m "init"
$ git status      #すべてが正しくコミットされたことを確認
On branch master
nothing to commit, working tree clean
```
これでアプリケーションがGitにコミットされたので、Herokuにデプロイできる。

#アプリをHerokuにデプロイする。
Railsアプリを含むディレクトリにいることを確認してから、herokuでアプリを作成する。

```php:ターミナル.（アプリ）
% heroku create
Creating app... done, secret-tor-3959
https://secret-tor-3959.herokuapp.com/ | https://git.heroku.com/secret-tor-3959.git
```
```php:ターミナル.（アプリ）
% git config --list | grep heroku  #リモートプロジェクトに追加確認
remote.heroku.url=https://git.heroku.com/secret-tor-55555.git
remote.heroku.fetch=+refs/heads/*:refs/remotes/heroku/*
```
＃fatal: not in a git directoryと表示される場合は、正しいディレクトリにない可能性があるため、lsコマンドで確認する。

#ついにデプロイする。


```php:ターミナル.（アプリ）
% git push heroku main  #←mainはブランチ名となります。      
Enumerating objects: 3959, done.
Counting objects: 100% (3959/3959), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2216/2216), done.
Writing objects: 100% (2269/2269), 1.36 MiB | 646.00 KiB/s, done.
Total 2269 (delta 1587), reused 0 (delta 0), pack-reused 0
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> Ruby app detected
remote: -----> Installing bundler 1.17.3
remote: -----> Removing BUNDLED WITH version in the Gemfile.lock
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-2.6.6
remote: -----> Installing dependencies using bundler 1.17.3
remote:        Running: BUNDLE_WITHOUT='development:test' BUNDLE_PATH=vendor/bundle BUNDLE_BIN=vendor/bundle/bin BUNDLE_DEPLOYMENT=1 BUNDLE_GLOBAL_PATH_APPENDS_RUBY_SCOPE=1 bundle install -j4
remote:        The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
remote:        Using rake 13.0.1
remote:        Using concurrent-ruby 1.1.7
remote:        Using i18n 1.8.5
remote:        Using minitest 5.14.2
remote:        Using thread_safe 0.3.6
remote:        Using tzinfo 1.2.7
remote:        Using activesupport 5.2.4.4
remote:        Using builder 3.2.4
remote:        Using erubi 1.9.0
remote:        Using mini_portile2 2.4.0
remote:        Using nokogiri 1.10.10
remote:        Using rails-dom-testing 2.0.3
remote:        Using crass 1.0.6
remote:        Using loofah 2.7.0
remote:        Using rails-html-sanitizer 1.3.0
remote:        Using actionview 5.2.4.4
remote:        Using rack 2.2.3
remote:        Using rack-test 1.1.0
remote:        Using actionpack 5.2.4.4
remote:        Using nio4r 2.5.4
remote:        Using websocket-extensions 0.1.5
remote:        Using websocket-driver 0.7.3
remote:        Using actioncable 5.2.4.4
remote:        Using globalid 0.4.2
remote:        Using activejob 5.2.4.4
remote:        Using mini_mime 1.0.2
remote:        Using mail 2.7.1
remote:        Using actionmailer 5.2.4.4
remote:        Using activemodel 5.2.4.4
remote:        Using arel 9.0.0
remote:        Using activerecord 5.2.4.4
remote:        Using mimemagic 0.3.5
remote:        Using marcel 0.3.3
remote:        Using activestorage 5.2.4.4
remote:        Using msgpack 1.3.3
remote:        Using bootsnap 1.5.0
remote:        Using bundler 1.17.3
remote:        Using coffee-script-source 1.12.2
remote:        Using execjs 2.7.0
remote:        Using coffee-script 2.4.1
remote:        Using method_source 1.0.0
remote:        Using thor 1.0.1
remote:        Using railties 5.2.4.4
remote:        Using coffee-rails 4.2.2
remote:        Using dotenv 2.7.6
remote:        Using dotenv-rails 2.7.6
remote:        Using erubis 2.7.0
remote:        Using ffi 1.13.1
remote:        Using temple 0.8.2
remote:        Using tilt 2.0.10
remote:        Using haml 5.2.0
remote:        Using sexp_processor 4.15.1
remote:        Using ruby_parser 3.15.0
remote:        Using html2haml 2.2.0
remote:        Using haml-rails 2.0.1
remote:        Using jbuilder 2.10.1
remote:        Using pg 1.2.3
remote:        Using puma 3.12.6
remote:        Using sprockets 3.7.2
remote:        Using sprockets-rails 3.2.2
remote:        Using rails 5.2.4.4
remote:        Using rb-fsevent 0.10.4
remote:        Using rb-inotify 0.10.1
remote:        Using sass-listen 4.0.0
remote:        Using sass 3.7.4
remote:        Using sass-rails 5.1.0
remote:        Using turbolinks-source 5.2.0
remote:        Using turbolinks 5.2.1
remote:        Using uglifier 4.2.0
remote:        Bundle complete! 20 Gemfile dependencies, 69 gems now installed.
remote:        Gems in the groups development and test were not installed.
remote:        Bundled gems are installed into `./vendor/bundle`
remote:        Bundle completed (0.47s)
remote:        Cleaning up the bundler cache.
remote:        The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
remote: -----> Installing node-v12.16.2-linux-x64
remote: -----> Detecting rake tasks
remote: -----> Preparing app for Rails asset pipeline
remote:        Running: rake assets:precompile
remote:        Yarn executable was not detected in the system.
remote:        Download Yarn at https://yarnpkg.com/en/docs/install
remote:        Asset precompilation completed (3.80s)
remote:        Cleaning assets
remote:        Running: rake assets:clean
remote: -----> Detecting rails configuration
remote: 
remote: 
remote: -----> Discovering process types
remote:        Procfile declares types     -> web
remote:        Default types for buildpack -> console, rake
remote: 
remote: -----> Compressing...
remote:        Done: 54.3M
remote: -----> Launching...
remote:        Released v34
remote:        https://my-foreman.herokuapp.com/ deployed to Heroku
remote: 
remote: Verifying deploy... done.
To https://git.heroku.com/my-foreman.git
   8553953..78fe2a6  main -> main
```

#データベースに移行する。
```php:ターミナル.
% heroku run rake db:migrate
```

#dynoがあることを確認しアプリへアクセスする。
```php:ターミナル.
% heroku ps:scale web=1
% heroku ps
Free dyno hours quota remaining this month: 999h 25m (99%)
Free dyno usage for this app: 0h 34m (0%)
For more information on dyno sleeping and how to upgrade, see:
https://devcenter.heroku.com/articles/dyno-sleeping

=== web (Free): bundle exec puma -C config/puma.rb (1)
web.1: idle 2020/12/02 01:33:53 +0900
```
これで１つのdynoが実行しているのを確認しました。
次にアプリにアクセスしていきます。

```php:ターミナル.
% heroku open
```
#ホームページの表示（最後)
HerokuのURL(https://アプリ名.herokuapp.com/)にて自分の作成したものが表示しました。
最後に長くなりましたが、デプロイするのに時間が掛かりましたができた時はとても嬉しかったです。