Docker 및 Nginx로 Rails 7 배포

Rails 애플리케이션을 배포하는 가장 쉬운 솔루션은 Heroku 또는 Hatchbox 또는 DigitalOcean Apps 과 같은 것입니다. 그러나 일부 소규모 프로젝트의 경우 기존 VPS를 사용하고 싶습니다.

Ubuntu 20.04와 Docker 및 Nginx가 설치된 VPS가 있다고 가정합니다.
DigitalOcean을 사용하는 경우 마켓플레이스에서 Docker 이미지를 선택하고 Nginx를 추가할 수 있습니다.

새로운 Rails 7 앱



로컬 컴퓨터에서 PostgreSQL , esbuildTailwind을 사용하여 새 Rails 프로젝트를 생성해 보겠습니다.

rails new demo -d postgresql --edge -j esbuild --css tailwind


데이터베이스 설정으로 config/database.yml을 조정하십시오.

간단한 테이블을 스캐폴드합니다.

bin/rails g scaffold Book name:string


그런 다음 데이터베이스와 테이블을 만듭니다.

bin/rails db:create
bin/rails db:migrate


route.rb에서 루트 경로를 만들 수 있습니다.

root "books#index"


이제 다음을 사용하여 웹사이트를 시작할 수 있습니다.

bin/dev


도커



VPS로 이동합니다. Github로 코드를 전송합니다.
대규모 프로젝트의 경우 CI를 사용할 수 있지만 이는 소규모 프로젝트일 뿐입니다.

나는 빌드 단계를 수행하고 레일을 시작하기 위해 작은 쉘 스크립트를 만드는 것을 선호합니다.
이것은 bin/prod의 내용입니다.

#!/usr/bin/env bash
export RAILS_ENV=production
bundle install
yarn install
yarn build
yarn build:css
bin/rails assets:precompile
bin/rails server -b 0.0.0.0


다음을 사용하여 실행 가능하게 만들어 보겠습니다. chmod a+x bin/prod
이제 Dockerfile을 만듭니다.

FROM ruby:3
RUN apt-get update -qq && apt-get install -y nodejs npm postgresql-client
RUN npm install -g yarn
RUN gem update --system

# use a global path instead of vendor
ENV GEM_HOME="/usr/local/bundle"
ENV BUNDLE_PATH="$GEM_HOME"
ENV BUNDLE_SILENCE_ROOT_WARNING=1
ENV BUNDLE_APP_CONFIG="$GEM_HOME"
ENV PATH="$GEM_HOME/bin:$BUNDLE_PATH/gems/bin:${PATH}"

# make 'docker logs' work
ENV RAILS_LOG_TO_STDOUT=true

# copy the source
WORKDIR /app
COPY . /app
RUN rm -f tmp/pids/server.pid
RUN bundle install

# build and start
CMD ["bin/prod"]


master.key 파일은 안전을 위해 git에 없습니다.
이에 대한 몇 가지 솔루션이 있지만 서버에서 파일을 다시 만듭니다.

echo "30acf9tralalalalala7af75eb7" > config/master.key


이제 도커 이미지를 만들 차례입니다.
데모 프로젝트의 루트 폴더 내에서 다음을 실행합니다.

docker build -t demo:0.0.1 .


이제 docker images가 포함된 이미지가 표시됩니다.

실행하자:

docker run -d -p 3001:3000 --name demo --env RAILS_ENV=production -v ~/demo:/app demo:0.0.1


도커 컨테이너가 포트 3000을 노출하고 있지만 이미 포트 3000에서 실행 중인 다른 웹사이트가 있으므로 이를 3001에 매핑합니다.

아마도 별도의 Postgres 서버가 있어야 하지만 Docker 내부에서도 실행합니다.
이 컨테이너에 대한 액세스를 허용하기 위해 별도의 네트워크를 만들고 그 안에 두 개의 컨테이너를 추가합니다.
database.yml에서 postgres_container를 호스트로 사용할 수 있습니다.

docker network create demo_network
docker network connect demo_network demo
docker network connect demo_network postgres_container


데이터베이스와 테이블을 생성하려면:

docker exec demo bin/rails db:create
docker exec demo bin/rails db:migrate


오류가 있는 경우 docker logs demo를 사용하여 오류를 찾을 수 있습니다.

엔진엑스



저는 Nginx를 다른 Rails 프로젝트에 대한 프록시로 사용하고 자산을 직접 로드합니다.
새 구성을 만들려면:

sudo vi /etc/nginx/sites-available/demo


내용은 다음과 같습니다. (도메인과 경로를 변경해야 합니다.)

upstream demo {
  server localhost:3001;
}

server {
  server_name demo.example.org;

  root /home/user/demo/public;
  access_log /home/user/demo/log/nginx.access.log;
  error_log /home/user/demo/log/nginx.error.log info;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @demo;
  location @demo {
    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-Ssl on; # Optional
    proxy_set_header  X-Forwarded-Port $server_port;
    proxy_set_header  X-Forwarded-Host $host;

    proxy_redirect off;

    proxy_pass http://demo;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 100M;
  keepalive_timeout 10;
}


활성화:

sudo ln -s /etc/nginx/sites-available/demo /etc/nginx/sites-enabled/demo


구성을 테스트합니다.

sudo nginx -t


그리고 Nginx를 다시 시작합니다.

sudo systemctl restart nginx


이제 작동하는 웹사이트가 있어야 합니다.
certbot 도구로 Let's Encrypt를 추가하는 것이 좋습니다.
이에 대해 설명합니다here.

좋은 웹페이지 즐겨찾기