Самое простое решение для развертывания приложения 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»