feat: K8s 部署清单、Token 接入加固与日志/设置页优化
- kubernetes/: 30Gi PVC、单副本 Recreate、Secret/Service/NodePort/Ingress 清单与部署文档 - 数据安全: kubeconfig/token 统一加密存储,启动迁移历史明文,DB 0600 - Token 接入: 命名空间级最小权限提示、长期 Token、自签证书 TLS 兼容 - 部署: 命名空间级 Token 下跳过 Namespace patch/枚举,节点信息容错 - 日志页: namespace → app → pod 选择顺序与作用域收窄 - 设置页: 拆分为通用/告警/LDAP/镜像源四个 tab - 弹框: 统一 max-h 滚动与长命令换行,修复内容溢出
This commit is contained in:
1 parent
2d73661dd1
commit
9f7c522157
50 files changed
+1346
-149
No files matched your search
@@ -14,6 +14,13 @@ const MODES = [
|
||||
{ value: 'custom', label: '私有仓库', desc: '自有 registry 前缀(如华为云 SWR)' },
|
||||
] as const
|
||||
|
||||
const COMPONENTS = [
|
||||
{ key: 'loki', label: 'Loki', repo: 'grafana/loki', tagHint: '跟随部署版本' },
|
||||
{ key: 'grafana', label: 'Grafana', repo: 'grafana/grafana', tagHint: '跟随部署版本' },
|
||||
{ key: 'promtail', label: 'Promtail', repo: 'grafana/promtail', tagHint: '3.4.0' },
|
||||
{ key: 'fluentbit', label: 'Fluent Bit', repo: 'fluent/fluent-bit', tagHint: '5.1.5' },
|
||||
] as const
|
||||
|
||||
/**
|
||||
* 镜像源设置 — 影响平台拉取的全部镜像(Loki/Grafana/Promtail/Fluent Bit),
|
||||
* 参照 kuboard 的国内/海外选择;实时预览四类镜像的生效地址。
|
||||
@@ -40,6 +47,7 @@ export const ImageRegistrySection = memo(function ImageRegistrySection() {
|
||||
const saved = await settingsApi.saveImageRegistry({
|
||||
mode: cfg.mode,
|
||||
customHost: cfg.mode === 'custom' ? customHost : undefined,
|
||||
images: cfg.images,
|
||||
})
|
||||
setCfg(saved)
|
||||
toast.success('镜像源已保存,后续部署/采集将使用新镜像地址')
|
||||
@@ -91,6 +99,43 @@ export const ImageRegistrySection = memo(function ImageRegistrySection() {
|
||||
</div>
|
||||
)}
|
||||
|
||||
{/* 各服务镜像自定义 */}
|
||||
<div className="space-y-2">
|
||||
<Label>各服务镜像(可单独覆盖仓库 / Tag)</Label>
|
||||
<div className="space-y-2">
|
||||
{COMPONENTS.map(({ key, label, repo, tagHint }) => {
|
||||
const img = cfg.images?.[key] || { repository: '', tag: '' }
|
||||
const update = (patch: Partial<{ repository: string; tag: string }>) =>
|
||||
setCfg({
|
||||
...cfg,
|
||||
images: { ...(cfg.images || {}), [key]: { ...img, ...patch } },
|
||||
})
|
||||
return (
|
||||
<div key={key} className="grid items-center gap-2 sm:grid-cols-[110px_1fr_150px]">
|
||||
<span className="text-sm font-medium">{label}</span>
|
||||
<Input
|
||||
aria-label={`${label} 镜像仓库`}
|
||||
value={img.repository}
|
||||
placeholder={repo}
|
||||
onChange={(e) => update({ repository: e.target.value })}
|
||||
className="font-mono text-xs"
|
||||
/>
|
||||
<Input
|
||||
aria-label={`${label} 镜像 Tag`}
|
||||
value={img.tag}
|
||||
placeholder={tagHint}
|
||||
onChange={(e) => update({ tag: e.target.value })}
|
||||
className="font-mono text-xs"
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
})}
|
||||
</div>
|
||||
<p className="text-xs text-muted-foreground">
|
||||
仓库填镜像路径(如 <code>grafana/loki</code>);Tag 留空时 Loki / Grafana 跟随部署版本,Promtail / Fluent Bit 用内置默认。
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{/* 生效镜像预览 */}
|
||||
<div className="rounded-lg bg-muted/50 p-3 space-y-1.5">
|
||||
<p className="text-xs font-medium text-muted-foreground">生效镜像预览</p>
|
||||
|
||||
Reference in new issue
Block a user