{ "$schema": "http://json-schema.org/draft-07/schema#", "additionalProperties": { "anyOf": [ { "additionalProperties": false, "properties": { "access_log": { "additionalProperties": false, "description": "Access log config", "examples": [ { "fields": { "headers": { "config": { "foo": "redact" }, "default": "keep" } }, "filters": { "status_codes": { "values": [ "200-299" ] } }, "format": "combined", "path": "/var/log/access.log" } ], "properties": { "buffer_size": { "default": 65536, "description": "The size of the buffer.", "minimum": 0, "type": "integer" }, "fields": { "additionalProperties": false, "properties": { "cookie": { "additionalProperties": false, "properties": { "config": { "additionalProperties": { "enum": [ "drop", "keep", "redact" ], "type": "string" }, "type": "object" }, "default": { "$ref": "#/definitions/AccessLogFieldMode" } }, "required": [ "config" ], "type": "object" }, "header": { "additionalProperties": false, "properties": { "config": { "additionalProperties": { "enum": [ "drop", "keep", "redact" ], "type": "string" }, "type": "object" }, "default": { "$ref": "#/definitions/AccessLogFieldMode" } }, "required": [ "config" ], "type": "object" }, "query": { "additionalProperties": false, "properties": { "config": { "additionalProperties": { "enum": [ "drop", "keep", "redact" ], "type": "string" }, "type": "object" }, "default": { "$ref": "#/definitions/AccessLogFieldMode" } }, "required": [ "config" ], "type": "object" } }, "type": "object" }, "filters": { "additionalProperties": false, "properties": { "cidr": { "additionalProperties": false, "properties": { "negative": { "default": false, "description": "Whether the filter is negative.", "type": "boolean" }, "values": { "items": { "$ref": "#/definitions/CIDR" }, "type": "array" } }, "required": [ "values" ], "type": "object" }, "headers": { "additionalProperties": false, "properties": { "negative": { "default": false, "description": "Whether the filter is negative.", "type": "boolean" }, "values": { "items": { "type": "string" }, "type": "array" } }, "required": [ "values" ], "type": "object" }, "host": { "additionalProperties": false, "properties": { "negative": { "default": false, "description": "Whether the filter is negative.", "type": "boolean" }, "values": { "items": { "type": "string" }, "type": "array" } }, "required": [ "values" ], "type": "object" }, "method": { "additionalProperties": false, "properties": { "negative": { "default": false, "description": "Whether the filter is negative.", "type": "boolean" }, "values": { "items": { "enum": [ "CONNECT", "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT", "TRACE" ], "type": "string" }, "type": "array" } }, "required": [ "values" ], "type": "object" }, "status_code": { "additionalProperties": false, "properties": { "negative": { "default": false, "description": "Whether the filter is negative.", "type": "boolean" }, "values": { "items": { "$ref": "#/definitions/StatusCodeRange" }, "type": "array" } }, "required": [ "values" ], "type": "object" } }, "type": "object" }, "format": { "$ref": "#/definitions/AccessLogFormat", "default": "combined", "description": "The format of the access log." }, "path": { "format": "uri-reference", "type": "string" } }, "required": [ "path" ], "type": "object" }, "alias": { "description": "Alias (subdomain or FDN)", "minLength": 1, "type": "string" }, "healthcheck": { "additionalProperties": false, "description": "Healthcheck config", "properties": { "disable": { "default": false, "description": "Disable healthcheck", "type": "boolean" }, "interval": { "default": "5s", "description": "Healthcheck interval", "pattern": "^([0-9]+(ms|s|m|h))+$", "type": "string" }, "path": { "default": "/", "description": "Healthcheck path", "format": "uri-reference", "type": "string" }, "timeout": { "default": "5s", "description": "Healthcheck timeout", "pattern": "^([0-9]+(ms|s|m|h))+$", "type": "string" }, "use_get": { "default": false, "description": "Use GET instead of HEAD", "type": "boolean" } }, "type": "object" }, "homepage": { "additionalProperties": false, "description": "Homepage config", "examples": [ { "category": "Arr suite", "icon": "png/sonarr.png", "name": "Sonarr" }, { "icon": "@target/favicon.ico", "name": "App" } ], "properties": { "category": { "type": "string" }, "description": { "type": "string" }, "icon": { "type": "string" }, "name": { "type": "string" }, "show": { "default": true, "description": "Whether show in dashboard", "type": "boolean" }, "url": { "format": "uri", "type": "string" }, "widget_config": { "additionalProperties": {}, "type": "object" } }, "type": "object" }, "host": { "default": "localhost", "description": "Proxy host", "type": "string" }, "idle_timeout": { "pattern": "^([0-9]+(ms|s|m|h))+$", "type": "string" }, "load_balance": { "$ref": "#/definitions/LoadBalanceConfig", "description": "Load balance config" }, "middlewares": { "$ref": "#/definitions/MiddlewaresMap", "description": "Middlewares" }, "no_tls_verify": { "default": false, "description": "Skip TLS verification", "type": "boolean" }, "path_patterns": { "description": "Path patterns (only patterns that match will be proxied).\n\nSee https://pkg.go.dev/net/http#hdr-Patterns-ServeMux", "items": { "type": "string" }, "type": "array" }, "port": { "default": 80, "description": "Proxy port", "maximum": 65535, "minimum": 0, "type": "integer" }, "scheme": { "$ref": "#/definitions/ProxyScheme", "default": "http", "description": "Proxy scheme" }, "start_endpoint": { "format": "uri-reference", "type": "string" }, "stop_method": { "$ref": "#/definitions/StopMethod", "default": "stop", "description": "Stop method" }, "stop_signal": { "$ref": "#/definitions/Signal" }, "stop_timeout": { "default": "10s", "description": "Stop timeout", "pattern": "^([0-9]+(ms|s|m|h))+$", "type": "string" }, "wake_timeout": { "default": "30s", "description": "Wake timeout", "pattern": "^([0-9]+(ms|s|m|h))+$", "type": "string" } }, "type": "object" }, { "additionalProperties": false, "properties": { "alias": { "description": "Alias (subdomain or FDN)", "minLength": 1, "type": "string" }, "healthcheck": { "additionalProperties": false, "description": "Healthcheck config", "properties": { "disable": { "default": false, "description": "Disable healthcheck", "type": "boolean" }, "interval": { "default": "5s", "description": "Healthcheck interval", "pattern": "^([0-9]+(ms|s|m|h))+$", "type": "string" }, "path": { "default": "/", "description": "Healthcheck path", "format": "uri-reference", "type": "string" }, "timeout": { "default": "5s", "description": "Healthcheck timeout", "pattern": "^([0-9]+(ms|s|m|h))+$", "type": "string" }, "use_get": { "default": false, "description": "Use GET instead of HEAD", "type": "boolean" } }, "type": "object" }, "host": { "default": "localhost", "description": "Stream host", "type": "string" }, "idle_timeout": { "pattern": "^([0-9]+(ms|s|m|h))+$", "type": "string" }, "port": { "pattern": "^\\d+:\\d+$", "type": "string" }, "scheme": { "$ref": "#/definitions/StreamScheme", "default": "tcp", "description": "Stream scheme" }, "start_endpoint": { "format": "uri-reference", "type": "string" }, "stop_method": { "$ref": "#/definitions/StopMethod", "default": "stop", "description": "Stop method" }, "stop_signal": { "$ref": "#/definitions/Signal" }, "stop_timeout": { "default": "10s", "description": "Stop timeout", "pattern": "^([0-9]+(ms|s|m|h))+$", "type": "string" }, "wake_timeout": { "default": "30s", "description": "Wake timeout", "pattern": "^([0-9]+(ms|s|m|h))+$", "type": "string" } }, "required": [ "port", "scheme" ], "type": "object" } ] }, "definitions": { "AccessLogFieldMode": { "enum": [ "drop", "keep", "redact" ], "type": "string" }, "AccessLogFormat": { "enum": [ "combined", "common", "json" ], "type": "string" }, "CIDR": { "anyOf": [ { "pattern": "^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*$", "type": "string" }, { "pattern": "^.*:.*:.*:.*:.*:.*:.*:.*$", "type": "string" }, { "pattern": "^[0-9]*\\.[0-9]*\\.[0-9]*\\.[0-9]*/[0-9]*$", "type": "string" }, { "pattern": "^::[0-9]*$", "type": "string" }, { "pattern": "^.*::/[0-9]*$", "type": "string" }, { "pattern": "^.*:.*::/[0-9]*$", "type": "string" } ] }, "LoadBalanceConfig": { "additionalProperties": false, "anyOf": [ { "additionalProperties": false, "properties": { "link": { "description": "Alias (subdomain or FDN) of load-balancer", "minLength": 1, "type": "string" }, "mode": { "const": "round_robin", "type": "string" }, "weight": { "description": "Load-balance weight (reserved for future use)", "maximum": 100, "minimum": 0, "type": "number" } }, "required": [ "link", "mode" ], "type": "object" }, { "additionalProperties": false, "properties": { "link": { "description": "Alias (subdomain or FDN) of load-balancer", "minLength": 1, "type": "string" }, "mode": { "const": "least_conn", "type": "string" }, "weight": { "description": "Load-balance weight (reserved for future use)", "maximum": 100, "minimum": 0, "type": "number" } }, "required": [ "link", "mode" ], "type": "object" }, { "additionalProperties": false, "properties": { "config": { "additionalProperties": false, "description": "Real IP config, header to get client IP from", "properties": { "from": { "items": { "$ref": "#/definitions/CIDR" }, "type": "array" }, "header": { "default": "X-Real-IP", "description": "Header to get the client IP from", "pattern": "^[a-zA-Z0-9\\-]+$", "type": "string" }, "recursive": { "default": false, "description": "Recursive resolve the IP", "type": "boolean" }, "use": { "enum": [ "RealIP", "realIP", "real_ip" ], "type": "string" } }, "required": [ "from", "use" ], "type": "object" }, "link": { "description": "Alias (subdomain or FDN) of load-balancer", "minLength": 1, "type": "string" }, "mode": { "const": "ip_hash", "type": "string" }, "weight": { "description": "Load-balance weight (reserved for future use)", "maximum": 100, "minimum": 0, "type": "number" } }, "required": [ "config", "link", "mode" ], "type": "object" } ] }, "MiddlewaresMap": { "anyOf": [ { "additionalProperties": false, "properties": { "use": { "pattern": "^.*@file$", "type": "string" } }, "required": [ "use" ], "type": "object" }, { "$ref": "#/definitions/{error_page:Omit;errorPage:Omit;ErrorPage:Omit;custom_error_page:Omit;customErrorPage:Omit;CustomErrorPage:Omit;}" }, { "$ref": "#/definitions/{redirect_http:Omit;redirectHTTP:Omit;RedirectHTTP:Omit;}" }, { "$ref": "#/definitions/{set_x_forwarded:Omit;setXForwarded:Omit;SetXForwarded:Omit;}" }, { "$ref": "#/definitions/{hide_x_forwarded:Omit;hideXForwarded:Omit;HideXForwarded:Omit;}" }, { "$ref": "#/definitions/{cidr_whitelist:Omit;cidrWhitelist:Omit;CIDRWhitelist:Omit;}" }, { "$ref": "#/definitions/{cloudflare_real_ip:Omit;cloudflareRealIp:Omit;}" }, { "$ref": "#/definitions/{request:Omit;Request:Omit;modify_request:Omit;modifyRequest:Omit;ModifyRequest:Omit;}" }, { "$ref": "#/definitions/{response:Omit;Response:Omit;modify_response:Omit;modifyResponse:Omit;ModifyResponse:Omit;}" }, { "$ref": "#/definitions/{oidc:Omit;OIDC:Omit;}" }, { "$ref": "#/definitions/{rate_limit:Omit;rateLimit:Omit;RateLimit:Omit;}" }, { "$ref": "#/definitions/{real_ip:Omit;realIP:Omit;RealIP:Omit;}" }, { "$ref": "#/definitions/{[x:`${string}@file`]:NullOrEmptyMap;}" } ] }, "Omit": { "additionalProperties": false, "properties": { "allow": { "items": { "$ref": "#/definitions/CIDR" }, "type": "array" }, "message": { "default": "IP not allowed", "description": "Error message when blocked", "type": "string" }, "status": { "$ref": "#/definitions/StatusCode", "default": 403, "description": "HTTP status code when blocked (alias of status_code)" }, "status_code": { "$ref": "#/definitions/StatusCode", "default": 403, "description": "HTTP status code when blocked" } }, "required": [ "allow" ], "type": "object" }, "Omit": { "additionalProperties": false, "properties": { "recursive": { "default": false, "description": "Recursively resolve the IP", "type": "boolean" } }, "type": "object" }, "Omit": { "additionalProperties": false, "type": "object" }, "Omit": { "additionalProperties": false, "type": "object" }, "Omit": { "additionalProperties": false, "properties": { "add_headers": { "additionalProperties": { "type": "string" }, "description": "Add HTTP headers", "type": "object" }, "hide_headers": { "description": "Hide HTTP headers", "items": { "type": "string" }, "type": "array" }, "set_headers": { "additionalProperties": { "type": "string" }, "description": "Set HTTP headers", "type": "object" } }, "type": "object" }, "Omit": { "additionalProperties": false, "properties": { "add_headers": { "additionalProperties": { "type": "string" }, "description": "Add HTTP headers", "type": "object" }, "hide_headers": { "description": "Hide HTTP headers", "items": { "type": "string" }, "type": "array" }, "set_headers": { "additionalProperties": { "type": "string" }, "description": "Set HTTP headers", "type": "object" } }, "type": "object" }, "Omit": { "additionalProperties": false, "properties": { "allowed_groups": { "description": "Allowed groups", "items": { "type": "string" }, "minItems": 1, "type": "array" }, "allowed_users": { "description": "Allowed users", "items": { "type": "string" }, "minItems": 1, "type": "array" } }, "type": "object" }, "Omit": { "additionalProperties": false, "properties": { "average": { "description": "Average number of requests allowed in a period", "type": "number" }, "burst": { "description": "Maximum number of requests allowed in a period", "type": "number" }, "period": { "default": "1s", "description": "Duration of the rate limit", "pattern": "^([0-9]+(ms|s|m|h))+$", "type": "string" } }, "required": [ "average", "burst" ], "type": "object" }, "Omit": { "additionalProperties": false, "properties": { "from": { "items": { "$ref": "#/definitions/CIDR" }, "type": "array" }, "header": { "default": "X-Real-IP", "description": "Header to get the client IP from", "pattern": "^[a-zA-Z0-9\\-]+$", "type": "string" }, "recursive": { "default": false, "description": "Recursive resolve the IP", "type": "boolean" } }, "required": [ "from" ], "type": "object" }, "Omit": { "additionalProperties": false, "type": "object" }, "Omit": { "additionalProperties": false, "type": "object" }, "ProxyScheme": { "enum": [ "http", "https" ], "type": "string" }, "Signal": { "enum": [ "", "HUP", "INT", "QUIT", "SIGHUP", "SIGINT", "SIGQUIT", "SIGTERM", "TERM" ], "type": "string" }, "StatusCode": { "anyOf": [ { "pattern": "^[0-9]*$", "type": "string" }, { "type": "number" } ] }, "StatusCodeRange": { "anyOf": [ { "pattern": "^[0-9]*$", "type": "string" }, { "pattern": "^[0-9]*-[0-9]*$", "type": "string" }, { "type": "number" } ] }, "StopMethod": { "enum": [ "kill", "pause", "stop" ], "type": "string" }, "StreamScheme": { "enum": [ "tcp", "udp" ], "type": "string" }, "{[x:`${string}@file`]:NullOrEmptyMap;}": { "additionalProperties": false, "type": "object" }, "{cidr_whitelist:Omit;cidrWhitelist:Omit;CIDRWhitelist:Omit;}": { "additionalProperties": false, "properties": { "CIDRWhitelist": { "$ref": "#/definitions/Omit" }, "cidrWhitelist": { "$ref": "#/definitions/Omit" }, "cidr_whitelist": { "$ref": "#/definitions/Omit" } }, "required": [ "CIDRWhitelist", "cidrWhitelist", "cidr_whitelist" ], "type": "object" }, "{cloudflare_real_ip:Omit;cloudflareRealIp:Omit;}": { "additionalProperties": false, "properties": { "cloudflareRealIp": { "$ref": "#/definitions/Omit" }, "cloudflare_real_ip": { "$ref": "#/definitions/Omit" } }, "required": [ "cloudflareRealIp", "cloudflare_real_ip" ], "type": "object" }, "{error_page:Omit;errorPage:Omit;ErrorPage:Omit;custom_error_page:Omit;customErrorPage:Omit;CustomErrorPage:Omit;}": { "additionalProperties": false, "properties": { "CustomErrorPage": { "$ref": "#/definitions/Omit" }, "ErrorPage": { "$ref": "#/definitions/Omit" }, "customErrorPage": { "$ref": "#/definitions/Omit" }, "custom_error_page": { "$ref": "#/definitions/Omit" }, "errorPage": { "$ref": "#/definitions/Omit" }, "error_page": { "$ref": "#/definitions/Omit" } }, "required": [ "CustomErrorPage", "ErrorPage", "customErrorPage", "custom_error_page", "errorPage", "error_page" ], "type": "object" }, "{hide_x_forwarded:Omit;hideXForwarded:Omit;HideXForwarded:Omit;}": { "additionalProperties": false, "properties": { "HideXForwarded": { "$ref": "#/definitions/Omit" }, "hideXForwarded": { "$ref": "#/definitions/Omit" }, "hide_x_forwarded": { "$ref": "#/definitions/Omit" } }, "required": [ "HideXForwarded", "hideXForwarded", "hide_x_forwarded" ], "type": "object" }, "{oidc:Omit;OIDC:Omit;}": { "additionalProperties": false, "properties": { "OIDC": { "$ref": "#/definitions/Omit" }, "oidc": { "$ref": "#/definitions/Omit" } }, "required": [ "OIDC", "oidc" ], "type": "object" }, "{rate_limit:Omit;rateLimit:Omit;RateLimit:Omit;}": { "additionalProperties": false, "properties": { "RateLimit": { "$ref": "#/definitions/Omit" }, "rateLimit": { "$ref": "#/definitions/Omit" }, "rate_limit": { "$ref": "#/definitions/Omit" } }, "required": [ "RateLimit", "rateLimit", "rate_limit" ], "type": "object" }, "{real_ip:Omit;realIP:Omit;RealIP:Omit;}": { "additionalProperties": false, "properties": { "RealIP": { "$ref": "#/definitions/Omit" }, "realIP": { "$ref": "#/definitions/Omit" }, "real_ip": { "$ref": "#/definitions/Omit" } }, "required": [ "RealIP", "realIP", "real_ip" ], "type": "object" }, "{redirect_http:Omit;redirectHTTP:Omit;RedirectHTTP:Omit;}": { "additionalProperties": false, "properties": { "RedirectHTTP": { "$ref": "#/definitions/Omit" }, "redirectHTTP": { "$ref": "#/definitions/Omit" }, "redirect_http": { "$ref": "#/definitions/Omit" } }, "required": [ "RedirectHTTP", "redirectHTTP", "redirect_http" ], "type": "object" }, "{request:Omit;Request:Omit;modify_request:Omit;modifyRequest:Omit;ModifyRequest:Omit;}": { "additionalProperties": false, "properties": { "ModifyRequest": { "$ref": "#/definitions/Omit" }, "Request": { "$ref": "#/definitions/Omit" }, "modifyRequest": { "$ref": "#/definitions/Omit" }, "modify_request": { "$ref": "#/definitions/Omit" }, "request": { "$ref": "#/definitions/Omit" } }, "required": [ "ModifyRequest", "Request", "modifyRequest", "modify_request", "request" ], "type": "object" }, "{response:Omit;Response:Omit;modify_response:Omit;modifyResponse:Omit;ModifyResponse:Omit;}": { "additionalProperties": false, "properties": { "ModifyResponse": { "$ref": "#/definitions/Omit" }, "Response": { "$ref": "#/definitions/Omit" }, "modifyResponse": { "$ref": "#/definitions/Omit" }, "modify_response": { "$ref": "#/definitions/Omit" }, "response": { "$ref": "#/definitions/Omit" } }, "required": [ "ModifyResponse", "Response", "modifyResponse", "modify_response", "response" ], "type": "object" }, "{set_x_forwarded:Omit;setXForwarded:Omit;SetXForwarded:Omit;}": { "additionalProperties": false, "properties": { "SetXForwarded": { "$ref": "#/definitions/Omit" }, "setXForwarded": { "$ref": "#/definitions/Omit" }, "set_x_forwarded": { "$ref": "#/definitions/Omit" } }, "required": [ "SetXForwarded", "setXForwarded", "set_x_forwarded" ], "type": "object" } }, "type": "object" }