VPSでdocker-composeを使ったRailsを動かす

docker-composeを使った開発環境の作り方はこの記事を見ていただきたい。今回は本番環境の設定方法を解説する。

前提

今回はVPSを使った環境について説明する。一つのVPSで複数のサービスを開発することを前提にする。

Nginx

VPSにはnginxを入れてserver_nameごとにサービスを振り分ける。ポートを使って振り分けると管理できなくなるのでunix sockを使って振り分ける。Nginxの設定方法はこの記事を参考にしてほしい。

nginxでunix sockを使用してリクエストを受け付ける | Notes to Forget

やること

Dockerfileを修正

本番環境のDockerfileはrails newコマンド実行時に作ってくれるのでそれを使用する。

以下のユーザー設定があるとコンテナ上で動かなかったため削除する。

# Run and own only the runtime files as a non-root user for security
RUN groupadd --system --gid 1000 rails && \
    useradd rails --uid 1000 --gid 1000 --create-home --shell /bin/bash && \
    chown -R rails:rails db log storage tmp
USER 1000:1000

その他の部分はそのまま使う。

docker-compose内のnginxコンテナの設定

VPSにあるnginxからunix sockでリクエストを受け付けるためにnginxコンテナを作成する。

以下のようなファイル構成でDockerfileとapp.confを作成する

docker
└── nginx
    ├── Dockerfile
    └── app.conf

Dockerfile

FROM nginx:1.21

ADD app.conf /etc/nginx/conf.d/app.conf

app.conf。server_nameのexample.comは実際のドメインに置き換える。

server {
    listen       unix:/var/run/app.sock;
    server_name  example.com;

    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Client-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X_FORWARDED_SSL on;
    proxy_set_header X-Forwarded-Server $host;

    location / {
        proxy_pass http://web:3000/;
    }
}

docker-compose.production.ymlを作成

version: "3.9"
services:
  web:
    build: 
      context: .
      dockerfile: Dockerfile
    command: bash -c "rm -f tmp/pids/server.pid && RAILS_ENV=production ./bin/rails assets:precompile && ./bin/rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/rails
    environment:
      RAILS_ENV: production
    healthcheck:
      test: "curl http://localhost:3000 || exit 1"
      interval: 60s
      timeout: 10s
      retries: 5
      start_period: 10s
  nginx:
    build: docker/nginx/
    volumes:
      - ./run/:/var/run/
    depends_on:
      web:
        condition: service_healthy

プロダクション用のビルドをする。

$ docker compose -f docker-compose.production.yml build

database.ymlの設定

credentialsファイルと合わせて以下のように設定する。データベース名はapp_productionから変更する。

production:
  primary: &production_default
    <<: *default
    username: <%= Rails.application.credentials.dig(:database, :username) %>
    password: <%= Rails.application.credentials.dig(:database, :password) %>
    host: <%= Rails.application.credentials.dig(:database, :host) %>
    port: <%= Rails.application.credentials.dig(:database, :port) %>
    database: app_production
  cache: *production_default
  cable: *production_default
  queue: *production_default

credentialsは以下のコマンドで編集する。

$ docker compose run --rm -e EDITOR=vim web rails credentials:edit

本番環境が用意できていればDBを作成する

$ docker compose -f docker-compose.production.yml run --rm web ./bin/rails db:create

本番環境で起動

本番環境コードを持ってくる

privateリポジトリの場合はこちらの記事が参考になる。config/master.keyを設定する(忘れがち)。

Githubのリポジトリにトークンを使ってアクセスする | Notes to Forget

VPSのnginxの設定

VPSにインストールしているnginxの設定をする。この記事を参考にする

nginxでunix sockを使用してリクエストを受け付ける | Notes to Forget

nginxをリスタートする。

$ nginx -t
$ sudo service nginx restart

起動

$ docker compose -f docker-compose.production.yml up -d

指定したドメインにアクセスして動いているか確認する。

サイトを更新する

サイトを更新するときはgit pullして以下のコマンドでコンテナをリスタートする

docker compose -f docker-compose.production.yml restart web

終わりに

慣れると一つのVPSで多くのサービスを展開できてとても便利。値段的にも月に1000円以下でできるのでかなり安いんじゃないかと思う。

コメント

タイトルとURLをコピーしました