diff --git a/app/health_server.rb b/app/health_server.rb index 9e5dda3..c75099a 100644 --- a/app/health_server.rb +++ b/app/health_server.rb @@ -26,7 +26,14 @@ class HealthServerRunner @logger.info(" GET /metrics - Prometheus metrics") begin - @health_server.run!(host: bind, port: port.to_i) + # Use Rack to run the Sinatra app + require 'rack' + require 'puma' + + # Start Puma server with Rack + server = Puma::Server.new(@health_server) + server.add_tcp_listener(bind, port.to_i) + server.run.join rescue Interrupt @logger.info("Health check server stopped") rescue => e diff --git a/app/lib/baktainer.rb b/app/lib/baktainer.rb index c348cc4..093e047 100644 --- a/app/lib/baktainer.rb +++ b/app/lib/baktainer.rb @@ -34,7 +34,6 @@ end require 'docker-api' require 'cron_calc' require 'concurrent/executor/fixed_thread_pool' -require 'baktainer/logger' require 'baktainer/container' require 'baktainer/backup_command' require 'baktainer/dependency_container' @@ -146,14 +145,20 @@ class Baktainer::Runner run_at = ENV['BT_CRON'] || '0 0 * * *' begin @cron = CronCalc.new(run_at) - rescue - LOGGER.error("Invalid cron format for BT_CRON: #{run_at}.") + rescue => e + @logger.error("Invalid cron format for BT_CRON: #{run_at}. Error: #{e.message}") @cron = CronCalc.new('0 0 * * *') # Fall back to default end loop do now = Time.now - next_run = @cron.next + # CronCalc.next returns an array, get the first element + next_runs = @cron.next(now) + next_run = next_runs.is_a?(Array) ? next_runs.first : next_runs + + # Convert to Time object if necessary + next_run = Time.at(next_run) if next_run.is_a?(Numeric) + sleep_duration = next_run - now @logger.info("Sleeping for #{sleep_duration} seconds until #{next_run}.") sleep(sleep_duration) @@ -323,14 +328,24 @@ class Baktainer::Runner def start_health_server @health_server_thread = Thread.new do begin - health_server = @dependency_container.get(:health_check_server) port = ENV['BT_HEALTH_PORT'] || 8080 bind = ENV['BT_HEALTH_BIND'] || '0.0.0.0' @logger.info("Starting health check server on #{bind}:#{port}") - health_server.run!(host: bind, port: port.to_i) + + # Use Rack to run the Sinatra app + require 'rack' + require 'puma' + + app = Baktainer::HealthCheckServer.new(@dependency_container) + + # Start Puma server with Rack + server = Puma::Server.new(app) + server.add_tcp_listener(bind, port.to_i) + server.run.join rescue => e @logger.error("Health check server error: #{e.message}") + @logger.debug(e.backtrace.join("\n")) end end diff --git a/app/lib/baktainer/health_check_server.rb b/app/lib/baktainer/health_check_server.rb index b0bed8a..5e9ee32 100644 --- a/app/lib/baktainer/health_check_server.rb +++ b/app/lib/baktainer/health_check_server.rb @@ -17,6 +17,7 @@ class Baktainer::HealthCheckServer < Sinatra::Base configure do set :environment, :production set :logging, false # We'll handle logging ourselves + set :server, 'puma' set :port, ENV['BT_HEALTH_PORT'] || 8080 set :bind, ENV['BT_HEALTH_BIND'] || '0.0.0.0' end diff --git a/app/spec/examples.txt b/app/spec/examples.txt index 1b37553..c6b47ae 100644 --- a/app/spec/examples.txt +++ b/app/spec/examples.txt @@ -74,7 +74,7 @@ example_id | status | run_time | ./spec/unit/baktainer_spec.rb[1:3:1] | passed | 0.00182 seconds | ./spec/unit/baktainer_spec.rb[1:3:2] | passed | 0.00171 seconds | ./spec/unit/baktainer_spec.rb[1:3:3] | passed | 0.00189 seconds | -./spec/unit/baktainer_spec.rb[1:3:4] | passed | 0.00243 seconds | +./spec/unit/baktainer_spec.rb[1:3:4] | passed | 0.00673 seconds | ./spec/unit/baktainer_spec.rb[1:4:1:1] | passed | 0.00201 seconds | ./spec/unit/baktainer_spec.rb[1:4:2:1] | passed | 0.27045 seconds | ./spec/unit/container_spec.rb[1:1:1] | passed | 0.00145 seconds | diff --git a/docker-compose.yml b/docker-compose.yml index 1b417ca..d190063 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,11 +4,15 @@ services: image: jamez001/baktainer:latest container_name: baktainer restart: unless-stopped + ports: + - "8080:8080" volumes: - ./backups:/backups - ./config:/config - /var/run/docker.sock:/var/run/docker.sock environment: + - BT_HEALTH_SERVER_ENABLED=true + - BT_HEALTH_PORT=8080 - "BT_DOCKER_URL=unix:///var/run/docker.sock" - BT_CRON=0 0 * * * # Backup every day at midnight - BT_THREADS=4 # Number of threads to use for backups