[Progate卒業生向け]VagrantでRails開発環境を構築するための完全マニュアル

railsアイキャッチ画像Ruby on Rails

どうも、エンジニアブロガーのYutaです。今回はVagrantでRuby on Rails(以下rails)の開発環境を整える方法についてレクチャーします。

この記事の通りに設定してもらえれば、仮想環境でrailsを動かすことができるので、エンジニアやってる感が出せると思います(笑)

また、設定するに当たって、Linuxコマンドやbashにも触れるのでインフラ周りについて知りたくなるきっかけになるかもしれませんね。

もし、記事の中でわかりにくいところがあったり、別途解説して欲しい箇所があったら、問い合わせページやコメントで知らせてもらえたら嬉しいです。

それでは、早速やっていきましょう。

この記事の対象者

  • ProgateのRailsコースを一通りやりきった人
  • Vagrantでrailsの環境を構築してみたい人
  • cloud9の重さにイライラしている人

Vagrantを立ち上げるまでに必要な手順

まずは、以下のvagrant公式サイトでOSに沿ったvagrantファイルをダウンロードします。

Install | Vagrant | HashiCorp Developer
Explore Vagrant product documentation, tutorials, and examples.

続いて、virtualBox公式サイトでvirturalBoxをダウンロードしましょう。

Downloads – Oracle VM VirtualBox

ダウンロードが完了したら、任意の階層でディレクトリを作成します。

mkdir xyz #mkdirは新規ディレクトリを作るためのLinuxコマンド
cd xyz # cdは引数に指定したディレクトリに移動するLinuxコマンド

以下コマンドでvagrantを初期化してください。vagrant initコマンドを実行することで、VagrantFileを読み込み、仮想環境を構築するための準備を行うことになります。

vagrant init

vagrant upで仮想マシンのセットアップが開始されます。環境にもよりますが、初回はだいたい早くて15分くらいかかります。

完了したら、以下のコマンドでsshへvagrantの設定に関する内容を書き込みましょう。

vagrant ssh-config >> ~/.ssh/config

# 吐き出される内容
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/ushijima_yuta/rails_projects/myapp/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

ssh default #sshのHostをデフォルトにする

ここまでの環境構築が完了したら、vagrant sshとコマンドを叩けば、インストールした仮想環境のCentOSに接続することができます。

Rails環境を構築するためのセットアップ

現在の仮想環境は、Railsを動かすために必要なツールやプログラムが何も入っていない状態です。

そのため、CentOSの場合はyumと呼ばれるパッケージマネージャーを使ってそれぞれのプログラムをインストールしていくことになります。

基本的にはこれから記述するコマンドをターミナルへコピペしてもらえれば動きますが、最新版ではない可能性があるのでそこは注意してください。

$ sudo yum update
$ sudo yum install git make gcc-c++ patch openssl-devel libyaml-devel libffi-devel libicu-devel libxml2 libxslt libxml2-devel libxslt-devel zlib-devel readline-devel ImageMagick ImageMagick-devel epel-release

# node.jsをダウンロード
$ sudo yum install nodejs npm --enablerepo=epel

# rbenvをダウンロード
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
$ rbenv --version
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install 2.4.1
$ rbenv global 2.4.1 # rbenv globalとすることで、システム全体でのバージョンを2.4.1にします。
$ rbenv rehash

## Rails + Bundler
$ gem install --no-ri --no-rdoc rails
$ gem install bundler

RailsでDBを使用するための設定

RailsでAcitveRecordを使うためには、RDBS(リレーショナル・データベース・システム)と連携させる必要があります。

ここでは、Railsでよく使われているRDBSであるPostgreSQL(ポスグレエスキューエル)とMySQL(マイエスキューエル)の設定方法を取り上げます。

PostgreSQLをDBに使用している場合

# 諸々のパッケージをダウンロード
sudo yum -y install http://yum.postgresql.org/9.5/redhat/rhel-7-x86_64/pgdg-redhat95-9.5-2.noarch.rpm
sudo yum -y install postgresql-devel postgresql95-server postgresql95-contrib
sudo /usr/pgsql-9.5/bin/postgresql95-setup initdb
sudo systemctl start postgresql-9.5.service
sudo systemctl enable postgresql-9.5.service

# postgresの初期設定
$ sudo passwd postgres
Changing password for user postgres.
New password:  #パスワードを適当に設定する
Retype new password:

$ su - postgres
$ createuser vagrant -s
$ psql
postgres=# \password vagrant # vagrantユーザにパスワードを設定
Enter new password: #パスワードを適当に設定する
Enter it again: 
postgres=# \q # psqlプロンプト終了
$ exit

$ sudo vi /var/lib/pgsql/9.5/data/pg_hba.conf

# "local" is for Unix domain socket connections only
# local   all             all                                     peer
  local   all             all                                     md5

$ sudo systemctl restart postgresql-9.5.service

# database.ymlを編集し、defaultにusernameとpasswordを設定
default:
  ...
  username: vagrant
  password: # 先ほど設定したパスワード

MySQLをDBに使用する場合

# デフォルトでインストールされているmariaDBを削除
$ sudo yum remove mariadb-libs

# MySQLパッケージのダウンロード
$ sudo yum localinstall https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

# MySQL本体のダウンロード
$ sudo yum install mysql-community-server

# 正しくダウンロードされているか確認
$ mysqld —version

# MySQLの起動
$ sudo systemctl start mysqld.service

# MySQLが自動的に起動するように設定
$ sudo systemctl enable  mysqld.service

# 起動した際に自動設定される初期パスワードを表示
cat /var/log/mysqld.log | grep password
2018-04-28T13:03:14.377383Z 1 [Note] A temporary password is generated for root@localhost: kbsteX,5asV_

# 初期パスワードを変更するため、先ほどの初期パスワード(上記の場合はkbsteX,5asV_)を入力
$ mysql_secure_installation

# 新規のパスワードを入力(ただし、パスワードが最低1つの数値文字を含み、1つの小文字および大文字を含み、1 つの特殊文字 (英数字以外) を含むこと)
# 例:Yamada_taro1234
The existing password for the user account root has expired. Please set a new password.
New password: 例に挙げたようなパスワードを入力
Re-enter new password: パスワードを再入力

The 'validate_password' plugin is installed on the server.
The subsequent steps will run with the existing configuration
of the plugin.
Using existing password for root.

Estimated strength of the password: 100

# rootパスワードを変更するかどうか(yをタイプするとrootパスワードを変更できます)
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password:

Re-enter new password:

Estimated strength of the password: 100

# パスワードがある場合のみ設定を続けるかどうか
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

# 匿名のユーザーを削除するかどうか
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.
# For advice on how to change settings please see


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

# リモートホスト(他の端末)からのrootログインを禁止するかどうか
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

# デフォルトで作成されているテスト用データベースを削除するかどうか
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.


Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

# ユーザー権限が保存されているテーブルを今すぐ再読み込みするかどうか
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

$ sudo vi /etc/my.cnf
/etc/my.confの末尾に以下を記述します。

#文字コードの設定を追加
character_set_server=utf8
skip-character-set-client-handshake

# 設定を反映させるためにMySQLを再起動します
$ sudo systemctl restart mysqld.service

# railsでMySQLを使うためのパッケージをインストールします 
$ sudo yum install mysql-devel

# database.ymlを編集し、defaultにusernameとpasswordを設定
default:
  ...
  username: root
  password: # 先ほど設定したパスワード
  socket: /var/lib/mysql/mysql.sock # ターミナルで mysql_config —socketとコマンドを叩いて表示されたパスを記述

vagrant上でアプリケーションサーバーを立ち上げ、ブラウザで確認するための設定

Vagrantfileを設定する

仮想環境で立ち上げたアプリケーションサーバーをローカルのブラウザで表示させるための設定を行います。

vagrantfileがあるディレクトリに移動して、好きなエディタで編集しましょう。
ここでは、Vimを使って編集しています。

$ vim Vagrantfile

設定するのはvagrantfileの28~35行目あたり。vimで行番号が表示されていない場合は、set numberで表示可能です。

~
# vagrantfile
28   # Create a forwarded port mapping which allows access to a specific port
29   # within the machine from a port on the host machine and only allow access
30   # via 127.0.0.1 to disable public access
31   config.vm.network "forwarded_port", guest: 3000, host: 3000, host_ip: "127.0.0.1"
32
33   # Create a private network, which allows host-only access to the machine
34   # using a specific IP.
35   config.vm.network "private_network", ip: "192.168.33.10"
~~

設定が完了したらファイルを保存(vimならwqで保存可能)し、以下のコマンドでサーバーを立ち上げます。

bin/rails s -b 0.0.0.0

ブラウザに、http://0.0.0.0:3000/と打ち込んで、任意のページが表示されればOKです。

エラーが出た場合は、大概はうまくDBと接続できていないことが多いので、設定を再確認しましょう。

vagrantでgitを使いやすくするbashrcの設定

ここからは個人的に開発するためにターミナルを使いやすくするための設定を行います。

別にここの項目を設定しないからと言って、特に開発に支障が出ることはありませんが、やっておくとより開発がしやすくなると思いますよ。

Bash_profileとbashrcについての違いが知りたい方は、以下のサイトが参考にしてみてください。

bashが起動時に実行するファイル
「事件は枯れたシステムが稼働する現場で起こってるんだ」と現場ですぐに役立つ知識を欲するあなたに贈る珠玉のTips集。今回は、いつの間にか作成されている「.bashrc」や「.bash_profile」というファイルの正体について解説する。
.bash_profileと.bashrcの違いが覚えられないあなたへの処方箋 · DQNEO日記
なぜ、「.bash_profileと.bashrcの違い」をすぐ忘れてしまうのか? ずばり、 「どっちに書いても、実用上は対して変わらない」 からでしょう。 ちょこっと環境変数を定義する程度なら、どっちに書いても動くのです。 どっちに書いてもそれなりに動く → 違いがわからない → 忘れる これが魔の忘却ループです。 ...
.bash_profile ? .bashrc ? いろいろあるけどこいつらなにもの? - Qiita
##正体ログインシェル(PCを起動したときにデフォルトに指定されるシェル)をbashにしている場合はログイン(起動)時に以下のような順番で設定ファイルが読み込まれ、PATHを通す、エイリアスを定義…

それではまず、開発するときにターミナル上で、現在のブランチ名を表示させる設定をしていきましょう。

この設定をすることで、誤ってmasterブランチにpushしてしまうような自己が未然に防げます。

git-promptをインストールする

$ sudo yum -y install wget # wgetコマンドをインストール
・
・ # ずらずらとインストールログが表示されます
・
Complete!

# git-completion.bashをインストール
$ wget https://raw.githubusercontent.com/git/git/v2.5.0/contrib/completion/git-completion.bash

# git-prompt.shをインストールする
$ wget https://raw.githubusercontent.com/git/git/v2.5.0/contrib/completion/git-prompt.sh

# bashrcで読み込ませるために隠しファイルにリネーム
$ mv git-completion.bash .git-completion.bash
$ mv git-prompt.sh .git-prompt.sh

ここまでできれば、必要なプログラムのインストールは完了。

続いてbashrcに以下の記述をしましょう。

$ vim ~/.bashrc

# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# Source git completion
if [ -f ~/.git-completion.bash ]; then
    . ~/.git-completion.bash
fi

# 現在のブランチ名を表示する設定
if [ -f ~/.git-prompt.sh ]; then
    # リポジトリの状態によって表示が変わる設定を有効にする
    GIT_PS1_SHOWDIRTYSTATE=1
    . ~/.git-prompt.sh
    PS1='\[\e[32m\][\u@\h \W]\e[m $(__git_ps1 "\e[36;1m\](\[\e[36;1m\]%s)")\[\e[0m\]\] \$ '
fi

# gitコマンドのエイリアス

# alias:git
alias g="git "
alias gs="git status "
alias ga="git add "
alias grb="git rebase "
alias gcm="git commit "
alias gb="git branch "
alias gbr="git branch -r "
alias gbg="git branch |grep "
alias gbrg="git branch -r |gpep "
alias gco="git checkout "
alias gcow="git checkout working "
alias gcod="git checkout development "
alias gcom="git checkout master "
alias gd="git diff "
alias gds="git diff --staged "
alias gpush="git push origin HEAD "
alias gpull="git pull origin HEAD "

alias gsh="git show "
alias gl="git log "
alias gpl="git pull "
alias gfpu="git push -f "
alias gpu="git push "

設定が完了したら、ファイルを保存してbashrcを以下のコマンドで再読み込みします。

$ source ~/.bashrc

そうすると、ターミナルで以下のような表示がされているはずです。

[vagrant@localhost baukis_study] (feature/routes)

これで現在自分がどのブランチで開発しているか一発でわかるようになりましたね!

あとはgit cloneでリモートのリポジトリからクローンしてもいいし、rails newで新しくプロジェクトを立ち上げてもいいですね。

参考サイト

Vagrantに CentOS7 + Rails + MySQLの 環境を構築 - Qiita
VagrantとVirtualBoxはインストール済み仮想環境にCentOS7をインストールするところから始めて、Railsプロジェクトの作成、MySQLデータベースの作成までを行いました#主に…
mysql5.7でパスワードを変更する - Qiita
環境CentOS7.1 (Vagrant)MySQL 5.7.13インストールはこっち問題MySQLをインストールして、$ mysql -uroot -proot で入ろうとしたら以下のエ…
Railsのバージョンを指定してinstallする方法 - Qiita
チュートリアルを試す為にRailsのバージョン落とす必要があった。忘れそうなので方法をメモしておく。環境・rbenvでrubyを管理している・rubyはruby 2.3.1を使用しているr…
http://j-caw.co.jp/blog/?p=901
database.yml 等の Git管理 - Qiita
Railsプロジェクトを作成し、Git等のバージョン管理システムを使用してプロジェクトをそのまま git add、git commitしてしまい公開してしまうことがある。しかし、セキュリティ上思わし…
BashのプロンプトにGitのブランチ名を含める。 - Qiita
はじめに目下、以下の書籍独習Git (翔泳社 2016/2/26初版)を使ってGitを学習しておりまして、この本の第9章「9.6 さらなる探求」で、首題のようにシェルプロンプトにブランチ名を…