CapistranoでRailsをEC2にデプロイする時のトラブルシューティング


そろそろRailsのアプリをHerokuとかだけじゃなくて、
本格的にAWS(EC2)でも使いたいな...と思いCapistranoを導入。
しかし、予想以上にハマってしまったので様々なエラーと対処した方法をメモしておく。

#やりたいこと
- Gitリポジトリは [Bitbucket](https://bitbucket.org/) で管理してそれをデプロイしたい。
- [EC2](http://aws.amazon.com/jp/ec2/)で Nginx + Unicorn + MySQL  でWEBサーバとして公開したい。
- Capistranoを用いてローカルからコマンドでデプロイを完結したい。


#使用環境

- rbenv 0.4.0

```ruby:Gemfile（抜粋）
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してみる](http://qiita.com/ea54595/items/12ab7b3a8213b35cca10)
- [はじめてのCapistrano](http://qiita.com/mosson/items/1a4cfd01cb538f2d8f0e)



#デプロイまでに出たエラーと対処

##Q1.ttyがないって謝られるんだけど？
「sudo stderr: sudo: sudo を実行するには tty がなければいけません。すみません」

```bash
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

```ruby:config/deploy.rb
set :pty, true
```

コレで`ssh`コマンドに`-t`オプションを付けて実行するようです。

[参考] [capistranoでsudoしたい時にttyがなければいけませんすいませんって謝られる](http://qiita.com/ta9to/items/7c22c8b2af31ee96be89)


##Q2. Bitbucketの認証に失敗するんだけど？その１

###A.公開鍵登録するの忘れてた。
`$ cat ~/.ssh/rsa_id.put` とかをコピーして自分のアカウントのSSHキーとして登録しましょう。

参考：[GitHubからCapistrano3デプロイ - Webサービス開発フロー(5)]
(http://www.shun.bz/20141230/1016639561.html)

##Q3. Bitbucketの認証に失敗するんだけど？その２

###A. リポジトリ取得方法は色々ある？SSHで試してみよう。
```ruby:config/deploy.rb
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種類の方法について](http://qiita.com/ryshinoz/items/cc3a526c92bf79d3bfe3)

##Q4. パーミッション指定で怒られるんだけど？
```bash
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.パーミッション最適化しましょう。

```bash
$ chmod 600 ~/.ssh/config
```

で、OK!!!

##Q5. デプロイフラグがなにやらおかしいと怒られるんですが？

```bash
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.不要な処理でエラーなってるようなのでフラグを変更する。

```ruby:config/deploy.rb
set :bundle_flags, "--quiet --binstubs --shebang ruby-local-exec"
```

[参考] [rbenvがあればCapistranoのbundle:installでdeploymentはいらない](http://blog.takuyan.com/posts/2012/11/01/deployment-flag-of-bundle-instal-with-capistrano/)


##Q6.環境変数が認識されないんだけど？

パスワード等をソースにベタ書きするのはまずいよね。
ということで、皆様環境変数を設定して`ENV["HOGE"]`とかで取り出すと思いますが、
Capistranoでデプロイする時にサーバ上の環境変数が取得出来ないみたいです。
面倒ですね...。

```bash
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で環境変数を読み込んでくれない](http://www.lanches.co.jp/blog/869)


***

うーん、なかなかクセのあるツールですねぇ...。
通信やらがメインなんで仕方ないですね。
まだ微妙な部分ありますが参考になれば幸いです。