【问题标题】:Rails assets missing after Capistrano deployCapistrano 部署后 Rails 资产丢失
【发布时间】:2023-04-06 23:08:01
【问题描述】:

我正在构建一个 VPS,它通过 Capistrano 进行部署,连接了数据库等,但该页面没有可用的资产 - 它只是基本的 html。

资产似乎已编译,并存在于 shared 目录中。

来自页面html:

<link href="/assets/application-a1b5d69aeaff709fd3dce163c559b38b.css" media="all" rel="stylesheet" type="text/css" />
<script src="/assets/application-0ebd07089629f8c6880dddfb688d525d.js" type="text/javascript"></script>

资产文件似乎存在于 shared 目录中:

assay@assaypipeline:~/apps/assay/shared/assets$ ls application-  a1b5d69aeaff709fd3dce163c559b38b.css
application-a1b5d69aeaff709fd3dce163c559b38b.css

当我查看、来源然后单击指向资产路径的超链接时,我得到一个 404 not found from Nginx。

解决方案

感谢 Martin M(已接受答案)的帮助。我采取的步骤,来自服务器上的 ~/apps/(app name)/current 目录。

$ bundle install
$ RAILS_ENV=production bundle exec rake assets:precompile
$ sudo service nginx restart

显然,最好将其包含在 Capistrano 食谱中。

*编辑 - Capfile *

load 'deploy'
load 'deploy/assets'
load 'config/deploy'

【问题讨论】:

    标签: ruby-on-rails nginx capistrano asset-pipeline


    【解决方案1】:

    您的预编译资产应位于public/assets,请参阅rails guides
    通常你通过运行来创建它们

    RAILS_ENV=production bundle exec rake assets:precompile
    

    作为部署的一部分。
    共享的东西是在多个部署中提供旧的东西。

    另请参阅question

    【讨论】:

    • 感谢您的回答。预编译应该在开发机器还是生产服务器上运行?有什么方法可以将它包含在 Cap 部署中?
    • “标准”方式是在Capfile 中激活load 'deploy/assets' 行。它在每次部署时在服务器上运行precompile。
    • 我确实有。我已经在上面添加了我的 capfile。
    • 老实说,我只在需要时使用 hack 来预编译 MacBook 上的资产(比我的服务器快得多),并将 rsync 预编译到生产服务器。看到这个gist,我的config/deploy.rb中的一些代码。
    【解决方案2】:

    问题可能不在资产编译和部署中。 尝试更改 nginx root /home/deploy/app_name/public;到/home/deploy/app_name/current/public;在 nginx 配置文件 /etc/nginx/sites-enabled/default.

    sudo nano /etc/nginx/sites-enabled/default
    

    下面是我的配置文件

    upstream app {
      # Path to Puma SOCK file, as defined previously
      server unix:/home/deploy/app_name/shared/tmp/sockets/puma.sock fail_timeout=0;
    }
    server {
      listen 80;
      server_name localhost;
    
      root /home/deploy/app_name/current/public;
    
      try_files $uri/index.html $uri @app;
    
      location / {
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_set_header Connection '';
        proxy_pass http://app;
      }
    
      location ~ ^/(assets|fonts|system)/|favicon.ico|robots.txt {
        gzip_static on;
        expires max;
        add_header Cache-Control public;
      }
    
      error_page 500 502 503 504 /500.html;
      client_max_body_size 4G;
      keepalive_timeout 10;
    }
    

    希望对你有帮助

    【讨论】:

    • 太棒了!这就是问题所在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多