Рубрики
Uncategorized

Развернуть Rails 7 с Docker и Nginx

Самое простое решение для развертывания приложения Rails — это что -то вроде Heroku, Hatchbox или … Tagged with Rails, Docker, Nginx, DevOps.

Самое простое решение для развертывания приложения Rails — это нечто вроде Хероку или Hatchbox или Digitalocean Apps Анкет Но Для некоторых небольших проектов мне нравится использовать свои существующие VPS.

Я предполагаю, что у вас есть VPS с Ubuntu 20.04 и Docker и Nginx. Если вы используете Digitalocean Вы можете выбрать изображение Docker на рынке и добавить к нему Nginx.

Приложение New Rails 7

Давайте создадим новый проект Rails с Postgresql , Esbuild и Творкий ветер На вашей местной машине:

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

Вы можете создать корневой путь в routes.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. Запустите это внутри корневой папки демонстрационного проекта:

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

Контейнер Docker разоблачает порт 3000, но я сопоставляю это 3001, так как у меня уже есть другой веб -сайт, работающий на порту 3000.

У вас, вероятно, должен быть отдельный сервер 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

Я использую 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. Это объяснено Здесь Анкет

Оригинал: «https://dev.to/roelandmoors/deploy-rails-7-with-docker-and-nginx-b11»