Clound9でRailsGirlsもしくはel-trainingが試せる環境を構築する

# はじめに

[RailsGilrs](https://railsgirls.jp/)や万葉さまの新人社員教育用カリキュラムである [el-training]など、(https://github.com/everyleaf/el-training) Rubyを勉強しようとしている方で、Macを持っていないもしくは貧弱なPCスペックの方向けの環境構築ガイドです。

:bangbang: RailsGirlsについては対象が参加向けではなく、コーチやってみたいなぁと思っているけど環境構築は得意じゃないよって方向け（いるのかそんな人？）ですのでご注意ください:bow:

RailsGirlsってどんな感じですすめるのだろう？とサイトに手順通り試してみようと普段使わないwindowsマシンを引っ張り出しWSL上に構築したらrailsの動作確認までに1時間かかってしまった（PCが非力なのは当然として、多分SSDじゃなくてHDDだったのが大きな原因）ので、Cloud9上で構築してみました。

ネット上で探すと同じ内容のものがいくらでも出てきますが、自分の欲しい環境とは異なっていたのでメモを兼ねて。なお、本記事公開から時間が経っても参考になるように注意しながらまとめてみました。

# 本構築記事のゴール

- RailsGirlsでの到達点
  - 「[インストールガイド](https://railsgirls.jp/install)」完了相当
    - 違いはPostgresqlのインストール（railsgirlsでは本来不要）
- el-trainingでの到達点
  - 「[ステップ1: Railsの開発環境を構築しよう](https://github.com/everyleaf/el-training/blob/master/docs/el-training.md#%E3%82%B9%E3%83%86%E3%83%83%E3%83%971-rails%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%97%E3%82%88%E3%81%86)」完了相当

# 条件

- AWSアカウントの作成やIAMの設定などは事前に終わっている前提です。
- 2020/5/15～2020/5/16に試しました。
- ruby/rails環境は以下の通り
    - ruby2.6.6
        - railsgirlsだと最新(いまだと2.7系）なので読み替えてください
    - rails6.0.3
        - postgresqlを利用する（Cloud9環境にはmysqlが導入済みなので置き換えます）
        - webpackerを利用する
- Clound9の設定
    - Platformでは `Ubuntu Server 18.04 LTS` を選択

# 構築手順

## Cloud9の起動とターミナルの起動まで

まずは起動させてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/7f14d98c-cea9-c818-d340-ca2b0ba02d4d.png)


NewTerminalを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/ba839529-1120-92bf-6ba7-0f4b782a2e3e.png)

開くと `~/environment` ディレクトリをカレントディレクトリとしてターミナルが起動します。どうやら、Cloud9ではプロジェクトファイルなどはこのディレクトリ配下に置くのがお作法のようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/46a5f98a-ebfa-4d9d-205f-280cee17aba6.png)


## タイムゾーンの変更

日付が日本時間となっていない(UTC)ですね。

```shell-session:日付の確認
y-amadatsu:~/environment $ date
Sat May 16 02:29:10 UTC 2020
```

先にタイムゾーンを変更しておきましょう。

```shell-session:タイムゾーンの確認
y-amadatsu:~/environment $ timedatectl list-timezones | grep -i tokyo
Asia/Tokyo
```

設定するタイムゾーンを確認すると `Asia/Tokyo` のようですね。

```shell-session:タイムゾーンの設定
y-amadatsu:~/environment $ sudo timedatectl set-timezone Asia/Tokyo
y-amadatsu:~/environment $ date
Sat May 16 11:33:46 JST 2020
```

`date` コマンドで、日本時間に変更されたことが確認できました。

## Rubyのインストールまで

Rubyのバージョンを確認。ちょっと古いので新しいバージョンをインストールする準備を行います。

```shell-session:rubyのインストール状況の確認
y-amadatsu:~/environment $ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
y-amadatsu:~/environment $ which ruby
/home/ubuntu/.rvm/rubies/ruby-2.6.3/bin/ruby
```

デフォルトではrvmがインストールされていたのですが、普段rbenvを使っているのでインストールしなおします。

まずはrvmさま、さようなら:raised_hand:

```shell-session:rvmのアンインストール
y-amadatsu:~/environment $ rvm implode
Are you SURE you wish for rvm to implode?
This will recursively remove /home/ubuntu/.rvm and other rvm traces?
(anything other than 'yes' will cancel) > yes
Removing rvm-shipped binaries (rvm-prompt, rvm, rvm-sudo rvm-shell and rvm-auto-ruby)
Removing rvm wrappers in /home/ubuntu/.rvm/bin
Hai! Removing /home/ubuntu/.rvm
/home/ubuntu/.rvm has been removed.

Note you may need to manually remove /etc/rvmrc and ~/.rvmrc if they exist still.
Please check all .bashrc .bash_profile .profile and .zshrc for RVM source lines and delete or comment out if this was a Per-User installation.
Also make sure to remove `rvm` group if this was a system installation.
Finally it might help to relogin / restart if you want to have fresh environment (like for installing RVM again).

```

最後に不要なファイルなどを削除するように指示がありますが、初めてのenvironment[^aws-environment]として起動した私の環境では単にrailsを動かすだけなら不都合なさそうなのでこのまま進めます。もし後でrubyのコマンドが見つからない、実行しているrubyのバージョンが異なるなどの不都合が発生した場合は上記の設定を見直すこととしましょう。

[^aws-environment]: Cloud9の動作環境（environment）のことです。

ではrbenvをインストールします。
[本家サイト](https://github.com/rbenv/rbenv)のインストール手順を見ながら進めます。

```shell-session:rbenvのインストール
y-amadatsu:~/environment $ sudo apt-get update
y-amadatsu:~/environment $ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
y-amadatsu:~/environment $ cd ~/.rbenv && src/configure && make -C src
make: Entering directory '/home/ubuntu/.rbenv/src'
gcc -fPIC     -c -o realpath.o realpath.c
gcc -shared -Wl,-soname,../libexec/rbenv-realpath.dylib  -o ../libexec/rbenv-realpath.dylib realpath.o 
make: Leaving directory '/home/ubuntu/.rbenv/src'
```
今回はインストール手順のとおり試しましたが、これからは `sudo apt-get update` は `sudo apt update` に置き換えて慣れたほうが良いと思います[^apt-get]。

[^apt-get]: https://linuxfan.info/package-management-ubuntu を参照。aptが推奨されるようになってかなり立つのですが、このようにネット上では最新でない記載も多々あります。

あと、Bashなんでついでに `cd ~/.rbenv && src/configure && make -C src` を試してみました。コンパイルしているので速度向上となると思いますが、通常は不要です[^rbenv-compile]。
カレントディレクトリ `~/.rbenv` に変わりましたが気にせずに続けます…

[^rbenv-compile]: そのままでも十分早いので問題ないと思います。むしろ、今後rbenv自体をアップデートするときにも再度コンパイルが必要だと思われますが、たぶんその時には忘れていると思います:angel:

```shell-session:rbenvの設定(1)
y-amadatsu:~/.rbenv (master) $ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
y-amadatsu:~/.rbenv (master) $ ~/.rbenv/bin/rbenv init
# Load rbenv automatically by appending
# the following to ~/.bash_profile:

eval "$(rbenv init -)"
```

指示の通り `.bash_profile` に追加します。

```shell-session:rbenvの設定(2)
y-amadatsu:~/.rbenv (master) $ echo eval "$(rbenv init -)" >> ~/.bash_profile
```

指示通りターミナルをいったん閉じて開きなおして[^source]続きを。
[^source]: ネットで探すと `source ~/.bash_profile` を実行する手順での説明が多いと思います。間違いではないのですが、ソフト提供元のインストールの指示（一次情報とも言います）どおりやったほうが未知の問題への遭遇確率が減るので慣れるまでは愚直に指示通りする方法をお勧めします。あと、ここではディレクトリ移動の説明を省きたかったのもあります。

`brew docker` みたいな診断プログラムですね。

```shell-session:rbenvの設定(3)
y-amadatsu:~/environment $ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash
Checking for `rbenv' in PATH: /home/ubuntu/.rbenv/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: not found
Unless you plan to add Ruby versions manually, you should install ruby-build.
Please refer to https://github.com/rbenv/ruby-build#installation

Counting installed Ruby versions: none
  There aren't any Ruby versions installed under `/home/ubuntu/.rbenv/versions'.
  You can install Ruby versions like so: rbenv install 2.2.4
Checking RubyGems settings: OK
Auditing installed plugins: OK
```

`ruby-build` は入れてないから当然

> Checking `rbenv install' support: not found

なのですが、rbenvのインストール手順ではすでに導入済みの状態でサンプルが示されているのでちょっと混乱しそうなポイント。
とはいえ、指示通り https://github.com/rbenv/ruby-build#installation を見ながらすすめましょう。

今回は一般的と思われるrbenvのプラグインとしてインストールを進めます。

```shell-session:rbenvの設定(4)
y-amadatsu:~/environment $ mkdir -p "$(rbenv root)"/plugins
y-amadatsu:~/environment $ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
Cloning into '/home/ubuntu/.rbenv/plugins/ruby-build'...
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 10844 (delta 1), reused 3 (delta 0), pack-reused 10835
Receiving objects: 100% (10844/10844), 2.28 MiB | 16.79 MiB/s, done.
Resolving deltas: 100% (7158/7158), done.
y-amadatsu:~/environment $ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-doctor | bash
Checking for `rbenv' in PATH: /home/ubuntu/.rbenv/bin/rbenv
Checking for rbenv shims in PATH: OK
Checking `rbenv install' support: /home/ubuntu/.rbenv/plugins/ruby-build/bin/rbenv-install (ruby-build 20200401-11-g12af1c3)
Counting installed Ruby versions: none
  There aren't any Ruby versions installed under `/home/ubuntu/.rbenv/versions'.
  You can install Ruby versions like so: rbenv install 2.2.4
Checking RubyGems settings: OK
Auditing installed plugins: OK
```
これでよし。それではrubyをインストールします。今回はruby2.6系の最新版である2.6.6をインストールしました。
EC2がt2.microだと時間がそれなりにかかります:coffee:
私の時には10分くらいかかった…かも（記憶が飛んでいる:angel:）

```shell-session:rubyのインストール
y-amadatsu:~/environment $ rbenv install 2.6.6
Downloading ruby-2.6.6.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.6.tar.bz2
Installing ruby-2.6.6...
Installed ruby-2.6.6 to /home/ubuntu/.rbenv/versions/2.6.6

y-amadatsu:~/environment $ rbenv global 2.6.6
y-amadatsu:~/environment $ ruby -v
ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-linux]
```

よし、インストールまで完了しました！

## 必要なパッケージのインストールと不要なパッケージ(mysql)への対応

今回はrails6を動かすので、必要なパッケージをインストールします。

- postgresql
- redis
- yarn

事前準備として、yarnをapt経由でインストールできるようにします。 [公式サイト](https://classic.yarnpkg.com/en/docs/install/#debian-stable) を参考にまずはDebian package repository用の公開鍵を登録＆aptの設定をしてからインストールしましょう。

```shell-session:yarnのレポジトリの登録
y-amadatsu:~/environment $ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
OK
y-amadatsu:~/environment $ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
deb https://dl.yarnpkg.com/debian/ stable main
```

リポジトリを追加した場合は必ず `sudo apt update` してください。

```shell-session:aptのパッケージリストの更新
y-amadatsu:~/environment $ sudo apt update
Hit:1 https://download.docker.com/linux/ubuntu bionic InRelease
Get:2 https://dl.yarnpkg.com/debian stable InRelease [17.1 kB]                                               
Hit:3 http://us-east-1.ec2.archive.ubuntu.com/ubuntu bionic InRelease                                             
Get:4 http://us-east-1.ec2.archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]                           
Get:5 http://us-east-1.ec2.archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]                         
Get:6 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]          
Get:7 https://dl.yarnpkg.com/debian stable/main amd64 Packages [9953 B]
Get:8 https://dl.yarnpkg.com/debian stable/main all Packages [9953 B]    
Fetched 289 kB in 1s (499 kB/s)                    
Reading package lists... Done
Building dependency tree       
Reading state information... Done
30 packages can be upgraded. Run 'apt list --upgradable' to see them.
```

最新のパッケージリストを取り込んだところ、更新できるパッケージがたくさんありそうなのでこのタイミングで更新しておきます。

```shell-session:更新パッケージの適用(upgrade)
y-amadatsu:~/environment $ sudo apt upgrade -y
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following NEW packages will be installed:
...省略...
mysql.time_zone_name                               OK
mysql.time_zone_transition                         OK
mysql.time_zone_transition_type                    OK
mysql.user                                         OK
The sys schema is already up to date (version 1.5.2).
Checking databases.
sys.sys_config                                     OK
Upgrade process completed successfully.
Checking if update is needed.
Setting up mysql-server (5.7.30-0ubuntu0.18.04.1) ...
Processing triggers for initramfs-tools (0.130ubuntu3.9) ...
update-initramfs: Generating /boot/initrd.img-5.3.0-1017-aws
Processing triggers for libc-bin (2.27-3ubuntu1) ...
Processing triggers for systemd (237-3ubuntu10.40) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for dbus (1.12.2-1ubuntu1.1) ...
Processing triggers for ureadahead (0.100.0-21) ...
```

更新完了です…と :point_up: のログで気づいたのですがmysqlはすでにいそうですね…

```shell-session:mysqlプロセスの確認
y-amadatsu:~/environment $ ps aux | grep [m]ysql
mysql    27099  0.1 17.7 1161948 178088 ?      Sl   12:36   0:00 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
```

やはり、入っていました。 ~~宗教上の理由により~~ 今回は不要なので先に対応しておきます。
まずはサービスを止めてからパッケージをサービスを無効化しておきます。

サービスを止めてから…

```shell-session:mysqlの停止
y-amadatsu:~/environment $ sudo systemctl stop mysql
```

動いていないことを確認して…

```shell-session:mysqlの停止(確認)
y-amadatsu:~/environment $ sudo systemctl status mysql
● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Fri 2020-05-15 12:47:38 UTC; 11s ago
 Main PID: 27099 (code=exited, status=0/SUCCESS)

May 15 12:36:21 ip-10-10-10-180 systemd[1]: Starting MySQL Community Server...
May 15 12:36:22 ip-10-10-10-180 systemd[1]: Started MySQL Community Server.
May 15 12:47:36 ip-10-10-10-180 systemd[1]: Stopping MySQL Community Server...
May 15 12:47:38 ip-10-10-10-180 systemd[1]: Stopped MySQL Community Server.
y-amadatsu:~/environment $ ps aux | grep [m]ysql
```

サービスを無効化（起動時の自動起動設定をOFF）します。

```shell-session:mysqlサービスの無効化
y-amadatsu:~/environment $ sudo systemctl disable mysql.service
Synchronizing state of mysql.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install disable mysql
y-amadatsu:~/environment $ sudo systemctl list-unit-files  mysql.service                                                                                                             
UNIT FILE     STATE   
mysql.service disabled

1 unit files listed.
```

それでは必要なパッケージインストールします。

```shell-session:rails6に必要なサービスのインストール
y-amadatsu:~/environment $ sudo apt install postgresql libpq-dev redis yarn -y
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
...省略...
Adding user postgres to group ssl-cert

Creating config file /etc/postgresql-common/createcluster.conf with new version
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
Removing obsolete dictionary files:
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql.service → /lib/systemd/system/postgresql.service.
Setting up libsensors4:amd64 (1:3.4.0-4) ...
Setting up postgresql-client-10 (10.12-0ubuntu0.18.04.1) ...
update-alternatives: using /usr/share/postgresql/10/man/man1/psql.1.gz to provide /usr/share/man/man1/psql.1.gz (psql.1.gz) in auto mode
Setting up redis-tools (5:4.0.9-1ubuntu0.2) ...
Setting up libpq-dev (10.12-0ubuntu0.18.04.1) ...
Setting up sysstat (11.6.1-1ubuntu0.1) ...

Creating config file /etc/default/sysstat with new version
update-alternatives: using /usr/bin/sar.sysstat to provide /usr/bin/sar (sar) in auto mode
Created symlink /etc/systemd/system/multi-user.target.wants/sysstat.service → /lib/systemd/system/sysstat.service.
Setting up postgresql-10 (10.12-0ubuntu0.18.04.1) ...
Creating new PostgreSQL cluster 10/main ...
/usr/lib/postgresql/10/bin/initdb -D /var/lib/postgresql/10/main --auth-local peer --auth-host md5
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "C.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/10/main ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default timezone ... Etc/UTC
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    /usr/lib/postgresql/10/bin/pg_ctl -D /var/lib/postgresql/10/main -l logfile start

Ver Cluster Port Status Owner    Data directory              Log file
10  main    5432 down   postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log
update-alternatives: using /usr/share/postgresql/10/man/man1/postmaster.1.gz to provide /usr/share/man/man1/postmaster.1.gz (postmaster.1.gz) in auto mode
Setting up postgresql (10+190ubuntu0.1) ...
Setting up redis-server (5:4.0.9-1ubuntu0.2) ...
Created symlink /etc/systemd/system/redis.service → /lib/systemd/system/redis-server.service.
Created symlink /etc/systemd/system/multi-user.target.wants/redis-server.service → /lib/systemd/system/redis-server.service.
Setting up redis (5:4.0.9-1ubuntu0.2) ...
Processing triggers for libc-bin (2.27-3ubuntu1) ...
Processing triggers for systemd (237-3ubuntu10.40) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Processing triggers for ureadahead (0.100.0-21) ...
```

postgresはただしくpostgresユーザが作られていることが確認できます。あと `Creating new PostgreSQL cluster 10/main ...` とか気になる記載も。今のpostgresはデフォルトでクラスタ作るんですかね:thinking:

postgresはあとで動作確認しますので、それ以外が正しくインストールできているか確認しましょう。

```shell-session:インストールの確認
y-amadatsu:~/environment $ redis-cli --version
redis-cli 4.0.9
y-amadatsu:~/environment $ redis-server --version
Redis server v=4.0.9 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=9435c3c2879311f3
y-amadatsu:~/environment $ yarn --version
1.22.4
```

redisはクライアントとサーバのどちらも4系が入っていますね。sidekiq6だと4以上が要求されるのでこれで安心:relaxed:

また、postgresとredisはサーバとして動作させますのでサービスとして有効化されているか確認します。

```shell-session:redisの確認
y-amadatsu:~/environment $ sudo systemctl list-unit-files redis*.service
UNIT FILE             STATE   
redis-server.service  enabled 
redis-server@.service disabled
redis.service         enabled 

3 unit files listed.
```

```shell-session:PostgreSQLの確認
y-amadatsu:~/environment $ sudo systemctl list-unit-files postgres*.service
UNIT FILE           STATE   
postgresql.service  enabled 
postgresql@.service indirect

2 unit files listed.

```

問題なさそうですね！

postgresとredisを起動しておきましょう。
起動状態を確認します。

```shell-session:redisの確認
y-amadatsu:~/environment $ sudo systemctl status redis-server
● redis-server.service - Advanced key-value store
   Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2020-05-16 01:34:28 UTC; 32min ago
     Docs: http://redis.io/documentation,
           man:redis-server(1)
 Main PID: 962 (redis-server)
    Tasks: 4 (limit: 1121)
   CGroup: /system.slice/redis-server.service
           └─962 /usr/bin/redis-server 127.0.0.1:6379

May 16 01:34:27 ip-10-10-10-180 systemd[1]: Starting Advanced key-value store...
May 16 01:34:28 ip-10-10-10-180 systemd[1]: redis-server.service: Can't open PID file /var/run/redis/redis-server.pid (yet?) after start: No such file or directory
May 16 01:34:28 ip-10-10-10-180 systemd[1]: Started Advanced key-value store.
```
```shell-session:postgresの確認
y-amadatsu:~/environment $ sudo systemctl status postgresql.service
● postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
   Active: active (exited) since Sat 2020-05-16 01:34:31 UTC; 33min ago
 Main PID: 1386 (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 1121)
   CGroup: /system.slice/postgresql.service

May 16 01:34:31 ip-10-10-10-180 systemd[1]: Starting PostgreSQL RDBMS...
May 16 01:34:31 ip-10-10-10-180 systemd[1]: Started PostgreSQL RDBMS.
```
:bangbang: ちなみに上記ログですが、確認の前後でCloud9の再起動が入ってしましました（インストールの翌日に確認した）。おそらくどちらも起動していないと思いますのでその場合は起動しましょう。

```shell-session:各サービスの起動
y-amadatsu:~/environment $ sudo systemctl start redis-server.service
y-amadatsu:~/environment $ sudo systemctl start postgresql.service
```

きちんと動作しているか、 `sudo systemctl status ...` コマンドで確認すれば完璧です！

なお、postgresqlについては、インストール時のログで

> Success. You can now start the database server using:
>
>    /usr/lib/postgresql/10/bin/pg_ctl -D /var/lib/postgresql/10/main -l logfile start

とありましたがUbuntu環境では `systemctl` を経由して起動・停止したほうが便利ですのでこちらを利用しました。

必要なパッケージは（ひとまず [^package-install] ）これで揃いました。

[^package-install]: Gemfileのbundle install時にnativeコンパイルが走る場合、別途ライブラリのインストールが必要になる場合があります

## テストでrails6を動かしてみる

railsgarlsを参考にサンプルのrails6アプリを作りながら動作確認してみましょう。動作確認ですので詳細の説明は省きます:relieved:

**Railsのインストール**

```shell-sessio:railsのインストール
y-amadatsu:~/environment $ gem install rails --no-document -v "6.0.3"
```

**サンプルのrailsアプリの作成**

```shell-session:railsアプリの作成
y-amadatsu:~/environment $ rails new sample
```

ちなみに `rails new sample` は私の環境では約5分くらいかかりました。

**動作確認**

```shell-session:railsアプリの作成～サーバ起動まで
y-amadatsu:~/environment $ cd sample/
y-amadatsu:~/environment/sample (master) $ rails g scaffold book
y-amadatsu:~/environment/sample (master) $ rails db:migrate
y-amadatsu:~/environment/sample (master) $ rails server
=> Booting Puma
=> Rails 6.0.3 application starting in development 
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 4.3.3 (ruby 2.6.6-p146), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://127.0.0.1:8080
* Listening on tcp://[::1]:8080
Use Ctrl-C to stop
```

ブラウザで確認してみましょう。上部メニューの `Preview` から `Preview Running Application` をクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/8d5fc453-a3f3-993b-80a1-67a5efba04e0.png)

クリックすると以下のエラー画面が表示されます（一部塗りつぶしで消してます）

<img width="1125" alt="rails.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/8f4c5cf9-0a8b-0f78-23b4-8c35e8cbb290.png">

これはRails6の新しいセキュリティ機構によって表示されるエラーです。詳しくは下記を参照してください。

[Rails6 のちょい足しな新機能を試す78（Guard DNS rebiding attacks編）](https://qiita.com/suketa/items/f00570e6f171cb987ddd)

エラー画面で表示された `config.hosts << "xxxxxxxxxxxxxx.vfs.cloud9.us-east-1.amazonaws.com"` をコピーして `/sample/config/environments/development.rb` に以下のように追記して保存してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/23cdcbb3-7dfb-08f8-3b70-54cc9d3c129e.png)

今立ち上がっているサーバを `Ctrl-C` で停止します。

```shell-session:railsサーバの停止
y-amadatsu:~/environment/sample (master) $ rails server                                 
=> Booting Puma
=> Rails 6.0.3 application starting in development 
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 4.3.3 (ruby 2.6.6-p146), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://127.0.0.1:8080
* Listening on tcp://[::1]:8080
Use Ctrl-C to stop
^C- Gracefully stopping, waiting for requests to finish
=== puma shutdown: 2020-05-16 17:31:18 +0900 ===
- Goodbye!
Exiting
```
そして再度 `rails server` で起動してpreviewを再確認してください。なお、Cloud9上のブラウザではなぜか接続できません…これはググってみても誰も解決できていなさそう。間違いなくネットワークの設定なんだけどな…:frowning2:

なので、接続できていない画面のURLの右に「矢印と重なったウィンドウのボタン」（マウスオーバーで「Pop Out Into New Window」と表示される）がありますのでクリックしてください。下記の画像右端のボタンです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/a0551e80-1d7b-9e06-852a-34b74792fcc8.png)

するとお使いのブラウザのタブで表示できると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/31558dfb-67f9-e357-800f-8002881661db.png)

ここまででrailsgirlsのインストール作業としては完了です！

## 以下postgresqlへの接続を試す

現時点ではDBがsqliteとなっていますので、postgresqlに置き換えます。

まず `database.yml` ファイルは下記の内容でまるっと置き換えてください[^database.yml]

[^database.yml]: 本来は同じrailsバージョンで `rails new appname --database=postgresql` した結果のdatabase.ymlをベースに修正したほうが無難です。

```yaml:/config/database.yml
default: &default
  adapter: postgresql
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: postgres
  password: postgres
  host: localhost
  timeout: 5000

development:
  <<: *default
  database: sample_development

test:
  <<: *default
  database: sample_test

production:
  <<: *default
  database: sample_production
```

Gemfileは `sqlite3` の行を見つけてコメントアウトし、 `gem 'pg'` を追加して下さい。

```ruby:Gemfile
#gem 'sqlite3', '~> 1.4'
gem 'pg'
```

Gemfileを修正したので `bundle install` しなおしましょう[^bundle-install]。

[^bundle-install]: ここは `bundle update` でも同じです。個人的には `bundle update` は個別パッケージのみバージョンを上げるときに利用しています。

```shell-session:railsに必要なパッケージをインストールする
y-amadatsu:~/environment/sample (master) $ bundle install
```

今回は開発環境なのでDBのユーザはpostgresのままでパスワードも簡易的に設定します。

```shell-session:postgresユーザのパスワードを設定
y-amadatsu:~/environment/sample (master) $ sudo -u postgres psql                                                 
psql (10.12 (Ubuntu 10.12-0ubuntu0.18.04.1))
Type "help" for help.

postgres=# alter role postgres with password 'postgres';
ALTER ROLE
postgres=# \q
y-amadatsu:~/environ
```

`\q` でコンソールに戻ります。

なお、他のサイトでは `pg_hba.conf` の修正が必要と書いてありますが、今回インストールされたPostgreSQL 10系だとインストール時に最低限の設定をしてくれていたのでスキップします。下記がインストール時のログの抜粋です。

> Creating new PostgreSQL cluster 10/main ...
> /usr/lib/postgresql/10/bin/initdb -D /var/lib/postgresql/10/main --auth-local peer --auth-host md5
> The files belonging to this database system will be owned by user "postgres".
> This user must also own the server process.

これでDBの設定も問題ないはずです[^postgres-user]。一気に行きます。

[^postgres-user]: インストール時に作られた `postgres` ユーザはいわゆるなんでもできるスーパーユーザなので、ローカルでの開発以外ではこのような使い方はNGです。別途アプリ用のユーザを作成してください。

```shell-session:DBの作成から起動確認まで
y-amadatsu:~/environment/sample (master) $ rake db:create
y-amadatsu:~/environment/sample (master) $ rake db:migrate
y-amadatsu:~/environment/sample (master) $ rails server
```

簡素な画面ですが、きちんと `/books` も一覧表示できることを確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144344/e5912264-730b-76ac-381e-913844f21633.png)


お疲れさまでした！