Vagrant + Ruby on Rails + MySQL環境構築

  • 10
    いいね
  • 0
    コメント

Rubyを勉強したいということでまず今回は環境構築メモをまとめることにしました。

今回の目的

Ruby on Railsの環境を構築し、ホストのブラウザからアクセスできるようにする。また、その際DBから取得したデータを出力するようにする。

環境

○ホスト:
・MacOSX 10.11.5
・Vagrant 1.5.1
・VirtualBox 4.3.40
○ゲスト:
・CentOS6.5
・Ruby 2.3.1
・Rails 5.0.0
・MySQL 5.7

Vagrantで構築したサーバにRuby on Railsの環境を作っていきます。

Macでやること

ターミナルでvagrantを使いローカルサーバを立てます。

Vagrant

注)centOS6.5のboxをcentos6.5という名前で保持しています。

$ vagrant init centos6.5

生成されたVagrantfileを少し修正してあげます。

config.vm.network "forwarded_port", guest: 80, host: 8080
↓
config.vm.network "forwarded_port", guest: 3000, host: 3000

# config.vm.network "private_network", ip: "192.168.33.10"
↓ コメント外す
config.vm.network "private_network", ip: "192.168.33.10"

Vagrantfileの修正が終わったら、

$ vagrant up
$ vagrant ssh

これでMacで行うことは終了です。

CentOSでやること


gitインストール

$ sudo yum install -y git

諸々パッケージインストール

$ sudo yum install -y gcc make glibc-headers openssl-devel readline libyaml-devel readline-devel sqlite-devel

rbenvインストール

$ cd ~
$ mkdir .rbenv
$ git clone git://github.com/sstephenson/rbenv.git .rbenv

パスを通す

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l

バージョンを確認してみる

$ rbenv --version
rbenv 1.0.0-31-gd0779fc

となればOK。

Rubyインストール

$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
$ rbenv install 2.3.1
$ rbenv global 2.3.1

注)rbenv install 2.3.1は完了まで時間かかることがあります。

バージョンを確認してみる

$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

Railsインストール

$ gem install rails -v 5.0.0 --no-ri --no-rdoc

注)オプション --no-ri --no-rdoc をつけてインストール量を削ることで若干インストールが速くなります。

MySQLインストール

まず、すでにOSにMySQLが入ってないか確認します。5.7ではないものがあったら削除します。

$ rpm -qa | grep mysql
mysql-libs-5.1.66-2.el6_3.x86_64

すでに5.1があったので削除します。

$ sudo yum remove mysql*

改めて5.7をインストールします。

$ sudo rpm --import http://dev.mysql.com/doc/refman/5.7/en/checking-gpg-signature.html
$ sudo rpm -ihv http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
$ yum --disablerepo=\* --enablerepo='mysql57-community*' list available
$ sudo yum --enablerepo='mysql57-community*' install -y mysql-community-server

これでMySQLのインストールが終了しました。

MySQLサーバ起動

$ sudo service mysqld start

これでMySQLの起動は完了!なのですが、chkconfigに登録をしておくと後で楽になります。

$ sudo chkconfig mysqld on

chkconfigまとめ
http://qiita.com/shell/items/30031862d91cedf9ceef

MySQLのrootユーザのパスワード

これでMySQLの起動も終わりました。しかし、rootユーザで入ろうと思ってもパスワードがわかりません。。。
ログの中にあるパスワードを探ってみようと思います。

$ sudo cat /var/log/mysqld.log | grep 'password is generated'

これで初期パスワードが表示されます。このパスワードでMySQLに入り、rootユーザのパスワードを任意のものに変更しておきましょう。

$ mysql -u root -p
Enter password: パスワード

mysql >ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';

ここで注意なのが、新しいパスワードは「8文字以上の大小英数記号を組み合わせ」でなければいけない、ということです。

Railsプロジェクト作成

通常は

$ rails new プロジェクト名

でプロジェクトが作成されますが、今回はMySQLを使いたいので

$ rails new プロジェクト名 -d mysql

とします。ここではプロジェクト名をbbsとします。

$ rails new bbs -d mysql

・・・・エラーが出てしまいました!!!

checking for mysql_query() in -lmysqlclient... no
-----
mysql client is missing. You may need to 'apt-get install libmysqlclient-dev' or
'yum install mysql-devel', and try again.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

エラー文の中にある

$ yum install mysql-devel

を実行して、再度rails newしてみます。
今度はうまくいきました。

いろいろ調整


config/database.ymlを開いてみます。
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: ここにパスワード入れる
  socket: /var/lib/mysql/mysql.sock

development:
  <<: *default
  database: bbs_development

データベースのrootユーザを使ってはいるみたいな設定なのでrootユーザのパスワードを書き込んでやります。そして、bbs_developmentというデータベースを読み込みに行きそうな勢いなので、作成しておきます。

$ mysql -u root -p
Enter Password:

mysql> create database bbs_development;
Query OK, 1 row affected (0.11 sec)

Gemfile修正

Gemfileを開き、

# gem 'therubyracer', platforms: :ruby
⇑ この行(17行目あたり)のコメントを外す

そして

$ bundle install

を実行する。

これでプロジェクトの準備はOK!サーバを起動してみましょう。

サーバ起動

$ rails s -b 0.0.0.0

そしてブラウザからアクセスしてみます。Vagrantfileに192.168.33.10というので設定しているので、192.168.33.10:3000でアクセスを試みます。

・・・・ずっとクルクルしてアクセスできない。。。

ログを見ると

Started GET "/" for 192.168.33.1 at 2016-09-13 15:49:07 +0000
Cannot render console from 192.168.33.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255

となっていたので
Cannot render console from 10.0.2.2!と言われました
http://qiita.com/pugiemonn/items/f7956ba61012ca9fc16c
を参考にconfig/application.rbを編集してみました。
今度は。。

スクリーンショット 2016-09-13 23.33.34.png

接続できました!!!
さて、次はページを作るためにコントローラを作成していきます。

コントローラ作成

トップ画面を作りたいのでtopというコントローラを作成する。

$ rails g controller top index

Running via Spring preloader in process 30904
      create  app/controllers/top_controller.rb
       route  get 'top/index'
      invoke  erb
      create    app/views/top
      create    app/views/top/index.html.erb
      invoke  test_unit
      create    test/controllers/top_controller_test.rb
      invoke  helper
      create    app/helpers/top_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/top.coffee
      invoke    scss
      create      app/assets/stylesheets/top.scss

いろいろ自動生成してくれる。app/controllers/top_controller.rbを見てみましょう。

$ vi app/controllers/top_controller.rb

class TopController < ApplicationController
  def index
  end
end

ユーザテーブル作成

MySQLにユーザデータを格納するテーブルを作成してみます。
MySQLに直接入ってもできますが、railsのプロジェクトで使うものなので連携しやすいようにrailsコマンドとrakeコマンドで作成します。

$ rails g model User uuid:string:unique name:string
Running via Spring preloader in process 4055
      invoke  active_record
      create    db/migrate/20160913135635_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml

上のrails g model User..... のコマンドは以下の意味を持つ
・Usersというテーブルを作成する
・そのテーブルはuuid(uniqueなstring形式), name(string形式)のカラムを持っている。
・ただし、他にデフォルトで管理IDと作成日時、更新日時のカラムを生成する。

上は定義書を作成しただけに過ぎないのでDBに反映してあげる。

$ bin/rake db:migrate
Running via Spring preloader in process 4089
== 20160913135635 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0157s
== 20160913135635 CreateUsers: migrated (0.0157s) =============================

これでテーブル完成!!

最後に、今回の目的であるDBからのデータ出力を行います。

DBから出力

ダミーデータ作成

モデルを作成すると、test/fixtures配下にダミーデータ作成用のファイルが作成されますのでそれを使います。

中身を下記のように編集:

one:
  uuid: AAAA
  name: nameA

two:
  uuid: BBBB
  name: nameB

それでは読み込んでいきましょう。

データ出力

$ bin/rake db:fixtures:load FIXTURES=users

これでOKです。そしてtop_controller.rbを下記のように編集します。

class TopController < ApplicationController
  def index
        @user = User.all
        @user.each{|u|
                logger.debug('=========> ' + u.id.to_s + ', ' + u.name)
        }
  end
end

usersテーブルから全てのデータを取り出して、ループで回し、各データのidとnameカラムを出力するというものです。

実行(ブラウザでアクセス)してみましょう。サーバログに上記の出力がされていれば成功です。

  ActiveRecord::SchemaMigration Load (0.4ms)  SELECT `schema_migrations`.* FROM `schema_migrations`
Processing by TopController#index as HTML
  User Load (0.4ms)  SELECT `users`.* FROM `users`
=========> 298486374, nameB
=========> 980190962, nameA
  Rendering top/index.html.erb within layouts/application
  Rendered top/index.html.erb within layouts/application (1.0ms)
Completed 200 OK in 660ms (Views: 634.2ms | ActiveRecord: 2.5ms)

出力されました!

以上、rails環境を構築してDBからデータを取得&出力するまでのまとめでした。最後までお読みいただきありがとうございました。