diff --git a/.env.example b/.env.example index 7f36aeffb..bc36e8588 100644 --- a/.env.example +++ b/.env.example @@ -1,12 +1,17 @@ -SECRET_KEY_BASE= +# Used to verify the integrity of signed cookies. so ensure a secure value is set +SECRET_KEY_BASE=replace_with_lengthy_secure_hex + +# Replace with the URL you are planning to use for your app +FRONTEND_URL=http://0.0.0.0:3000 + # Force all access to the app over SSL, default is set to false -FORCE_SSL= +FORCE_SSL=false # This lets you control new sign ups on your chatwoot installation # true : default option, allows sign ups # false : disables all the end points related to sign ups # api_only: disables the UI for signup, but you can create sign ups via the account apis -ENABLE_ACCOUNT_SIGNUP= +ENABLE_ACCOUNT_SIGNUP=true # Redis config REDIS_URL=redis://redis:6379 @@ -41,8 +46,7 @@ RAILS_INBOUND_EMAIL_PASSWORD= MAILGUN_INGRESS_SIGNING_KEY= MANDRILL_INGRESS_API_KEY= -# Misc -FRONTEND_URL=http://0.0.0.0:3000 +# Storage ACTIVE_STORAGE_SERVICE=local # Amazon S3 @@ -55,6 +59,8 @@ AWS_REGION= SENTRY_DSN= # Log settings +# Disable if you want to write logs to a file +RAILS_LOG_TO_STDOUT=true LOG_LEVEL=info LOG_SIZE=500 diff --git a/config/environments/production.rb b/config/environments/production.rb index 4d9785fc4..6dfb0c400 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -32,12 +32,15 @@ Rails.application.configure do # Apache or NGINX already handles this. config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? - # Compress CSS using a preprocessor. + # 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' @@ -45,13 +48,21 @@ Rails.application.configure do # 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). + # Store uploaded files on the local file system (see config/storage.yml for options) config.active_storage.service = ENV.fetch('ACTIVE_STORAGE_SERVICE', 'local').to_sym - # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. - config.force_ssl = ENV.fetch('FORCE_SSL', false) + # Mount Action Cable outside main process or domain + # config.action_cable.mount_path = nil + # config.action_cable.url = 'wss://example.com/cable' + if ENV['FRONTEND_URL'].present? + config.action_cable.allowed_request_origins = [ENV['FRONTEND_URL'], %r{https?://#{URI.parse(ENV['FRONTEND_URL']).host}(:[0-9]+)?}] + end - # customize using the environment variables + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + config.force_ssl = ActiveModel::Type::Boolean.new.cast(ENV.fetch('FORCE_SSL', false)) + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. config.log_level = ENV.fetch('LOG_LEVEL', 'info').to_sym # Prepend all log lines with the following tags. @@ -60,22 +71,11 @@ Rails.application.configure do # 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 = "chatwoot_production" + # Use a real queuing backend for Active Job (and separate queues per environment) + config.active_job.queue_adapter = :sidekiq + # config.active_job.queue_name_prefix = "Chatwoot_#{Rails.env}" config.action_mailer.perform_caching = false - config.action_mailer.default_url_options = { host: ENV['FRONTEND_URL'] } - config.action_mailer.smtp_settings = { - address: ENV['SMTP_ADDRESS'], - port: ENV['SMTP_PORT'] || 587, - user_name: ENV['SMTP_USERNAME'], - password: ENV['SMTP_PASSWORD'], - authentication: :login, - enable_starttls_auto: true - } - - Rails.application.routes.default_url_options = { host: ENV['FRONTEND_URL'] } # 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. @@ -84,7 +84,6 @@ Rails.application.configure do # 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 - config.active_job.queue_adapter = :sidekiq # Send deprecation notices to registered listeners. config.active_support.deprecation = :notify @@ -93,6 +92,9 @@ Rails.application.configure do 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 @@ -108,24 +110,16 @@ Rails.application.configure do # Do not dump schema after migrations. config.active_record.dump_schema_after_migration = false - # Inserts middleware to perform automatic connection switching. - # The `database_selector` hash is used to pass options to the DatabaseSelector - # middleware. The `delay` is used to determine how long to wait after a write - # to send a subsequent read to the primary. - # - # The `database_resolver` class is used by the middleware to determine which - # database is appropriate to use based on the time delay. - # - # The `database_resolver_context` class is used by the middleware to set - # timestamps for the last write to the primary. The resolver uses the context - # class timestamps to determine how long to wait before reading from the - # replica. - # - # By default Rails will store a last write timestamp in the session. The - # DatabaseSelector middleware is designed as such you can define your own - # strategy for connection switching and pass that into the middleware through - # these configuration options. - # config.active_record.database_selector = { delay: 2.seconds } - # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver - # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session + # Chatwoot production settings + config.action_mailer.default_url_options = { host: ENV['FRONTEND_URL'] } + config.action_mailer.smtp_settings = { + address: ENV['SMTP_ADDRESS'], + port: ENV['SMTP_PORT'] || 587, + user_name: ENV['SMTP_USERNAME'], + password: ENV['SMTP_PASSWORD'], + authentication: :login, + enable_starttls_auto: true + } + + Rails.application.routes.default_url_options = { host: ENV['FRONTEND_URL'] } end diff --git a/config/environments/staging.rb b/config/environments/staging.rb index b0bdc71ec..091c49386 100644 --- a/config/environments/staging.rb +++ b/config/environments/staging.rb @@ -40,7 +40,7 @@ Rails.application.configure do # config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ] # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. - config.force_ssl = ENV.fetch('FORCE_SSL', false) + config.force_ssl = ActiveModel::Type::Boolean.new.cast(ENV.fetch('FORCE_SSL', false)) # customize using the environment variables config.log_level = ENV.fetch('LOG_LEVEL', 'info').to_sym diff --git a/docker/Dockerfile b/docker/Dockerfile index 80dd6046c..7b41ca97f 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -87,4 +87,8 @@ RUN rm -rf /gems/ruby/2.7.0/cache/*.gem \ && find /gems/ruby/2.7.0/gems/ -name "*.c" -delete \ && find /gems/ruby/2.7.0/gems/ -name "*.o" -delete +# creating a log directory so that image wont fail when RAILS_LOG_TO_STDOUT is false +# https://github.com/chatwoot/chatwoot/issues/701 +RUN mkdir -p /app/log + WORKDIR /app diff --git a/docs/development/project-setup/quick-setup.md b/docs/development/project-setup/quick-setup.md index 23b08e5ff..1f8fd946b 100644 --- a/docs/development/project-setup/quick-setup.md +++ b/docs/development/project-setup/quick-setup.md @@ -92,7 +92,7 @@ docker pull chatwoot/chatwoot You can create an image yourselves by running the following command on the root directory. ```bash -docker image build -f docker/Dockerfile . +docker-compose -f docker-compose.production.yaml build ``` This will build the image which you can depoy in Kubernetes (GCP, Openshift, AWS, Azure or anywhere), Amazon ECS or Docker Swarm. You can tag this image and push this image to docker registry of your choice.