Conoha vpsサーバーにCentOS6.9 + Rails5系 + MySQL + nginx + unicorn + capistranoでデプロイまで


**2回目のデプロイを行いましたので、記事を更新させたいと思います(9/25)**

```
CentOs 6.9

$ ruby -v
2.5.1
$ rails -v
5.2.1
$ nginx -v
1.15
$ cap -v
Capistrano Version: 3.11.0 (Rake Version: 12.3.1)

```


この記事のゴールはローカルの環境からcapistranoでrailsアプリをデプロイしてアクセスできるところまでとします。細かい設定などはしていませんのでご了承ください。*

**すでにローカルにgitで管理されているrailsアプリがある前提で進めていきます。
今回のデプロイするrailsアプリのリポジトリ名→ deploy_app**


今までherokuに頼りきりでしたが、初めてvpsサーバーを借りてデプロイすることができましたので、復習と誰かのためになればと思い、まとめます。一番最初の手順から常にハマりまくっていたので、対策方法なども網羅したい。

参考になるのでぜひ見てみてください。
[ドットインストール - ローカル開発環境の構築(Centos) [macOS編]](https://dotinstall.com/lessons/basic_localdev_mac_v2)
[ドットインストール - さくらVPS編](https://dotinstall.com/lessons/basic_sakura_vps)

### **流れ**
```
1. ConohaVPSを契約する
2. CentOSにRubyを入れる
3. Mysqlの設定
4. nginxの設定
5. unicornの設定
6. capistrano設定
7. capistranoからデプロイ!
```
それではどんどん書いていきます。


**⚠️ コマンドを書いて行く際、 
⚠️ $は一般のコマンド 
⚠️ #はroot権限のコマンド
という意味で記述していますので、注意ください**



#1. ConohaVPSを契約する
[ConohaVPS](https://www.conoha.jp/)ここから登録。（さくらVPS等でも全然問題ないです）
私は1750円のものを選択しました。
登録画面に従って3分くらいで簡単に契約できます。
登録後のIPアドレス**12X.XXX.XXX.XXXとPASSWORD**はデプロイする上で必要です。
 **以後 ipアドレスは123.45.678.000と表記しますので注意してください**
起動もさせておく


### 接続とセキュリティー各種設定

```

 # ssh root@123.45.678.000 # VPSに接続


**#はroot権限のコマンドという意味です**

 # yum update # アプリケーションを更新

 # vim /etc/sysconfig/i18n 
 LANG="ja_JP.UTF-8"に変更 #日本語にする
```


#### 作業用ユーザーを追加する

```
 # useradd hogehuga #hogehugaという作業ユーザーが作られる
 # passwd hogehuga  # パスワードを設定する

 # usermod -G wheel hogehuga #作業ユーザーでもsudoを使えるようにする(hogehugaをwheelグループにいれなさいという命令)
 # visudo #ファイルを編集 wheelの部分(## Allow people in group wheel to run の下の行)がコメント化されているので外してあげる。
保存する。

一旦抜けてログインできるか試す。
$ ssh hogehuga@123.45.678.000
うまくいくはず
```

#### パスワードではなく鍵認証にする
Mac側で鍵のペアを生成(秘密鍵と公開鍵)
VPS側で公開鍵をMac側で秘密鍵を使ってマッチさせる仕組み

鍵を生成前にまずはVPS側で公開鍵の保管場所を作成する

```
$ mkdir ~/.ssh     # ディレクトリ作成
$ chmod 700 ~/.ssh #パーミッション設定

MAC側(localhost)で作業
$ ssh-keygen -y rsa -v # 鍵が作成される(id_rsaとid_rsa.pub)
$ chmod 600 ~/.ssh/id_rsa.pub # パーミッション付与

公開鍵をVPSに転送
$ scp~/.ssh/id_rsa.pub hogehuga@123.45.678.000:~/.ssh/authorized_keys

vpsに入って 
$ ls -la .ssh
=> authorized_keysが入っていれば良い

configファイルも作っておく

# vi ~/.ssh/config
Host conoha_deploy_app
  HostName ***.**.**.*** # ip_adress
  User hogehuga
  Port 55555
  IdentityFile  ~/.ssh/id_rsa # deployの時にも使います

$ ssh conoha_deploy_appで接続できているか試す

ssh-agentを登録しておく
$ eval `ssh-agent`
$ ssh-add ~/.ssh/id_rsa
```
```
試してみる
$ ssh -i ~/.ssh/id_rsa hogehuga@123.45.678.000
$ ssh -i hogehuga@123.45.678.000 # 省略も可能。
```

#### **さらにセキュリティーを高めるために3つの設定をする**

その前に、現在hogehugaユーザーでvpsにログインしているかと思いますが、これからroot権限が必要とされる機会が多くなるので、次のコマンドを実行

```
$ sudo -s  #root権限を保持する
```

```
# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org # 念のためバックアップを取っておく

# vim /etc/ssh/sshd_config # 以下の3つを変更するために書き
換える。該当箇所探してください。
```

```text:/etc/ssh/sshd_config
該当箇所探してください。

①ポート番号の変更
/Portとファイル検索してコメントを外し
22から55555に変更する
②パスワードログインの禁止
PasswordAuthentication no
③rootログインの禁止
PermitRoot_Login no
```

と書き換えて保存。
変更を反映

```
# service sshd restart

$ ssh -p 55555 hogehuga@123.45.678.000
でログインできればOK!!
```

### ファイアーウォールの設定
名前が格好いい
iptablesで設定されている
 # vim /etc/sysconfig/iptables
下記をコピペでOKです。

```
*filter
:INPUT    DROP    [0:0]
:FORWARD  DROP    [0:0]
:OUTPUT   ACCEPT  [0:0]
:SERVICES -       [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4  -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -j SERVICES
-A INPUT -p udp --sport 53 -j ACCEPT
-A INPUT -p udp --sport 123 --dport 123 -j ACCEPT
-A SERVICES -p tcp --dport 55555 -j ACCEPT
-A SERVICES -p tcp --dport 80 -j ACCEPT
-A SERVICES -p tcp --dport 443 -j ACCEPT
COMMIT
```
55555のところを適宜変更してください。

⚠️ 私の場合iptable関連でハマったりしたので、意識しておくと良いかもです。
mysqlを使用するときにもこのファイルにport番号(大抵3306)を記載する必要があります。

```
# service iptables start # 変更を適用させる 

# iptables -L # iptables確認できる
```
お疲れ様です。ここからが本番です。


#2. Rubyを入れる

1. まずはgitをインストール

```
$ sudo yum -y install git
$ git --version
```

２. rbenvインストール

```
rbenvはrubyのバージョン管理ツールです
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

３. ruby-buildインストール
ruby-burildはrbenv installを実行するためのrbenvのプラグインです。
rbenvとセットでインストール

```
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```


４. 依存パッケージのインストール

```
rubyをインストールするための関連するパッケージです。これがないと、rbenv installの際にコケます。

$  sudo yum -y install bzip2 gcc openssl-devel readline-devel zlib-devel
```


５ rbenv読み込み設定

```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
# rbenvの初期化
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# bashの再読込
$ source ~/.bash_profile
# バージョン確認　バージョンが出ればOK
$ rbenv -v
```

６. Rubyをインストールする

```
$ rbenv install 2.5.1
# global設定
$ rbenv global 2.5.1
$ rbenv rehash
# バージョン確認
$ ruby -v
 => 2.5.1と出ればOK!!
```

７. bundlerのインストール

```
# gem install bundle
```

８. nodejsのインストール(railsを使用するために使う)

nodejsインストール失敗したら、お使いの環境に合わせて、ググってインストールしてください

```
# curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -

# yum -y install nodejs
```


#3. Mysqlの設定

ドットインストールに従いました。
https://dotinstall.com/lessons/basic_sakura_vps/8016
インストールする

```
# yum install mysql-server
# cp /etc/my.cnf /etc/my.cnf.org # 保険としてコピーしておく
# vim /etc/my.cnf # mysqlの設定ファイル

起動
# service mysqld start # 起動
# mysql_secure_installation # コマンドに従って、パスワードなどをを設定していく
# chkconfig mysqld on # 自動起動設定
# mysql -u root -p # rootでログイン
```


vpsに接続できるか試してみる

```
$ mysql -u root -p

> mysql -u root -h 123.45.678.000 -p

私の場合ここでERROR 1130 (HY000): Host '123.45.678.000' is not allowed to connect to this MySQL serverというエラーでハマりました

同じ現象になったら
mysql> GRANT all ON *.* TO root@123.45.678.000 IDENTIFIED BY 'パスワード';     
mysql> FLUSH PRIVILEGES;

を試して見てください。

このままproduction用のdatabaseも作成します。

> create database deploy_app_production; # deploy_app_productionというデータベースが作成される→ 後にdatabase.ymlでも使用する

> exit
```
これでMysqL設定ok!



#4. nginx(webサーバー)の設定

①まずデプロイするアプリの置き場所をVPSに用意する

```
$ sudo mkdir -p /var/www/'deploy_app(railsアプリケーションの名前)'  ⚠️後で出てくる頻度が多くなるので注意
```


②nginxをインストール
[インストール参考](https://qiita.com/noraworld/items/1aae57dcbe428089c7d5)

```
/etc/yum.repos.d/nginx.repo というファイルを作成し、そのファイルに以下を記述。

# vim /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1

保存すること
```

いざインストール

```
$ sudo yum -y --enablerepo=nginx install nginx

$ nginx -v 

nginx version: nginx/1.12.0(例) のように表示されてればOK!
```


#### nginxの設定

/etc/nginx/conf.d/default.confを編集する

```
まずはバックアップのコピー
$ sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/local.conf
$ sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bk
```

$ vim /etc/nginx/conf.d/local.conf
必要最低限の3箇所を編集します


```text:/etc/nginx/conf.d/local.conf

upstream unicorn {
 server unix:/var/www/app/deploy_app/shared/tmp/sockets/unicorn.sock; ### 変更箇所 ちょー大事、後ほど登場するユニコーンと紐づく
}

server {
  listen 80 default_server;
  server_name 123.45.678.000;  ### 変更

  access_log /var/log/nginx/access.log; # ログ場所
  error_log /var/log/nginx/error.log;    # ログ

  root /var/www/deploy_app/public; ### 変更

  client_max_body_size 100m;
  error_page 404 /404.html; 
  error_page 500 502 503 504 /500.html;
  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://unicorn;
  }
}
```
保存を忘れずに
続いて設定

```
$ sudo chkconfig nginx on # 自動起動設定
$ sudo service nginx configtest # 設定ファイルに問題がないか確認
$ sudo service nginx restart #再起動
```
[nginxでよく使うコマンド]
(https://qiita.com/Kaisyou/items/dadf6fe9ee93fb69e76c)

#5. Capistranoとunicornの設定


capistranoはデプロイツールでunicornはリモートサーバー上でrailsを動かす役割です。

⚠️⚠️⚠️⚠️⚠️⚠️⚠️ここからはdeploy_appのローカル開発環境で作業しますので注意！！！⚠️⚠️⚠️⚠️⚠️⚠️⚠️

まずはrailsのgemfileを編集

```ruby:Gemfile

gem 'unicorn'

group :deployment do
  # capistrano
  gem 'capistrano'        
  gem 'capistrano-rails'
  gem 'capistrano-bundler'
  gem 'capistrano-rbenv'
end
```

```
$ bundle install
```

database.ymlとsecrets.ymlはgithubを介さずにcapistranoコマンドにてアップロードをするので先にファイルを設定します。

```ruby:config/database.yml

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: ***********
  socket: /tmp/mysql.sock # 各自でmysql.sockがある場所を指定してください

production:
  <<: *default
  adapter: mysql2
  encoding: utf8
  database: deploy_app_production # mysqlで作成したdatabase名
  username: root
  password: ************* 
  host: 123.45.678.000 # IPアドレス
```

次に secrets.ymlの設定
ローカルにて
```
$ rake secret
8472698akjs234987293fhgaljshdfglkajsflkbjadsfnlkjadnfk
```
みたいに表示されるのでこれをコピペして貼り付ける

```secrets.yml
production:
  secret_key_base: 8472698akjs234987293fhgaljshdfglkajsflkbjadsfnlkjadnfk
```

アセットパイプラインを通す設定をする

```
本番環境ではcssとjsはコンパイルしないと読み込まれないのでする必要がある
$ rake assets:precompile RAILS_ENV=production 
```

私の場合ここprecompileでもハマりました。

```
Sprockets::FileNotFound: couldn't find file 'xray'
```
解決できなかったのですが、productionでは使わないものだったので消して再実行しコンパイル成功。

config/environments/production.rbを変更

```ruby:config/environments/production.rb

config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?を
config.public_file_server.enabled = true
に変更する
```

後もう少し!

unicornの設定ファイルを作成します
新規でconfig/unicorn/production.rbとなるように作成してください。

```ruby:config/unicorn/production.rb

# -*- coding: utf-8 -*-
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 30

# ホットデプロイをするか？
preload_app true # 更新時ダウンタイム無し

app_path = '/var/www/deploy_app/current'
working_directory "#{app_path}"

# nginxと連携するための設定
# リクエストを受け取る ポート番号を指定
listen "/var/www/deploy_app/shared/tmp/sockets/unicorn.sock"
# PIDの管理ディレクトリ
pid "/var/www/deploy_app/shared/tmp/pids/unicorn.pid" # nginxで指定したパスを設定してください

stdout_path "#{app_path}/log/unicorn.log"
stderr_path "#{app_path}/log/unicorn.log"


# ログの出力パス
stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])

puts "-------------メッシメッシメッシメッシメッシメッシメッシ-----------------"

# フォーク前に行うことを定義
before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

# フォーク後に行うことを定義
after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

```

#6. capistrano設定
capistranoはデプロイを簡単に行えるもの。
GithubにあるリモートリポジトリからConohaVPSにアップロードしてくれます。

①コマンドで設定ファイルを作成する

$ bundle exec cap install

→ 4つのファイルが作成されます

これらを一つずつ設定していきます。

```
Capfile               - capistranoが実行される際に読み込むgemファイルやtaskを記載。
config/deploy.rb      - capistranoが実施するレシピを記載。
config/deploy/**.rb   - 各環境ごとの設定
lib/capistrano/tasks/ - capistranoに実施させたいタスクを定義できる
```

```ruby:Capfile

# capistranoの基本動作を設定
require "capistrano/setup"   
require "capistrano/deploy"  
require "capistrano/scm/git" 
install_plugin Capistrano::SCM::Git


require "capistrano/rails" 
require "capistrano/rails/assets"
require "capistrano/rails/migrations" 
# rbenvの設定
require "capistrano/rbenv" #ok
require "capistrano/bundler"
require "pry" # 全然必要ないけどデバッグで便利でした...

Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
```

デプロイの共通設定をする

```ruby:config/deploy.rb
# 共通の設定をconfig/deploy.rbで記述

# config valid for current version and patch releases of Capistrano
lock "~> 3.11.0"

# 基本設定
set :application, "deploy_app"
set :repo_url, "https://UserName@github.com/UserName/deploy_app.git"# デプロイ対象のリポジトリ->プライベートリポジトリとしていたため私はhttpsで指定しましたが、sshで大丈夫です。

set :deploy_to, '/var/www/deploy_app' # デプロイ先

set :rbenv_type, :user  # rbenvをシステムにインストールした or ユーザーローカルにインストールした
set :rbenv_ruby, '2.5.1' # サーバで利用するrubyのバージョンを指定
set :rbenv_path, '/home/username/.rbenv'
set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"

# リリースフォルダをいくつまで保持するか？
set :keep_releases, 5
set :deploy_via, :remote_cache

set :log_level, :debug # capistranoの出力ログの制御
set :pty, true # sudoを使用するのに必要


# Shared に入るものを指定
set :linked_files, %w{config/database.yml config/secrets.yml} # シンボリックリンクを貼るファイル
set :linked_dirs,  %w{bin log tmp/pids tmp/sockets tmp/cache vender/bundle } # sharedにシンボリックリンクを張るディレクトリ指定

after 'deploy:publishing', 'deploy:restart'
namespace :deploy do


 desc 'Restart application'
  # アプリ再起動を行うタスク
  task :restart do
    on roles(:app), in: :sequence, wait: 5 do
      execute :mkdir, '-p', release_path.join('tmp')
      execute :touch, release_path.join('tmp/restart.txt')
    end
  end
  # linked_files で使用するファイルをアップロードするタスク
  # deployが行われる前にコマンドにて実行する
  desc 'upload important files'
  task :upload do
    on roles(:app) do |host|
      execute :mkdir, '-p', "#{shared_path}/config"
      upload!('config/database.yml',"#{shared_path}/config/database.yml")
      upload!('config/secrets.yml',"#{shared_path}/config/secrets.yml")
    end
  end

  # webサーバー再起動時にキャッシュを削除する
  after :restart, :clear_cache do
   on roles(:web), in: :groups, limit: 3, wait: 10 do
    #Here we can do anything such as:
    within release_path do
      execute :rm, '-rf', release_path.join('tmp/cache')
    end
   end
  end
  # Flow の before, after のタイミングで上記タスクを実行
  before :started,   'deploy:upload'
  after  :finishing, 'deploy:cleanup'

  #unicorn 再起動タスク
  desc 'Restart application'
  task :restart do
    invoke 'unicorn:restart' # lib/capustrano/tasks/unicorn.rake 内処理を呼び出す
  end
end
```

production環境の設定

```ruby:config/deploy/production.rb
set :stage, :production
set :branch, 'master' ## 必要があれば変更

server 'IP.AD.RE.SS', user: 'hogehuga', roles: %w{app db web}, port: 55555

set :ssh_options, {
  port: 55555, #### 変更
  keys: [File.expand_path('~/.ssh/id_rsa')], # リモートサーバー用秘密鍵があるところを指定 １で設定したid_rsaを指定すること
  forward_agent: true,
  auth_methods: %w(publickey)
}
```



次はtaskファイルを設定
ここはコピペでも大丈夫そう。

```ruby:lib/capistrano/tasks/unicorn.cap

namespace :unicorn do
  task :environment do
    set :unicorn_pid, "/var/www/deploy_app/shared/tmp/pids/unicorn.pid" # config/unicorn/production.rbないのpidと同じ
    set :unicorn_config, "#{current_path}/config/unicorn/production.rb"
  end

  def start_unicorn
    # フォルダが存在した場合のみ実行する
    within current_path do
    execute :bundle, :exec, :unicorn, "-c #{fetch(:unicorn_config)} -E #{fetch(:rails_env)} -D"
    end
  end

  def stop_unicorn
    execute :kill, "-s QUIT $(< #{fetch(:unicorn_pid)})"
  end

  def reload_unicorn
    execute :kill, "-s USR2 $(< #{fetch(:unicorn_pid)})" 
  end

  def force_stop_unicorn
    execute :kill, "$(< #{fetch(:unicorn_pid)})"
  end

  desc "Start unicorn server"
  task :start => :environment do
    on roles(:app) do
      start_unicorn
    end
  end

  desc "Stop unicorn server gracefully"
  task :stop => :environment do
    on roles(:app) do
      stop_unicorn
    end
  end

  desc "Restart unicorn server gracefully"
  task :restart => :environment do # TODO
    on roles(:app) do
      if test("[ -f #{fetch(:unicorn_pid)} ]")
        reload_unicorn
      else
        start_unicorn
      end
    end
  end

  desc "Stop unicorn server immediately"
  task :force_stop => :environment do # TODO
    on roles(:app) do
      force_stop_unicorn
    end
  end
end

```


**リモートサーバーとgithubをつなぐ公開鍵認証の設定をする**
リモートサーバーにて

```
$ cd ~/.ssh
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hogehuga/.ssh/id_rsa): Enter 
Enter passphrase (empty for no passphrase): Enter
Enter same passphrase again: Eneter

$ cat id_rsa.pub
# 出力をコピーして、以下のgithubのコンソールリンクより公開鍵を登録
-> https://github.com/settings/keys


# 設定ファイルを作成
$ sudo vi ~/.ssh/config
# 以下を記述
Host github
  Hostname github.com
  User git
  IdentityFile ~/.ssh/id_rsa 


$ ssh -vT github で確認 # vはデバッグオプションで便利 
#以下のような文章が出力されればOK
Hi Hogehuga! You've successfully authenticated, but GitHub does not provide shell access.

ついでに必要に応じてssh-agentの設定(おそらくこれやらないとpermission error出ます)
$ eval `ssh-agent` 
$ ssh-add ~/.ssh/id_rsa
```


これで設定は終了！
いよいよデプロイ！


#7. capistranoからデプロイ!

引き続きローカル環境からgitでコマンドを打っていきます

```
$ git add .
$ git commit -m "deploy"
$ git git push origin master

```

おそらく、permissionなどで弾かれすると思いますが、鍵を設定したりすればすんなりpushできるかと思います。


githubにpushできたらcapコマンドでdeployしてみましょう

```
$ bundle exec cap production deploy:upload # database.ymlをアップロードする
$ bundle exec cap production deploy:check # deploy可能かのチェック
$ bundle exec cap production deploy
```

以上！！！

成功したら
ipアドレスにアクセスしてみてください。






# ハマったところとメモ



権限のあるファイルをvimで上書きしたい時には
:w !sudo tee %
とやると強制上書きしてくれます。


- serviceの綴りには注意
servise入力し続け3時間くらいハマってました


- 権限によってコマンドnot foundになる問題
 先頭にsudo -i をつけると良かったりする



- mysqlがcant connectする問題
[外部データベースサーバの追加時に "Host is not allowed to connect to this MySQL server" というエラーが発生](https://support.plesk.com/hc/ja/articles/213361969--%E5%A4%96%E9%83%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E8%BF%BD%E5%8A%A0%E6%99%82%E3%81%AB-Host-is-not-allowed-to-connect-to-this-MySQL-server-%E3%81%A8%E3%81%84%E3%81%86%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%99)

```
Host 'server IP address' is not allowed to connect to this MySQL server


mysql> GRANT all ON *.* TO root@123.45.678.000 IDENTIFIED BY 'パスワード';     
mysql> FLUSH PRIVILEGES;

これで治りました...
```

$ cap production deployの際に発生したエラー一覧

- rbenvのバージョン指定

```
リモートサーバーにてgem envで確認ご、rbenv_pathを指定することで解決した

この辺りを設定する必要あり
set :rbenv_type, :user  # rbenvをシステムにインストールした or ユーザーローカルにインストールした
set :rbenv_ruby, '2.5.1' # サーバで利用するrubyのバージョンを指定
set :rbenv_path, '/home/hogehuga/.rbenv'
set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec" # コピペで大丈夫ぽい

```


- githubのリポジトリを非公開にしていると、permission errorが発生する
-> 非公開の時にはsshではなくhttpで通信する

```
例) set :repo_url, "https://UserName:パスワード@github.com/UserName/deploy_app.git"
```

- ファイルの拡張子を間違えていた（参考記事を頼りすぎてしまい思考停止になっていんた）

```
/Capfile内の
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
によってtaskが走るが、hoge.capのファイル名を作成してしまっていた...

```

- unicornのパス設定 とlinked_dirの関連を理解していなかった

```
エラーログ
unicorn:start
      01 /home/user/.rbenv/bin/rbenv exec bundle exec unicorn -c /var/www/app/deploy_app/current/config/unicorn/production.rb -E deployment -D

    ✔ 01 user@123.4.43.5 6.596s
      unicorn restarting...
      02 kill -s USR2 `cat /var/www/app/deploy_app/shared/tmp/pids/unicorn.pid`
      02
      02 Usage:
      02  kill [options] <pid|name> [...]

tmp配下はユニコーン関連のファイルが存在するが、linked_dirに含まないとエラーが発生する
set :linked_dirs,  %w{bin log tmp/pids tmp/sockets tmp/cache vender/bundle } 
```

**他にも多くのエラーが出るかもですが、向き合うと勉強になるのでググりながら頑張ってください！
deploy時の頻発するpermission errorは**

```
SSHKit::Command::Failed: git exit status: 128
git stdout: Warning: Permanently added the RSA host key for IP address '192.30.255.112' to the list of known hosts.
Permission denied (publickey).
```

１. 鍵の設定(リモートとローカルの２箇所で設定する必要あり)
２. ssh-addしてない
３. ファイルの権限エラー (該当ディレクトリ、ファイルをchown chmodなどで操作してください)
４. リポジトリをプライベートにしている
５. ~/.ssh/configの設定ミス

あたりだと思います。



その他の参考リンク↓
[サーバー再構築の時などに古い鍵を削除したい](https://www.angelcurio.com/raspberrypi/?ssh%E3%81%AE%E3%83%9B%E3%82%B9%E3%83%88%E9%8D%B5%E3%82%92%E5%86%8D%E4%BD%9C%E6%88%90)
[ssh-agentについて](https://blog.wackwack.net/entry/2016/11/13/215529)
[ssh-addできない時](https://qiita.com/sshojiro/items/60982f06c1a0ba88c160)
[capistranoの使用法について](https://www.task-notes.com/entry/20170129/1485663801)
[デプロイ時 git-ls remoteでエラー出る場合](https://www.tabosque.com/tech/22)
[デプロイ後本番サーバーでコマンドを実行したい時](https://www.tmp1024.com/programming/rails-task-error-missing-listen)