news 2026/9/13 7:40:10

Argo CD argocd-server 命令完整指南:API 服务端启动、全部 Flags 参数详解与源码级运行原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Argo CD argocd-server 命令完整指南:API 服务端启动、全部 Flags 参数详解与源码级运行原理

Argo CD argocd-server 命令完整指南:API 服务端启动、全部 Flags 参数详解与源码级运行原理

【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd

Argo CD 的 API Server(argocd-server)是整套系统的"前端枢纽",它对外暴露 gRPC/REST API,供 Web UI、CLI 以及 CI/CD 系统调用,同时负责 SSO 登录、RBAC 鉴权、反向代理仓库与 Dex 服务等职责。本文基于官方命令参考文档 docs/operator-manual/server-commands/argocd-server.md,逐条剖析该命令的全部启动参数与默认值,并结合 cmd/argocd-server/commands/argocd_server.go、server/server.go 等源码揭示底层运行原理,帮助你理解、调优和排查 Argo CD 服务端部署问题。

argocd-server 命令概述

argocd-server是 Argo CD 的 API 服务器进程,官方文档将其描述为:

The API server is a gRPC/REST server which exposes the API consumed by the Web UI, CLI, and CI/CD systems. This command runs API server in the foreground. It can be configured by following options.

即:这是一个gRPC/REST 双协议服务器,以前台进程方式运行(foreground),通过命令行 Flags 完成全部配置。从 cmd/main.go 可以看到,当二进制文件名为argocd-server时,入口会调用apiserver.NewCommand()构建 Cobra 命令,其Use字段取自 common/common.go 中的CommandServer常量。

argocd-server在运行时会完成以下初始化工作(见 cmd/argocd-server/commands/argocd_server.go):

  1. 解析 kubeconfig 获取命名空间与集群配置,构造 Kubernetes clientset、Argo CD Application clientset、dynamic client 与 controller-runtime client;
  2. 构建与 repo-server 的 gRPC 连接(支持 plaintext、mTLS、CA 校验等模式);
  3. 构建 Redis 缓存客户端(支持 TLS、Sentinel、压缩等);
  4. 读取 TLS 配置自定义器(自定义证书、CipherSuite、TLS 版本范围);
  5. 调用server.NewServer()创建 Argo CD 服务器实例并Init()初始化;
  6. 进入监听循环Listen()+Run(),若启用了 OpenTelemetry 追踪则在此时初始化 Tracer;
  7. 注册 stack dumper 与 heap dumper,方便问题排查。

命令语法与示例

argocd-server [flags]

官方文档给出的两个示例:

# Start the Argo CD API server with default settings $ argocd-server # Start the Argo CD API server on a custom port and enable tracing $ argocd-server --port 8888 --otlp-address localhost:4317

这两个示例在源码中同样被定义为 Cobra 的Example字段(见 cmd/argocd-server/commands/argocd_server.go),可直接通过argocd-server --help查看。

子命令

argocd-server带有一个子命令version,用于打印版本信息:

argocd-server version [flags]

支持--short仅打印版本号(详见 docs/operator-manual/server-commands/argocd-server_version.md)。在源码中该子命令由cli.NewVersionCmd(common.CommandServer)注册(见 cmd/argocd-server/commands/argocd_server.go)。

Options 完整参数详解

官方文档列出了 90+ 个 Flags。以下按功能域分组讲解,标注默认值、可用取值与底层实现。

监听与端口

Flag默认值说明
--address string0.0.0.0API 服务监听地址
--port int8080API 服务监听端口
--metrics-address string0.0.0.0metrics 监听地址
--metrics-port int8083metrics 监听端口

端口默认值定义在 common/common.go:API Server 端口为 8080,API Server 的 metrics 端口为 8083(区别于 application controller 的 8082 与 repo-server 的 8084)。监听地址与端口在启动时会打印在版本信息日志中(vers.LogStartupInfo("ArgoCD API Server", map[...]{namespace, port}),见 cmd/argocd-server/commands/argocd_server.go)。

TLS 与安全

Flag默认值说明
--insecurefalse以无 TLS 方式运行服务器,可由环境变量ARGOCD_SERVER_INSECURE覆盖
--certificate-authority string-证书颁发机构文件路径
--client-certificate string-TLS 客户端证书文件路径
--client-key string-TLS 客户端密钥文件路径
--tls-server-name string-校验服务器证书时使用的名称,默认使用连接主机名
--tlsciphers stringTLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384建立 TLS 连接时接受的密码套件列表,传list可列出可用套件
--tlsmaxversion string1.3可接受的最大 SSL/TLS 版本(1.0/1.1/1.2/1.3)
--tlsminversion string1.2可接受的最小 SSL/TLS 版本(1.0/1.1/1.2/1.3)
--insecure-skip-tls-verifyfalse不校验服务器证书(属于 kubeconfig 客户端通用 flag)

TLS 版本与 Cipher 由 util/tls/tls.go 中的AddTLSFlagsToCmdWithPrefix注册,三个 flag(tlsminversiontlsmaxversiontlsciphers)最终被组装为tls.ConfigCustomizer应用到 HTTP/HTTPS 监听器上。默认最小 TLS 1.2、最大 TLS 1.3 是 Argo CD 的安全基线配置。

认证与会话

Flag默认值说明
--disable-authfalse禁用客户端认证(仅用于测试/内部场景,由ARGOCD_SERVER_DISABLE_AUTH覆盖)
--dex-server stringargocd-dex-server:5556Dex 服务器地址
--dex-server-plaintextfalse使用明文(非 TLS)连接 Dex
--dex-server-strict-tlsfalse连接 Dex 时严格校验 TLS 证书
--oidc-cache-expiration duration3m0sOIDC 状态缓存过期时间
--login-attempts-expiration duration24h0m0s失败登录尝试的缓存过期时间(已废弃,未来版本移除,见 server/cache/cache.go)
--password string-API 服务器基础认证密码
--username string-API 服务器基础认证用户名
--token string-API 服务器认证 Bearer Token

Dex 地址默认值argocd-dex-server:5556来自 common/common.go。在 cmd/argocd-server/commands/argocd_server.go 中可以看到:当启用--dex-server-strict-tls且非 plaintext 时,服务端会从/app/config/dex/tls/ca.crt/app/config/dex/tls/tls.crt加载证书池与客户端证书(路径可通过环境变量ARGOCD_APP_CONF_PATH调整)。

缓存与 Redis

Flag默认值说明
--app-state-cache-expiration duration1h0m0s应用状态缓存过期时间,上限 10h(由ARGOCD_APP_STATE_CACHE_EXPIRATION覆盖,见 util/cache/appstate/cache.go)
--connection-status-cache-expiration duration1h0m0s集群/仓库连接状态缓存过期时间
--default-cache-expiration duration24h0m0s默认缓存过期时间
--redis string-Redis 服务器主机名与端口(如argocd-redis:6379
--redis-ca-certificate string-Redis 服务器 CA 证书路径,未指定则使用系统信任的 CA
--redis-client-certificate string-Redis 客户端证书路径
--redis-client-key string-Redis 客户端密钥路径
--redis-compress stringgzipRedis 数据压缩算法,可选gzip/none
--redis-insecure-skip-tls-verifyfalse跳过 Redis 服务器证书校验
--redis-use-tlsfalse连接 Redis 时启用 TLS
--redisdb int-Redis 数据库编号
--sentinel stringArray-Redis Sentinel 主机名与端口(如argocd-redis-ha-announce-0:6379
--sentinelmaster stringmasterRedis Sentinel 主节点组名

Redis 缓存是 Argo CD 高性能的关键。应用状态缓存(资源树、托管资源列表)由servercache.AddCacheFlagsToCmdappstatecache.AddCacheFlagsToCmd注册(见 server/cache/cache.go 与 util/cache/appstate/cache.go)。在 util/cache/appstate/cache.go 中可以观察到:应用资源树会被按ARGOCD_APPLICATION_TREE_SHARD_SIZE(默认 0,即不分片)拆分为多个 shard 存储,从而减少单次 Redis SET 的数据量与流量,这是大规模应用下的缓存优化细节。

repo-server 连接

Flag默认值说明
--repo-server stringargocd-repo-server:8081仓库服务器地址
--repo-server-plaintextfalse使用明文客户端(非 TLS)连接仓库服务器
--repo-server-strict-tlsfalse已废弃:连接 repo-server 时严格校验 TLS,改用--repo-server-ca-cert-path(见 cmd/argocd-server/commands/argocd_server.go 的MarkDeprecated
--repo-server-ca-cert-path string-repo-server CA 证书文件路径
--repo-server-client-cert-path string/app/config/reposerver/mtls/client.crtmTLS 客户端证书路径,默认指向自动挂载的 Secret 路径,文件不存在则跳过 mTLS
--repo-server-client-cert-key-path string/app/config/reposerver/mtls/client.keymTLS 客户端密钥路径
--repo-server-timeout-seconds int60repo-server RPC 调用超时秒数,默认 60,范围 0~MaxInt64
--repo-server-default-cache-expiration duration24h0m0s默认缓存过期时间
--repo-server-redis string-专用于 repo-server 缓存的 Redis 地址
--repo-server-redis-ca-certificate / --repo-server-redis-client-certificate / --repo-server-redis-client-key-repo-server Redis 的 TLS 相关证书
--repo-server-redis-compress stringgziprepo-server Redis 压缩算法(gzip/none)
--repo-server-redis-insecure-skip-tls-verifyfalse跳过 repo-server Redis 证书校验
--repo-server-redis-use-tlsfalserepo-server Redis 启用 TLS
--repo-server-redisdb int-repo-server Redis 数据库编号
--repo-server-sentinel stringArray-repo-server Redis Sentinel 地址
--repo-server-sentinelmaster stringmasterrepo-server Redis Sentinel 主节点组名

repo-server 的客户端 TLS 配置由tls.AddClientTLSFlagsToCmdWithPrefix(command, "SERVER")注册(见 cmd/argocd-server/commands/argocd_server.go),因此相关 flag 均带--repo-server-前缀。在 cmd/argocd-server/commands/argocd_server.go 中可以看到,若启用严格 TLS 且未显式提供 CA,则默认从/app/config/server/tls/tls.crt/app/config/server/tls/ca.crt加载内嵌证书池;显式指定的--repo-server-ca-cert-path优先级更高。这一点也有对应测试覆盖,见 cmd/argocd-server/commands/argocd_server_test.go(TestNewCommand_RepoServerCACertTakesPrecedenceOverEmbeddedCert)。

日志与监控

Flag默认值说明
--logformat stringjson日志格式,可选json/text
--loglevel stringinfo日志级别,可选debug/info/warn/error
--gloglevel int0glog 日志级别
--otlp-address string-OpenTelemetry Collector 地址,用于发送 traces
--otlp-attrs strings-OTLP 额外属性列表,冒号分隔(如key:value
--otlp-headers stringToString[]OTLP 额外 headers,逗号分隔键值对(如key1=value1,key2=value2
--otlp-insecuretrueOpenTelemetry Collector 非安全模式
--otlp-sample-ratio float1trace 采样比例,0.0(不采样)~1.0(全采样),基于父级传播决策
--request-timeout string0单请求超时时间(如1s/2m/3h),0表示不超时
--enable-gziptrue启用 GZIP 响应压缩
--disable-compressionfalse关闭所有请求的响应压缩(kubeconfig 客户端通用 flag)

--logformat--loglevel分别对应ARGOCD_SERVER_LOGFORMATARGOCD_SERVER_LOG_LEVEL环境变量(见 cmd/argocd-server/commands/argocd_server.go),启动时通过cli.SetLogFormat/cli.SetLogLevel应用到 logrus。OTLP 追踪的初始化发生在监听成功之后(见 cmd/argocd-server/commands/argocd_server.go),失败会直接log.Fatalf退出。

安全响应头与前端

Flag默认值说明
--content-security-policy valueframe-ancestors 'self';HTTP 响应中的 Content-Security-Policy 头,设为""可禁用
--x-frame-options valuesameoriginHTTP 响应中的 X-Frame-Options 头,设为""可禁用
--basehref string/index.html 中的 base href,用于反向代理子路径场景
--rootpath string-反向代理子路径场景下使用,与 basehref 冲突时会以 rootpath 为准并打印警告(见 cmd/argocd-server/commands/argocd_server.go)
--staticassets string/shared/app额外静态资源目录
--disable-swagger-uifalse禁用 Swagger UI(/swagger-ui)端点

CSP 与 X-Frame-Options 属于点击劫持防护的关键配置,默认值分别由ARGOCD_SERVER_CONTENT_SECURITY_POLICYARGOCD_SERVER_X_FRAME_OPTIONS环境变量覆盖(见 cmd/argocd-server/commands/argocd_server.go)。--disable-swagger-ui的默认值测试覆盖在 cmd/argocd-server/commands/argocd_server_test.go。

API 与请求控制

Flag默认值说明
--api-content-types stringapplication/json非 GET API 请求允许的 Content-Type 列表,分号分隔;为空则允许任意类型
--webhook-parallelism-limit int50并发处理的 webhook 请求数,范围 1~1000
--webhook-refresh-workers int20并发处理的 webhook 刷新请求数,范围 1~1000
--glob-cache-size int10000RBAC 评估用编译 glob 模式的最大缓存数量
--sync-with-replace-allowedtrue是否允许用户在 UI/CLI 中为同步选择 replace 策略

--api-content-types在源码中会被按;切分为列表传入ArgoCDServerOpts.ContentTypes(见 cmd/argocd-server/commands/argocd_server.go),由 gRPC-gateway 在处理非 GET 请求时校验。webhook 并行度参数在 server/server.go 的WebhookParallelismWebhookRefreshWorkers字段中生效。

Kubernetes 客户端与多租户

Flag默认值说明
--kubeconfig string-kubeconfig 路径,仅集群外运行时需要
--context string-kubeconfig 上下文名称
--cluster string-kubeconfig 集群名称
--user string-kubeconfig 用户名
-n, --namespace string-CLI 请求的命名空间范围
--as string/--as-group stringArray/--as-uid string-模拟(impersonate)用户/用户组/UID 进行操作
--proxy-url string-通过代理连接
--application-namespaces strings-额外的、可管理 Application 资源的命名空间列表,由ARGOCD_APPLICATION_NAMESPACES覆盖

--application-namespaces在 cmd/argocd-server/commands/argocd_server.go 注册,用于实现"应用可以放置在多个命名空间"的多租户能力,其值会被注入ArgoCDServerOpts.ApplicationNamespaces

特性开关(Feature Flags)

Flag默认值说明
--enable-k8s-event strings[all]启用 Argo CD 使用 k8s 事件:设none禁用全部事件;也可按event reason指定,如--enable-k8s-event=StatusRefreshed,ResourceCreated
--enable-proxy-extensionfalse启用 Proxy Extension 特性
--hydrator-enabledfalse启用 Hydrator 特性开关(由ARGOCD_HYDRATOR_ENABLED覆盖)

--enable-k8s-event的默认值来自argo.DefaultEnableEventList()(见 cmd/argocd-server/commands/argocd_server.go),环境变量为ARGOCD_ENABLE_K8S_EVENT。Hydrator 是 Argo CD 3.x 引入的"仓库侧同步/水合"新架构组件,该开关用于控制 API Server 是否启用对应能力。

ApplicationSet 相关

Flag默认值说明
--appset-enable-scm-providerstrue启用从 SCM 提供商获取信息,供 SCM 与 PR 生成器使用
--appset-allowed-scm-providers strings空(全部允许)允许的自定义 SCM Provider API URL 列表;不适用于不接受自定义 API URL 的 SCM/PR 生成器
--appset-scm-root-ca-path string-自签名 TLS 证书的 Root CA 路径
--appset-enable-new-git-file-globbingfalse在 Git 文件生成器中启用新的 globbing 行为
--appset-enable-github-api-metricsfalse为使用 GitHub API 的生成器启用 GitHub API metrics

这些参数最终被组装进server.ApplicationSetOpts(见 cmd/argocd-server/commands/argocd_server.go),对应环境变量前缀为ARGOCD_APPLICATIONSET_CONTROLLER_*。由于 ApplicationSet 控制器与 API Server 共享运行环境,这些开关统一在 API Server 侧暴露,供 Webhook 处理与生成器调用时使用。

kubeconfig 客户端通用 Flags(继承)

以下 Flags 由cli.AddKubectlFlagsToCmd(command)统一注册(见 cmd/argocd-server/commands/argocd_server.go),同样出现在argocd-server version的 inherited options 中:

--as string Username to impersonate for the operation --as-group stringArray Group to impersonate for the operation --as-uid string UID to impersonate for the operation --certificate-authority string Path to a cert file for the certificate authority --client-certificate string Path to a client certificate file for TLS --client-key string Path to a client key file for TLS --cluster string The name of the kubeconfig cluster to use --context string The name of the kubeconfig context to use --disable-compression If true, opt-out of response compression for all requests to the server --insecure-skip-tls-verify If true, the server's certificate will not be checked for validity --kubeconfig string Path to a kube config. Only required if out-of-cluster -n, --namespace string If present, the namespace scope for this CLI request --password string Password for basic authentication to the API server --proxy-url string If provided, this URL will be used to connect via proxy --request-timeout string The length of time to wait before giving up on a single server request --server string The address and port of the Kubernetes API server --tls-server-name string If provided, this name will be used to validate server certificate --token string Bearer token for authentication to the API server --user string The name of the kubeconfig user to use --username string Username for basic authentication to the API server

源码级运行原理

启动流程

argocd-server的启动核心在 cmd/argocd-server/commands/argocd_server.go 的Run回调中,关键调用链为:

NewCommand() → command.Execute() → Run() 回调 → clientConfig.ClientConfig() # 加载 kubeconfig → tlsConfigCustomizerSrc() # 组装 TLS 配置自定义器 → cacheSrc() # 构建 API Server 缓存(Redis) → repoServerCacheSrc() # 构建 repo-server 缓存(独立 Redis 连接) → apiclient.NewRepoServerClientset() # 建立与 repo-server 的 gRPC 连接 → server.NewServer(ctx, opts, appsetOpts) → argocd.Init(ctx) # 初始化 informer、RBAC enforcer、settings 等 → 循环 { argocd.Listen(); argocd.Run() } # 监听并运行,支持优雅重启

其中Listen()返回监听器集合,Run()启动 HTTP/HTTPS 与 gRPC 服务;循环结构配合TerminateRequested()支持服务端请求终止后的重启(见 cmd/argocd-server/commands/argocd_server.go)。

多协议暴露

从 server/server.go 的 import 可以看出,API Server 同时集成:

  • gRPC 服务(含 gRPC-gateway 的 REST 转换);
  • grpc-web(供浏览器端 Web UI 调用);
  • cmux(soheilhy/cmux 风格连接复用器,代码见 server/server.go)在同一端口上按协议分流 HTTP/HTTPS 与 gRPC 流量;
  • OpenTelemetry 的 otelgrpc/otelhttp 埋点(server/server.go)。

这就是 Web UI、CLI、CI/CD 系统能够以不同协议访问同一 API 端口的技术基础。

环境变量优先级

官方文档仅列出了 Flags,但源码显示绝大多数参数都支持对应的环境变量覆盖,遵循"Flag 优先、环境变量兜底"的模式,例如:

Flag环境变量
--insecureARGOCD_SERVER_INSECURE
--addressARGOCD_SERVER_LISTEN_ADDRESS
--repo-serverARGOCD_SERVER_REPO_SERVER
--dex-serverARGOCD_SERVER_DEX_SERVER
--logformatARGOCD_SERVER_LOGFORMAT
--loglevelARGOCD_SERVER_LOG_LEVEL
--app-state-cache-expirationARGOCD_APP_STATE_CACHE_EXPIRATION
--oidc-cache-expirationARGOCD_SERVER_OIDC_CACHE_EXPIRATION
--application-namespacesARGOCD_APPLICATION_NAMESPACES
--appset-enable-scm-providersARGOCD_APPLICATIONSET_CONTROLLER_ENABLE_SCM_PROVIDERS

提醒:以--repo-server-*开头的 flag(repo-server 的缓存/TLS 连接)与--redis-*(API Server 自身缓存)都对应独立的环境变量,例如--repo-server-redis-use-tls--redis-use-tls是两个不同开关,配置时不要混淆。

测试覆盖

命令注册逻辑有较完整的单元测试保障(见 cmd/argocd-server/commands/argocd_server_test.go),重点覆盖:

  • mTLS 相关 flag 的注册与默认值(TestNewCommand_RegistersMTLSFlagsTestNewCommand_MTLSFlagDefaults);
  • 环境变量前缀隔离(TestNewCommand_MTLSEnvVarPrefixTestNewCommand_MTLSEnvVarNotOverriddenByOtherComponents);
  • 显式指定 flag 覆盖默认值(TestNewCommand_MTLSFlagsCanBeSetExplicitly);
  • --repo-server-ca-cert-path优先于内嵌证书(TestNewCommand_RepoServerCACertTakesPrecedenceOverEmbeddedCert);
  • --disable-swagger-ui的默认值、显式设置与环境变量三种路径(TestNewCommand_DisableSwaggerUIFlagDefault等)。

常见配置场景

场景一:默认安装

在标准安装清单(见 manifests)中,argocd-serverDeployment 通常直接以argocd-server命令启动,通过argocd-cmd-params-cmConfigMap 注入环境变量(ARGOCD_SERVER_*前缀)完成定制,无需修改命令行。

场景二:反向代理子路径部署

当 Argo CD 部署在/argocd这类子路径时:

argocd-server --rootpath /argocd

源码会在rootPath != ""时自动将其作为baseHRef使用;若--basehref--rootpath同时设置且不一致,会打印冲突警告并以 rootpath 为准(见 cmd/argocd-server/commands/argocd_server.go)。

场景三:本地开发调试

# 无 TLS、关闭认证,本地快速启动 argocd-server --insecure --disable-auth --kubeconfig ~/.kube/config # 调整日志与端口 argocd-server --port 18080 --loglevel debug --logformat text

场景四:链路追踪

argocd-server --otlp-address otel-collector:4317 --otlp-insecure \ --otlp-attrs env:prod --otlp-sample-ratio 0.5

采样比例支持 0.0~1.0,采用父级(parent-based)传播决策,下游服务会遵循上游采样结果。

总结

argocd-server作为 Argo CD 对外唯一的 API 入口,其参数体系覆盖了监听端口、TLS、认证、缓存、repo-server 连接、日志追踪、安全响应头、特性开关与 ApplicationSet 集成等全部运行维度。理解每个 Flag 的默认值与环境变量对应关系,是部署、调优与故障排查的前提;而 cmd/argocd-server/commands/argocd_server.go、server/server.go、util/tls/tls.go、server/cache/cache.go 等源码则揭示了这些参数背后的真实生效路径。完整参数列表始终可通过argocd-server --help查看,官方命令参考见 docs/operator-manual/server-commands/argocd-server.md。

【免费下载链接】argo-cdDeclarative Continuous Deployment for Kubernetes项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 7:38:37

Vue+SpringBoot+MyBatis简历管理系统技术栈解析

简介:这是一套面向计算机专业本科生的毕业设计实战项目资源,基于VueSSMSpringBoot技术栈构建完整简历管理系统,适用于Java全栈开发入门到进阶的学习与毕设参考。资源包含可直接运行的源码、管理员与前台双端演示视频、结构规范的毕业论文及答…

作者头像 李华
网站建设 2026/9/13 7:37:57

ZeroClaw执行层:Rust嵌入式神经脉冲调度系统

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/13 7:37:49

Java AI转型实战:用Spring Boot打造完整智能助手应用

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华