mirror of https://github.com/docusealco/docuseal
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.3 KiB
71 lines
1.3 KiB
# frozen_string_literal: true
|
|
|
|
require 'puma/plugin'
|
|
|
|
# rubocop:disable Metrics
|
|
Puma::Plugin.create do
|
|
def start(launcher)
|
|
return if ENV['LOCAL_REDIS_URL'].to_s.empty?
|
|
|
|
@puma_pid = $PROCESS_ID
|
|
|
|
launcher.events.on_booted do
|
|
@redis_server_pid = fork_redis
|
|
end
|
|
|
|
in_background { monitor_redis }
|
|
|
|
at_exit do
|
|
stop_redis_server if Process.pid == @puma_pid
|
|
end
|
|
|
|
launcher.events.on_stopped { stop_redis_server }
|
|
launcher.events.on_restart { stop_redis_server }
|
|
end
|
|
|
|
private
|
|
|
|
def monitor_redis
|
|
loop do
|
|
if redis_dead?
|
|
Process.kill(:INT, @puma_pid)
|
|
|
|
break
|
|
end
|
|
|
|
sleep 5
|
|
end
|
|
end
|
|
|
|
def redis_dead?
|
|
return false unless @redis_server_pid
|
|
|
|
Process.waitpid(@redis_server_pid, Process::WNOHANG)
|
|
|
|
false
|
|
rescue Errno::ECHILD, Errno::ESRCH
|
|
true
|
|
end
|
|
|
|
def fork_redis
|
|
fork do
|
|
Process.setsid
|
|
|
|
Dir.chdir(ENV.fetch('WORKDIR', nil)) unless ENV['WORKDIR'].to_s.empty?
|
|
|
|
exec('redis-server', '--requirepass', Digest::SHA1.hexdigest("redis#{ENV.fetch('SECRET_KEY_BASE', '')}"),
|
|
out: '/dev/null')
|
|
end
|
|
end
|
|
|
|
def stop_redis_server
|
|
if @redis_server_pid
|
|
Process.kill(:INT, @redis_server_pid)
|
|
Process.wait(@redis_server_pid)
|
|
end
|
|
rescue Errno::ECHILD, Errno::ESRCH
|
|
nil
|
|
end
|
|
end
|
|
# rubocop:enable Metrics
|