itsi 0.1.20 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1 -8
- data/Cargo.lock +2 -2
- data/LICENSE.txt +698 -0
- data/README.md +15 -4
- data/Rakefile +9 -5
- data/crates/itsi_acme/.gitignore +4 -0
- data/crates/itsi_acme/Cargo.toml +86 -0
- data/crates/itsi_acme/LICENSE-APACHE +201 -0
- data/crates/itsi_acme/LICENSE-MIT +23 -0
- data/crates/itsi_acme/README.md +9 -0
- data/crates/itsi_acme/examples/high_level.rs +63 -0
- data/crates/itsi_acme/examples/high_level_warp.rs +52 -0
- data/crates/itsi_acme/examples/low_level.rs +87 -0
- data/crates/itsi_acme/examples/low_level_axum.rs +66 -0
- data/crates/itsi_acme/src/acceptor.rs +81 -0
- data/crates/itsi_acme/src/acme.rs +354 -0
- data/crates/itsi_acme/src/axum.rs +86 -0
- data/crates/itsi_acme/src/cache.rs +39 -0
- data/crates/itsi_acme/src/caches/boxed.rs +80 -0
- data/crates/itsi_acme/src/caches/composite.rs +69 -0
- data/crates/itsi_acme/src/caches/dir.rs +106 -0
- data/crates/itsi_acme/src/caches/mod.rs +11 -0
- data/crates/itsi_acme/src/caches/no.rs +78 -0
- data/crates/itsi_acme/src/caches/test.rs +136 -0
- data/crates/itsi_acme/src/config.rs +172 -0
- data/crates/itsi_acme/src/https_helper.rs +69 -0
- data/crates/itsi_acme/src/incoming.rs +142 -0
- data/crates/itsi_acme/src/jose.rs +161 -0
- data/crates/itsi_acme/src/lib.rs +142 -0
- data/crates/itsi_acme/src/resolver.rs +59 -0
- data/crates/itsi_acme/src/state.rs +424 -0
- data/crates/itsi_rb_helpers/src/lib.rs +4 -3
- data/crates/itsi_scheduler/Cargo.toml +1 -1
- data/crates/itsi_scheduler/src/itsi_scheduler.rs +8 -2
- data/crates/itsi_scheduler/src/lib.rs +1 -0
- data/crates/itsi_server/Cargo.toml +1 -1
- data/crates/itsi_server/src/lib.rs +2 -1
- data/crates/itsi_server/src/ruby_types/itsi_http_request.rs +18 -1
- data/crates/itsi_server/src/ruby_types/itsi_server/file_watcher.rs +11 -3
- data/crates/itsi_server/src/ruby_types/itsi_server/itsi_server_config.rs +122 -63
- data/crates/itsi_server/src/ruby_types/itsi_server.rs +2 -0
- data/crates/itsi_server/src/server/binds/bind.rs +3 -0
- data/crates/itsi_server/src/server/binds/listener.rs +12 -5
- data/crates/itsi_server/src/server/binds/tls.rs +13 -5
- data/crates/itsi_server/src/server/middleware_stack/middlewares/allow_list.rs +12 -5
- data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_api_key.rs +8 -1
- data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_basic.rs +9 -1
- data/crates/itsi_server/src/server/middleware_stack/middlewares/auth_jwt.rs +48 -43
- data/crates/itsi_server/src/server/middleware_stack/middlewares/cache_control.rs +11 -2
- data/crates/itsi_server/src/server/middleware_stack/middlewares/compression.rs +39 -12
- data/crates/itsi_server/src/server/middleware_stack/middlewares/cors.rs +36 -27
- data/crates/itsi_server/src/server/middleware_stack/middlewares/csp.rs +25 -11
- data/crates/itsi_server/src/server/middleware_stack/middlewares/deny_list.rs +12 -3
- data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response/default_responses.rs +74 -72
- data/crates/itsi_server/src/server/middleware_stack/middlewares/error_response.rs +15 -1
- data/crates/itsi_server/src/server/middleware_stack/middlewares/etag.rs +11 -8
- data/crates/itsi_server/src/server/middleware_stack/middlewares/intrusion_protection.rs +19 -11
- data/crates/itsi_server/src/server/middleware_stack/middlewares/log_requests.rs +5 -5
- data/crates/itsi_server/src/server/middleware_stack/middlewares/max_body.rs +2 -2
- data/crates/itsi_server/src/server/middleware_stack/middlewares/mod.rs +11 -5
- data/crates/itsi_server/src/server/middleware_stack/middlewares/proxy.rs +17 -20
- data/crates/itsi_server/src/server/middleware_stack/middlewares/rate_limit.rs +19 -8
- data/crates/itsi_server/src/server/middleware_stack/middlewares/redirect.rs +16 -37
- data/crates/itsi_server/src/server/middleware_stack/middlewares/request_headers.rs +22 -12
- data/crates/itsi_server/src/server/middleware_stack/middlewares/response_headers.rs +26 -11
- data/crates/itsi_server/src/server/middleware_stack/middlewares/static_assets.rs +7 -1
- data/crates/itsi_server/src/server/middleware_stack/middlewares/string_rewrite.rs +14 -4
- data/crates/itsi_server/src/server/middleware_stack/middlewares/token_source.rs +19 -0
- data/crates/itsi_server/src/server/middleware_stack/mod.rs +49 -13
- data/crates/itsi_server/src/server/mod.rs +1 -0
- data/crates/itsi_server/src/server/redirect_type.rs +26 -0
- data/crates/itsi_server/src/server/serve_strategy/cluster_mode.rs +22 -16
- data/crates/itsi_server/src/server/serve_strategy/single_mode.rs +49 -12
- data/crates/itsi_server/src/server/signal.rs +1 -0
- data/crates/itsi_server/src/server/size_limited_incoming.rs +6 -0
- data/crates/itsi_server/src/server/thread_worker.rs +5 -1
- data/crates/itsi_server/src/services/itsi_http_service.rs +20 -2
- data/crates/itsi_server/src/services/rate_limiter.rs +15 -4
- data/crates/itsi_server/src/services/static_file_server.rs +33 -19
- data/crates/itsi_tracing/src/lib.rs +42 -22
- data/docs/content/_index.md +1 -2
- data/docs/content/acknowledgements/_index.md +5 -2
- data/docs/content/configuration/_index.md +8 -5
- data/docs/content/contact/_index.md +8 -1
- data/docs/content/faqs/_index.md +5 -3
- data/docs/content/features/_index.md +56 -50
- data/docs/content/getting_started/_index.md +8 -5
- data/docs/content/getting_started/local_development.md +68 -8
- data/docs/content/getting_started/logging.md +16 -9
- data/docs/content/getting_started/running_itsi_in_production.md +5 -3
- data/docs/content/getting_started/signals.md +38 -0
- data/docs/content/itsi_scheduler/_index.md +8 -7
- data/docs/content/utilities/_index.md +13 -0
- data/docs/content/utilities/config_file_testing.md +17 -0
- data/docs/content/utilities/passfile_generator.md +41 -0
- data/docs/content/utilities/route_testing.md +27 -0
- data/docs/content/utilities/secrets_management.md +30 -0
- data/docs/hugo.yaml +1 -1
- data/fairytale.txt +3 -4
- data/gems/scheduler/Cargo.lock +1 -1
- data/gems/scheduler/README.md +4 -5
- data/gems/scheduler/Rakefile +0 -4
- data/gems/scheduler/lib/itsi/scheduler/version.rb +1 -1
- data/gems/scheduler/lib/itsi/scheduler.rb +9 -4
- data/gems/scheduler/test/test_active_record.rb +12 -7
- data/gems/server/Cargo.lock +1 -1
- data/gems/server/Rakefile +0 -4
- data/gems/server/exe/itsi +13 -2
- data/gems/server/lib/itsi/http_request/response_status_shortcodes.rb +2 -0
- data/gems/server/lib/itsi/http_request.rb +40 -9
- data/gems/server/lib/itsi/http_response.rb +2 -1
- data/gems/server/lib/itsi/passfile.rb +0 -1
- data/gems/server/lib/itsi/server/config/config_helpers.rb +20 -8
- data/gems/server/lib/itsi/server/config/dsl.rb +20 -435
- data/gems/server/lib/itsi/server/config/known_paths.rb +4 -1
- data/gems/server/lib/itsi/server/config/middleware/_index.md +6 -4
- data/gems/server/lib/itsi/server/config/middleware/allow_list.md +46 -0
- data/gems/server/lib/itsi/server/config/middleware/allow_list.rb +42 -0
- data/gems/server/lib/itsi/server/config/middleware/auth_api_key.md +90 -0
- data/gems/server/lib/itsi/server/config/middleware/auth_api_key.rb +51 -0
- data/gems/server/lib/itsi/server/config/middleware/auth_basic.md +45 -0
- data/gems/server/lib/itsi/server/config/middleware/auth_basic.rb +44 -0
- data/gems/server/lib/itsi/server/config/middleware/auth_jwt.md +82 -0
- data/gems/server/lib/itsi/server/config/middleware/auth_jwt.rb +38 -0
- data/gems/server/lib/itsi/server/config/middleware/cache_control.md +78 -0
- data/gems/server/lib/itsi/server/config/middleware/cache_control.rb +45 -0
- data/gems/server/lib/itsi/server/config/middleware/cidr_to_regex.rb +50 -0
- data/gems/server/lib/itsi/server/config/middleware/compression.md +50 -0
- data/gems/server/lib/itsi/server/config/middleware/compression.rb +37 -0
- data/gems/server/lib/itsi/server/config/middleware/cors.md +93 -0
- data/gems/server/lib/itsi/server/config/middleware/cors.rb +32 -0
- data/gems/server/lib/itsi/server/config/middleware/csp.md +37 -0
- data/gems/server/lib/itsi/server/config/middleware/csp.rb +44 -0
- data/gems/server/lib/itsi/server/config/middleware/deny_list.md +45 -0
- data/gems/server/lib/itsi/server/config/middleware/deny_list.rb +42 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/_index.md +159 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/controller.md +186 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/controller.rb +33 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/delete.md +12 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/delete.rb +42 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/endpoint.rb +99 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/get.md +12 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/get.rb +42 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/http_request.md +44 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/http_response.md +39 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/patch.md +12 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/patch.rb +42 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/post.md +12 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/post.rb +42 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/put.md +12 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/put.rb +42 -0
- data/gems/server/lib/itsi/server/config/middleware/endpoint/schemas.md +122 -0
- data/gems/server/lib/itsi/server/config/middleware/error_response.md +61 -0
- data/gems/server/lib/itsi/server/config/middleware/error_response.rb +36 -0
- data/gems/server/lib/itsi/server/config/middleware/etag.md +59 -0
- data/gems/server/lib/itsi/server/config/middleware/etag.rb +27 -0
- data/gems/server/lib/itsi/server/config/middleware/grpc.md +172 -0
- data/gems/server/lib/itsi/server/config/middleware/grpc.rb +54 -0
- data/gems/server/lib/itsi/server/config/middleware/intrusion_protection.md +124 -0
- data/gems/server/lib/itsi/server/config/middleware/intrusion_protection.rb +61 -0
- data/gems/server/lib/itsi/server/config/middleware/location.md +107 -0
- data/gems/server/lib/itsi/server/config/middleware/location.rb +99 -0
- data/gems/server/lib/itsi/server/config/middleware/log_requests.md +13 -11
- data/gems/server/lib/itsi/server/config/middleware/log_requests.rb +1 -3
- data/gems/server/lib/itsi/server/config/middleware/max_body.md +18 -0
- data/gems/server/lib/itsi/server/config/middleware/max_body.rb +21 -0
- data/gems/server/lib/itsi/server/config/middleware/proxy.md +62 -0
- data/gems/server/lib/itsi/server/config/middleware/proxy.rb +41 -0
- data/gems/server/lib/itsi/server/config/middleware/rackup_file.md +54 -0
- data/gems/server/lib/itsi/server/config/middleware/rackup_file.rb +44 -0
- data/gems/server/lib/itsi/server/config/middleware/rate_limit.md +126 -0
- data/gems/server/lib/itsi/server/config/middleware/rate_limit.rb +34 -0
- data/gems/server/lib/itsi/server/config/middleware/rate_limit_store.rb +25 -0
- data/gems/server/lib/itsi/server/config/middleware/redirect.md +55 -0
- data/gems/server/lib/itsi/server/config/middleware/redirect.rb +25 -0
- data/gems/server/lib/itsi/server/config/middleware/request_headers.md +34 -0
- data/gems/server/lib/itsi/server/config/middleware/request_headers.rb +24 -0
- data/gems/server/lib/itsi/server/config/middleware/response_headers.md +33 -0
- data/gems/server/lib/itsi/server/config/middleware/response_headers.rb +25 -0
- data/gems/server/lib/itsi/server/config/middleware/run.md +60 -0
- data/gems/server/lib/itsi/server/config/middleware/run.rb +43 -0
- data/gems/server/lib/itsi/server/config/middleware/static_assets.md +73 -0
- data/gems/server/lib/itsi/server/config/middleware/static_assets.rb +87 -0
- data/gems/server/lib/itsi/server/config/middleware/static_response.md +44 -0
- data/gems/server/lib/itsi/server/config/middleware/static_response.rb +29 -0
- data/gems/server/lib/itsi/server/config/middleware/string_rewrite.md +67 -0
- data/gems/server/lib/itsi/server/config/middleware/token_source.rb +32 -0
- data/gems/server/lib/itsi/server/config/middleware.rb +4 -0
- data/gems/server/lib/itsi/server/config/option.rb +5 -0
- data/gems/server/lib/itsi/server/config/options/_index.md +3 -2
- data/gems/server/lib/itsi/server/config/options/auto_reload_config.md +13 -0
- data/gems/server/lib/itsi/server/config/options/auto_reload_config.rb +41 -0
- data/gems/server/lib/itsi/server/config/options/bind.md +71 -0
- data/gems/server/lib/itsi/server/config/options/bind.rb +26 -0
- data/gems/server/lib/itsi/server/config/options/certificates.md +65 -0
- data/gems/server/lib/itsi/server/config/options/daemonize.md +14 -0
- data/gems/server/lib/itsi/server/config/options/daemonize.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/fiber_scheduler.md +1 -2
- data/gems/server/lib/itsi/server/config/options/fiber_scheduler.rb +6 -3
- data/gems/server/lib/itsi/server/config/options/header_read_timeout.md +17 -0
- data/gems/server/lib/itsi/server/config/options/header_read_timeout.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/hooks/_index.md +11 -0
- data/gems/server/lib/itsi/server/config/options/hooks/after_fork.md +13 -0
- data/gems/server/lib/itsi/server/config/options/hooks/after_fork.rb +28 -0
- data/gems/server/lib/itsi/server/config/options/hooks/after_memory_limit_reached.md +14 -0
- data/gems/server/lib/itsi/server/config/options/hooks/after_memory_limit_reached.rb +28 -0
- data/gems/server/lib/itsi/server/config/options/hooks/after_start.md +12 -0
- data/gems/server/lib/itsi/server/config/options/hooks/after_start.rb +28 -0
- data/gems/server/lib/itsi/server/config/options/hooks/before_fork.md +13 -0
- data/gems/server/lib/itsi/server/config/options/hooks/before_fork.rb +28 -0
- data/gems/server/lib/itsi/server/config/options/hooks/before_restart.md +12 -0
- data/gems/server/lib/itsi/server/config/options/hooks/before_restart.rb +28 -0
- data/gems/server/lib/itsi/server/config/options/hooks/before_shutdown.md +12 -0
- data/gems/server/lib/itsi/server/config/options/hooks/before_shutdown.rb +28 -0
- data/gems/server/lib/itsi/server/config/options/include.md +20 -0
- data/gems/server/lib/itsi/server/config/options/include.rb +36 -0
- data/gems/server/lib/itsi/server/config/options/listen_backlog.md +11 -0
- data/gems/server/lib/itsi/server/config/options/listen_backlog.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/log_format.md +18 -0
- data/gems/server/lib/itsi/server/config/options/log_format.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/log_level.md +34 -0
- data/gems/server/lib/itsi/server/config/options/log_level.rb +20 -0
- data/gems/server/lib/itsi/server/config/options/log_target.md +38 -0
- data/gems/server/lib/itsi/server/config/options/log_target.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/log_target_filters.md +17 -0
- data/gems/server/lib/itsi/server/config/options/log_target_filters.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/multithreaded_reactor.md +27 -0
- data/gems/server/lib/itsi/server/config/options/multithreaded_reactor.rb +24 -0
- data/gems/server/lib/itsi/server/config/options/nodelay.md +16 -0
- data/gems/server/lib/itsi/server/config/options/nodelay.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/oob_gc_responses_threshold.md +19 -0
- data/gems/server/lib/itsi/server/config/options/oob_gc_responses_threshold.rb +18 -0
- data/gems/server/lib/itsi/server/config/options/pin_worker_cores.md +17 -0
- data/gems/server/lib/itsi/server/config/options/pin_worker_cores.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/preload.md +21 -0
- data/gems/server/lib/itsi/server/config/options/preload.rb +18 -0
- data/gems/server/lib/itsi/server/config/options/recv_buffer_size.md +15 -0
- data/gems/server/lib/itsi/server/config/options/recv_buffer_size.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/redirect_http_to_https.md +21 -0
- data/gems/server/lib/itsi/server/config/options/redirect_http_to_https.rb +30 -0
- data/gems/server/lib/itsi/server/config/options/request_timeout.md +23 -0
- data/gems/server/lib/itsi/server/config/options/request_timeout.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/reuse_address.md +16 -0
- data/gems/server/lib/itsi/server/config/options/reuse_address.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/reuse_port.md +16 -0
- data/gems/server/lib/itsi/server/config/options/reuse_port.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/scheduler_threads.md +34 -0
- data/gems/server/lib/itsi/server/config/options/scheduler_threads.rb +17 -0
- data/gems/server/lib/itsi/server/config/options/shutdown_timeout.md +17 -0
- data/gems/server/lib/itsi/server/config/options/shutdown_timeout.rb +19 -0
- data/gems/server/lib/itsi/server/config/options/stream_body.md +32 -0
- data/gems/server/lib/itsi/server/config/options/stream_body.rb +18 -0
- data/gems/server/lib/itsi/server/config/options/threads.md +7 -2
- data/gems/server/lib/itsi/server/config/options/threads.rb +1 -1
- data/gems/server/lib/itsi/server/config/options/watch.md +16 -0
- data/gems/server/lib/itsi/server/config/options/watch.rb +28 -0
- data/gems/server/lib/itsi/server/config/options/worker_memory_limit.md +22 -0
- data/gems/server/lib/itsi/server/config/options/worker_memory_limit.rb +18 -0
- data/gems/server/lib/itsi/server/config/options/workers.md +1 -2
- data/gems/server/lib/itsi/server/config/options/workers.rb +1 -1
- data/gems/server/lib/itsi/server/config/typed_struct.rb +59 -20
- data/gems/server/lib/itsi/server/config.rb +77 -48
- data/gems/server/lib/itsi/server/default_config/Itsi.rb +3 -3
- data/gems/server/lib/itsi/server/grpc/grpc_call.rb +1 -1
- data/gems/server/lib/itsi/server/grpc/grpc_interface.rb +11 -4
- data/gems/server/lib/itsi/server/rack/handler/itsi.rb +3 -3
- data/gems/server/lib/itsi/server/route_tester.rb +58 -8
- data/gems/server/lib/itsi/server/signal_trap.rb +1 -1
- data/gems/server/lib/itsi/server/typed_handlers/param_parser.rb +14 -18
- data/gems/server/lib/itsi/server/typed_handlers/source_parser.rb +5 -4
- data/gems/server/lib/itsi/server/typed_handlers.rb +12 -4
- data/gems/server/lib/itsi/server/version.rb +1 -1
- data/gems/server/lib/itsi/server.rb +98 -14
- data/gems/server/lib/ruby_lsp/itsi/addon.rb +20 -18
- data/gems/server/test/helpers/test_helper.rb +89 -29
- data/gems/server/test/middleware/allow_list.rb +128 -0
- data/gems/server/test/middleware/auth_api_key.rb +141 -0
- data/gems/server/test/middleware/auth_basic.rb +91 -0
- data/gems/server/test/middleware/auth_jwt.rb +214 -0
- data/gems/server/test/middleware/cache_control.rb +82 -0
- data/gems/server/test/middleware/cidr_to_regex.rb +46 -0
- data/gems/server/test/middleware/compression.rb +89 -0
- data/gems/server/test/middleware/cors.rb +113 -0
- data/gems/server/test/middleware/csp.rb +62 -0
- data/gems/server/test/middleware/deny_list.rb +131 -0
- data/gems/server/test/middleware/endpoint.rb +300 -0
- data/gems/server/test/middleware/etag.rb +75 -0
- data/gems/server/test/middleware/grpc/grpc.rb +158 -0
- data/gems/server/test/middleware/grpc/test_service.proto +32 -0
- data/gems/server/test/middleware/grpc/test_service_impl.rb +28 -0
- data/gems/server/test/middleware/grpc/test_service_pb.rb +18 -0
- data/gems/server/test/middleware/grpc/test_service_services_pb.rb +30 -0
- data/gems/server/test/middleware/header_interpolation.rb +35 -0
- data/gems/server/test/middleware/intrusion_protection.rb +259 -0
- data/gems/server/test/middleware/location.rb +220 -0
- data/gems/server/test/middleware/max_body.rb +20 -0
- data/gems/server/test/middleware/proxy.rb +415 -0
- data/gems/server/test/middleware/rate_limit.rb +211 -0
- data/gems/server/test/middleware/redirect.rb +85 -0
- data/gems/server/test/middleware/request_headers.rb +50 -0
- data/gems/server/test/middleware/response_headers.rb +50 -0
- data/gems/server/test/middleware/static_assets.rb +374 -0
- data/gems/server/test/middleware/static_response.rb +56 -0
- data/gems/server/test/middleware/string_rewrite.rb +112 -0
- data/gems/server/test/options/bind.rb +47 -0
- data/gems/server/test/options/header_read_timeout.rb +23 -0
- data/gems/server/test/options/test_request_timeout.rb +16 -0
- data/gems/server/test/options/test_workers.rb +2 -4
- data/gems/server/test/{test_itsi_server.rb → rack/test_rack_server.rb} +2 -2
- data/grpc_test/Itsi.rb +11 -0
- data/grpc_test/echo.proto +14 -0
- data/grpc_test/echo_pb.rb +16 -0
- data/grpc_test/echo_service_impl.rb +8 -0
- data/grpc_test/echo_services_pb.rb +22 -0
- data/lib/itsi/version.rb +1 -1
- data/tasks.txt +15 -72
- metadata +210 -7
- data/gems/server/lib/itsi/server/default_config/Itsi-rackup.rb +0 -119
@@ -6,7 +6,10 @@ use std::{
|
|
6
6
|
use tracing::Level;
|
7
7
|
pub use tracing::{debug, error, info, trace, warn};
|
8
8
|
use tracing_appender::rolling;
|
9
|
-
use tracing_subscriber::fmt::
|
9
|
+
use tracing_subscriber::fmt::{
|
10
|
+
format::{FmtSpan, JsonFields},
|
11
|
+
writer::BoxMakeWriter,
|
12
|
+
};
|
10
13
|
use tracing_subscriber::{EnvFilter, fmt, prelude::*, reload};
|
11
14
|
use tracing_subscriber::{Layer, Registry, layer::Layered};
|
12
15
|
|
@@ -62,6 +65,10 @@ pub struct LogConfig {
|
|
62
65
|
pub use_ansi: bool,
|
63
66
|
}
|
64
67
|
|
68
|
+
fn default_log_file() -> String {
|
69
|
+
env::var("ITSI_LOG_FILE").unwrap_or_else(|_| "itsi-app.log".into())
|
70
|
+
}
|
71
|
+
|
65
72
|
impl Default for LogConfig {
|
66
73
|
fn default() -> Self {
|
67
74
|
let level = env::var("ITSI_LOG").unwrap_or_else(|_| "info".into());
|
@@ -70,14 +77,8 @@ impl Default for LogConfig {
|
|
70
77
|
_ => LogFormat::Plain,
|
71
78
|
};
|
72
79
|
let target = match env::var("ITSI_LOG_TARGET").as_deref() {
|
73
|
-
Ok("file") =>
|
74
|
-
|
75
|
-
LogTarget::File(file)
|
76
|
-
}
|
77
|
-
Ok("both") => {
|
78
|
-
let file = env::var("ITSI_LOG_FILE").unwrap_or_else(|_| "app.log".into());
|
79
|
-
LogTarget::Both(file)
|
80
|
-
}
|
80
|
+
Ok("file") => LogTarget::File(default_log_file()),
|
81
|
+
Ok("both") => LogTarget::Both(default_log_file()),
|
81
82
|
_ => LogTarget::Stdout,
|
82
83
|
};
|
83
84
|
// If ITSI_LOG_ANSI is set, use that; otherwise, use ANSI if stdout is a TTY.
|
@@ -115,17 +116,23 @@ fn build_fmt_layer(
|
|
115
116
|
.with_thread_ids(false)
|
116
117
|
.with_writer(BoxMakeWriter::new(std::io::stdout))
|
117
118
|
.with_ansi(config.use_ansi)
|
119
|
+
.with_span_events(FmtSpan::NONE)
|
120
|
+
.fmt_fields(JsonFields::new())
|
118
121
|
.boxed(),
|
119
|
-
LogFormat::Json =>
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
122
|
+
LogFormat::Json => {
|
123
|
+
fmt::layer()
|
124
|
+
.compact()
|
125
|
+
.with_file(false)
|
126
|
+
.with_line_number(false)
|
127
|
+
.with_target(true)
|
128
|
+
.with_thread_ids(false)
|
129
|
+
.with_writer(BoxMakeWriter::new(std::io::stdout))
|
130
|
+
.with_ansi(config.use_ansi)
|
131
|
+
.event_format(fmt::format().json()) // set the JSON event formatter
|
132
|
+
.with_span_events(FmtSpan::NONE)
|
133
|
+
.fmt_fields(JsonFields::new())
|
134
|
+
.boxed()
|
135
|
+
}
|
129
136
|
},
|
130
137
|
LogTarget::File(file) => {
|
131
138
|
let file_clone = file.clone();
|
@@ -140,6 +147,8 @@ fn build_fmt_layer(
|
|
140
147
|
rolling::daily(".", file_clone.clone())
|
141
148
|
}))
|
142
149
|
.with_ansi(false)
|
150
|
+
.with_span_events(FmtSpan::NONE)
|
151
|
+
.fmt_fields(JsonFields::new())
|
143
152
|
.boxed(),
|
144
153
|
LogFormat::Json => {
|
145
154
|
let file_clone = file.clone();
|
@@ -153,7 +162,9 @@ fn build_fmt_layer(
|
|
153
162
|
rolling::daily(".", file_clone.clone())
|
154
163
|
}))
|
155
164
|
.with_ansi(false)
|
156
|
-
.json()
|
165
|
+
.event_format(fmt::format().json()) // set the JSON event formatter
|
166
|
+
.with_span_events(FmtSpan::NONE)
|
167
|
+
.fmt_fields(JsonFields::new())
|
157
168
|
.boxed()
|
158
169
|
}
|
159
170
|
}
|
@@ -169,6 +180,8 @@ fn build_fmt_layer(
|
|
169
180
|
.with_target(true)
|
170
181
|
.with_thread_ids(false)
|
171
182
|
.with_writer(BoxMakeWriter::new(std::io::stdout))
|
183
|
+
.with_span_events(FmtSpan::NONE)
|
184
|
+
.fmt_fields(JsonFields::new())
|
172
185
|
.with_ansi(config.use_ansi);
|
173
186
|
let file_layer = fmt::layer()
|
174
187
|
.compact()
|
@@ -179,6 +192,8 @@ fn build_fmt_layer(
|
|
179
192
|
.with_writer(BoxMakeWriter::new(move || {
|
180
193
|
rolling::daily(".", file_clone.clone())
|
181
194
|
}))
|
195
|
+
.with_span_events(FmtSpan::NONE)
|
196
|
+
.fmt_fields(JsonFields::new())
|
182
197
|
.with_ansi(false);
|
183
198
|
stdout_layer.and_then(file_layer).boxed()
|
184
199
|
}
|
@@ -191,7 +206,9 @@ fn build_fmt_layer(
|
|
191
206
|
.with_thread_ids(false)
|
192
207
|
.with_writer(BoxMakeWriter::new(std::io::stdout))
|
193
208
|
.with_ansi(config.use_ansi)
|
194
|
-
.json()
|
209
|
+
.event_format(fmt::format().json()) // set the JSON event formatter
|
210
|
+
.with_span_events(FmtSpan::NONE)
|
211
|
+
.fmt_fields(JsonFields::new());
|
195
212
|
let file_layer = fmt::layer()
|
196
213
|
.compact()
|
197
214
|
.with_file(false)
|
@@ -202,7 +219,9 @@ fn build_fmt_layer(
|
|
202
219
|
rolling::daily(".", file_clone.clone())
|
203
220
|
}))
|
204
221
|
.with_ansi(false)
|
205
|
-
.json()
|
222
|
+
.event_format(fmt::format().json()) // set the JSON event formatter
|
223
|
+
.with_span_events(FmtSpan::NONE)
|
224
|
+
.fmt_fields(JsonFields::new());
|
206
225
|
stdout_layer.and_then(file_layer).boxed()
|
207
226
|
}
|
208
227
|
}
|
@@ -279,6 +298,7 @@ pub fn set_level(new_level: &str) {
|
|
279
298
|
pub fn set_target(new_target: &str) {
|
280
299
|
let target: LogTarget = match new_target {
|
281
300
|
"stdout" => LogTarget::Stdout,
|
301
|
+
"both" => LogTarget::Both(default_log_file()),
|
282
302
|
path => LogTarget::File(path.to_string()),
|
283
303
|
};
|
284
304
|
if let Some(config_mutex) = CURRENT_CONFIG.get() {
|
data/docs/content/_index.md
CHANGED
@@ -8,8 +8,7 @@ type: docs
|
|
8
8
|
|
9
9
|
|
10
10
|
Itsi is a feature-packed, high performance web and application server, with first-class support for Ruby applications.
|
11
|
-
It's a compliant Rack server
|
12
|
-
It's *also* a well-equipped Reverse Proxy, API Gateway and Static file server, controlled by an intuitive and elegant configuration API and DSL.
|
11
|
+
It's a compliant Rack server. It’s also a well-equipped reverse-proxy, API gateway, and static file server, controlled by an intuitive and elegant configuration API and DSL.
|
13
12
|
|
14
13
|
|
15
14
|
Itsi is motivated by the belief that:
|
@@ -1,11 +1,12 @@
|
|
1
1
|
---
|
2
2
|
title: Acknowledgements
|
3
3
|
type: docs
|
4
|
+
prev: itsi_scheduler/
|
4
5
|
sidebar:
|
5
6
|
exclude: true
|
6
7
|
---
|
7
8
|
|
8
|
-
Itsi
|
9
|
+
Itsi has a long list of **critical** dependencies and **strong** influences.
|
9
10
|
|
10
11
|
|
11
12
|
## Key Dependencies
|
@@ -17,6 +18,8 @@ It is an absolutely essential component of Itsi.
|
|
17
18
|
Tokio is a fast and featureful asynchronous runtime for Rust.
|
18
19
|
It is the backbone of *all* asynchronous IO in Itsi.
|
19
20
|
|
21
|
+
* [rb-sys](https://github.com/oxidize-rb/rb-sys) and [magnus](https://github.com/matsadler/magnus), two essential libraries for building Ruby extensions in Rust.
|
22
|
+
|
20
23
|
* and many more [essential](https://github.com/wouterken/itsi/blob/main/crates/itsi_server/Cargo.toml) Rust crates!
|
21
24
|
|
22
25
|
* [hugo](https://gohugo.io/) and [hextra](https://imfing.github.io/hextra/) - generating *this very page* and allowing me to put together
|
@@ -24,7 +27,7 @@ this website with minimal effort.
|
|
24
27
|
|
25
28
|
|
26
29
|
## Inspiration
|
27
|
-
* [Puma](https://puma.io/) is a long-standing industry
|
30
|
+
* [Puma](https://puma.io/) is a long-standing industry heavyweight and the current leading choice of web server in the Ruby ecosystem.
|
28
31
|
It's mature, stable and rock solid. Many features and interfaces of Itsi have been inspired by Puma.
|
29
32
|
|
30
33
|
* [NGINX](https://nginx.org/) is a popular open-source web server and reverse proxy server.
|
@@ -2,7 +2,8 @@
|
|
2
2
|
title: Configuration
|
3
3
|
type: docs
|
4
4
|
weight: 3
|
5
|
-
next:
|
5
|
+
next: options/
|
6
|
+
prev: getting_started/
|
6
7
|
---
|
7
8
|
|
8
9
|
## Itsi.rb
|
@@ -13,13 +14,13 @@ If you're ready to get stuck in and learn all about what Itsi has to offer, use
|
|
13
14
|
|
14
15
|
|
15
16
|
## Out-of-the-box
|
16
|
-
If you prefer a more gradual introduction, Itsi provides several
|
17
|
+
If you prefer a more gradual introduction, Itsi provides several out-of-the box capabilities that you can take advantage of immediately, *without* needing to create a dedicated configuration file.
|
17
18
|
|
18
19
|
|
19
20
|
|
20
21
|
## Run Rack Applications
|
21
22
|
Itsi will automatically host your Rack application if you launch it in a directory with a `config.ru` file.
|
22
|
-
This means, it's a drop
|
23
|
+
This means, it's a drop-in server replacement (and potentially a free performance boost) for your favorite `Rails`, `Hanami`, or `Sinatra` applications.
|
23
24
|
|
24
25
|
To get started just run
|
25
26
|
```ruby
|
@@ -33,7 +34,7 @@ There's also a Rails adapter allowing you to add it to your Gemfile and launch i
|
|
33
34
|
rails server -U itsi
|
34
35
|
```
|
35
36
|
{{< callout type="info" >}}
|
36
|
-
Note that `rails server -U itsi` runs Itsi with
|
37
|
+
Note that `rails server -U itsi` runs Itsi with an intentionally minimal footprint, specifically for development purposes. To take full advantage of Itsi's concurrency features,
|
37
38
|
it's advised you tweak these inside a dedicated `Itsi.rb` file.
|
38
39
|
{{< /callout >}}
|
39
40
|
|
@@ -90,8 +91,10 @@ COMMAND:
|
|
90
91
|
restart - Restart the server
|
91
92
|
add_worker - Add a new worker to the server cluster
|
92
93
|
remove_worker - Remove a worker from the server cluster
|
94
|
+
test - Test config file validity
|
93
95
|
routes - Print the routes of the server
|
94
|
-
passfile - Manage hashed users and passwords in a passfile (like .htpasswd). [add, remove, list]
|
96
|
+
passfile - Manage hashed users and passwords in a passfile (like .htpasswd). [add, echo, remove, list]
|
97
|
+
secret - Generate a new secret for use in a JWT verifier
|
95
98
|
test_route - Test which route a request will be routed to
|
96
99
|
static - Serve static assets in the given directory
|
97
100
|
|
@@ -1,7 +1,14 @@
|
|
1
1
|
---
|
2
2
|
title: Contact
|
3
3
|
type: docs
|
4
|
-
weight: 3
|
5
4
|
sidebar:
|
6
5
|
exclude: true
|
7
6
|
---
|
7
|
+
<img src="../itsi-server-100.png" alt="asd" width="80px" style="display: block; margin-left: auto; margin-right: auto;">
|
8
|
+
|
9
|
+
* GitHub: [@wouterken](https://github.com/wouterken/)
|
10
|
+
* Email: [wc@pico.net.nz](mailto:wc@pico.net.nz)
|
11
|
+
|
12
|
+
For general inquiries, please feel free to contact me via email at wc@pico.net.nz.
|
13
|
+
|
14
|
+
For issues and bugs, please open an issue on GitHub at https://github.com/wouterken/itsi/issues.
|
data/docs/content/faqs/_index.md
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
---
|
2
|
-
title:
|
2
|
+
title: FAQs
|
3
3
|
type: docs
|
4
|
+
prev: middleware/
|
5
|
+
next: utilities/
|
4
6
|
---
|
5
7
|
|
6
8
|
{{% details title="Is it just for Ruby applications?" closed="true" %}}
|
7
|
-
**No!** While one of Itsi's goals is to be the most frictionless way to get Ruby onto the web, it stands alone as a powerful
|
9
|
+
**No!** While one of Itsi's goals is to be the most frictionless way to get Ruby onto the web, it stands alone as a powerful reverse Proxy, static File Server and API gateway.
|
8
10
|
|
9
11
|
You can have Itsi sit in front of *any* application that speaks HTTP and immediately benefit from security middleware, performance enhancements, and more.
|
10
12
|
You will need to write a little bit of Ruby, just to configure your Itsi server inside the `Itsi.rb` file. Who knows, maybe you'll learn to love it!
|
@@ -17,7 +19,7 @@ Take a look at the [Cargo.toml](https://github.com/wouterken/itsi/blob/main/crat
|
|
17
19
|
This is exposed via a robust and ergonomic Ruby DSL.
|
18
20
|
{{% /details %}}
|
19
21
|
|
20
|
-
{{% details title="What
|
22
|
+
{{% details title="What license is it under?" closed="true" %}}
|
21
23
|
Itsi is an open source project licensed under the terms of the [LGPLv3](https://www.gnu.org/licenses/lgpl-3.0.en.html).
|
22
24
|
|
23
25
|
You can integrate and use Itsi in your projects—whether they are open source or proprietary—without any licensing fees or obligations, as long as you use Itsi in its unmodified form. However, if you modify Itsi’s source code and distribute the modified version, you are required to release your modifications under the same LGPLv3 license.
|
@@ -2,11 +2,12 @@
|
|
2
2
|
title: Features
|
3
3
|
type: docs
|
4
4
|
weight: 1
|
5
|
+
next: /getting_started
|
5
6
|
---
|
6
7
|
|
7
8
|
Itsi bundles a slew of essential modern web features into a single, easy-to-use package.
|
8
|
-
Here's a list of
|
9
|
-
|
9
|
+
Here's a list of the essentials.
|
10
|
+
Or jump straight in to <a target="_blank" href="tsi](/getting_started)">install</a> and <a target="_blank" href="t](/configuration)"> configure</a> for a deeper dive.
|
10
11
|
|
11
12
|
{{< callout >}}
|
12
13
|
You don't need to use all of the features listed below to benefit from Itsi. E.g.
|
@@ -25,33 +26,33 @@ Pick and choose **just** the features that make sense for you.
|
|
25
26
|
* Streaming compression
|
26
27
|
* Serve static precompressed files from the file-system
|
27
28
|
* gRPC compression (`zlib` and `gzip`)
|
28
|
-
* See
|
29
|
+
* See <a target="_blank" href="/middleware/compression">compression</a>
|
29
30
|
{{% /details %}}
|
30
31
|
|
31
32
|
{{% details title="CORS" closed="true" %}}
|
32
33
|
* Full control over CORS rules on a location-by-location basis.
|
33
|
-
* See
|
34
|
+
* See <a target="_blank" href="/middleware/cors">cors</a>
|
34
35
|
{{% /details %}}
|
35
36
|
|
36
37
|
{{% details title="ETag and Cache Control" closed="true" %}}
|
37
38
|
* Weak and Strong eTag support.
|
38
39
|
* `If-None-Match` and `If-Modified-Since` support.
|
39
40
|
* Automated etag generation for dynamic content (or forwarding of existing `etags` if present)
|
40
|
-
* See
|
41
|
+
* See <a target="_blank" href="/middleware/etag">etag</a> and <a target="_blank" href="/middleware/cache_control">cache_control</a>
|
41
42
|
{{% /details %}}
|
42
43
|
|
43
|
-
{{% details title="
|
44
|
+
{{% details title="Configurable Middleware" closed="true" %}}
|
44
45
|
* Expressive controls to apply middleware selectively on a request-by-request basis.
|
45
46
|
* Expressive matching based on route, content-type and body size, hostnames etc.
|
46
47
|
* A single Itsi process can support simultaneous running of several apps, each with specialized configuration.
|
47
|
-
* See
|
48
|
+
* See <a target="_blank" href="/middleware/location">location</a>
|
48
49
|
{{% /details %}}
|
49
50
|
|
50
51
|
{{% details title="Redirects" closed="true" %}}
|
51
52
|
* Simple redirect functionality (all of `permanent`, `temporary`, `found`, `moved_permanently`)
|
52
|
-
* HTTP to
|
53
|
+
* HTTP to HTTPS Redirects
|
53
54
|
* Dynamic URL Rewriting
|
54
|
-
* See
|
55
|
+
* See <a target="_blank" href="/middleware/redirect">redirect</a>
|
55
56
|
{{% /details %}}
|
56
57
|
|
57
58
|
{{% details title="Reverse Proxy" closed="true" %}}
|
@@ -61,12 +62,12 @@ Pick and choose **just** the features that make sense for you.
|
|
61
62
|
* Multiple backends per host, with load balancing and failover support
|
62
63
|
* Automatic retries for Idempotent requests
|
63
64
|
* Configurable error pages
|
64
|
-
* See
|
65
|
+
* See <a target="_blank" href="/middleware/proxy">proxy</a>
|
65
66
|
{{% /details %}}
|
66
67
|
|
67
68
|
{{% details title="Range Requests" closed="true" %}}
|
68
69
|
* Partial content delivery support, so clients can resume downloads or stream large files efficiently.
|
69
|
-
* See
|
70
|
+
* See <a target="_blank" href="/middleware/static_assets">static_assets</a>
|
70
71
|
{{% /details %}}
|
71
72
|
|
72
73
|
{{% details title="Static File Server" closed="true" %}}
|
@@ -75,31 +76,31 @@ Efficiently serves static assets with proper content types and caching headers.
|
|
75
76
|
* Configurable in-memory caching for faster serving of small and frequently accessed files.
|
76
77
|
* Auto try `.html` extension (for cleaner paths)
|
77
78
|
* Configurable fallback behaviour (e.g. route request misses to an index.html for SPAs)
|
78
|
-
* See
|
79
|
+
* See <a target="_blank" href="/middleware/static_assets">static_assets</a>
|
79
80
|
{{% /details %}}
|
80
81
|
|
81
82
|
{{% details title="Multiple Binds" closed="true" %}}
|
82
83
|
* Itsi can listen on multiple IP addresses or ports simultaneously for flexible deployment.
|
83
84
|
* Unix socket binds (both plain-text and TLS) are supported.
|
84
|
-
* See
|
85
|
+
* See <a target="_blank" href="/options/bind">bind</a>.
|
85
86
|
{{% /details %}}
|
86
87
|
|
87
88
|
## DevOps
|
88
89
|
{{% details title="File Watcher & Live Reloading" closed="true" %}}
|
89
90
|
* Monitors file changes and to automatically reloads configuration or content.
|
90
91
|
* Use custom watchers to e.g. trigger frontend builds on file changes.
|
91
|
-
* See
|
92
|
+
* See <a target="_blank" href="/getting_started/local_development">local_development</a>, <a target="_blank" href="/options/auto_reload_config">auto_reload_config</a>, and <a target="_blank" href="/options/watch">watch</a>.
|
92
93
|
{{% /details %}}
|
93
94
|
|
94
95
|
{{% details title="LSP and shell completion support" closed="true" %}}
|
95
96
|
* The bundled RubyLSP addon provides rich inline documentation and hover support when editing `Itsi.rb` files.
|
96
|
-
* Shell completion support (
|
97
|
-
* See
|
97
|
+
* Shell completion support (add `eval "$(itsi --install-completions)"` to the bottom of your shell init file)
|
98
|
+
* See <a target="_blank" href="/getting_started/local_development">local_development</a>.
|
98
99
|
{{% /details %}}
|
99
100
|
|
100
101
|
{{% details title="Status Reporting" closed="true" %}}
|
101
102
|
* Send SIGUSR2 to trigger detailed status report across all Itsi processes.
|
102
|
-
* See
|
103
|
+
* See <a target="_blank" href="/getting_started/signals">signals</a>.
|
103
104
|
{{% /details %}}
|
104
105
|
|
105
106
|
{{% details title="Granular Logging" closed="true" %}}
|
@@ -107,25 +108,25 @@ Efficiently serves static assets with proper content types and caching headers.
|
|
107
108
|
* Support `STDOUT`, file-system and combined log sinks.
|
108
109
|
* Apply selective log levels for specific log targets only.
|
109
110
|
* Configurable request logging middleware, with custom log templates.
|
110
|
-
* See
|
111
|
+
* See <a target="_blank" href="/middleware/log_requests">Request Logs</a> & <a target="_blank" href="/getting_started/logging">Logging</a>.
|
111
112
|
{{% /details %}}
|
112
113
|
|
113
114
|
{{% details title="Hot Config Reloads & Config File Validation" closed="true" %}}
|
114
115
|
* Zero-downtime config file reloads.
|
115
116
|
* Phased restart support when running in `cluster` mode
|
116
117
|
* Config file testing and dry-run functionality
|
117
|
-
* See
|
118
|
+
* See <a target="_blank" href="/getting_started/signals">signals</a> and <a target="_blank" href="/options/auto_reload_config">auto_reload_config</a>.
|
118
119
|
{{% /details %}}
|
119
120
|
|
120
121
|
{{% details title="Configurable Error Responses" closed="true" %}}
|
121
122
|
* Provide your own exception responses (HTML and JSON) for all common exception scenarios, or simply rely on the light-weight defaults.
|
122
|
-
* See
|
123
|
+
* See <a target="_blank" href="/middleware/error_response">error_responses</a>.
|
123
124
|
{{% /details %}}
|
124
125
|
|
125
126
|
{{% details title="Management Signals" closed="true" %}}
|
126
127
|
* Use a full suite of Unix signals to control your live Itsi cluster.
|
127
128
|
* Add or remove workers on the fly, reload config, generate status reports etc.
|
128
|
-
* See
|
129
|
+
* See <a target="_blank" href="/getting_started/signals">signals</a>.
|
129
130
|
{{% /details %}}
|
130
131
|
|
131
132
|
## Security
|
@@ -137,118 +138,123 @@ Efficiently serves static assets with proper content types and caching headers.
|
|
137
138
|
|
138
139
|
Itsi also comes bundled with a passfile generator, to help you manage your password hashes effectively.
|
139
140
|
|
140
|
-
* See
|
141
|
+
* See <a target="_blank" href="/middleware/auth_jwt">auth_jwt</a>, <a target="_blank" href="/middleware/auth_api_key">auth_api_key</a>, <a target="_blank" href="/middleware/auth_basic">auth_basic</a> and <a target="_blank" href="/utilities/passfile_generator">passfile</a>.
|
141
142
|
{{% /details %}}
|
142
143
|
|
143
144
|
{{% details title="Automatic Let's Encrypt Certificates" closed="true" %}}
|
144
145
|
* Automated provisioning of Let's Encrypt certificates.
|
145
146
|
* File system caching of certificate data to avoid excessive API calls.
|
146
147
|
* Supports usage of subject alternative names (SANs) for certificates that span multiple domains/sub-domains.
|
147
|
-
* See
|
148
|
+
* See <a target="_blank" href="/options/certificates#production-certificates-lets-encrypt">certificates</a>.
|
148
149
|
{{% /details %}}
|
149
150
|
|
150
151
|
{{% details title="Automatic Development Certificates" closed="true" %}}
|
151
152
|
* Easily mirror your production SSL set-up in Development
|
152
153
|
* Custom local CA generation (add this CA cert to your trusted root certificates for warning-less SSL during local development)
|
153
|
-
* See
|
154
|
+
* See <a target="_blank" href="/options/certificates#development">certificates</a>.
|
154
155
|
{{% /details %}}
|
155
156
|
|
156
157
|
{{% details title="(Distributed) Rate Limiting" closed="true" %}}
|
157
158
|
* Combine any number of configurable rate limits
|
158
159
|
* Support for a `Redis` backend for distributed rate limiting (falls back to in-memory backend)
|
159
160
|
* In-memory backend for simple setups and local development.
|
160
|
-
* See
|
161
|
+
* See <a target="_blank" href="/middleware/rate_limit">rate_limit</a>.
|
161
162
|
{{% /details %}}
|
162
163
|
|
163
164
|
{{% details title="Allow & Deny Lists" closed="true" %}}
|
164
165
|
* IP Allow lists to limit access to a specific set of IP addresses or blocks.
|
165
166
|
* IP Deny lists to block access from specific IP addresses or blocks.
|
166
|
-
* See
|
167
|
+
* See <a target="_blank" href="/middleware/allow_list">allow_list</a> & <a target="_blank" href="/middleware/deny_list">deny_list</a>.
|
167
168
|
{{% /details %}}
|
168
169
|
|
169
170
|
{{% details title="Intrusion Protection" closed="true" %}}
|
170
171
|
* Automatically scan request paths and headers for known malicious patterns
|
171
172
|
* Configurable ban rules to block offenders for a specified duration.
|
172
|
-
* See
|
173
|
+
* See <a target="_blank" href="/middleware/intrusion_protection">intrusion_protection</a>
|
173
174
|
{{% /details %}}
|
174
175
|
|
175
176
|
{{% details title="Slowhttp attack prevention" closed="true" %}}
|
176
177
|
* Protections against several slowhttp attacks (e.g. Slowloris, Slowbody), through header and request timeouts and maximum request body sizes.
|
177
|
-
* See
|
178
|
+
* See <a target="_blank" href="/options/max_body">max_body</a>, <a target="_blank" href="/options/request_timeout">request_timeout</a> and <a target="_blank" href="/options/header_read_timeout">header_read_timeout</a>
|
178
179
|
{{% /details %}}
|
179
180
|
|
180
181
|
{{% details title="CSP Reporting" closed="true" %}}
|
181
182
|
* Simple configuration for enabling CSP headers.
|
182
183
|
* Support for hosting a CSP reporting endpoint to track violations of CSPs running in reporting only mode.
|
183
|
-
* See
|
184
|
+
* See <a target="_blank" href="/middleware/csp">CSP</a>
|
184
185
|
{{% /details %}}
|
185
186
|
|
186
187
|
## Protocols & Standards
|
187
188
|
{{% details title="HTTP2" closed="true" %}}
|
188
189
|
* Benefit from connection multiplexing by using http2 all the way from client to app/file server.
|
189
|
-
* `Itsi`'s underlying HTTP1 and 2 implementations are provided directly by
|
190
|
+
* `Itsi`'s underlying HTTP1 and 2 implementations are provided directly by <a target="_blank" href="https://github.com/hyperium/hyper">hyper</a>. Itsi simply exposes these existing capabilities. This means that once <a target="_blank" href="https://hyper.rs/contrib/roadmap/#http3">h3</a> lands in Hyper - we'll get it in Itsi too!
|
190
191
|
{{% /details %}}
|
191
192
|
|
192
193
|
{{% details title="Rack Server" closed="true" %}}
|
193
194
|
* Rack compliant. Itsi plays nicely with your existing Rack-based applications and middleware.
|
194
|
-
* See
|
195
|
+
* See <a target="_blank" href="/middleware/run">run</a> and <a target="_blank" href="/middleware/rackup_file">rackup_file</a>
|
195
196
|
{{% /details %}}
|
196
197
|
|
197
198
|
{{% details title="gRPC Server" closed="true" %}}
|
198
199
|
* Itsi is compatible with ruby `grpc` service handlers and can
|
199
|
-
replace the
|
200
|
-
* Consider
|
200
|
+
replace the <a target="_blank" href="https://github.com/grpc/grpc/blob/master/src/ruby/README.md">official</a> Ruby gRPC server implementation for a free performance boost!
|
201
|
+
* Consider enabling [non-blocking IO](/options/fiber_scheduler) to further enhance performance.
|
201
202
|
* Support for gRPC server reflection (use with tools like evans and Postman for easy service discovery)
|
202
203
|
* Support for gzip and zlib compression
|
203
|
-
* See
|
204
|
+
* See <a target="_blank" href="/middleware/grpc">grpc</a>
|
204
205
|
{{% /details %}}
|
205
206
|
|
206
207
|
{{% details title="gRPC+REST compatibility mode" closed="true" %}}
|
207
208
|
* Itsi provides a `gRPC+REST` compatibility layer for easy reuse of gRPC endpoints by clients and environments that are not gRPC capable. Invoke unidirectional and streaming endpoints using plain-old JSON.
|
208
|
-
* See
|
209
|
+
* See <a target="_blank" href="/middleware/grpc">grpc</a>
|
209
210
|
{{< callout type="warn" >}}
|
210
|
-
Note: This is not the same as
|
211
|
+
Note: This is not the same as <a target="_blank" href="https://grpc.io/blog/grpc-with-json/">gRPC with JSON</a> which swaps out protobuf for JSON but still relies on gRPC's underlying framing mechanics.
|
211
212
|
{{< /callout >}}
|
212
213
|
{{% /details %}}
|
213
214
|
|
214
215
|
{{% details title="WebSockets" closed="true" %}}
|
215
|
-
* WebSocket support for Rack apps (e.g.
|
216
|
+
* WebSocket support for Rack apps (e.g. <a target="_blank" a href="https://guides.rubyonrails.org/action_cable_overview.html">ActionCable</a>)
|
216
217
|
{{% /details %}}
|
217
218
|
|
218
219
|
## Concurrency & Performance
|
219
220
|
{{% details title="Cluster Mode" closed="true" %}}
|
220
221
|
* Supports running in a clustered mode, to fully leverage multi-core systems.
|
221
|
-
* See
|
222
|
+
* See <a target="_blank" href="/options/workers">workers</a>.
|
222
223
|
{{% /details %}}
|
223
224
|
|
224
225
|
{{% details title="Non-blocking(Fiber Scheduler) Mode" closed="true" %}}
|
225
226
|
* Support for Ruby’s fiber scheduler for non-blocking concurrency, boosting performance during I/O operations.
|
226
|
-
* Use Itsi's own high-performance
|
227
|
-
* See
|
227
|
+
* Use Itsi's own high-performance built-in <a target="_blank" href="/itsi_scheduler">Fiber Scheduler</a> or if your prefer you can bring your own!
|
228
|
+
* See <a target="_blank" href="/options/fiber_scheduler">fiber_scheduler</a>.
|
228
229
|
{{% /details %}}
|
229
230
|
|
230
231
|
{{% details title="Hybrid Blocking/Non-Blocking Mode" closed="true" %}}
|
231
232
|
* `Itsi` allows you to split endpoints between using a Fiber scheduler versus running using the traditional blocking IO model. This allows you to dip your toes into the waters of Ruby's new non-blocking IO, without having to port an entire application at once!
|
232
|
-
* See
|
233
|
+
* See <a target="_blank" href="/options/scheduler_threads">scheduler_threads</a>.
|
233
234
|
{{% /details %}}
|
234
235
|
|
235
236
|
{{% details title="Non-blocking by design" closed="true" %}}
|
236
|
-
* Itsi is underpinned by
|
237
|
+
* Itsi is underpinned by <a target="_blank" href="https://hyper.rs/">hyper</a> and <a target="_blank" href="https://tokio.rs/">tokio</a> and as such is fundamentally an evented, non-blocking server. Whether you're proxying, serving large files, or delegating to Ruby endpoints, `Itsi` remains responsive, even under heavy load.
|
237
238
|
{{% /details %}}
|
238
239
|
|
239
240
|
## Ruby
|
240
241
|
{{% details title="Preloading" closed="true" %}}
|
241
242
|
* Preload your Ruby application code before forking to benefit from reduced memory through CoW
|
242
243
|
* Alternatively, use groups in bundler to target specific gems or dependencies for preloading
|
243
|
-
* See
|
244
|
+
* See <a target="_blank" href="/options/preload">preload</a>.
|
244
245
|
{{% /details %}}
|
245
246
|
|
246
|
-
{{% details title="Streaming Bodies" closed="true" %}}
|
247
|
-
* For both
|
247
|
+
{{% details title="Streaming Response Bodies" closed="true" %}}
|
248
|
+
* For both <a target="_blank" href="https://github.com/rack/rack/blob/main/SPEC.rdoc#the-body-">streaming</a> and <a target="_blank" href="https://github.com/rack/rack/blob/main/SPEC.rdoc#enumerable-body-">Enumerable</a> bodies, Itsi sends data to the client as soon as it is available. This means modules like <a target="_blank" href="https://api.rubyonrails.org/v7.1/classes/ActionController/Live.html">ActionController</a> behave as expected, and the minimal buffering keeps `Itsi`'s memory footprint consistently low.
|
249
|
+
{{% /details %}}
|
250
|
+
|
251
|
+
{{% details title="Streaming Request Bodies" closed="true" %}}
|
252
|
+
* Itsi supports streaming incoming request bodies too, for efficient processing of large simultaneous input streams (Disabled by default for maximum compatibility).
|
253
|
+
* See <a target="_blank" href="/options/stream_body">stream_body</a>.
|
248
254
|
{{% /details %}}
|
249
255
|
|
250
256
|
{{% details title="Full & Partial Rack Hijacking" closed="true" %}}
|
251
|
-
* Itsi supports both
|
257
|
+
* Itsi supports both <a href="https://github.com/rack/rack/blob/main/SPEC.rdoc#hijacking-" target="_blank">full</a> and partial Rack hijacking. Even over HTTP2!
|
252
258
|
{{< callout type="warn" >}}
|
253
259
|
By design, Full hijacking assumes you are writing a raw HTTP1 response directly to a raw connection stream.
|
254
260
|
Itsi's support for full hijack over HTTP2 is similar to what you would see if running a dedicated reverse proxy in front of a Ruby app.
|
@@ -258,7 +264,7 @@ Itsi translates that request from HTTP1 to HTTP2, in real-time, allowing full hi
|
|
258
264
|
|
259
265
|
{{% details title="Sendfile" closed="true" %}}
|
260
266
|
* Itsi allows Ruby apps to set a `X-Sendfile` header to enable efficient, streaming file transfers, outside of Ruby, via fast native code.
|
261
|
-
* See
|
267
|
+
* See <a target="_blank" href="/middleware/run">run</a> and <a target="_blank" href="/middleware/rackup_file">rackup_file</a>.
|
262
268
|
|
263
269
|
{{< callout type="info" >}}
|
264
270
|
Note that despite the header being named `X-Sendfile`, Itsi does not use the Sendfile system call, instead delegating the efficient streaming to Tokio's native asynchronous file streaming capabilities.
|
@@ -269,17 +275,17 @@ Note that despite the header being named `X-Sendfile`, Itsi does not use the Sen
|
|
269
275
|
{{% details title="Graceful Memory Limits" closed="true" %}}
|
270
276
|
* Itsi allows you to specify memory limits for Ruby processes. When the limit is reached, Itsi gracefully terminates the process and also invokes a dedicated `after_memory_threshold_reached` callback,
|
271
277
|
so that you can log the event for further analysis.
|
272
|
-
* See
|
278
|
+
* See <a target="_blank" href="/options/worker_memory_limit">worker_memory_limit</a> and <a target="_blank" href="/options/after_memory_threshold_reached">after_memory_threshold_reached</a>.
|
273
279
|
{{% /details %}}
|
274
280
|
|
275
281
|
{{% details title="OOB GC" closed="true" %}}
|
276
282
|
* Itsi can be configured to periodically trigger GC every N idle periods (where an idle period is defined as a time where no requests are currently queued).
|
277
283
|
* Periodic triggering of GC outside of the request flow can help reduce the impact of GC on latency.
|
278
|
-
* See
|
284
|
+
* See <a target="_blank" href="/options/oob_gc">oob_gc_threshold</a>
|
279
285
|
{{% /details %}}
|
280
286
|
|
281
287
|
{{% details title="'Rackless' Ruby Apps" closed="true" %}}
|
282
288
|
* Itsi allows definition of ultra-light-weight Ruby web-apps, using plain old functions and procs.
|
283
289
|
* For simple endpoints this barebones option can provide a substantial increase in throughput over a Rack request (primarily by avoiding allocating the env hash and response array)
|
284
|
-
* See
|
290
|
+
* See <a target="_blank" href="/middleware/endpoint">endpoint</a>
|
285
291
|
{{% /details %}}
|
@@ -2,6 +2,8 @@
|
|
2
2
|
title: Getting Started
|
3
3
|
type: docs
|
4
4
|
weight: 2
|
5
|
+
prev: features/
|
6
|
+
next: getting_started/local_development/
|
5
7
|
---
|
6
8
|
|
7
9
|
{{% steps %}}
|
@@ -49,7 +51,7 @@ Install Ruby
|
|
49
51
|
{{< /callout >}}
|
50
52
|
|
51
53
|
{{< /tab >}}
|
52
|
-
{{< tab >}}**Windows**: Itsi currently doesn't support native Windows builds, but it runs
|
54
|
+
{{< tab >}}**Windows**: Itsi currently doesn't support native Windows builds, but it runs well on [https://learn.microsoft.com/en-us/windows/wsl/install](WSL).
|
53
55
|
|
54
56
|
Follow the linked instructions to Install a linux distribution like Ubuntu or Debian and then follow the instructions in the Linux tab.
|
55
57
|
{{< /tab >}}
|
@@ -60,11 +62,12 @@ Install Ruby
|
|
60
62
|
|
61
63
|
Great! You now have Itsi installed. Go to one of the following pages to learn how to use it:
|
62
64
|
|
65
|
+
|
63
66
|
{{< cards >}}
|
64
|
-
{{< card link="
|
65
|
-
{{< card link="../
|
66
|
-
{{< card link="../
|
67
|
-
{{< card link="
|
67
|
+
{{< card link="./local_development" title="Local Development" icon="star" >}}
|
68
|
+
{{< card link="../options" title="Options" icon="adjustments" >}}
|
69
|
+
{{< card link="../middleware" title="Middleware" icon="cog" >}}
|
70
|
+
{{< card link="https://github.com/wouterken/itsi" title="Source Code" icon="github" >}}
|
68
71
|
{{< /cards >}}
|
69
72
|
|
70
73
|
{{% /steps %}}
|