deploy(rails)

credentials.yml.enc

rails5.2からsecrets.ymlの代わりに導入された。
credentials.yml.encはgitに共有されるが、master.keyは.gitignoreに最初から追加されている。
master.keyがあれば以下のコマンドでdecodeして編集できる。

EDITOR=vim bin/rails credentials:edit

git等で環境を引っ張ってきた場合には、上記のコマンド時にmaster.keyが新規に作成されてしまう。これはcredentials.yml.encが作成された時のキーとは違うため、credentialsをデコードできない。

自動デプロイ

capistrano 参照

エラー対策

uglifier

JavaScriptを軽量化するためのgem。

テンプレートリテラル等の新しい記法を用いているとコンパイル時にエラーがでる。
(特に自動デプロイ時)
config/environments/production.rb の下記の設定をコメントアウトする。

config.assets.js_compressor = :uglifier
↓
# config.assets.js_compressor = :uglifier

ちなみにエラーを起こさせると以下のように怒られる。

rake stderr: rake aborted!
Uglifier::Error: Unexpected character '`'

デバッグ

mysqlの起動の確認と起動

sudo service mysqld status
sudo service mysqld start

mysql.sockのパス指定

railsとMySQLサーバーのやり取りは、ソケットファイルを通じて行われる。

$ mysql_config --socket
# 下記のようにmysql.sockがどのディレクトリに存在しているかが出力される
/var/lib/mysql/mysql.sock
config/database.yml

production:
  <<: *default
  database: ~~~(それぞれのアプリケーション名によって異なっています。こちらは編集しないでください)
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
 # socket: に続く部分を先ほど調べたパスに置き換える 
  socket: /var/lib/mysql/mysql.sock

cannot allocate memory ~

# rootユーザーへ変更する
$ sudo su -

# ダーティー・キャッシュをディスクに落とし込む
$ sync

# ページキャッシュおよびディレクトリエントリー(dentry) とinode のクリア
$ echo 3 > /proc/sys/vm/drop_caches

nginx 403 Forbiden

ログの確認

cat log/nginx.error.log

13 permission deniedの場合、nginxの設定変更へ

sudo vi /etc/nginx/nginx.conf

userに関する記述を、下記のように変更

user  ユーザー名;
worker_processes  1;

自動デプロイ時みmigrateで失敗

マイグレーションの実行履歴から該当ファイルを削除

マイグレーションを削除した時にnofileと表示されてしまった場合の対処法 - bokunonikki.net

デプロイ時に設定変更が反映されない。

unicornをkillできていない可能性があるため手動でkillしてから再度デプロイする。

アクセスできない we are sorry~~

UnicornとNginxを再起動してみる

sudo service nginx reload

css, javaが反映されない

project階層で以下を実行

rake assets:precompile RAILS_ENV=production

画像の読み込みがうまくいかない

public/images以下に設置した画像はコンパイルされないため、本番環境にデプロイしてもパスが変わらない。
一方、assets/images以下に保存した情報はコンパイル時に参照先が変化する。この影響で画像を読み込めない場合がある。
このため必要な画像はpublic/images以下に設置する。

production.logに何も出力されない

railsアプリケーションをherokuにデプロイする際には、rails_12factorgemを導入する必要あり。
CSS・Javascriprなどのassetsとアプリケーションのlogの出力先をheroku用に整えるgem。

herokuからAWSへとデプロイ先を切り替える場合は、このgemをGemfileから削除。
gemfileから削除してbundle install

tail -f

ファイルの変更をリアルタイムで反映して表示する

tail -f log/production.log

mySQL

mysql.server start

が実行されると.socketファイルを読みに行く。
過去にmysqlをインストールしていたりするとこの位置が違ってエラーがでる可能性あり。

MySQLの設定ファイルであるmy.cnfを作って、今から使う設定をそこに書き込む
  (+ エラーが吐かれるようにエラーログを記録するディレクトリ等も書き込む)
上記で指定したファイルには、書き込みが可能な権限を与える

/etc/my.cnfの位置にmySQLの設定ファイルであるmy.confを作成する。
中身は以下のようにする。

[mysqld]
socket  = /tmp/mysql.sock

[mysqld_safe]
 log-error=/var/log/mysqld.log

ログが出力されるファイルを作成する。

sudo touch /var/log/mysqld.log

権限の変更をする。

sudo chown ユーザー名:wheel /var/log/mysqld.log

※sudo する権限のあるグループはwheel という名前にする(ただの慣習)

usr/local/binなどあたりにpidファイルを生成しようとするも権限が無くできない

sudo chmod ユーザー名:wheel /private
エラーログが書けない。
$sudo chmod 755 /var/log
socketファイルが書けない(生成できない)
$sudo chmod 755 /tmp

mysqlをbrewで入れて、my.confを作ってない場合、
以下でエラーログを確認できる。

less /usr/local/var/mysql/`hostname`.err

mySQLのソフトウェアとデータのバージョン違い

通常インストールすると5.7が、指定すれば5.6等の他バージョンを使える。

brew uninstall mysql, brew install mysql56

などとすればソフトウェアのバージョンを切り替えることができるが、データのバージョンまでは変わらない。ここでエラーとなる場合がある。
/usr/local/var/mysqlを削除すればデータの削除となる。

sudo rm -rf /usr/local/var/mysql

mysqlの起動に関するファイルの権限が違う場合

所有者権限を確認。

ls -la /usr/local/var/mysql

ファイルの権限がユーザーと違っていれば書き換える。

sudo chown -R $(whoami):admin /usr/local/var/mysql

コメント