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 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つを変更するために書き
換える。該当箇所探してください。
該当箇所探してください。
①ポート番号の変更
/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を入れる
- まずは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 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をインストール
インストール参考
/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箇所を編集します
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を編集
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コマンドにてアップロードをするので先にファイルを設定します。
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
みたいに表示されるのでこれをコピペして貼り付ける
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.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?を
config.public_file_server.enabled = true
に変更する
後もう少し!
unicornの設定ファイルを作成します
新規で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に実施させたいタスクを定義できる
# 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 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環境の設定
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ファイルを設定
ここはコピペでも大丈夫そう。
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" というエラーが発生
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).
1. 鍵の設定(リモートとローカルの2箇所で設定する必要あり)
2. ssh-addしてない
3. ファイルの権限エラー (該当ディレクトリ、ファイルをchown chmodなどで操作してください)
4. リポジトリをプライベートにしている
5. ~/.ssh/configの設定ミス
あたりだと思います。
その他の参考リンク↓
サーバー再構築の時などに古い鍵を削除したい
ssh-agentについて
ssh-addできない時
capistranoの使用法について
デプロイ時 git-ls remoteでエラー出る場合
デプロイ後本番サーバーでコマンドを実行したい時