0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CapistranoでRailsをVPSにデプロイするとき詰まった点

Last updated at Posted at 2023-06-17

この記事について

この記事はインフラ初心者がWebページをVPS上で公開したい!って思ってやったことを備忘録として書き残したものです。素人が書いているため情報の信憑性は保証しません。詳細は各自で調べながらやることをおすすめします。記事のとおりにやっておかしなことになっても責任は取れませんのでご了承ください。

Capistranoの設定

基本的にこのサイトの説明がとても分かりやすかったのでこれに従って進めていきます。この記事では詰まった点をいくつか書いていきます。
https://pikawaka.com/rails/capistrano

詰まった点1 データベース

私は普段postgresqlを使って開発を行っているため、VPS上でpostgresqlの設定をしなくてはなりませんでした。
インストールについては公式ページに書いてあるコマンドで
https://www.postgresql.org/download/linux/ubuntu/

自分のアカウントのロールがないため、ロールを作成します。このサイトに従って自分のアカウントのロールを作成。
https://qiita.com/sibakenY/items/407b721ad1bd0975bd00

su postgres
psql
CREATE ROLE rolename LOGIN CREATEDB CREATEROLE PASSWORD 'password';

時系列的には後の話になるのですが、gem 'pg'インストールしようとするとUnable to find PostgreSQL client library.と怒られ、

Please install libpq or postgresql client package like so:
      01   sudo apt install libpq-dev
      01   sudo yum install postgresql-devel
      01   sudo zypper in postgresql-devel
      01   sudo pacman -S postgresql-libs

と言われたので言われたとおりやります。

% sudo apt install libpq-dev

詰まった点2 SSH接続

bundle exec cap production deployを実行するとfingerprint xxxxxx does not match for xxx.xx.xxx.xxxというエラーが出ました。known_hostsの中に接続先のものが登録されていないとか?

このサイトに従ってdeploy.rbを修正したら通りました。
https://www.appsloveworld.com/ruby/100/9/capistrano-error-netsshhostkeymismatch

詰まった点3 rubyのインストール

これに関しては詰まったというほどのことではないですが、VPSにrubyをインストールしておきましょう、と。
普段どおりrbenvからrubyをインストールします。

っと思いきやsudo apt install rbenvでインストールすると最新のバージョンがインストールできない様子だった。

% rbenv install 3.1.2
ruby-build: definition not found: 3.1.2

See all available versions with `rbenv install --list'.

If the version you need is missing, try upgrading ruby-build.

というわけでこの記事に書いてあるようにgit cloneする形でrbenvをインストールします。

git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'eval "$(~/.rbenv/bin/rbenv init - zsh)"' >> ~/.zshrc # zshの場合

すると今度はrbenv installができない、と。

% rbenv install -l
rbenv: no such command `install'

公式に書いてあるとおりにしてみるとできるようになった。(スペックが低いせいかやたらインストールに時間がかかった)

git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build

詰まった点4 Permission Denied

/var/wwwへの書き込み権限がないとかで怒られました。

mkdir:
cannot create directory ‘/var/www/rails_template’
: Permission denied

この記事に従ってディレクトリの所有者を変えます。

sudo chown -R username:username /var/www/

詰まった点5 not a valid object name: master

デフォルトブランチをmasterではなくmainにしてるせいと思われる。

Caused by:
SSHKit::Command::Failed: git exit status: 2
git stdout: Nothing written
git stderr: fatal: not a valid object name: master
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors

Tasks: TOP => git:create_release
(See full trace by running task with --trace)
The deploy has failed with an error: Exception while executing as ansai@133.18.236.168: git exit status: 2
git stdout: Nothing written
git stderr: fatal: not a valid object name: master
tar: This does not look like a tar archive
tar: Exiting with failure status due to previous errors

この記事に従ってdeploy.rbを書き換えましょう。

config/deploy.rb
set :branch, "main"

詰まった点6 Missing 'secret_key_base'

こんなエラーが出た。

ArgumentError: Missing `secret_key_base` for 'production' environment, set this string with `bin/rails credentials:edit`

master.keyとかをちゃんと送れてないとかかな?
この記事を参考に修正。

ローカルでこれを実行

$ rake secret
1111111111222222222233333333...

サーバーで/var/www/app_name/shared/config/secrets.ymlを修正

/var/www/app_name/shared/config/secrets.yml
production:
    secret_key_base: 1111111111222222222233333333...

詰まった点7 環境変数の設定

capistrano-unicornを使うと環境変数が読み込まれないっぽい。unicornはsystemdを使って起動することにします。今回はとりあえず手動で起動します。
まずは/etc/environmentに環境変数を書きます。

HOGE=...
FUGA=...

deploy.rb・Capfileのunicornに関する記述を消し、Gemfileからcapistrano3-unicornを削除。
unicornは/var/www/rails_app/current

RAILS_ENV=production bundle exec unicorn -c config/unicorn.rb -E production -D

を実行すると起動します。
unicornを停止するにはこれを実行。↓

kill -QUIT `cat /var/www/rails_app/shared/tmp/pids/unicorn.pid`

詰まった点8 Postgresとの接続

postgresを使う場合はこの記事に従ってcapistrano-postgresqlを入れる必要がある。
また、/var/www/rails_app/shared/config/database.ymlconfig/database.ymlの内容をコピペする。その際productionの部分のusernamepasswordを自分のアカウントのユーザー名とパスワードに変えておく。
そんでデータベースを作成。

sudo su postgres
psql
create database rails_app_production with owner=account_name;

詰まった点9 bundler: failed to load command: unicorn

appのディレクトリが違ってた。これ以外にもプロセスIDのパスとか全部修正した。

# アプリケーションのディレクトリ
working_directory root_path

# プロセスIDの保存先を指定
pid "/var/www/rails_app/shared/tmp/pids/unicorn.pid"

# ポート番号を指定
listen '/var/www/rails_app/shared/tmp/sockets/unicorn.sock'

# エラーのログを記録するファイルを指定
stderr_path '/var/www/rails_app/shared/log/unicorn.stderr.log'

# 通常のログを記録するファイルを指定
stdout_path '/var/www/rails_app/shared/log/unicorn.stdout.log'

詰まった点10 Missing service adapter for "GCS"

gem 'google-cloud-storage'をGemfileに追加する
https://qiita.com/kyamad/items/7516ac4c69e18324ed3c

補足1

/etc/nginx/conf.d/*.confファイルがnginxの設定ファイルとして読み込まれるため、この記事に従ってserver_nameを自由に変えるとバーチャルホスティングができる。cloudflareを使っている場合はDNSの設定が必要。

補足2

githubレポジトリの中のサブディレクトリとしてRailsアプリを配置している場合はdeploy.rbに以下を追加する必要がある。
参考: https://stackoverflow.com/questions/41983153/how-do-i-get-the-path-for-the-release-being-deployed-in-capistrano-3

# ワーキングディレクトリをrails_appに移す
after "deploy:set_current_revision", "deploy:checkout_subdir"
namespace :deploy do
  desc "Checkout subdirectory and delete all the other stuff"
  task :checkout_subdir do
    subdir = "rails_app" # ここをサブディレクトリ名にする
    on roles(:app) do
      last_release = capture(:ls, "-xt", releases_path).split.first
      last_release_path = releases_path.join(last_release)
      execute "rm -rf /tmp/#{subdir} && mv #{last_release_path}/#{subdir}/ /tmp && rm -rf #{last_release_path}/* && mv /tmp/#{subdir}/* #{last_release_path}"
    end
  end
end

参考資料

【Rails】 Capistranoを使ってデプロイを自動化しよう
https://pikawaka.com/rails/capistrano

postgresqlの設定
https://qiita.com/sibakenY/items/407b721ad1bd0975bd00

[SOLVED]-CAPISTRANO ERROR - NET::SSH::HOSTKEYMISMATCH-RUBY
https://www.appsloveworld.com/ruby/100/9/capistrano-error-netsshhostkeymismatch

rvenv install -lで欲しいrubyバージョンが見つからない時
https://qiita.com/tomono-t/items/5e5df47097658eaff01b

Capistrano mkdir permission denied
https://stackoverflow.com/questions/24470520/capistrano-mkdir-permission-denied

Capistrano自動デプロイ時のエラー。"fatal: not a valid object name: master"の解消メモ
https://qiita.com/TO-TO/items/536ac203cfa082b8ac96

【Rails×Capistrano】自動デプロイしようとしたら「ArgumentError: Missing secret_key_base for ‘production’ environment, set this string with rails credentials:edit
https://naka-no-mura.hateblo.jp/entry/capistrano_missing_secret_key_base

Capistrano and environment variables
https://stackoverflow.com/questions/23672631/capistrano-and-environment-variables

capistrano-dotenv
https://jplethier.medium.com/capistrano-dotenv-68f107c91d7e

【Rails】本番環境構築で Missing service adapter for "GCS" と怒られる
https://qiita.com/kyamad/items/7516ac4c69e18324ed3c

【Nginx】バーチャルホストで複数のドメインを設定する
https://pro-broccoli.com/2021/08/14/virtualhost/

How do I get the path for the release being deployed in Capistrano 3?
https://stackoverflow.com/questions/41983153/how-do-i-get-the-path-for-the-release-being-deployed-in-capistrano-3

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?