> v0.17.9:当前 www.miniyun.com 为测试系统,已启用 OA_REGISTRATION_ROLE=system-admin。邮箱验证注册后自动获得系统管理员角色,现有启用状态的自注册测试账号同步补齐该角色,可以使用全部应用及管理功能。原有账号、邮箱、API Key 和业务数据保留;停用账号保持停用。自动生成及跟随账号权限的 API Key 也具有管理员权限。其他部署不设置该变量(或设置 registered-user)时仍按普通用户注册,业务模块通过角色授权。关闭此配置只改变今后的注册策略,不自动撤销已有管理员角色。 > v0.17.8:正式发布的“平台能力”确认支持全选、取消全选及部分选中提示。应用信息增加提交者、审核者、当前安装版本和提交时间;人员显示底座绑定的姓名、邮箱。发布信息需匹配当前安装版本与 manifest 指纹,只取成功发布记录,找不到时标为“未登记”。开发者仍按应用所有者显示,可能与本版本提交者、审核者不同。 > v0.17.7:应用目录、模块管理和应用信息显示开发者与邮箱。GET /api/modules 和管理详情响应的 module.developer 包含 name、email、source;信息由底座根据应用所有者的账号绑定生成(source=application_owner),历史应用可回溯成功发布的提交者(source=published_submitter)。不接受安装包自报的身份;无法确认时显示“未登记”,不推测作者。联系信息只向已登录且可查看该目录的用户展示。 > v0.17.6:新增内置“默认用户”角色,新老账号自动获得全部应用目录查看权限。工作台和左侧展示已运行应用;无业务角色时点击可查看介绍及授权提示。该角色不授予业务数据读取、写入、发布审批或系统管理权限。“我的应用发布”只管理本人应用,API Key 可在左侧和右上角进入。 # 自助注册、个人API Key与应用发布(v0.17.5) 每个启用账号都可以提交、模拟测试、审核并发布自己名下的应用,无须管理员审批。系统管理员仍可治理全部应用;普通用户不会因此获得平台用户、角色、Docker或其他应用的管理权限。 ## 注册后自动发放Key并发邮件 邮箱验证码验证成功后创建账号,后台自动生成一把有效期90天的个人API Key,向该绑定邮箱发送注册成功说明。邮件包含完整Key、工作空间链接、申请/撤销Key的方法,以及下面的提交和发布命令示例。默认Key跟随本人实时权限,停用账号或撤销Key后失效。 可在“我的API Key”另行创建Key、缩小权限和撤销,不必联系管理员申请发布令牌。服务端API Key表仅保存哈希;为可靠发送邮件,重试队列以AES-GCM加密保存含Key的正文,密钥位于受保护数据目录的mail-outbox.key,邮件服务接受后清除队列中的加密正文。日志、公开API和文档不返回完整Key。备份数据时须同时备份该加密密钥文件。 邮件包含秘密Key,用户可以按自己的选择交给可信Agent。浏览器不会从模块H5暴露该Key,应用包中也不应包含Key、数据库密码或.env。 ## 应用归属与发布权限 全局模块ID首次成功提交后绑定账号User.ID;后续同ID仅所有者和系统管理员可提交升级。已安装的历史模块不允许被其他注册用户抢占,已有发布记录按真实提交账号恢复归属;无法确认归属的存量应用仍由平台管理。提交令牌仅作为兼容入口,由令牌签发账号承担归属,不变成匿名发布凭据。 普通用户的发布页只展示自己应用的候选包,能自行模拟、查看随包数据库SQL、明确确认能力、发布和驳回。模拟失败不能发布,审核的包与安装包必须指纹一致。个人应用模拟和发布要求Linux Docker模式,不会回退到宿主原生执行。 自助能力默认允许identity.get、records.list、records.create、database.connect;组织目录要求账号原本具有directory.read,云运维等敏感集成不因注册或发布而自动获得。数据库账号/schema仍经受控服务分配,上传者不能指定任意镜像、启动命令、挂载或网络。 发布成功后自动分配该应用的业务权限和仅限该应用的所有者角色,可进入和使用自己的应用。所有者可以管理本应用数据,不能借此读取其他模块或授予自己平台管理权限。API Key的权限上限仍有效;主动缩小为仅提交权限的Key不会自动变成可调用所有业务动作的Key。 ## 网页操作 1. 使用邮箱验证码注册/登录,查看注册邮件中的Key及说明。 2. 打开“我的应用发布”,上传manifest、程序、H5、simulation.json及声明SQL/依赖组成的ZIP。 3. 运行隔离模拟,修正失败项;测试通过后自行确认能力并点击“批准正式发布”。 4. 等待状态变为已发布,工作空间刷新应用目录并可进入应用。 ## Agent或终端示例 下列Key为占位符;注册邮件会填入实际Key。每次新提交生成新请求号,同一次提交重试保留原号。SID替换为提交响应的id;批准capabilities必须与manifest完整一致。 ```sh export OA_URL='https://www.miniyun.com' export OA_API_KEY='oa_key_替换为邮件中的实际Key' export SUBMISSION_REQUEST_ID="$(uuidgen)" curl -X POST "$OA_URL/api/module-submissions" \ -H "Authorization: Bearer $OA_API_KEY" \ -H "X-Submission-Request-ID: $SUBMISSION_REQUEST_ID" \ -H 'Content-Type: application/zip' --data-binary @application.zip export SID='替换为返回的候选包id' curl -X POST "$OA_URL/api/publishing/submissions/$SID/test" \ -H "Authorization: Bearer $OA_API_KEY" -H 'Content-Type: application/json' -d '{}' # 等待status=ready curl "$OA_URL/api/module-submissions/$SID" -H "Authorization: Bearer $OA_API_KEY" curl -X POST "$OA_URL/api/publishing/submissions/$SID/approve" \ -H "Authorization: Bearer $OA_API_KEY" -H 'Content-Type: application/json' \ -d '{"capabilities":["identity.get","records.list","records.create"],"note":"本人确认发布"}' # 继续查询,直至status=published或failed curl "$OA_URL/api/module-submissions/$SID" -H "Authorization: Bearer $OA_API_KEY" ``` ## 本人通知与可靠发送 注册成功邮件含Key与示例;提交成功、发布成功或发布失败通知对应应用所有者邮箱,不再要求管理员收信和批准。邮件链接为`/#/publishing?submission=`,登录后打开指定候选详情,不携带Key或审批凭据,也不会点击即发布。 沿用RESEND_API_KEY、OA_MAIL_FROM及HTTPS public-origin。后台约每15秒检查持久队列,提交和状态变化也会唤醒;每轮最多5封,每事件/收件人使用固定幂等号并冻结载荷。临时错误退避重试,最多5次,等待1分钟、5分钟、15分钟、1小时;首次尝试20小时后停止自动重试。永久4xx停止,队列和Key不会因重启重复创建。 发送前核对账号启用状态与邮箱。发布页显示发送/待发送/失败数量,不暴露邮箱正文或服务密钥;“已发送”只代表邮件服务接受,不能证明进入收件箱或已读。邮件故障不阻止提交/发布,注册Key创建与加密邮件入队同一持久提交;因故未收到可在“我的API Key”撤销旧Key并重新申请。