質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
unicorn

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

Capistrano

Rubyで書かれたサーバオーケストレーションで、複数のサーバでスクリプトを実行する際に用いられます。主な使用用途はWebアプリケーションのデプロイメントです。 アプリケーションのバージョンアップ自動化、およびデータベースの変更などもできます。

Q&A

解決済

1回答

6436閲覧

Capistrano自動デプロイ時のPermission denied (publickey).

Shika_Tech

総合スコア13

unicorn

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Amazon EC2

Amazon EC2は“Amazon Elastic Compute Cloud”の略称です。Amazon Web Services(AWS)の一部であり、仮想化されたWebサーバーのコンピュータリソースをレンタルできるサービスです。

Capistrano

Rubyで書かれたサーバオーケストレーションで、複数のサーバでスクリプトを実行する際に用いられます。主な使用用途はWebアプリケーションのデプロイメントです。 アプリケーションのバージョンアップ自動化、およびデータベースの変更などもできます。

0グッド

2クリップ

投稿2020/02/13 12:32

編集2020/02/13 12:43

環境

ruby 2.5.1
rails 5.0.7
capistrano 3.11.2
capistrano 5.5.1

実現したいこと

現在ポートフォリオを作成中で、
以下の記事を参考にデプロイまで辿りつきました。
リンク内容

さらにAWSのACM,Route53,ALBを用いて、ドメイン名にHTTPSでアクセスできるまでは実装できたのですが、
そこからcapistranoによる自動デプロイを
こちらの記事
リンク内容
を参考に試してみましたがエラーが起きどうしても前に進みません。

エラー

#bundle exec cap production deploy実行後↓ Caused by: SSHKit::Command::Failed: git exit status: 128 git stdout: Nothing written git stderr: Permission denied (publickey). fatal: Could not read from remote repository.
INFO [8540a485] Finished in 0.252 seconds with exit status 0 (successful). INFO [8ccb5677] Running /usr/bin/env git ls-remote git@github.com:ユーザー名/リポジトリ名.git HEAD as ユーザー名@IP DEBUG [8ccb5677] Command: ( export RBENV_ROOT="$HOME/.rbenv" RBENV_VERSION="2.5.1" GIT_ASKPASS="/bin/echo" GIT_SSH="/tmp/git-ssh-ファイル名-production-ホームディレクトリ.sh" ; /usr/bin/env git ls-remote git@github.com:gitのユーザー名/ファイル名.git HEAD ) DEBUG [8ccb5677] Permission denied (publickey). DEBUG [8ccb5677] fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.

コード

ruby

1#capfile 2require 'capistrano/setup' 3require 'capistrano/deploy' 4require 'capistrano/rbenv' 5require 'capistrano/bundler' 6require 'capistrano/rails/assets' 7require 'capistrano/rails/migrations' 8 9Dir.glob('lib/capistrano/tasks/*.rb').each { |r| import r }
#config/deploy.rb lock '3.11.2' set :application, 'ファイル名' set :repo_url, 'git@github.com:のユーザー名/ファイル名.git' set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads') set :linked_files, fetch(:linked_files, []).push('config/settings.yml') set :deploy_to, '/var/www/projects/ファイル名' set :rbenv_type, :user set :rbenv_ruby, '2.5.1' set :log_level, :debug set :ssh_options, auth_methods: ['publickey'], keys: ['~/.ssh/key.pem'] set :linked_files, %w{ config/secrets.yml } set :keep_releases, 5 namespace :deploy do desc 'Restart application' task :restart do invoke 'unicorn:restart' end desc 'Create database' task :db_create do on roles(:db) do |host| with rails_env: fetch(:rails_env) do within current_path do execute :bundle, :exec, :rake, 'db:create' end end end end desc 'Run seed' task :seed do on roles(:app) do with rails_env: fetch(:rails_env) do within current_path do execute :bundle, :exec, :rake, 'db:seed' end end end end after :publishing, :restart after :restart, :clear_cache do on roles(:web), in: :groups, limit: 3, wait: 10 do end end end

ruby

1#config/deproy/production.rb 2server 'IP', user: 'user名', roles: %w{app db web}

ruby

1#config/unicorn/production.rb 2$worker = 2 3$timeout = 30 4$app_dir = "/var/www/projects/ファイル名/current" 5$listen = File.expand_path 'tmp/sockets/.unicorn.sock', $app_dir 6$pid = File.expand_path 'tmp/pids/unicorn.pid', $app_dir 7$std_log = File.expand_path 'log/unicorn.log', $app_dir 8 9 10worker_processes $worker 11working_directory $app_dir 12stderr_path $std_log 13stdout_path $std_log 14timeout $timeout 15listen $listen 16pid $pid 17 18preload_app true 19 20 21before_fork do |server, worker| 22 defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! 23 old_pid = "#{server.config[:pid]}.oldbin" 24 if old_pid != server.pid 25 begin 26 Process.kill "QUIT", File.read(old_pid).to_i 27 rescue Errno::ENOENT, Errno::ESRCH 28 end 29 end 30end 31 32 33after_fork do |server, worker| 34 defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection 35end

ruby

1#lib/capistrano/tasks/unicorn.rb 2 3#unicornのpidファイル、設定ファイルのディレクトリを指定 4namespace :unicorn do 5 task :environment do 6 set :unicorn_pid, "#{current_path}/tmp/pids/unicorn.pid" 7 set :unicorn_config, "#{current_path}/config/unicorn/production.rb" 8 end 9 10#unicornをスタートさせるメソッド 11 def start_unicorn 12 within current_path do 13 execute :bundle, :exec, :unicorn, "-c #{fetch(:unicorn_config)} -E #{fetch(:rails_env)} -D" 14 end 15 end 16 17#unicornを停止させるメソッド 18 def stop_unicorn 19 execute :kill, "-s QUIT $(< #{fetch(:unicorn_pid)})" 20 end 21 22#unicornを再起動するメソッド 23 def reload_unicorn 24 execute :kill, "-s USR2 $(< #{fetch(:unicorn_pid)})" 25 end 26 27#unicronを強制終了するメソッド 28 def force_stop_unicorn 29 execute :kill, "$(< #{fetch(:unicorn_pid)})" 30 end 31 32#unicornをスタートさせるtask 33 desc "Start unicorn server" 34 task start: :environment do 35 on roles(:app) do 36 start_unicorn 37 end 38 end 39 40#unicornを停止させるtask 41 desc "Stop unicorn server gracefully" 42 task stop: :environment do 43 on roles(:app) do 44 stop_unicorn 45 end 46 end 47 48#既にunicornが起動している場合再起動を、まだの場合起動を行うtask 49 desc "Restart unicorn server gracefully" 50 task restart: :environment do 51 on roles(:app) do 52 if test("[ -f #{fetch(:unicorn_pid)} ]") 53 reload_unicorn 54 else 55 start_unicorn 56 end 57 end 58 end 59 60#unicornを強制終了させるtask 61 desc "Stop unicorn server immediately" 62 task force_stop: :environment do 63 on roles(:app) do 64 force_stop_unicorn 65 end 66 end 67end

以上です。
エラー内容などで検索すると
https://qiita.com/ryic/items/24b3abc36f5697c945b2
にあるように

ruby

1ssh-add ~/.ssh/key

このコマンドで解決するという記事がいくつかヒットするのですが、よく理解できておりません。
どなたかお分かりになる方いらっしゃればぜひ教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Capistranoでデプロイする仕組みは、ざっくりいうと以下のようになっています。

  1. デプロイもと(手元のPCやデプロイサーバー)からEC2にSSHで接続
  2. EC2からGitHubにアクセスしてソースコードを取得

今回は、2の段階でエラーが発生しています。
なぜ2でエラーが起こるかというと、おそらくEC2にはGitHubに接続できるSSHキーが無いからだと思います。
ですので、書いていただいたようなエラーメッセージが表示されていると考えられます。

git stderr: Permission denied (publickey). fatal: Could not read from remote repository.

これを解決するためには、EC2にGitHubにアクセスできるSSHキーを置く方法がありますが、この方法はGitHubに登録したSSHの秘密鍵をEC2に転送することになるので、セキュリティ的におすすめできません。

ではどうするかというと、mattoさんも調べていただいた、ssh-add ~/.ssh/keyを使います。
これはSSHのエージェント転送という機能で、ssh-addを実行した環境にあるSSHキーを、SSHの接続先(今の例ですとEC2)で使用するようにする・引き継ぐやり方です。
この機能を使うと、手元のPCにあるGitHubに登録済みのSSHキーを使って、EC2でもGitHubのソースコードを取得できます。

やることは2つです。
まず、CapistranoでSSHのエージェント転送機能を使えるようにします。

rb

1#config/deploy.rb 2set :ssh_options, auth_methods: ['publickey'], 3 keys: ['~/.ssh/key_book_cafe_review_app.pem'], 4 forward_agent: true # この行を追加しました。 5

次に、デプロイもとのサーバーでsshエージェントを起動して、GitHubのデプロイキーを登録します。

sh

1eval `ssh-agent` 2ssh-add ~/.ssh/github_rsa # GitHubのデプロイキーのパスを指定してください 3ssh-add -l # 鍵が登録されていることを確認

この設定をしてからCapistranoでデプロイするとうまくいくと思うですが、いかがでしょうか。

こちらに参考になりそうなサイトのリンクを記載します。

投稿2020/02/13 13:06

編集2020/02/13 22:59
shgtkshruch

総合スコア665

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shika_Tech

2020/02/13 15:54

コメントありがとうございます!どちらも実行してみたのですが、相変わらず同じエラーが出てしまいます。 サーバーからはssh -T git@github.comで接続できるのですが...
shgtkshruch

2020/02/13 16:25 編集

サーバーからはsshでGitHubに接続できるんですね。 基本的なことで1点確認したいんですが、config/deploy.rbに設定している`repo_url`はあってますよね? それが適切であれば、GitHub のデプロイキーに~/.ssh/key_book_cafe_review_app.pemを設定して、それをssh-addで追加してデプロイできないでしょうか? また、ssh-add する前に eval `ssh-agent`などでssh-agentが起動していることも確認していただきたいです。 https://qiita.com/Yarimizu14/items/6a4bab703d67ea766ddc こちらの記事も同じような設定をされているので、参考になると思います。 https://qiita.com/Takkiii/items/c4f2cfd143e97e061e66
Shika_Tech

2020/02/13 17:20 編集

はい、urlは合っています。 リンクを頂いた記事を試してみたのですが、変わらずエラーが出ました。 質問なのですが、deploy/prodocution.rbにrsa鍵のset :ssh_optionsを追記するという記事をいくつか見つけました。しかしこちらも上手く行きませんでした。、pem鍵の方はサーバーにアクセスする鍵だと思うので、rsa鍵の記述がおかしいのではと思ったのですが、そのあたりがよくわからない状態でして。 自分のPC上に置いているpemはec2にアクセスする鍵、 サーバー上に置いてるrsaはgitにアクセスする鍵、 という認識で間違いないでしょうか。
shgtkshruch

2020/02/13 22:53

mattoさんの既存のコードを生かしてシンプルに解決するという観点では、以下の方法があります。 デプロイ元でssh-addを使う場合は、サーバー上においてあるGitHubにアクセスするための鍵(rsa)は不要になります。 その代わり、EC2にアクセスする際に使う公開鍵をGitHubのデプロイキーに登録します。 この方法でやると、EC2のアクセスとGitHubからのソースコードの取得がこの鍵のみで行なえます。 もう一つは、EC2上で新しくSSH鍵を作成して、それをGitHubのデプロイキーに登録する方法があります。 この場合は、EC2の~./ssh/configにGitHubへのSSH接続の設定を書くと接続できると思います。 https://www.codeofduty.me/2018/01/31/railsapp-aws-deploy/#GitHub%E3%81%A8%E9%80%A3%E6%90%BA%E3%81%99%E3%82%8B
Shika_Tech

2020/02/14 01:37 編集

私がもともとデプロイしたやり方は後者のほうでした。ec2上でrsaとrsa.pubが生成されてadd-sshを行いパスワードを聞かれずgithubにアクセスできていたましたが、自動デプロイコマンドではエラーが出てしまいました。 前者の方にある 「EC2にアクセスする際に使う公開鍵をgithubのデプロイキーに登録」 とはkey_book_cafe_review_app.pemをgithubサイトのセッティングで登録するという事でしょうか?
Shika_Tech

2020/02/14 17:36

shgtkshruchさんのおっしゃる方法でローカルにec2用とgit用の鍵を二つ生成し、ssh-addする事でエラーを回避することができました。この度はアドバイスいただきありがとうございました!
shgtkshruch

2020/02/15 02:50

コメント遅くなりました。 あまりうまくアドバイスできなかったかもですが、解決できてよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問