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
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が通る。
起動するか確認
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
あっけなくプレコンパイルまで通る。 デフォルトで入れておいてほしいと思う。 調査したところこれが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. どんな鍵か、人間にはわからないので、わかりやすく画像を表示してくれる。
####$ 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をインストール
下の赤い囲みの中にheroku schedulerと入れる。 時計のマークみたいなアイコンがある。
heroku schedulerの画面にてadd new job
every 10 minutesを選択
これで常時起動しています。 無料です。