Configuration Nginx :
Derrière un proxy inverse (haproxy), vous devez copier le fichier /var/discourse/config/nginx-config-sample.conf vers /etc/nginx/sites-enabled/discourse.conf ou une cible similaire, puis remplacer listen <votreportdeproxyinverse> (si nécessaire), et le _ de server_name par votre nom d’hôte (sousdomaine.example.com). Rien d’autre ne doit être modifié.
Pages non affichées (message « Oups ») et enregistrement d’administrateur par e-mail non fonctionnel :
Magick était la cause du non-affichage des pages après les pages d’enregistrement d’administrateur au premier démarrage. J’ai suivi le fichier indiqué dans le journal : /var/www/discourse/lib/letter_avatar.rb:112 à la ligne 112, il y avait deux commandes magick qui en effet ne répondaient pas. convert répondait, j’ai donc remplacé magick à cette ligne par convert. Après ces corrections, une autre erreur a été enregistrée. En essayant la même procédure avec la commande donnée du fichier, la commande magick ne fonctionnait pas, et convert échouait. NB : magick --version était 7.x et convert --version donnait 6.x. La cause était que j’avais d’abord installé imagemagick avec apt, puis magick 7 à partir des sources. Il y avait des conflits et magick a indiqué que la commande convert était obsolète. J’ai donc relancé mon script avec uniquement magick 7. Cela a immédiatement résolu le problème et j’ai pu voir les nouvelles pages attendues depuis des jours, et l’e-mail fonctionnait aussi ! Magick est vraiment magique.
Le problème du contenu mixte demeure, mais le site Web fonctionne bien.
NB : dans puma.rb, la ligne bind ENV.fetch("PUMA_BIND", "tcp://#{ENV['PUMA_BIND_ALL'] ? '' : '127.0.0.1:'}3000") doit être comme ceci (correction du premier post.)
EDIT « 3. », concernant la redirection https pour discourse : Je ne sais pas pourquoi exactement, mais mes navigateurs n’affichent plus d’avertissements de « contenu mixte » (peut-être en raison de la mise à jour du cache), donc tout va bien maintenant. Il me suffit de terminer mon script.
Fonctionne bien !!!
ImageMagick v7 résout le problème Ooops !
D’après mes tests, cela fonctionne parfaitement.
Je vais tester le reste des fonctionnalités et je vous tiens au courant dès que possible.
Ce que j’ai fait pour tester, c’est définir la variable d’environnement PUMA_BIND lors de l’exécution de puma.
Concernant ImageMagick, pour une raison quelconque, Discourse échoue à exécuter une conversion d’image sur l’interface web, lorsque je télécharge une grande image, il refuse gentiment de la convertir… Je suis toujours en train de déboguer le problème.
Des progrès dans le débogage ? De mon côté, je travaille sur magick.
Sur certaines images d’environ 50 Ko, une fenêtre contextuelle s’affiche dans le navigateur : timeout -k 40.0 20 magick gif:/tmp/RackMultipart20250927-23598-xrrp6e.gif -auto-orient -background white -interlace none -flatten -debug all -quality 90 jpg:/tmp/image20250927-23598-9ujq3d.jpg et aucune image n’est chargée.
Si la taille est plus grande, pas de fenêtre contextuelle mais la roue de chargement tourne indéfiniment sans résultat. Aucune erreur n’est enregistrée dans /var/www/discourse/log.
La seule façon dont j’ai pu le faire fonctionner a été d’utiliser imagemagick du dépôt brew.
MAIS cela échoue lorsque l’image dépasse 3 Mo… peut-être que j’ai configuré une politique très restrictive.
Essayez !!!
Je teste l’installation de docker mais je pense que c’est assez stupide de déployer nginx, unicorn, redis, postgresql et le reste dans UN SEUL conteneur… cela n’a aucun sens. Et il n’y a aucune documentation d’infrastructure pour les gros déploiements… J’ai travaillé dans l’informatique pendant plus de 20 ans et je ne vois que des problèmes à venir à l’avenir en utilisant une telle infrastructure.
Sans parler de « docker The Space Eater » (comme Dormammu)
Ce problème a disparu avec la solution suivante décrite à la fin :
Debug 1 : bundle db:create affiche, également dans les logs au premier démarrage :
…
OID 21096 inconnu : impossible de reconnaître le type de ‘embeddings’. Il sera traité comme String.
worker pngquant : pngquant introuvable ; veuillez fournir le binaire approprié ou désactiver ce worker (argument --no-pngquant ou :pngquant => false via les options)
worker oxipng : oxipng introuvable ; veuillez fournir le binaire approprié ou désactiver ce worker (argument --no-oxipng ou :oxipng => false via les options)
worker jhead : jhead introuvable, jpegtran introuvable ; veuillez fournir le binaire approprié ou désactiver ce worker (argument --no-jhead ou :jhead => false via les options)
worker jpegoptim : jpegoptim introuvable ; veuillez fournir le binaire approprié ou désactiver ce worker (argument --no-jpegoptim ou :jpegoptim => false via les options)
…
Debug 2 : Une commande magick avec des fichiers affiche :
Après cela, ma taille de téléchargement peut atteindre 518 Ko. Pas au-dessus. Ceci est uniquement pour les images. Tous les autres documents, audio, vidéo téléchargés fonctionnent.
Solution temporaire pour le problème restant :
J’ai regardé dans les paramètres d’administration, discourse.conf, nginx/sites-enables/discourse.conf, dans le dossier git. Finalement, dans AdminPanel/Parameters/Files, j’ai désactivé “Composer media optimization image enabled”, puis tout fonctionne bien. Je peux télécharger n’importe quelle image.
Oui, IMEI est presque la même solution que d’utiliser brew, mais je suis sûr que cela ne prendra pas environ 2 Go de disque
Je vais vérifier votre solution pour la taille maximale des fichiers lors des téléchargements.
Je cherche également une solution pour envoyer des e-mails “gratuitement” (je suis à un stade précoce et je ne veux pas contracter mailtrap/mailgun/etc…)
Lorsque vous exécutez rake assets:precompile, il est indiqué No such file or directory - brotli, installez-le simplement avec un gestionnaire de paquets.
bundler : échec du chargement de la commande : puma (/home/mry/.rbenv/versions/3.4.6/bin/puma)
/home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/puma-7.0.4/lib/puma/cluster.rb:472:in `Puma::Cluster#run': undefined method `wait_readable' for nil (NoMethodError)
if read.wait_readable([0, @next_check - Time.now].max)
^^^^^^^^^^^^^^
from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/puma-7.0.4/lib/puma/launcher.rb:202:in `Puma::Launcher#run'
from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/puma-7.0.4/lib/puma/cli.rb:73:in `Puma::CLI#run'
from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/puma-7.0.4/bin/puma:10:in `<top (required)>'
from /home/mry/.rbenv/versions/3.4.6/bin/puma:25:in `Kernel#load'
from /home/mry/.rbenv/versions/3.4.6/bin/puma:25:in `<top (required)>'
from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `Kernel.load'
from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:59:in `Bundler::CLI::Exec#kernel_load'
from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/cli/exec.rb:23:in `Bundler::CLI::Exec#run'
from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/cli.rb:452:in `Bundler::CLI#exec'
from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/command.rb:28:in `Bundler::Thor::Command#run'
from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `Bundler::Thor::Invocation#invoke_command'
from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor.rb:538:in `Bundler::Thor.dispatch'
from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/cli.rb:35:in `Bundler::CLI.dispatch'
from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/vendor/thor/lib/thor/base.rb:584:in `Bundler::Thor::Base::ClassMethods#start'
from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/cli.rb:29:in `Bundler::CLI.start'
from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/exe/bundle:28:in `block in <top (required)>'
from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/lib/bundler/friendly_errors.rb:117:in `Bundler.with_friendly_errors'
from /home/mry/.rbenv/versions/3.4.6/lib/ruby/gems/3.4.0/gems/bundler-2.6.4/exe/bundle:20:in `<top (required)>'
from /home/mry/.rbenv/versions/3.4.6/bin/bundle:25:in `Kernel#load'
from /home/mry/.rbenv/versions/3.4.6/bin/bundle:25:in `<main>'
Puis Puma redémarre tout seul. Que dois-je faire pour éviter cela ?
Bonjour à tous,
Voici mon script pour une installation complète en trois étapes, sans Docker, sur un conteneur Debian 12 (LXC pour moi).
Utilisez les blocs if pour n’exécuter que les parties dont vous avez besoin.
Définissez vos paramètres et exécutez-le en tant que root avec les arguments requis. Attention : le script s’arrêtera au point de sortie avant la partie “### MANUAL”.
Vous devez exécuter manuellement ces commandes dans le terminal du conteneur. Je n’ai pas réussi à les faire fonctionner dans mon conteneur LXC non privilégié. (l’utilisateur par défaut est root)
Ensuite, exécutez le reste.
Je l’ai testé à de nombreuses reprises et il fonctionne, mais il peut y avoir des parties buggy après que je l’ai adapté pour la publication.
install_script
#!/bin/bash
########## SCRIPT D'INSTALLATION DE DISCOURSE SUR DEBIAN 12 SANS DOCKER ##################
#- dernier test en décembre 2025
############################## EXÉCUTEZ-LE EN TANT QUE ROOT, de préférence dans un conteneur LXC !!!!!!!
#- source de la discussion : https://meta.discourse.org/t/deploy-discourse-without-docker/351194
##############################################################################
# PARAMÈTRES MANUELS
certbot_contact_email=hello@domain.tld
certbot_renew_port=9785
nginx_discourse_port=8080
DISCOURSE_DEVELOPER_EMAILS='emailaddress'
DISCOURSE_SMTP_ADDRESS=smtp_server_address
DISCOURSE_SMTP_PORT=465
DISCOURSE_SMTP_USER_NAME=xxx
DISCOURSE_SMTP_PASSWORD=xxx
DISCOURSE_SMTP_DOMAIN=xxx
DISCOURSE_NOTIFICATION_EMAIL=no-reply-xxxx
DISCOURSE_MAXMIND_ACCOUNT_ID=50
# FIN DES PARAMÈTRES MANUELS
shopt -s expand_aliases
source /etc/bash.bashrc
container=$1
cont_haproxy=$2
pool=$3
lxc_image=$4
hostname=$5
db_password=$6
maxmind_license_key=$7
DISCOURSE_HOSTNAME=$hostname
DISCOURSE_MAXMIND_LICENSE_KEY=$maxmind_license_key
### INSTALLATION DE MAGICK 7 et de ses plugins
# https://github.com/SoftCreatR/imei/?tab=readme-ov-file
if [ 1 == 1 ]; then
t=$(mktemp) && \
wget 'https://dist.1-2.dev/imei.sh' -qO "$t" && \
bash "$t" && \
rm "$t"
fi
### INSTALLATION DES BASES ###
if [ 1 == 1 ]; then
apt install -y apt-utils postgresql nginx libnginx-mod-http-brotli-filter libnginx-mod-http-brotli-static redis
systemctl enable --now postgresql redis-server nginx
useradd -m -s /bin/bash discourse
usermod -aG sudo discourse
passwd -d discourse
# RVM (RUBY)
apt install -y ruby-full # nécessaire
su - discourse -c 'curl -sSL https://get.rvm.io | bash'
su - discourse -c 'source /home/discourse/.bashrc'
su - discourse -c 'source /home/discourse/.rvm/scripts/rvm' # nécessaire après l'installation de rvm
su - discourse -c 'rvm install 3.3.7' # installera node 3.3.7 à ce jour
source /home/discourse/.rvm/scripts/rvm
# configurez POSTGRESQL
apt update && apt upgrade -y
apt autoremove -y
# VOUS DEVEZ ACCEPTER LA MISE À NIVEAU
/usr/share/postgresql-common/pgdg/apt.postgresql.org.sh -y
apt install -y postgresql-18-pgvector
fi
alias mydb="sudo -u postgres psql discourse -c "
if [ 1 == 1 ]; then
su - discourse -c 'sudo -u postgres createuser -s discourse'
# fi
su - discourse -c 'sudo -u postgres createdb discourse'
su - discourse -c 'sudo -u postgres psql -c "ALTER USER discourse WITH ENCRYPTED PASSWORD '\''password'\'';"'
alias mydb="sudo -Hiu discourse psql -c "
su - discourse -c 'psql -c "GRANT CONNECT ON DATABASE discourse TO root;"'
su - discourse -c 'psql -c "CREATE EXTENSION pg_trgm;CREATE EXTENSION hstore;"'
su - discourse -c 'psql -c "ALTER DATABASE discourse OWNER TO discourse;"'
su - discourse -c 'psql -c "CREATE EXTENSION unaccent;CREATE EXTENSION plpgsql;"'
su - discourse -c 'psql -c "CREATE EXTENSION vector;"'
echo "OK"
### INSTALLATION DE DISCOURSE DEPUIS GITHUB
cd /var/www/
git clone https://github.com/discourse/discourse
git config --global --add safe.directory /var/www/discourse
# exit
### NÉCESSAIRE POUR bundle, ruby, etc. pas pour discourse lui-même
tee -a /home/discourse/.bashrc > /dev/null <<EOT
export RAILS_ENV=production
export UNICORN_SIDEKIQ_MAX_RSS=800
export UNICORN_WORKERS=8
export UNICORN_SIDEKIQS=1
export PUMA_SIDEKIQ_MAX_RSS=800
export PUMA_WORKERS=8
export PUMA_SIDEKIQS=1
export RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000
export RUBY_GC_HEAP_INIT_SLOTS=400000
export RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5
export DISCOURSE_HOSTNAME=$hostname
export DISCOURSE_DEVELOPER_EMAILS=$DISCOURSE_DEVELOPER_EMAILS
export DISCOURSE_SMTP_ADDRESS=$DISCOURSE_SMTP_ADDRESS
export DISCOURSE_SMTP_PORT=$DISCOURSE_SMTP_PORT
export DISCOURSE_SMTP_USER_NAME=$DISCOURSE_SMTP_USER_NAME
export DISCOURSE_SMTP_PASSWORD=$DISCOURSE_SMTP_PASSWORD
export DISCOURSE_SMTP_DOMAIN=$DISCOURSE_SMTP_DOMAIN
export DISCOURSE_NOTIFICATION_EMAIL=$DISCOURSE_NOTIFICATION_EMAIL
export DISCOURSE_MAXMIND_ACCOUNT_ID=$DISCOURSE_MAXMIND_ACCOUNT_ID
export DISCOURSE_MAXMIND_LICENSE_KEY=$maxmind_license_key
export DISCOURSE_ENABLE_CORS=true
export DISCOURSE_MAX_REQS_PER_IP_MODE=none
export DISCOURSE_MAX_REQS_PER_IP_PER_MINUTE=20000
export DISCOURSE_MAX_REQS_PER_IP_PER_10_SECONDS=5000
export DISCOURSE_MAX_ASSET_REQS_PER_IP_PER_10_SECONDS=20000
export DISCOURSE_MAX_REQS_RATE_LIMIT_ON_PRIVATE=false
export DISCOURSE_MAX_USER_API_REQS_PER_MINUTE=200
export DISCOURSE_MAX_USER_API_REQS_PER_DAY=28800
export DISCOURSE_MAX_ADMIN_API_REQS_PER_MINUTE=600
export DISCOURSE_MAX_DATA_EXPLORER_API_REQ_MODE=none
EOT
cd /var/www/discourse
git stash
git pull
git checkout tests-passed
cd plugins
for plugin in *
do
echo "ok"
echo $plugin; cd ${plugin}; git pull; cd ..
done
# fi
chown -R discourse:discourse /var/www/discourse/
mkdir -p /var/www/discourse/public
chown -R discourse:www-data /var/www/discourse/public
tee -a /var/www/discourse/config/discourse.conf > /dev/null <<EOT
max_data_explorer_api_req_mode = 'none'
max_user_api_reqs_per_day = '28800'
hostname = '$hostname'
redis_host = 'localhost'
smtp_user_name = $$DISCOURSE_SMTP_USER_NAME
db_password = '$db_password'
smtp_address = '$DISCOURSE_SMTP_ADDRESS'
db_socket = ''
max_reqs_per_ip_per_10_seconds = '5000'
max_asset_reqs_per_ip_per_10_seconds = '20000'
max_reqs_rate_limit_on_private = 'false'
developer_emails = '$DISCOURSE_DEVELOPER_EMAILS'
max_user_api_reqs_per_minute = '200'
maxmind_license_key = '$maxmind_license_key'
smtp_port = '$DISCOURSE_SMTP_PORT'
maxmind_account_id = '$DISCOURSE_MAXMIND_ACCOUNT_ID'
smtp_password = '$DISCOURSE_SMTP_PASSWORD'
max_reqs_per_ip_per_minute = '20000'
notification_email = '$DISCOURSE_NOTIFICATION_EMAIL'
db_host = 'localhost'
enable_cors = 'true'
db_port = ''
max_reqs_per_ip_mode = 'none'
smtp_domain = '$DISCOURSE_SMTP_DOMAIN'
#max_admin_api_reqs_per_minute = '600'
smtp_force_tls='true'
EOT
cd /var/www/discourse && sed -i '/gem "rails_multisite"/i gem "rails"' Gemfile
cd /var/www/discourse && sed -i '/gem "image_optim"/i gem "image_optim_pack"' Gemfile
su - discourse -c 'cd /var/www/discourse && bundle install'
# fi
### PNPM (NODEJS)
su - discourse -c 'curl -fsSL https://get.pnpm.io/install.sh' | su - discourse -c 'sh -'
su - discourse -c 'source /home/discourse/.bashrc'
source /home/discourse/.rvm/scripts/rvm
su - discourse -c 'sed -i "s/\~> 3.3/3.3.7/" /var/www/discourse/Gemfile'
chown -R discourse:discourse /var/www/discourse/Gemfile Gemfile.lock
apt-get -yqq install brotli # est-ce nécessaire ????????????????
# fi
su - discourse -c 'cd /var/www/discourse && bin/rails db:create'
# fi
su - discourse -c 'source /home/discourse/.rvm/scripts/rvm'
tee -a .bashrc > /dev/null <<EOT
# pnpm
export PNPM_HOME="/home/discourse/.local/share/pnpm"
case ":\$PATH:" in
*":\$PNPM_HOME:"*) ;;
*) export PATH="\$PNPM_HOME:\$PATH" ;;
esac
# pnpm end
EOT
which pnpm
source .bashrc
pnpm env use --global lts # installera node 22 à ce jour
cd /var/www/discourse && pnpm i
chown -R discourse:discourse .
chown -R discourse:www-data public
exit
#################################
######### MANUEL ################
export PATH="$PATH:/home/discourse/.rvm/bin"
rvm install "ruby-3.3.7" # installation en tant que root
cd /var/www/discourse
bundle install
bundle exec rake db:migrate
bundle exec rake themes:update
bundle exec rake assets:precompile
######### MANUEL #################
##################################
fi
### puma.rb
#cd /var/www/discourse
cp /var/www/discourse/config/puma.rb /var/www/discourse/config/puma.rb_original
tee /var/www/discourse/config/puma.rb > /dev/null <<EOT
# 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"
# Chargez le logger logstash si 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éfinissez le répertoire
directory discourse_path
# Liez-vous à 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"
# Timeout de production
worker_timeout 30
else
# Timeout de développement
worker_timeout ENV.fetch("PUMA_TIMEOUT", 60).to_i
end
# Préchargez l'application
preload_app!
# Gérez 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 "Kill self supervisor est parti"
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
# Retardez la réouverture des journaux 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 dans la vérification du heartbeat des processus démon : #{e}\n#{e.backtrace.join("\n")}")
end
end
end
# Fermez la connexion Redis
Discourse.redis.close
end
on_worker_boot do
DiscourseEvent.trigger(:web_fork_started)
Discourse.after_fork
end
# Gestion du timeout des workers
worker_timeout 30
# Options de bas niveau pour les workers
threads 8, 32
EOT
### CERTBOT
apt install -y certbot
certbot certonly --non-interactive --agree-tos --renew-with-new-domains --standalone --email $certbot_contact_email --rsa-key-size 4096 --http-01-port $certbot_renew_port -d $hostname
# fi
### NGINX
cp /var/www/discourse/config/nginx.sample.conf /etc/nginx/sites-enabled/discourse.conf
sed -i "s/80/$nginx_discourse_port/" /etc/nginx/sites-enabled/discourse.conf
sed -i "s/server_name _/server_name $hostname/" /etc/nginx/sites-enabled/discourse.conf
mkdir -p /var/nginx/cache
systemctl enable nginx
systemctl restart nginx
systemctl status nginx
### SERVICE SYSTEMD AUTOSTART
sudo tee /etc/systemd/system/discourse.service > /dev/null <<EOT
[Unit]
Description=Discourse avec Puma Server
After=network.target postgresql.service
Requires=postgresql.service
[Service]
Type=simple
User=discourse
Group=discourse
WorkingDirectory=/var/www/discourse
# nécessite l'exécution de `rvm 3.3.7 --default` avant le lancement de ce service
ExecStart=/usr/bin/bash -lc '/home/discourse/.rvm/gems/ruby-3.3.7/bin/puma -C config/puma.rb'
ExecReload=/usr/bin/bash -lc '/home/discourse/.rvm/gems/ruby-3.3.7/bin/pumactl restart'
# il faut cette ligne ci-dessous
Environment=RAILS_ENV=production
# Configuration de redémarrage
Restart=always
RestartSec=5s
# Mesures de sécurité de base
NoNewPrivileges=true
ProtectSystem=full
ProtectHome=read-only
[Install]
WantedBy=multi-user.target
EOT
systemctl enable discourse
systemctl start discourse
# OU DÉMARRAGE MANUEL
# puma -C config/puma.rb
### PARAMÈTRES
echo "DERNIERS PARAMÈTRES MANUELS :"
echo ""
echo "Allez dans Admin > fichiers et ajoutez les extensions de fichiers souhaitées - vidéos, audio et documents
echo "POUR FORCER HTTPS : https://domain.com/admin/config/security"