前置き
本記事は前回の記事の続編です。
ご覧になっていない方は、前回の記事もご覧になってください。
今回はRailsのプロジェクトを作成してMySQLと連携していることを確認します。
一応、今回で最終回のつもりです。最後までお付き合い頂ければと思います。
プロジェクトを作成する
-
railsユーザで作業します。
今までrootユーザで作業をしてきましたが、1回目の記事で作成したRailsユーザで作業します。$ id uid=1000(rails) gid=1000(rails) groups=1000(rails),10(wheel) $ pwd /home/rails
-
プロジェクトを作成します。
この記事の主題であるMySQLを使うようにします。$ rails new myapp -d mysql create create README.md create Rakefile : : Your user account isn't allowed to install to the system RubyGems. You can cancel this installation and run: bundle install --path vendor/bundle to install the gems into ./vendor/bundle/, or you can enter your password and install the bundled gems to RubyGems using sudo. Password: # railsユーザのパスワード Installing rake 12.3.1 Using concurrent-ruby 1.0.5 Using i18n 1.0.1 : : Bundle complete! 18 Gemfile dependencies, 78 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed. run bundle exec spring binstub --all * bin/rake: spring inserted * bin/rails: spring inserted
アプリの事前準備をする
-
JavaScriptの実行環境をインストールします。
このままローカルサーバーで動作させようとするとJavaScriptの実行環境が無いのでエラーになります。
予め回避のためNode.jsとnpmをインストールしておきます。
※EPELリポジトリを追加する必要があります。ConoHaのCentOS 7は追加済みでした。
[参考]EPELリポジトリを追加する場合は以下を実行します。$ sudo -i [sudo] rails のパスワード: # yum install epel-release # exit
本線のNode.jsとnpmをインストールします。(sudoでもrootユーザでも)
# yum install -y nodejs npm
-
DB設定を行います。
DBの設定ファイルのアカウントをrailsユーザの情報に書き換えます。$ cd ~/myapp $ vi config/database.yml
database.ymldefault: &default username: rails password: Hogehoge123!
-
MySQLにアプリ用DBを作成します。
$ rails db:create Created database 'myapp_development' Created database 'myapp_test'
mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | myapp_development | | myapp_test | | mysql | | performance_schema | | sys | +--------------------+ 6 rows in set (0.00 sec)
-
web-consoleのホワイトリストを設定します。
デフォルトの設定値が127.0.0.1/8なので、ローカル環境(サーバーのIPがループバックIP)で開発環境を構築している場合は不要と思います。$ vi ~rails/myapp/config/application.rb
application.rbconfig.web_console.whitelisted_ips = 'xxx.xxx.xxx.xxx' # 接続元のIP
-
引き続き、タイムゾーンを設定します。
application.rbconfig.time_zone = 'Tokyo' config.active_record.default_timezone = :local
-
引き続き、ロケールを設定します。
application.rbconfig.i18n.available_locales = [:en, :ja] config.i18n.default_locale = :ja
-
ファイヤーウォールを一時的に停止します。
デフォルトのRailsサーバーのポート:3000の通信が不通になる可能性がありますので、一時的にファイヤーウォールを停止します。
実環境ではグローバルからの接続はHTTPS(ポート:443)経由になりますので、確認が完了したら元の設定に戻ります。開発環境もHTTPSで構築した方が良いですね。systemctl stop firewalld
サーバーを起動する
-
プロジェクトのディレクトリへ移動します。
rails new myapp -d mysql
を実行したカレントディレクトリは、ホームディレクトリになっていると思います。$ ls -l ~ 合計 4 drwxrwxr-x 14 rails rails 4096 6月 10 23:06 myapp $ cd ~/myapp $ pwd /home/rails/myapp
-
サーバーを起動します。
$ rails s => Booting Puma => Rails 5.2.0 application starting in development => Run `rails server -h` for more startup options Puma starting in single mode... * Version 3.11.4 (ruby 2.5.1-p57), codename: Love Song * Min threads: 5, max threads: 5 * Environment: development * Listening on tcp://0.0.0.0:3000 Use Ctrl-C to stop
-
余談です。
バインドオプションを指定しなくてもrails s
で問題無く表示されています。VirtualBoxで検証したときはlocalhost:3000でアクセスしていました。この時はホストOSからゲストOSへのアクセスが「外部アクセス」扱いになりアクセス不可でした。この場合はrails s -b 0.0.0.0
とバインドオプションを指定してサーバーを起動してあげましょう。
MySQLと連携しているか確認する
-
Scaffoldで犬モデルを作ります。
DBをマイグレーションすれば、dogsテーブルが作成されるはずです。$ rails g scaffold dog name:string age:integer
-
DBをマイグレーションします。
$ rails db:migrate == 20180611144225 CreateDogs: migrating ======================================= -- create_table(:dogs) -> 0.0078s == 20180611144225 CreateDogs: migrated (0.0079s) ==============================
-
MySQLにテーブルが作成されたか確認してみます。
-
テーブルがあるか確認します。
dogsテーブルが作成されていますねmysql> USE myapp_development; USE myapp_development; Database changed mysql> DESC dogs; +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | id | bigint(20) | NO | PRI | NULL | auto_increment | | name | varchar(255) | YES | | NULL | | | age | int(11) | YES | | NULL | | | created_at | datetime | NO | | NULL | | | updated_at | datetime | NO | | NULL | | +------------+--------------+------+-----+---------+----------------+ 5 rows in set (0.00 sec)
犬の情報を登録してみる
-
一覧へアクセスします。
http://(ConoHa VPS グローバルIP):3000/dogs
まだ、ワンちゃんはいません。
-
MySQLにレコードが挿入されたか確認してみます。
あっ!調子にのって3頭も登録していたことがバレてしまいました。我が家の愛犬です。mysql> SELECT * FROM dogs; +----+--------+------+---------------------+---------------------+ | id | name | age | created_at | updated_at | +----+--------+------+---------------------+---------------------+ | 1 | 千代 | 6 | 2018-06-12 00:18:09 | 2018-06-12 00:18:09 | | 2 | エル | 4 | 2018-06-12 00:18:57 | 2018-06-12 00:18:57 | | 3 | 乙女 | 7 | 2018-06-12 00:19:09 | 2018-06-12 00:19:09 | +----+--------+------+---------------------+---------------------+ 3 rows in set (0.00 sec)
終わりに
本番環境、それに準じたテスト環境の構築はnginxを前段に持ってきてリバースプロキシして、常時SSLで構成することを想定しています。それ自体はRails固有のものではなく、Node.js(Express)なんかでも同様と思いますので、3回に渡ってお送りしたこの記事も一度閉じます。どこかでまた記事にしたいです。
LinuxやRailsに関しては私自身これからWEBアプリを作って行くところで入口に立ったばかりの身ですが、この記事が参考になれば幸いです。
最後にファイヤーウォールを有効に再設定してくださいね。