NetrunНа главную

Сайты и приложения

Как выложить сайт на Ruby on Rails в интернет

· 5 мин чтения

Коротко

Чтобы выложить сайт на Ruby on Rails в интернет, нужен сервер, который поставит гемы по файлам Gemfile и Gemfile.lock, соберёт статику и запустит приложение на порту из переменной окружения PORT по адресу 0.0.0.0. Ключ приложения (содержимое master.key либо SECRET_KEY_BASE) и строку подключения к базе DATABASE_URL задают переменными окружения, а не кладут в папку с кодом. Проще всего загрузить код в Netrun: платформа сама определит, что перед ней Rails, поставит зависимости, соберёт проект и выдаст публичную ссылку с HTTPS. База данных при этом поднимается рядом отдельным сервисом или берётся внешняя.

Обычно, чтобы выложить сайт на Ruby on Rails, нужно арендовать сервер, поставить нужную версию Ruby, собрать гемы, настроить Puma, поставить перед ней nginx, выпустить сертификат, поднять базу, не забыть про сборку статики и придумать, куда положить ключ, которым Rails расшифровывает свои настройки. Каждый пункт по отдельности несложный, но вместе это вечер работы и ещё один вечер на выяснение, почему вместо сайта отдаётся страница «We are sorry».

В Netrun этой части нет: вы загружаете код, платформа видит Gemfile, ставит зависимости, собирает проект и выдаёт публичную ссылку с HTTPS. Ниже — что подготовить в самом проекте, чтобы всё сошлось с первого раза, и что чаще всего мешает сайту открыться.

  1. Положите в корень Gemfile и Gemfile.lock#

    Эти два файла должны лежать в корне проекта: по ним платформа понимает, что перед ней приложение на Ruby on Rails, и ставит ровно те версии гемов, на которых проект работает у вас. Gemfile.lock не удаляйте и не добавляйте в список игнорируемых файлов — без него версии могут разъехаться, и сборка сломается там, где локально всё было в порядке. Папку с уже установленными гемами (vendor/bundle) в архив класть не нужно.

  2. Отдайте порт и адрес платформе#

    Приложение должно слушать порт из переменной окружения PORT и адрес 0.0.0.0, а не привычные 3000 и localhost. Захардкоженный порт — причина номер один, почему после публикации ссылка не открывается: приложение работает, но не там, где его ждут. В стандартном config/puma.rb порт уже берётся из окружения, так что чаще всего достаточно ничего не менять и не подставлять своё значение вручную.

  3. Вынесите ключ приложения в секреты#

    Файл config/master.key и всё, что он расшифровывает, — это секреты: в архив и в репозиторий они попадать не должны. Содержимое master.key впишите при настройке проекта как значение RAILS_MASTER_KEY, либо задайте SECRET_KEY_BASE отдельной строкой, если зашифрованными настройками вы не пользуетесь. Netrun хранит такие значения в зашифрованном виде и подставляет их в переменные окружения — Rails прочитает их обычным способом. Заодно укажите RAILS_ENV со значением production, чтобы приложение работало в рабочем режиме, а не в отладочном.

  4. Уберите из архива всё, что собирается при публикации#

    Статика (assets) собирается на нашей стороне во время публикации, поэтому папку с готовой сборкой заранее готовить и загружать не нужно. Из архива смело убирайте vendor/bundle, node_modules, содержимое tmp и log, а также ранее собранные файлы в public/assets — они только раздувают загрузку и иногда мешают, подменяя свежую сборку старой. В репозитории на GitHub эти папки обычно уже перечислены в .gitignore, тогда делать ничего не нужно.

  5. Решите, где будет жить база данных#

    Управляемой базы как отдельной услуги у нас нет, поэтому вариантов два. Первый: поднять базу рядом отдельным сервисом в файле docker-compose (до пяти связанных сервисов в одном проекте) и обязательно подключить ей именованный том, иначе данные пропадут при первом же обновлении кода. Второй: взять внешнюю базу и вписать строку подключения при настройке проекта в переменную DATABASE_URL — Rails возьмёт её сам, без правки config/database.yml. SQLite подойдёт только для маленького проекта и только если файл базы лежит в постоянной папке /data.

  6. Загрузите код, накатите миграции и заберите ссылку#

    Загрузите проект ZIP-архивом или импортируйте репозиторий из GitHub, в том числе приватный. Миграции выполняет ваша команда запуска: положите в корень файл Procfile — это одна строка, которая описывает, как запускать приложение, и перед стартом сервера в ней можно вызвать rails db:migrate. Логи сборки и запуска видны в кабинете в реальном времени, поэтому причину видно сразу, а не приходится гадать по пустой странице. После публикации сайт на Rails открывается по своему адресу с HTTPS.

Итог: сайт на Rails открывается по своему адресу с защищённым соединением, без аренды сервера, ручной настройки веб-сервера и возни с сертификатом. На бесплатном тарифе сайт засыпает в простое и просыпается сам, когда кто-то открывает ссылку, — первый ответ после паузы чуть медленнее. На тарифе Pro простоев нет и можно привязать свой домен. Попробовать Netrun.

Частые вопросы

Куда девать master.key, если его нельзя класть в репозиторий?

Откройте файл config/master.key, скопируйте строку из него и впишите её при настройке проекта как значение RAILS_MASTER_KEY. Значение хранится в зашифрованном виде и подставляется в переменные окружения, а сам файл в архив и в репозиторий не попадает. Если зашифрованными настройками вы не пользуетесь, вместо этого задайте SECRET_KEY_BASE — Rails без него в рабочем режиме не стартует.

Нужно ли собирать статику заранее и загружать папку public/assets?

Нет. Статика собирается при сборке проекта на нашей стороне, поэтому готовить её у себя не нужно. Наоборот, старую собранную папку лучше убрать из архива: она увеличивает размер загрузки и может подменить свежую сборку прошлой версией. Если сборка у вас нестандартная, вызовите её своей командой запуска в файле Procfile перед стартом сервера.

Как выполнить миграции базы данных после публикации?

Терминала внутри проекта нет, поэтому миграции нужно выполнять автоматически при запуске приложения. Проще всего положить в корень файл Procfile и вызвать в нём rails db:migrate перед стартом сервера: тогда таблицы создаются и обновляются при каждой публикации. Второй вариант — вызывать миграции из кода при старте приложения.

Можно ли оставить SQLite вместо PostgreSQL?

Можно, если проект небольшой и файл базы лежит в постоянной папке /data. Файл рядом с кодом пересоздаётся при каждой публикации, и все записи пропадут. Учтите, что у проектов со своим docker-compose папки /data нет — там постоянное хранилище задаётся именованным томом в вашем файле. Для проекта, который растёт, лучше сразу взять PostgreSQL отдельным сервисом или внешнюю базу.

Как запустить Sidekiq и фоновые задачи?

Для Sidekiq нужен Redis, поэтому такой проект описывается файлом docker-compose: приложение, Redis и отдельный сервис с воркером — до пяти связанных сервисов в одном проекте. Строку подключения к Redis передавайте переменной окружения, как и остальные секреты. Если фоновая обработка нужна изредка, иногда проще обойтись без Sidekiq и делать работу прямо в приложении.

Почему сразу после публикации сайт отдаёт ошибку 500?

Чаще всего не задан ключ приложения (RAILS_MASTER_KEY или SECRET_KEY_BASE) или не накатились миграции — тогда приложение стартует, но падает на первом же запросе к базе. Точная причина видна в логах в кабинете: там пишется настоящая ошибка Rails, а не общая страница извинений. Третья по частоте причина — приложение слушает свой порт вместо порта из переменной окружения PORT.

Какие языки и технологии поддерживаются?

Python, Node.js, Go, Rust, Ruby, PHP, Java, .NET, Deno, Bun, Elixir, статические сайты и bash-скрипты. Можно принести свой Dockerfile или docker-compose, но чаще стек определяется по коду автоматически.

Можно ли запустить несколько сервисов сразу?

Да. Через docker-compose можно поднять до пяти связанных сервисов в одном проекте — например, приложение вместе с базой данных.

Можно ли подключить свой домен?

Да, на тарифе Pro, и не один: к сайту можно подключить столько своих доменов, сколько вам нужно. Откройте вкладку «Домены» на странице проекта, укажите домен, который вы купили у регистратора, и добавьте DNS-запись по подсказке — так же добавляется каждый следующий. Когда домены готовы, нажмите «Проверить»: Netrun проверит их все разом и выпустит на каждый свой HTTPS-сертификат, поэтому заминка с одним доменом не мешает остальным. Сайт открывается по любому из ваших адресов, а ссылка Netrun остаётся запасной. Если вы подключаете домен целиком (например myshop.com), можно добавить ещё одну запись, и сайт откроется и с www. Доступно для сайтов — боту и фоновому скрипту домен не нужен.

Почему мой сайт иногда засыпает?

На бесплатном тарифе сайты засыпают после простоя и просыпаются за пару секунд при первом запросе. На тарифе Pro проект работает без сна.

Запустите свой проект

Загрузите код, ответьте на пару вопросов — и получите рабочую ссылку. Есть бесплатный тариф

Попробовать Netrun
Все статьи блога