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編]
ドットインストール - さくらVPS編

流れ

1. ConohaVPSを契約する
2. CentOSにRubyを入れる
3. Mysqlの設定
4. nginxの設定
5. unicornの設定
6. capistrano設定
7. capistranoからデプロイ!

それではどんどん書いていきます。

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

1. ConohaVPSを契約する

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

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


 # ssh [email protected] # 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 [email protected]
うまくいくはず

パスワードではなく鍵認証にする

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 [email protected]:~/.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 [email protected]
$ ssh -i [email protected] # 省略も可能。

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

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

$ sudo -s  #root権限を保持する
# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org # 念のためバックアップを取っておく

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

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

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

# service sshd restart

$ ssh -p 55555 [email protected]
でログインできれば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

2. rbenvインストール

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

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

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

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

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

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

5 rbenv読み込み設定

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

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

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

7. bundlerのインストール

# gem install bundle

8. 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 [email protected] 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をインストール
インストール参考

/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箇所を編集します

/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でよく使うコマンド

5. Capistranoとunicornの設定

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

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

まずはrailsのgemfileを編集

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コマンドにてアップロードをするので先にファイルを設定します。

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を変更

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となるように作成してください。

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に実施させたいタスクを定義できる
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 }

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

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://[email protected]/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環境の設定

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')], # リモートサーバー用秘密鍵があるところを指定 1で設定したid_rsaを指定すること
  forward_agent: true,
  auth_methods: %w(publickey)
}

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

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 %
とやると強制上書きしてくれます。

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


mysql> GRANT all ON *.* TO [email protected] 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 [email protected] 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).

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

あたりだと思います。

その他の参考リンク↓
サーバー再構築の時などに古い鍵を削除したい
ssh-agentについて
ssh-addできない時
capistranoの使用法について
デプロイ時 git-ls remoteでエラー出る場合
デプロイ後本番サーバーでコマンドを実行したい時