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円以下でできるのでかなり安いんじゃないかと思う。
コメント