Vagrant + VirtualBox + Ubuntu でRails環境構築

仮想環境でrails serverするまで。
WindowsでやっているのでMacでは多少挙動が違うかもしれません。
不足があるかもしれませんがご容赦を。

# 技術要件
 - Windows10


# 下準備
### Vagrant のインストール
公式サイト
http://www.vagrantup.com/
ここから、vagrantをダウンロードし、インストール。

### VirtualBox のインストール
公式サイト
https://www.virtualbox.org/
VirtualBox をダウンロードし、インストール。

# Vagrant sshをするまで  
## プロジェクトディレクトリの作成
ここではrails_testという名前で。

```
$ mkdir rails_test
$ cd rails_test
```
でディレクトリを作成し、その中へ移動。
  
## Ubuntuのダウンロード

Ubuntuの公式サイトよりダウンロード＆インストール。
https://www.ubuntu.com/download/desktop
  
```
$ vagrant box list
```
でUbuntuが入ってる場合は必要なし。

### vagrant init

```
$ vagrant init ubuntu16.04
```

```
A `Vagrantfile` has been placed in this directory.
```
と出る。 
  
## Vagrantfileの編集
### 確認&修正
以下のように、テキストエディタ(AtomやEmacsなど)で編集(コメントアウト部分は一部省略)。

```ruby

Vagrant.configure("2") do |config|
  
  config.vm.box = "bento/ubuntu-16.04" #こうなっていることを確認
  
  config.vm.network "forwarded_port", guest: 3000, host: 3000 #修正
  
  config.vm.network "private_network", ip: "192.168.33.10" #コメントアウト
  config.vm.synced_folder "./", "/vagrant", nfs: true #修正
  
end
```
  

## vagrant up
### vagrantを立ち上げる

```
$ vagrant up
```  

> Virtual Boxのバージョンが新しいと、この段階で動かない場合が見られる（5.2系）。
5.1.22では動作確認済。なので、Virtual Boxをインストールするときは、バージョンに気をつけて！
  
もしパスワードを聞かれたら、sudoのパスワードを入力。
終わったら、

```
$ vagrant ssh
```
でログインできるはず…！

  
# vagrant sshが終わったら
## 基本ライブラリのインストール

```
$ sudo apt-get update
$ sudo apt-get install -y libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
$ sudo apt-get -y install git curl g++ make  #gitのインストール
$ sudo apt-get -y install sqlite3 libsqlite3-dev nodejs
```
  
## rbenv の Install
ちょっと時間がかかりますが、気長に待ちましょう。

```
$ cd
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ sudo apt install -y ruby-dev
$ sudo apt-get install -y autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev
```

### ※gitでrbenvを入れる理由
最新のrubyを入れようとした時、rbenvも最新版を持ってくる必要がある。その際、gitで入れておいた方が、masterを持ってきやすいため。
  
## rbenv で Ruby の install

```
$ sudo apt-get install -y libreadline-dev
$ echo $SHELL  #/bin/bash
```

`$ vim .bashrc`  で、末尾に以下を追加。

```ruby

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"
```

```
$ source ~/.bashrc  #またはexit
$ which rbenv  #/home/vagrant/.rbenv/bin/rbenv
$ rbenv --version  #rbenv 1.1.1-28-gb943955
$ sudo apt-get install libffi-dev
$ rbenv install 2.4.1  #ここで指定したバージョンのRubyが入る
$ rbenv versions
$ rbenv global 2.4.1
$ rbenv rehash
$ rbenv version
$ which ruby  #/home/vagrant/.rbenv/shims/ruby
$ ruby -v  #これで2.4.1になることを確認
# 2.4.1じゃない場合
$ source ~/.bashrc #これで確認して2.4.1になっていたらok
$ which gem 
$ gem -v # 2.6.11くらい
```
  
# rails new までの下準備
## 下準備

```
$ sudo apt-get -y install libxslt-dev libxml2-dev
$ echo install: --no-rdoc --no-ri >> .gemrc
$ echo update:  --no-rdoc --no-ri >> .gemrc
```
  
## Mysqlのinstall

```
$ sudo apt-get install mysql-server
```
途中謎の画面になるが何も入力せずにenterを叩く。  
  
```
$ mysql -uroot
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
```
root loginができないときは、以下で解決！  

```
$ sudo service mysql stop
$ sudo rm -fr /var/lib/mysql
$ sudo mkdir /var/lib/mysql
$ sudo chown mysql:mysql /var/lib/mysql
$ sudo /usr/sbin/mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql

$ sudo service mysql restart
$ mysql -uroot #これでできるはず #quitと叩けば抜けられる
```
  
## Bundler install

```
$ rbenv exec gem install bundler
$ rbenv rehash
```

### gem の install
共有ディレクトリにgemを入れると変な感じになるので。  

```
$ sudo mkdir /usr/local/src/bundles
$ sudo chown -R vagrant:vagrant /usr/local/src/bundles
```
  
## ディレクトリの作成

```
$ cd /vagrant/ # 共有ディレクトリへ
$ mkdir app_name
$ cd app_name
```
  
## bundle init

```
$ bundle init
```

Gemfile を以下のように書き換える。

```ruby

# frozen_string_literal: true
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails", "5.1.1"
```
  
## bundle install

```
$ bundle install --path /usr/local/src/bundles/app_name --jobs=4
$ bundle exec rails new -B -d mysql --skip-turbolinks --skip-test . # 上書きしますか？的なのが出るけど、enterでok
$ vim Gemfile
```
  
以下のように書き換える。
バージョンは適宜変えてください。

```ruby

source 'https://rubygems.org'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.1.1'
# Use mysql as the database for Active Record
gem 'mysql2', '>= 0.3.18', '< 0.5'
# Use Puma as the app server
gem 'puma', '~> 3.7'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
gem 'therubyracer', platforms: :ruby

# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 3.0'
# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
```

これで、 `$ bundle install`
  
## bundle install でエラーが起こったときの対処
よくbundle install で引っかかるgemのエラー処理をいくつか紹介。
### nokogiriというgemのinstallでerrorしたとき

```
$ sudo gem install nokogiri
$ bundle install --path /usr/local/src/bundles/app_name
```
  
### therubyracerが入らないとき

```
$ sudo apt-get install build-essential g++
$ gem install therubyracer -v '0.12.3' -- --with-v8-dir
$ bundle install
```
  
### mysql2が入らないとき  
`An error occurred while installing mysql2 (0.3.18), and Bundler cannot continue.`  

```
$ cd
$ sudo apt-get install libmysqlclient-dev
$ gem install mysql2 -v '0.4.8'
$ bundle install
```
  
### rmagickが入らないとき
  
```
An error occurred while installing rmagick (2.15.2), and Bundler cannot continue.
Make sure that `gem install rmagick -v '2.15.2'` succeeds before bundling.
```

```
$ sudo apt-get install imagemagick libmagickcore-dev libmagickwand-dev
$ bundle install --path /usr/local/src/bundles/app_name
```
  
## rails s
vagrant で起動したrailsアプリをブラウザで表示する。

```
$ bundle exec rails s -b 0.0.0.0
```
と叩いたら、
[http://0.0.0.0:3000/](http://0.0.0.0:3000/) または [localhost:3000](localhost:3000)
にアクセス。

これで下のような画面がでたら完了です！  
<img src=https://qiita-image-store.s3.amazonaws.com/0/224939/ed8d7861-9418-ad52-8a92-e9cee6b27de2.png width=60%>

  
# 便利な小ネタ
## gitの管理はクライアント側でやる
githubとのやりとりは、vagrant側でなくWindows側でやった方がよい。アカウントをvagrant側で設定したり、公開鍵の登録とかが面倒になってしまうためです。
  
## aliasの設定

以下をvagrant側の~/.bashrcの適当なところに貼り付け！

```
alias b='bundle exec'
alias brs='bundle exec rails s -b 0.0.0.0'
alias brc='bundle exec rails c'
```