サーバー構築から Nginx + Unicorn でRails アプリケーションを立ち上げる

初めてサーバー構築からRails アプリケーションのデプロイまでを経験しました。
また同じ様な作業をする時の為の備忘録として作業内容を纏めます。

新規でRailsプロジェクト作成

rails _7.0.2.3_ new project_name -d mysql -B
gem install rails -v 7.0.2.3

database.ymlで開発環境のpasswordを設定します。設定しないままDBを作成しようとすると以下のエラーが発生します。

Access denied for user ‘root’@’localhost’ (using password: NO)

設定した後にDBを作成

rake db:create

立ち上げてみる。

bundle exec puma -b tcp://192.168.194.101:300

以下の画面が確認出来たら新規Railsアプリの立ち上げ成功です。

余談:Rails7はWelcomeページが変わってた。

今回は、新規でRailsプロジェクト作成・RailsのWelcomeページを開発環境で確認出来たら、すぐに本番環境でも見えるようにサーバー構築の作業をしました。

サーバー購入 ~ git clone まで

さくらでサーバーを購入しました。スペックはこんな感じ。

サーバープラン
仮想コア:2 / メモリ:2GB
ディスク
アーカイブ選択:centos の最新版

ディスクの修正
管理ユーザーパス:pass
ホスト名:project_name
スタートアップスクリプト:shell

サーバーの情報
名前:project_name
説明:project_name

ssh root ログインしてユーザーを作成します。

ssh root@IP_address
# rootでログイン成功
useradd user_name
su user_name

公開鍵認証の設定をしていきます。

# 鍵をローカルで作る。
cd .ssh/
mkdir project_name
cd project_name
# パスフレーズは面倒なので未入力。本当はあった方がいいと思う。
ssh-keygen -t rsa -b 4096

# 公開鍵をリモートサーバーへ転送して登録
ssh-copy-id -i ~/.ssh/project_name/id_rsa.pub user_name@IP_address

# ssh ユーザーログイン
ssh -i ~/.ssh/project_name/id_rsa user_name@IP_address

ssh_configに以下の設定を追加しておきます。

Host project_name
  HostName IP
  User user
  IdentityFile ~/.ssh/project_name/id_rsa

補足:ssh公開鍵認証で接続が出来ない場合

以下のサイトで原因を一つ一つ潰していきました。

[Linux]公開鍵認証でSSHログインできない時に確認する項目
目次 1. サーバーに SSH ログインできない原因を調査する1.1. SSH のサービスが起動していること1.2. 公開鍵が正しく設定されていること1.3. 公開鍵認証が有効であること1.4. パーミッションが正しく設定されていること1.

自分の場合は、リモート側のパーミッションの設定が原因でした。

ssh接続は、以下のような厳格なパーミッションを設定することを求められる様です。

・「/home/(ユーザー名)/」のフォルダのパーミッションが「755」より厳しいこと

・「/home/(ユーザー名)/.ssh」のフォルダのパーミッションが「700」であること

・「/home/(ユーザー名)/.ssh/authorized_keys」のファイルのパーミッションが「600」であること

https://www.t3a.jp/blog/infrastructure/not-ssh-login/

Railsプロジェクトをgitで管理・リモートリポジトリにpush

先ほど作成したRailsプロジェクトをgitで管理出来るようにしておきます。

Bitbucket・Sourcetreeを使ったやり方は以下の記事を参照して下さい。

Bitbucketでリモートリポジトリを作ってプッシュする方法
今回は、Bitbucketにリモートリポジトリを作ってみます。 私は普段リモートリポジトリとしてGithubを使用しているのですが、今勉強中のWebアプリ開発の書籍(動かして学ぶ!Python Django開発入門)でBitbucketが使

リモートリポジトリを購入したサーバーにcloneする

先ほど作成したRailsプロジェクトを開発環境からBitbucketへpushした後に、購入したサーバーからBitbucketにあるリモートリポジトリを取得できるようにします。

bitbucketの秘密鍵をローカルからコピー

scp ~/.ssh/bitbucket/id_rsa root@IP:~/.ssh/
chmod 700 .ssh

リモートリポジトリから取得

git clone git@bitbucket.org:organization/projext_name.git

メモ:git コマンドのTipsだけ置いておきます。

# 最初のコミットを取り消す
git update-ref -d HEAD

# 特定のファイルをgitの追跡対象から除外する設定をするファイル.gitignore
/vendor/bundle/

最初の内にごちゃごちゃ修正してコンフリクト起きて変になっちゃったら、これで解決しちゃいましょう。

# リモートの最新を取得する
git fetch origin master
# リモートの変更に強制的に合わせる
git reset --hard origin/master

必要なツールのinstall

# 色々install。Rubyのビルドに必要なライブラリなど
yum -y update && yum install -y git gcc gcc-c++ openssl-devel readline-devel zlib-devel wget vim

# nginx のインストール・再起動の設定・起動
yum -y install nginx && chkconfig nginx on && systemctl start nginx

# firewall ポートを開ける
firewall-cmd --permanent --zone public --add-service http && firewall-cmd --permanent --zone public --add-service https && systemctl restart firewalld && systemctl restart nginx

# anyenvのinstall(rbenv・nodenv installの為に必要)
git clone https://github.com/riywo/anyenv ~/.anyenv
echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> .bashrc
echo 'eval "$(anyenv init -)"' >> .bashrc
source .bash_profile
anyenv install --init
anyenv -v

# anyenvでrbenv・rubyをインストール 10分くらいかかる
anyenv install rbenv
exec $SHELL -l
rbenv install 3.1.1
rbenv global 3.1.1
ruby -v

# anyenvでnodenv・node.jsをインストール
anyenv install nodenv
exec $SHELL -l
nodenv install
nodenv global 

# anyenvでインストールしたrbenvでbundlerをinstallしたときにパスでハマった
rbenv exec gem install bundler -v 2.1.4
bundle -v
# gem がローカルインストールされるように設定
bundle config
bundle config --local path vendor/bundle
bundle
bmf-tech.com - anyenvでインストールしたrbenvでbundlerをinstallしたときにパスでハマった
概要 anyenvでインストールしたrbenvでbundlerをinstallしたときにパスでハマった話。 ハマったことanyenvでrbenvをインストールしてrubyを使っているのですが、bundlerをインストールする際に、 gem install bundler と何も考えずに打つと、bundlerが/usr/...

/code