discourse/bin/unicorn
Loïc Guitaut 154224f109
DEV: Add Pitchfork alongside Unicorn (#35370)
This PR adds Pitchfork, as we want to move away from Unicorn ultimately.

Unicorn still boots by default, so there should be no disruption for
anyone.

To use Pitchfork instead of Unicorn, the `RUN_PITCHFORK` environment
variable must be set.
This will make `bin/rails s` and `config/unicorn_launcher` boot
Pitchfork. `unicorn_launcher` was patched because that way we can easily
switch between Unicorn and Pitchfork without having to change too many
things on the infra side.

The upgrader from the `docker_manager` plugin doesn’t work yet with
Pitchfork. This will be addressed in a future PR.
2025-10-24 11:08:23 +02:00

85 lines
2.1 KiB
Ruby
Executable file

#!/usr/bin/env ruby
# frozen_string_literal: true
require "pathname"
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile", Pathname.new(__FILE__).realpath)
STDERR.puts <<~MESSAGE if defined?(Bundler)
WARNING: Using `bundle exec` to start the server is unnecessary, and will make startup slower. Use `bin/rails s` or `bin/unicorn`.
MESSAGE
require "rubygems"
require "bundler/setup"
require "fileutils"
dev_mode = false
# in development do some fussing around, to automate config
if !ARGV.include?("-E") && !ARGV.include?("--env") &&
(%w[development test].include?(ENV["RAILS_ENV"]) || !ENV["RAILS_ENV"])
dev_mode = true
ARGV.push("-N")
if !ARGV.include?("-c") && !ARGV.include?("--config-file")
ARGV.push("-c")
ARGV.push(File.expand_path("../../config/unicorn.conf.rb", Pathname.new(__FILE__).realpath))
end
# we do not want to listen on 2 ports, so lets fix it
if (idx = ARGV.index("-p")) && (port = ARGV[idx + 1].to_i) > 0
ENV["UNICORN_PORT"] ||= port.to_s
end
ENV["UNICORN_PORT"] ||= "9292"
if ARGV.delete("-x")
puts "Running without sidekiq"
ENV["UNICORN_SIDEKIQS"] = "0"
end
ENV["UNICORN_SIDEKIQS"] ||= "1"
end
if ARGV.include?("--help")
fork { load Gem.bin_path("unicorn", "unicorn") }
Process.wait
puts "Extra Discourse Options:"
puts " -x run without sidekiq"
exit
end
# this dev_mode hackery enables the following to be used to restart unicorn:
#
# pkill -USR2 -f 'ruby bin/unicorn'
#
# This is handy if you want to bind a key to restarting unicorn in dev
if dev_mode
UNICORN_DEV_SUPERVISOR_PID = Process.pid
restart = true
while restart
restart = false
pid = fork { load Gem.bin_path("unicorn", "unicorn") }
done = false
Signal.trap("INT") do
# wait for parent to be done
end
Signal.trap("USR2") do
Process.kill("QUIT", pid)
puts "RESTARTING UNICORN"
restart = true
end
Signal.trap("TERM") { Process.kill("TERM", pid) }
while !done
sleep 1
done = Process.waitpid(pid, Process::WNOHANG)
end
end
else
load Gem.bin_path("unicorn", "unicorn")
end