Так, давайте отделим мух от котлет.
Задач я тут вижу две:
- Какую платформу использовать
- Как деплоить
Причем вторая зависит от первой, поэтому решать надо в той же последовательности.
Итак,
1: Выборов три:
- a. Server lease (когда вы просто арендуете конкретный выделенный или виртуальный сервер у провайдера)
- b. IaaS (например, AWS EC2) - то же самое, что "1.a", но можно мгновенно создавать и удалять
- c. PaaS (например, AWS BeansTalk, OpenShift, CloudFoundry) - когда вы вообще абстрагированы от понятия "сервер" и оперируете понятиями "ресурс".
Выбор тут основывается на вашем кошельке (чем ниже - тем дороже) и знаниях (чем ниже - тем проще).
2: Пришло время деплоить.
Если у вас PaaS, то вопрос деплоя хорошо покрыт в их инструкциях - и у каждого по своему.
Если у вас сервер, то лучше деплоить докером (а точнее docker compose). Делается это следующим образом. Сначала разбиваете свой сервис на максимально атомарные микро-сервисы.
Например, у вас получились: само приложение (RoR + sidekiq), PostgreSQL, Redis.
Соответственно, вы делаете три контейнера. Все три контейнера вы описываете в в файле docker-compose.yml
Но тут есть одно но. В то время, как PostgreSQL и Redis вы можете взять стандартные - и эти контейнеры уже готовы, то свой RoR вам нужно каждый раз доделывать. Ведь в нем могли измениться зависимости или что-то еще. Поэтому в docker-compose.yml вы один из контейнеров описываете со словом "build ." - это значит, что docker compose не будет пытаться его стягивать из интернета, а найдет файл Dockerfile и, согласно ему, построит имедж самостоятельно. А уже в этом имедже будет что-то типа:
# Please keep same version as in Gemfile (https://hub.docker.com/r/library/ruby/)
FROM ruby:2.3.4
ENV RACK_ENV development
COPY . /usr/share/website
WORKDIR /usr/share/website
RUN bundle install
CMD ["/usr/share/website/run_rails.sh", "/usr/share/website"]
В файле run_rails.sh будет что-то типа:
#!/bin/bash
cd $( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
export RACK_ENV=development
export SECRET_KEY_BASE=266a11dc19acc67107064dfddcecb4187545a08b35bd9a847c7b53545be22dbd8d115036024fcfc659f5936ba4a5df9a7d2a937797fv9d7v9fv7v97e9f430ff
bundle install
bundle exec rake db:migrate db:seed
bundle exec rake assets:precompile
find /usr/local/bundle -name guard
bundle exec foreman start --procfile Procfile.dev --port 8080
А сам docker-compose.yml будет похож на:
version: '3'
services:
pg:
image: postgres:9.6
environment:
- PGDATA=/var/lib/postgresql/data
- POSTGRES_DB=project_db_dev
- POSTGRES_USER=project_user
- POSTGRES_PASSWORD=project_password
volumes:
- ${PG_DATA_DIR}:/var/lib/postgresql
ports:
- 5432:5432
rd:
image: redis:4.0
ports:
- 6379:6379
ws:
build: .
volumes:
- .:/usr/share/website
ports:
- 8080:8080
depends_on:
- pg
- rd
Обратите внимание, что данные PostgreSQL находятся не на самом имедже - иначе их можно потерять при обновлении или удалении сервера.
Вот и вся ваша проблема.