From d0b9b6b71d815fe4e864316aa794919adf3141ce Mon Sep 17 00:00:00 2001 From: opsx Date: Mon, 26 Oct 2026 17:30:30 +0000 Subject: [PATCH] =?UTF-8?q?fix(ui):=20=E5=89=8D=E7=AB=AF=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=8F=AF=E8=A7=81=E6=96=87=E6=A1=88=20opsx-loki=20=E2=86=92=20?= =?UTF-8?q?lokistack?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修正用户能看到/会复制走的旧名(你反馈的 K8s 示例 token 命令在内): 1. 界面标题(4 处) App.tsx 浏览器标题栏 Layout.tsx 侧边栏 logo / 页面标题 fallback / 移动端导航 login/index.tsx 登录页大标题 settings/index.tsx 「关于 lokistack」 2. 集群接入示例(用户直接复制到集群执行,5 处) ClusterFormDialog.tsx: Role / ServiceAccount 名: opsx-loki → lokistack token Secret 名: opsx-loki-token → lokistack-token 取 token 命令: get secret opsx-loki-token → lokistack-token 3. 文档 docs/deployment/README.md, host-nginx.md 旧名全量修正 README.md 迁移章节之外的示例命令修正; 迁移章节(从 opsx-loki 升级)保留旧名作历史对照 【刻意不改】 a) localStorage key(9 个) opsxloki.auth.{token,refresh-token,user} opsxloki.theme.mode / layout.collapsed / chunk-reloaded opsxloki.logs.{query-history,range-history} 原因:改了所有在线用户立即掉登录,主题/折叠/查询历史全丢。 要改必须配套迁移(参考 main.tsx 中 lokideploy.* → opsxloki.* 的写法)。 b) 数据文件名 opsxloki.json(后端硬编码,改了读不到 DB) c) Go module 路径 opsxloki/...(159 处 import) 属编译期内部标识,最终用户不可见;改名需全仓重构 + go.mod 变更。 --- README.md | 38 +++++++++---------- docs/deployment/README.md | 8 ++-- docs/deployment/host-nginx.md | 12 +++--- frontend/src/App.tsx | 2 +- frontend/src/components/Layout.tsx | 6 +-- .../clusters/components/ClusterFormDialog.tsx | 16 ++++---- frontend/src/pages/login/index.tsx | 2 +- frontend/src/pages/settings/index.tsx | 2 +- 8 files changed, 43 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index ee2017d..cb3cea1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# opsx-loki v2 — 安全的 K8s Loki 部署平台 +# lokistack v2 — 安全的 K8s Loki 部署平台 一个轻量级的 **Gin + React + JSON 文件存储** 平台,用于通过 SSH 或 kubeconfig 把 Grafana Loki 日志聚合系统部署到 Kubernetes 集群或裸金属主机上。 @@ -128,8 +128,8 @@ echo "export ENCRYPTION_KEY=$ENCRYPTION_KEY" >> ~/.bashrc ### 第 2 步:用 Docker Compose 启动(推荐) ```bash -git clone https://github.com/your/opsx-loki.git -cd opsx-loki +git clone https://github.com/your/lokistack.git +cd lokistack # 设置密钥(见第 1 步) export JWT_SECRET=$(openssl rand -hex 32) @@ -150,7 +150,7 @@ docker compose logs -f ```bash # 容器级健康检查(内部) -docker inspect --format='{{.State.Health.Status}}' opsxloki +docker inspect --format='{{.State.Health.Status}}' lokistack # 期望输出:"healthy" @@ -169,32 +169,32 @@ curl http://localhost:8080/index.html ```bash # 方式 1(推荐):从容器内读文件 —— 日志轮转后依然可查 -docker compose exec opsxloki cat /app/data/initial-admin-password.txt +docker compose exec lokistack cat /app/data/initial-admin-password.txt # 方式 2:首次启动日志(只打印一次,重启后不会再有) -docker compose logs opsxloki | grep -A6 "已生成管理员账号" +docker compose logs lokistack | grep -A6 "已生成管理员账号" # 方式 3:容器已停止时也能用(不要求 running) -docker cp opsxloki:/app/data/initial-admin-password.txt ./ +docker cp lokistack:/app/data/initial-admin-password.txt ./ # 方式 4:直接读 named volume(宿主机 root) -sudo cat /var/lib/docker/volumes/opsx-loki_opsxloki-data/_data/initial-admin-password.txt +sudo cat /var/lib/docker/volumes/lokistack_lokistack-data/_data/initial-admin-password.txt ``` > ⚠️ **为什么不能只靠日志**:`docker logs` 只在**首次启动**打印一次;日志轮转或容器重启后, > 数据库里已有用户,**不会再打印**。所以**文件才是可靠来源**。 > -> 💡 容器名说明:本 compose 指定了 `container_name: opsxloki`,所以可直接用 `opsxloki`。 -> 若你的部署没有指定,用服务名形式更通用:`docker compose exec opsxloki cat ...` +> 💡 容器名说明:本 compose 指定了 `container_name: lokistack`,所以可直接用 `lokistack`。 +> 若你的部署没有指定,用服务名形式更通用:`docker compose exec lokistack cat ...` **Kubernetes 环境(同一个文件)**: ```bash # 读文件(推荐) -kubectl -n log exec deploy/opsx-loki -- cat /app/data/initial-admin-password.txt +kubectl -n log exec deploy/lokistack -- cat /app/data/initial-admin-password.txt # 首次启动日志 -kubectl -n log logs deploy/opsx-loki | grep -A6 "已生成管理员账号" +kubectl -n log logs deploy/lokistack | grep -A6 "已生成管理员账号" # 拷到本地 kubectl -n log cp :/app/data/initial-admin-password.txt ./ @@ -214,7 +214,7 @@ docker compose up -d | 项 | 说明 | |----|------| -| 密码文件权限 | `0600`,属主 `opsxloki` | +| 密码文件权限 | `0600`,属主 `lokistack` | | 自动清理 | **admin 首次修改密码后,该文件自动删除**(见 `seed.CleanupInitPassword`) | | 日志内容 | 仅在首次启动打印,且容器日志由运行时轮转 | | 忘了密码 | 数据卷里文件仍在;若文件已删,用 `ADMIN_INIT_PASSWORD` 重新初始化(需清空数据卷) | @@ -244,11 +244,11 @@ docker compose -f docker-compose.prod.yml up -d docker swarm init # 创建 secrets -echo "$(openssl rand -hex 32)" | docker secret create opsxloki_jwt - -echo "$(openssl rand -hex 32)" | docker secret create opsxloki_key - +echo "$(openssl rand -hex 32)" | docker secret create lokistack_jwt - +echo "$(openssl rand -hex 32)" | docker secret create lokistack_key - # 部署 -docker stack deploy -c docker-compose.prod.yml opsxloki +docker stack deploy -c docker-compose.prod.yml lokistack ``` ### 安全清单 @@ -368,7 +368,7 @@ cd frontend && npm run lint # ESLint | | | ~/.kube (只读) | | +-------------+ | | ~/.ssh (只读) | | | 容器 | | | ./data (读写) | -| | (opsxloki | | +---------------------+ +| | (lokistack | | +---------------------+ | | UID:1000) | | | | no-new-privs| | | | cap_drop:ALL| | @@ -410,7 +410,7 @@ wget --spider http://localhost:8080/index.html curl http://localhost:8080/index.html # Docker inspect -docker inspect --format='{{.State.Health}}' opsxloki +docker inspect --format='{{.State.Health}}' lokistack ``` 健康检查参数: @@ -563,7 +563,7 @@ docker compose up -d ```bash # 查看容器状态 -docker inspect --format='{{.State.Health}}' opsxloki +docker inspect --format='{{.State.Health}}' lokistack # 查看日志 docker compose logs --tail=50 diff --git a/docs/deployment/README.md b/docs/deployment/README.md index e10ae11..f103410 100644 --- a/docs/deployment/README.md +++ b/docs/deployment/README.md @@ -1,8 +1,8 @@ # 部署说明 -本文档描述 `opsx-loki` 的两种部署方式,域名与 IP 均为脱敏示例: +本文档描述 `lokistack` 的两种部署方式,域名与 IP 均为脱敏示例: -- `opsx-loki.xxx.io` —— 平台 UI 域名 +- `lokistack.xxx.io` —— 平台 UI 域名 - `log.xxx.io` —— Loki 查询域名(Ingress) - `192.168.x.x` —— 内网地址占位 @@ -18,10 +18,10 @@ └─ K8s 部署:proxy_pass http://:30080 │ ▼ - Service opsx-loki:8080 + Service lokistack:8080 │ ▼ - Deployment opsx-loki(1 副本) + Deployment lokistack(1 副本) │ ┌────────────────┴────────────────┐ ▼ ▼ diff --git a/docs/deployment/host-nginx.md b/docs/deployment/host-nginx.md index 1133b9e..ab52255 100644 --- a/docs/deployment/host-nginx.md +++ b/docs/deployment/host-nginx.md @@ -6,15 +6,15 @@ ## nginx vhost -`/etc/nginx/conf.d/opsx-loki.xxx.io.conf`: +`/etc/nginx/conf.d/lokistack.xxx.io.conf`: ```nginx server { listen 80; - server_name opsx-loki.xxx.io; + server_name lokistack.xxx.io; - access_log /var/log/nginx/opsx-loki.xxx.io_access.log main; - error_log /var/log/nginx/opsx-loki.xxx.io_error.log; + access_log /var/log/nginx/lokistack.xxx.io_access.log main; + error_log /var/log/nginx/lokistack.xxx.io_error.log; location / { proxy_pass http://127.0.0.1:8081; @@ -62,8 +62,8 @@ nginx -t && nginx -s reload ## 验证 ```bash -curl -I -H "Host: opsx-loki.xxx.io" http://127.0.0.1/ -curl -s -X POST http://opsx-loki.xxx.io/api/v1/auth/login \ +curl -I -H "Host: lokistack.xxx.io" http://127.0.0.1/ +curl -s -X POST http://lokistack.xxx.io/api/v1/auth/login \ -H 'Content-Type: application/json' \ -d '{"username":"admin","password":"<你的密码>"}' ``` diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index b23182d..bda78de 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -41,7 +41,7 @@ function useDocumentTitle() { const location = useLocation() useEffect(() => { const title = findRouteMeta(location.pathname)?.title - document.title = title && location.pathname !== '/login' ? `${title} · opsx-loki` : 'opsx-loki' + document.title = title && location.pathname !== '/login' ? `${title} · lokistack` : 'lokistack' }, [location.pathname]) } diff --git a/frontend/src/components/Layout.tsx b/frontend/src/components/Layout.tsx index de59d2f..ce8eaf2 100644 --- a/frontend/src/components/Layout.tsx +++ b/frontend/src/components/Layout.tsx @@ -78,7 +78,7 @@ function SidebarLogo({ collapsed }: { collapsed: boolean }) {
- opsx-loki + lokistack )} @@ -140,7 +140,7 @@ const Layout = memo(function Layout({ children }: { children: React.ReactNode }) const user = getUser() // 顶栏标题来自路由 meta - const pageTitle = findRouteMeta(location.pathname)?.title || 'opsx-loki' + const pageTitle = findRouteMeta(location.pathname)?.title || 'lokistack' // 折叠状态持久化(仅桌面端语义) useEffect(() => { @@ -190,7 +190,7 @@ const Layout = memo(function Layout({ children }: { children: React.ReactNode }) - opsx-loki 导航 + lokistack 导航
diff --git a/frontend/src/pages/clusters/components/ClusterFormDialog.tsx b/frontend/src/pages/clusters/components/ClusterFormDialog.tsx index 3518f26..41d1533 100644 --- a/frontend/src/pages/clusters/components/ClusterFormDialog.tsx +++ b/frontend/src/pages/clusters/components/ClusterFormDialog.tsx @@ -270,13 +270,13 @@ metadata: apiVersion: v1 kind: ServiceAccount metadata: - name: opsx-loki + name: lokistack namespace: log --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: - name: opsx-loki + name: lokistack namespace: log rules: - apiGroups: [""] @@ -292,29 +292,29 @@ rules: apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: - name: opsx-loki + name: lokistack namespace: log subjects: - kind: ServiceAccount - name: opsx-loki + name: lokistack namespace: log roleRef: kind: Role - name: opsx-loki + name: lokistack apiGroup: rbac.authorization.k8s.io --- apiVersion: v1 kind: Secret metadata: - name: opsx-loki-token + name: lokistack-token namespace: log annotations: - kubernetes.io/service-account.name: opsx-loki + kubernetes.io/service-account.name: lokistack type: kubernetes.io/service-account-token EOF # 2) 取出长期 Token(不自动过期),粘贴到 Token 输入框 -kubectl -n log get secret opsx-loki-token -o jsonpath='{.data.token}' | base64 -d`} +kubectl -n log get secret lokistack-token -o jsonpath='{.data.token}' | base64 -d`}

上面的 Namespace 由管理员创建,平台 Token 本身没有任何集群级权限。 只有确实需要平台自建命名空间时,才额外授予 diff --git a/frontend/src/pages/login/index.tsx b/frontend/src/pages/login/index.tsx index 14ea83b..3d1a57d 100644 --- a/frontend/src/pages/login/index.tsx +++ b/frontend/src/pages/login/index.tsx @@ -90,7 +90,7 @@ const Login = memo(function Login() {

-

opsx-loki

+

lokistack

Kubernetes Loki 日志部署平台

diff --git a/frontend/src/pages/settings/index.tsx b/frontend/src/pages/settings/index.tsx index 8443b81..298a9fb 100644 --- a/frontend/src/pages/settings/index.tsx +++ b/frontend/src/pages/settings/index.tsx @@ -152,7 +152,7 @@ const SettingsPage = memo(function SettingsPage() { - 关于 opsx-loki + 关于 lokistack