MacBook AirにVirtualBoxを入れ仮想マシンにCentOS6.5(64)をインストールしRails環境を構築してHerokuにサンプルをデプロイするまでの手順


###これを記述した日時
* 2014年01月05日

###前提条件
* VirtualBoxを多少使ったことがある。
* Linuxのインストール経験が一度以上ある。
* Linuxの(CUI)コマンド操作の経験がある。
* Herokuの操作経験がある。
* viでファイルの編集ができる。
* やる気がある。

###説明内容
* VirtualBoxのインストールする（省略）
* 仮想マシンの新規作成する（省略）
* 仮想マシンを設定する（省略）
* CentOSのインストールする（省略）
* ネットワークを設定する
* 必要なモジュールをインストールする
* 外部のリポジトリを追加する
* リポジトリの優先順位を有効にする
* モジュールを追加する
* シンボリックリンクを設定します。
* VBoxAdditionsをインストールする
* 共有フォルダをマウントする
* Node.jsのインストール
* 一般ユーザを作成する
* ファイヤーウォールの設定を変更する(追記：2014/1/5)
* rbenvをインストールする
* Rubyをインストールする
* Railsをインストールする
* Railsの簡単なアプリを作成する
* Herokuにデプロイする

###使用した機器
* MacBook Air（OSX Mountain Lion）（ACアダプタの接続を推奨）
* WiFiのアクセスポイント（終端は光へ接続している）

###事前ダウンロード先
* [Oracle VM VirtualBox](https://www.virtualbox.org/wiki/Downloads)（VirtualBox 4.3.6 for OS X hosts）
* [CentOS](http://isoredirect.centos.org/centos/6/isos/x86_64/)（ISOイメージ、CentOS-6.5-x86_64-bin-DVD1.iso）
* [epelリポジトリ](http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm)（RPM、epelリポジトリパッケージ）
* [remiリポジトリ](http://rpms.famillecollet.com/enterprise/remi-release-6.rpm)（RPM、remiリポジトリパッケージ）
* [Node.js](http://nodejs.org/download/)（ソースファイル、node-v0.10.24.tar.gz）

###何か利用できるようになるか
* CentOS 6.5(64ビット）
* macとCentOSの間でファイル共有
* rbenv 0.4.0-89-g14bc162
* Ruby 2.0.0-p353
* Rails 4.0.2
* Heroku


* * *
#VirtualBoxのインストールする（省略）

* * *

#仮想マシンの新規作成する（省略）

* * *

#仮想マシンを設定する（省略）

* * *

#CentOSのインストールする（省略）


* * *

#ネットワークを設定する

>###### #この作業はrootで行ないます。

```補足
ホストOS：mac
ゲストOS：CentOS
```

```VirtualBoxのセットワーク設定
アダプター１：NAT
アダプター２：ホストオンリーアダプター
```

ゲストOSからインターネットへ接続するためのネットワークを準備します。
以下のファイルをvi等で編集します。

```bash:/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=xx:xx:xx:xx:xx:xx
TYPE=Ethernet
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ONBOOT=no
NM_CONTROLLED=yes
BOOTPROTO=dhcp
```

```bash:変更内容
ONBOOT=yes
```

ホストOS（mac）と通信する為のネットワークを設定します。
以下のファイルをvi等で編集します。


```bash:/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
HWADDR=xx:xx:xx:xx:xx:xx
TYPE=Ethernet
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ONBOOT=no
NM_CONTROLLED=yes
BOOTPROTO=dhcp
```

```bash:変更内容
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.56.101
NETWORK=192.168.56.0
NETMASK=255.255.255.0
```

>######ONBOOT=yesにしたことで次回はブート時に有効になります。


今回は以下のコマンドでネットワークを有効にします。

```bash:ネットワークを有効にする
ifup eth0
```

>```bash:（参考コマンド）
ifup [インタフェース名] ・・・有効にする
ifdown [インタフェース名] ・・・無効にする
ifconfig ・・・(IP)ネットワークの確認
```

* * *

#必要なモジュールをインストールする

>###### #この作業はrootで行ないます。


```bash:インストール直後のモジュールを最新にアップデートする
yum check-update
yum update
```

```bash:確認の入力が要求される
Total download size: x.x M
Installed size: x.x M
Is this ok [y/N]: 
```

yを入力しenterキーを押す。


```bash:（補足）
　[y/N]:　yes または no の入力を求める意味。大文字がデフォルトを示す。この場合はNoとなる。  
```

無事にアップデートが完了しました。

```bash:アップデートが完了すると、
Complete!
[root@localhost ~]# 
```

更に必要なモジュールをインストールします。

>###### #確認が表示されら y を入力する。

#外部のリポジトリを追加する

```bash:wgetをインストールします。
yum install wget
```


```bash:RPMをダウンロードしてインストールします。
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -Uvh remi-release-6.rpm epel-release-6-8.noarch.rpm
```

* * *

#リポジトリの優先順位を有効にする


使用するリポジトリに優先順位を付けるモジュールをインストールします。

```bash:プラグインをインストールします。
yum install yum-plugin-priorities
```

以下のファイルにpriorityを編集します。

```bash:/etc/yum.repos.d/CentOS-Base.repo
[base]
・・・
priority=1

#released updates
[updates]
・・・
priority=1

#packages used/produced in the build but not released
[addons]
・・・
priority=1

#additional packages that may be useful
[extras]
・・・
priority=1

#additional packages that extend functionality of existing packages
[centosplus]
・・・
priority=1

#contrib - packages by Centos Users
[contrib]
・・・
priority=2
```


```bash:/etc/yum.repos.d/epel.repo
[epel]
・・・
enabled=0
・・・
priority=5

[epel-debuginfo]
・・・
enabled=0
・・・
priority=5

[epel-source]
・・・
enabled=0
・・・
priority=5
```

```bash:/etc/yum.repos.d/epel-testing.repo
[epel-testing]
・・・
enabled=0
・・・
priority=5

[epel-testing-debuginfo]
・・・
enabled=0
・・・
priority=5

[epel-testing-source]
・・・
enabled=0
・・・
priority=5
```

```bash:/etc/yum.repos.d/remi.repo
[remi]
・・・
enabled=0

[remi-php55]
・・・
enabled=0

[remi-test]
・・・
enabled=0

[remi-debuginfo]
・・・
enabled=0

[remi-php55-debuginfo]
・・・
enabled=0

[remi-test-debuginfo]
・・・
enabled=0
```

#モジュールを追加する

```bash:モジュールを追加する
yum --enablerepo=epel install libyaml libyaml-devel
yum install zlib-devel
yum install readline-devel
yum install openssl-devel
yum install libxml2-devel
yum install libxslt libxslt-devel
yum install curl-devel
yum install gcc kernel-devel kernel-headers
yum --enablerepo=epel install dkms
yum install gcc-c++
yum install git
yum install sqlite-devel
yum install subversion
yum install byacc
yum -y install xorg*
```

```bash:（補足）
　yum -y とすると、確認時にすべて y を入力したことと同等になる。ただし予め結果が分かっている場合に使うべきです。
```

```bash:（補足）
　yum --enablerepo=epel とすると、先ほど追加したリポジトリを対象にモジュールを検索する。この場合は、epelリポジトリを対象に追加したことになる。
```

インストールが終了したらリブード（再起動）します。


```bash:リブート
reboot
```

```bash:リブートしたら、
CentOS release 6.5 (Final)
Kernel 2.6.32-431.1.2.0.1.e16.x86_64 on an x86_64

localhost login: 
```

rootでログインします。

```bash:（例）
CentOS release 6.5 (Final)
Kernel 2.6.32-431.1.2.0.1.e16.x86_64 on an x86_64

localhost login: root
Password: パスワードは表示されません
Last login: 前回ログインした日時 on tty1
[root@localhost ~]# 
```


#シンボリックリンクを設定します。

>###### #これはVBoxLinuxAdditionsに必要な設定です。

```bash:設定する
cd /usr/src/kernels/`uname -r`/include/drm/  
ln -s /usr/include/drm/drm.h drm.h  
ln -s /usr/include/drm/drm_sarea.h drm_sarea.h  
ln -s /usr/include/drm/drm_mode.h drm_mode.h  
ln -s /usr/include/drm/drm_fourcc.h drm_fourcc.h
```

以下のファイルを編集し環境変数を追加します。

```bash:/root/.bash_profile
export KERN_DIR=/usr/src/kernels/`uname -r`
```
再ログインします。

* * *

# VBoxAdditionsをインストールする

>###### #この作業はrootで行ないます。

>###### #VirtualBoxの共有フォルダをマウントできるようにする準備

VirtualBoxのメニューからCDイメージを挿入します。

```bash:VirtualBoxのメニューから以下の順番で選択します
デバイス -> Guest Additions のCDイメージを挿入… (Host+d)
```

CDイメージをマウントしてCentOSから読めるようにします。

```bash:マウント用のディレクトリを作成する
mkdir /media/cdrom
```

```bash:マウントする
mount -r /dev/cdrom /media/cdrom
```

マウントしたCDへディレクトリを移動します。

```bash:ディレクトリを移動する
cd /media/cdrom
```


```bash:CDのファイル一覧を表示する
ls -l
```

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/34551/cd29c749-80bc-c9e7-030f-1dcfe995d325.png "スクリーンショット")

Guest Additionsをインストールします。

```bash:インストール
./VBoxLinuxAdditions.run
```

リブートします。

```bash:リブート
sync;sync
reboot
```


* * *

#共有フォルダをマウントする

>###### #この作業は一般ユーザで行ないます。


>###### #VirtualBox側の操作


VirtualBoxのメニューからCDイメージを挿入します。

```bash:VirtualBoxのメニューから以下の順番で選択する
デバイス -> 共有フォルダー設定...
```

右側のアイコンをクリックします。

![スクリーンショット 2014-01-04 20.53.16.png](https://qiita-image-store.s3.amazonaws.com/0/34551/798946a0-7784-6a05-daaf-1e66645248fe.png "スクリーンショット 2014-01-04 20.53.16.png")

「フォルダーのパス：」にホストOS（mac）のフォルダーを指定します。
「フォルダー名：」にゲストOS（CentOS）の共有デバイス名をしています。

```bash:（例）
フォルダーのパス：/Users/ユーザ名/Share
フォルダー名：vboxshare
```

![スクリーンショット 2014-01-04 20.53.39.png](https://qiita-image-store.s3.amazonaws.com/0/34551/1886ffe5-b315-1295-0f8c-46fa67792a59.png "スクリーンショット 2014-01-04 20.53.39.png")

設定をしてOKをクリックします。


>###### #CentOS側の操作

マウントポイントのディレクトリを作成します。

```bash:マウント用のディレクトリを作成する
mkdir /media/share
```

共有デバイスをマウントします。

```bash:マウントする
mount -t vboxsf vboxshare /media/share
```

* * *

#Node.jsのインストール

>###### #この作業はrootで行ないます。


```bash:解凍する
cd
tar -zxvf /media/share/node-v0.10.24.tar.gz
cd node-v0.10.24
./configure
make
make install
```


* * *

#一般ユーザを作成する

>###### #この作業はrootで行ないます。

```bash:ユーザを作成しパスワードを設定
useradd admin
passwd admin
```

* * *

#ファイヤーウォールの設定を変更する(追記：2014/1/5)

>###### #この作業はrootで行ないます。

デバック用のwebサーバーのポート3000を通す。
以下のファイルを編集しサービスを再起動します。


```bash:/etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3000  -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
```

```bash:追加した部分
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3000  -j ACCEPT
```

```bash:サービスを再起動する
service iptables restart
```


* * *

#rbenvをインストールする

>###### #この作業は一般ユーザで行ないます。

```bash: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
```

設定を確認します。

```bash:ログインプロセスからシェルを起動する
$SHELL -l
type rbenv
```

```bash:（結果）以下のように表示されれば成功！
rbenv is a function
rbenv () 
{ 
    local command;
    command="$1";
    if [ "$#" -gt 0 ]; then
        shift;
    fi;
    case "$command" in 
        rehash | shell)
            eval "`rbenv "sh-$command" "$@"`"
        ;;
        *)
            command rbenv "$command" "$@"
        ;;
    esac
}
```


rbenv installが実行できるようにします。

```bash:プラグインをインストールする
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

インストール可能なRuby一覧を表示します。

```bash:コマンド
rbenv install -l
```


```bash:一覧
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
  1.8.7-p302
  1.8.7-p334
  1.8.7-p352
  1.8.7-p357
  1.8.7-p358
  1.8.7-p370
  1.8.7-p371
  1.8.7-p374
  1.8.7-p375
  1.9.1-p378
  1.9.1-p430
  1.9.2-p0
  1.9.2-p180
  1.9.2-p290
  1.9.2-p318
  1.9.2-p320
  1.9.2-p326
  1.9.3-dev
  1.9.3-p0
  1.9.3-p125
  1.9.3-p194
  1.9.3-p286
  1.9.3-p327
  1.9.3-p362
  1.9.3-p374
  1.9.3-p385
  1.9.3-p392
  1.9.3-p429
  1.9.3-p448
  1.9.3-p484
  1.9.3-preview1
  1.9.3-rc1
  2.0.0-dev
  2.0.0-p0
  2.0.0-p195
  2.0.0-p247
  2.0.0-p353
  2.0.0-preview1
  2.0.0-preview2
  2.0.0-rc1
  2.0.0-rc2
  2.1.0
  2.1.0-dev
  2.1.0-preview1
  2.1.0-preview2
  2.1.0-rc1
  2.2.0-dev
  jruby-1.5.6
  jruby-1.6.3
  jruby-1.6.4
  jruby-1.6.5
  jruby-1.6.5.1
  jruby-1.6.6
  jruby-1.6.7
  jruby-1.6.7.2
  jruby-1.6.8
  jruby-1.7.0
  jruby-1.7.0-preview1
  jruby-1.7.0-preview2
  jruby-1.7.0-rc1
  jruby-1.7.0-rc2
  jruby-1.7.1
  jruby-1.7.2
  jruby-1.7.3
  jruby-1.7.4
  jruby-1.7.5
  jruby-1.7.6
  jruby-1.7.7
  jruby-1.7.8
  jruby-1.7.9
  maglev-1.0.0
  maglev-1.1.0-dev
  maglev-2.0.0-dev
  mruby-dev
  rbx-1.2.4
  rbx-2.0.0
  rbx-2.0.0-dev
  rbx-2.0.0-rc1
  rbx-2.1.0
  rbx-2.1.1
  rbx-2.2.0
  rbx-2.2.1
  rbx-2.2.2
  rbx-2.2.3
  ree-1.8.6-2009.06
  ree-1.8.7-2009.09
  ree-1.8.7-2009.10
  ree-1.8.7-2010.01
  ree-1.8.7-2010.02
  ree-1.8.7-2011.03
  ree-1.8.7-2011.12
  ree-1.8.7-2012.01
  ree-1.8.7-2012.02
  topaz-dev
```

* * *

#Rubyをインストールする

>###### #この作業は一般ユーザで行ないます。


```bash:Rubyをインストールする
rbenv install 2.0.0-p353
rbenv global 2.0.0-p353
rbenv rehash
```

```bash:アップデート
gem update
gem update --system
```


* * *

#Railsをインストールする

>###### #この作業は一般ユーザで行ないます。


```bash:
gem install rails -v '4.0.2'
gem install bundler
gem install execjs
gem install heroku
rbenv rehash
```


* * *

#Railsの簡単なアプリを作成する

>###### #この作業は一般ユーザで行ないます。



```bash:アプリのスケルトンを作成する
rails new helloworld
cd helloworld
```

```bash:コントローラを作成する
rails generate controller welcome
```

以下のファイルを作成し簡単なページを作成します。

```ruby:app/views/welcome/index.html.erb
<h2>Hello World</h2>
<p>
  The time is now: <%= Time.now %>
</p>
```

webサーバにアクセスしたときのページを指定します。


```ruby:config/routes.rb
  root 'welcome#index'
```

ローカルでwebサーバを起動します。

```bash:webサーバーを起動する
rails server
```

ブラウザーでアクセスし以下のように表示されたら成功。

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/34551/3d0e87ae-5fe9-3d43-09a7-e4dcfc0e3a27.png "スクリーンショット")

* * *

#Herokuにデプロイする

Gemfileを編集します。

```bash:Gemfile
gem 'sqlite3', group: :development
gem 'pg', group: :production

# Heroku
gem 'rails_12factor', group: :production
```

データベースの設定をします。

```bash:config/database.yml
production:
  adapter: postgresql
  database: helloworld_production
```

Gemfile.lockを更新します。

```bash:更新
bundle install
```

Herokuへデプロイします。


```bash:デプロイ
git init
git add .
git commit -m "init"
heroku apps:create
git push heroku master
```

Herokuへブラウザでアクセスし表示されたら完成！！

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/34551/4c9e749d-1621-2f2d-be41-bbc4619cbafd.png "スクリーンショット")


* * *

* * *

#参考
* [http://wiki.centos.org/PackageManagement/Yum/Priorities](http://wiki.centos.org/PackageManagement/Yum/Priorities)

* [http://www.rackspace.com/knowledge_center/article/installing-rhel-epel-repo-on-centos-5x-or-6x](http://www.rackspace.com/knowledge_center/article/installing-rhel-epel-repo-on-centos-5x-or-6x)

* [http://www.centos.org/docs/5/html/yum/](http://www.centos.org/docs/5/html/yum/)

* [https://github.com/sstephenson/rbenv](https://github.com/sstephenson/rbenv)

* [https://github.com/sstephenson/ruby-build](https://github.com/sstephenson/ruby-build)

* [https://github.com/joyent/node](https://github.com/joyent/node)

* [http://gembundler.com](http://gembundler.com)

* [http://www.heroku.com](http://www.heroku.com)

* [http://guides.rubyonrails.org/](http://guides.rubyonrails.org/)

* [https://devcenter.heroku.com/articles/getting-started-with-rails4](https://devcenter.heroku.com/articles/getting-started-with-rails4)