系统概述
了解 TSS Portal 的定位与技术架构
快速入门
3分钟快速上手,从登录到创建内容
管理后台
14 个管理模块完整操作指南
内置工具
11个实用工具完整使用说明
环境与发布
三环境概览:本地 / 灰度 / 生产
常见问题
FAQ 与故障排查指南
系统概述
什么是 TSS Portal
TSS Portal 是面向团队内部使用的轻量级工作门户系统,基于 Node.js + Express + SQLite 实现,前端使用 Vue 3 直接渲染,无需构建步骤。
系统将「常用链接、工具入口、项目信息」集中在一个统一入口,通过 UMU SAML SSO 登录(登录页现仅保留这一个入口),管理员可按用户分配可见内容,普通用户拥有独立工作台管理个人内容。另设 UTJ 受限角色,仅能访问被授权的工具,登录后落地到专属日语页。
三环境拓扑 v2.9 新增
- 生产(Prod):
https://tss.umu.work— 日常正式使用,推荐 UMU SAML SSO 登录 - 灰度(Gray):
https://tss-portal.top— 发版前验证、远程办公、应急通道 - 本地(Local):
http://localhost:3000— 开发调试
三环境共用同一份代码(同一 Git 仓库),但各自维护独立 SQLite 数据,互不影响。
技术架构
| 层级 | 技术选型 |
|---|---|
| 后端 | Node.js + Express.js |
| 数据库 | better-sqlite3 (SQLite,WAL 模式) |
| 前端渲染 | Vue 3 (CDN 方式,无需构建) |
| 认证 | UMU SAML 2.0 SSO + Google Identity Services + JWT(7 天有效期) |
| 部署 | Docker + docker-compose |
| UI 图标 | Lucide Icons |
角色说明
快速入门
环境入口
| 环境 | 入口 | 用途 | 推荐登录 |
|---|---|---|---|
| 生产 Prod | https://tss.umu.work | 日常正式使用 | UMU SAML SSO |
| 灰度 Gray | https://tss-portal.top | 发版前验证、应急通道 | UMU SAML SSO |
| 本地 Local | http://localhost:3000 | 开发调试 | 测试登录(BYPASS) |
页面路径
| 页面 | 路径 | 说明 |
|---|---|---|
| 🔐 登录页 | /login.html | 用户登录入口 |
| 🏠 门户首页 | / | 主页面(登录后默认跳转) |
| ⚙️ 管理后台 | /admin.html | 管理员功能,仅管理员可访问 |
| 👤 用户工作台 | /my.html | 个人设置与内容管理 |
| 📖 使用指南 | /USER_GUIDE.html | 本文档 |
本地启动服务
cd TSS_PORTAL
cp .env.example .env # 复制环境变量模板并填写
npm install
npm start
服务启动后,访问 http://localhost:3000 即可使用。
.env 中 ADMIN_EMAILS 控制,对应邮箱首次登录后自动获得管理员角色。登录与认证
登录方式 v2.11 改版
登录页已全英文化,只保留一个「Sign in with UMU account」按钮,点击后跳转 UMU 公司 SSO 完成认证。
- 使用公司账号 + MFA(已登录则免输)
- 单点登录,与公司 IT 统一管理
- 需要管理员提前将您的邮箱添加到白名单
- 支持 SLO(退出登录会结束 IdP 端会话)
- Google OAuth:登录页已移除按钮;其 Client ID 现主要供「Google Sheet 同步 / DevOps 监控面板」工具的浏览器直读使用
- 测试登录(BYPASS):邮箱 + 访问码跳过 SSO,访问码来自
.env的BYPASS_SECRET。仅在内网环境显示入口(阿里云通过HIDE_TEST_LOGIN=1显式隐藏,留作兜底)
认证流程
用户点击登录 → SAML IdP / Google / BYPASS 校验
→ 后端签发 JWT(有效期 7 天)
→ 同时写入 localStorage(API 调用)+ httpOnly Cookie(静态页鉴权)
→ 自动跳转回原本想访问的页面
退出登录
点击右上角头像 → 选择「退出登录」,清除本地 JWT 令牌并跳转登录页。SAML 用户支持 SP-Initiated SLO(IdP 端会话也会被结束)。
Google 公钥证书自动维护
阿里云不能直连 googleapis.com,Google 验签用的公钥(每 1-2 周轮换一次)由 内网 pek01-tss 充当代理每日定时拉取并推送到阿里云。普通用户登录无任何感知。
- 自动续期:pek01-tss 上 admin 用户的 cron
0 9,21 * * *(每天 09:00 + 21:00)调用/home/admin/bin/refresh-google-certs.sh,拉证书后 POST 到/api/auth/inject-google-certs - 管理员浏览器代拉(次路径):管理员每次打开
/admin.html时自动触发一次刷新;后台「外部接口配置」tab 底部「Google 公钥证书」卡片可手动「立即刷新」 - 缓存策略:登录路径带 5 秒超时 + 宽容缓存,即使 Google 临时不可达也不会 hang 死登录请求
- 排查日志:
tss→sudo -u admin tail -20 /home/admin/var/log/refresh-google-certs.log(看到OK: 已注入 X 把证书即正常)
门户首页
首页三大区域
每个区域的标题、排序和可见性均可在「布局配置」中调整(管理员全局配置,用户个人配置)。
常用链接(v2.4 改造:分类卡片 + Popover)
- 顶部 cat-tab 胶囊按钮「全部 / 分类 A / 分类 B / ...」
- 选「全部」:显示分类卡片网格,每张卡显示分类名 + 链接数量徽章
- 选具体分类:直接平铺该分类下所有链接
- 未分类的链接自动聚合到末尾的「其他」虚拟卡
- 图标由系统根据名称和描述自动分配(去重),无需手动选择
- 智能定位(视口边缘自动调整方向,不溢出)
- 列出该分类下所有链接(含个人链接,带「我的」徽章)
- 点 ESC / 点外部 / 滚动页面 → Popover 自动关闭
- 底部「+ 添加链接到此分类」→ 跳到管理页并预选当前分类
常用工具
- 顶部胶囊按钮按工具分类过滤(PPT 制作 / 数据分析 / 邮件处理 / ...);工具支持多分类(v2.12),一个工具可归入多个分类,选中任一所属分类都会显示
- 工具卡显示状态指示灯(在线 / 离线 / 检测中)
- 受权限和个人隐藏设置控制(在「我的工作台 → 工具设置」管理)
项目信息(v2.5 改造)
- 顶部 cat-tab 过滤栏(绿色风格)
- 「全部」显示项目分类卡片,点击弹 Popover 概览
- 选具体分类 tab → 平铺显示该分类下项目(保留绿色边框风格)
- 「+ 添加项目到此分类」→ 跳管理页预选分类
主题切换
主题偏好保存在本地,刷新后生效。管理员可在「管理后台 → 外观设置」设置全局默认主题。
管理后台
/admin.html管理模块一览(13 个)
| 模块 | 功能说明 |
|---|---|
| 链接管理 | CRUD、拖拽排序、公开范围切换、首页展示开关;批量添加(v2.4)支持 TSV/CSV 粘贴 |
| 工具管理 | CRUD、URL/颜色、状态检测、按需启动、公开范围与内容分配;分类胶囊多选(v2.12,一个工具可属多个分类) |
| 项目管理 | HTML 文件上传 + URL 标识映射;卡片颜色;分类下拉(v2.5);表格分类列 |
| 链接分类 | CRUD + 拖拽排序;删除前检查关联链接 |
| 工具分类 | CRUD + 拖拽排序;含图标;删除前检查是否被任一工具引用(v2.12 起按多分类映射统计) |
| 项目分类 v2.5 新增 | 项目分类 CRUD + 拖拽排序,与链接分类相同模式(含用户私有分类支持) |
| 布局配置 | 首页区域标题、显隐、顺序;上下/三栏布局切换 |
| LLM 配置 | 支持 MiniMax / GLM / Kimi / Doubao / DeepSeek(V4 Flash/Pro),工具 AI 配置可独立选 use_provider 和 system prompt |
| 外观设置 / 外部接口配置 | 全局主题、Google Client ID / Secret、Google 公钥证书自动维护、admin.umu.co Cookie(脱敏存储 + 测试连接,供「企业配置查询」工具使用) |
| 用户管理 | 预注册(白名单);角色与启用状态;内容分配(链接/工具/项目) |
| 权限设置 | 4 个全局开关:用户自定义链接 / 项目 / 修改布局 / 修改外观 |
| Bug 反馈 | 查看用户提交的 Bug 报告(含截图);标记已读 / 关闭 / 回复 |
| SSO 证书监控 v2.6 新增 | 管理 SSO 证书信息、配置 Google Sheets 同步、设置到期通知邮箱 |
批量添加链接(v2.4)
- 顶部默认分类 + 默认公开范围(每行可单独覆盖)
- 表格逐行填写:标题 / URL / 描述 / 分类 / 公开范围
- 支持粘贴 TSV/CSV:从 Excel / Notion / Google Sheets 直接复制粘贴整张表
- 分隔符自动识别(含制表符 → TSV,否则 CSV)
- 第一行如含「标题/title」「url/链接」字样会被识别为表头并跳过
- 行级修改自动脱离默认值(边框变色提示)
- 提交时图标自动分配,事务原子性(要么全部成功要么全部回滚)
项目分类(v2.5)
- 侧边栏「项目分类」入口,同链接分类操作模式
- 项目编辑 Modal 增加「分类」下拉
- 项目管理表格增加「分类」列
- 支持用户私有项目分类(在「我的工作台」管理)
- 删除分类时该分类下项目自动归到「其他」(ON DELETE SET NULL)
LLM 配置说明
LLM 配置分为两层:
- 全局提供商凭证:在「LLM 配置」Tab 中设置 MiniMax 或 GLM 的 API Key、API URL、模型名称等
- 工具级配置:为「日报周报心得」「日语润色」等 AI 工具单独选择使用哪个提供商,并可自定义系统提示词
当 LLM 未启用、无 API Key 或余额不足时,系统自动回退到本地模板,不影响使用。
用户工作台
/my.html| Tab | 功能 | 备注 |
|---|---|---|
| 我的链接 | 查看管理员分配的链接(只读);创建和管理个人私有链接 | 需要管理员开启「允许用户创建个人链接」 |
| 我的项目 | 查看管理员分配的项目(只读);上传个人 HTML 项目文件 | 需要管理员开启「允许用户上传项目」 |
| 工具设置 | 勾选/取消要在首页显示的工具;拖拽排序个人工具顺序 | 隐藏后仍可通过直接访问 URL 使用 |
| 分类管理 | 管理个人链接的自定义分类 | 仅在「允许用户创建个人链接」开启时显示 |
| 布局配置 | 自定义首页各区域的显示顺序和标题;可一键重置为管理员默认配置 | 仅在「允许用户修改布局」开启时显示 |
内置工具集
old_IdP.json / new_IdP.json 作备份config-ajaxGetConfig 接口;Cookie 在管理后台「外部接口配置」维护(脱敏存储 + 测试连接)。仅查询展示,不落库不缓存。上游对发起方 IP 有限制,仅主环境(UMU 内网)可调通;可见性 = assigned,需在「权限设置」给具体用户授权。权限体系
角色权限矩阵
| 功能 | 管理员 | 普通用户 | UTJ 受限 |
|---|---|---|---|
| 访问门户首页 | ✓ | ✓ | ✗(落地专属页) |
| 使用内置工具 | ✓ 全部 | 按可见性 | 仅授权工具 |
| 访问用户工作台 | ✓ | ✓ | ✗ |
| 提交 Bug 反馈 | ✗ | ✓ | ✓(日语版) |
| 创建个人链接 / 项目 | ✓ | 取决于权限设置 | ✗ |
| 自定义布局 | ✓ | 取决于权限设置 | ✗ |
| 访问管理后台 | ✓ | ✗ | ✗ |
| 管理用户账号 / 配置 LLM | ✓ | ✗ | ✗ |
UTJ 受限角色 v2.11 新增
- 落地页:登录后直接跳
/utj.html(纯日语「マイツール」页,只列出被授权的工具 + 日语版「バグ報告」入口),看不到首页 / 后台 / 工作台 - 双层拦截:页面层
userCanAccess仅放行被显式授权的工具(项目 / 链接一律 403);API 层utj-api-guard按「工具 → API 前缀」映射拦截未授权调用 - 只读约束:在「SSO 证书监控」「访问计划监控」中 UTJ 锁定日语并隐藏语言切换,且只能查询 / 下载,写操作(新增、编辑、删除、批量、同步 Sheet、收件人管理等)全部隐藏
- 授权方式:管理后台「用户管理」逐用户勾选可访问的工具
内容可见性规则
- 公开(all):所有登录用户均可看到
- 仅分配(assigned):只有在
user_content_access表中被授权的用户才能看到 - 个人(private):仅创建者自己可见(user_id 关联)
授权自动清理(v2.4 新增)
当管理员把某条内容的 visibility 从 assigned 改为 all 时,系统会自动删除该内容在 user_content_access 中的所有授权记录。
为什么? 防止以后切回 assigned 时旧授权意外恢复(曾发生过:原本只授权给 A 用户,后改成全员公开,再后来又改回限定状态,结果 A 用户依然能看,造成困惑)。
静态资源访问控制(v2.5 新增)
之前 /projects/<slug> 和 /tools/<dir>/* 是纯静态资源,知道 URL 即可访问。现已加入服务端鉴权:
- 未登录访问 → 自动 redirect 到
/login.html(HTTP 302) - 登录但无权限 → 返回 403 友好提示页(含「返回首页」按钮)
- 资源文件(.css/.js/图片等)放行(性能优化,安全边界在 HTML 入口)
- 认证机制:JWT 同时存 localStorage(API 调用)+ httpOnly Cookie(HTML 入口校验)
环境与发布
https://tss.umu.work 即可,无需关心发布细节。三环境总览
| 环境 | 入口 | 部署方式 | 数据库 |
|---|---|---|---|
| 生产 Prod | https://tss.umu.work | bash deploy_tss.sh | 内网独立 DB |
| 灰度 Gray | https://tss-portal.top | bash deploy.sh | 灰度独立 DB |
| 本地 Local | http://localhost:3000 | npm start | 本地 data/ |
pull-data.sh(灰度→本地)或 pull_tss.sh(生产→本地)。发布流程
npm start 本地验证功能。bash deploy.sh 同步到灰度 tss-portal.top,浏览器自测。bash deploy_tss.sh 同步到生产 tss.umu.work,等待健康检查通过。部署脚本智能行为
| 场景 | 行为 |
|---|---|
| 无文件变更 | 自动跳过,不执行任何操作 |
| 网络 / 推送失败 | 立即报错并打印具体错误位置(包括行号 + 命令) |
数据库结构变更(init.js 修改) | 自动备份服务器数据库后再部署 |
| Docker 构建失败 | 自动回滚数据库到备份版本 |
| 健康检查失败 | 输出警告和手动检查命令,保留 DB 备份 |
| 部署成功 | 输出服务地址,记录到 deploy.log |
从线上同步数据到本地
把指定环境的数据库 + 项目 HTML + 工具数据拉到本地:
# 灰度 → 本地
bash pull-data.sh
# 生产 → 本地
bash pull_tss.sh
共有的安全机制:
- Schema 安全预检:本地
init.js比服务器新(说明你有未发布修改)会要求输入yes确认 - 本地服务停止检测:检查 3000 端口占用,让你停服防 DB 损坏
- WAL checkpoint:让
.db-wal落入主库(防数据丢失) - 本地 DB 备份:拷贝到
data/.backup-TIMESTAMP/,可随时回滚 - 同步 3 个 SQLite 文件(
.db/.db-wal/.db-shm)+ projects HTML + 工具数据
pek01-tss → 阿里云自动化任务(v2.10 新增)
阿里云出网受限拉不到 googleapis.com,且内网 pek01-tss 才是日常运营的真实环境。两条 cron 任务每天自动把缺失的能力补回阿里云:
- Google 证书续期:admin crontab
0 9,21 * * *→/home/admin/bin/refresh-google-certs.sh→ 日志/home/admin/var/log/refresh-google-certs.log - DB 全量同步:root crontab
0 3 * * *→/root/bin/sync-db-to-aliyun.sh→ 日志/root/var/log/sync-db-to-aliyun.log
DB 同步流程(每晚 03:00):
- pek01-tss 上
sqlite3 .backup在线快照(不停容器,WAL 模式安全) scp推到阿里云/tmp/tss-snap-incoming.db- 阿里云:备份当前 DB 到
/var/backups/tss-db/tss_portal.YYYY-MM-DD.db(保留 7 天)→docker stop tss_portal→ 替换 DB →docker start tss_portal - 健康检查:HTTP 200/301/302,最多 25 秒;失败时自动从今日 backup 回滚
⚠️ 数据流单向:每天 03:00 阿里云被 pek01-tss 整库覆盖(包括 users 表)。阿里云上 03:00 之后的修改会在次日凌晨被回滚 —— 长期修改请到生产 tss.umu.work 上做。
不会同步到服务器的内容
node_modules/— 服务器独立安装data/— 数据库文件(保留服务器生产数据).env— 环境变量(各环境独立配置)server/config/saml-keys/sp-private.key— SAML SP 私钥(敏感,永远不入仓 / 镜像).git/、.claude/、deploy.log— 本地专用design/、*.command、*.md文档文件
常见问题
环境与登录相关
不相通。生产 / 灰度 / 本地三环境共用一份代码,但各自独立 SQLite 数据库。需要在本地复现线上问题时,用 pull-data.sh(灰度)或 pull_tss.sh(生产)把数据拉到本地。
- 日常使用 → 生产
https://tss.umu.work(UMU SAML SSO) - 内网网络不通时应急 → 灰度
https://tss-portal.top(UMU SAML SSO) - 开发调试 → 本地
http://localhost:3000(测试登录 BYPASS)
- 登录页会显示英文错误提示,按提示操作即可
- 疑似服务端问题 → 联系管理员排查容器日志
- 应急通道:内网环境可用测试登录(BYPASS,邮箱 + 访问码),或由管理员临时启用 Google 兜底
需要管理员先将您的邮箱添加到用户白名单(管理后台 → 用户管理 → 新增用户)。
v2.11 起登录页已全英文化并精简为 Sign in with UMU account 一个入口(UMU SAML SSO)。Google 登录、测试登录已从页面移除;测试登录(BYPASS)仅在内网环境自动出现,供调试与紧急兜底。
请联系管理员在「用户管理」中重新启用账号。
内容显示相关
- 该内容设置为「仅分配」且您不在分配列表中 → 联系管理员添加
- 该内容设置为「仅自己可见」且不是您创建的 → 正常
- 您在「工作台 → 工具设置」中隐藏了该工具 → 取消隐藏即可
这些功能受管理员的「权限设置」控制。若被关闭,对应 Tab 会自动隐藏。请联系管理员开启。
工具使用相关
- 检查管理后台 LLM 配置是否已填写正确的 API Key
- 确认选择的提供商(MiniMax/GLM)账户余额充足
- 如 LLM 不可用,系统会自动回退到本地模板输出
需要管理员在「邮件配置」中填写正确的 Gmail OAuth Client ID,并确保已在 Google Cloud Console 中添加对应域名的授权来源。
确认服务器上 Playwright 浏览器依赖已正确安装。如是首次部署,请联系管理员在容器内执行 npx playwright install chromium。
发布相关
- 确认本地与服务器之间网络通道已配置(灰度走 SSH,生产走 JumpServer)
- 查看
deploy.log获取详细错误信息 - 灰度:检查
deploy.sh输出的错误行号 - 生产:确认
git push是否成功,新机 cron 兜底会在 2 分钟内补拉
部署脚本会在 DB 变更时自动备份。如需手动回滚,请联系管理员,按服务器上备份目录中的对应备份文件执行恢复。
