{{ title }} v{{ APP_VERSION }}
近 7 天任务量
| ID | 公司/账号 | 联系人 | 状态 | 余额 | 有效期至 | 任务数 | 授权 | 密钥 | 备注 | 密码 | 操作 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ u.id }} | {{ u.company_name||u.username }} {{ u.username }} |
{{ u.contact_person||'-' }} |
已删除
{{ u.status==1?'正常':'停用' }}
删于 {{ fmtDate(u.deleted_at) }}
|
{{ (u.quota_total||0)-(u.quota_used||0) }} | {{ fmtDate(u.plan_expire_at) }} | {{ u.job_count||0 }} | {{ u.grant_count||0 }} 个 | {{ u.key_count||0 }} | {{ (u.remark||'-').length>16 ? (u.remark.slice(0,16)+'…') : (u.remark||'-') }} |
{{ pwdReveal[u.id] }}
••••••••
|
|
{{ cDel ? '回收站是空的(没有已删除的大用户)' : '暂无大用户,点右上角开通' }} | |||||||||||
本页只读。要改天数或新增规则,请到 OSS 控制台操作 —— 原因是生命周期规则是「整份替换」语义, 后台一键改写有把「带过滤器的规则」写成「整桶规则」的风险(那会导致整桶被删),不值得为了省事冒这个险。
| 规则 ID | 管的目录(前缀) | 多少天后删 | 状态 | 范围类型 | 查看 |
|---|---|---|---|---|---|
| {{ r.id }} | {{ r.prefix || '(空前缀)' }} | {{ r.days==null ? (r.date||'—') : r.days+' 天' }} | {{ r.status=='Enabled'?'生效中':r.status }} | {{ r.has_filter ? '带过滤器' : '按前缀' }} · {{ r.filter_hint }} | |
{{ storeLoading?'加载中…':'没有读到清理规则(若接口报错见上方红字)' }} | |||||
目录统计:{{ storeStat.prefix || '(整桶)' }}
最老:{{ storeStat.oldest || '-' }} 最新:{{ storeStat.newest || '-' }}
① 权威源 = GPU 服务器本机盘 /data/comfyui/user/default/workflows/ ← ComfyUI 日常读写的就是这里
② OSS 副本 · 保存即同步(秒级) 完整原始 json,可原样还原
③ OSS 副本 · 每日 03:30 全量 与 ① 逐字节一致
④ NAS 历史快照 每 15 分钟一份、保留最近 120 份 ⇒ 可回到某个时间点的版本
⑤ 平台数据库 RDS workflow_drafts 表(记录路径 + 展平后的工作流)
换机器会丢吗?换镜像 / 重建容器 不会丢(工作流在挂载盘上,不在镜像里);换整台服务器时本机那份会没,但 ②③ 有完整原始文件,可以原样拉回。 (②③④ 的 OSS / NAS 精确目录不在此页写明:本页可被匿名读取,写明即等于对外给出直链线索。)
| ID | 名称 | 标题 | 类型 | 点数 | 授权数 | 状态 | 源文件(服务器路径) | 更新 | 操作 |
|---|---|---|---|---|---|---|---|---|---|
| {{ w.id }} | {{ w.name }} | {{ w.title }} | {{ w.owner_id?('专属·'+(w.owner_name||('#'+w.owner_id))):'公有' }} | {{ w.cost_points }} | {{ w.grant_count||0 }} | {{ w.status==1?'服务中':'已下线' }} 有新改动 | {{ w.source_file }} 手动录入 | {{ fmt(w.updated_at) }} | |
暂无工作流,去「服务器发现」标签导入 | |||||||||
公有工作流 = 自动授权给所有客户;专属工作流 = 仅授权指定客户。授权可在「大用户管理 → 独立管理」里按客户勾选调整。
关于「入库后能不能改」:入库 = 把当时的配置存成一份快照,此后它与 ComfyUI 里的文件各自独立,
你在 ComfyUI 里继续改不会自动影响这里。所以:
① 改工作流内容 → 在 ComfyUI 改好并保存 → 回来点「应用更新」(草稿每 10 分钟自动同步;状态列出现「有新改动」就表示新内容已同步到位)
② 改标题 / 点数等说明信息 → 目前没有编辑入口,需走「暂停服务 → 删除 → 到「服务器发现」重新导入」(⚠️ 删除会清空该工作流的客户授权,专属工作流要重新勾选)
③ 改归属客户(公有 / 专属)→ 只在导入时选一次,之后不可更改;客户授权可随时在「独立管理」里调整
| ID | 文件名(名称) | 节点数 | 源文件(服务器完整路径) | 同步时间 | 状态 | 操作 | |
|---|---|---|---|---|---|---|---|
| {{ d.id }} | {{ d.name }} | {{ d.node_count }} | {{ d.source_file }} — | {{ fmt(d.updated_at) }} |
已导入 #{{ d.imported_workflow_id }}
已导入 #{{ d.imported_workflow_id }} · 有更新
待导入
平台在用的仍是旧内容({{ d.wf_status==1?'服务中':'已下线' }})
|
{{ fmt(d.updated_at) }} | |
暂无同步到的工作流草稿(GPU 机 Agent 会自动上报) | |||||||
导入 = 存为平台正式工作流并上线;专属工作流 在导入时选择归属客户,只有该客户能调;公有 自动授权所有客户。
{{ testImgName || '点击上传测试图片(PNG/JPG/WebP ≤10MB)' }}
| 时间 | 操作人 | 动作 | 目标 | 详情 | IP |
|---|---|---|---|---|---|
| {{ fmt(a.created_at) }} | {{ a.username||('#'+a.admin_id) }} | {{ AUDIT_TEXT[a.action]||a.action }} | {{ a.target_type ? (a.target_type+(a.target_id?'#'+a.target_id:'')) : '-' }} | {{ a.ip||'-' }} | |
暂无操作记录 | |||||
| 时间 | 客户 | 方向 | 点数 | 类型 | 备注 | 操作 |
|---|---|---|---|---|---|---|
| {{ fmt(r.created_at) }} | {{ r.company_name||r.username||('#'+r.user_id) }} | {{ r.kind=='in'?'充值':'扣点' }} | {{ r.points>0?'+':'' }}{{ r.points }} | {{ REC_TEXT[r.action]||r.action }} | ||
暂无充值记录 | ||||||
Layer 3 · FC 巡检线程
| 心跳线程 | {{ m.layer1.hb_thread_alive?'运行中':'已停止' }} |
| 上次成功心跳 | {{ m.layer1.last_hb_ok?fmt(Date(m.layer1.last_hb_ok*1000)):'-' }} |
| 连续失败次数 | {{ m.layer1.hb_fail_count||0 }} |
| Agent 运行时长 | {{ wdUptime(m.layer1.agent_uptime) }} |
| 恢复事件总数 | {{ m.layer2.recovery_events||0 }} 次 |
| 日志最后更新 | {{ m.layer2.log_mtime?fmt(Date(m.layer2.log_mtime*1000)):'-' }} |
{{ m.layer2.watchdog_log }}
| ID | 名称 | 版本 | 状态 | 扣点 | 节点数 | 创建时间 | 操作 |
|---|---|---|---|---|---|---|---|
| {{ p.id }} | {{ p.name }} | v{{ p.version }} | {{ {draft:'草稿',active:'上线',paused:'暂停',archived:'归档'}[p.status] }} | {{ p.total_cost_points }} | {{ p.node_count||'-' }} | {{ fmt(p.created_at) }} |
管道执行记录
| 任务ID | 状态 | 扣点 | 开始 | 完成 | 操作 |
|---|---|---|---|---|---|
| {{ j.id }} | {{ j.status }} | {{ j.cost_points }} | {{ fmt(j.started_at) }} | {{ fmt(j.completed_at) }} |
已注册节点
| ID | 名称 | 分类 | 执行器 | 输入 | 输出 | 扣点 | 状态 |
|---|---|---|---|---|---|---|---|
| {{ n.id }} | {{ n.name }} | {{ {input:'输入',process:'处理',generate:'生成',output:'输出'}[n.category] }} | {{ n.executor_type }} | {{ n.input_type }} | {{ n.output_type }} | {{ n.is_active?'启用':'停用' }} |
节点耗时统计
| 节点类型 | 分辨率桶 | 样本数 | 中位数(ms) | P25 | P75 | P95 | 更新时间 |
|---|---|---|---|---|---|---|---|
| {{ s.node_type }} | {{ s.resolution_bucket }} | {{ s.sample_count }} | {{ s.median_ms }} | {{ s.p25_ms }} | {{ s.p75_ms }} | {{ s.p95_ms }} | {{ fmt(s.last_updated) }} |
| 任务 | 客户 | 工作流 | 状态 | 优先级 | 执行机器 | 等待/耗时 | 提交时间 |
|---|---|---|---|---|---|---|---|
| #{{ j.id }} | {{ j.company_name||j.user_id }} | {{ j.workflow_title||('#'+j.workflow_id) }} | {{ stText(j.status) }} | {{ j.priority }} | {{ j.assigned_agent||'-' }} | {{ j.status=='pending' ? '排队中' : (Math.floor((j.run_seconds||0)/60)+'分'+(j.run_seconds%60)+'秒') }} | {{ fmt(j.queue_at) }} |
当前无进行中任务 | |||||||
| ID | 机器名 | 类型 | GPU / 配置 | 地址 | 状态 | 当前任务 | 成功率 | 最后心跳 | 备注 | 操作 |
|---|---|---|---|---|---|---|---|---|---|---|
| {{ m.id }} | {{ m.name }} | ☁️ API 🖥️ 物理机 |
{{ m.gpu_info||'外部平台' }}
并发 {{ m.api_running }}/{{ m.api_concurrency||1 }}
· 模板:{{ m.api_template_id }}
{{ m.gpu_info||'-' }}
⚡{{ m.gpu_detail_obj.util }}%
🌡{{ m.gpu_detail_obj.temp }}°C
🎮{{ Math.round(Number(m.gpu_detail_obj.mem_used)/1024) }}/{{ Math.round(Number(m.gpu_detail_obj.mem_total)/1024) }}G
💾{{ m.gpu_detail_obj.disk_used_pct }}%(余 {{ m.gpu_detail_obj.disk_free_gb }}G)
🧠{{ m.gpu_detail_obj.mem_used_gb }}/{{ m.gpu_detail_obj.mem_total_gb }}G · 🖥{{ m.gpu_detail_obj.cpu_pct }}%({{ m.gpu_detail_obj.cpu_cores }}核)
--
|
{{ m._effective_status=='offline'?'离线(心跳超时)':stText(m.status) }} | {{ m.current_job_id?('#'+m.current_job_id+(m.job_workflow?' · '+m.job_workflow:'')):'-' }} | {{ m.task_done||0 }}/{{ m.task_failed||0 }} · {{ m.avg_seconds }}s | {{ fmt(m.last_heartbeat)||'-' }} | {{ m.remark||'-' }} | ||
暂无机器,点右上角「添加机器」登记,或等 GPU 机 Agent 启动自动注册 | ||||||||||
物理机接入流程:添加机器 → 点「接入」复制一键命令 → 在新机器上执行(自动下载 Agent、写配置、开机自启)→ 状态变「空闲」即接入成功。
API 平台(如 liblib):添加机器时选「API 平台」,填接口地址+密钥+并发数+模板ID 即可,平台会自动探活、派发任务、轮询结果。机器台账保存在 RDS,删除仅移除台账,不影响 OSS 已生成图片。
| ID | 模板名 | templateUuid | 绑定机器 | 输入映射 | 状态 | 更新时间 | 备注 | 操作 |
|---|---|---|---|---|---|---|---|---|
| {{ t.id }} | {{ t.name }} 默认 | {{ t.agent_name||'全部API机器' }} | {{ t.status==1?'启用':'停用' }} | {{ fmt(t.updated_at)||'-' }} | {{ t.description||'-' }} | |||
暂无模板。添加 liblib 平台发布审核过的工作流 JSON 后,API 机器即可按模板直连出图 | ||||||||
使用方式:1️⃣ 在 liblib 平台发布工作流并通过审核 → 2️⃣ 复制返回的 templateUuid JSON 到这里新增模板 → 3️⃣ 输入映射配置"哪张输入图注入哪个节点"(如 image1→218 主图)→ 4️⃣ API 机器直连出图时自动使用默认模板。每个模板绑定某台机器后仅该机器可用,不绑则所有 API 机器可用。
{{ tplForm.id?'编辑模板':'新增模板' }}
实时任务(排队/生成中)
| 任务 | 工作流 | 状态 | 机器 | 排队时间 | 已跑 |
|---|---|---|---|---|---|
| #{{ j.id }} | {{ j.workflow_title||('#'+j.workflow_id) }} | {{ stText(j.status) }} | {{ j.assigned_agent||'-' }} | {{ fmt(j.queue_at) }} | {{ j.status=='running'?(Math.floor((j.run_seconds||0)/60)+'分'+(j.run_seconds||0)%60+'秒'):'-' }} |
当前无进行中任务 | |||||
| 任务 | 工作流 | 类型 | 状态 | 机器 | 点数 | 时间 | 结果 |
|---|---|---|---|---|---|---|---|
| #{{ j.id }} | {{ j.workflow_title||('#'+j.workflow_id) }} | 测试— | {{ stText(j.status) }} | {{ j.assigned_agent||'-' }} | {{ j.cost_points }} | {{ fmt(j.created_at) }} | 查看{{ short(j.error) }} |
暂无记录 | |||||||