@lion , essayez celui-ci :
# 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"
# Charger le logger logstash s'il est activé
if enable_logstash_logger
require_relative "../lib/discourse_logstash_logger"
FileUtils.touch(puma_stderr_path) if !File.exist?(puma_stderr_path)
# Remarque : vous devrez peut-être adapter l'initialisation du logger pour 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
# Nombre de workers (processus)
workers ENV.fetch("PUMA_WORKERS", 8).to_i
# Définir le répertoire
directory discourse_path
# Se lier à l'adresse et au port spécifiés
bind ENV.fetch("PUMA_BIND", "tcp://#{ENV['PUMA_BIND_ALL'] ? '' : '127.0.0.1:'}3000")
# Emplacement du fichier PID
FileUtils.mkdir_p("#{discourse_path}/tmp/pids")
pidfile ENV.fetch("PUMA_PID_PATH", "#{discourse_path}/tmp/pids/puma.pid")
# Fichier d'état - utilisé par pumactl
state_path "#{discourse_path}/tmp/pids/puma.state"
# Configuration spécifique à l'environnement
if ENV["RAILS_ENV"] == "production"
# Délai d'attente en production
worker_timeout 30
else
# Délai d'attente en développement
worker_timeout ENV.fetch("PUMA_TIMEOUT", 60).to_i
end
# Précharger l'application
preload_app!
# Gérer le démarrage et l'arrêt des workers
before_fork do
Discourse.preload_rails!
Discourse.before_fork
# Vérification du superviseur
supervisor_pid = ENV["PUMA_SUPERVISOR_PID"].to_i
if supervisor_pid > 0
Thread.new do
loop do
unless File.exist?("/proc/#{supervisor_pid}")
puts "Le superviseur de mise à mort s'est arrêté"
Process.kill "TERM", Process.pid
end
sleep 2
end
end
end
# Workers Sidekiq
sidekiqs = ENV["PUMA_SIDEKIQS"].to_i
if sidekiqs > 0
puts "démarrage de #{sidekiqs} sidekiqs supervisés"
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
# Retarder la réouverture des logs Sidekiq
sleep 1
Demon::Sidekiq.kill("USR2")
end
end
end
# Démon de synchronisation des e-mails
if ENV["DISCOURSE_ENABLE_EMAIL_SYNC_DEMON"] == "true"
puts "démarrage du démon EmailSync"
Demon::EmailSync.start(1)
end
# Démons de plugins
DiscoursePluginRegistry.demon_processes.each do |demon_class|
puts "démarrage du démon #{demon_class.prefix}"
demon_class.start(1)
end
# Thread de surveillance des démons
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("Erreur lors de la vérification du battement de cœur des démons : #{e}\n#{e.backtrace.join("\n")}")
end
end
end
# Fermer la connexion Redis
Discourse.redis.close
end
on_worker_boot do
DiscourseEvent.trigger(:web_fork_started)
Discourse.after_fork
end
# Gestion du délai d'attente des workers
worker_timeout 30
# Options de workers de bas niveau
threads 8, 32