Не удается получить доступ к ресурсам — докеризованное приложение Rails, nginx в качестве обратного прокси-сервера

#ruby-on-rails #docker #nginx #ruby-on-rails-6

Вопрос:

Я пытаюсь запустить свое тестовое приложение на производстве. Я закрепил его с помощью ниже Dockerfile :

 FROM ruby:3.0.2

WORKDIR /app

COPY Gemfile Gemfile.lock ./
RUN bundle install

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt-get update amp;amp; apt-get install -y yarn

COPY . ./

RUN bin/rails assets:precompile

CMD ["rails", "server", "-b", "0.0.0.0"]
 

Моя sites-enabled конфигурация для этого сайта выглядит так:

 server {
  server_name   mywebsite.com;

  location / {
    proxy_pass  http://localhost:3000;
  }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mywebsite.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mywebsite.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server {
    if ($host = mywebsite.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


  listen        80;
  server_name   mywebsite.com;
    return 404; # managed by Certbot
}
 

И я запускаю его вручную с помощью этой команды:

 sudo docker run -p 3000:3000 -e DATABASE_NAME=dbname -e DATABASE_USER=dbuser -e DATABASE_PASSWORD=dbpassword -e RAILS_ENV=production -e DATABASE_HOST=my_ip -d 72b09817c012
 

Это работает, но я получаю 404 по всем файлам активов:

 https://mywebsite.com/assets/application-04024382391bb910584145d8113cf35ef376b55d125bb4516cebeb14ce788597.css
https://mywebsite.com/packs/css/application-1f2a30e1.css
https://mywebsite.com/packs/js/application-98802c4d22f32af59b73.js
 

Когда я вхожу в запущенный контейнер и проверяю public/assets public/packs , в каких папках находятся файлы.

Есть идеи, чего мне здесь не хватает?

Комментарии:

1. Если с сервера вы curl http://127.0.0.1:3000/assets/application-04024382391bb910584145d8113cf35ef376b55d125bb4516cebeb14ce788597.css все равно получите 404?

2. @Clauz нет, он работает на сервере

Ответ №1:

В производстве Rails по умолчанию не обслуживает статические ресурсы (при условии, что вы будете размещать их на CDN). Вы можете изменить это с помощью настройки конфигурации: https://edgeguides.rubyonrails.org/configuring.html#config-public-file-server-enabled

 # in: environments/production.rb

Rails.application.configure do
  # ...
  config.public_file_server.enabled = true
  # ...
end