そろそろRailsのアプリをHerokuとかだけじゃなくて、
本格的にAWS(EC2)でも使いたいな...と思いCapistranoを導入。
しかし、予想以上にハマってしまったので様々なエラーと対処した方法をメモしておく。
#やりたいこと
- Gitリポジトリは Bitbucket で管理してそれをデプロイしたい。
- EC2で Nginx + Unicorn + MySQL でWEBサーバとして公開したい。
- Capistranoを用いてローカルからコマンドでデプロイを完結したい。
#使用環境
- rbenv 0.4.0
ruby '2.1.2'
gem 'rails', '4.2.0'
gem 'mysql2'
# Use Unicorn as the app server
gem 'unicorn'
# Use Capistrano for deployment
group :deployment do
gem 'capistrano-rails' # Rails用
gem 'capistrano-rbenv' # rbenv用
gem 'capistrano3-unicorn' # Unicorn用
gem 'capistrano-safe-deploy-to' # デプロイ時のディレクトリ等調整用
end
[参考]
- [Capistrano3 + Rails4 + Unicorn + Nginx + EC2でサーバー構築!](h
ttp://qiita.com/SanoHiroshi/items/d7942d66678f0d60f0ed) - Capistrano3でrailsをdeployしてみる
- はじめてのCapistrano
#デプロイまでに出たエラーと対処
##Q1.ttyがないって謝られるんだけど?
「sudo stderr: sudo: sudo を実行するには tty がなければいけません。すみません」
DEBUG [c05ece1f] Running /usr/bin/env [ -d ~/.rbenv/versions/2.1.2 ] as user_name@99.99.99.99
DEBUG [c05ece1f] Command: [ -d ~/.rbenv/versions/2.1.2 ]
DEBUG [c05ece1f] Finished in 1.974 seconds with exit status 0 (successful).
INFO [fe86f8b4] Running /usr/bin/env sudo mkdir -pv /var/www/app_name as user_name@99.99.99.99
DEBUG [fe86f8b4] Command: ( RBENV_ROOT=~/.rbenv RBENV_VERSION=2.1.2 /usr/bin/env sudo mkdir -pv /var/www/app_name )
DEBUG [fe86f8b4] sudo
DEBUG [fe86f8b4] :
DEBUG [fe86f8b4] sudo を実行するには tty がなければいけません。すみません
DEBUG [fe86f8b4]
(Backtrace restricted to imported tasks)
cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing as user_name@99.99.99.99: sudo exit status: 1
sudo stdout: Nothing written
sudo stderr: sudo: sudo を実行するには tty がなければいけません。すみません
いえいえ、こちらこそすみません。
###A.オプションを追加すればOK
set :pty, true
コレでssh
コマンドに-t
オプションを付けて実行するようです。
[参考] capistranoでsudoしたい時にttyがなければいけませんすいませんって謝られる
##Q2. Bitbucketの認証に失敗するんだけど?その1
###A.公開鍵登録するの忘れてた。
$ cat ~/.ssh/rsa_id.put
とかをコピーして自分のアカウントのSSHキーとして登録しましょう。
参考:[GitHubからCapistrano3デプロイ - Webサービス開発フロー(5)]
(http://www.shun.bz/20141230/1016639561.html)
##Q3. Bitbucketの認証に失敗するんだけど?その2
###A. リポジトリ取得方法は色々ある?SSHで試してみよう。
set :repo_url, 'git@bitbucket.org:user_name/rep_name.git' # OK
# set :repo_url, 'https://user_name@bitbucket.org/user_name/rep_name.git' # NG
[参考] Capistrano 3.x で GitHub(プライベートリポジトリ)からソースコードを取得する3種類の方法について
##Q4. パーミッション指定で怒られるんだけど?
DEBUG [4e69adfc] Command: ( RBENV_ROOT=~/.rbenv RBENV_VERSION=2.1.2 GIT_ASKPASS=/bin/echo GIT_SSH=/tmp/app_name/git-ssh.sh /usr/bin/env git ls-remote --heads git@bitbucket.org:bitbucket_user/repo_name.git )
DEBUG [4e69adfc] Bad owner or permissions on /home/user_name/.ssh/config
DEBUG [4e69adfc] fatal: Could not read from remote repository.
DEBUG [4e69adfc]
DEBUG [4e69adfc] Please make sure you have the correct access rights
DEBUG [4e69adfc] and the repository exists.
権限設定ミスで結構怒られる...。
###A.パーミッション最適化しましょう。
$ chmod 600 ~/.ssh/config
で、OK!!!
##Q5. デプロイフラグがなにやらおかしいと怒られるんですが?
DEBUG [4bf3bfa9] [31mThe --deployment flag requires a Gemfile.lock. Please make sure you have checked
DEBUG [4bf3bfa9] your Gemfile.lock into version control before deploying.[0m
(Backtrace restricted to imported tasks)
cap aborted!
SSHKit::Runner::ExecuteError: Exception while executing as user_name@99.99.99.99: bundle exit status: 16
bundle stdout: The --deployment flag requires a Gemfile.lock. Please make sure you have checked
your Gemfile.lock into version control before deploying.
bundle stderr: Nothing written
###A.不要な処理でエラーなってるようなのでフラグを変更する。
set :bundle_flags, "--quiet --binstubs --shebang ruby-local-exec"
[参考] rbenvがあればCapistranoのbundle:installでdeploymentはいらない
##Q6.環境変数が認識されないんだけど?
パスワード等をソースにベタ書きするのはまずいよね。
ということで、皆様環境変数を設定してENV["HOGE"]
とかで取り出すと思いますが、
Capistranoでデプロイする時にサーバ上の環境変数が取得出来ないみたいです。
面倒ですね...。
DEBUG [7cf14543] Command: cd /var/www/app_name/releases/20150518175900 && ( RBENV_ROOT=~/.rbenv RBENV_VERSION=2.1.2 RAILS_ENV=production ~/.rbenv/bin/rbenv exec bundle exec rake db:migrate )
DEBUG [7cf14543] rake aborted!
DEBUG [7cf14543] Mysql2::Error: Access denied for user 'user_name'@'99.99.99.99' (using password: NO)
DEBUG [7cf14543] /var/www/app_name/shared/bundle/ruby/2.1.0/gems/mysql2-0.3.18/lib/mysql2/client.rb:70:in `connect'
###A.環境変数使うのやめよ...。
settingslogic
っていうGemで外部ファイルに定数なんかを書き出して管理する方法が良さそう。
config/initializers/
とかに入れておけば、
タイミング的にいつでもAPから参照出来るので動作的には問題無さそう。
[参考] Capistoranoで環境変数を読み込んでくれない
うーん、なかなかクセのあるツールですねぇ...。
通信やらがメインなんで仕方ないですね。
まだ微妙な部分ありますが参考になれば幸いです。