
Docker 및 Nginx로 Rails 7 배포
Rails 애플리케이션을 배포하는 가장 쉬운 솔루션은 Heroku 또는 Hatchbox 또는 DigitalOcean Apps 입니다. 그러나 일부 소규모 프로젝트의 경우 기존 VPS를 사용하고 싶습니다.
Ubuntu 20.04 및 Docker 및 Nginx가 설치된 VPS가 있다고 가정합니다.
DigitalOcean를 사용하는 경우 마켓플레이스에서 Docker 이미지를 선택하고 Nginx를 추가할 수 있습니다.
로컬 컴퓨터에서 PostgreSQL , esbuild 및 Tailwind 를 사용하여 새 Rails 프로젝트를 만들 수 있습니다.
데이터베이스 설정으로 config/database.yml을 조정합니다.
비계 간단한 테이블:
그런 다음 데이터베이스와 테이블을 만듭니다.
route.rb에서 루트 경로를 생성할 수 있습니다.
이제 다음을 사용하여 웹사이트를 시작할 수 있습니다.
VPS로 가자. Github으로 코드를 전송합니다.
대규모 프로젝트의 경우 CI를 사용할 수 있지만 이것은 작은 프로젝트일 뿐입니다.
빌드 단계를 수행하고 레일을 시작하기 위해 작은 셸 스크립트를 만드는 것을 선호합니다.
이것은
다음을 사용하여 실행 가능하게 만들어 보겠습니다.
이제 Dockerfile을 만듭니다.
master.key 파일은 안전을 위해 git에 없습니다.
이에 대한 몇 가지 솔루션이 있지만 서버에서 파일을 다시 만듭니다.
이제 도커 이미지를 만들 차례입니다.
데모 프로젝트의 루트 폴더 내에서 다음을 실행합니다.
이제
그것을 실행하자:
도커 컨테이너는 포트 3000을 노출하고 있지만 이미 포트 3000에서 실행 중인 다른 웹 사이트가 있으므로 3001에 매핑합니다.
별도의 Postgres 서버가 있어야 하지만 Docker 내부에서도 실행합니다.
이 컨테이너에 대한 액세스를 허용하기 위해 별도의 네트워크를 만들고 여기에 두 개의 컨테이너를 추가합니다.
database.yml에서는 postgres_container를 호스트로 사용할 수 있습니다.
데이터베이스 및 테이블을 생성하려면:
오류가 있는 경우
Nginx를 다른 Rails 프로젝트에 대한 프록시로 사용하고 자산을 직접 로드합니다.
새 구성을 만들려면:
그리고 이것은 내용입니다: (도메인과 경로를 변경해야 합니다)
활성화:
구성을 테스트합니다.
그리고 Nginx를 다시 시작하십시오.
이제 작동하는 웹 사이트가 있어야 합니다.
certbot 도구로 Let's Encrypt를 추가하는 것이 좋습니다.
이에 대해 설명합니다here.
Ubuntu 20.04 및 Docker 및 Nginx가 설치된 VPS가 있다고 가정합니다.
DigitalOcean를 사용하는 경우 마켓플레이스에서 Docker 이미지를 선택하고 Nginx를 추가할 수 있습니다.
새로운 Rails 7 앱
로컬 컴퓨터에서 PostgreSQL , esbuild 및 Tailwind 를 사용하여 새 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.