Method: Itsi::Server::Config.build_config
- Defined in:
- lib/itsi/server/config.rb
.build_config(args, config_file_path, builder_proc = nil) ⇒ Object
The configuration used when launching the Itsi server are evaluated in the following precedence:
-
CLI Args.
-
Itsi.rb file.
-
Default values.
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 |
# File 'lib/itsi/server/config.rb', line 37 def self.build_config(args, config_file_path, builder_proc = nil) args.transform_keys!(&:to_sym) itsifile_config, errors = \ if builder_proc DSL.evaluate(&builder_proc) elsif args[:static] DSL.evaluate do rate_limit key: "address", store_config: "in_memory", requests: 5, seconds: 10 etag type: "strong", algorithm: "md5", min_body_size: 1024 * 1024 compress min_size: 1024 * 1024, level: "fastest", algorithms: %w[zstd gzip br deflate], mime_types: %w[all], compress_streams: true log_requests before: { level: "DEBUG", format: "[{request_id}] {method} {path_and_query} - {addr} " }, after: { level: "DEBUG", format: "[{request_id}] └─ {status} in {response_time}" } nodelay false static_assets \ relative_path: true, allowed_extensions: [], root_dir: ".", not_found_behavior: { error: "not_found" }, auto_index: true, try_html_extension: true, max_file_size_in_memory: 1024 * 1024, # 1MB max_files_in_memory: 1000, file_check_interval: 1, serve_hidden_files: false, headers: { "X-Content-Type-Options" => "nosniff" } end elsif File.exist?(config_file_path.to_s) DSL.evaluate do include config_file_path.gsub(".rb", "") rackup_file args[:rackup_file], script_name: "/" if args.key?(:rackup_file) end elsif File.exist?("./config.ru") DSL.evaluate do preload true rackup_file args.fetch(:rackup_file, "./config.ru"), script_name: "/" end else DSL.evaluate do rackup_file args[:rackup_file], script_name: "/" if args.key?(:rackup_file) end end itsifile_config.transform_keys!(&:to_sym) # We'll preload while we load config, if enabled. middleware_loader = itsifile_config.fetch(:middleware_loader, -> {}) preload = args.fetch(:preload) { itsifile_config.fetch(:preload, false) } case preload # If we preload everything, then we'll load middleware and default rack app ahead of time when true begin Itsi.log_debug("Preloading middleware and default rack app") preloaded_middleware = middleware_loader.call middleware_loader = -> { preloaded_middleware } rescue Exception => e # rubocop:disable Lint/RescueException errors << [e, e.backtrace[0]] end # If we're just preloading a specific gem group, we'll do that here too when Symbol, String Itsi.log_debug("Preloading gem group #{preload}") Bundler.require(preload) end if itsifile_config[:daemonize] && !@daemonized @daemonized = true Itsi.log_info("Itsi is running in the background. Writing pid to #{Itsi::Server::Config.pid_file_path}") Itsi.log_info("To stop Itsi, run 'itsi stop' from this directory.") Process.daemon(true, false) Server.write_pid end srv_config = { workers: args.fetch(:workers) { itsifile_config.fetch(:workers, nil) }, worker_memory_limit: args.fetch(:worker_memory_limit) { itsifile_config.fetch(:worker_memory_limit, nil) }, silence: args.fetch(:silence) { itsifile_config.fetch(:silence, false) }, shutdown_timeout: args.fetch(:shutdown_timeout) { itsifile_config.fetch(:shutdown_timeout, 5) }, hooks: if args[:hooks] && itsifile_config[:hooks] args[:hooks].merge(itsifile_config[:hooks]) else itsifile_config.fetch( :hooks, args[:hooks] ) end, preload: !!preload, request_timeout: itsifile_config.fetch(:request_timeout, nil), header_read_timeout: args.fetch(:header_read_timeout) { itsifile_config.fetch(:header_read_timeout, nil) }, notify_watchers: itsifile_config.fetch(:notify_watchers, nil), threads: args.fetch(:threads) { itsifile_config.fetch(:threads, 1) }, scheduler_threads: args.fetch(:scheduler_threads) { itsifile_config.fetch(:scheduler_threads, nil) }, streamable_body: args.fetch(:streamable_body) { itsifile_config.fetch(:streamable_body, false) }, multithreaded_reactor: args.fetch(:multithreaded_reactor) do itsifile_config.fetch(:multithreaded_reactor, nil) end, pin_worker_cores: args.fetch(:pin_worker_cores) { itsifile_config.fetch(:pin_worker_cores, false) }, scheduler_class: args.fetch(:scheduler_class) { itsifile_config.fetch(:scheduler_class, nil) }, oob_gc_responses_threshold: args.fetch(:oob_gc_responses_threshold) do itsifile_config.fetch(:oob_gc_responses_threshold, nil) end, ruby_thread_request_backlog_size: args.fetch(:ruby_thread_request_backlog_size) do itsifile_config.fetch(:ruby_thread_request_backlog_size, nil) end, log_level: args.fetch(:log_level) { itsifile_config.fetch(:log_level, nil) }, log_format: args.fetch(:log_format) { itsifile_config.fetch(:log_format, nil) }, log_target: args.fetch(:log_target) { itsifile_config.fetch(:log_target, nil) }, log_target_filters: args.fetch(:log_target_filters) { itsifile_config.fetch(:log_target_filters, nil) }, pipeline_flush: itsifile_config.fetch(:pipeline_flush, true), writev: itsifile_config.fetch(:writev, false), max_concurrent_streams: itsifile_config.fetch(:max_concurrent_streams, nil), max_local_error_reset_streams: itsifile_config.fetch(:max_local_error_reset_streams, nil), max_header_list_size: itsifile_config.fetch(:max_header_list_size, 2 * 1024 * 1024), max_send_buf_size: itsifile_config.fetch(:max_send_buf_size, 64 * 1024), binds: args.fetch(:binds) { itsifile_config.fetch(:binds, ["http://0.0.0.0:3000"]) }, middleware_loader: middleware_loader, listeners: args.fetch(:listeners, nil), reuse_address: itsifile_config.fetch(:reuse_address, true), reuse_port: itsifile_config.fetch(:reuse_port, true), listen_backlog: itsifile_config.fetch(:listen_backlog, 1024), nodelay: itsifile_config.fetch(:nodelay, true), recv_buffer_size: itsifile_config.fetch(:recv_buffer_size, 262_144), send_buffer_size: itsifile_config.fetch(:send_buffer_size, 262_144) }.transform_keys(&:to_s) [srv_config, errors_to_error_lines(errors)] rescue StandardError => e [{}, errors_to_error_lines([[e, e.backtrace[0]]])] end |