{"type": "object", "properties": {"protocol": {"enum": ["tcp", "udp"], "type": "string"}, "internal_port": {"default": 8080, "type": "integer"}, "script_checks": {"deprecated": true}, "concurrency": {"type": "object", "properties": {"type": {"default": "connections", "type": "string", "enum": ["connections", "requests"], "x-taplo": {"docs": {"enumValues": ["Autoscale based on number of concurrent connections", "Autoscale based on number of concurrent requests"]}}}, "hard_limit": {"default": 25, "type": "integer"}, "soft_limit": {"default": 20, "type": "integer"}}}, "http_checks": {"type": "array", "x-taplo": {"links": {"key": "https://fly.io/docs/reference/configuration/#services-http_checks"}}, "items": {"type": "object", "properties": {"grace_period": {"oneOf": [{"type": "integer"}, {"type": "string"}]}, "protocol": {"enum": ["http", "https"], "type": "string"}, "tls_skip_verify": {"default": false, "type": "boolean"}, "restart_limit": {"default": 0, "type": "integer"}, "interval": {"oneOf": [{"type": "integer"}, {"type": "string"}]}, "headers": {"type": "object"}, "timeout": {"oneOf": [{"type": "integer"}, {"type": "string"}]}, "path": {"type": "string"}, "method": {"type": "string"}}}}, "tcp_checks": {"type": "array", "x-taplo": {"links": {"key": "https://fly.io/docs/reference/configuration/#services-tcp_checks"}}, "items": {"type": "object", "properties": {"grace_period": {"oneOf": [{"type": "integer"}, {"type": "string"}]}, "restart_limit": {"default": 0, "type": "integer"}, "interval": {"oneOf": [{"type": "integer"}, {"type": "string"}]}, "timeout": {"oneOf": [{"type": "integer"}, {"type": "string"}]}}}}, "ports": {"items": {"type": "object", "properties": {"force_https": {"type": "boolean"}, "port": {"default": 8080, "type": "integer"}, "handlers": {"x-taplo": {"links": {"key": "https://fly.io/docs/reference/services/#connection-handlers"}}, "type": "array", "items": {"minLength": 1, "enum": ["http", "tls", "proxy_proto", "pg_tls", "edge_http"], "type": "string"}}}}, "type": "array"}}}