Docker 및 Nginx로 Rails 7 배포
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.
Reference
이 문제에 관하여(Docker 및 Nginx로 Rails 7 배포), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/r03/deploy-rails-7-with-docker-and-nginx-b11텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)