cloud9からRailsをherokuでデプロイ

結構つまりどころ満載だったのでメモ

デプロイまでの流れ

1-DBをポスグレに変更

2-アセットを事前コンパイルする

AssetPipelineとはJavaScriptやSCSSなどを、コンパイルして、動きを早くする仕組み。 開発環境では、コンパイルしないようにしている。できるだけオリジナルで残したおいた方がデバッグが楽なので。 しかし、デプロイ環境では、静的なアセットとして提供したほうがいい。

3-herokuのトークンを設定する

heroku側

1-heroku Toolbeltのインストール

3-SSHをcloud9に設定=herokuへ接続するため。

まずherokuへデプロイするにはDBをポスグレに変更する。 ポスグレが入っているかを確認

$ psql --version
bash: psql: command not found

インストールされてないみたい。 バージョンの確認で判断。 インストールする。次のコマンドを入力。 ざっくりいうとdevelとserverといものがDBには存在する。それは必須。
それとドキュメントなども入れている。

sudo yum install postgresql-devel

sudo yum install postgresql postgresql-server postgresql-contrib postgresql-docs

途中で

Total download size: 6.7 M
Installed size: 18 M
Is this ok [y/d/N]: y
Downloading packages:

聞かれるが y を押す。ちなみに、オスとは、別名、応援団のYesという意味である。

ec2-user:~/environment/sample_app (master) $ psql --version                
psql (PostgreSQL) 9.2.24

これでインストールできました。

次に初期化

一つのデータベースをどうこうするのでなく、サーバをまっさらにするのがinitdbコマンドです。 これしておかないとDB利用できません。

$ sudo service postgresql initdb

ちなみにこんなエラーがでたので‘/var/lib/pgsql9に作られるようだ。

Initializing database: mkdir: cannot create directory ‘/var/lib/pgsql9’: Permission denied

ポスグレを起動する。

$ sudo service postgresql start

Starting postgresql service:                               [  OK  ]

ポスグレにログインしてユーザーとロールを作成する。

インストールするとpostgresというユーザーが作られているので、それでログインする。

sudo -u postgres psql

postgresユーザーにパスワードを設定しよう。忘れないように

; セミコロンを行末に忘れないように、、

postgres=# ALTER USER postgres PASSWORD '[自分のパスワード]';

DBも作成します。

create database [database_name];

ログインする為にはパスワードが必要になりましたので、一旦MySQLか らログアウトして再度ログインしてみます。

\q

で抜けます。 ポスグレを再起動します。

$ sudo service postgresql restart

Stopping postgresql service:                               [  OK  ]
Starting postgresql service:                               [  OK  ]

Rails

gemをインストールします。

以下を追加

gem 'sqlite3'はコメントします。

##デプロイ用
gem 'rails_12factor'
#ポスグレのgem
gem 'pg'

bundle installを実行

OK こんな表示が出たけど、これは、Paperclipという画像upのgemがS3を使うときには、若干変更しないと行けないよというアラート。

Paperclip is now compatible with aws-sdk-s3.

If you are using S3 storage, aws-sdk-s3 requires you to make a few small
changes:

config>databese.yml の設定

production:
  adapter: postgresql
  encoding: utf8
  database: <アプリ名>_production
  username: postgres
  password: 123456
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  url: <%= ENV['DATABASE_URL'] %>

ここでdatabese名にアプリの名前を入れて、rails new したときの名前。

rails db:create

とするとDBがrailsによって作られます。 と思ったらエラー

Peer authentication failed for user "postgres"

これは このページによると、 postgresql - psql: FATAL: Peer authentication failed for user "dev" - Stack Overflow

デフォルトではpsqlはピア認証を使用してUNIXソケットに接続するため、現在のUNIXユーザーはpsqlと同じユーザー名を使用する必要がある。なので、UNIXユーザーのdevを作成してからdevにログインするか、sudo -u dev psql test_developmentを使用してデータベースにアクセスする必要がある。(psqlはパスワードを要求してはいけない) とあり、

pg_hba.conf」というのが認証ファイルで、ここのデフォルト値が「OSのユーザーIDとpostgreのユーザーIDが一致していれば受け入れる(ident)になっている。

これをmd5へ変更しろとあるのでやってみる。

まずpg_hba.confを探す

findメソッドの書き方 find 場所 オプション | grep 特定のファイル名だけ表示

/var 以下の ファイル名がpg_hba.confを探して、 そのうちpgと含まれるものだけ表示してね。

$ sudo find /var -name pg_hba.conf | grep pg

このように表示される。ファイル場所がわかる。

/var/lib/pgsql9/data/pg_hba.conf

f:id:happy_teeth_ago:20180918112121p:plain lacal  all  all  peer
のpeerをmd5へ修正。
暗号化するということ

しかしソケットエラー

PG::ConnectionBad: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?

起動してみる

$sudo service postgresql start

rails db:migrate

今度はDBがないと,,

Caused by:
PG::ConnectionBad: FATAL:  database "sample_app_production" does not exist

$ sudo -u postgres psql

could not change directory to "/home/ec2-user/environment/sample_app"
Password: 
psql (9.2.24)
Type "help" for help.

 
postgres=# create database sample_app_production;

基本はこのように記載

create database database_name owner dbowner_name;

オーナーを指定しない場合には、データベースの作成者がオーナーとなります。 今回はpostgres ユーザーが作ったので、オーナーはpostgresユーザー。

rails db:migrateが通る。

f:id:happy_teeth_ago:20180918113605p:plain 起動するか確認

rails s -b $IP -p $PORT

OK! プレコンパイルはこのコマンド

$ rails assets:precompile RAILS_ENV=production

しかしエラー

rails aborted!
Devise.secret_key was not set. Please add the following to your Devise initializer:

  config.secret_key = '0dd6a401f81d8be436cd4c2862aeddc171657ead73f7abffa3b54d26773fe0fe2f0f891a75f64d81241ed4e7a71eaee543ccdc4fc4e45135b756095bcb6ee95f'

deviseにシークレットキーを設定しなさいと

config>initializers>devise.rb

このファイルに config.secret_key = がありコメントを外した。 しかしエラー、今度は

Uglifier::Error: Unexpected character '#'
/usr/local/rvm/gems/ruby-2.4.1/gems/uglifier-4.1.19/lib/uglifier.rb:234:in `parse_result'

config/environments/production.rbで

config.assets.js_compressor = :uglifier

をコメント しかし別のエラー

Yarn executable was not detected in the system.
Download Yarn at https://yarnpkg.com/en/docs/install

JavaScriptのパッケージマネージャらしい。google やfacebookが開発している。
JavaScriptは急速に進歩している言語なので、パッケージマネージャもどんどん変わる。

$ npm install -g yarn

あっけなくプレコンパイルまで通る。 f:id:happy_teeth_ago:20180918121715p:plain デフォルトで入れておいてほしいと思う。 調査したところこれがheroku上でも問題になりそうだがとりあえず、進む。

秘密トークンの設定

$ rails secret

出てきた秘密トークンを環境変数へ設定.

config>secret.yml

のproductionに記載。? ここにハードコピーしていいのか? どなたかご存知の方、おしえてもらえますか?

メールの送信設定 Action Mailer

デプロイすると当然、メールが送信できないといけない。
Railsにはメール送信の仕組みがある。 テキストメールやHTMLメールを生成。 HTTP経由でいままで表示していたものを、SMTP経由でメールデータとして出力している。

config>environments>production

とりあえず記載。あとからherokuの環境に合わせる。

  config.action_mailer.delivery_method = :smtp
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.smtp_settings = {
    address: 'smtp.sendgrid.net',
    port: 587,
    user_name: ENV["SENDGRID_USERNAME"],
    password: ENV["SENDGRID_PASSWORD"],
    domain: 'herokuapp.com' 
  }

heroku側

1-heroku Toolbeltのインストール

herokuのログが確認できたり、デプロイできる便利なもの 本家サイトでは

The Heroku CLI | Heroku Dev Center

/usr/local/lib/heroku

にフォルダを作りなさいとある。 フォルダ作成

$ sudo mkdir heroku

移動

$ cd heroku/

heroku CLIIのインストール。Cloud9から操作できるようになる。

$npm install -g heroku

cloud9には初めからnpmがインストールされてある。 しかし古いと言われた。

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

nodeはnvmでインストールする。 まずnode version managerのバージョン確認

$ nvm --version

0.31.7

$ nvm install node

Now using node v10.10.0 (npm v6.4.1)

これで、nodeのインストールができた。

 $ nvm install node
Downloading https://nodejs.org/dist/v10.10.0/node-v10.10.0-linux-x64.tar.xz...
######################################################################## 100.0%
Now using node v10.10.0 (npm v6.4.1)

とおもったら、パスが通っていないので、エラー

error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Permission denied)

パーミッションが拒否された場合、大抵はPathが通っていないことが原因

Pathを調べるコマンド

$ npm bin -g

ここに、パスを通さないといけない。

/home/ec2-user/.nvm/versions/node/v6.12.3/bin

環境変数は .bashrc、zsh なら .zshrc

探してみる。

/etc/skel/.bashrc
/root/.bashrc
/var/lib/docker/overlay2/99ea579a303e68e0bc6cbeffb9fcc4851f9ec1e83ac73155b69aa6f404b8ec41/diff/etc/skel/.bashrc
/home/ec2-user/.bashrc

3つある。どれがホントの環境変数の設定ファルなのか? 現在cloud9ではec2-userでrailsアプリも作っているので最後の/home/ec2-user/.bashrcだと思われる。

$ vi /home/ec2-user/.bashrc

でファイル開いて

export NODE_PATH=/home/ec2-user/.bashrc

を追加

$ source /home/ec2-user/.bashrc

するも エラー

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

再度インストールする。

$ nvm install node

v10.10.0 is already installed. Now using node v10.10.0 (npm v6.4.1) 今度はバージョンが10.0になったのでいいかなと

$npm install -g heroku

OK!

herokuへログイン

$ heroku login

でメール、パスワード入力するとログインできる。

公開鍵の設定

enviromentにて(場所は自由に決定してください)

mkdir .ssh

$ssh-keygen

保存先を聞いてくるので先ほど作成した、隠しフォルダに保存。 保存先は覚えておく。 Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub. f:id:happy_teeth_ago:20180918145801p:plain どんな鍵か、人間にはわからないので、わかりやすく画像を表示してくれる。

####$ heroku login

$ git init

$ git add .

$ git commit -m "heroku init"

エラー

You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

gitのリモートの登録していないので当たり前。

丁寧に説明してくれるので、そのとおりにする

You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

git config --global user.name "登録アカウント"

git config --global user.email "登録メールアドレス"

heroku にアプリを作る

$ heroku create

https://limitless-woodland-83178.herokuapp.com/ | https://git.heroku.com/limitless-woodland-83178.git

メール送信アドオン登録

$ heroku addons:add sendgrid:starter

$ git push heroku master

次々とインストールされていく。

$heroku run rails db:migrate

これでデプロイ完了。

アプリをスリープさせない設定

無料枠は、デフォルトで30分アクセスがないと止まってしまう。 herokuではadd-onといってwordpressのプラグインのような追加機能が用意されている。 クレジットカードの登録はしておかないといけない。 無料で利用可能な範囲のみ伝えます。

heroku schedulerをインストール

f:id:happy_teeth_ago:20180919000557p:plain 下の赤い囲みの中にheroku schedulerと入れる。 時計のマークみたいなアイコンがある。

heroku schedulerの画面にてadd new job

f:id:happy_teeth_ago:20180919000726p:plain

every 10 minutesを選択

これで常時起動しています。 無料です。