Ruby On Rails: Mailer: Sidekiq - неверный путь к ресурсу в электронной почте: Engineyard: Nginx: Passenger

Я использовал Sidekiq для обработки электронной почты асинхронно. Он хорошо работает в среде разработки, однако он не отображает действительный URL ресурса в опубликованной электронной почте.

URL ожидаемого актива:
http://myapp.com/assets/logo-277121cb27cd5798ea5786fa2996c82f.png

Получил:
http://myapp.com/images/logo.png

я использую Engineyard как VPC. На производственных / промежуточных серверах у меня есть выделенный экземпляр утилиты с именем redis который состоит из redis server а также sidekiq экземпляры бегут. Они обрабатывают электронную почту должным образом, поэтому я думаю, что они в хорошем состоянии.

Конфигурация nginx в /data/nginx/servers/my_app.conf
cat /data/nginx/servers/my_app.conf

server {

  listen 81;

  server_name _;


  client_max_body_size 100M;

  root /data/my_app/current/public;

  access_log /var/log/engineyard/nginx/my_app.access.log main;
  error_log /var/log/engineyard/nginx/my_app.error.log notice;

  location ~ ^/(images|assets|javascripts|stylesheets)/ {
    expires 10y;
    try_files  $uri $uri/index.html /last_assets/$uri /last_assets/$uri.html @app_my_app;
  }

  error_page 404 /404.html;
  error_page 500 502 504 /500.html;
  error_page 503 @503;
  recursive_error_pages on;
  location @503 {

    error_page 405 = /system/maintenance.html;

    if (-f $request_filename) {
      break;
    }

    rewrite ^(.*)$ /system/maintenance.html break;
  }

  location @app_my_app {

    passenger_enabled on;

    passenger_set_cgi_param HTTP_X_FORWARDED_FOR   $proxy_add_x_forwarded_for;
    passenger_set_cgi_param HTTP_X_REAL_IP         $remote_addr;
    passenger_set_cgi_param HTTP_HOST              $http_host;
    passenger_set_cgi_param HTTP_X_FORWARDED_PROTO $scheme;
    passenger_set_cgi_param HTTP_X_REQUEST_START   't=$start_time';
    passenger_set_cgi_param HTTP_X_QUEUE_START     't=$start_time';

    passenger_set_cgi_param SERVER_PORT            80;

    rack_env staging;

    passenger_min_instances 2;
  }

  location / {
  if (-f $document_root/system/maintenance.html) { return 503; }
    try_files  $uri $uri/index.html $uri.html @app_my_app;
  }
include /etc/nginx/servers/my_app/custom.conf;
}

и я использовал вспомогательный метод, чтобы получить URL-адрес логотипа организации

  # Gets the logo URL of the Organization set by Controller/Mailer
  #   in instance variable @organization
  # @param [Organization] organization default value is nil
  # @return [String] URL for logo image
  def get_logo_url(organization = nil)
    if organization && organization.logo.present?
      # This case works as AWS S3 is used
      organization.logo_url(:logo)
    else
      # This case not working
      asset_url('logo.png')
    end
  end

Последние находки:
Я пытался отправить письмо из основного приложения без использования sidekiq И это работает в этом случае. Помощники актива, такие как asset_url, asset_path, image_path не удалось получить имя файла diegsted из файла манифеста.

3 ответа

Решение

Примечание: в качестве временного решения / лучшее решение все еще ищет

поскольку sidekiq были проблемы с обслуживанием статических активов, хранящихся как assets/images/logo.png,

URL ожидаемого актива:

http://myapp.com/assets/logo-277121cb27cd5798ea5786fa2996c82f.png

Получил:
http://myapp.com/images/logo.png

поэтому я на самом деле переместил файлы статических активов, которые мне могут понадобиться в электронной почте public/images каталог. Сейчас вместо Rails приложение, Nginx обслуживает активы. Сейчас работает

Мое последнее открытие (сомнение): я сомневаюсь, что мои поваренные книги шеф-повара не могут начать sidekiq и соответствующий Rails экземпляр для сидекик в production / staging среда.

Я столкнулся с той же проблемой. Проблема заключалась в том, что я не собирал ресурсы на сервере sidekiq, поэтому там не было манифеста.

Изменение в Capistrano от: task :compile_assets, roles: :app, primary: true do

чтобы: task :compile_assets, roles: [:app, :processor], primary: true do

исправил это в моем личном случае.

Я являюсь руководителем группы для машинного двора. Если бы вы могли открыть билет, мы могли бы расследовать немного больше от вашего имени.

Спасибо,

Ральф

Если кто-то использует capistrano 3, ему необходимо включить роль sidekiq (или роль сервера, на котором развернут ваш sidekiq) .... в противном случае capistrano компилирует ресурсы только для веб-роли

server 'testanywebsite.com', user: 'deploy-user', roles: %w(sidekiq)
set :assets_roles, [:web, :sidekiq]
Другие вопросы по тегам