Desplegar Discourse sin Docker

@lion , prueba este:\n\n```

frozen_string_literal: true

require “fileutils”

discourse_path = File.expand_path(File.expand_path(File.dirname(FILE)) + “/../”)

enable_logstash_logger = ENV[“ENABLE_LOGSTASH_LOGGER”] == “1”
puma_stderr_path = “#{discourse_path}/log/puma.stderr.log”
puma_stdout_path = “#{discourse_path}/log/puma.stdout.log”

Cargar el logger de logstash si está habilitado

if enable_logstash_logger
require_relative “../lib/discourse_logstash_logger”
FileUtils.touch(puma_stderr_path) if !File.exist?(puma_stderr_path)

Nota: Es posible que necesites adaptar la inicialización del logger para Puma

log_formatter = proc do |severity, time, progname, msg|
event = {
@timestamp” => Time.now.utc,
“message” => msg,
“severity” => severity,
“type” => “puma”
}
“#{event.to_json}\n”
end
else
stdout_redirect puma_stdout_path, puma_stderr_path, true
end

Número de workers (procesos)

workers ENV.fetch(“PUMA_WORKERS”, 8).to_i

Establecer el directorio

directory discourse_path

Vincular a la dirección y puerto especificados

bind ENV.fetch(“PUMA_BIND”, “tcp://#{ENV[‘PUMA_BIND_ALL’] ? ‘’ : ‘127.0.0.1:’}3000”)

Ubicación del archivo PID

FileUtils.mkdir_p(“#{discourse_path}/tmp/pids”)
pidfile ENV.fetch(“PUMA_PID_PATH”, “#{discourse_path}/tmp/pids/puma.pid”)

Archivo de estado - utilizado por pumactl

state_path “#{discourse_path}/tmp/pids/puma.state”

Configuración específica del entorno

if ENV[“RAILS_ENV”] == “production”

Tiempo de espera de producción

worker_timeout 30
else

Tiempo de espera de desarrollo

worker_timeout ENV.fetch(“PUMA_TIMEOUT”, 60).to_i
end

Preload de la aplicación

preload_app!

Manejo del arranque y apagado de workers

before_fork do
Discourse.preload_rails!
Discourse.before_fork

Comprobación del supervisor

supervisor_pid = ENV[“PUMA_SUPERVISOR_PID”].to_i
if supervisor_pid > 0
Thread.new do
loop do
unless File.exist?(“/proc/#{supervisor_pid}”)
puts “Matar mi supervisor se ha ido”
Process.kill “TERM”, Process.pid
end
sleep 2
end
end
end

Workers de Sidekiq

sidekiqs = ENV[“PUMA_SIDEKIQS”].to_i
if sidekiqs > 0
puts “iniciando #{sidekiqs} sidekiqs supervisados”

require "demon/sidekiq"
Demon::Sidekiq.after_fork { DiscourseEvent.trigger(:sidekiq_fork_started) }
Demon::Sidekiq.start(sidekiqs)

if Discourse.enable_sidekiq_logging?
  Signal.trap("USR1") do
    # Retrasar la reapertura del log de Sidekiq
    sleep 1
    Demon::Sidekiq.kill("USR2")
  end
end

end

Demonio de sincronización de correo electrónico

if ENV[“DISCOURSE_ENABLE_EMAIL_SYNC_DEMON”] == “true”
puts “iniciando demonio EmailSync”
Demon::EmailSync.start(1)
end

Demonios de plugins

DiscoursePluginRegistry.demon_processes.each do |demon_class|
puts “iniciando demonio #{demon_class.prefix}”
demon_class.start(1)
end

Hilo de monitoreo de demonios

Thread.new do
loop do
begin
sleep 60

    if sidekiqs > 0
      Demon::Sidekiq.ensure_running
      Demon::Sidekiq.heartbeat_check
      Demon::Sidekiq.rss_memory_check
    end

    if ENV["DISCOURSE_ENABLE_EMAIL_SYNC_DEMON"] == "true"
      Demon::EmailSync.ensure_running
      Demon::EmailSync.check_email_sync_heartbeat
    end

    DiscoursePluginRegistry.demon_processes.each(&:ensure_running)
  rescue => e
    Rails.logger.warn("Error en la comprobación del latido de los procesos demonio: #{e}\n#{e.backtrace.join("\n")}")
  end
end

end

Cerrar la conexión de Redis

Discourse.redis.close
end

on_worker_boot do
DiscourseEvent.trigger(:web_fork_started)
Discourse.after_fork
end

Manejo del tiempo de espera del worker

worker_timeout 30

Opciones de worker de bajo nivel

threads 8, 32