コンテンツにスキップ

Ruby on Rails

DockerでRails環境を構築した手順

2016/07/10 修正: docker-compose.ymlnginx.conf の一部を修正しました

とある経緯で Docker を使って Rails の環境をセットアップした手順です。

setting files

まずは用意した file から。

docker-compose.yml

``` yml docker-compose.yml

not use datastore container now

datastore:

build: Dockerfiles/datastore

mysql: image: mysql:5.6.26 environment: MYSQL_ROOT_PASSWORD: 'pass' ports: - '3306:3306'

volumes_from:

- datastore

nginx: build: Dockerfiles/nginx ports: - '80:80'

volumes_from:

- datastore

links: - web

web: build: .

command: bundle exec unicorn -c config/unicorn.rb

volumes_from:

- datastore

volumes: - .:/usr/src/app ports: - '3000:3000' links: - mysql environment: RAILS_ENV: development MYSQL_ROOT_PASSWORD: 'pass' DATABASE_URL: mysql2://root:pass@mysql:3306 SECRET_KEY_BASE: hogehoge


## Dockerfile
``` dockerfile Dockerfile
FROM rails:onbuild

Dockerfiles/nginx/Dockerfile

``` dockerfile Dockerfile FROM nginx:1.7.9

COPY nginx.conf /etc/nginx/nginx.conf


## Dockerfiles/nginx/nginx.conf
``` bash nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
  worker_connections 1024; # increase if you have lots of clients
  accept_mutex off; # "on" if nginx worker_processes > 1
}

http {
  include mime.types;
  default_type application/octet-stream;
  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

  access_log  /var/log/nginx/access.log  main;

  sendfile on;

  tcp_nopush on; # off may be better for *some* Comet/long-poll stuff
  tcp_nodelay off; # on may be better for some Comet/long-poll stuff

  gzip on;
  gzip_http_version 1.0;
  gzip_proxied any;
  gzip_min_length 500;
  gzip_disable "MSIE [1-6]\.";
  gzip_types text/plain text/html text/xml text/css
             text/comma-separated-values
             text/javascript application/x-javascript
             application/atom+xml;

  upstream app_server {
    # for UNIX domain socket setups:
    # server unix:/path/to/.unicorn.sock fail_timeout=0;

    # for TCP setups, point these to your backend servers
    # server 192.168.0.7:8080 fail_timeout=0;
    server web:3000 fail_timeout=0;
  }

  server {
    listen       80;
    server_name  localhost;
    client_max_body_size 4G;
    keepalive_timeout 5;

    # path for static files
    root /usr/your_app/home/system/public;

    try_files $uri/index.html $uri.html $uri @app;

    location @app {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://app_server;
    }

    # Rails error pages
    error_page 500 502 503 504 /500.html;
    location = /500.html {
      root /usr/your_app/home/system/public;
    }
  }
}

Setup Tutorial

Download Tools

VirtualBox

https://www.virtualbox.org/wiki/Downloads

please install version >= 5.x

Homebrew

http://brew.sh/index_ja.html

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Docker Tools

Docker
$ brew install docker
Docker Machine
$ brew install docker-machine
Docker Compose
$ brew install docker-compose

Download Application

$ cd ~/path/to/workspace
$ git clone git@github.com:your/App.git your_app
$ cd your_app

Setup Docker Machine

$ docker-machine create --driver virtualbox dev
...

$ docker-machine ls
NAME   ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
dev    -        virtualbox   Running   tcp://192.168.99.100:2376           v1.10.0
$ eval "$(docker-machine env dev)"

$ echo 'eval "$(docker-machine env dev)"' >> ~/.bashrc
$ docker-machine start dev
...

$ docker-machine ip dev
192.168.99.100

Setup Application

Build Docker Images and Start Containers

# ~/path/to/workspace/your_app
$ docker-compose build
...

$ docker-compose up
...

please open another tab

Setup DB

$ docker-compose run web rake db:create
$ docker-compose run web rake db:migrate

Access Application

$ docker-machine ip dev
192.168.99.100

access to 192.168.99.100:3000

Rails アプリを MySQL で作るときのメモ

Rails 4.0.5 のアプリを MySQL で立てるときのメモ

rails new にオプションをつける

オプションを付けずに rails new すると SQLite で立てられてしまうので、以下のようにする。

$ rails new app_name -d mysql

mysql2 のバージョンを指定

2015/09/21 時点の mysql2 は rails 上での実行時にバグを含んでいるようなのでバージョン指定する。

```ruby Gemfile gem 'mysql2', '~> 0.3.20'

```bash
$ bundle install

mysql のパスワード設定

config/database.yml に mysql のパスワードを設定する。環境変数の指定は以下のようにする。 ```yml config/database.yml development: adapter: mysql2 encoding: utf8 database: app_name_development pool: 5 username: root password: <%= ENV['MYSQLPASS'] %> socket: /var/lib/mysql/mysql.sock


### database の作成
最後に database を作って完了。
```bash
$ rake db:create

参照

Ruby on Railsで初めてアプリを作ってみる #5 -controllerとviewの追加-

生成したリソースに対応するcontrollerを作成し、このリソースに対するviewとそのためのアクションを追加していく。

rails generate controller

controllerを作成する。controllerの名前は1文字目が大文字で、複数形を指定するのがrailsの規約である。

$ rails g controller Stocks
# rails generateコマンドは rails g と省略できる

このコマンドでcontrollerのファイルとviewのファイルが生成される。

Ruby on Railsで初めてアプリを作ってみる #4 -リソースの生成-

Ruby on Railsで初めてアプリを作ってみる #3 -scaffoldジェネレータ-scaffold コマンドを使ったリソースの生成を行ったが、このコマンドでは決められた形式でのリソースの生成にしか対応できないため、手動で自由にリソースを作成してみる。

rails generate model

まずはモデルを作成する。railsの規約に従って、モデルは単数系、最初の文字を大文字で始める。

$ rails generate model Stock title:string

このコマンドで generateg と省略できる。また、要素の属性はデフォルトが string なので、 string も省略することができる。

省略したコマンドが以下。

$ rails g model Stock title

このコマンドでmodelに加えてmigrateファイルが生成されるのでDBをmigrateする。

$ bundle exec rake db:migrate

Ruby on Railsで初めてアプリを作ってみる #3 -scaffoldジェネレータ-

railsには scaffold という単純なリソースを一気に生成するコマンドが存在する。 今回はこのコマンドを使ってみる。

Usersリソースの生成

今回は scaffold コマンドを使ってリソースを生成する。 ここでは以下の要素をもつUsersリソースを生成する。

  • id int
  • name string
  • email string

rails generate スクリプトに scaffold コマンドを指定し、リソースの単数系と要素の情報を渡す

$ rails generate scaffold User name:string email:string

id要素はRailsが主キーとしてデフォルトで設定する

DBにusersのセットアップを行う

rake コマンドを使ってDBをmigrate(更新)する。

$ bundle exec rake db:migrate
== 20141111170736 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0012s
== 20141111170736 CreateUsers: migrated (0.0014s) =============================

出力から users テーブルが作られたことがわかる

ブラウザで確認

rails server コマンドの短縮版である rails s を使って3000番portにアプリを立ち上げる

$ rails s

http://xx.xxx.xxx.xxx:3000

にブラウザでアクセスすると #1 railsのセットアップ で見たデフォルトのRailsページが表示される

次に以下のエンドポイントにアクセスしてみる

http://xx.xxx.xxx.xxx:3000/users

すると既にUser一覧ページができあがっているのがわかる。この他に

  • 新規ユーザーを作成するページ
  • 特定のidのユーザー情報を表示するページ
  • 特定のidのユーザー情報を編集するページ

が作られている。

Micropostsリソースの生成

Usersリソースと同様に scaffold コマンドと rakemigrate タスクで生成する

$ rails generate scaffold Micropost content:string user_id:integer
$ bundle exec rake db:migrate
== 20141112174234 CreateMicroposts: migrating =================================
-- create_table(:microposts)
   -> 0.0029s
== 20141112174234 CreateMicroposts: migrated (0.0031s) ========================

config/routes.rb にmicropostsリソースの設定が追加された

参照

Ruby on Rails チュートリアル

Ruby on Railsで初めてアプリを作ってみる #2 -Herokuのセットアップ-

Ruby on Railsのアプリケーション構築に適したPaaSであるHerokuのセットアップをする。

Herokuに必要なgemのインストール

Herokuで使用するDBであるPostgreSQLと通信するための pg とHerokuで画像やスタイルシートなどの静的アセットを提供するための rails_12factor を本番(production)環境にインストールするための内容をGemfileに追記する

group :production do
  gem 'pg', '0.15.1'
  gem 'rails_12factor', '0.0.2'
end

production環境用のgemをインストールしないオプションをつけて bundle install を実行する。 これによりGemfile.lockが更新され、production環境に備えることができる。

$ bundle install --without production
Your bundle is complete!
Gems in the group production were not installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.

ここまでできたらgitにcommitしておく。

$ git commit -a -m "Update Gemfile.lock for Heroku"

git commit-a は変更のあったファイルを自動で add するオプション。

herokuコマンドが使えるようにする

まずは以下のURLからHerokuにアカウント登録をする。

https://signup.heroku.com/identity

アカウント登録が完了したら heroku コマンドをインストールする。 今回はAWSのLinux環境へのインストールなので以下のURL( Heroku Toolbelt のStandalone)を参照して以下の手順を得る。

https://toolbelt.heroku.com/standalone

$ wget -qO- https://toolbelt.heroku.com/install.sh | sh
This script requires superuser access to install software.
You will be prompted for your password by sudo.
[sudo] password for sojiro: 
Add the Heroku CLI to your PATH using:
$ echo 'PATH="/usr/local/heroku/bin:$PATH"' >> ~/.profile
Installation complete

自動で sudo をつけて実行してくれる。インストールが完了したら出力にあるようにPATHを通す。

$ echo 'PATH="/usr/local/heroku/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
$ heroku version
heroku-toolbelt/3.15.2 (x86_64-linux) ruby/2.0.0

Herokuのセットアップ

heroku コマンドがインストールされたことを確認できたらコマンドラインからHerokuの認証を行う。

$ heroku login
Enter your Heroku credentials.
Email: your.account@email.com
Password (typing will be hidden): 
Your Heroku account does not have a public ssh key uploaded.
Could not find an existing public key at ~/.ssh/id_rsa.pub
Would you like to generate one? [Yn] Y
Generating new SSH public key.
Uploading SSH public key /home/user/.ssh/id_rsa.pub... done
Authentication successful.

認証が完了したらHerokuのセットアップをする

$ heroku create
Creating infinite-peak-4923... done, stack is cedar-14
https://infinite-peak-4923.herokuapp.com/ | git@heroku.com:infinite-peak-4923.git
Git remote heroku added

これでgitのremoteにherokuが追加される

$ git remote -v
heroku  git@heroku.com:infinite-peak-4923.git (fetch)
heroku  git@heroku.com:infinite-peak-4923.git (push)
origin  https://github.com/sojiro14/first_app.git (fetch)
origin  https://github.com/sojiro14/first_app.git (push)

Herokuへデプロイ

追加されたremoteに push をすればHerokuへのデプロイが完了

$ git push heroku master

https://infinite-peak-4923.herokuapp.com/

heroku create 時に出力された上記URL(アプリケーションごとに異なる)にアクセスするとHerokuにデプロイしたアプリケーションが確認できる。Rails 4.0ではこの時点で The page you were looking for doesn't exist. と表示されてしまう模様。

参照

Ruby on Rails チュートリアル

Ruby on Railsで初めてアプリを作ってみる #1 -railsのセットアップ-

Ruby on Railsで初めてアプリを作ってみます。 今回はRailsの立ち上がりを確認するところまで。

アプリのセットアップ(rails new)

railsのアプリ作成は rails new コマンドで始まる。

$ mkdir rails_projects
$ cd rails_projects

今回のアプリ作成の為にディレクトリを作成し、早速コマンドを実行。

$ rails new first_app
...
An error occurred while installing sqlite3 (1.3.10), and Bundler cannot continue.
...

いくつかのディレクトリやファイルが作成されるが、最後にこのようなエラーが出てbundle失敗。 そこでGemfileを編集してbundleをやり直す。

$ cd first_app/

Gemfileを編集。内容はRuby on Rails #Bundlerを参照。

$ bundle update
...
Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3:
    ERROR: Failed to build gem native extension.

    /home/sojiro/.rvm/rubies/ruby-2.0.0-p594/bin/ruby extconf.rb
checking for sqlite3.h... no
sqlite3.h is missing. Try 'port install sqlite3 +universal'
or 'yum install sqlite-devel' and check your shared library search path (the
location where your sqlite3 shared library is located).
*** 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.
...

またも失敗。よく見るとsqlite-develが足りていないらしい

$ sudo yum install sqlite-devel

sqlite-develをインストール後再度bundleによるgemのインストールを試みる

$ bundle update
Installing sqlite3 1.3.8
Installing turbolinks 1.1.1
Installing uglifier 2.1.1
Your bundle is updated!
$ bundle install
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.

インストール成功。

サーバーの立ち上げ(rails server)

ローカルでrailsを立ち上げるコマンド rails server を実行。

$ rails server
...
Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
...

Node.jsのインストール

rails server コマンド実行でエラーが出てしまう。JavaScript runtimeがインストールされていないことが原因のよう。メッセージ通り https://github.com/sstephenson/execjs に行ってみるとJavaScript runtimeとしてNode.jsが有効と書いてあるのでNode.jsをインストールする。

$ sudo rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum install nodejs npm --enablerepo=epel

今回はyumでインストールした。そして再度 rails server

$ rails server
=> Booting WEBrick
=> Rails 4.0.5 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server

ローカルでサーバーが立ち上がる。 今回はAWS上で作業しているので、AWS該当インスタンスのSecurity Groupで3000番portを空ける。

http://xx.xxx.xxx.xxx:3000

にブラウザでアクセスして以下の画面が見えればOK

{% img /images/rails/rails_starting.png %}

GitHubに上げておく

$ git init
$ git remote add origin https://github.com/sojiro14/first_app.git

GitHubでリポジトリ作成

$ git add .
$ git commit -m 'Initialize repository'
$ git push -u origin master

参照

LinuxにRuby on Railsをインストールする

Ruby on Railsを使ってみたいと思い、AWSにインストールした手順。

Ruby version 2.0.0 を RVMを使ってインストール

Linuxに最新のRubyをインストールするを参照

gemsetの作成

Rubyをインストールしたら、Railsのアプリケーションを実行するために必要な他のソフトウェア向けにシステムを構成する必要があります。通常、これはgemのインストールに関連します。gemとは自己完結型のRubyコードのパッケージです。バージョン番号の異なるgem同士がコンフリクトすることがあるため、一連のgemを自己完結的にまとめたgemsetというものを作成してバージョンを使い分けるのが便利です。 (引用: Ruby on Rails チュートリアル

以下のコマンドでgemsetを作成する。

$ rvm use 2.0.0@railstutorial_rails_4_0 --create --default

上のコマンドを実行すると、Ruby 2.0.0に関連付けられたrailstutorial_rails_4_0というgemsetを作成し (--create)、その場でgemsetを有効にし (use)、gemsetをデフォルトに設定 (--default) します。これにより、ターミナルウィンドウを開いたときに2.0.0@railstutorial_rails_4_0というRubyとgemsetの組み合わせが常に選択されるようになります。 (引用: Ruby on Rails チュートリアル

RubyGemsのインストール

AWSには始めからgemがインストールされていて、PATHは以下。

$ which gem
/usr/bin/gem

RVMでRubyをインストールするとPATHが上書きされる。

$ which gem
~/.rvm/rubies/ruby-2.0.0-p594/bin/gem

今回はチュートリアルに合わせてgemのバージョンを更新する

$ gem update --system 2.0.3

gemの設定ファイルである .gemrc に自動生成されるドキュメントである rirdoc の自動生成を抑制する設定をする

$ vim .gemrc
$ cat .gemrc
install: --no-rdoc --no-ri
update:  --no-rdoc --no-ri

Railsをインストールする

いよいよRailsをインストールする

$ gem install rails --version 4.0.5

インストール完了。 以下のコマンドで確認する

$ rails -v
Rails 4.0.5

Railsがインストールされたことを確認できた

参照

Ruby on Rails チュートリアル

Linuxに最新のRubyをインストールする

Ruby on Railsを使ってみたいと思い、調べてみるとRails4ではRubyのバージョンは1.9以降が必須のようである。

自分がさくらで借りているサーバーではRubyのバージョンが1.8.7だったのでこれを新しくしてみた。

RVMのインストール

新しいRubyをインストールする前にRVM(Ruby Version Manager)をインストールする。これはRubyをバージョンごとに管理するツール

$ curl -L https://get.rvm.io | bash -s

このコマンドで自分のホームディレクトリ以下に .rvm/ が作られ、ここにRVMがインストールされる。

そして .profile .bashrc .zshrc にPATHを通す記述が追加される。

また、 .bash_profile .zlogin にRVMをロードする記述が追加される。

RVMのインストールが完了したらロードする。ここではbashを使っているので以下のようにする。

$ source .bash_profile

Rubyのインストール

さくらのレンタルサーバーでの失敗

まずはRubyのインストールに必要なパーツを調べ、無ければインストールする。 以下のコマンドで必要なものをピックアップしインストールまで行ってくれる。

$ rvm requirements
/your/home/directry/.rvm/scripts/functions/support: line 314: rvm_debug: command not found
Checking requirements for freebsd.
Installing requirements for freebsd.
Updating system.
Installing required packages: automake, bison, readline, libyaml...
Error running 'requirements_freebsd_libs_install automake bison readline libyaml',

ここでErrorが発生。内容は必要なパッケージがインストールできなかったということ。 そこでFreeBSDのパッケージ管理コマンドである pkg コマンドを使ってインストールを試みる。

が、サーバーの設定的に自分でパッケージを追加することができなかったのでさくらのサーバーを断念してAWSに移行した。

AWSに移行

AWSに移行して $ rvm requirements までを実行する。(AWSは始めからRubyのバージョンが2.0.0だったが構わず実行) ここでも $ rvm requirements が転ける。

そこで今度はCentOSだったので yum を使ってインストールを試みる。以下のコマンドは $ rvm requirements が教えてくれる。Errorの原因が sudo で実行していなかったことなので sudo 付きで実行する。

sudo yum install -y patch libyaml-devel libffi-devel glibc-headers autoconf gcc-c++ glibc-devel patch readline-devel zlib-devel openssl-devel automake libtool bison

これで成功。

$ rvm requirements
Checking requirements for amazon.
Requirements installation successful.

$ rvm requirementsも成功。

このサーバーではすでにバージョン2.0.0のRubyがインストールされていたが、RVMの配下に新たにバージョン2.0.0のRubyをインストールする。

$ rvm install 2.0.0 --with-openssl-dir=$HOME/.rvm/usr

インストール完了。

参考

Ruby on Rails チュートリアル