查看创建项目的参数

rails new -h

个人经验使用以下命令

rails new demo -d postures -B -T --skip-webpack-install --skip-turbolinks --skip-javascript --skip-sprockets

config/application.rb

config.time_zone = 'Asia/Shanghai'

config.eager_load_paths += Dir[Rails.root.join('services')]
config.eager_load_paths += Dir[Rails.root.join('lib')]

config.active_job.queue_adapter = :sidekiq
config.active_job.queue_name_prefix = Rails.env
config.active_job.queue_name_delimiter = '_'

Gemfile

gem 'redis', '~> 4.0'
gem 'redis-namespace'
gem 'redis-objects'

gem 'sidekiq'
gem 'sidekiq-scheduler'

gem 'kaminari'

gem 'config'

gem 'rails_param'

gem 'oj'

gem 'rack-cors'

gem 'aasm'

gem 'awesome_print'
gem 'pry-rails'

gem 'exception_notification'

gem 'lograge'
gem 'logstash-event'
gem 'logstash-logger'

gem 'rubocop-rails'

group :development do
  gem 'annotate'
end

config/setting.yml

redis:
  host: 127.0.0.1
  password: password
  namespace: demo
  port: 6379
  queue: 1
  cache: 2
  object_db: 3
  sidekiq_db: 4
  expires_in: 3600

执行安装命令

rails g config:install
rails g kaminari:config
rails g exception_notification:install --sidekiq
rails g annotate:install

annotate --models

config/routes.rb

require 'sidekiq/web'
require 'sidekiq-scheduler/web'

Rails.application.routes.draw do
  mount Sidekiq::Web, at: '/sidekiq'

  root 'home#index'
end

config/initializer/redis.rb

require 'sidekiq/scheduler'

redis_params = {
  host: Settings.redis.host,
  port: Settings.redis.port,
  password: Settings.redis.password,
  id: nil
}

$redis = Redis::Namespace.new(
  Settings.redis.namespace,
  redis: Redis.new(redis_params.merge(db: Settings.redis.queue))
)

Redis.current = Redis::Namespace.new(
  Settings.redis.namespace,
  redis: Redis.new(redis_params.merge(db: Settings.redis.object_db))
)

Sidekiq.configure_server do |config|
  config.redis = redis_params.merge(db: Settings.redis.sidekiq_db)
end

Sidekiq.configure_client do |config|
  config.redis = redis_params.merge(db: Settings.redis.sidekiq_db)
end

Sidekiq.configure_server do |config|
  config.on(:startup) do
    Sidekiq.schedule = YAML.load_file(File.expand_path('../scheduler.yml', __dir__))
    Sidekiq::Scheduler.reload_schedule!
  end
end

Dockerfile

FROM ruby:2.6.3-alpine3.9

WORKDIR /app

RUN echo "http://mirrors.aliyun.com/alpine/v3.9/main/" | tee /etc/apk/repositories

RUN gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/ \
    && bundle config mirror.https://rubygems.org https://gems.ruby-china.com

COPY Gemfile Gemfile.lock ./

RUN apk update \
  && apk upgrade \
  && apk add --no-cache bash bash-doc bash-completion build-base tzdata libstdc++ \
  && bundle install --deployment --without development:test:doc \
  && rm -rf /var/cache/apk/*

COPY ./ ./

.rubocop.yml

rubocop --require rubocop-rails -a

require: rubocop-rails
AllCops:
  TargetRubyVersion: 2.6.3
  Exclude:
    - 'config/routes.rb'
    - 'tmp/**/*'
    - 'db/schema.rb'