Rails app heroku deploy

まず大切なことをまとめる。

  • herokutoolbelt のインストールは必要ない
  • ssh も作成する必要は無い
  • アセットプレコンパイルも必要ない。それをするのがheroku
  • git のブランチのmasterがpush されるので、masterブランチに切り替えておくこと!

これにハマった。 ruby on rails - Removed sqlite gem but Heroku still detects sqlite gem and fails - Stack Overflow

  • 本家サイトを見るべし!

devcenter.heroku.com

heroku は postgres なので DB変更

gemを追加 productionのみポスグレに変更

//sqliteはコメントしておかないとエラーになる。
//ローカルで利用するときはコメントを外してbundle install
#gem 'sqlite3', '~> 1.3.0'

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

database.ymlも書き換える

ローカルでもpostgresを利用しないといけないことはない。 これは検証の必要あり。

default: &default
  adapter: postgresql
  pool: 5
  timeout: 5000

development:
  <<: *default
  database: udemy-1_development

//説明1を参照
production:
  adapter: postgresql
  username: <%= ENV['DB_USERNAME'] %>
  password: <%= ENV['DB_PASSWORD'] %>
  encoding: utf8
  database: hogehoge_rails1
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> 
  url: <%= ENV['DATABASE_URL'] %>

ローカルに作成するDBは当然 development

postgres install

postgres-serverを入れると必要な依存パッケージは入れてくれる

$ sudo yum install postgresql-server

バージョン確認
 $ psql -V
//==
psql (PostgreSQL) 9.6.11

DB初期化、起動

$ sudo service postgresql initdb

//起動
$ sudo service postgresql start

//自動起動をon
$ sudo chkconfig postgresql on

postgresSQLアカウント設定

//psqlユーザーでログインする

$ sudo su -  postgres

//postgresディレクトリに移動するので psqlと入力
-bash-4.2$ psql

//これでpostgresに入れる。

postgresでは linux のユーザーが必要

そこでLinuxにすでにある ec2-userをownerに指定している。

今のログインした状態でSELECT rolname FROM pg_roles;
または\duコマンドで、既存のロールを見ることができます。

新しくロールを作るにはCREATE ROLE name;

postgres=# CREATE ROLE "ec2-user" LOGIN CREATEDB PASSWORD 'パスワード入力';
//DBを作成ownerは ec2-user
postgres=# create database "DB名" owner "ec2-user";

postgres=# GRANT ALL PRIVILEGES ON database "DB名" TO "ec2-user";

//DB確認 (バックスラッシュ + L)
postgres=# \l

//==できています
------------------------
 postgres                 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 simple_board_development | ec2-user | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =T
c/"ec2-user"    


\q で抜ける

postgres=# \q

//== exitで bashをぬける
-bash-4.2$ exit

作成したDBを確認したい場合はPostgreSQLのシェルでSELECT datname FROM pg_database;
または\lコマンドを使えば確認することができます。

DB作成

postgres=# create database thai_dict_development OWNER thai_dict;

これで接続可能 接続テストする これでロールとDBの準備が整えました。

psql --username=[user_name] --password --dbname=[DB_NAME]

しかしエラー

クライアント認証のエラー

どのipからどのユーザーの接続を許可するかの設定。 不便なので pg_hba.conf を設定し直す

//探す
$ sudo find / -name pg_hba.conf | grep pg_hba.conf

//==あった
/var/lib/pgsql96/data/pg_hba.conf

このサイトを参考に変更 UbuntuでPostgreSQLをインストールからリモートアクセスまでの手順 - Qiita

すべてtrust に変更

これはcloud9だけの設定なのでherokuには引き継がれないので大丈夫

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust

ログを見る限り、herokuでは rakeを使っているようだ。

$ rake db:migrate

SQLite on Heroku | Heroku Dev Center

基本ここの情報が大切

devcenter.heroku.com

ローカルでサーバーが起動したら、

heroku CLIのインストール、設定

このようなエラーがでて、cloud9ではnodeのバージョンが8以上が求められる。

WARNING Node version must be >=8.0.0 to use this CLI
WARNING Current node version: 6.17.0

NVMのインストール

説明

まずnvm がnodeのバージョン管理ツール nodeとはサーバーサイドのJavaScriptになる。

その上で npm とはnode.jsで作られた、パッケージやライブラリを管理するツール

nvmが言語なのでnvmのバージョンが古いと当然、npmが動かないことがありうる。
よってまずnvm のバージョンを上げてあげるのが大切。
windousXPに windows10のアプリ入れて動かないのと同じ事

nvm インストール可能なバージョン確認

$ nvm ls-remote

     v10.15.2   (LTS: Dubnium)
       v10.15.3   (Latest LTS: Dubnium)
        v11.0.0  
//latest が10.15.3 なのでそれを入れる
$ nvm install v10.15.3

//バージョン10.15.3を利用
$ nvm use v10.15.3
$ npm install -g heroku

$ heroku --version

//==入っています
heroku/7.22.9 linux-x64 node-v10.15.3

herokuにアプリをまず作成する 参考サイト

devcenter.heroku.com

herokuにログインした状態で

$ heroku create

//==作ってくれている
Creating app... done, ⬢ blooming-thicket-97684
https://blooming-thicket-hogehoge.herokuapp.com/ | https://git.heroku.com/blooming-thicket-hogehoge.git

$ heroku login -i
//email パスワードを入力

$ heroku create

$ git remote -v

//==git のremoteにherokuが追加されていることを確認
remote.heroku.url=https://git.heroku.com/intense-hogehoge.git
remote.heroku.fetch=+refs/heads/*:refs/remotes/heroku/*

これ大切

$ heroku git:remote -a [herokuが決めるドメイン]

デプロイ

$ git push heroku master

しかしこのようなエラー herokuにて
    * If you use Sass as a command-line tool, we recommend using Dart Sass, the new
         primary implementation: https://sass-lang.com/install

gem の'sass-rails', '~> 5.0' をコメントしてサイドbundle install

//--without productionは利用しない 利用するとheorku deploy時にエラーになる
$ bundle install

$ heroku logs --tail

$  heroku run rails db:migrate

サーバーの環境変数を設定する

説明1

先程上記でdatabase.yml に記載していた。

  username: <%= ENV['DB_USERNAME'] %>
  password: <%= ENV['DB_PASSWORD'] %>

をheroku のサーバーの環境変数にセットしないといけない。

herokuの環境変数をセット

$ heroku config:set DB_USERNAME=hogehoge

$ heroku config:set DB_PASSWORD=hogehoge