Ruby(Sinatra)+Postgres の開発をローカルでやろう! Vol.1 ~無限 ガチローカル編~

「[Life is Tech ! Kanto Advent Calendar 2022](https://qiita.com/advent-calendar/2022/life-is-tech-kanto)」21 日目の記事になります。

# はじめに

こんにちは、Life is Tech! で関東 Web サービスコースメンターをやっているいっそです！

今回は、「Ruby(Sinatra)+Postgres の開発をローカルでやろう! Vol.1 ~無限 ガチローカル編~」ということで、いつもは Cloud9 で運用されている Web サービスコースの開発環境をローカルで建ててみたいと思います！

この記事は 3 日間に分けて投稿されていますが、1 日目は macOS にソフトウェアを全てインストールしてローカル環境を構築する方法、2 日目は Docker Compose を使用する方法と別々のことを紹介しています。
気になったら別日の記事も読んでみてくださいね！

**P.S. 2 日目の Docker Compose 用記事は [こちら](https://qiita.com/isso_719/items/8b4dfc6f441cf52a88b2)！**
**P.S. 3 日目の Windows 用の記事は [こちら](https://qiita.com/isso_719/items/548263da598e9e519c6d)！**

# 本記事で検証されている環境

本記事は以下の構成の PC にて検証されています。(特に Windows は対応してなさげな気がするので、WSL や Virtual Box などで Linux をインストールしてから行うことをおすすめします...といいつつ Cygwin とか使えばできるかな...?)
動かない場合は 2 日目に紹介する Docker Compose を使用した方法を試すことをおすすめします。
また、別環境で動いた方はコメントで教えていただけると幸いです！

- macOS Ventura 13.0.1
- MacBook Pro, 16-inch, 2019
- 2.4 GHz 8 コア Intel Core i9
- AMD Radeon Pro 5500M 8 GB
Intel UHD Graphics 630 1536 MB
- 64 GB 2667 MHz DDR4

# Web サービス開発に必要なソフトウェア

まず、Web サービスコースの開発環境に導入されており、開発に必要となるソフトウェアを紹介します。

## Ruby 3.0.0

みんな大好き [Ruby](https://www.ruby-lang.org/ja/) ですね。

Web サービスコースの素材は 3.0.0 を前提にして作られています (といっても Gemfile 変えちゃえば別のバージョンで動きますが…) 今回はそれに則って、3.0.0 を導入します。

## PostgreSQL 15

[PostgreSQL](https://www.postgresql.org/) は Web サービスコースの開発環境で使用しているオープンソースのリレーショナルデータベースです。

Web サービスコースの想定は PostgreSQL 11 ですが、15 でも問題なく動く & 性能改善などもされているため、今回は 15 を使用します。

# インストール

それでは、実際にインストールをしていきます。
もしインストールだけしたいよ！って人は、[インストールをまとめてみた](#インストールをまとめてみた) まで読み飛ばしちゃってください。

## HomeBrew

本記事では簡単にするために [HomeBrew](https://brew.sh/index_ja) を使用したインストール方法をご紹介します。

[HomeBrew](https://brew.sh/index_ja) は macOS（およびLinux）用パッケージマネージャーで、コマンド 1 発でソフトウェア(および依存ソフトウェア)のインストールと PATH 通しを行ってくれる便利なものです。

インストールのコマンドは以下の通りです。

```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

## Ruby 3.0.0 のインストール

Ruby 3.0.0 のインストール方法を紹介します。

### anyenv

Ruby のインストールには [anyenv](https://github.com/anyenv/anyenv) を使用します。

[anyenv](https://github.com/anyenv/anyenv) はオールインワンの **env バージョンマネージャーです。Ruby のバージョン管理ツールである rbenv をはじめ、pyenv や goenv, nodenv などをまとめており、各言語のバージョンをローカル環境で容易に切り替えることができます。

以下のコマンドで HomeBrew によるインストールと設定をすることが可能です。

```bash
brew install anyenv
yes | anyenv install --init
cat <<'EOF' >> ~/.zshrc

# anyenv
export PATH="$HOME/.anyenv/bin:$PATH"
eval "$(anyenv init -)"
EOF
source ~/.zshrc
```

### rbenv

次は [rbenv](https://github.com/rbenv/rbenv) のインストールを行います。
[rbenv](https://github.com/rbenv/rbenv) はRuby のバージョンマネージャーです。

anyenv で rbenv を 1 行でインストール & 設定までできるようになっています。

```bash
anyenv install rbenv
source ~/.zshrc
```

### Ruby 3.0.0

いよいよ Ruby 3.0.0 のインストールを行います。

rbenv によって簡単にインストール & 設定を行えます。

```bash
rbenv install 3.0.0
rbenv global 3.0.0
source ~/.zshrc
```

以上で Ruby 3.0.0 のインストールは完了です！

## PostgreSQL 15 のインストールと設定

次は PostgreSQL 15 のインストールと設定を行っていきます。

### PostgreSQL のインストール

HomeBrew を用いてインストールします。

```bash
brew install postgresql@15
brew install libpq
```

### PostgreSQL の設定

PostgreSQL の起動と PATH 通しを行います。

```bash
brew services start postgresql@15
cat <<'EOF' >> ~/.zshrc
# PostgreSQL
export PATH="/usr/local/opt/postgresql@15/bin:$PATH"
EOF
source ~/.zshrc
```

次にデータベースクラスタの作成を行います。

```bash
initdb /usr/local/var/postgres
brew services restart postgresql@15
```

次に現在のユーザでデータベースを作成します。

```bash
createdb $(whoami)
```

pg config の設定を行います。

```bash
bundle config build.pg -- --with-pg-dir=/usr/local/opt/libpq
```

これで PostgreSQL のインストールも完了です！

## 再起動

最後に mac を再起動しておしまいです。

```bash
sudo reboot
```

## インストールをまとめてみた

今回のインストールをまとめると以下の GitHub にあるコードのようになります。
[https://github.com/isso-719/macos-ruby-pg-init/blob/main/native/build.sh](https://github.com/isso-719/macos-ruby-pg-init/blob/main/native/build.sh)

なお、以下のコマンドで一気にインストール作業を短縮できます。(質問には `y` で回答してください)

```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/isso-719/macos-ruby-pg-init/main/native/build.sh)"
```

# 検証

Count 素材を使用して実際に使用できるか検証します。

```bash
count % bundle
Fetching gem metadata from https://rubygems.org/.........
Resolving dependencies...
Fetching rake 13.0.6
Installing rake 13.0.6
Using bundler 2.2.3
Fetching minitest 5.16.3
Fetching concurrent-ruby 1.1.10
Fetching zeitwerk 2.6.6
Fetching multi_json 1.15.0
Installing multi_json 1.15.0
Installing zeitwerk 2.6.6
Installing minitest 5.16.3
Fetching ruby2_keywords 0.0.5
Fetching pg 1.4.5
Fetching rack 2.2.4
Installing ruby2_keywords 0.0.5
Installing concurrent-ruby 1.1.10
Fetching tilt 2.0.11
Installing rack 2.2.4
Installing pg 1.4.5 with native extensions
Installing tilt 2.0.11
Fetching mustermann 2.0.2
Fetching webrick 1.7.0
Fetching rack-protection 2.2.4
Installing mustermann 2.0.2
Installing webrick 1.7.0
Fetching i18n 1.12.0
Fetching tzinfo 2.0.5
Installing rack-protection 2.2.4
Fetching sinatra 2.2.4
Installing i18n 1.12.0
Installing tzinfo 2.0.5
Fetching activesupport 6.1.7
Installing activesupport 6.1.7
Installing sinatra 2.2.4
Fetching sinatra-contrib 2.2.4
Fetching activemodel 6.1.7
Installing sinatra-contrib 2.2.4
Installing activemodel 6.1.7
Fetching activerecord 6.1.7
Installing activerecord 6.1.7
Fetching sinatra-activerecord 2.0.26
Installing sinatra-activerecord 2.0.26
Bundle complete! 7 Gemfile dependencies, 21 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.

count % rake db:create
Created database 's_count'

count % rake db:migrate
== 20190423024537 CreateCounts: migrating =====================================
-- create_table(:counts)
   -> 0.0432s
== 20190423024537 CreateCounts: migrated (0.0434s) ============================

count % ruby app.rb -o 0.0.0.0
[2022-12-20 14:44:42] INFO  WEBrick 1.7.0
[2022-12-20 14:44:42] INFO  ruby 3.0.0 (2020-12-25) [x86_64-darwin22]
== Sinatra (v2.2.3) has taken the stage on 4567 for development with backup from WEBrick
[2022-12-20 14:44:42] INFO  WEBrick::HTTPServer#start: pid=1454 port=4567
```

`http://localhost:4567` にアクセスすると、正常に動いてることが確認できました！
![Untitled12345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246409/8b4b6dcc-9f04-8a53-3c95-b6026c8c55e8.png)

# 終わりに

今回は Ruby(Sinatra)+Postgres の開発環境をローカルに構築してみました。
明日は Docker Compose を使用した Ruby(Sinatra)+Postgres の開発環境の構築を行います！

以上、「[Life is Tech ! Kanto Advent Calendar 2022](https://qiita.com/advent-calendar/2022/life-is-tech-kanto)」21 日目の記事でした。