rails-new App と Dev Containers を使って Rails8 の開発・本番環境をサクッと構築する

## はじめに

Rails 8.0 を色々と触って試そうと、開発環境の構築からデプロイまでを行うことしたのですが、rails-new App や Dev Containersを使ってサクッと構築することができそうだったので手順をまとめました。

### できること

- Dev Containers を使った Rails 8.0 の開発環境の構築
- Docker での Render.com への自動デプロイ

## 用意するもの

- Docker
- VS Code (Visual Studio Code)
- VS Code の Dev Containers Extension
- rails-new app
- GitHub のリポジトリ
- Render.com のアカウント

https://www.docker.com/ja-jp/

https://azure.microsoft.com/ja-jp/products/visual-studio-code

https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers

https://github.com/rails/rails-new

https://github.com/new

https://render.com/

## 1. rails-new App を使った Rails 8 アプリケーションの作成

rails-new を使うと Docker を用いてローカルの Ruby 環境の影響を受けずに環境を構築できます。

[README](https://github.com/rails/rails-new?tab=readme-ov-file#installation) のインストール手順を参考にインストールします。

### プロジェクトの作成

今回はDBに PostgreSQL を使用するのでオプションに指定して実行します。

```shell
rails-new --ruby-version 3.3.6 --rails-version 8.0.0 --devcontainer --database=postgresql app-name
```

作成されたプロジェクトを VS Code で開くと、 Dev Container でプロジェクトを開くためのダイアログが表示されるので実行します。

コンテナ内のターミナルで Rails の状態を確認します。（以降の操作は全てコンテナ内のターミナルで行います。）

```shell
$ rails --version
Rails 8.0.0
```

### 開発サーバーの起動

`bin/dev` で開発サーバーを起動できます。

```shell
$ bin/dev
=> Booting Puma
=> Rails 8.0.0 application starting in development 
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma version: 6.5.0 ("Sky's Version")
* Ruby version: ruby 3.3.6 (2024-11-05 revision 75015d4c1f) +YJIT [aarch64-linux]
*  Min threads: 3
*  Max threads: 3
*  Environment: development
*          PID: 32917
* Listening on http://127.0.0.1:3000
* Listening on http://[::1]:3000
Use Ctrl-C to stop
```

これで開発環境が作成されました。

### (Option) Scaffold

適当なモデルを Scaffold で作成しておきます。

```shell
$ rails g scaffold Post title:string
$ rails db:migrate
```

確認用にルートも変更しておきます。

`config/routes.rb`
```ruby
Rails.application.routes.draw do
  resources :posts
  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html

  # Reveal health status on /up that returns 200 if the app boots with no exceptions, otherwise 500.
  # Can be used by load balancers and uptime monitors to verify that the app is live.
  get "up" => "rails/health#show", as: :rails_health_check

  # Render dynamic PWA files from app/views/pwa/* (remember to link manifest in application.html.erb)
  # get "manifest" => "rails/pwa#manifest", as: :pwa_manifest
  # get "service-worker" => "rails/pwa#service_worker", as: :pwa_service_worker

  # Defines the root path route ("/")
  root "posts#index"
end
```

開発環境で動作確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266269/f5e1ef1f-27ec-3d0c-01fd-85710218b1fa.png)

これで Rails アプリケーション側は準備完了です。
GitHub リポジトリにプッシュしておきます。

```shell
$ git remote add origin git@github.com:user-name/app-name.git
$ git push origin main
```

## 2. Render.com へのデプロイ

### PostgreSQL DB の作成

https://render.com/docs/postgresql-creating-connecting

- Database, User は `config/database.yml` の内容と合わせておく
- Region は Asia だと現状は Singapore しか選択肢が無い



設定内容

```md
Name: any name
Project: any
Database: app_name_production
User: app_name
Region: Singapore
PostgreSQL Version: 16
Plan Options Instance Type: Free
```

### web service の作成

GitHub リポジトリとの連携が必要です。

設定内容

```md
Source Code: rails app repository
Name: rails app name
Project: any
Language: Docker
Branch: main
Region: Singapore
Instance Type: Free
Environment Variables:
  WEB_CONCURRENCY: 2
  RAILS_MASTER_KEY: `config/master.key` の値
  DB_HOST: 作成済みのPostgreSQL DB の Info -> Connections -> Hostname の値
  APP_NAME_DATABASE_PASSWORD: 作成済みのPostgreSQL DB の Info -> Connections -> Password の値
```

Deploy Web Service を実行するとデプロイが開始されます。

デプロイが完了したら動作確認して終了です。お疲れ様でした。

## まとめ

rails-new によってローカル環境の Ruby, Rails が不要になったのは手軽に環境が構築できていいですね。
Rails on Docker の開発環境が短時間で作れるので、Docker デプロイに対応した PaaS と併用して、サクッと作ったものを公開するのにも丁度に良さそうです。