- Implements Apache APISIX packaging for Cloudron platform. - Includes Dockerfile, CloudronManifest.json, and start.sh. - Configured to use Cloudron's etcd addon. 🤖 Generated with Gemini CLI Co-Authored-By: Gemini <noreply@google.com>
386 lines
10 KiB
Lua
386 lines
10 KiB
Lua
--
|
|
-- Licensed to the Apache Software Foundation (ASF) under one or more
|
|
-- contributor license agreements. See the NOTICE file distributed with
|
|
-- this work for additional information regarding copyright ownership.
|
|
-- The ASF licenses this file to You under the Apache License, Version 2.0
|
|
-- (the "License"); you may not use this file except in compliance with
|
|
-- the License. You may obtain a copy of the License at
|
|
--
|
|
-- http://www.apache.org/licenses/LICENSE-2.0
|
|
--
|
|
-- Unless required by applicable law or agreed to in writing, software
|
|
-- distributed under the License is distributed on an "AS IS" BASIS,
|
|
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
-- See the License for the specific language governing permissions and
|
|
-- limitations under the License.
|
|
--
|
|
|
|
local table_conact = table.concat
|
|
|
|
local _M = {
|
|
apisix = {
|
|
node_listen = { 9080 },
|
|
enable_admin = true,
|
|
enable_dev_mode = false,
|
|
enable_reuseport = true,
|
|
show_upstream_status_in_response_header = false,
|
|
enable_ipv6 = true,
|
|
enable_http2 = true,
|
|
enable_server_tokens = true,
|
|
extra_lua_path = "",
|
|
extra_lua_cpath = "",
|
|
proxy_cache = {
|
|
cache_ttl = "10s",
|
|
zones = {
|
|
{
|
|
name = "disk_cache_one",
|
|
memory_size = "50m",
|
|
disk_size = "1G",
|
|
disk_path = "/tmp/disk_cache_one",
|
|
cache_levels = "1:2"
|
|
},
|
|
{
|
|
name = "memory_cache",
|
|
memory_size = "50m"
|
|
}
|
|
}
|
|
},
|
|
delete_uri_tail_slash = false,
|
|
normalize_uri_like_servlet = false,
|
|
router = {
|
|
http = "radixtree_host_uri",
|
|
ssl = "radixtree_sni"
|
|
},
|
|
proxy_mode = "http",
|
|
resolver_timeout = 5,
|
|
enable_resolv_search_opt = true,
|
|
ssl = {
|
|
enable = true,
|
|
listen = { {
|
|
port = 9443,
|
|
enable_http3 = false
|
|
} },
|
|
ssl_protocols = "TLSv1.2 TLSv1.3",
|
|
ssl_ciphers = table_conact({
|
|
"ECDHE-ECDSA-AES128-GCM-SHA256", "ECDHE-RSA-AES128-GCM-SHA256",
|
|
"ECDHE-ECDSA-AES256-GCM-SHA384", "ECDHE-RSA-AES256-GCM-SHA384",
|
|
"ECDHE-ECDSA-CHACHA20-POLY1305", "ECDHE-RSA-CHACHA20-POLY1305",
|
|
"DHE-RSA-AES128-GCM-SHA256", "DHE-RSA-AES256-GCM-SHA384",
|
|
}, ":"),
|
|
ssl_session_tickets = false,
|
|
ssl_trusted_certificate = "system"
|
|
},
|
|
enable_control = true,
|
|
disable_sync_configuration_during_start = false,
|
|
data_encryption = {
|
|
enable_encrypt_fields = true,
|
|
keyring = { "qeddd145sfvddff3", "edd1c9f0985e76a2" }
|
|
},
|
|
events = {
|
|
module = "lua-resty-events"
|
|
}
|
|
},
|
|
nginx_config = {
|
|
error_log = "logs/error.log",
|
|
error_log_level = "warn",
|
|
worker_processes = "auto",
|
|
enable_cpu_affinity = false,
|
|
worker_rlimit_nofile = 20480,
|
|
worker_shutdown_timeout = "240s",
|
|
max_pending_timers = 16384,
|
|
max_running_timers = 4096,
|
|
event = {
|
|
worker_connections = 10620
|
|
},
|
|
meta = {
|
|
lua_shared_dict = {
|
|
["prometheus-metrics"] = "15m",
|
|
["standalone-config"] = "10m",
|
|
["status-report"] = "1m",
|
|
}
|
|
},
|
|
stream = {
|
|
enable_access_log = false,
|
|
access_log = "logs/access_stream.log",
|
|
-- luacheck: push max code line length 300
|
|
access_log_format = "$remote_addr [$time_local] $protocol $status $bytes_sent $bytes_received $session_time",
|
|
-- luacheck: pop
|
|
access_log_format_escape = "default",
|
|
lua_shared_dict = {
|
|
["etcd-cluster-health-check-stream"] = "10m",
|
|
["lrucache-lock-stream"] = "10m",
|
|
["plugin-limit-conn-stream"] = "10m",
|
|
["worker-events-stream"] = "10m",
|
|
["tars-stream"] = "1m",
|
|
["upstream-healthcheck-stream"] = "10m",
|
|
}
|
|
},
|
|
main_configuration_snippet = "",
|
|
http_configuration_snippet = "",
|
|
http_server_configuration_snippet = "",
|
|
http_server_location_configuration_snippet = "",
|
|
http_admin_configuration_snippet = "",
|
|
http_end_configuration_snippet = "",
|
|
stream_configuration_snippet = "",
|
|
http = {
|
|
enable_access_log = true,
|
|
access_log = "logs/access.log",
|
|
access_log_buffer = 16384,
|
|
-- luacheck: push max code line length 300
|
|
access_log_format =
|
|
'$remote_addr - $remote_user [$time_local] $http_host "$request" $status $body_bytes_sent $request_time "$http_referer" "$http_user_agent" $upstream_addr $upstream_status $upstream_response_time "$upstream_scheme://$upstream_host$upstream_uri"',
|
|
-- luacheck: pop
|
|
access_log_format_escape = "default",
|
|
keepalive_timeout = "60s",
|
|
client_header_timeout = "60s",
|
|
client_body_timeout = "60s",
|
|
client_max_body_size = 0,
|
|
send_timeout = "10s",
|
|
underscores_in_headers = "on",
|
|
real_ip_header = "X-Real-IP",
|
|
real_ip_recursive = "off",
|
|
real_ip_from = { "127.0.0.1", "unix:" },
|
|
proxy_ssl_server_name = true,
|
|
upstream = {
|
|
keepalive = 320,
|
|
keepalive_requests = 1000,
|
|
keepalive_timeout = "60s"
|
|
},
|
|
charset = "utf-8",
|
|
variables_hash_max_size = 2048,
|
|
lua_shared_dict = {
|
|
["internal-status"] = "10m",
|
|
["plugin-limit-req"] = "10m",
|
|
["plugin-limit-count"] = "10m",
|
|
["prometheus-metrics"] = "10m",
|
|
["plugin-limit-conn"] = "10m",
|
|
["upstream-healthcheck"] = "10m",
|
|
["worker-events"] = "10m",
|
|
["lrucache-lock"] = "10m",
|
|
["balancer-ewma"] = "10m",
|
|
["balancer-ewma-locks"] = "10m",
|
|
["balancer-ewma-last-touched-at"] = "10m",
|
|
["plugin-limit-req-redis-cluster-slot-lock"] = "1m",
|
|
["plugin-limit-count-redis-cluster-slot-lock"] = "1m",
|
|
["plugin-limit-conn-redis-cluster-slot-lock"] = "1m",
|
|
["plugin-ai-rate-limiting"] = "10m",
|
|
["plugin-ai-rate-limiting-reset-header"] = "10m",
|
|
tracing_buffer = "10m",
|
|
["plugin-api-breaker"] = "10m",
|
|
["etcd-cluster-health-check"] = "10m",
|
|
discovery = "1m",
|
|
jwks = "1m",
|
|
introspection = "10m",
|
|
["access-tokens"] = "1m",
|
|
["ext-plugin"] = "1m",
|
|
tars = "1m",
|
|
["cas-auth"] = "10m",
|
|
["ocsp-stapling"] = "10m",
|
|
["mcp-session"] = "10m",
|
|
}
|
|
}
|
|
},
|
|
graphql = {
|
|
max_size = 1048576
|
|
},
|
|
plugins = {
|
|
"real-ip",
|
|
"ai",
|
|
"client-control",
|
|
"proxy-control",
|
|
"request-id",
|
|
"zipkin",
|
|
"ext-plugin-pre-req",
|
|
"fault-injection",
|
|
"mocking",
|
|
"serverless-pre-function",
|
|
"cors",
|
|
"ip-restriction",
|
|
"ua-restriction",
|
|
"referer-restriction",
|
|
"csrf",
|
|
"uri-blocker",
|
|
"request-validation",
|
|
"chaitin-waf",
|
|
"multi-auth",
|
|
"openid-connect",
|
|
"cas-auth",
|
|
"authz-casbin",
|
|
"authz-casdoor",
|
|
"wolf-rbac",
|
|
"ldap-auth",
|
|
"hmac-auth",
|
|
"basic-auth",
|
|
"jwt-auth",
|
|
"jwe-decrypt",
|
|
"key-auth",
|
|
"consumer-restriction",
|
|
"attach-consumer-label",
|
|
"forward-auth",
|
|
"opa",
|
|
"authz-keycloak",
|
|
"proxy-cache",
|
|
"body-transformer",
|
|
"ai-prompt-template",
|
|
"ai-prompt-decorator",
|
|
"ai-prompt-guard",
|
|
"ai-rag",
|
|
"ai-rate-limiting",
|
|
"ai-proxy-multi",
|
|
"ai-proxy",
|
|
"ai-aws-content-moderation",
|
|
"proxy-mirror",
|
|
"proxy-rewrite",
|
|
"workflow",
|
|
"api-breaker",
|
|
"limit-conn",
|
|
"limit-count",
|
|
"limit-req",
|
|
"gzip",
|
|
-- deprecated and will be removed in a future release
|
|
-- "server-info",
|
|
"traffic-split",
|
|
"redirect",
|
|
"response-rewrite",
|
|
"mcp-bridge",
|
|
"degraphql",
|
|
"kafka-proxy",
|
|
"grpc-transcode",
|
|
"grpc-web",
|
|
"http-dubbo",
|
|
"public-api",
|
|
"prometheus",
|
|
"datadog",
|
|
"lago",
|
|
"loki-logger",
|
|
"elasticsearch-logger",
|
|
"echo",
|
|
"loggly",
|
|
"http-logger",
|
|
"splunk-hec-logging",
|
|
"skywalking-logger",
|
|
"google-cloud-logging",
|
|
"sls-logger",
|
|
"tcp-logger",
|
|
"kafka-logger",
|
|
"rocketmq-logger",
|
|
"syslog",
|
|
"udp-logger",
|
|
"file-logger",
|
|
"clickhouse-logger",
|
|
"tencent-cloud-cls",
|
|
"inspect",
|
|
"example-plugin",
|
|
"aws-lambda",
|
|
"azure-functions",
|
|
"openwhisk",
|
|
"openfunction",
|
|
"serverless-post-function",
|
|
"ext-plugin-post-req",
|
|
"ext-plugin-post-resp",
|
|
"ai-request-rewrite",
|
|
},
|
|
stream_plugins = { "ip-restriction", "limit-conn", "mqtt-proxy", "syslog" },
|
|
plugin_attr = {
|
|
["log-rotate"] = {
|
|
timeout = 10000,
|
|
interval = 3600,
|
|
max_kept = 168,
|
|
max_size = -1,
|
|
enable_compression = false
|
|
},
|
|
skywalking = {
|
|
service_name = "APISIX",
|
|
service_instance_name = "APISIX Instance Name",
|
|
endpoint_addr = "http://127.0.0.1:12800",
|
|
report_interval = 3
|
|
},
|
|
opentelemetry = {
|
|
trace_id_source = "x-request-id",
|
|
resource = {
|
|
["service.name"] = "APISIX"
|
|
},
|
|
collector = {
|
|
address = "127.0.0.1:4318",
|
|
request_timeout = 3,
|
|
request_headers = {
|
|
Authorization = "token"
|
|
}
|
|
},
|
|
batch_span_processor = {
|
|
drop_on_queue_full = false,
|
|
max_queue_size = 1024,
|
|
batch_timeout = 2,
|
|
inactive_timeout = 1,
|
|
max_export_batch_size = tonumber(os.getenv("OTEL_BSP_MAX_EXPORT_BATCH_SIZE")) or 16
|
|
},
|
|
set_ngx_var = false
|
|
},
|
|
prometheus = {
|
|
export_uri = "/apisix/prometheus/metrics",
|
|
metric_prefix = "apisix_",
|
|
enable_export_server = true,
|
|
export_addr = {
|
|
ip = "127.0.0.1",
|
|
port = 9091
|
|
}
|
|
},
|
|
["server-info"] = {
|
|
report_ttl = 60
|
|
},
|
|
["dubbo-proxy"] = {
|
|
upstream_multiplex_count = 32
|
|
},
|
|
["proxy-mirror"] = {
|
|
timeout = {
|
|
connect = "60s",
|
|
read = "60s",
|
|
send = "60s"
|
|
}
|
|
},
|
|
inspect = {
|
|
delay = 3,
|
|
hooks_file = "/usr/local/apisix/plugin_inspect_hooks.lua"
|
|
},
|
|
zipkin = {
|
|
set_ngx_var = false
|
|
}
|
|
},
|
|
deployment = {
|
|
role = "traditional",
|
|
role_traditional = {
|
|
config_provider = "etcd"
|
|
},
|
|
admin = {
|
|
admin_key_required = true,
|
|
admin_key = {
|
|
{
|
|
name = "admin",
|
|
key = "",
|
|
role = "admin"
|
|
}
|
|
},
|
|
enable_admin_cors = true,
|
|
enable_admin_ui = true,
|
|
allow_admin = { "127.0.0.0/24" },
|
|
admin_listen = {
|
|
ip = "0.0.0.0",
|
|
port = 9180
|
|
},
|
|
admin_api_version = "v3"
|
|
},
|
|
etcd = {
|
|
host = { "http://127.0.0.1:2379" },
|
|
prefix = "/apisix",
|
|
timeout = 30,
|
|
watch_timeout = 50,
|
|
startup_retry = 2,
|
|
tls = {
|
|
verify = true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return _M
|