动作电缆不配合生产设计

时间:2019-01-10 21:53:38

标签: ruby-on-rails devise actioncable

我无法在docker上的ubuntu服务器上正确运行actioncable

这似乎是设计的一种身份验证错误,这是我的终端日志

<div class="container-fluid">

    <div class="row top">
        <h2>something in top</h2>
    </div>

    <div id="middle">
        <div class="row">
            <!-- Full Page Divs -->
            <div class="col-sm-12">
                <h1> FULL PAGE </h1>
            </div>
        </div>
        <!-- End Full Page Divs -->

        <!-- Half Page Divs -->
        <div class="row">
            <div class="col-sm-6">
                <h1> left half </h1>
            </div>

            <div class="col-sm-6">
                <h1> right half </h1>

            </div>
        </div>
        <!-- End Half Page Divs -->

        <!-- Quarter Page Divs -->

        <!-- Left -->
        <div class="row">
            <div class="col-sm-6" id="leftColumnQtr">
                <div class="row">
                    <div class="col-sm-12">
                        <h1>topLeftContent</h1>
                    </div>
                    <div class="col-sm-12">
                        <h1>bottomLeftContent</h1>
                    </div>
                </div>
            </div>

            <div class="col-sm-6" id="rightColumnQtrHalf">
                <div class="col-sm-12">
                    <h1>Right half</h1>
                </div>
            </div>
        </div>

        <!-- right -->
        <div class="row">
            <div class="col-sm-6" id="rightColumnQtrHalf">
                <div class="col-sm-12">
                    <h1>Left half</h1>
                </div>
            </div>

            <div class="col-sm-6" id="leftColumnQtr">
                <div class="row">
                    <div class="col-sm-12">
                        <h1>top right Content</h1>
                    </div>
                    <div class="col-sm-12">
                        <h1>bottom right Content</h1>
                    </div>
                </div>
            </div>
        </div>
        <!-- End Quarter Page Divs -->
        <!-- BONUS: may be this is what you wanted too -->

        <div class="row">
            <div class="col-sm-6">
                <div class="row">
                    <div class="col-sm-6">
                        <div class="col-sm-12">
                            <h1>top Left Content</h1>
                        </div>
                        <div class="col-sm-12">
                            <h1>bottom Left Content</h1>
                        </div>
                    </div>
                    <div class="col-sm-6" id="rightColumnQtrHalf">
                        <div class="col-sm-12">
                            <h1>Right half</h1>
                        </div>
                    </div>
                </div>
            </div>
            <div class="col-sm-6">
                <div class="row">
                    <div class="col-sm-6">
                        <div class="col-sm-12">
                            <h1>Left half</h1>
                        </div>
                    </div>
                    <div class="col-sm-6">
                        <div class="col-sm-12">
                            <h1>top right Content</h1>
                        </div>
                        <div class="col-sm-12">
                            <h1>bottom right Content</h1>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <!-- End Row Middle -->
    <div class="row bottom">
        <h2>something in bottom</h2>
    </div>
</div>

这是我的/app/chanels/application_cable/connection.rb

  There was an exception - NoMethodError(undefined method `user' for nil:NilClass)
        cable_1    | /var/www/acim/public/app/channels/application_cable/connection.rb:17:in `find_verified_user'

*这里是config / environemments / production.rb *


        module ApplicationCable
          class Connection < ActionCable::Connection::Base
            identified_by :current_user

            def connect
              self.current_user = find_verified_user
              logger.add_tags 'ActionCable', current_user.email
            end

            protected

            def find_verified_user
              if (current_user = env['warden'].user)
              #if current_user = User.find_by(id: cookies.signed[:user_id])
                current_user
              else
                reject_unauthorized_connection
              end
            end
          end
        end

这是我的docker-compose.yml文件


            Rails.application.configure do
              # Settings specified here will take precedence over those in config/application.rb.

              # Code is not reloaded between requests.
              config.cache_classes = true

              # Eager load code on boot. This eager loads most of Rails and
              # your application in memory, allowing both threaded web servers
              # and those relying on copy on write to perform better.
              # Rake tasks automatically ignore this option for performance.
              config.eager_load = true

              # Full error reports are disabled and caching is turned on.
              config.consider_all_requests_local       = true
              config.action_controller.perform_caching = true

              # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"]
              # or in config/master.key. This key is used to decrypt credentials (and other encrypted files).
              # config.require_master_key = true

              # Disable serving static files from the `/public` folder by default since
              # Apache or NGINX already handles this.
              config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

              # Compress JavaScripts and CSS.
              config.assets.js_compressor = :uglifier
              # config.assets.css_compressor = :sass

              # Do not fallback to assets pipeline if a precompiled asset is missed.
              config.assets.compile = false

              # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb

              # Enable serving of images, stylesheets, and JavaScripts from an asset server.
              # config.action_controller.asset_host = 'http://assets.example.com'

              # Specifies the header that your server uses for sending files.
              # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
               config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX


              # Store uploaded files on the local file system (see config/storage.yml for options)
              config.active_storage.service = :local

              # Mount Action Cable outside main process or domain
              # config.action_cable.mount_path = nil
              config.action_cable.url = 'ws://192.168.99.100/cable'
              config.action_cable.allowed_request_origins = [ 'http://192.168.99.100', /http:\/\/192.168.99.100.*/, 'http://localhost' ]

              #config.action_cable.url = [/ws:\/\/*/, /wss:\/\/*/]
              #config.action_cable.allowed_request_origins = [/http:\/\/*/, /https:\/\/*/]

              # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
              # config.force_ssl = true

              # Use the lowest log level to ensure availability of diagnostic information
              # when problems arise.
              config.log_level = :debug

              # Prepend all log lines with the following tags.
              config.log_tags = [ :request_id ]

              # Use a different cache store in production.
              # config.cache_store = :mem_cache_store

              # Use a real queuing backend for Active Job (and separate queues per environment)
              # config.active_job.queue_adapter     = :resque
              # config.active_job.queue_name_prefix = "ACIM_#{Rails.env}"

              config.action_mailer.perform_caching = false

              # Ignore bad email addresses and do not raise email delivery errors.
              # Set this to true and configure the email server for immediate delivery to raise delivery errors.
              # config.action_mailer.raise_delivery_errors = false

              # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
              # the I18n.default_locale when a translation cannot be found).
              config.i18n.fallbacks = true

              # Send deprecation notices to registered listeners.
              config.active_support.deprecation = :notify

              # Use default logging formatter so that PID and timestamp are not suppressed.
              config.log_formatter = ::Logger::Formatter.new

              # Use a different logger for distributed setups.
              # require 'syslog/logger'
              # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name')

              if ENV["RAILS_LOG_TO_STDOUT"].present?
                logger           = ActiveSupport::Logger.new(STDOUT)
                logger.formatter = config.log_formatter
                config.logger    = ActiveSupport::TaggedLogging.new(logger)
              end

              # Do not dump schema after migrations.
              config.active_record.dump_schema_after_migration = false


              # ne pas directement servir les fichiers public 
              # en utilisant ruby, mais passons par NGINX
              config.public_file_server.enabled = false
              config.assets.js_compressor = Uglifier.new(harmony: true)
            end
    Rails.application.config.assets.precompile += %w( *.js ^[^_]*.css *.css.erb )

请帮助

自从两天以来,这真是我的命!

预先感谢

2 个答案:

答案 0 :(得分:1)

我有一个使用您已经评论过的warden cookie变体以及一个warden_hooks初始化程序来管理cookie的创建和无效的有效设置

/app/chanels/application_cable/connection.rb

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user
    end

    private

    def find_verified_user
      if current_user = User.find_by(id: cookies.signed['user_token'])
        current_user.id
      else
        reject_unauthorized_connection
      end
    end
  end
end

/app/config/initializers/warden_hooks.rb

# frozen_string_literal: true

# Set user_token cookie after sign in
Warden::Manager.after_set_user do |user, auth, opts|
  scope = opts[:scope]
  auth.cookies.signed["#{scope}_token"] = user.id
end

# Invalidate user.id cookie on sign out
Warden::Manager.before_logout do |user, auth, opts|
  scope = opts[:scope]
  auth.cookies.signed["#{scope}_token"] = nil
end

答案 1 :(得分:0)

最后,我可以在进行一些更改后使所有功能正常运行,因此在可以帮助某人的情况下,对我有用的是

/app/chanels/application_cable/connection.rb

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      # This is a websocket so we have no warden and no session here
      # How to reuse the login made with devise?
      # http://www.rubytutorial.io/actioncable-devise-authentication/
      self.current_user = find_verified_user
      logger.info("current_user: #{self.current_user.inspect}")
      logger.add_tags "ActionCable", current_user.email
    end

    protected
    def find_verified_user
      verified_user = User.find_by(id: cookies.signed['user.id'])
      if verified_user && cookies.signed['user.expires_at'] > Time.now      
        verified_user
      else
        reject_unauthorized_connection
      end
    end

  end
end

/app/config/initializers/warden_hooks.rb

# http://www.rubytutorial.io/actioncable-devise-authentication/
Warden::Manager.after_set_user do |user,auth,opts|
    scope = opts[:scope]
    auth.cookies.signed["#{scope}.id"] = user.id
    auth.cookies.signed["#{scope}.expires_at"] = 30.minutes.from_now
end  

Warden::Manager.before_logout do |user, auth, opts|
    scope = opts[:scope]
    auth.cookies.signed["#{scope}.id"] = nil
    auth.cookies.signed["#{scope}.expires_at"] = nil
end

** config / environemments / production.rb **

Rails.application.configure do
  # Settings specified here will take precedence over those in config/application.rb.

  # Code is not reloaded between requests.
  config.cache_classes = true

  # Eager load code on boot. This eager loads most of Rails and
  # your application in memory, allowing both threaded web servers
  # and those relying on copy on write to perform better.
  # Rake tasks automatically ignore this option for performance.
  config.eager_load = true

  # Full error reports are disabled and caching is turned on.
  config.consider_all_requests_local       = true
  config.action_controller.perform_caching = true

  # Ensures that a master key has been made available in either ENV["RAILS_MASTER_KEY"]
  # or in config/master.key. This key is used to decrypt credentials (and other encrypted files).
  # config.require_master_key = true

  # Disable serving static files from the `/public` folder by default since
  # Apache or NGINX already handles this.
  config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

  # Compress JavaScripts and CSS.
  config.assets.js_compressor = :uglifier
  # config.assets.css_compressor = :sass

  # Do not fallback to assets pipeline if a precompiled asset is missed.
  config.assets.compile = false

  # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb

  # Enable serving of images, stylesheets, and JavaScripts from an asset server.
  # config.action_controller.asset_host = 'http://assets.example.com'

  # Specifies the header that your server uses for sending files.
  # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
   config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX


  # Store uploaded files on the local file system (see config/storage.yml for options)
  config.active_storage.service = :local

  # Mount Action Cable outside main process or domain
  # config.action_cable.mount_path = nil
  #config.action_cable.url = 'ws://192.168.99.100/cable'
  #config.action_cable.allowed_request_origins = [ 'http://192.168.99.100', /http:\/\/192.168.99.100.*/, 'http://localhost' ]

  config.action_cable.url = 'ws://192.168.99.100/cable'
  config.action_cable.allowed_request_origins = [/http:\/\/*/, /https:\/\/*/]

  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
  # config.force_ssl = true

  # Use the lowest log level to ensure availability of diagnostic information
  # when problems arise.
  config.log_level = :debug

  # Prepend all log lines with the following tags.
  config.log_tags = [ :request_id ]

  # Use a different cache store in production.
  # config.cache_store = :mem_cache_store

  # Use a real queuing backend for Active Job (and separate queues per environment)
  # config.active_job.queue_adapter     = :resque
  # config.active_job.queue_name_prefix = "ACIM_#{Rails.env}"

  config.action_mailer.perform_caching = false

  # Ignore bad email addresses and do not raise email delivery errors.
  # Set this to true and configure the email server for immediate delivery to raise delivery errors.
  # config.action_mailer.raise_delivery_errors = false

  # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
  # the I18n.default_locale when a translation cannot be found).
  config.i18n.fallbacks = true

  # Send deprecation notices to registered listeners.
  config.active_support.deprecation = :notify

  # Use default logging formatter so that PID and timestamp are not suppressed.
  config.log_formatter = ::Logger::Formatter.new

  # Use a different logger for distributed setups.
  # require 'syslog/logger'
  # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name')

  if ENV["RAILS_LOG_TO_STDOUT"].present?
    logger           = ActiveSupport::Logger.new(STDOUT)
    logger.formatter = config.log_formatter
    config.logger    = ActiveSupport::TaggedLogging.new(logger)
  end

  # Do not dump schema after migrations.
  config.active_record.dump_schema_after_migration = false


  # ne pas directement servir les fichiers public 
  # en utilisant ruby, mais passons par NGINX
  config.public_file_server.enabled = false
  config.assets.js_compressor = Uglifier.new(harmony: true)
end

Rails.application.config.assets.precompile += %w( *.js ^[^_]*.css *.css.erb )

config / initializers / sidekiq.yml

Sidekiq.configure_server do |config|
  config.redis = { url: 'redis://192.168.99.100:6379' }
end

Sidekiq.configure_client do |config|
  config.redis = { url: 'redis://192.168.99.100:6379' }
end

** Dockerfile **

FROM ruby:2.5.1

# Install dependencies
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

ENV RAILS_ROOT /var/www/acim/public
RUN mkdir -p $RAILS_ROOT
RUN mkdir -p $RAILS_ROOT/log
RUN rm -rf /var/www/acim/public/tmp/pids/server.pid

# Set working directory, where the commands will be ran:
WORKDIR $RAILS_ROOT

# Setting env up
ENV RAILS_ENV='production'
ENV RACK_ENV='production'

# Adding gems
COPY Gemfile Gemfile
COPY Gemfile.lock Gemfile.lock
RUN bundle install --jobs 20 --retry 5 --without development test

# Adding project files
COPY . .
RUN bundle exec rake assets:precompile

EXPOSE 3000
CMD ["bundle", "exec", "puma", "-C", "config/puma.rb"]

docker-compose.yml

version: '3'
services:
  db:
    image: postgres:9.6
    environment:
      - ACIM_DATABASE_PASSWORD=ACIM_2018
    volumes:
      - 'db:/var/lib/postgresql/data'
    env_file:
      - '.env'
    expose:
      - '5432'
    ports:
      - "7000:5432"
  nginx: 
    image: nginx:latest
    container_name: production_nginx
    volumes:
      - ./config/nginx/nginx.conf:/etc/nginx/nginx.conf
      - public-content:/var/www/acim/public
    ports:
      - 80:80
      - 443:443
    links:
    - web

  # maildev:
  #   image: djfarrelly/maildev
  #   ports:
  #     - "2000:80"

  redis:
    image: redis
    command: redis-server
    volumes:
      - 'redis:/data'
    ports:
      - "6379:6379"

  sidekiq:
    build: .
    #command: sidekiq -C config/sidekiq.yml
    command: bundle exec sidekiq
    volumes:
      - .:/ACIM
    links:
      - db
      - redis
    depends_on:
      - db
      - redis
    env_file:
      - '.env'
  web:
    build: .
    volumes:
      - bundle_cache:/bundle
      - public-content:/var/www/acim/public
      - .:/ACIM
    ports:
      - "5000:3000"
    depends_on:
      - db
      - redis
    env_file:
      - '.env'

  cable:
    depends_on:
      - 'redis'
      - 'sidekiq'
    build: .
    command: puma -p 28080 cable/config.ru
    ports:
      - '28080:28080'
    volumes:
      - '.:/ACIM'
    env_file:
      - '.env'

volumes:
  bundle_cache:
  redis:
  db:
  public-content: