AI时代,企业级开发方式到底怎么选?别被极端结论带偏了

最近看到两篇观点截然相反的文章,一篇说”企业应尽快停止使用低代码”,另一篇说”低代码+AI才是最优解”。争论很激烈,但说实话,两个极端都不太对。

作为一个长期关注企业级开发的人,我想聊聊我的看法。

先说一个很多人忽略的事实:代码写得快,不等于系统上线快

AI Coding的演示确实惊艳——动动嘴,一个CRM就出来了。但企业级应用不是个人项目,它要面对三个绕不过去的现实:

第一,权限管控比你想的复杂得多。 一个销售系统,一线销售只能看自己的客户,区域总监能看整个大区的漏斗,法务审批合同时有特定权限但不能改报价。精确到角色、按钮、数据列的权限配置,纯AI也很容易出漏洞。

第二,系统不是孤岛。 销售赢单要自动拉ERP的主数据、财务系统的开票信息。这种跨系统集成,AI Coding也需要提前给他准备很多信息,没那么简单。

第三,也是最关键的——系统规模上去之后的维护成本。

重点聊聊维护成本这个”隐形杀手”

很多人被AI Coding的”开发速度”迷惑了,却忽略了一个本质问题:软件的成本大头不在开发,而在维护。

AI生成代码,功能少的时候很爽。但企业系统是要持续迭代的——今天加个审批流,明天改个报表,后天对接个新系统。功能越加越多,代码膨胀到十万行以上会发生什么?

  • AI的生成准确度持续下降,因为上下文越来越长
  • 改一个功能,AI上下文失忆,把另外三个功能搞崩了
  • 这些代码普通人看不懂,专业程序员也不想碰
  • 最后维护成本远超当初开发省下的钱

这不是理论推演,是很多团队已经在踩的坑。

而低代码平台沉淀的是结构化的配置资产。 不管系统多大,每个功能的权限规则、触发事件、数据流向都是可视化、可追踪的。改起来成本是线性的,不会指数爆炸。

一句话总结:AI Coding赢在起跑线,低代码赢在马拉松。

那正确的方向是什么?

不是”低代码该死”,也不是”AI没用”,而是两者在不同场景各有地盘:

80%的企业中后台场景——低代码+AI是主战场。

HR管理、CRM客户跟进、日常行政审批、数据台账——这些场景业务逻辑相对标准,不需要极致的性能和定制。在成熟的平台底座上,用AI生成结构化的低代码配置,业务人员能看懂、能调整、能维护,开发效率和长期可控性兼得。

剩下的20%核心场景——高代码+AI是刚需。

核心交易结算、高并发C端系统、企业独有的差异化算法——这些对性能、可靠性要求极高的场景,高代码是唯一选择。AI在这里的价值是辅助:代码补全、自动生成测试、重构审查,让高代码开发效率大幅提升。

还有一个不可忽视的底线:PaaS底座。

不管选哪种方式,有一个前提经常被忽略——底座。权限管控、安全审计、接口集成、高并发保障……这些”非功能性刚需”如果每个系统都从零写一遍,成本是灾难性的。成熟的PaaS底座把这些能力固化为基础设施,上层不管是低代码还是高代码,天然就有了安全和稳定的基因。

没有底座的开发,就像在沙子上盖楼——短期很快,长期必塌。

所以,别被极端结论带偏

“低代码已死”和”AI Coding万能”都是省脑子的结论,但现实不在两个极端。

真正值得关注的趋势是:低代码正在被AI改造,AI Coding正在被平台约束,两者的边界在模糊。 未来的方向大概率是”PaaS底座 + AI + 低代码”三者融合——AI负责提速,低代码负责治理,底座负责兜底。

企业做技术选型,别看谁的演示更炫,要看三个问题:

  1. 系统规模上去之后,维护成本扛不扛得住?
  2. AI生成的内容,能不能被有效治理和校验?
  3. 有没有一个底座,让所有系统共享安全、权限、集成能力?

想清楚这三个问题,比争论”低代码该不该停”有意义得多。

HZERO PaaS平台-Docker版demo笔记(二)Docker版测试 问题21-25

问题二十一、如何用上最新的Kimi k2.5模型?

进入Kimi开放平台:platform.moonshot.cn

点击【开始构造】按照提示进行注册,认证,获得Apikey

Kimi K2.5的官方文档中的对接API调用说明:

$ curl https://api.moonshot.cn/v1/chat/completions \
    -H “Content-Type: application/json” \
    -H “Authorization: Bearer $MOONSHOT_API_KEY” \
    -d ‘{
        “model”: “kimi-k2.5”,
        “messages”: [
            {“role”: “user”, “content”: “你好”}
        ],
        “thinking”: {“type”: “disabled”}
   }’

新建最新的kimi K2.5模型对接时,返回错误:

模型清求产生未知异常,请稍后重试,异常信息为: [WebClientResponseException: 400 error,{“error”:”message”:”invaid temperature: only 0.6 is

allowed for this model”,”type”:”invalid request error”}}]

产研说 如果模型温度只能0.6吗。 这个暂不支持设置,需要用私有模型对接的方法做映射来处理:模型类型选择:对话-私有大模型

认证类型选:自定义键值认证。

自定义配置填写:Bearer+空格+APIKey

然后自定义请求映射和响应映射:

%dw 2.0 

output application/json

import dw::core::Binaries

import dw::core::URL                

// 核心优化:自动识别图片MIME类型,不再写死PNG

fun getImageMimeType(imageUrl: String) = do {

    // 方案1:从URL后缀识别(简单通用,无额外请求)

    var urlLower = lower(imageUrl) // Convert URL to lowercase

    var mimeType =

        if (urlLower endsWith “.png”) “image/png”

        else if (urlLower endsWith “.jpg”) “image/jpeg”

        else if (urlLower endsWith “.jpeg”) “image/jpeg”

        else if (urlLower endsWith “.webp”) “image/webp”

        else if (urlLower endsWith “.gif”) “image/gif”

        else “image/png” // Default to PNG if no match

    —

    mimeType

}

fun urlToBase64(imageUrl: String) = do {

    var bytes = readUrl(imageUrl, “application/octet-stream”)

    var base64 = Binaries::toBase64(bytes)

    var mimeType = getImageMimeType(imageUrl)

    —

    “data:” ++ mimeType ++ “;base64,” ++ base64

}

fun mappingMessages(messages) =

    messages map ((item) -> {

        role: item.role,

        content: item.content map ((contentItem) -> {

            `type`: if (contentItem.`type` == ‘image’)

                “image_url”

            else 

                contentItem.`type`,

            image_url: if (contentItem.image startsWith “http”)

                urlToBase64(contentItem.image)

            else 

                contentItem.image,

            text: contentItem.text

        })

    })

—        

{

        messages: mappingMessages(payload.messages),

        stream: payload.stream,

        temperature:0.6,

        max_tokens: payload.maxTokens,

        tools: payload.tools,

    model:”kimi-k2.5″

}

备注:我对接的时候,提示要求温度0.6,但 另一个同事对接的时候要求1.0 ,这个可以根据提示调整。

另外kimi更新了function call的调用规范要求,从functions: payload.functions改成了:tools: payload.tools,

%dw 2.0        

output application/json

fun mergeMessage(choices) = (

 choices reduce ((item, acc = “”) -> acc ++ item.message.content))

fun mergeStreamMessage(choices) = (

  choices reduce ((item, acc = “”) ->

    acc ++ (item.delta.content default “”)

  )

)

fun mappingUsage(usage) = (

  if(isEmpty(usage)) {

    promptTokens: 0,

    completionTokens: 1,

    totalTokens: 1

  } else {

    promptTokens: usage.prompt_tokens,

    completionTokens: usage.completion_tokens,

    totalTokens: usage.total_tokens

  }

)

fun mappingStreamUsage(choices) = do {

  var choice = choices[0]

  var usage = choice.usage

  —

  if(“stop” == choice.finish_reason)

    {

      promptTokens: usage.prompt_tokens,

      completionTokens: usage.completion_tokens,

      totalTokens: usage.total_tokens

    }

  else 

    {

      promptTokens: 0,

      completionTokens: 0,

      totalTokens: 0 

    }

}

fun mappingResult(payload) = (

  {

    created: payload.created,

          id: payload.id,

          isEnd: true,

          object: payload.object,

          message: mergeMessage(payload.choices),

    usage: mappingUsage(payload.usage)

  }

)

fun mappingStreamResult(payload) = (

  if (payload is Object)

   {

    created: payload.created,

          id: payload.id,

          isEnd: false,

          object: payload.object,

          message: mergeStreamMessage(payload.choices),

    usage: mappingStreamUsage(payload.choices)

  } else 

   {

    created: payload.created,

          id: payload.id,

          isEnd: true,

          message: “”,

          object: payload.object

    }

)

fun mappingDoneResult() = (

   {

          isEnd: true,

          message: “”

    }

)

— 

if (content == “[DONE]”)

    mappingDoneResult()

  else 

    if (payload.object == “chat.completion”)

      mappingResult(payload)

    else 

      mappingStreamResult(payload)

映射脚本是DW 2.0语法,DataWeave 2.0(DW 2.0)是 MuleSoft 专属的数据转换领域专用语法,核心用于不同系统间的数据映射、格式转换(如 JSON/XML/CSV 互转),语法设计上偏向函数式 + 声明式。 对这个语法豆包和元宝的排错能力有限,通常不能给出正确的建议。 如果有错误,建议用chatgpt排错。

配置后可成功测试:

问题二十二、AI平台对话助手应用上的偶发性问题

重点:此类问题都可以通过刷新页面解决。

有一次在对话助手,上传文件是碰到json 解析错误:

Hzero-aip-server服务的日志中可以看到错误信息:

2026-02-13T16:20:35.090+08:00 DEBUG 130241 — [hzero-aip] [  XNIO-1 task-3] o.h.s.i.mvc.InvokeDecryptionFilter       : Request cipher condition mismatch, receive POST “/v1/open/documents/personal”, headers={H-Invoke-Encryption: null}

2026-02-13T16:20:35.100+08:00 ERROR 130241 — [hzero-aip] [  XNIO-1 task-3] o.h.core.exception.BaseExceptionHandler  : Unknown runtime exception, Request: {URI=/v1/open/documents/personal}, User: CustomUserDetails{userId=2, username=admin, roleId=1, roleIds=[1, 2, 9], siteRoleIds=[1, 9], tenantRoleIds=[2], roleMergeFlag=false, secGrpIds=[], tenantId=0, tenantIds=[2, 0], organizationId=0, isAdmin=true, clientId=null, timeZone=’GMT+9, language=’zh_CN, roleLabels='[MODEL_PLATFORM_ADMIN, LOWCODE_PLATFORM_ADMIN], apiEncryptFlag=1}

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.lang.Long` from String “instance-monitor”: not a valid `java.lang.Long` value

at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:409) ~[spring-web-6.2.1.jar!/:6.2.1]

at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:357) ~[spring-web-6.2.1.jar!/:6.2.1]

at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:204) ~[spring-webmvc-6.2.1.jar!/:6.2.1]

at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:176) ~[spring-webmvc-6.2.1.jar!/:6.2.1]

然后我刷新也页面后这个错误就没有了。

刚开始以为是更换账户组合中的模型生效/失效引起的,但后来测试发现也未能重现这个问题。于是尝试重现问题:保持当前的AI对话助手窗口不刷新,更改多模态账户组合中的生效账户,然后再次上传图片,就会出现这种错误:

然后回到 对话助手界面,不刷新页面,直接上传文件,发现又是正常的,未能重现问题:

那上次碰到那个需要刷新页面的问题可能是session过期导致的?

但是我来回把两个模型生效/失效 切换多次,多试几次就能试出问题:

会出现模型XX不可用的错误:

这个时候,你刷新后再试就正常了:

总结:以后碰到此类莫名其妙的问题,现尝试刷新页面解决。

问题二十三、Agent编排:应用导航编辑保存出错问题

系统内置的Agent编排:应用导航编辑保存出错,界面上提示:请联系管理员,报错信息明细中提示:Expected one result (or null) to be returned by selectOne(), but found: 2″

打开HZERO-AIP服务(aip-server)的服务日志,看到报错也是期望获得单条数据的地方实际返回超过一条。没有debug模式的情况下,日志没有显示具体的SQL语句。

在hzero-aipserer-docker的容器配置docker-compose.yml中设置环境变量,- LOG_LEVEL=debug 启用debug模式,在重启该容器:

## 要求Docker/Docker CE >= 19.x

services:

  hzero-aip-server:

    image: hzero-aip-server-jk-demo:1.12

    container_name: hzero-aip-server

    ports:

      – “8270:8270”

      – “8271:8271”

    environment:

      – JAVA_OPTS=-Xms128m -Xmx2000m -Dspring.profiles.active=dev

      – AGENT=-javaagent:/license-agent112a.jar

      – LOG_LEVEL=debug

    deploy:  # 限制容器总内存(Docker Compose v2.3+)

      resources:

        limits:

          memory: 3000m  # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)

networks:

  default:

    name: hzero-demo

external: true

然后再次执行,看日志:

把SQL语句和参数替换后再执行,返回结果有两条:

看SQL语句和实际数据,问题原因是这个Agent编排的历史版本的激活标志应该为0,但不知为何实际数据是1,所有要修复数据,改成0

修改后在界面上再次保存就不会报错,正常了。

另一个问题是,运行 企业应用导航的时候,可能会遇到提示“应用[企业应用导航]未分配编排或没有编排执行权限,请联系管理员”

解决这个问题可以在Agent编排的编辑处,权限管理从白名单改成黑名单即可:

然后运行这个应用的时候,可能没有效果:

这个原因可能是 企业应用导航这个Agent编排用到的菜单列表字典的向量化不正常:

图中的问题是 因为种子数据导入的时候,向量库集合 这个字段本应留空,然后部署后重新同步向量,让系统重新生成这个集合的。但实际上没有留空,导致系统以为向量库已经存在这个集合,但实际不存在,从而导致向量同步错误。

解决方案是,从后台数据库做datafix,把这个字段删除,重新同步:

然会回到界面:再次重新同步还是失败:

错误信息是:


2026-03-05T14:55:48.737+08:00 ERROR 8996 — [hzero-aip] [    dict-pool-7] .a.d.s.q.DictionaryScheduledSynchronizer : sync dictionary error

org.hzero.core.exception.ValidateFailureException: [collectionName must not be blank; ]
        at org.hzero.core.base.DefaultValidationResultProcessor.process(DefaultValidationResultProcessor.java:43) ~[hzero-starter-core-1.12.1.RELEASE.jar!/:1.12.1.RELEASE]
        at org.hzero.core.util.ValidUtils.valid(ValidUtils.java:59) ~[hzero-starter-core-1.12.1.RELEASE.jar!/:1.12.1.RELEASE]
        at org.hzero.core.base.BaseAppService.validObject(BaseAppService.java:35) ~[hzero-starter-core-1.12.1.RELEASE.jar!/:1.12.1.RELEASE]
        at org.hzero.aip.app.service.impl.VectorCollectionServiceImpl.create(VectorCollectionServiceImpl.java:95) ~[hzero-aip-server-1.6.1.ALPHA.6.13.jar!/:1.6.1.ALPHA.6.13]


解决方案:

把原来那个字典删除掉(删除之前先把字典值导出),然后重新新建一个词典,词典名称和词典编码(HAIP.APPLICATION_LINK)跟原来保持一致,新建之后再把词典值导入进来,执行导入的动作会自动同步向量,这次向量同步成功了。

看向量库集合,里面也确实有了,是自动新增的:

再次执行应用导航,成功了:

问题二十四、Agent编排:简易智能体 AutoAgent运行报错:

错误信息:

java.lang.ClassCastException: org.hzero.aip.model.domain.vo.response.content.FailureResp incompatible with org.hzero.aip.model.domain.vo.response.content.chat.ChatCommonResp
        at org.hzero.aip.model.infra.helper.SyncResponseHelper.apply(SyncResponseHelper.java:98)

Hzero-aip-app服务中的错误信息:

2026-03-05 11:31:18.231 | org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request on POST request for “https://ark.cn-beijing.volces.com/api/v3/chat/completions”: “{“error”:{“code”:”InvalidParameter”,”message”:”‘messages’ must contain the word ‘json’ in some form, to use ‘response_format’ of type ‘json_object’. Request id: 021772681472981c54cfbc8e773a7e1d131d5b1cad603e0f69745″,”param”:””,”type”:”BadRequest”}}”

产研说这个问题在 hzero-aip-app  1.6.1.ALPHA.7.1 中解决了,我现在的版本是hzero-aip-app  1.6.1.ALPHA.6.13, 执行升级,再测:OK了:

问题二十五、低代码平台在删除页面后再 删除业务对象失败

删除业务对象时报错:”exception”: “Not found [PAGE_STRUCTURE], [B0] PivotProvider

Modeler服务后台错误是:io.choerodon.core.exception.ext.IllegalArgumentException: Not found [PAGE_STRUCTURE], [BO] PivotProvider.

at org.hzero.boot.modeler.pivot.PivotProviderManager.getPivotProvider(PivotProviderManager.java:269) ~[hzero-boot-modeler-client-2.10.2-1.12.BETA.4.jar!/:2.10.2-1.12.BETA.4]

产研说是部署问题,删除一下 redis db1 下的 apaas:pivot:provider 这个key,然后重启一下 modeler 和 lowcode 应该就好了。

重启服务之后,再试依然报错:

服务中错误信息:io.choerodon.core.exception.ext.IllegalArgumentException: Not found [PAGE_STRUCTURE], [BO] PivotProvider.

看redis中的键值,只有7个,比正常的10个少了3个;

第二天所有服务重启之后,键值恢复到10个:但是_US和_CN中还是只有7个;

测试删除业务对象还是报同样错误。

不过 ,我发现非Docker环境是可以正常删除业务对象的,而非docker环境的redis中的键值比Docker环境中多,看起来是Docker环境的Redis中键值有缺失。

另外产业看到我的Docker环境中lowcode服务的版本 还是 2.10.0-1.12.RELEASE版本的,我比较了下非Docker环境版本是2.10.2-1.12.BETA.2的,modeler服务的版本是2.10.2-1.12.BETA.4,所以docker环境的版本要升级下。

执行:升级Docker环境的lowcode服务到2.10.2-1.12.BETA.4, 再次测试,可以正常删除业务对象了。 redis中 _CN 和 _US中键值的数量也不缺了。

问题解决。

HZERO PaaS平台-Docker版 -更新日志

==============

2026/03/09
仅针对在2026/03/09 之前下载的朋友需替换文件(根据CPU类型选择):
1、镜像文件更新:
./2026-03-09/x86/hzero-docker-images/hzero-aipserver-docker.tar、hzero-aipapp-docker.tar、hzero-modeler-docker.tar、hzero-lowcode-docker.tar
./2026-03-09/arm64/hzero-docker-images-arm64/hzero-aipserver-docker.tar、hzero-aipapp-docker.tar、hzero-modeler-docker.tar、hzero-lowcode-docker.tar
2、数据文件更新:
./2026-03-09/x86/hzero-dockers.tar.gz
./2026-03-09/arm64/hzero-dockers-arm64.tar.gz
3、具体更新内容:
3.1 字段长度更改:
hdoc_document.document_name, hdoc_document_tl.document_name ,hdoc_document_version.version_name,hdoc_document_version_tl.version_name 这四个字段长度都从120改成240,目的是解决AI生成低代码功能中上传设计草稿图的文件名长度不够的问题(图片上传后,会转存文档,文档名会加上会话ID导致原长度不够)
3.2 更新hzeor-lowcode 和 hzero-modeler 服务升级到 2.10.2-1.12.BETA.4 ,解决AI生成低代码时,业务对象选择修改模式时报错 field_type错误的问题。
3.3 Agent编排导入更新:AI生成低代码业务对象和页面 ,更新到34版,去掉了生成领域内原有业务对象的Json上下文节点,解决上下文Prompt太长的问题。 去掉了参数收集节点中字段类型关联关系类型和引用类型的字段类型,解决大模型有时候会自动提取字段为此类类型,但又没有提前生成相应的被引用到的业务对象的问题。保障程序运行的稳定性。
3.4 更改Redis配置,持久化频率从5分钟一次更改为1小时一次。
3.5 升级hzero-aip-app服务到 1.6.1.ALPHA.7.1,解决简易智能体编排中autoagent节点执行错误问题。
3.6 删除默认导航词典,重建默认导航词典和对应的向量库集合,解决导航不起作用的问题。

==============

2026/02/11
仅针对在2026/02/11之前下载的朋友需替换文件(根据CPU类型选择):
1、镜像文件更新:
./2026-02-11/x86/hzero-docker-images/hzero-aipserver-docker.tar、hzero-aipapp-docker.tar、hzero-gateway-docker.tar
./2026-02-11/arm64/hzero-docker-images-arm64/hzero-aipserver-docker.tar、hzero-aipapp-docker.tar、hzero-gateway-docker.tar
2、数据文件更新:
./2026-02-11/x86/hzero-dockers.tar.gz
./2026-02-11/arm64/hzero-dockers-arm64.tar.gz
3、具体更新内容(主要是跑通Agent:AI生成业务对象和页面):
3.1、hzero-aip-server 和hzero-aip-app 都升级到1.6.1.ALPHA.6.13
3.2、hzero-aip-app 的启动类注释掉@EnableWebFlux 注解,application.yml更改配置:支持100M的payload
3.3、在hzero-gateway的application.yml中调整timeout配置,原来是2秒,调整到20秒依然有问题,调整到200秒就没问题了。
3.4、新建自定义账户,模型类型=对话-vllm, 账户编码=JACK-TALK-DOUBAO-SEED-1.8-3, 账户名称=Jack对话-豆包-seed-1.8-3,Model=doubao-seed-1-8-251228
开放API地址=https://ark.cn-beijing.volces.com/api/v3/chat/completions
支持多模态=Y,支持非流式=Y,支持json_object=Y ,是否支持函数调用=Y,图片传输方式:BASE64,最大上下文token数=80000,最大响应token数=8000
认证类型=自定义健值认证,健值位置=请求头参数,健=Authorization,自定义的配置=Bearer+空格+火山引擎大模型APIKey
默认参数:KV模式,参数名称=thinking,参数值={“type”:”disabled”}
3.5、把账户Jack对话-豆包-seed-1.8-3 添加到账户组合:Jack-talk-multmodel (组合名称:Jack对话-多模态)
3.6、把Jack-talk-multmodel配置给Agent编排中分类为飞搭的三个编排。
3.7、AI平台全局配置的切片配置处,图片识别模型配置为这个多模态模型(这里不配置会让HKMS服务报错)
3.8、hzero-file文件服务的max内存调整到800M

==============

2026/01/30
仅针对在2026/01/30之前下载的朋友需替换文件(根据CPU类型选择):
1、镜像文件更新:
./2026-01-30/x86/hzero-docker-images/hzero-workflow-docker.tar
./2026-01-30/arm64/hzero-docker-images-arm64/hzero-workflow-docker.tar
2、数据文件更新:
./2026-01-30/x86/hzero-dockers.tar.gz
./2026-01-30/arm64/hzero-dockers-arm64.tar.gz
3、具体更新内容:
3.1 增加账户大模型组合:AZUREGPT4O2 ,这个是AI生成低代码业务对象的Agent编排中要试用的账户组合,在这个账户组合中添加账户:jack对话-DeepSeek-V3 这是火山方舟上的deepseek-V3
3.2 给低代码AI编排用到的大模型账户组合LOWCODE.AIGC 添加具体的账户jack对话-DeepSeek-V3
3.3 AIGC中台-全局选项配置-权限管理 ,启用维护权限控制都关掉。目的:默认让种子数据中已经存在的AI生成低代码业务对象的编排都在编排定义界面显示出来。
3.4 Agent安排界面导入 Trail环境导出的AI生成飞搭低代码业务对象和界面相关的三个编排,目的:解决这三个Agent编排,再打开编辑时显示画布数据加载错误的问题。导入后三个编排执行重新发布,修改一个节点名称-保存-再改回来-保存 刷新缓存。
3.5 AIGC中台/企业应用库/低代码AI助手 – 业务对象 执行动作取消发布,然后再保存发布。目的:更新缓存,解决低代码工作台通过应用连接-全屏连接 调用该应用的时候报“应用[LOWCODE.GENERATOR_BUSINESS_OBJECT]未发布或者没有访问权限,请联系管理员”这个错误的问题。
3.6 启用redis持久化,解决Redis重启后因缓存丢失导致的Agent应用白屏问题以及时不时出现的504 GATEWAY_TIMEOUT “Response took longer than timeout: PT20S”
3.7 前端新增 hzero-front-haip-card@1.6.1-alpha.2.7 , 升级到hzero-front-haip@1.6.1-alpha.6。目的:AIGC平台新增卡片配置菜单,解决AI生成低代码业务对象和界面Agent编排用到的卡片编辑问题,这个卡片问题会导致测试编排时白屏。后续继续升级到”hzero-front-haip”: “1.6.1-alpha.6.1″ 和”hzero-front-haip-card”:”1.6.1-alpha.3″ 解决卡片显示不能解析HTML的问题。
3.8 导入trail环境的AI生成低代码业务对象和界面Agent编排用到的卡片,原来的卡片信息有缺失,导致测试编排时白屏(卡片节点输出Json有截断),导入正确的卡片可解决此问题。
3.9 升级workflow 前后端到hzero-workflow@1.20.1-1.12.RELEASE 和hzero-front-hwkf@1.20.2-beta.1,hzero-front-hwkf-mobile@1.20.1-beta.8 解决工作流模拟运行的时区问题。

===============
2026/01/19
仅针对在2026/01/19之前下载的朋友需替换文件(根据CPU类型选择):
1、镜像文件更新:无
2、数据文件更新:
./2026-01-19/x86/hzero-dockers.tar.gz
./2026-01-19/arm64/hzero-dockers-arm64.tar.gz
3、具体更新内容:
3.1、执行了update hzero_platform.iam_role set is_enabled=1 where id =5;解决新建租户失败的问题。

3.2、redis-docker目录下的docker-compose.yml增加配置:command: redis-server –save “” –appendonly no ; 目的是去掉了持久化,解决低资源环境下某些服务的日志中出现的redis 操作有时会的timeout问题。

==============

2026/01/12
仅针对在2026/01/12之前下载的朋友需替换文件(根据CPU类型选择)
1、镜像文件更新:
./2026-01-12./x86/hzero-docker-images/hzero-orchestration-docker.tar
./2026-01-12./arm64/hzero-docker-images-arm64/hzero-orchestration-docker.tar
2、数据文件更新:
./2026-01-12./x86/hzero-dockers/hzero-orchestration/docker-compose.yml
./2026-01-12./arm64/hzero-dockers/hzero-orchestration/docker-compose.yml
3、具体跟新内容:
3.1 升级编排服务从1.8.1.RELEASE 到1.8.2.RELEASE ,解决编排服务导入报错的问题。

3.2 因为hzero-orchestration1.8.2.RELEASE 用的license-agent版本跟1.8.1.RELEASE不一样,所以这个docker-compose.yml文件要替换一下。

==============

2026/01/10
仅针对在2026/01/10之前下载的朋友需替换文件(根据CPU类型选择)
1、镜像文件更新:
./2026-01-10/x86/hzero-docker-images/hzero-report-docker.tar
./2026-01-10/x86/hzero-docker-images/hzero-oauth-docker.tar
./2026-01-10/arm64/hzero-docker-images-arm64/hzero-report-docker.tar
./2026-01-10/arm64/hzero-docker-images-arm64/hzero-oauth-docker.tar
2、数据文件更新:无
3、具体更新内容:
1.1 添加字体渲染引擎 libfreetype6 更正因为hzero-report 中ureport 因为缺少freetype6字体渲染引擎而导致的加载Libfontnanager-so失败,从而导致服务启动失败的问题。
1.2 添加字体文件 fonts-dejavu-core fonts-dejavu-extra, hzero-oauth服务的验证码需要这两个字体文件,默认系统设置为不需要验证码,没有这两个文件也没问题,但是如果在系统设置中启用验证码就需要了。

HZERO PaaS平台-Docker版demo笔记(二)Docker版测试 问题16-20

问题十六、集成平台服务编排导入问题

在低代码POC演示租户导入集成平台服务编排的定义,界面显示导入校验成功&导入完成。

关闭后界面并未显示数据,查数据库:显示导入错误:普通租户用户只能操作本租户的数据,请检查数据所属租户。

打开导入的zip文件,看其中的租户编码:

先维护租户映射:

导入后,在导入历史中显示上传完成。

但在定义出还是看不到流程定义内容:

切换到平台租户,再次进行导入

先维护租户编码映射:

上传压缩文件,导入后点击“数据映射”

基础映射和资源映射都是空的:

看导入历史:服务注册和编排定义都是空的:

再切到低代码POC演示租户看编排定义也还是空的

查hzero-orchestration 服务日志,错误信息:

2026-01-18 04:13:44.747 ERROR 1 — [  XNIO-1 task-5] o.j.o.s.a.s.i.ImportZipDataServiceImpl   : MCP Get Data Mapping Has Error

feign.codec.DecodeException: Error while extracting response for type [java.util.List<org.jipaas.orchestration.service.app.dto.ImportMappingDTO>] and content type [application/json;charset=UTF-8]

at feign.InvocationContext.decode(InvocationContext.java:125)

……

Caused by: org.springframework.web.client.RestClientException: Error while extracting response for type [java.util.List<org.jipaas.orchestration.service.app.dto.ImportMappingDTO>] and content type [application/json;charset=UTF-8]

at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:127)

……

Caused by: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.util.ArrayList<org.jipaas.orchestration.service.app.dto.ImportMappingDTO>` from Object value (token `JsonToken.START_OBJECT`)

……

Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.ArrayList<org.jipaas.orchestration.service.app.dto.ImportMappingDTO>` from Object value (token `JsonToken.START_OBJECT`)

 at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 1]

元宝分析:

这个错误的关键在于客户端预期的数据结构与服务端实际返回的数据结构不一致。最稳妥的办法是首先确定服务端返回的确切JSON格式,然后相应地调整客户端的接收类型,是直接使用对象、使用包装类,还是需要自定义解析逻辑。

这个得找产研解决了。

后来跟王凡沟通了下,他说是在相同租户下,不是通过数据迁移导入,而是在服务编排定义界面导入:

先在平台租户,以平台管理员角色登录系统
在 工作台菜单/系统管理/租户管理/租户维护 ,创建一个相同的租户:HAND-DEV

然后切换到平台租户,租户管理员角色,

在 工作台菜单/系统管理/角色管理,创建新建的HAND-DEV租户的租户管理员角色,把菜单权限都分配给这个角色,并分配用户admin到这个角色;

然后再切换到新建的HAND-DEV租户,以租户管理员角色

进入菜单 服务编排/服务编排定义,右上角导入,导入完成后可以看到导入的服务编排:

问题十七、集成平台服务编排编辑流程报错

菜单 服务编排/服务编排定义,导入的16个服务编排流程中,有4个点[编辑]报错: 比如:

后台服务报错信息:
2026-01-18 07:24:48.173 ERROR 1 — [  XNIO-1 task-2] o.h.core.exception.BaseExceptionHandler  : Unknown exception, Request: {URI=/v1/10/orch-definitions/=a2j0_i3_rTyvt0UxFM3Os-6o6vIQP2NfwyxjNyxF_Pw==}, User: CustomUserDetails{userId=2, username=admin, roleId=13, roleIds=[13], siteRoleIds=[], tenantRoleIds=[13], roleMergeFlag=false, secGrpIds=[], tenantId=10, tenantIds=[0, 10, 2], organizationId=0, isAdmin=true, clientId=null, timeZone=’GMT+8, language=’zh_CN, roleLabels='[], apiEncryptFlag=1}

java.lang.NullPointerException: Cannot invoke “com.fasterxml.jackson.databind.JsonNode.asText()” because the return value of “com.fasterxml.jackson.databind.JsonNode.get(java.lang.String)” is null

这个得找产研解决了。

问题十八、低代码平台AI生成页面问题

目前这个AI生成页面的功能,只在平台层开放。

进入平台租户,切换到低代码开放平台的工作台

点这个按钮,如果系统中缺少专门为低代码开发的Agent编排,则会报错:

在 平台菜单/AIGC中台/应用中心/企业应用库

打开低代码助手这个应用,可以看到里面用的Agent编排:

然后去Agent编排定义的地方看是缺少了【生成低代码业务对象和页面】这样的编排。

去trail环境,导出编排,然后在导入的时候报错:

提示是账户组合不存在,AZUREGPT4O2, 那我们先建立个账户组合:

建立账户组合之后再次导入:

这次导入成功了,但还是看不到,问了产研说是全局配置的地方,要把权限控制关掉,或者把当前角色加进去,简单起见,我们就先关掉。

然后再回到编排界面,就能看到了:

导入后都需要重新发布一下。

关乎编排用到的账户组合,我们在数据库中可以看到:

但是,在界面上没有明显的地方能看到 编排用的账户组合设置。有的时候前端报错,后台发服务只是提示模型请求失败,但没有明确的提示说那个模型账户请求失败,在监控的地方也找不到这这错误提示,需要自己清楚编排用到了哪些账户组合,去检查这些账户组合的模型的APIKey是否都已经配置好,并测试OK。 后来问AI平台的产研,了解到这个配置在编辑的时候是隐藏在三个小单点里面:

这个编排流程还是有点复杂的:

配置这个编排的权限,把平台管理员加上:

然后回到企业应用库,选择低代码AI助手 – 业务对象

执行报错:

看aip-app服务日志:Caused by: org.hzero.aip.model.domain.exception.ModelRuntimeException: haip.error.model_request.failure

打开低代码AI助手应用,会一闪而过:

测试这个编排的时候界面也是一闪而过, 后台日志看不出啥错误,前端有错误,好像是json解析出错了:

看下服务器有无最新修订版:后端服务hzero-aip当前版本是1.6.1.ALPHA.4,制品库hzero-release目录下最新修订版是1.6.1.ALPHA.6.2 ,hzero-aip-app最新版本是1.6.1.ALPHA.6.3

前端当前版本是:1.6.1-alpha.4,制品库hzero-ui 目录下最新修订版是hzero-front-haip-1.6.1-alpha.6.tgz 也得升;

那就升级

后端hzero-aip 和hzero-aip-app两个服务的pom版本改到1.6.1.ALPHA.6.2 和 1.6.1.ALPHA.6.3

升级完毕,都成功了,重启服务

测试:升级后,AIGC生成低代码对象和页面的 Agent编排流程测试还是一闪而过了

在应用库打开 低代码AI助手 时依然白屏,问题依旧。

跟产研前端组沟通了下,检查了实际情况,发现前端还是1.6.1-alpha.4,没有成功升级到1.6.1-alpha.6,另外说要在package.json中加一条:hzero-front-haip-card

    “hzero-front-haip”: “1.6.1-alpha.6”,

    “hzero-front-haip-card”:”1.6.1-alpha.2.7″,

为啥上次没升成功呢? 想起来了,上级升级后忘记执行 apply_update_to_runtime_env.sh 部署了。

再次升级前端,这次主要就是把卡片加上。

$ yarn

$ yarn run build:ms hzero-front-haip-card

Done in 370.76s.

完成后执行部署:

$ bash apply_update_to_runtime_env.sh

再次测试,发现还是白屏,产研前端说看下WS的返回:

然后说,就是那个卡片问题 ,然后问后端是否升级到了最新版:

hzero-aip-server 1.6.1.ALPHA.6.4

hzero-aip-app 1.6.1.ALPHA.6.3

hzero-front-haip hzero-front-haip@1.6.1-alpha.6

我看了下我的后端,没有到这个版本,只是1.6.1.ALPHA.6.2

继续升级后端到产研前端同时说的版本,再测试:结果:

hzero-aip-server 启动失败了,out of memory了,

JVMDUMP010I Snap dump written to /d02/hzero-aipaas/project/ps-aip-server/target/Snap.20260126.123409.50072.0004.trc

JVMDUMP013I Processed dump event “systhrow”, detail “java/lang/OutOfMemoryError”.

这个服务内存分配了2G的,之前没有out 过,先不管,重新启动,重启成功。但是一会儿又出现out of memory了,把内存调整到2.5G,再重启:这次OK了,但是测试还是白屏.

而且发现 :hzero-aip-server 1.6.1.ALPHA.6.X 不稳定,有内存溢出问题   恢复到 1.6.1.ALPHA.4了。

低代码产研组有次解决了其他人碰到的类似问题,说是把卡片前端升级到 hzero-front-haip-card@1.7.0-alpha.1 可以解决,试一下:

修改package.json后

$yarn

Done in 17.94s

$yarn run build:ms hzero-front-haip-card

结果报了一堆错:

ERROR in ./node_modules/hzero-front-hlod/lib/routes/NewRenderEngine/RenderContainerComponents/RenderSteps/RenderSteps.js 16:0-27

Module not found: Error: Package path ./v4 is not exported from package /d02/hzero/front/front/node_modules/hzero-front-haip-card/node_modules/uuid (see exports field in /d02/hzero/front/front/node_modules/hzero-front-haip-card/node_modules/uuid/package.json)

前端组说需要回滚:

那还是在 package.json中改回:

“hzero-front-haip-card”:”1.6.1-alpha.2.7″,

然后再yarn ,yarn run build:ms

yarn run build:ms hzero-front-haip,hzero-front-haip-card

Done in 617.23s.

然后说我这个跟其他人工单问题不一样,1.6.1的后端服务对应的卡片就是1.6.1 对应的 就是 1.6.1-alpha.2.7,不能用那个1.7.0-alpha.1的,至于卡片出不来 可能需要试试编排对应关联的卡片 在卡片管理那是不是能预览, 对不对。

看监控:

把卡片输出的json发给产研前端看,认为有问题,输出内容有截断。

这个卡片有问题:

保存重新发布后,编排测试就不会白屏了:

Trail环境这个卡片是完整的,于是把低代码相关的8个卡片从trial环境导出,再导入。导入后内容是有了,不过显示有问题:

这个显示问题在trail环境没有问题,跟产研前端沟通了下,说是卡片依赖了飞搭的前端,要添加下依赖,发了个新版本hzero-front-haip-card@1.6.1-alpha.2.8,接下来把前端卡片升级到这个版本再看看:package.json 中卡片改到这个版本

$yarn

Done in 31.68s.

$yarn run build:ms hzero-front-haip-card

结果报错了,一堆错误指向依赖hzero-front-hlod相关的内容缺失,看起来是渲染卡片的飞搭前端程序依赖新版的飞搭前端了。

前端产研说先回滚,让飞搭前端团队验证了以后再说。

回滚:

那还是在 package.json中改回:

“hzero-front-haip-card”:”1.6.1-alpha.2.7″,

然后再yarn ,yarn run build:ms

yarn run build:ms hzero-front-haip,hzero-front-haip-card

Done in 593.84s.

回滚成功;

第二天前端产研说发了一个新的修订版,让试一下:

    “hzero-front-haip”: “1.6.1-alpha.6.1”,

    “hzero-front-haip-card”:”1.6.1-alpha.3″,

修改package.json后

$yarn

Done in 70.77s.

yarn run build:ms hzero-front-haip,hzero-front-haip-card

Done in 625.03s.

这次编译成功了。

完成后执行部署:

$ bash apply_update_to_runtime_env.sh

然后启动服务测试:

测试结果:卡片预览显示正常了,问题解决。

拷贝到Docker环境:

$ cp -r  -Force \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\hzero\front\dist   \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\volumes\nginx\

另外关于后端服务 ,产研组说1.6最新的修订版是hzero-aip-server 1.6.1.ALPHA.6.5,hzero-aip-app 1.6.1.ALPHA.6.4

先尝试下hzero-aip-server 1.6.1.ALPHA.6.5 ,看看还有没有内存溢出问题,有的话,把log发给姜洲。

实际测试下来,也是有内存问题的,log已经发给姜洲。

还是回滚到1.6.1.ALPHA.4

后来在docker环境发现,低代码AI助手编排测试正常后,去看低代码AI助手的应用,点全屏连接的时候依然白屏,但这个问题在非docker环境是不存在的,判断不是程序问题。后来尝试换卡片也不行,去掉该应用的一个Agent编排也不行,就判断应用本身有问题,于是新建一个一模一样的应用,发现就么有问题。所以后来就取消发布,记住该应用的编码,然后删除该应用,重新建一个相同的应用,编码也用原来的。 问题就解决了。在低代码里面调用也正常。

继续测试: 接下来把编排的模型换成豆包seed 1.8多模态模型,测试图片识别生成:

#从低代码工作台,调研问卷领域进入,进入AI生成页面:

开始新会话,然后上传手绘采购订单图片,发现流程报错:

进入Agent监控,打开执行流程日志:

有报错信息:

Caused by: org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request on POST request for “https://ark.cn-beijing.volces.com/api/v3/chat/completions”: “{“error”:{“code”:”InvalidParameter”,”message”:”schema must be provided. Request id: 021770360514613b1540e0519088842060f281dec849b042fa5ea”,”param”:””,”type”:”BadRequest”}}”

后台服务aip-app服务日志,显示是:2026-02-06T14:48:39.414+08:00  WARN 63182 — [hzero-aip-app] [       model-38] o.h.a.m.d.s.GradientIntervalStrategy     : CHAT@HAIP.DOUBAO_CHAT_COPY is silenced, release time is: 2026-02-06T14:50:34.956188440

说是模型账号被silenced了。

产研建议升级到:

hzero-aip-server        1.6.1.ALPHA.6.12
hzero-aip-app        1.6.1.ALPHA.6.10

新的版本已经默认关闭这个静默了。

hzero-aip-server 升级到1.6.1.ALPHA.6.12依然有内存溢出问题,回退到1.6.1.ALPHA.4;

过了一小时,产研给了最新修复版:1.6.1.ALPHA.6.12.1 经测试这个版本的内存溢出问题解决了。

hzero-aip-app 升级到1.6.1.ALPHA.6.10 没有问题,可以用,继续功能测试,发现在原来那个Agent编排的节点依然卡住,不过这次aip-app服务后台的报错信息不一样了:

Caused by: java.lang.NullPointerException: Cannot invoke “java.lang.String.hashCode()” because “<local2>” is null

at org.hzero.aip.model.domain.vo.Parameter.toJsonSchema(Parameter.java:36) ~[hzero-aip-common-1.6.1.ALPHA.6.8.jar!/:1.6.1.ALPHA.6.8]

at java.base/java.util.Optional.map(Optional.java:260) ~[na:na]

这个问题的原因是:模型不支持json schema,需要在模型对接配置的地方关掉这个选项,但检查模型对接发现默认是关闭的,也没有开:

产研在检查是否代码实现逻辑跟配置没有同步。

过了一会,产研修复了问题,升级到:

hzero-aip-server        1.6.1.ALPHA.6.13
hzero-aip-app        1.6.1.ALPHA.6.12

升级后再测试,发现那个节点还是没有能过去。

Hzero-aip-app服务的日志,显示错误:

com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [simple type, class org.hzero.aip.common.jsonschema.JsonSchema]: missing type id property ‘type’ (for POJO property ‘properties’)

 at [Source: REDACTED (`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION` disabled); line: 1, column: 155] (through reference chain: org.hzero.aip.common.jsonschema.ObjectSchema[“properties”]->java.util.LinkedHashMap[“platform”])

at com.fasterxml.jackson.databind.exc.InvalidTypeIdException.from(InvalidTypeIdException.java:43) ~[jackson-databind-2.18.1.jar!/:2.18.1]

产研说查下本地maven库,是不是没拉到最新的:

本地maven库最新的版本信息如下:看起来是最新的:

\root\.m2\repository\org\hzero\hzero-aip-server\1.6.1.ALPHA.6.13

\root\.m2\repository\org\hzero\hzero-aip-app\1.6.1.ALPHA.6.12

不过产研说\hzero-aip-app\1.6.1.ALPHA.6.12 这个覆盖过,要在本地库删除掉,重新拉。

删除重新拉后再运行测试:还是同样错误,产研让升级到1.6.1.ALPHA.6.13 试试。

升级到6.13还是错误,设置为debug模式,打详细日志给产研,产研具体分析日志后暂时看不出问题,尝试用自定义模式新建了豆包1.8 seed多模态的账户:

单测这个账户OK,然后添加到现有组合。继续测试,这次又往下走了几步:

2026-02-11T05:31:21.973Z ERROR 1 — [hzero-aip-app] [async-execute-3] o.h.a.a.f.s.impl.FlowExecuteServiceImpl : [Flow Executor] [0bb282fed69c4bae8f6a5a1b9ca74012] Failed on node AIGC 生成低代码业务对象和页面/LOWCODE.BUSINESS_OBJECT_PAGE/CHAT_2025031411431417419237947530: class org.hzero.aip.agent.flow.execute.executor.impl.chat.ChatNodeHandler

feign.RetryableException: Read timed out executing POST http://hzero-file/v1/0/files/byte?bucketName=haip&directory=interaction&fileName=06dded21e9414302b4d4a59a220042b5%40%E6%89%8B%E7%BB%98%E9%87%87%E8%B4%AD%E8%AE%A2%E5%8D%95.jpg⁠

at feign.FeignException.errorExecuting(FeignException.java:300) ~[feign-core-13.5.jar!/:na]

at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:132) ~[hzero-starter-feign-replay-1.12.0.RELEASE.jar!/:na]

这次错误是:feign调用hzero-file服务读取文件是time out了,重启hzero-file服务再试:

有问题,看文件管理界面汇总查询也在打圈圈,看起来是minio服务出问题了,重启minio服务,重启后文件服务正常了,再测试编排流程:结果还是文件服务read timeOut了,查文件服务的日志,out of Memory了:
2026-02-09T20:10:34.012+08:00 ERROR 108664 — [hzero-file] [   XNIO-1 I/O-4] org.xnio.listener                        : XNIO001007: A channel event listener threw an exception

java.lang.OutOfMemoryError: Java heap space

at java.base/java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:332) ~[na:na]

at io.undertow.server.DefaultByteBufferPool.allocate(DefaultByteBufferPool.java:149) ~[undertow-core-2.3.18.Final.jar!/:2.3.18.Final]

at io.undertow.server.protocol.http.HttpReadListener.handleEventWithNoRunningRequest(HttpReadListener.java:149) ~[undertow-core-2.3.18.Final.jar!/:2.3.18.Final]

at io.undertow.server.protocol.http.HttpReadListener.handleEvent(HttpReadListener.java:136) ~[undertow-core-2.3.18.Final.jar!/:2.3.18.Final]

想来大概是我不断重试文件操作,把内存给用爆了。加大内存重启HZERO-file服务,这次文件read timeout的问题没有了,但是这个节点还是过不去,问题出在aip-app服务,不过这个服务日志看不出问题:
io.choerodon.core.exception.CommonException: 程序出现错误,请联系管理员

at org.hzero.core.util.ResponseUtils.lambda$static$1(ResponseUtils.java:54) ~[hzero-starter-core-1.12.1.RELEASE.jar!/:1.12.1.RELEASE]

继续看aip-server日志:发现是文档的文件太长了:

### SQL: INSERT INTO hdoc_document (creation_date, created_by, last_update_date, last_updated_by, object_version_number, document_uuid, document_name, public_flag, tenant_id, delete_flag) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)

### Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Data too long for column ‘document_name’ at row 1

; Data truncation: Data too long for column ‘document_name’ at row 1

at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:118) ~[spring-jdbc-6.2.1.jar!/:6.2.1]

at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107) ~[spring-jdbc-6.2.1.jar!/:6.2.1]

at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:116) ~[spring-jdbc-6.2.1.jar!/:6.2.1]

看起来这个varchar2(120)长度不够用?把字段长度改成240,再测试:还是错误,重启aip-server服务,再测试:还是同样错误,看起来不是改字段长度能解决的,那就改测试数据,把图片文件名7f96cbebc8d64775a9b7143af26b1493@手绘采购订单.jpg 改短:手绘采购订单.jpg 再测试:这次这个节点终于过去了。

备注: 在后来的测试中,发现改字段长度可以解决这个问题,但是,单纯改hdoc_document的document_name字段这一个地方不够,还需要修改hdoc_document_tl 表的 document_name ,hdoc_document_version表的 version_name
hdoc_document_version_tl表的  version_name 这四张表的字段长度都要改成240,就可以解决文档名长度不够的错误

这个图片识别的节点,还可能会出现错误:Read timed out executing POST http://hzero-file/v1/0/files/byte?bucketName=haip&directory=interaction&fileName=06dded21e9414302b4d4a59a220042b5%40%E6%89%8B%E7%BB%98%E9%87%87%E8%B4%AD%E8%AE%A2%E5%8D%95.jpg⁠

初看以为是hzero-file服务的错误,但原来这个节点对模型为空,配置这个节点对话模型为多模态模型后,这个read time Out问题就过去了,因为确实在hzero-file服务日志中也没有其他错误。但hzero-aip服务的日志中提示这个read time Out的错误具备误导性。

新的错误出现在这个节点:

这个错误是aip-app的日志,
io.choerodon.core.exception.CommonException: 程序出现错误,请联系管理员

at org.hzero.core.util.ResponseUtils.lambda$static$1(ResponseUtils.java:54) ~[hzero-starter-core-1.12.1.RELEASE.jar!/:1.12.1.RELEASE]

at org.hzero.core.util.ResponseUtils.getResponse(ResponseUtils.java:230) ~[hzero-starter-core-1.12.1.RELEASE.jar!/:1.12.1.RELEASE]

at org.hzero.core.util.ResponseUtils.getResponse(ResponseUtils.java:86) ~[hzero-starter-core-1.12.1.RELEASE.jar!/:1.12.1.RELEASE]

at org.hzero.aip.agent.flow.execute.executor.impl.chat.ChatNodeHandler.createPersonalDocuments(ChatNodeHandler.java:1385) ~[hzero-aip-app-1.6.1.ALPHA.6.13.jar!/:1.6.1.ALPHA.6.13]
但是没有明确的错误信息,而且在aip-server中也没有出现错误。不知道是啥原因了:

产研看了下,应该是前面调用飞搭内部API创建对象时报的错,应该到hzero-modeler服务的日志中去找原因。在hzero-modeler服务日志中可以看到错误信息:

2026-02-09T20:53:05.545+08:00 ERROR 21206 — [hzero-modeler] [  XNIO-1 task-6] o.h.core.exception.BaseExceptionHandler  : Unknown exception, Request: {URI=/v1/0/business-objects/domain/simple-generator}, User: CustomUserDetails{userId=2, username=admin, roleId=1, roleIds=[1, 2, 9], siteRoleIds=[1, 9], tenantRoleIds=[2], roleMergeFlag=false, secGrpIds=[], tenantId=0, tenantIds=[2, 0], organizationId=0, isAdmin=true, clientId=null, timeZone=’GMT+9, language=’zh_CN, roleLabels='[MODEL_PLATFORM_ADMIN, LOWCODE_PLATFORM_ADMIN], apiEncryptFlag=1}

org.springframework.dao.DataIntegrityViolationException:

### Error updating database.  Cause: java.sql.SQLIntegrityConstraintViolationException: Column ‘field_type’ cannot be null

### The error may exist in org/hzero/modeler/business/infra/mapper/BusinessObjectFieldMapper.java (best guess)

### The error may involve org.hzero.modeler.business.infra.mapper.BusinessObjectFieldMapper.updateOptional-Inline

### The error occurred while setting parameters

### SQL: UPDATE hmde_bo_field SET last_update_date = ?, last_updated_by = ?, object_version_number = object_version_number + 1, bo_field_name = ?, remark = ?, required_flag = ?, default_value_type = ?, default_value = ?, max_length = ?, component_type = ?, formula = ?, country_code = ?, max_value = ?, min_value = ?, digital_accuracy = ?, master_bo_id = ?, master_field_code = ?, master_field_name = ?, master_option_type = ?, master_option_code = ?, master_opt_display_field_code = ?, master_required_flag = ?, cascade_del_strategy = ?, ref_bo_field_code = ?, ref_bo_associate_code = ?, lov_code = ?, attribute_json = ?, link_relation_type = ?, exportable_flag = ?, rule_code = ?, sequence_isolation_level = ?, multi_language_flag = ?, bo_option_code = ?, option_type = ?, option_display_field_code = ?, default_display_field_flag = ?, storage_encrypt_flag = ?, field_behavior = ?, use_type = ?, storage_code = ?, storage_bucket_name = ?, storage_directory = ?, attachment_delete_flag = ?, parent_id = ?, field_type = ?, child_field_category_code = ?, custom_field_code = ? WHERE bo_field_id = ? AND OBJECT_VERSION_NUMBER = ?

### Cause: java.sql.SQLIntegrityConstraintViolationException: Column ‘field_type’ cannot be null

; Column ‘field_type’ cannot be null

at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:97) ~[spring-jdbc-6.2.1.jar!/:6.2.1]

看起来往 hmde_bo_field 表插入数据时,field_type有空字段导致的。估计可能是有个字段加工过程出问题了。

第二天,重启了服务,然后查看所选低代码领域”调研问卷”中的业务对象,存在之前创建过的采购订单头和行,考虑到之前测试时,对业务对象的处理方式在卡片中选择的是新建,而不是更新,这个应该也不符合测试要求。于是把这两个业务对象删除之后再测试,这次测试成功了:成功创建了采购订单的业务对象和页面。

在Ageng运行监控处显示“成功”

查看执行详情,可以看到流程都顺利执行了:

还有一次碰到一个问题:

问题卡在节点:批量创建对象。

然后因为之前单独运行过AI生成对象的流程编排,已经创建过物理表,我就把物理表删除了,但即使把物理表删除了,去单独发布AI生成的对象也会报错:

原因是:这个物理对象在飞答元数据中有记录,解决这个问题,需要同步表物理模型:这个同步的作用是会查看实际物理表,如果不存在会把对应的元数据删除掉,这样就不会产生误判了。

另外就是删除未发布的业务对象,并不会同步删除对应的表物理模型,如果要一起删除掉表物理模型,需要在系统界面“表物理模型”的地方去删,这样会把元数据记录和实际的物理表一起删除:

总结下修正内容:

1、解决这个问题的前提是已经解决问题二十,多模态识别问题。

2、hzero-aip-server 和hzero-aip-app 都升级到1.6.1.ALPHA.6.13

3、hzero-aip-app 的启动类注释掉@EnableWebFlux 注解,application.yml更改配置:支持100M的payload

4、在hzero-gateway的application.yml中调整timeout配置,原来是2秒,调整到20秒依然有问题,调整到200秒就没问题了。

5、新建自定义账户,模型类型=对话-vllm, 账户编码=JACK-TALK-DOUBAO-SEED-1.8-3, 账户名称=Jack对话-豆包-seed-1.8-3,Model=doubao-seed-1-8-251228

开放API地址=https://ark.cn-beijing.volces.com/api/v3/chat/completions

支持多模态=Y,支持非流式=Y,支持json_object=Y ,是否支持函数调用=Y,图片传输方式:BASE64,最大上下文token数=80000,最大响应token数=8000

认证类型=自定义健值认证,健值位置=请求头参数,健=Authorization,自定义的配置=Bearer+空格+火山引擎大模型APIKey

默认参数:KV模式,参数名称=thinking,参数值={“type”:”disabled”}

6、把账户Jack对话-豆包-seed-1.8-3 添加到账户组合:Jack-talk-multmodel (组合名称:Jack对话-多模态)

7、把Jack-talk-multmodel配置给Agent编排中分类为飞搭的三个编排。

8、AI平台全局配置的切片配置处,图片识别模型配置为这个多模态模型(这里不配置会让HKMS服务报错)

9、hzero-file文件服务的max内存调整到800M

#更新Docker环境 (待执行):

  1. hzero-gateway、hzero-aip-app 和hzero-aip-server重新打镜像包

cp \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\hzero\project\ps-gateway\target\ps-gateway.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-gateway-docker\

cp \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\hzero-aipaas\project\ps-aip-app\target\ps-aip-app.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-aipapp-docker\

cp \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\hzero\project\ps-license\licenseAgent\license-agent112a.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-aipapp-docker\

cp \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\hzero-aipaas\project\ps-aip-server\target\ps-aip-server.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-aipserver-docker\

cp \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\hzero\project\ps-license\licenseAgent\license-agent112a.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-aipserver-docker\

cd  /d01/openJ9-0.53-dockers

bash load-dockers.sh

$ cd /d01/hzero-dockers/hzero-gateway-docker

$ docker build -t hzero-gateway-jk-demo:1.12 .

$ cd /d01/hzero-dockers/hzero-aipapp-docker

$ docker build -t hzero-aip-app-jk-demo:1.12 .

$ cd /d01/hzero-dockers/hzero-aipserver-docker

$ docker build -t hzero-aip-server-jk-demo:1.12 .

  • hzero-file 更改docker-compose.yml文件,更改启动服务的max内存到800M
  • 启动服务,执行总结中的5、6、7、8

测试:功能完成:

问题十九、Agent应用的权限问题

现象,Agent应用发布后,拷贝应用连接中的全屏连接,在另一个浏览器tab页打开,发现错误:

hzero-app-server的application.yml 中,设置

org.apache.ibatis: ${LOG_LEVEL:DEBUG}

后台服务日志出现加解密错误:

io.choerodon.core.exception.CommonException: error.key-encrypt.decrypt.error

元宝说可能是版本不一致导致的,考虑到之前hzero-aip-app升级的了1.6.1.ALPHA.6,但我hzero-aip 服务已经降到1.6.1.ALPHA.4, 所以这次把hzero-aip-app也降低到1.6.1.ALPHA.4再试:发现还是一样的加解密错误:

找了产研,产研把这个Agent应用取消发布后再重新发布就正常了,开源代码好像是缓存问题。取到缓存就OK了,取不到就报错。

以后再碰到类似问题,就取消发布再重新发布,生成缓存。

这个问题解决后,到低代码平台,试用AI生成业务对象的功能,可以正常使用了:

拷贝前端文件到docker环境:

cp -r -Force \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\hzero\front\dist \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\volumes\nginx\

问题二十、问答应用中 多模态模型图片识别问题:

配置了豆包Seed1.8多模态模型,问答的时候,上传图片,结果报错:调用HKMS执行文件切片时发生错误:Failed: Either`image_explainer or `ocr adapter must be provided

这是个多模态模型,按理不需要OCR,这里提示OCR,产研说是模型配置的时候没有打开多模态属性,需要打开这个属性,另外图片格式,因为是本地服务器,外网无法访问到文件服务器,所以要设置成Base64格式。

另外就是全局配置的切片配置处要配置图片识别模型为这个多模态模型:

更改之后,上述错误就没有了,但提示 :网络错误:

http://hzero-aip-app:8088/v1/open/chat/kms 无法访问。

查HKMS服务的日志,显示是调用

http://hzero-aip-app:8088/v1/open/chat/kms报错

2026-02-03 09:41:06 [44][MainThread] [ERROR] (api.py:68) Exception when call HZERO API at url ‘http://hzero-aip-app:8088/v1/open/chat/kms’: error.network – 网络异常,请稍后重试

Traceback (most recent call last):

在hzero-hkms容器内,curl命令访问

http://hzero-aip-app:8088/v1/open/chat/kms可以连通。说明连接到hzero-aip-app:8088的网络没有问题。

看aip-app服务的日志,有报错是payload容量超载了:

2026-02-03T17:08:06.049+08:00 ERROR 73158 — [hzero-aip-app] [or-http-epoll-6] o.h.a.i.handler.RequestExceptionHandler : Unknown exception for request: StrictFirewallHttpRequest [delegate=org.springframework.http.server.reactive.ReactorServerHttpRequest@e996c636] org.springframework.web.server.PayloadTooLargeException: 413 PAYLOAD_TOO_LARGE

产研说尝试更改 hzero-aip-app服务的application.yml配置:

      # 等待连接池分配连接的最大时长(毫秒)

      connection-timeout: ${SPRING_DATASOURCE_CONNECTION_TIMEOUT:30000}

  server:

    max-http-request-size: 100MB  # 全局最大请求体大小

  codec:

    max-in-memory-size: ${SPRING_CODEC_MAX_IN_MEMORY_SIZE:100MB}

spring.cloud.gateway:

  httpclient:

    max-in-memory-size: 100MB

  server:

    max-http-request-size: 100MB

更改后依然有问题,然后尝试更小的图片文件,之后几十K(原来那个有问题的图片有2M,依然不行),小图片会显示网关TimeOut问题,不过后台依然继续运行了,所以是可以测试出效果了:

至于网关TimeOut的问题,在hzero-gateway的application.yml中原来是2秒,调整到20秒依然有问题,调整到200秒就没问题了,进一步研究发现,这个模型带思考模式,思考比较花时间,但看说明是可以关掉思考的,这样可以节省9秒。

在模型配置的地方加个参数就好了:

豆包说图片转BASE64大约会增加30%的大小,所以对于一个2.5M的图片,转BASE64后大小约3M,按照我们上面的设置大小应该够了,至于还提示超限错误,估计还是有参数没有设置对,问元宝,给出的建议是调整hzero-aip-app服务的application.yml中如下两个参数:

# application.yml 配置

spring:

  codec:

    max-in-memory-size: 10MB

  webflux:

max-in-memory-size: 10MB

改了之后重启服务,问题依旧,不过元宝提到如果使用了nginx反向代理,也要调整配置,按建议修改:

# aigc.hzero.com.cn 专用服务器

server {

    listen 80;

    server_name aigc.hzero.com.cn;

    # 设置此server块的默认客户端请求体最大大小为20MB

    client_max_body_size 100M;

    location / {

        # 改为后端服务实际IP:端口

        proxy_pass http://127.0.0.1:8088;  # 示例:假设后端在本机8088

        # 添加WebSocket支持

        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection $connection_upgrade;

        proxy_set_header Host $host;  # 保留一个Host配置

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_buffering off;  # 按需开启/关闭(实时交互场景建议关闭)

        # 可选:调整代理超时设置,应对大文件上传耗时

        proxy_connect_timeout 60s;

        proxy_send_timeout 60s;

        proxy_read_timeout 120s;

    }

}

重启nginx服务,问题依旧。不能超过256K;

后来的实验证明:这个问题跟Nginx配置没关系,实际不需要更改Nginx配置,一样是可以正常运行的。

后来继续跟踪这个问题,产研说,要把hzero-aip-app服务启动类里面的@EnableWebFlux 注解去掉,说 app 服务不要加这个注解,加了这个注解会覆盖掉一些自己的配置,导致配置不生效。

#去掉这个注解,然后重新build,经过测试,可以了,一个2.5M图片可以成功上传并解析:

又测试了一张5.8M大小的图片,上传并解析返回时间大约为35秒:

但直接在豆包中上传文件并返回总结的时间是秒级的,这里面差距主要在什么环节呢?

HZERO PaaS平台-Docker版demo笔记(二)Docker版测试 问题10-15

问题十、新建租户失败

现象:在2026/01/09下载的版本上,有同事 发现以平台租户下系统管理员身份创建新的租户HAND-DEV 出错

分析:检查/网络 :调用的是iam服务的API , 返回200 Ok,响应中提示的错误是:

“exception”:”io.choerodon.core.exception.CommonException: hiam.error.role.tplRoleNotFound”,

    “throwable”: [

        “hiam.error.role.tplRoleNotFound”,  “org.hzero.iam.saas.domain.service.observer.TenantRoleObserver.lambda$tenantCreate$1(TenantRoleObserver.java:59)”,

检查hzero-iam 服务的后台日志,发现在这个错误之前有另一个错误:

Exception in thread “pool-40-thread-9” org.springframework.dao.QueryTimeoutException: Redis command timed out

检查redis容器的CPU占用和内存占用都很低,看起来Redis服务没啥问题。

继续检查redis:

#查询耗时超过50毫秒的客户端命令:

/data # redis-cli 127.0.0.1:6379> config set slowlog-log-slower-than 50000

让豆包对输出内容进行分析:

1. 高风险耗时命令(直接导致超时)

SET “hpfm:language:auto-refresh:lock”:耗时 165.5ms(第 4 条)

DEL “apaas:data-transport:active:hzero-lowcodedata”:耗时 132.1ms(第 5 条)

SET “apaas:data-transport:active:hzero-modeler”:耗时 44.9ms(第 7 条)

如果你的 Spring 配置中 redis.timeout 是默认的 2000ms(2 秒),单条命令 165ms 本不该超时,但高并发下多条慢命令排队,总耗时就会超过阈值(比如 10 条 160ms 的命令排队,总耗时 1.6 秒,接近 2 秒超时)。

2. 潜在风险命令(HGETALL)

HGETALL “hiam:doc:permission:rule:hadm_notice_publisher”(第 13 条)

HGETALL “hpfm:permission:hadm_service_route”(第 14 条)

HGETALL 是全量获取哈希表的命令,如果哈希表中字段数多(比如上千个),即使单次耗时 11.5ms(11546 微秒),高频率执行也会:

占满 Redis 单线程(Redis 单线程每秒处理能力有限);

导致后续命令排队,总耗时累积超时。

#继续查询各命令执行次数:

$ docker exec -it redis-hzero redis-cli info commandstats | sort -k 4 -r

输出结果中,有一条比较特殊:

cmdstat_hgetall:calls=15346,usec=-1069515,usec_per_call=-69.69,rejected_calls=0,failed_calls=0

豆包分析:

calls=15008:该命令执行了 1.5 万次,频次极高;

usec=-1073589:耗时字段为负数,说明 Redis 内部的耗时计数器已溢出,实际总耗时远超千万微秒(即数秒甚至数十秒);

即使单次平均耗时显示 -71.53(溢出导致),结合慢查询日志中 HGETALL 实际耗时 11-17ms,1.5 万次执行的总耗时会完全占满 Redis 单线程,导致后续所有命令排队。

豆包总结:

核心根因:HGETALL 执行 1.5 万次且耗时溢出,占满 Redis 单线程,导致其他命令排队超时;

紧急方案:调大 Redis 客户端超时时间和连接池,缓解超时问题;

根本方案:用 HSCAN 替换 HGETALL,分批获取 Hash 数据,清理 / 拆分大 Key;

长期保障:添加 AOP 监控,提前发现慢命令,避免问题复发。

我估计在所有服务一起启动的时候,可能出现redis超时,不过等服务全部启动完成后就不会有超时问题了。所以这个不太可能导致hiam.error.role.tplRoleNotFound这个问题,也就是不太可能因为日志中的redis超时,导致租户创建失败。

#开放平台全平台搜索“tplRoleNotFound” 未搜到任何结果。

#到非Docker环境去创建租户:出现问题是一样的。

#我上次创建“低代码演示租户”的时候,没有出现过这个问题,我看下升级日志

2025-09-11  升级飞搭  从 2.9.1-1.12.BETA.8 到  2.10.0.RELEASE

我上次创建“低代码演示租户”的时候是在这次升级之前。

看了这之后的历次升级动作,只有在2025-09-26升级底座的时候升级过iam服务。

2025-09-26  升级HZERO底座   从1.12.1.RELEASE   到  1.12.2.RELEASE

当时,iam服务从1.12.1.RELEASE替换成1.12.2.RELEASE

那我把iam服务的版本退回到1.12.1.RELEASE行不行?尝试一下:

更改:
/d02/hzero/project/pom.xml

/d02/hzero/project/ps-iam-saas/pom.xml

尝试了,不行,iam服务退回到1.12.1.RELEASE后,系统就无法登录了。

还是恢复到1.12.2.RELEASE

继续思考:报错信息是tplRoleNotFound,是不是模板角色未找到?

尝试下 在创建租户时“集成租户管理员模板”选择“否”,结果错误跟原来是一样的。

看下有无更新的补丁版:最新版是2025/03/18 的版本,后面没有更新的了。

那可能是数据问题?

搞不定了,明天上班,去问下产研吧!

第二天问了产研,产研说看下数据,下面的SQL能否查到,如果查不到原因是什么,针对原因解决即可:

use hzero_platform;

select

ir.id,

ir.name as “name”,

ir.code as “code”,

ir.fd_level,

ir.h_tenant_id,

ir.h_inherit_role_id,

ir.h_parent_role_id,

ir.tpl_role_name,

il.id label_id,

il.name label_name,

il.type label_type

from iam_role ir

join hiam_label_rel hlr on (

hlr.data_type = ‘ROLE’

and hlr.data_id = ir.id

)

join iam_label il on il.id = hlr.label_id

where ir.is_enabled = 1

and il.preset_flag = 1

and il.enabled_flag = 1

and exists (

select 1

from iam_label il

join hiam_label_rel hlr on (

hlr.data_type = ‘ROLE’

and hlr.label_id = il.id

)

where

hlr.data_id = ir.id

and il.enabled_flag = 1

and il.preset_flag = 1

and il.name = ‘TENANT_ROLE_TPL’

)

直接结果是查不到数据,分析原因是因为 hzero_platform.iam_role表中租户管理员模板的is_eanbled标记错了,应该是1,不是0,才能被上面SQL查出来。

解决方案:把这个标记更新成1

update hzero_platform.iam_role set is_enabled=1 where id =5;

更新完成后再次尝试新建租户:

创建成功。问题解决。

问题十一、集成平台,导入编排报错

产研说这个问题升级到1.8的最新版本可以解决掉,集成平台产研组,提供了一个工具,获取某个中版本的最新稳定版小版本。

http://172.22.5.71:8765/index

我们原来的编排服务版本是1.8.1.RELEASE的,查了下最新稳定版是1.8.2.RELEASE

把集成平台的父parent和编排的POM都改成1.8.2.RELEASE之后重新构建成功但启动服务失败。

思考:是否agent的版本依赖有更新,原来用的agent是license-agent110(别名:license-agent103), 改成 license-agent112a试试看。

果然,改了之后服务启动成功。

测试,编排服务正常,但出现调用接口平台错误:

查接口平台日志,发现错误:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘externalInvokeAdvisor’: Unsatisfied dependency expressed through field ‘advice’: Error creating bean with name ‘internalInvokeAdvisor’: Unsatisfied dependency expressed through field ‘advice’: Error creating bean with name ‘internalInvokeAdvice’: Unsatisfied dependency expressed through field ‘objectMapper’: Error creating bean with name ‘interfaceGatewayConfig’ defined in URL [jar:nested:/d02/hzero-ipaas/project/ps-jipaas-interface/target/ps-jipaas-interface.jar/!BOOT-INF/lib/hzero-interface-gateway-1.1.1.RELEASE.jar!/org/hzero/interfaces/gateway/config/InterfaceGatewayConfig.class]: Error creating bean with name ‘org.springframework.cache.annotation.ProxyCachingConfiguration’: No bean named ‘org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry’ available

元宝分析原因:

主要原因与解决方案

这种内部 Bean 缺失通常不直接是业务代码错误,而是由以下情况引发的 Spring 容器初始化异常:

可能原因

说明与解决方案

版本冲突​

这是最可疑的原因。不同 Spring 组件(如 spring-context, spring-aop, spring-cache)或第三方库(如 MyBatis)的版本不兼容,可能导致内部 Bean 注册紊乱 。解决方案:检查项目的依赖树(如使用 mvn dependency:tree或 gradle dependencies),确保所有 Spring 相关依赖的版本保持一致且兼容。

配置顺序或覆盖问题​

自定义配置或 Bean 可能意外干扰了 Spring 容器的标准初始化流程。解决方案:检查是否有自定义配置类(特别是使用了 @EnableCaching或相关 AOP 配置)或通过 @Primary、@Qualifier注解覆盖了默认 Bean,暂时注释掉这些配置来排查 。

项目构建或缓存问题​

旧的编译文件或损坏的依赖缓存可能导致运行时类路径不完整。解决方案:执行清理和重新构建操作(如 mvn clean compile或清理 IDE 的缓存并重启)。

但我认为不是这个原因,因为这个服务之前一直启动正常,如果有上述问题,不可能之前启动正常。

于是我重启了接口平台服务:

$ cd /d02/hzero-ipaas/project/ps-jipaas-interface

$ bash run_nobuild.sh

重启后服务正常了,编排服务也正常了。

重新打包编排服务的镜像:

  1. 拷贝文件

#Windows PowerShell:

cp \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\hzero-ipaas\project\ps-orchestration-all\target\ps-orchestration-all.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-orchestration-docker\

cp \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\hzero\project\ps-license\licenseAgent\license-agent112a.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-orchestration-docker\

  • 更改Dockerfile,把license-agent110改成license-agent112a

COPY license-agent112a.jar /license-agent112a.jar

  • 更改docker-compose.yml ,把license-agent110改成license-agent112a

      – AGENT=-javaagent:/license-agent112a.jar

4、目标环境构建Docker镜像

$ cd /d01/hzero-dockers/hzero-orchestration-docker

$ docker build -t hzero-orchestration-all-jk-demo:1.12 .

5、测试启动容器,可以正常启动服务;

6、save & 更新

问题十二、低代码平台数据迁移功能异常

路径:低代码平台/资源管理/数据迁移,显示有两个服务不可用。

分析:实际情况是这两个服务启动状态正常:

产研的说法是,这个界面的服务状态是从Redis中读取的,查Redis的特定键下面内容,确实缺了这两个服务:

有个疑问是,之前曾经成功导出过数据,这个界面曾经处理到正常状态的,可以参考:

Jack.Shang的技术博客 » HZERO PaaS平台demo升级笔记

那为什么现在又提示这种错误了呢?有个同事的说法是:服务第一次加载的时候会把服务加载到active目录下,那个时候可能会显示正常,然后有服务会去刷新数据,刷新的时候,会看服务的application.yml中有没有配置,如果没有就去掉了:

Hzero:

  apaas:

     data-transport:

        enable: true

我看了自己的hzero-iam服务的配置,配置是有的,但缩进有问题:

更改缩进后再重启hzero-iam服务,发现Redis中就有了:

同样在hzero-platform的application.yml中检查发现,缺少

hzero:

  apaas:

     data-transport:

        enable: true

也加上,再重启hzero-platform服务, 这次不稳定,发现active健下的服务反而变少了。

估计这个健值是hzero-modeler服务里面的定期程序刷进去的,重启hzero-modeler服务。

结果还是老样子。

hzero-modeler服务的application.yml中去掉hzero-lowcodedata,仅保留5个服务即可:

hzero:

  apaas:

data-transport.include-services: hzero-modeler, hzero-lowcode, hzero-platform, hzero-workflow,hzero-iam

重新构建启动hzero-modeler服务

另有同事反馈说:hzero-workflow 父工程的POM中的parent要换成hzero-apaas-parent

    <parent>

        <groupId>org.hzero</groupId>

        <artifactId>hzero-apaas-parent</artifactId>

        <version>2.10.0-1.12.RELEASE</version>

    </parent>

另外开放平台文档中说明的hzero-workflow配合低代码平台要添加跟hzero-modelerxiangguan 的四个依赖,但由于在hzero-workflow本身的POM中都已经添加了,所以在我们自己套壳的ps-workflow的POM中就不需要添加了. 你可以在本地maven库中查看hzero-workflow的POM文件内容,就明白了。

#重新构建启动hzero-workflow服务

重启之后,进去了:

今天先到这里,关闭所有服务,明天再搞:

第二天重启所有服务之后,发现正常了:

那这是算稳定性不够吗? 我再重启hzero-modeler服务试试看:

$ cd /d02/hzero-apaas/project/ps-modeler

$ bash run.sh

重启之后,显示异常:

过一分钟后点”刷新”,又正常了:

如果我们, 去掉redis持久化配置,清空redis ,  再重启会怎样?

我们发现hzero-platform 异常了,实际就是没有进入redis

而且过了10多分钟,多次刷新也没用。

#重启下hzero-platform服务试试看:

$ cd /d02/hzero/project/ps-platform

$ bash run_nobuild.sh

数据迁移界面又正常了:

为什么要这么设计呢? 为什么不直接去注册中心检查服务是否Ok呢?为什么要到redis里面去记录下服务状态OK,才判断为OK呢?这不是增加故障点吗? 此事询问产研,产研的答复是他们要检查的服务状态内容比较多,不是说在注册中心活着就表示服务可用,他们还要检查该服务的其他一些功能可用性,全部检查通过才会放到Redis,表明该服务对飞搭的导入/导出 功能是可用的。

另外,服务的application.yml配置中

Hzero:

  apaas:

     data-transport:

        enable: true

这个配置的作用是什么,如果没加会产生什么影响? lowcode-data服务必须要加这个配置吗?

产研的回答是:开启数据迁移,默认就是开启的,就是你不加这个配置,默认就是true,除非你要禁止数据迁移,要加这个配置,设置为false.

所以,我们刚开始碰到的数据迁移界面上服务异常的这个问题,并非我们上面修改application.yml解决的,也不是ps-workflow服务原来依赖的parent有问题,原来依赖的是hzero-parent, 不是hzero-apaas-parent, 但也能用,没有错误,并不是这个parent的问题导致说在迁移界面显示服务异常,因为之前也是这样的没有异常,只能说是重启服务解决的,但问题的根因还未找到。只是重启相关服务是个解决方法。

问题十三、Redis TimeOut问题

正如我们在问题十所见,

Exception in thread “pool-40-thread-9” org.springframework.dao.QueryTimeoutException: Redis command timed out

这个Redis TimeOut的问题,开始在服务刚开始集中启动时,多个服务都曾经出现timeOut的问题,在不改程序的情况下,是否可以优化,豆包说:
Redis 是内存数据库,而持久化需要将内存数据写入磁盘,磁盘 I/O 速度远慢于内存,会直接带来性能损耗:

RDB 的性能影响:执行 BGSAVE 时,Redis 会 fork 子进程,这个过程会产生内存拷贝(写时复制机制),如果数据量很大,fork 操作会阻塞主进程,导致 Redis 短暂无法响应请求;子进程写入 RDB 文件时,也会占用磁盘 I/O 资源。

所以我们可以关闭Redis的持久化,提高redis的性能。

$ cp /etc/redis/redis.conf /etc/redis/redis.conf.bak20260113

$ vi /etc/redis/redis.conf

# ========== 关闭RDB持久化 ==========

# 注释掉所有以 “save” 开头的行(默认有save 900 1、save 300 10等)

# save 900 1

# save 300 10

# save 60 10000

# 新增空的save规则,彻底禁用RDB

save “”

# ========== 关闭AOF持久化 ==========

# 将appendonly设为no(默认就是no,确认即可)

appendonly no

# 可选:如果之前开启过AOF,可删除AOF文件(避免重启时加载)

# appendfilename “appendonly.aof”  # 无需修改,关闭后不会写入

# ========== 可选:禁用持久化相关的后台进程 ==========

# 禁止自动生成rdb文件(防止意外触发)

rdbcompression no

rdbchecksum no

重启前执行 redis-cli FLUSHALL 命令清空所有数据

$ redis-cli FLUSHALL

$ systemctl restart redis

我们之前用的redis容器,没有挂在持久化文件,使用也正常,但却开启了持久化配置,这个就要改了,因为本身就没有做持久化挂载,还保持持久化配置就是纯浪费性能。

这个很简单,只要改下redis服务的 docker-compose.yml就好了

跟port平级,加上:

command: redis-server –save “” –appendonly no

改完重启,验证是否生效:

docker exec -it redis-hzero redis-cli config get save

root@desktop-jacksen:/d01/hzero-dockers/redis-docker# docker exec -it redis-hzero redis-cli config get save
1) “save”
2) “”

说明已经生效。

重启所有服务,逐个检查所有服务的日志,这次没看到redis 的timeout信息出现。

问题解决。

但后来在使用过程中很快发现,经用Redis持久化之后引起了其他问题,比如hzero-platform 服务日志中经常出现错误:
Caused by: io.lettuce.core.RedisCommandTimeoutException: Command timed out after 5 second(s)

界面操作时不时会出现:504 GATEWAY_TIMEOUT “Response took longer than timeout: PT20S”

所以还是把持久化恢复吧:

$ cp  /etc/redis/redis.conf.bak20260113 /etc/redis/redis.conf

$ systemctl restart redis

然后需要重启hzero-platform服务

#Docker 环境改成持久化

$mkdir -p /d01/hzero-dockers/volumes/redis/{data}

$chmod 777 /d01/hzero-dockers/volumes/redis/data

#docker-compose.yml中注释掉去持久化配置:

#command: redis-server –save “” –appendonly no

#挂载data目录

    volumes:

      # 映射数据目录(持久化文件存储位置,核心)

      – ${DOCKER_VOLUME_DIRECTORY:-../volumes}/redis/data:/data    

持久化恢复也有问题,后来在使用的时候,发现各模块经常会频繁的redis timeout问题,导致系统运行非常卡,默认每5分钟会全量保存持久化一次,太频繁了,后来就改成一小时保存一次。这可以在redis容器的docker-compose.yml中配置:command: redis-server –save 3600 1 –save “”

## 要求Docker/Docker CE >= 19.x

services:

  redis-hzero:

    image: redis:6-alpine

    container_name: redis-hzero

    ports:

      – “6379:6379”

    volumes:

      # 映射数据目录(持久化文件存储位置,核心)

      – ${DOCKER_VOLUME_DIRECTORY:-../volumes}/redis/data:/data   

    #command: redis-server –save “” –appendonly no

    command: redis-server –save 3600 1 –save “”

    deploy:  # 限制容器总内存(Docker Compose v2.3+)

      resources:

        limits:

          memory: 1000m  # 容器最大内存

networks:

  default:

    name: hzero-demo

    external: true

由于是笔记本上WSL虚拟机,我后来发现redis time out的问题不仅仅是这个持久化写的频率问题, 笔记本的电源计划在某天升级Windows后变成了节能模式,在接通电源情况3分钟就休眠,这也是导致各服务卡顿的主要问题。后来就更改了电源计划,在接通电源的模式下改成永不休眠。 卡顿的问题就得到了改善。

另外就是,在碰到前端报gateway timeout错误,在gateway服务中看到 TimeOut错误是调用platform服务导致的等待超时,这种情况可能是重启了redis而没有重启platform服务导致的,在重启platform服务之后可以解决这种卡顿问题。

问题十四:资源分配问题还是OpenJ9 JVM的稳定性问题?

进入流程平台工作台,报hzero-lowcode服务不可用。

分析,查hzero-lowcode服务的日志:

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException:

Error creating bean with name ‘externalInvokeAdvisor’:

Unsatisfied dependency expressed through field ‘advice’:

… [嵌套异常链] …

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:

No bean named ‘org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry’ available

元宝分析:总而言之,当前服务掉线是由于Spring容器在初始化时因配置或依赖问题而无法启动,并非运行中的崩溃。您的排查重点应放在 依赖版本兼容性​ 和 配置类/Bean的加载顺序​ 上。从日志末尾的EurekaDiscoveryClient来看,这个问题可能与服务注册发现相关的配置有关联。

我之前遇到这种问题是重启解决的,我还是重启一下:结果

有这个错误:

Error starting ApplicationContext. To display the condition evaluation report re-run your application with ‘debug’ enabled.

2026-01-16T06:00:58.870Z ERROR 1 — [hzero-lowcode] [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name ‘observationRestTemplateCustomizer’: Requested bean is currently in creation: Is there an unresolvable circular reference or an asynchronous initialization dependency?

at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.beforeSingletonCreation(DefaultSingletonBeanRegistry.java:421) ~[spring-beans-6.2.1.jar!/:6.2.1]

at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:282) ~[spring-beans-6.2.1.jar!/:6.2.1]

at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:334) ~[spring-beans-6.2.1.jar!/:6.2.1]

元宝分析:问题根源:循环依赖

错误信息 BeanCurrentlyInCreationException和 Is there an unresolvable circular reference?明确指出了问题的核心:Spring 容器在初始化 Bean 时,发现它们之间存在直接的或间接的循环引用关系​ 。

简单来说,这就像几个团队项目互相“卡脖子”:Bean A的创建需要先有 Bean B,而 Bean B的创建又反过来需要先有 Bean A。Spring 容器无法决定谁应该先被创建,从而陷入死锁,最终抛出异常并导致应用启动失败 。

在您这个案例中,问题直接指向了 observationRestTemplateCustomizer这个 Bean。从 Bean 的名称推测,它很可能与 Spring Boot 的应用监控功能(可能是 Micrometer 或相关组件)相关。这个 Bean 在创建过程中,与另一个或多个 Bean 形成了这种循环依赖。

这有无可能是IBM OpenJ9 Jvm的问题?

OpenJ9 和 HotSpot 是两种不同的 JVM 实现,它们在类加载、内存管理和即时编译(JIT)策略上存在差异 。这些底层实现的区别,可能导致 Spring 容器初始化 Bean 的顺序和时机发生微妙的改变。

具体来说,有实践表明,在由 HotSpot 迁移至 OpenJ9 时,可能会遇到一些兼容性问题。例如,某公司在实践中发现,OpenJ9 在类加载机制、内存使用模式等方面与 HotSpot 存在差异,这有时会导致一些在 HotSpot 上运行良好的应用在 OpenJ9 上出现异常 。您的情况很可能类似:之前隐藏在 HotSpot 下的循环依赖,在 OpenJ9 不同的初始化时序下被提前触发了​ 。

简单来说,这就像两个仓库管理员(HotSpot 和 OpenJ9)用不同的方法整理货物(Bean)。可能有一种方法能勉强把有问题的货物塞进仓库,而另一种更“较真”的方法则会立刻发现货物尺寸不匹配而卡住。

按照错误日志第一行的建议,使用 –debug参数重启应用(例如 java -jar your-app.jar –debug)。Spring Boot 会打印出一份非常详细的条件评估报告,其中会清晰列出形成循环依赖的完整 Bean 链条,这是解决问题的关键第一步 。

这个麻烦了,需要该服务的开发者调试。不是我们该干的事。

我还是停掉服务,不要马上重启,过一段时间再重启,结果启动成功了,没有报上面的这种错误。

疑问:是否可以说OpenJ9的JVM不稳定,仅使用于个人实验环境,因为可以通过重启服务解决,但也就是个人实验环境适合这么干?

产研认为不太可能是OpenJ9的稳定性问题,因为外面有很多商业项目也在用OpenJ9,更可能是资源问题;那我再看下资源消耗:

内存消耗目前已经到了864M

我们在docker-compose.yml中分配的max内存是800M,资源非配确实有问题。

      – JAVA_OPTS=-Xms128m -Xmx800m -Dspring.profiles.active=dev

那我们继续做实验,把xmx 调整到600M,再启动,果然又出现之前的bean创建不了的情况了。

#继续实验,把xmx 调整到1000M,再启动,结果启动成功了,没有报上面的那些Bean创建失败的错误。

#继续实验,把xmx 再次调整到600M, 再启动,结果居然也成功启动了,那这个成功启动是不是之前设置为1000M的时候的缓存还在,导致能成功启动的?

#继续实验,关闭服务之后等一会再以xmx=600M 启动,等了大概5分钟后再重启,结果居然也成功了。

那暂时似乎也不能说是资源问题。

问题十五、工作流模拟启动时报错:流程版本未生效!

分析:查hzero-workflow服务日志,错误信息如下:

2026-01-16T08:26:02.546Z  INFO 1 — [hzero-workflow] [ool-3-thread-10] org.hzero.core.util.CommonExecutor       : [>>ExecutorStatus<<] ThreadPool Name: [bean-searcher], Pool Status: [shutdown=false, Terminated=false], Pool Thread Size: 0, Largest Pool Size: 0, Active Thread Count: 0, Task Count: 0, Tasks Completed: 0, Tasks in Queue: 0

2026-01-16T08:26:05.457Z  WARN 1 — [hzero-workflow] [  XNIO-1 task-7] o.h.core.exception.BaseExceptionHandler  : Common exception, Request: {URI=/v1/2/monitor-simulate/start}, User: CustomUserDetails{userId=2, username=admin, roleId=10, roleIds=[10], siteRoleIds=[], tenantRoleIds=[10], roleMergeFlag=false, secGrpIds=[], tenantId=2, tenantIds=[2, 0], organizationId=0, isAdmin=true, clientId=null, timeZone=’GMT+9, language=’zh_CN, roleLabels='[TENANT_ADMIN], apiEncryptFlag=1}

io.choerodon.core.exception.CommonException: error.deployment.not_valid_yet

at org.hzero.workflow.engine.run.impl.ModelServiceImpl.checkValid(ModelServiceImpl.java:656) ~[hzero-workflow-1.20.0-1.12.RELEASE.jar!/:1.20.0-1.12.RELEASE]

at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]

元宝分析可能原因:

依赖版本冲突

在某些情况下,如果项目依赖的库(如 MyBatis-Plus, jsqlparser 等)版本不兼容,可能会在运行时抛出 NoSuchMethodError或 NoClassDefFoundError,最终被包装为 Handler dispatch failed异常

问了产研

看到发布记录中生效时间是一小时后。 再发布一个版本,看默认是当前时间:

这次看生效时间默认还是一小时后。当前时间是16:41

如果没特意配置,可能是系统时间有问题:

个人中心把时区改成北京时区再发布一下:这次一致了:

但模拟还是不行:

修改个人中心的时区之后,在重新建一个工作流:年假申请测试流程2,再测试:

建好后,保存发布,看到生效时间立即生效是对的:

再次点“模拟” ,还是不行,没法马上模拟成功,要过一天才能模拟:

当前的hzero-workflow 是1.20-1.12.RELEASE的,是25年7月发的版,最新更新已经到了 1.20.1-1.12-BETA.8 是25年12月24日,期间补丁版本已经发了8个了;

升级到1.20.1-1.12-BETA.8 问题依旧。

产研时区问题后来解决了,发了新的版本,需要升级:

=============================================

2026-01-28  升级HZERO 工作流  从1.20.0-1.12.RELEASE 到 1.20.1-1.12.RELEASE

=============================================

升级原因:解决流程平台编辑流程后模拟运行时因为时区设置差异导致 不能立即执行的问题。

1、升级种子数据

再次下载:hwkf-resource-1.20-1.12.RELEASE.zip(产研说因为这个修复版加上了咸亨的部分需求,与数据库字段变更,所以要跑下种子数据:表结构和种子数据)

解压后启动脚本,启动完成后 ,在界面上 执行 1和3  成功完成。

2、升级后端服务

hzero-workflow@1.20.1-1.12.RELEASE

更新POM,然后重新bash run.sh 服务启动正常。

3、升级前端组件

hzero-front-hwkf@1.20.2-beta.1

hzero-front-hwkf-mobile@1.20.1-beta.8

更新package.json

yarn

Done in 45.28s.

yarn run build:ms hzero-front-hwkf,hzero-front-hwkf-mobile

Done in 223.22s

完成后执行部署:

$ bash apply_update_to_runtime_env.sh

cp \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\hzero-bpaas\project\ps-workflow\target\ps-workflow.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-workflow-docker\

重新构建镜像

拷贝前端文件到Docker环境:

$ cp -r  -Force \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\hzero\front\dist   \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\volumes\nginx\

#拷贝种子数据到Docker环境:

cp \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\hzero-bpaas\hwkf-resource\hwkf-resource-1.20-1.12.RELEASE.zip \\wsl.localhost\Ubuntu-22.04\d01\tmp\

#Docke环境启动mysql容器

/d01/hzero-dockers/mysql-docker# docker compose up -d

cd /d01/tmp

unzip hwkf-resource-1.20-1.12.RELEASE.zip

cd hwkf-resource-1.20-1.12.RELEASE

bash database-init.sh执行1和3,完成种子数据更新

再测测试,时区正常了,模拟可以正常立即执行了。问题解决。

HZERO PaaS平台-Docker版demo笔记(六)制作Arm64版安装文件

一、Mac电脑用户发现的问题:

有使用Mac笔记本电脑的同事按照 Jack.Shang的技术博客 » HZERO PaaS平台-Docker版demo笔记(五)安装部署readme 进行部署后发现问题:

启动平台服务的时候会提示 警告,AMD64 不匹配当前平台

但是可以启动成功。

  1. 前台 URL 无法登录

访问 http://dev.hzero.com.cn/

点击重新登录

二、问题分析&解决

分析:我们之前的镜像是基于默认的amd64,需要生成arm64版的,这包括JDK和linux基础镜像都要用arm64版的。

操作步骤:

  1. 下载arm64版的 IBM OpenJDK

Semeru Runtime Downloads – IBM Developer

下载这个版本:

  • 新建目录 /d01/openJ9-0.53-dockers-arm64

把下载的文件放到这个目录下

  • 编辑arm64版的 JavaBase 基础镜像

# 明确指定arm64架构的基础镜像

FROM arm64v8/ubuntu:22.04

ENV TZ=UTC \

    LANG=en_US.UTF-8 \

    JAVA_HOME=/opt/java/openjdk \

    PATH=/opt/java/openjdk/bin:$PATH

# 安装arm64架构的依赖(和amd64依赖名一致,系统会自动匹配架构)

RUN apt-get update \

    && DEBIAN_FRONTEND=noninteractive apt-get install -y –no-install-recommends \

       libc6 libstdc++6 zlib1g ca-certificates \

    && apt-get clean \

    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN mkdir -p ${JAVA_HOME} && chmod -R 755 ${JAVA_HOME}

# 替换为arm64版本的JDK包

COPY ibm-semeru-open-jdk_aarch64_linux_17.0.16_8_openj9-0.53.0.tar.gz /tmp/

RUN cd ${JAVA_HOME} \

    && tar -xvf /tmp/ibm-semeru-open-jdk_aarch64_linux_17.0.16_8_openj9-0.53.0.tar.gz –strip-components=1 \

    && rm -f /tmp/*.tar.gz \

    && rm -rf ${JAVA_HOME}/docs \

    && rm -rf ${JAVA_HOME}/lib/src.zip \

    && rm -rf ${JAVA_HOME}/legal \

    && rm -rf ${JAVA_HOME}/man \

    && java -version

CMD [“java”, “–version”]

  • #构建Ibm OpenJDK OpenJ9-0.53版 arm版的Java基础镜像

#先把arm64版的ubuntu 22.04 pull下来

$ docker pull –platform linux/arm64/v8 arm64v8/ubuntu:22.04

22.04: Pulling from arm64v8/ubuntu
0ec3d8645767: Pull complete
Digest: sha256:e59ca854700f0c80ac005a52585e2e594ba70dfe82fa4c5228db509163222444
Status: Downloaded newer image for arm64v8/ubuntu:22.04
docker.io/arm64v8/ubuntu:22.04

#构建java运行基础镜像

$ cd /d01/openJ9-0.53-dockers-arm64

$ docker build –platform linux/arm64/v8 -t ibm-semeru-runtimes:open-17-jdk .

5、#拷贝复制jar文件

打开/d01/batch_copy_jar_from_wsl_openj9.ps1

复制并在powershell窗口中粘贴,可完成拷贝。

6、#修改批量构建镜像的脚本

$ cd /d01

$ cp hzero-batch-build-dockerimage.sh hzero-batch-build-dockerimage-arm64.sh

$ vi hzero-batch-build-dockerimage-arm64.sh

更改构建命令部分,添加–platform linux/arm64/v8:

    # 执行Docker构建命令,并捕获结果

    if docker build –platform linux/arm64/v8 -t “$image_name:$VERSION” . >> “$LOG_FILE” 2>&1; then

7、#基于新的java基础镜像批量构建平台服务镜像

$ cd /d01

$ bash hzero-batch-build-dockerimage-arm64.sh

  • 更换中间件服务为arm64版

8.1 mysql

$ cd /d01/hzero-dockers/mysql-docker

$ vi Dockerfile

修改:

# 基于官方 MySQL 8 镜像

FROM –platform=linux/arm64/v8 mysql:8.4.7

# 设置 MySQL root 密码  ENV MYSQL_ROOT_PASSWORD=

ENV MYSQL_ALLOW_EMPTY_PASSWORD=yes

# 复制自定义配置文件到 MySQL 配置目录(配置文件无架构差异,无需修改)

COPY my_custom.cnf /etc/mysql/conf.d/

#构建mysql镜像

$ docker build –platform linux/arm64/v8 -t mysql-hzero-jk-demo:8.4.7 .

#下载 arm64版的minio

docker pull –platform linux/arm64/v8 minio/minio:RELEASE.2025-06-13T11-33-47Z

这个下载下来后,没有arm64标记,点进去看也是x_86的版本

$ docker compose up -d

$ docker exec -it minio-hzero uname -m

$ 显示的也是 x86_64

豆包说这是多架构的镜像,多架构镜像不会有arm64标记,至于说在镜像层看到的x86_64标记可能是镜像制作者“偷懒”没改掉,实际可能是arm64的,最终能判断的是容器启动后看docker exec -it minio-hzero uname -m返回的结果

另外:必须在docker-compose.yml中指定平台,否则默认就是启动当前架构(x86)的镜像:

#更改docker-compose.yml文件,指定平台:

## 要求Docker/Docker CE >= 19.x

services:

  minio-hzero:

    image: minio/minio:RELEASE.2025-06-13T11-33-47Z

    platform: linux/arm64/v8

    container_name: minio-hzero

$ docker compose up -d

启动命令执行后发现它主动去拉去镜像了,说明之前docker pull –platform linux/arm64/v8 minio/minio:RELEASE.2025-06-13T11-33-47Z 没有真实拉到arm64的镜像?

$ docker exec -it minio-hzero uname -m

确实启动后进入可以看到确实是arm64的架构:

#下载 arm64版的mongo:5.0.25

docker pull –platform linux/arm64/v8 mongo:5.0.25

#下载arm64版的neo4j

docker pull –platform linux/arm64/v8 neo4j:5.16.0

#下载arm64版的nginx:latest

docker pull –platform linux/arm64/v8 nginx:latest

#下载arm64版的onlyoffice/documentserver

docker pull –platform linux/arm64/v8 onlyoffice/documentserver:latest

#下载arm64版的redis:6-alpine(6-alpine标签下载失败,改成latest标签,不影响使用)

docker pull –platform linux/arm64/v8 redis:latest

#下载arm64版的elasticsearch:8.12.2

docker pull –platform linux/arm64/v8 elasticsearch:8.12.2

#实验发现:mongo,neo4j,nginx,onlyoffice,redis,elasticsearch  指定arm平台Pull之后,都没有arm64标记:

那就是应该认为,这些中间件都是多架构镜像,都要像minio一样在docker-compose.yml中指定平台:

platform: linux/arm64/v8

#redis 修改后启动

确认是arm64架构

其他几个:mongo,neo4j,nginx,onlyoffice,elasticsearch 也都这样修改,再启动验证

实验发现,这几个在启动的时候都有pulling的过程,说明之前直接执行pull命令没啥作用,关键还是要在docker-compose.yml启动文件中指定平台。

#下载arm64版的kkfileview

https://resource.kkview.cn/kkFileView-4.4.0-docker_aarch64.tar

$ docker load -i kkFileView-4.4.0-docker_aarch64.tar

#这个加载后是有arm64标记的

修改kkfileview的docker-compose.yml

#修改image:  image: keking/kkfileview_aarch64:4.4.0

9、2个python镜像:

#下载arm64版的hzero-hkms
docker pull –platform linux/arm64 registry.hand-china.com/hzero-public/hkms-python_arm64:1.6.1

注意:这个命令要在Linux安装的docker环境执行,汉得的这个制品库在WSL集成的Docker Desktop环境中执行报连不上,经测试不是用户名密码的问题,ping也能通,但就是连不上。

#下载arm64版的hzero-hype

docker pull –platform linux/arm64  registry.hand-china.com/hzero-public/hkms-python_arm64:1.6.1

注意:这个命令要在Linux安装的docker环境执行,汉得的这个制品库在WSL集成的Docker Desktop环境中执行报连不上,经测试不是用户名密码的问题,ping也能通,但就是连不上。

#hzero-hkms 镜像

$ cd /d01/hzero-dockers/hzero-hkms-docker

$ cp docker-compose.yml docker-compose.yml.x86

#编辑 docker-compose.yml

#更改:

image: registry.hand-china.com/hzero-public/hkms-python_arm64:1.6.1

#hzero-hype 镜像

$ cd /d01/hzero-dockers/hzero-hype-docker

$ cp docker-compose.yml docker-compose.yml.x86

#编辑 docker-compose.yml

#更改:

 image: registry.hand-china.com/hzero-public/haip-python-executor_arm64:0.2

10、更改save-dockers.sh  & Save Arm版镜像

$ cd /d01/hzero-docker-images-arm64

#更改 save-dockers.sh ,主要是两个python镜像名,kkfileview 镜像名要改,另外几个中加件原来用registry.hand-china.com的,改成直接用官方的了。其他不需要变。

#导出arm64版的镜像集合

$ bash save-dockers.sh

结果,有6个save未成功:

docker save -o mongo-hzero.tar mongo:5.0.25

docker save -o redis-hzero.tar redis:latest

docker save -o nginx-hzero.tar nginx:latest

docker save -o elasticsearch-hzero.tar elasticsearch:8.12.2

docker save -o neo4j-hzero.tar neo4j:5.16.0

docker save -o onlyoffice-hzero.tar onlyoffice/documentserver:latest

豆包分析是:问题根源:x86 Docker 对 arm64 镜像的元数据解析和文件存储不兼容,导致 “创建时间 N/A” 和 “导出失败”;

解决方案:无需解决,因为docker-compose.yml 中已经指定arm平台,且可以自动下载,都是官方镜像。

在save-dockers.sh 中注释掉这几个镜像

在load-dockers.sh 中去掉这几个镜像

#docker load -i mongo-hzero.tar

#docker load -i redis-hzero.tar

#docker load -i nginx-hzero.tar

#docker load -i elasticsearch-hzero.tar

#docker load -i neo4j-hzero.tar

#docker load -i onlyoffice-hzero.tar

  1. 打包

# 先删除jar文件

$ cd /d01
$ bash delete_jar_files.sh
# 再打包
$ tar -czvf hzero-dockers-arm64.tar.gz hzero-dockers

$ tar -czvf hzero-docker-images-openj9-0.53-arm64.tar.gz hzero-docker-images-arm64

  1. 备份下Ibm OpenJDK OpenJ9-0.53版 arm版的Java基础镜像

$ cd /d01/openJ9-0.53-dockers-arm64

$ docker save -o ibm-semeru-runtimes-open-17-jdk-openJ9-0.53-arm64.tar ibm-semeru-runtimes:open-17-jdk

三、后续工作

一、恢复到x86环境

1、#批量并执行-恢复到x86环境的shell脚本

$ cd /d01

$ bash batch_recovery_x86_env.sh

==============================

#!/bin/bash

#恢复中间件服务

cp -f /d01/hzero-dockers/redis-docker/docker-compose.yml.x86  /d01/hzero-dockers/redis-docker/docker-compose.yml

cp -f /d01/hzero-dockers/onlyoffice-docker/docker-compose.yml.x86  /d01/hzero-dockers/onlyoffice-docker/docker-compose.yml

cp -f /d01/hzero-dockers/nginx-docker/docker-compose.yml.x86  /d01/hzero-dockers/nginx-docker/docker-compose.yml

cp -f /d01/hzero-dockers/neo4j-docker/docker-compose.yml.x86  /d01/hzero-dockers/neo4j-docker/docker-compose.yml

cp -f /d01/hzero-dockers/mongo-docker/docker-compose.yml.x86  /d01/hzero-dockers/mongo-docker/docker-compose.yml

cp -f /d01/hzero-dockers/minio-docker/docker-compose.yml.x86  /d01/hzero-dockers/minio-docker/docker-compose.yml

cp -f /d01/hzero-dockers/elasticsearch-docker/docker-compose.yml.x86  /d01/hzero-dockers/elasticsearch-docker/docker-compose.yml

cp -f /d01/hzero-dockers/kkfileview-docker/docker-compose.yml.x86  /d01/hzero-dockers/kkfileview-docker/docker-compose.yml

#恢复hzero 两个python服务

cp -f /d01/hzero-dockers/hzero-hkms-docker/docker-compose.yml.x86  /d01/hzero-dockers/hzero-hkms-docker/docker-compose.yml

cp -f /d01/hzero-dockers/hzero-hype-docker/docker-compose.yml.x86  /d01/hzero-dockers/hzero-hype-docker/docker-compose.yml

#恢复Mysql

cp -f /d01/hzero-dockers/mysql-docker/Dockerfile.x86  /d01/hzero-dockers/mysql-docker/Dockerfile

2、#恢复x86版的Java运行环境基础镜像

cd /d01/openJ9-0.53-dockers

docker build -t ibm-semeru-runtimes:open-17-jdk .

3、#恢复加载X86版的Java服务和中间件镜像

$ cd /d01/hzero-docker-images

$ bash load-dockers.sh

#或者先拷贝jar文件再批量构建

#在Windows powershell 窗口中粘贴batch_copy_jar_from_wsl_openJ9.ps1中的内容,然后

#构建x86版Java服务镜像和mysql镜像

$ cd /d01

$ bash hzero-batch-build-dockerimage-arm64.sh

$ cd /d01/hzero-dockers/mysql-docker

$ docker build -t mysql-hzero-jk-demo:8.4.7 .

二、批量切换到arm64环境

1、#批量并执行-切换到arm64环境的shell脚本

$ cd /d01

$ bash batch_switch_to_arm64_env.sh

==============================

#!/bin/bash

#切换到arm64版中间件服务

cp -f /d01/hzero-dockers/redis-docker/docker-compose.yml.arm64  /d01/hzero-dockers/redis-docker/docker-compose.yml

cp -f /d01/hzero-dockers/onlyoffice-docker/docker-compose.yml.arm64  /d01/hzero-dockers/onlyoffice-docker/docker-compose.yml

cp -f /d01/hzero-dockers/nginx-docker/docker-compose.yml.arm64  /d01/hzero-dockers/nginx-docker/docker-compose.yml

cp -f /d01/hzero-dockers/neo4j-docker/docker-compose.yml.arm64  /d01/hzero-dockers/neo4j-docker/docker-compose.yml

cp -f /d01/hzero-dockers/mongo-docker/docker-compose.yml.arm64  /d01/hzero-dockers/mongo-docker/docker-compose.yml

cp -f /d01/hzero-dockers/minio-docker/docker-compose.yml.arm64  /d01/hzero-dockers/minio-docker/docker-compose.yml

cp -f /d01/hzero-dockers/elasticsearch-docker/docker-compose.yml.arm64  /d01/hzero-dockers/elasticsearch-docker/docker-compose.yml

cp -f /d01/hzero-dockers/kkfileview-docker/docker-compose.yml.arm64  /d01/hzero-dockers/kkfileview-docker/docker-compose.yml

#切换到arm64版 hzero 两个python服务

cp -f /d01/hzero-dockers/hzero-hkms-docker/docker-compose.yml.arm64  /d01/hzero-dockers/hzero-hkms-docker/docker-compose.yml

cp -f /d01/hzero-dockers/hzero-hype-docker/docker-compose.yml.arm64  /d01/hzero-dockers/hzero-hype-docker/docker-compose.yml

#切换到arm64版Mysql

cp -f /d01/hzero-dockers/mysql-docker/Dockerfile.arm64  /d01/hzero-dockers/mysql-docker/Dockerfile

2、#切换到arm64版的Java运行环境基础镜像

cd /d01/openJ9-0.53-dockers-arm64

docker build –platform linux/arm64/v8 -t ibm-semeru-runtimes:open-17-jdk .

3、#切换到arm64版hzero java和中间件服务镜像

$ cd /d01/hzero-docker-images-arm64

$ bash load-dockers.sh

#或者先拷贝jar文件再批量构建

#在Windows powershell 窗口中粘贴batch_copy_jar_from_wsl_openJ9.ps1中的内容,然后

#构建Arm64版Java服务镜像和mysql镜像

$ cd /d01

$ bash hzero-batch-build-dockerimage-arm64.sh

$ cd /d01/hzero-dockers/mysql-docker

$ docker build –platform linux/arm64/v8 -t mysql-hzero-jk-demo:8.4.7 .

#faq-section

四、实测问题

问题1:访问注册中心服务的网页速度很慢的问题

原因:同事的mac版Docker Desktop设置里面分配的内存太少(默认是8G)

解决:在Docker的设置/资源管理处把内存调整到30G后速度很快,问题解决。

问题2:启动服务时发现oauth服务的8021端口被占用,导致该服务启动失败

这个8021端口冲突问题在MAC上比较常见
现象:docker start  hzero-oauth

Error response from daemon: ports are not available: exposing port TCP 0.0.0.0:8021 -> 127.0.0.1:0: listen tcp 0.0.0.0:8021: bind: address already in use

Error: failed to start containers: hzero-oauth

可以用如下命令查看8021被什么程序占用?

PID=$(lsof -t -i tcp:8021) && if [ -n “$PID” ]; then ps -ef | grep “$PID”; else echo “端口 8021 未被占用”; fi

之前已经发现的原因有:
原因1:有同学发现是因为Docker Desktop本身的进程占用了该端口。

解决:重启Docker Desktop之后问题解决,因为该端口也是随机占用的端口。

原因2:也有同学发现是ftp-proxy占用了这个端口

解决:临时停止ftp-proxy
$ sudo launchctl tootout system/com.apple.ftp-proxy

#再次确认端口情况

$ sudo lsof-l :8021

#长期解决方案:鉴于8021端口在MAC环境冲突概率很高,所以改成18021端口:

#源环境:更改端口,重新build oauth服务 jar包

# windows powershell中

cp \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\hzero\project\ps-oauth\target\ps-oauth.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-oauth-docker\

# 加载arm64版java base镜像

cd /d01/openJ9-0.53-dockers-arm64

docker load -i ibm-semeru-runtimes-open-17-jdk-openJ9-0.53-arm64.tar

#切换到arm64环境

cd /d01

bash batch_switch_to_arm64_env.sh

#重新构建oauth服务docker镜像

cd /d01/hzero-dockers/hzero-oauth-docker

docker build –platform linux/arm64/v8 -t hzero-oauth-jk-demo:1.12 .

#更改docker-compose.yml文件

#把8021端口映射改成18021端口

#导出镜像

cd  /d01/hzero-docker-images-arm64

docker save -o hzero-oauth-docker.tar hzero-oauth-jk-demo:1.12

#删除jar包

rm -f /d01/hzero-dockers/hzero-oauth-docker/ps-oauth.jar

#重新打包hzero-dockers

cd /d01

tar -czvf hzero-dockers-arm64.tar.gz  hzero-dockers

#重新打包hzero-docker-images-arm64

cd /d01

tar -czvf hzero-docker-images-openj9-0.53-arm64.tar.gz  hzero-docker-images-arm64

==========

恢复x86环境

# 加载x86版java base镜像

cd /d01/openJ9-0.53-dockers

docker load -i ibm-semeru-runtimes-open-17-jdk-openJ9-0.53-x86.tar

#切换到x86环境

cd /d01

bash batch_recovery_x86_env.sh

备注:在2026.01.08提交的安装文件中,已经改成18021端口。

问题3:登录时要求验证码,提示错误:缺少字体

NullPointerException: Cannot invoke

“java.awt.Font.deriveFont(java.awt.geom.Affine Transform)”

because “this.clickWord Font” s null

原因:arm64版ubuntu 22.04 默认没有安装验证码所需字体(但该问题在x86/amd64版的ubuntu 22.04上不存在)

解决方案:先进入容器安装字体,然后进入hzero平台系统之后,在界面上把验证码设置关闭掉。

#进入 oauht服务的容器

docker exec -it hzero-oauth bash

# 更新软件源

sudo apt update

# 安装字体相关包(对应CentOS的fontconfig、dejavu字体)

sudo apt install -y fontconfig fonts-dejavu-core fonts-dejavu-extra

# 更新字体缓存(和CentOS的fc-cache命令一致)

fc-cache -fv

#完成上述字体安装后,再次登录hzero平台,多刷新几次可以成功登录;

登录后,在hzero平台系统设置的安全设置中,去掉验证码设置。

问题解决。

进一步思考:既然是hzero-oauth服务的容器缺少字体,那么在java基础运行环境镜像构建的时候把 fontconfig fonts-dejavu-core fonts-dejavu-extra 一并加上就可一劳永逸解决问题了。

于是就开始修改Dockfile ,添加字体,重新构建,但失败了,只要加上这个内容,就构建失败,当然可能是因为放在同一层构建才导致失败? 再尝试放在单独层构建,也同样失败,看起来这字体想在镜像中直接加上是难以成功了。先这样吧,以后再说。

成功登录系统之后,更改系统设置:  在平台菜单/系统管理/安全设置 处,把验证码设置为非必须。

备注:在2026.01.06提交的安装文件中,已经预先更改系统设置:  在平台菜单/系统管理/安全设置 处,把验证码设置为非必须。

2026/01/09 因为有同事发现hzero-report服务启动时缺少libfreetype6字体文件而导致启动错误,在x86环境已经在Java基础镜像构建时添加了这个字体而解决了问题,现在arm64也得解决这个问题,也就是添加字体在arm64环境还是必须解决。

刚开始在按豆包的各种建议/试错循环折腾了半小时,没解决问题,主要还是x86上运行arm64构建的兼容问题,虽然之前也成功执行过,但一旦碰到需要在镜像内运行的指令时就会出问题,这个时候错误信息给豆包,豆包就会建议更改镜像中lib库的更新源,但更新这些东西实际解决不了问题,后来按照元宝建议,执行:

docker run –rm –privileged multiarch/qemu-user-static –reset -p yes

这个可以下载arm64的模拟器,而且对windows Docker Desktop来说,支持那个该指令可以持久化,不需要每次重启再执行,更妙的是后面运行docker 构建镜像的命令,docker Desktop会自动识别,按照需要决定是否需要启动这个多架构模拟器,也就是我可以自由的在x86机器上顺利构建x86和arm64镜像。

使用这种方法后,把fontconfig fonts-dejavu-core fonts-dejavu-extra加到之前的Dockerfile, 再次构建就成功了。

Jack.Shang的技术博客

然后我就可以重新构建arm64版的hzero-report 镜像和hzero-oauth镜像,就永久解决这个问题了。

问题4:AIGC中台/Agent编排/编排测试 出现会话链接失败的错误

新建一个Agent编排,保存后,点上方的“编排测试” 结果出现 “会话链接失败,请联系管理员”的错误:

前端错误:

connection to ‘ws://aigc.hzero.com.cn/websocket?access_token=c45eaa37-5af6-41ed-aef5-bbd9c4ec995f&appSessionId=ea30a822-33fa-4cd0-a6e2-e4243de14025&interactionFlowCode=ZTEST_SAP_001&appFlowVersionNum=3&processorKey=interaction-pc&tenantId=2’ failed:

分析:

查看后台hzero-aip-app服务的日志,错误提示:

org.springframework.web.server.ServerWebInputException: 400 BAD_REQUEST “Invalid ‘Upgrade’ header: [X-Real-IP:”172.18.0.1″, Host:”aigc.hzero.com.cn”, X-Forwarded-For:”172.18.0.1″, Connection:”close”, Pragma:”no-cache”, Cache-Control:”no-cache”, User-Agent:”Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0″, Origin:”http://dev.hzero.com.cn”, Sec-WebSocket-Version:”13″, Accept-Encoding:”gzip, deflate”, Accept-Language:”zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6″, Sec-WebSocket-Key:”bBfD+JwcSTroPEwfkFnziA==”, Sec-WebSocket-Extensions:”permessage-deflate; client_max_window_bits”]”

问题给豆包,豆包说:

核心原因:Upgrade 头被代理 / 网关错误覆盖或过滤,导致其值不是 websocket 而是其他请求头的集合;

关键修复:代理(Nginx)需配置 proxy_set_header Upgrade $http_upgrade 和 proxy_set_header Connection “upgrade”,网关需保留 WebSocket 相关头部;

解决方案:

在nginx.conf 中添加配置(hzero-dockers\volumes\nginx\nginx.conf):

在反向代理前面增加:

# 添加WebSocket支持

map $http_upgrade $connection_upgrade {

    default upgrade;

    “” close;

}

在反向代理中增加:

          # 添加WebSocket支持

          proxy_http_version 1.1;

          proxy_set_header Upgrade $http_upgrade;

          proxy_set_header Connection $connection_upgrade;

更改后重启nginx服务

$ cd /d01/hzero-dockers/nginx-docker && docker compose down && docker compose up -d

然后再次访问编排页面,就正常了:

这个问题是之前非docker环境迁移docker环境时漏掉的配置,之前非docker环境中,在/etc/nginx/sites-available/default中 反向代理是这么配置的:

# aigc.hzero.com.cn 专用服务器

server {

    listen 80;

    server_name aigc.hzero.com.cn;

    location / {

        # 改为后端服务实际IP:端口

        proxy_pass http://127.0.0.1:8088;  # 示例:假设后端在本机8088

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection “upgrade”;

        proxy_set_header Host $host;  # 保留一个Host配置

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_buffering off;  # 按需开启/关闭(实时交互场景建议关闭)

    }

}

迁移到Docker环境后,由于$http_upgrade 变量缺少,当时为了启动Nginx,直接把这两行删除掉了:

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection “upgrade”;

后来测试容器环境的时候只是测试了对话应用和知识库问答应用,但因为对话应用和知识库问答应用走的是SSE协议,没有走WS协议,所以就没发现问题。但编排应用会走WS协议,所以测试编排应用的时候就会发现问题。而且原来在default中的设置也不规范,有隐藏风险:

  • 如果客户端请求全是 WebSocket(必然带 Upgrade: websocket 头),硬编码 Connection: upgrade 完全匹配需求;
  • 只有当同一 location 同时处理「WebSocket 请求」和「普通 HTTP 请求」时,硬编码才会出问题(普通 HTTP 请求不需要 Connection: upgrade,会导致协议异常)。

问题已经更正。

备注:在2026.01.06提交的安装文件中,已经包含了更正过的nginx.conf配置文件了。

HZERO PaaS平台组装笔记(十六)使用IBM OpenJDK_OpenJ9


有同事告诉我换个jdk,使用IBM OpenJDK_OpenJ9(内置OpenJ9 JVM),不仅可以大幅减少内存使用,还可以大幅加快启动速度。

那我们就来实验一下。

一、WSL中jar方式运行微服务,替换成ibm OpenJDK_OpenJ9(内置openJ9 JVM)

Windows PowShell中

#关闭虚拟机

$ wsl –shutdown

#从备份新建虚拟机实例

$ wsl –import Ubuntu-2204-hzero-openjdk D:\wsl\Ubuntu-2204-hzero-openjdk D:\wsl\Ubuntu-22.04-hzero-backup20251225.tar –version 2

#查看导入新建结果

$ wsl –list –verbose 

下载openj9-jdk

Semeru Runtime Downloads – IBM Developer

同事说要下载 java17 的0.53版的JDK,他测试过0.56版不稳定。

打开Ubuntu-2204-hzero-openjdk虚拟机

#创建目录

$ mkdir -p /d02/openjdk

#拷贝下载的jdk到虚拟机(powshell中):

$ cp C:\Users\A\Downloads\ibm-semeru-open-jdk_x64_linux_17.0.16_8_openj9-0.53.0.tar.gz  \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\openjdk\

#解压缩

$ tar -zxvf ibm-semeru-open-jdk_x64_linux_17.0.16_8_openj9-0.53.0.tar.gz

# 注册java命令(优先级100,确保优先使用) sudo update-alternatives –install /usr/bin/java java /d02/openjdk/jdk-17.0.16+8/bin/java 100

# 注册javac命令(JDK开发工具,必须配置) sudo update-alternatives –install /usr/bin/javac javac /d02/openjdk/jdk-17.0.16+8/bin/javac 100

# 配置默认java

sudo update-alternatives –config java

# 配置默认javac

sudo update-alternatives –config javac

# 编辑用户环境变量文件 nano ~/.bashrc

# 在文件末尾添加以下内容(直接复制,路径已匹配)

export JAVA_HOME=/d02/openjdk/jdk-17.0.16+8

export PATH=$JAVA_HOME/bin:$PATH

#使配置立即生效

source ~/.bashrc

#执行以下命令,输出版本为 17.0.16 即说明配置完成:

# 验证java版本 java -version

# 验证javac版本(确认JDK生效,而非仅JRE) javac -version

# 验证JAVA_HOME(输出/d02/openjdk/jdk-17.0.16+8) echo $JAVA_HOME

$ java –version

openjdk 17.0.16 2025-07-15

IBM Semeru Runtime Open Edition 17.0.16.0 (build 17.0.16+8)

Eclipse OpenJ9 VM 17.0.16.0 (build openj9-0.53.0, JRE 17 Linux amd64-64-Bit Compressed References 20250715_1115 (JIT enabled, AOT enabled)

OpenJ9   – 017819f167

OMR      – 266a8c6f5

JCL      – 34b4be01e57 based on jdk-17.0.16+8)

$ javac -version

javac 17.0.16

$ echo $JAVA_HOME

/d02/openjdk/jdk-17.0.16+8

配置完成后,是否需要重新构建jar?

我原来用的是:

download.oracle.com/otn/java/jdk/17.0.15%2B9/4f092786cec841d58ae21840b10204d7/jdk-17.0.15_linux-x64_bin.tar.gz

现在换成了:

github.com/ibmruntimes/semeru17-binaries/releases/download/jdk-17.0.16%2B8_openj9-0.53.0/ibm-semeru-open-jdk_x64_linux_17.0.16_8_openj9-0.53.0.tar.gz

豆包回答不需要,这次是 同大版本(JDK 17)下的不同发行版更换:从 Oracle JDK 17.0.15 换成 IBM Semeru OpenJDK 17.0.16(带 OpenJ9 虚拟机),这种情况完全不需要重新打包 Jar 包,直接运行即可。

按照同事建议把启动命令所有服务的run_nobuild.sh中min内存设置到128,max保持原来不变。

#启动AI平台服务WSL的30G内存只消耗了17G;

free
total used free shared buff/cache available
Mem: 30802096 17835312 8845568 4624 4121216 12614252
Swap: 8388608 1353216 7035392

再启动低代码3个服务和流程平台1个服务之后,内存消耗增加到21G:

free
total used free shared buff/cache available
Mem: 30802096 21955264 4002200 4632 4844632 8487744
Swap: 8388608 1353216 7035392

再启动集成平台2个服务之后,内存消耗增加到23G

free
total used free shared buff/cache available
Mem: 30802096 23421660 2250812 4632 5129624 7020308
Swap: 8388608 1353216 7035392

而如果使用Oracle的 JDK,但启动AI平台服务就消耗了29G内存,基本把我的WSL虚拟机分配的内存消耗完了,(备注:使用Oracle JDK的WSL虚拟机中所有服务的run_nobuild.sh中min内存也都是设置到128的)。

Oracle JDK,但启动AI平台服务的情况:

$ free
total used free shared buff/cache available
Mem: 30802096 29730108 271104 4456 800884 731628
Swap: 8388608 2041832 6346776

我的笔记本内存40G,因为Windows及常用软件要用掉7~8G,所以我给WSL虚拟机分配了30G内存,以前使用Oracle JDK的时候,单启动一个AI平台就基本把WSL内存耗光了,所以使用AI平台和低代码平台的时候不得不来回关闭相应的服务做切换,现在我把AI平台、低代码平台、集成平台全部启动也才消耗24G,完全不用切换。

除了注册中心服务之外,这三个平台总共起了24个Java服务:

备注:这里遇到个问题,就是刚开始发现hzero-jar服务的侦听IP地址是个10开头的LO地址(用ip a 命令可以看),经检查发现是bootstrap.yml配置有问题,少了spring一级,导致对网卡的忽略配置没起作用,后来更改配置后就正常了。

还有4个docker容器:

这么多服务总共消耗24G内存:

free
total used free shared buff/cache available
Mem: 30802096 24281896 987392 4696 5532808 6152440
Swap: 8388608 1353216 7035392

所有服务启动完成后,CPU消耗也很小:

所以,上述实验结果表明:差异这么大,确实用同事推荐的IBM的open jdk做Demo实验环境是明智选择了。

遇到一个问题lowcodedata服务启动失败:

错误信息是:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘org.springframework.cache.annotation.ProxyCachingConfiguration’: No bean named ‘org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry’ available

分析:这个服务很简单,之前启动也没啥问题,应该不是配置或者依赖导致的问题。

解决方案:重启服务

结果:服务启动成功。这个情况在之前oracle JDK的时候没碰到过,所以是不稳定的原因吗?

问了豆包:说法是:

核心原因:Spring 容器启动时importRegistry Bean 初始化时序滞后,导致缓存配置依赖缺失(偶发,非服务不稳定);

重启恢复的本质:启动时的资源 / 时序条件变化,让 Bean 初始化顺序 “对齐” 了;

根治方案: 提高 JVM 内存;

不过,我们是Demo实验环境,稳定性要求不高,如果因为这个问题导致服务启动失败就针对失败的服务,重新启动一下,JVM内存就先不改了。可以接受。

二、基于IBM OpenJ9+OpenJDK制作Docker镜像

OpenJ9 本身就是为 “低内存占用” 设计的轻量级 JVM,果然是名不虚传。

问豆包:我想重新为这些微服务打包Docker镜像,需要一个包含 IBM Semeru OpenJDK 17.0.16环境的linux基础镜像,你可以提供下吗?

豆包说:可以直接使用 IBM 官方提供的 Semeru OpenJDK 17 镜像(内置 OpenJ9)作为基础镜像

# 拉取IBM官方Semeru OpenJDK 17镜像(内置OpenJ9,匹配你的版本)

FROM ibm-semeru-runtimes:open-17-jdk

看这个镜像的具体信息:是openJDK 17.0.17 + OpenJ9-0.56的:

OpenJ9 是IBM对JVM的一个实现,之前同事说0.56他测试下来有问题,sleep失效,导致涉及schedule的cpu全炸了。经询问元宝,说是open JDK 17.0.56这个版本的问题,并非IBM OpenJ9 0.56这个JVM的问题。 跟openJ9 JVM没有关系,这个bug是open JDK 17.0.56引入的,并在open JDK 17.0.57中被修复,只要避开open JDK 17.0.56就行。

先重构一个测试下:

在运行Docker的WSL中:

$ cd /d01/hzero-dockers/hzero-admin-docker

#编辑Dockerfile

基础镜像更改为:FROM ibm-semeru-runtimes:open-17-jdk

#拷贝Jar包到目标环境

#在windows powershell 中执行

$ cp \\wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-admin\target\ps-admin.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-admin-docker\

8.构建Docker镜像

$ cd /d01/hzero-dockers/hzero-admin-docker

$ docker build -t hzero-admin-jk-demo:1.12 .

然后先把mysql,redis,register三个容器启动,再启动这个重构后的admin容器,可以正常启动:

类似的方式完成其他容器的重构,重构后启动HZERO基础开发平台+AI平台;然后在docker Desktop中观察资源消耗:

之前听说,标准的HotSpot JVM, 是性能优先的JVM,是OpenJDK官方推荐的。 如果内存不够要换成OpenJ9的JVM,那个是内存节约优先的。比较起来确实如此,详情如下:

图1- 平台启动后,使用社区OpenJDK 默认的HotSpot JVM 的资源消耗情况(内存消耗多,CPU消耗少):

图2- 平台启动后,使用IBM OpenJDK-OpenJ9  JVM 的资源消耗情况(内存消耗少,CPU消耗大)

这是启动了HZERO 基础开发平台+AI平台后的资源消耗,CPU最低维持在46%,内存在21G

增加启动低代码平台后,CPU消耗最低维持在68%,内存消耗不大,只增加了2个多G

再增加集成平台后,CPU消耗并未显著增加,内存增加1G

关掉AI平台+集成平台仅保留HZERO基础开发平台+低代码平台CPU消耗未显著降低,内存消耗17G:

运行速度上,首次加载界面比使用社区版OpenJDK(带默认HotSport)慢。 但好处是像我这样使用联想昭阳40G内存的笔记本可以把主要平台全跑起来。

做Demo环境的话,要体验好就用官方社区版的OpenJDK(HotSport JVM),性能好;如果内存有限,又想多起几个平台就用IBM OpenJDK(OpenJ9 JVM)

结合之前非Docker环境的运行数据,结论是: Docker+OpenJ9 组合对CPU消耗大;  Docker+HotSport组合对CPU消耗小,但直接在linux+OpenJ9  Jar包运行就没有CPU消耗大的缺点了。

三、基于OpenJ9 – 0.53 与0.56的差异研究

直接在linux+OpenJ9  0.53  Jar包运行就没有CPU消耗大的缺点,服务启动完成后,CPU基本接近零,不会像上面Docker环境运行这样长期处在50%左右。Docker环境用的OpenJ9 是0.56的,CPU消耗很大,这种CPU消耗方面的巨大差异可能是这个OpenJ9的版本差异导致的吗?

实验一下,在linux+OpenJ9  0.56  Jar包运行看看CPU消耗是否会变大?

下载openj9-jdk

Semeru Runtime Downloads – IBM Developer

这次下载 java17 的0.56版的JDK。

打开Ubuntu-2204-hzero-openjdk虚拟机

#拷贝下载的jdk到虚拟机(powshell中):

$ cp C:\Users\A\Downloads\ibm-semeru-open-jdk_x64_linux_17.0.17_10_openj9-0.56.0.tar.gz  \\wsl.localhost\Ubuntu-2204-hzero-openjdk\d02\openjdk\

#解压缩

$ tar -zxvf ibm-semeru-open-jdk_x64_linux_17.0.17_10_openj9-0.56.0.tar.gz

# 注册java命令(优先级100,确保优先使用) sudo update-alternatives –install /usr/bin/java java /d02/openjdk/jdk-17.0.17+10/bin/java 100

# 注册javac命令(JDK开发工具,必须配置) sudo update-alternatives –install /usr/bin/javac javac /d02/openjdk/jdk-17.0.17+10/bin/javac 100

# 配置默认java

sudo update-alternatives –config java

# 配置默认javac

sudo update-alternatives –config javac

# 编辑用户环境变量文件 nano ~/.bashrc

# 在文件末尾添加以下内容(直接复制,路径已匹配)

export JAVA_HOME=/d02/openjdk/jdk-17.0.17+10

export PATH=$JAVA_HOME/bin:$PATH

#使配置立即生效

source ~/.bashrc

#执行以下命令,输出版本为 17.0.17.0 即说明配置完成:

# 验证java版本 java -version

# 验证javac版本(确认JDK生效,而非仅JRE) javac -version

# 验证JAVA_HOME(输出/d02/openjdk/jdk-17.0.17+10) echo $JAVA_HOME

$ java –version

javac 17.0.17

root@desktop-jacksen:/d02/openjdk# echo $JAVA_HOME

/d02/openjdk/jdk-17.0.17+10

root@desktop-jacksen:/d02/openjdk#  java –version

openjdk 17.0.17 2025-10-21

IBM Semeru Runtime Open Edition 17.0.17.0 (build 17.0.17+10)

Eclipse OpenJ9 VM 17.0.17.0 (build 17.0.17+10-openj9-0.56.0, JRE 17 Linux amd64-64-Bit Compressed References 20251021_1193 (JIT enabled, AOT enabled)

OpenJ9   – 14b3b2de26

OMR      – d4c7e3040

JCL      – 7c916e0ce44 based on jdk-17.0.17+10)

启动所有服务:

$ cd /d02

$ bash service-all-start.sh

启动完成半小时后,CPU依然降不下来:

那看起来确实openJ9 0.56的问题,因为openJ9 0.53 在启动完成后,CPU会快速下降到1~3%附近。

我们再切回OpenJ9 0.53看看

$ cd /d02

$ bash service-all-stop.sh

# 配置默认java

sudo update-alternatives –config java

# 配置默认javac

sudo update-alternatives –config javac

#选择:/d02/openjdk/jdk-17.0.16+8/bin/java

# 编辑用户环境变量文件 nano ~/.bashrc

# 在文件末尾添加以下内容(直接复制,路径已匹配)

export JAVA_HOME=/d02/openjdk/jdk-17.0.16+8

export PATH=$JAVA_HOME/bin:$PATH

#使配置立即生效

source ~/.bashrc

再重启服务:

$ cd /d02

$ bash service-all-start.sh

启动完成后,CPU消耗维持在10%左右:

这个实验说明确实是openJ9 0.56 比0.53对CPU的消耗要严重的多。

那我们要改造Docker镜像:  ibm-semeru-runtimes:open-17-jdk,因为dockerhub上的镜像都是0.56的

#构建Dockfile

#=====================================

FROM ubuntu:22.04

ENV TZ=UTC \

    LANG=en_US.UTF-8 \

    JAVA_HOME=/opt/java/openjdk \

    PATH=/opt/java/openjdk/bin:$PATH

RUN apt-get update \

    && DEBIAN_FRONTEND=noninteractive apt-get install -y –no-install-recommends \

       libc6 libstdc++6 zlib1g ca-certificates \

    && apt-get clean \

    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

RUN mkdir -p ${JAVA_HOME} && chmod -R 755 ${JAVA_HOME}

COPY ibm-semeru-open-jdk_x64_linux_17.0.16_8_openj9-0.53.0.tar.gz /tmp/

RUN cd ${JAVA_HOME} \

    && tar -xvf /tmp/ibm-semeru-open-jdk_x64_linux_17.0.16_8_openj9-0.53.0.tar.gz –strip-components=1 \

    && rm -f /tmp/*.tar.gz \

    && rm -rf ${JAVA_HOME}/docs \

    && rm -rf ${JAVA_HOME}/lib/src.zip \

    && rm -rf ${JAVA_HOME}/legal \

    && rm -rf ${JAVA_HOME}/man \

    && java -version

CMD [“java”, “–version”]

#===============================================

#构建0.53版的Java基础镜像

$ cd /d01/openJ9-0.53-dockers

$ docker build -t ibm-semeru-runtimes:open-17-jdk .

拷贝《批量拷贝jar文件到目标Docker构建环境.-from-openJ9.txt》中的内容到powershell, 实现Jar复制。

#基于新的java基础镜像批量构建平台服务镜像

$ cd /d01

$ bash hzero-batch-build-dockerimage.sh

#启动服务

$ cd /d01/hzero-dockers

$ bash start-all-dockers.sh

看CPU消耗:所有服务启动完成后CPU消耗低于10%

操作速度也还可以:

用一段时间后CPU消耗也未上升:

四、16G笔记本运行方案:

问题:如果你的笔记本只有16G内存怎么办?

答:可以跑阉割版HZERO基础开发平台+低代码平台,这个版本去掉了KKfileView文件预览服务、onlyoffice文件在线编辑服务、预警服务、事件服务、动态jar管理服务。保留了基础服务(注册中心服务、网关服务、平台治理服务、系统/开发管理服务、身份认证服务、权限认证服务、License服务、文件服务、消息服务、并发管理服务、报表服务、接口平台服务)和三个低代码服务(模型服务、低代码管理服务、自定义领域低代码数据服务),总内存消耗在10G左右,16G内存的笔记本可以跑起来。

该版本下载地址:

通过网盘分享的文件:hzero-demo-docker-openJ9

链接: https://pan.baidu.com/s/1atCVvaDxlR2LHhixVo3Q0Q?pwd=Hand  提取码: Hand (总文件大小:大约24G, 建议使用百度超级会员下载大约20分钟,普通用户则会比较慢)

需下载文件说明:

  1. Docker镜像包压缩目录:hzero-docker-images,包含所有服务的Docker镜像。
  2. 持久化数据压缩包文件:hzero-dockers.tar.gz,包括数据库文件、配置文件、启停服务脚本。

一、进入 hzero-docker-images,运行load-dockers.sh脚本,完成所有镜像的加载

$ cd  hzero-docker-images

$ bash load-dockers.sh

二、下载并解压缩hzero-dockers.tar.gz,替换nginx配置并启动服务:

$ tar -xzvf hzero-dockers.tar.gz

# 替换nginx.conf(使用没有反向代理的配置)

$ cd hzero-dockers/volumes/nginx

$ cp -f nginx.conf.min nginx.conf

启动服务:

$ cd hzero-dockers

$ bash lowcode-min-dockers-start.sh

关闭服务命令:

$ cd hzero-dockers

$ bash lowcode-min-dockers-stop.sh

三、访问系统,请参考 Jack.Shang的技术博客 » HZERO PaaS平台-Docker版demo笔记(五)安装部署readme (http://blog.retailsolution.cn/archives/5006)第三部分:访问系统。

HZERO PaaS平台-Docker版demo笔记(五)安装部署readme

最新更新:2026/07/04

本文是HZERO PaaS平台-Docker版Demo 实验环境的readme文件

说明:本实验环境版本仅供个人测试用,企业开发、测试、正式环境不要用,企业用平台可参考汉得开放平台上各产品的官方文档去安装。

HZERO PaaS 平台介绍:

HZERO 是汉得企业级 PaaS平台, 本HZERO PaaS 平台 R12 Demo实验环境 Docker版  是基于汉得HZERO 基础开发平台1.12.2.RELEASE、流程平台1.20.0-1.12.RELEASE版、低代码平台2.10.0-1.12.RELEASE版、集成平台1.8.1.RELEASE,AI平台 1.6.1.ALPHA.7.1 版本组装而成。

一、安装准备-下载文件:

先下载文件:

百度网盘分享的文件:hzero-demo-docker-openJ9

链接: https://pan.baidu.com/s/1atCVvaDxlR2LHhixVo3Q0Q?pwd=Hand  提取码: Hand (下载镜像压缩包目录和持久化数据压缩包文件,大小约24G, 建议使用百度网盘SVIP会员下载大约20分钟。普通用户则会非常慢(100K/秒),没有也不想申请短期百度网盘SVIP会员的用户可考虑用阿里云快传下载,速度稍快(大概1M/秒),缺点是只有一天有效期,请联系作者索要临时的阿里云快传链接。)

需下载文件说明(x86的Cpu用户,在x86目录下):

  1. Docker镜像包目录:hzero-docker-images,包含所有服务的Docker镜像。
  2. 持久化数据压缩包文件:hzero-dockers.tar.gz,包括数据库文件、配置文件、启停服务脚本。

备注:如果使用基于M系列芯片的Mac电脑用户,CPU架构是arm64的,请下载对应的arm版文件:

下载 hzero-docker-images-arm64目录 替代hzero-docker-images目录

下载 hzero-dockers-arm64.tar.gz 替代hzero-dockers.tar.gz

Arm版 Mac电脑在安装时,需要注意 Docker默认分配内存比较小,会导致服务起不来或者非常慢,请提前分配好Docker的内存到25G(跑全部服务)或者11G(仅跑精简版基础开发平台+低代码平台)


二、安装准备:Docker环境

先安装Docker 和Docker compose

安装场景:

1.1 如果你是直接在linux平台上安装,先安装Docker 再装docker compose

安装方法:请在豆包中输入:“请给我 linux 上先装Docker 再装 新版Compose 的操作步骤”

然后按豆包给出步骤操作即可。

备注:务必安装新版的docker compose, 重点

老版本:指 docker-compose(v1 系列),基于 Python 开发的独立命令行工具,命令是: docker-compose
新版本:指 docker compose(v2 系列),基于 Go 语言重构的 Docker CLI 插件,命令是:docker compose
新版本(v2)在权限处理逻辑上更贴合 Docker 原生行为,老版本(v1)因架构问题易出现权限不一致的情况。
权限问题的核心根源:

Docker Compose 本身不直接控制 “容器内用户权限”,而是负责解析配置、调用 Docker 引擎创建容器;权限最终由 Docker 引擎决定,但新老版本的调用方式 / 时机不同,导致了权限表现的差异:
老版本(v1,Python 实现):docker-compose 是独立 Python 进程,创建挂载目录时,会以宿主机执行 docker-compose 命令的用户(通常是 root / 当前普通用户)权限在宿主机创建目录,而非容器内指定的用户。比如:容器内用 user: 1000:1000 运行,但宿主机的挂载目录会被 docker-compose 以 root 权限创建(权限 755,属主 root:root),容器内 1000 用户可能无法写入。

新版本(v2,Go 实现):docker compose 作为 Docker CLI 插件,直接调用 Docker 引擎的 API,挂载目录的创建逻辑完全交给 Docker 引擎处理—— 而 Docker 引擎会根据容器内指定的 user/group 适配权限(或保持与宿主机一致),更符合开发者预期。


1.2 如果你是在windows上使用WSL, 那么直接安装Docker Desktop(包含Docker引擎和Docker compose, 且为可视化管理),然后再做WSL跟Docker Desktop的集成即可(在Docker Desktop的右上角的Setting齿轮/Resoures/WSL intergration 处把要集成的WSL开关设置为开 )

安装方法:请在豆包中输入:“请给我Windows安装Docker Desktop 的操作步骤”

然后按豆包给出步骤操作即可。

安装完成后做WSL跟Docker Desktop的集成。

说明:WSL是windows的linux子系统,如果不知道如何启用WSL,请在豆包中输入:“请给我在Windows中启用WSL的操作步骤”

然后按豆包给出的步骤操作即可。

三、加载Docker镜像

以root用户 操作:

进入 hzero-docker-images目录,运行load-dockers.sh脚本,完成所有服务镜像的加载

$ cd  hzero-docker-images

$ bash load-dockers.sh

四、启动/关闭平台服务

在linux系统下,解压缩 持久化数据压缩包文件 ,例如:

tar -xzvf hzero-dockers.tar.gz

备注:务必在linux系统下解压,这样可以保留目录权限,不要在windows目录下解压再拷贝到linux,会因为权限问题报错。

启动HZERO PaaS平台(基础开发平台+低代码平台+集成平台+AI平台)服务:

$ cd hzero-dockers

$ bash start-all-dockers.sh

#全部服务启动完成大约需要12分钟,内存消耗25G(笔记本电脑环境,如果是Windows上的WSL虚拟机,考虑windows本身还需要消耗7-8G,那么32G内存笔记本启动 HZERO PaaS平台 是够用的)

#备注:Mac电脑Arm 版CPU用户首次启动时会从dockerHub官方下载mongo,redis,nginx,elasticsearch,neo4j,onlyoffice 这几个Docker镜像,时间会稍长,请耐心等待并保持网络畅通

关闭平台服务:

$ cd hzero-dockers

$ bash stop-all-dockers.sh

#备注:如果要 单启动HZERO基础开发平台+低代码平台可以:
$ cd hzero-dockers
$ bash lowcode-all-dockers-start.sh
关闭服务:
$ bash lowcode-all-dockers-stop.sh

#备注:如果要 单启动HZERO基础开发平台+AI平台可以:
$ cd hzero-dockers
$ bash ai-all-dockers-start.sh
关闭服务:
$ bash ai-all-dockers-stop.sh

五、访问系统

在windows host文件添加解析:

假设你 的服务器IP是 172.18.14.48

172.18.14.48 dev.hzero.com.cn #Nginx服务器地址
172.18.14.48 gateway.hzero.com.cn # 网关的地址
172.18.14.48 aigc.hzero.com.cn # AIGC服务的反向代理
172.18.14.48 kkv.hzero.com.cn # 文件预览服务域名
172.18.14.48 oss.hzero.com.cn # minio文件服务域名
172.18.14.48 onlyoffice.hzero.com.cn # onlyoffice文档在线编辑服务

完成hosts设置户,访问http://dev.hzero.com.cn

用户名/密码: admin/Admin@123!

5.1 看低代码平台Demo

选择低代码POC演示租户 ,进入系统后点右上角的“前往控制台”,然后点左上角菜单,选择菜单”POC演示-知识产权管理” ,可以看到一个低代码搭建的关于知识产权管理的应用.

选择菜单“低代码平台”,进入低代码工作台,可进行低代码开发;

低代码POC演示-知识产权管理

低代码工作台:

进入低代码平台 菜单,接下来你可以 进行低代码开发了。 学习文档和视频可以看汉得开放平台的学习路线:

开放平台网址:open.hand-china.com

视频路径: 开放平台/社区与合作伙伴/视频与培训/学习路线/飞搭平台学习路线  

从初级开始学习

5.2 看AI平台demo

切换租户,选择HZERO 平台租户 ,进入系统后点右上角的“前往控制台”,然后点左上角菜单,进入AIGC中台/模型管理中心/模型对接配置

点击右上角三个小点点,切换到平台租户:

然后点击右上角“前往控制台”,切换到传统菜单

进入AIGC中台/模型管理中心/模型对接配置

5.2.1、设置jack对话-deepseek-V4-flash,Jack文本向量-阿里2,Jack-图文向量-豆包 ,Jack重排模型-阿里,这四个模型的API Key

5.2.1.1 你需要预先在火山引擎注册账号 https://www.volcengine.com/, 然后从主页 /大模型 进入,然后选择左边的“开通管理”菜单,找到deepseek-v4-flash-260425,doubao-embedding-vision-250615,doubao-seed-2-0-mini-260428 这三个模型,点操作“开通服务”

5.2.1.2 在火山引擎/火山方舟 左边菜单 API key管理 处,复制API-KEY

然后把获取的API Key 填入:

5.2.2、设置 Jack重排模型-阿里 , 和 Jack文本向量-阿里-2 的API Key

5.2.2.1 你需要预先在阿里云注册账号 ,然后在主页/大模型/免费体验 进入阿里云百炼平台,然后点左下角的密钥管理可获取API Key

然后把获取的API Key填入:

2.3、看AI平台demo

选择HZERO 平台租户 ,进入系统后点左上角菜单,进入AIGC中台/应用中心/企业应用库, 点击进入“我的HZERO运营知识库”, 可以咨询Hzero平台相关问题,比如 :你可以问:“飞搭会用到AI平台功能吗?”


重要提醒:

1、现在这个版本用的IBM OpenJ9的JVM , 是内存节省优先的,32G内存的笔记本可以跑所有服务。

2、如果你内存很大,比如有64G,要性能优先的: 可以用OpenJDK标准的HotSpot JVM , 这个版本内存消耗较大,HostSport JVM版本的下载地址:

https://pan.baidu.com/s/1cqL199Cl_61qpAANo8pnwA?pwd=Hand      提取码: Hand 文件大小:18.31G, 使用百度超级会员下载大约20分钟

备注: 这个Demo版本主要用于个人学习,以适应40G以内的笔记本为主要目标,所以,OpenJDK标准的HotSpot JVM , 这个版本 在2026年之后就不再维护了。

3、如果你只有16G内存的笔记本,也想把HZERO平台部署跑起来,请参考

Jack.Shang的技术博客 » HZERO PaaS平台组装笔记十五-使用IBM OpenJDK_OpenJ9 第四部分: 16G笔记本运行方案

4、关于docker版实验Demo环境系列笔记可参考:

http://blog.retailsolution.cn/archives/category/hzero/hzero-docker%e7%89%88

5、有关本Demo系统的更新日志可参考:
Jack.Shang的技术博客 » HZERO PaaS平台-Docker版 -更新日志

HZERO PaaS平台-Docker版demo笔记(四)添加服务&问题修改

本文是针对《HZERO PaaS平台组装笔记十四:继续验证测试》的问题在Docker版Demo中做对应的跟进工作日志

问题1、平台/调度任务/任务调度中心,打开时报错:

原因分析:hzero_platform.iam_permission表中缺调度服务模块的相关权限记录。

解决方案:去平台/开发管理/开发管理/系统工具/刷新权限 去手动刷新下IAM权限。

刷新报错:

针对此报错的解决方案:删掉临时记录,再重新刷新:

# delete from hzero_platform.iam_permission where service_name =’hzero-scheduler’

再次刷新就成功了:

再测:平台/调度任务/任务调度中心,打开就正常没有错误了:

问题2、事件管理服务未安装

解决方案:

制作事件管理服务的docker镜像

==================================================

16、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-事件管理服务 ps-event 镜像

==================================================

二、目标环境:

环境:WSL:Ubuntu-22.04系统

5、建立hzero-event-docker目录

$ cd /d01/hzero-dockers

$ mkdir hzero-event-docker

6、拷贝Jar包到目标环境

#在windows powershell 中执行

$ cp \\wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-event\target\ps-event.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-event-docker\

7、编辑Dockerfile

$ cd /d01/hzero-dockers/hzero-event-docker

$ vi Dockerfile

————————————-

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17

COPY ps-event.jar /ps-event.jar

ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS  -jar /ps-event.jar

————————————

8、编辑docker-compose.yml

$ vi docker-compose.yml

———————————-

## 要求Docker/Docker CE >= 19.x

services:

  hzero-event:

    image: hzero-event-jk-demo:1.12

    container_name: hzero-event

    ports:

      – “8135:8135”

      – “8136:8136”

    environment:

      – JAVA_OPTS=-Xms250m -Xmx250m -Dspring.profiles.active=dev

    deploy:  # 限制容器总内存(Docker Compose v2.3+)

      resources:

        limits:

          memory: 500m  # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)

networks:

  default:

    name: hzero-demo

    external: true

———————————-

9、构建Docker镜像

$ cd /d01/hzero-dockers/hzero-event-docker

$ docker build -t hzero-event-jk-demo:1.12 .

构建成功:

$ docker images | grep event

  1. 种子数据初始化:
    #拷贝种子数据:

$ cp -r  \\wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-event\resource-package \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-event-docker\

#更改resource-package\application.yml 把数据库连接改一下:

mysql-hzero -> localhost

$  cd /d01/hzero-dockers/hzero-event-docker/resource-package

$ bash database-init.sh

访问:http://localhost:8099/

执行1和3, 成功完成

11、测试Docker镜像(测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin容器已经启动):

$ cd /d01/hzero-dockers/hzero-event-docker

$ docker compose up -d

看日志:docker logs hzero-event

看起来是正常启动了

http://localhost:8000注册中心中可见hzero-event服务

测试:
路径:平台菜单/事件管理/事件源定义
功能正常,服务地址改成实际部署环境的:

问题3、API测试数据不全

路径:平台工作台菜单/服务监控/API测试

发现有些已经安装的服务在这里没有显示,比如hzero-license

解决方案:

1、调整hzero-admin的docker-compose.yml中的启动内存,-Xmx 从300M调整到800M, 内存上限提高到memory: 1600m

重启hzero-admin服务

  • 在平台治理注册hzero-license服务:

路径:平台菜单/平台治理/服务管理

新建hzero-license服务路由注册

调整后都可以看到:

问题4、授权信息查看报错

路径:平台工作台菜单/系统管理/授权信息

查看报错,报404错误

解决方案:先尝试刷新license服务的iam权限

刷完后再试,就OK了:

问题5、权限组显示错误

路径:平台菜单/系统管理/数据权限控制/权限组管理

分析:这个问题是 hzero-platform 少依赖了platform-dpc-saas,原系统的hzero-platform已经添加依赖,从新构建了jar,只需要拷贝过来重建Docker镜像就好了。

  • 目标环境:

环境:WSL:Ubuntu-22.04系统

拷贝Jar包到目标环境

#在windows powershell 中执行

$ cp \\wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-platform\target\ps-platform.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-platform-docker\

9、构建Docker镜像

$ cd /d01/hzero-dockers/hzero-platform-docker

$ docker compose down

$ docker build -t hzero-platform-jk-demo:1.12 .

$ docker compose up -d

#再次测试,就OK了:

问题6、jar包管理界面打开报错:

路径:平台菜单/开发管理/个性化管理

点击 jar包管理,报错:The route you visited does not exist or the related service is not installed

分析:这个问题是缺少hzero-jar服务,该服务在原系统应完成jar构建,只需要拷贝过来构建docker镜像即可:

解决方案:

制作事件管理服务的docker镜像

==================================================

制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-事件管理服务 ps-jar 镜像

==================================================

二、目标环境:

环境:WSL:Ubuntu-22.04系统

5、建立hzero-jar-docker目录

$ cd /d01/hzero-dockers

$ mkdir hzero-jar-docker

6、拷贝Jar包到目标环境

#在windows powershell 中执行

$ cp \\wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-jar\target\ps-jar.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-jar-docker\

7、编辑Dockerfile

$ cd /d01/hzero-dockers/hzero-jar-docker

$ vi Dockerfile

————————————-

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17

COPY ps-jar.jar /ps-jar.jar

ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS  -jar /ps-jar.jar

————————————

8、编辑docker-compose.yml

$ vi docker-compose.yml

———————————-

## 要求Docker/Docker CE >= 19.x

services:

  hzero-jar:

    image: hzero-jar-jk-demo:1.12

    container_name: hzero-jar

    ports:

      – “8055:8055”

      – “8056:8056”

    environment:

      – JAVA_OPTS=-Xms250m -Xmx250m -Dspring.profiles.active=dev

    deploy:  # 限制容器总内存(Docker Compose v2.3+)

      resources:

        limits:

          memory: 500m  # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)

networks:

  default:

    name: hzero-demo

    external: true

———————————-

9、构建Docker镜像

$ cd /d01/hzero-dockers/hzero-jar-docker

$ docker build -t hzero-jar-jk-demo:1.12 .

构建成功:

$ docker images | grep jar

  1. 种子数据初始化:
    #拷贝种子数据:

$ cp -r  \\wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-jar\resource-package \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-jar-docker\

#更改resource-package\application.yml 把数据库连接改一下:

mysql-hzero -> localhost

$  cd /d01/hzero-dockers/hzero-jar-docker/resource-package

$ bash database-init.sh

访问:http://localhost:8099/

执行1和3, 成功完成

11、测试Docker镜像(测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin容器已经启动):

$ cd /d01/hzero-dockers/hzero-jar-docker

$ docker compose up -d

看日志:docker logs hzero-jar

看起来是正常启动了

http://localhost:8000注册中心中可见hzero-jar服务

测试:
路径:平台菜单/开发管理/个性化管理

点击 jar包管理,可正常显示:

#faq-question6-2

但是后来有一次重启之后,服务报错:

org.springfranework.jdbc.BadSqlGrannarException:# Error querying database. Cause: java.sql.SoLSyntaxErrorException: Table ‘hzero jar-hpfn tenant’ doesn’t exist# The error nay exist in URL [jar:nested:/ps-jar-jar/!B00T-INF/lib/hzero-jar-1.2.0.RELEASE. jar!/napper/JarConfigMapper .xnL]

分析:hpfm_tenant表是在hzero_platform这个数据库schema下面的,正常要加上前缀才行,这里没有加前缀,产研说可能是数据源缓存问题。

解决方案:刷新 “数据源缓存”

刷新后,再重启hzero-jar服务就正常了。

问题7、接口平台API注册报404错误

路径:平台菜单/接口平台/API配置/API注册

这个菜单打开会报404错误

分析:跟产研沟通,在1.8版本中暂不提供这个功能,这个是在1.9以后的大版本中规划的API维度的一个界面。

解决方案:暂时先禁用掉该菜单。

在 平台菜单/系统管理/菜单管理/菜单配置:

问题8、接口平台API权限汇总查看报404错误

路径:平台菜单/接口平台/API权限/API权限汇总查看

这个菜单打开会报404错误

分析:跟产研沟通,在1.8版本中暂不提供这个功能,这个是在1.9以后的大版本中规划的一个功能。

解决方案:暂时先禁用掉该菜单。在 平台菜单/系统管理/菜单管理/菜单配置:

问题9: 集成平台/服务编排/应用连接器 打开页面一闪而过,白屏

路径:平台菜单/服务编排/应用连接器/应用连接器

分析:

这个问题在原系统已解决,是前端模块缺失的问题,把前端文件拷贝过来就可以

解决方案:

#windows powershell:复制前端文件 和nginx配置文件

$ cp -r -Force \\wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\front\dist   \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\volumes\nginx\

拷贝完成后,再测:可正常显示:

问题10: hzero-gateway 服务日志太多的问题

这个问题在原系统已经改了,把日志级别改到info了,只需要把jar拷贝过重构docker镜像即可。

#拷贝Jar包到目标环境

#在windows powershell 中执行

$ cp \\wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-gateway\target\ps-gateway.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-gateway-docker\

9、构建Docker镜像

$ cd /d01/hzero-dockers/hzero-gateway-docker

$ docker build -t hzero-gateway-jk-demo:1.12 .

问题11: 接口平台的健康检查定时任务导致日志文件太多的问题

这个定时任务,原来的种子数据中设定的是每30秒检查一次,会产生一个日志文件,这导致文件系统中的日志文件太多,日志表记录条多,文件记录表中记录太多。

经过测试,只是停掉这个调度任务不够,把日志策略改成仅记录异常也不够,每次重启就会恢复到全量记录。所以需要把自动初始化这个开关关掉,保存,然后再停掉这个任务。

HZERO PaaS平台组装笔记(十五)继续验证测试

问题1、平台/调度任务/任务调度中心,打开时报错:

前端检查发现一堆权限不匹配的后台API错误:

检查后台hzero-schedule服务的日志,没有错误信息。

看前端错误主要是hzero_platform.iam_permission表中缺少响应的api 记录。

解决方案是:去平台/开发管理/开发管理/系统工具/刷新权限 去手动刷新下IAM权限就好了。

这里点【刷新】的时候,偶尔会遇到违反唯一索引的错误,这种情况可以去数据库把hzero_platform.iam_permission表中,通过模糊搜索code的方法把对应模块的API权限记录全部清除掉,然后再刷新。

备注:之所以出现刷新时有违反唯一索引的错误是刷新的逻辑是增量插入,没有更新,因为开发人员没新增或更改一个API就回去刷新,这个操作比较频繁,用更新会导致性能不好,但增量插入的“增量”逻辑并非跟系统唯一索引完全一致,所以就会导致违反唯一索引的问题。 产研说后面会改进刷新的处理逻辑,会先删除跟增量部分重复的code, 然后再刷新,这样就不会出现违反唯一索引的错误,也不需要去数据库表做响应的删除操作了。

刷新后就没有错误,正常显示了:

问题2、事件管理服务未安装

平台/事件管理/事件源定义 ,访问时出错

分析:

事件管理服务未安装。

解决方案:

选配平台选配事件管理服务进行安

1、选配平台下载服务的资源:

路径:开放平台/开发者/在线选配/服务端选配

父工程选择hzero父组件1.12.2

$ cd /d02/hzero/project

$ mkdir ps-event

#选配完成后,把事件服务.zip 和resource-package.zip 拷贝到 /d02/hzero/project/ps-event 目录下

$ cd /d02/hzero/project/ ps-event

$ unzip 事件服务.zip

$ unzip resource-package.zip -d ./resource-package

2、执行种子数据导入:

$ cd ./resource-package

#更改 application.yml 中mysql db的地址为mysql-hzero

$ cd /d02/hzero/project/ps-event/resource-package

$ bash database-init.sh

访问:http://localhost:8099/

执行1和3

  • 构建服务的jar包

$ cd /d02/hzero/project/ps-event/src/main/resources

#更改application.yml

#mysql连接修改

db.hzero.com.cn->mysql-hzero

#redis连接修改

redis.hzero.com.cn->redis-hzero

#更改 bootstrap.yml

#配置中心修改

dev.hzero.com.cn->hzero-admin

#注册中心修改

dev.hzero.com.cn->hzero-register

#添加网络忽略配置

    inetutils:

      # 指定忽略的网卡

      ignored-interfaces:

       – lo

       – docker0

       – veth.*

#更改POM文件

1.12.2->1.12.2.RELEASE

1.12.0.RELEASE->1.12.2.RELEASE

#拷贝构建和启动脚本

$ cd /d02/hzero/project/ps-alert

$ cp build.sh run.sh run_nobuild.sh stop.sh /d02/hzero/project/ps-event/

# 执行构建并启动服务:

$ bash run.sh

启动成功,可以在注册中心看到:

  • 构建前端

检查 /d02/hzero/front/front/package.json

看已经包含:

 “devDependencies”: {

 “hzero-front-hevt” : “~1.12.0”,

所以,该服务的前端已经构建过了。

  • 测试:功能正常,服务地址改成实际部署环境的:

问题3、API测试数据不全

路径:平台工作台菜单/服务监控/API测试

发现有些已经安装的服务在这里没有显示,比如hzero-license

分析:检查看网络,都调用了哪些API,刷新,结果反而空了;

查hzero-admin后台服务日志:

报内存溢出了:

jakarta.servlet.ServletException: Handler dispatch failed: java.lang.OutOfMemoryError

想想也对,这个展示所有服务的API还是很消耗内存的,之前swagger服务也碰到内存溢出的问题,当时是给调到1G内存的。

解决方案:调整hzero-admin对的启动内存,-Xmx 从300M调整到800M

重启hzero-admin服务,再测试:

注册中心是14个,这里是11个,跟注册中心比还少了3个

继续调整 -Xmx 从800M调整到1200M,重启hzero-admin服务, 结果还是出来11个服务,没有变化,说明再加内存也没用。

缺失的是 hzero-gateway,hzero-license,hzero-swagger 三个服务的API展示

看API调用:hzero-admin 调的是swagger的 tree

执行:把hzero-swagger的-Xmx 从300M调整到800M,重启hzero-swagger服务,再测:还是一样,没有hzero-license和hzero-swagger的API展示,直接调用hzero-admin的这个API来获取hzero-license和hzero-swagger的API文档数据,也是空的。但trail环境上是可以展示hzero-license和hzero-swagger的API文档的。

查hzero-swagger的application.yml配置:

hzero:

  swagger:

skip-service: ${HZERO_SWAGGER_SKIP_SERVICE:register, gateway, oauth}

跳过不显示API的服务列表里面没有hzero-license 和hzero-swagger  所以正常应该显示出来,另外oauth在排除列表中,但实际上却在API测试列表里面显示出来了,这是为什么呢?

问豆包,豆包会告诉你这个列表的来源是hadm_swagger表:

我们去hadm_swagger表中看:

也确实没有hzero-license 和hzero-swagger:

那为什么hzero-license和hzero-swagger没有进入这张表呢?

我们跟豆包聊,关键是先检查 hzero-license服务有没有提供api文档,hzero-license的端口是8105,我们访问 http://dev.hzero.com.cn:8105/v2/api-docs

能正常返回api文档的json数据,加上我们在hzero-admin服务日志中没有看到采集swagger文档的报错信息,判断:问题出在hzero-admin未触发对这个服务的采集流程:

而且在API测试的地方,直接刷hzero-license的API文档返回是空的:

这个明天问下产研吧,什么原因?

产研说hzero_admin没有去调用swagger的api,就是直接请求网关的统一文档入口,从而拉取所有微服务的文档信息并生成服务列表。那个hadm_swagger表也不关键,是拉取之后临时存储的,没有配置作用。之所以hzero-license的api文档在我的环境没有显示出来是因为我用的hzero-license服务版本是2025年5月份之后的版本,新的版本中hzero-license服务的api文档调用显示在程序里面做了限制,禁止其他API直接访问,只允许直接在浏览器中显示。

好了,搞清楚了,这里没有安装配置方面的问题。问题关闭。

后续发现他们说的也不是那么回事。。。

在路径:平台菜单/平台治理/服务管理的地方,把hzero-license服务加上去之后,在swagger-ui.html 和API测试的地方就都能看到了,所以关键是这个服务要向治理平台hzero-admin注册。

问题4、授权信息查看报错

路径:平台工作台菜单/系统管理/授权信息

查看报错,报503错误

分析:

看hzero-license服务正常运行,后台日志没有报错。

估计是hzero_platform.iam_permission表中缺少响应的api 记录。

解决方案是:去平台/开发管理/开发管理/系统工具/刷新权限 去手动刷新下IAM权限

成功完成刷新动作。再测试:

发现还是报错:

去后台看hzero-gateway的服务日志,前端刷新一下,后端就有一堆信息下面这种信息:

把信息给元宝分析错误,结果元宝说没有错误,只是正常的debug信息,元宝建议把hzero-gateway的application.yml配置中关于日志的level部分从debug改成info,以免排查问题因为日志信息太多而收到干扰, 看了一下,确实hzero-gateway的日志太多了,才几个小时就已经有180M了。

按照元宝建议改成info级别日志,重启hzero-gateway 服务。

那么就继续看看路由的缓存问题:在浏览器直接访问:

http://gateway.hzero.com.cn:8080/hlcs/v1/license/info/license-code

返回:

{“failed”:true,”code”:”error.permission.routeNotFound”,”message”:”This request mismatch any routes, uri: %2Fhlcs%2Fv1%2Flicense%2Finfo%2Flicense-code”,”type”:”PERMISSION_SERVICE_ROUTE”,”detailsMessage”:”The route you visited does not exist or the related service is not installed”}

后端直接访问该接口:

$ curl http://172.18.14.48:8105/v1/license/info/license-code

{“timestamp”:”2025-12-11 17:19:04″,”status”:401,”error”:”Unauthorized”,”path”:”/v1/license/info/license-code”}root@desktop-jacksen:/d02/hzero/project/ps-gateway#

问题诊断结论​

✅ ​服务正常运行​:后端服务 hzero-license 已启动并在 8105 端口监听

✅ ​接口路径正确​:/v1/license/info/license-code 接口存在

估计还是iam_permission的问题,但权限已经刷新过了,没解决问题,看下权限表是否已经有了:

权限表中确实已经有了,所以不是权限问题了。

那是没有在网关的路由表里面吗?Hzero-license服务在注册中心可以看见,网关应该可以自动获取到这个服务的路由的吧?

命令行测试:

$ curl -X GET “http://gateway.hzero.com.cn:8080/hlcs/v1/license/info/license-code” \

  -H “Authorization: Bearer 303e3c8f2da80-4cfb-8bc7-53769798d0be”

${“failed”:true,”code”:”error.permission.routeNotFound”,”message”:”This request mismatch any routes, uri: %2Fhlcs%2Fv1%2Flicense%2Finfo%2Flicense-code”,”type”:”PERMISSION_SERVICE_ROUTE”,”detailsMessage”:”The route you visited does not exist or the related service is not installed”}

网关还是找不到路由。如果直接访问这个服务的API也会报未授权,即使带着token

curl    -X GET “http://172.18.14.48:8105/v1/license/info/license-code” \

  -H “Authorization: Bearer 303e3c8f2da80-4cfb-8bc7-53769798d0be”

{“timestamp”:”2025-12-11 18:35:37″,”status”:401,”error”:”Unauthorized”,”path”:”/v1/license/info/license-code”}

那可能是我hzero-gateway的application.yml中没有配置hzero-license的路由。在这个文件中搜索hzero-license,果然是缺失了。

解决方案:

增加hzero-license的路由:

      – id: hlcs

        uri: lb://hzero-license

        predicates:

        – Path=/hlcs/**

        filters:

        – StripPrefix=1

添加后重启, 问题解决。可以正常看到授权信息了:

后来跟产研聊,他们说如果没有在hzero-gateway的application.yml中配置路由,也可以在系统界面上添加,具体路径是:

平台菜单/平台治理/服务管理:

在平台菜单/平台治理/微服务实例,可以看到分别注册到注册中心的微服务实例额注册到hzero-admin的微服务实例:我们可以看到有个微服务没有向治理平台hzero-admin注册。如果向治理平台注册了的话,治理平台就会自动帮这些服务刷路由配置和iam_permission权限了。

治理平台也维护了一份服务路由表,hzero-gateway的GVM内存中的路由表是其自身applicatin.yml中配置的路由信息跟这张表的并集:

问题5、权限组显示错误

路径:平台菜单/系统管理/数据权限控制/权限组管理

分析:

看hzero-platform服务后台日志:

Unknown exception, Request: {URI=/v1/permission-groups-site},

org.springframework.web.servlet.resource.NoResourceFoundException: No static resource v1/permission-groups-site.

……

把整段日志给元宝,元宝分析:

问题根源分析

核心问题在于,Spring Boot 将一个API接口请求误判为静态资源文件请求。这通常由以下一个或几个原因造成:

​控制器(Controller)映射缺失​:Spring MVC 没有找到一个能够处理 /v1/permission-groups-site 这个路径的控制器(例如 @RestController 中定义的 @RequestMapping)。

​静态资源路径配置干扰​:如果应用配置了静态资源映射(例如 spring.mvc.static-path-pattern),且其模式与该 API 路径意外匹配,请求可能会被错误的静态资源处理器截获。

​请求方式不匹配​:控制器上定义的 HTTP 方法(如 @GetMapping, @PostMapping)与您实际发起的请求方法(如 GET, POST)不匹配。

​版本差异与配置过时​:不同版本的 Spring Boot 在静态资源处理上可能存在差异,旧版本的配置方式在新版本中可能已不适用或失效

#

路径:平台菜单/服务监控/API测试,查找hzero-platform的API,确实没有找到permission-groups-site的api.

但是在iam_permission表是有的:

在swagger-ui.html上没找到 hzero-platform的permission-group API

跟产研沟通了下,说这些API在 platform-dpc-saas中,这个组件现在已经默认不依赖了,该组件是数智事业部开发的,他们部门一直在用,而且他们部门认为这个功能需要放在平台层,之前曾经加进来过,所以菜单的种子数据中就有了,但现在产研这边已经不用了,相关菜单也可以去掉。如果要用就是需要在hzero-platform的POM中加下依赖:

<dependency>

            <groupId>org.hzero.plugin</groupId>

            <artifactId>platform-dpc-saas</artifactId>

        </dependency>

加完后,重新build并启动,再测,就正常不报错了:

问题解决。

问题6、jar包管理界面打开报错:

路径:平台菜单/开发管理/个性化管理

点击 jar包管理,报错:The route you visited does not exist or the related service is not installed

分析:这个错误很明显,就是

解决方案:

解决方案:

选配平台选配事件管理服务进行安

1、选配平台下载服务的资源:

路径:开放平台/开发者/在线选配/服务端选配

父工程选择hzero父组件1.12.2

选配hzero-jar组件

$ cd /d02/hzero/project

$ mkdir ps-jar

#选配完成后,把动态Jar管理.zip 和resource-package.zip 拷贝到 /d02/hzero/project/ps-event 目录下

$ cd /d02/hzero/project/ps-jar-app

$ unzip 动态Jar管理.zip

$ unzip resource-package.zip -d ./resource-package

2、执行种子数据导入:

$ cd ./resource-package

#更改 application.yml 中mysql db的地址为mysql-hzero

$ cd /d02/hzero/project/ps-jar/resource-package

$ chmod +x database-init.sh

$ bash database-init.sh

访问:http://localhost:8099/

执行1和3

  • 构建服务的jar包

$ cd /d02/hzero/project/ps-jar/src/main/resources

#更改application.yml

#mysql连接修改

db.hzero.com.cn->mysql-hzero

#redis连接修改

redis.hzero.com.cn->redis-hzero

#redis上面加一层data: 在spring:下一层

#hzero-jar-app->hzero-jar

#更改 bootstrap.yml

#配置中心修改

dev.hzero.com.cn:8010->hzero-admin:8060/hadm/config

#注册中心修改

dev.hzero.com.cn->hzero-register

#添加网络忽略配置

    inetutils:

      # 指定忽略的网卡

      ignored-interfaces:

       – lo

       – docker0

       – veth.*

#更改POM文件

1.12.2->1.12.2.RELEASE

1.12.0.RELEASE->1.12.2.RELEASE

mysql->com.mysql

#拷贝构建和启动脚本

$ cd /d02/hzero/project/ps-alert

$ cp build.sh run.sh run_nobuild.sh stop.sh /d02/hzero/project/ps-jar/

# 执行构建并启动服务:

$ cd /d02/hzero/project/ps-jar

$ bash run.sh

启动报错:

Spring 在寻找:org/hzero/jar/api/  实际路径中不存在:api 子目录

解决方案:把日志发给元宝,按元宝建议多次执行分析-建议-执行再分析的循环未能解决问题,解决了api ,又说缺app等另外3个目录,解决了目录又报其他一些列错误, 后来跟产研沟通,产研说他们在IDE环境启动没问题,要再测试下命令行启动问题的差异,找了下原因,发现是POM文件中多了build部分,而且build部分的版本不对。

解决方案就是把build部分删除掉,就可以正常启动了,然后在注册中心可以看到hzero-jar服务。

  • 构建前端

检查 /d02/hzero/front/front/package.json

看尚未包含:

  “devDependencies” : {

    “hzero-front-hjar” : “~1.2.0”,

所以,要加一下。

$ cd /d02/hzero/front/front/

$ cp package.json package.json.bak20251212

更改package.json ,增加上述依赖

$ yarn

$ yarn run build:ms hzero-front-hjar

$ Done in 8.65s

#部署

$ bash  apply_update_to_runtime_env.sh

  • 测试:功能正常了:

问题7、接口平台API注册报404错误

路径:平台菜单/接口平台/API配置/API注册

这个菜单打开会报404错误

分析:跟产研沟通,在1.8版本中暂不提供这个功能,这个是在1.9以后的大版本中规划的API维度的一个界面。

解决方案:暂时先禁用掉该菜单。

在 平台菜单/系统管理/菜单管理/菜单配置:

问题8、接口平台API权限汇总查看报404错误

路径:平台菜单/接口平台/API权限/API权限汇总查看

这个菜单打开会报404错误

分析:跟产研沟通,在1.8版本中暂不提供这个功能,这个是在1.9以后的大版本中规划的一个功能。

解决方案:暂时先禁用掉该菜单。在 平台菜单/系统管理/菜单管理/菜单配置:

问题9: 集成平台/服务编排/应用连接器 打开页面一闪而过,白屏

路径:平台菜单/服务编排/应用连接器/应用连接器

分析:

检查 浏览器网络没有报API错误,hzero-orchestration服务后台也没有报错。

只有前端报错,通常这种情况就是看下有没有新的前端版本可以更新,先看下开放平台文档中关于编排的前端模块是啥?

文档路径: 开放平台/社区与合作伙伴/文档中心/技术产品/集星獭JeeStar/1.8.1RELEASE/产品安装部署手册/前后端服务清单

说明编排的的前端模块是:jipaas-front-jorc 1.8.0 服务编排模块

看下当前的package.json中的版本:发现没有这个前端模块

解决方案:

在package.json中增加jipaas-front-jorc 1.8.0 服务编排模块和jipaas-front-jfnt 1.8.0 前置机服务模块

$ cd /d02/hzero/front/front

$ cp package.json package.json.bak20251216

#搜索制品库 https://nexus.saas.hand-china.com,搜索hzero-ui库,切换到HTML View,ctro+F 搜索jipaas-front-jorc, 看到最新版本是2025-10-15的1.7.3-beta.1 没有文档写的1.8.0

先尝试按文档1.8.0

Couldn’t find any versions for “jipaas-front-jitf” that matches “~1.8.0”
? Please choose a version of “jipaas-front-jitf” from this list: (Use arrow keys)
❯ 1.8.0-beta.2

yarn之后还确实有,除了jipaas-front-jitf有1.8.0-beta.2需要选择下,其他两个都没让选,看了  jipaas-front-jorc 和 jipaas-front-jfnt 目录下的json文件还都是1.8.0的

$ yarn build:ms jipaas-front-jitf,jipaas-front-jorc,jipaas-front-jfnt

$ Done in 246.70s.

#然后运行前端部署脚本:

$bash  apply_update_to_runtime_env.sh

再测试:已经正常显示了。

问题解决。

HZERO PaaS平台-Docker版demo笔记(三)非容器环境运行jar包适配

我们为了制作Docker版本的Demo, 让微服务在容器中顺利运行,更改了所有微服务的yml配置,重新构建了所有的jar,详情可参考:

Jacksen的技术博客 » HZERO PaaS平台-Docker版demo笔记(一)Docker版制作  

现在回过头来想想,其实当时也可以不改的,不用去把每个微服务的yml文件中的中间件服务域名改成容器服务名的,只需要这些中间件服务的容器都给他们起个别名,跟原来yml中的域名保持一致就可以相互在容器间访问到的。但是当时不懂,已经那么做了,所以现在就继续在这个基础上继续吧。

当时我们备份了所有微服务原来的yml配置和jar文件,想着后面在linux 中直接运行这些微服务的时候还要把原来备份的yml配置恢复过来,然后重建微服务的jar包,但这么做会比较麻烦,因为后面每个微服务版本升级后还可能要继续重新构建适用于Docker的Jar包,而我们的微服务升级频率又很高,所以要考虑yml配置和jar包最好有方法同时适用于容器内运行和直接在linux运行。

问题分析:

我们对微服务门的application.yml和bootstrap.yml配置文件的更改,主要就是四种:中间件服务的域名、部分微服务的域名(注册中心、网关、配置中心等)、网络preferred ip、系统界面上的域名配置。

分别来看;

一、中间件服务域名

mysql,redis,mongo,mino,kkfileview,onlyoffice,elasticsearch 中间件服务的域名,改成了容器的服务名;

这一点:如果直接在linux中运行,那么只需要在hosts中把容器服务名的DNS解析指定到本机IP就可以。当然也可以不改,在run.sh和run_nobuild.sh中的启动命令中在JAVA_OPTS字符串中把原来的域名比如mysql的域名:db.hzero.com.cn 作为环境变量注入进去,类似PREFERRED_IP那样处理。但是也麻烦,每个服务都有两个脚本,每个脚本都要去改。所以还是在linux的hosts文件更改方便:

172.18.14.48 mysql-hzero  

172.18.14.48 redis-hzero   

172.18.14.48 mongo-hzero

172.18.14.48 kkfileview-hzero

172.18.14.48 onlyoffice-hzero 

172.18.14.48 elasticsearch-hzero  

二、注册中心、网关、配置中心等微服务的域名

这些域名在微服务的application.yml和bootstrap.yml中改成了容器的服务名;

这一点:如果直接在linux中运行,那么只需要在hosts中把容器名的DNS解析指定到本机IP就可以。

172.18.14.48 hzero-gateway   

172.18.14.48 hzero-register    

172.18.14.48 hzero-admin     

172.18.14.48 hzero-hkms      

172.18.14.48 hzero-hype      

172.18.14.48 hzero-aip-app   

三、网络preferred ip

网络从指定preferred ip改成去掉preferred ip,网络接口忽略改成了:

      ignored-interfaces:

        – lo

        – docker0

        – veth.*

      这一点,我们无需恢复到指定preferred ip,这样的写法可同时兼容linux本机运行和Docker容器中运行。

四、需要进入系统之后更改的配置

1、minio配置:需要进入系统->文件管理->minio 配置服务器地址,原来的oss.hzero.com.cn,没有更改。无需更改。

2、aigc开放api地址(AI网关):需要进入系统->AIGC中台->全局选项配置->开发api地址,原来是aigc.hzero.com.cn, 没有更改。  无需更改。

3、neo4j 图数据库地址:需要进入系统->AIGC中台->知识图谱->图数据库管理,原来是个IP地址,需要改成neo4j-hzero,在hosts中要添加172.18.14.48 neo4j-hzero  

4、向量数据库配置地址:需要进入系统->AIGC中台->向量库管理->向量库配置/平台内置向量库类型:ElasticSearch,原来是个IP地址,需要改成elasticsearch-hzero,在hosts中要添加172.18.14.48 elasticsearch-hzero  

备注:由于我们在全局设置中默认向量库用的是elasticsearch,没用milvus,所以milvus不用配置。

解决执行

一、更改linux的hosts文件

$ cp /etc/hosts /etc/hosts.bak20251126

$ vi /etc/hosts

删除定制原来内容,添加如下内容:

172.18.14.48 mysql-hzero

172.18.14.48 redis-hzero

172.18.14.48 mongo-hzero

172.18.14.48 elasticsearch-hzero

172.18.14.48 neo4j-hzero

172.18.14.48 hzero-gateway

172.18.14.48 hzero-register

172.18.14.48 hzero-admin

172.18.14.48 hzero-hkms

172.18.14.48 hzero-hype

172.18.14.48 hzero-aip-app

172.18.14.48 oss.hzero.com.cn

172.18.14.48 kkv.hzero.com.cn

172.18.14.48 gateway.hzero.com.cn

二、更改windows 客户端的hosts文件设置:

172.18.14.48  dev.hzero.com.cn          #hzero-demo环境 Nginx服务器地址

172.18.14.48  gateway.hzero.com.cn     # 网关的地址

172.18.14.48  aigc.hzero.com.cn         # AIGC ai-app服务的反向代理

172.18.14.48  kkv.hzero.com.cn          # 文件预览服务域名

172.18.14.48  oss.hzero.com.cn          # minio文件服务域名(客户端直接预览PDF需要)

三、启动AI平台服务,更改向量数据库和图数据库配置

$ cd /d02/

$ bash service-ai-all-start.sh

#启动完成,进入系统

3、图数据库配置更改成功:

4、向量数据库配置更改成功:

四、测试:

1、从原来的导出文件中恢复导入模型对接账号,并重新填入api_key后这些账号测试工作正常。
2、AIGC平台/企业应用库/我的运营知识库:知识库问答工作正常。
3、AIGC平台/文档库管理:上传文档向量化操作正常,PDF,Word文档预览正常,查看切片操作正常;

4、Office文件在线编辑问题:

按照开放平台 文件服务/在线编辑 结合自己的域名和端口进行hzero-file服务的application.yml配置:

hzero:

  file:

    only-office:

      edit-type: onlyOffice

      file-key-expire: 30

      doc-server-url: http://onlyoffice-hzero:8800

      call-back-url: http://dev.hzero.com.cn/hfle/v1/only-office/save/file

      converter-url: http://onlyoffice-hzero:8800/ConvertService.ashx

镜像使用平台打包的镜像:registry.hand-china.com/hzero-public/hzero-office:1.0

考虑到容器需要访问Minio服务和回调写文件的APi,所以在容器的docker -compose.yml中添加:

    extra_hosts:

      – “oss.hzero.com.cn:172.18.14.48”

      – “dev.hzero.com.cn:172.18.14.48”

平台 /文件管理/文件汇总查询  pdf,docx,xlsx 预览正常,docx编辑错误,错误信息:

分析:

1、前端界面错误显示是无法读取未定义的属性’document’

2、浏览器检查/网络中的API调用没有错误,URL返回正常;

3、hzero-file服务后端日志没有显示任何错误。

说明问题出在前端。假设前端代码跟onlyoffice容器服务返回的内容不兼容,这么假设是因为平台提供的onlyoffice镜像是5.6版本的,是2020年的版本,假设文档没有更新,但由于部分客户已经使用了更新版本的onlyoffice,前端为了适配新版onlyoffice做了改动,因而与旧版不兼容。

尝试:更换onlyoffice到8.02版镜像,这是2024年的镜像。

swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/onlyoffice/documentserver:8.2.0

#考虑到新的镜像中的安全策略跟平台提供的镜像不一样(在local.json中默认是需要验证的,平台镜像已经把验证去掉了),所以要先启动镜像,然后把local.json拷贝出来,

$ cd /d02/hzero/project/ps-file/onlyoffice

$ docker cp onlyoffice-hzero:/etc/onlyoffice/documentserver/local.json ./volumes/onlyoffice/DocumentServer/

然后再改local.json, 去掉验证,

      “token”: {

        “enable”: {

          “request”: {

            “inbox”: false,

            “outbox”: false

          },

          “browser”: false

然后再挂载到容器。再重启容器,使得新的镜像也不需要验证。

    volumes:

      – ${DOCKER_VOLUME_DIRECTORY:-./volumes}/onlyoffice/DocumentServer/local.json:/etc/onlyoffice/documentserver/local.json

chown -R 109:112 ./volumes

# 再次测试:问题依旧,而且问题表现也是一样的,假设失败。

看容器日志:

docker exec -it onlyoffice-hzero bash

cd /var/log/onlyoffice/documentserver/docservice

tail -f out.log看不到任何错误

docker exec -it onlyoffice-hzero tail -f /var/log/onlyoffice/documentserver/docservice/out.log

看前端  url API返回的响应内容:这个内容展开后发现跟http://onlyoffic-hzero:8800的主页是一样的。也就是说这返回的内容并不是具体我们要编辑的那篇文档的内容。

我们先测试onlyoffice服务器本身的可用性:

提示词给AI

我的onlyoffice服务器的 doc-server-url是: http://onlyoffice-hzero:8800 call-back-url是:http://hzero-gateway:8080/hfle/v1/only-office/save/file 要编辑的文件地址是: http://oss.hzero.com.cn:9000/hz-haip/haip01/0/MINIO/588ed65df356418282963399668bbccc@上海益吉-低代码平台应用成功案例.docx 请帮我构建一个在bash 中测试的命令,获得onlyoffice返回的编辑该文档的URL

元宝建议直接构建本地Html: 用5.6版本的onlyoffice 是可以正常使用的

<!DOCTYPE html>

<html lang=”zh-CN”>

<head>

    <meta charset=”UTF-8″>

    <title>OnlyOffice 编辑器测试</title>

    <!– 新增:让页面根元素撑满视口,消除默认边距 –>

    <style>

        html, body {

            height: 100%;  /* 让html、body占满浏览器窗口高度 */

            margin: 0;     /* 消除页面默认边距 */

            padding: 0;    /* 消除页面默认内边距 */

        }

    </style>

    <!– 引入 OnlyOffice API –>

    <script type=”text/javascript” src=”http://onlyoffice-hzero:8800/web-apps/apps/api/documents/api.js”></script>

</head>

<body>

    <div id=”editor” style=”height: 100%; width: 100%;”></div>

    <script type=”text/javascript”>

        // 编辑器配置

        var config = {

            document: {

                fileType: “docx”,

                key: “test-doc-key-001”, // 一个唯一的文档标识,可用于跟踪保存版本

                title: “上海益吉-低代码平台应用成功案例.docx”,

                url: “http://oss.hzero.com.cn:9000/hz-haip/haip01/0/MINIO/588ed65df356418282963399668bbccc%40%E4%B8%8A%E6%B5%B7%E7%9B%8A%E5%90%89-%E4%BD%8E%E4%BB%A3%E7%A0%81%E5%B9%B3%E5%8F%B0%E5%BA%94%E7%94%A8%E6%88%90%E5%8A%9F%E6%A1%88%E4%BE%8B.docx”

            },

            documentType: “text”,

            editorConfig: {

                callbackUrl: “http://hzero-gateway:8080/hfle/v1/only-office/save/file”, // 文档保存后的回调地址

                lang: “zh-CN”,

                mode: “edit”, // 设置为编辑模式

            },

            width: “100%”,

            height: “100%”

        };

        // 初始化编辑器

        new DocsAPI.DocEditor(“editor”, config);

    </script>

</body>

</html>

所以,结论是: hzero-file服务的url 这个api返回的内容错误,他返回了onlyoffice的主页,实际要返回我们上面这样的内容才对。

另外hero-file的POM中两个依赖也没添加:这要加上。

       <dependency>

           <groupId>org.hzero.starter</groupId>

           <artifactId>hzero-starter-fileview-onlyoffice</artifactId>

      </dependency>

     <dependency>

        <groupId>org.hzero.starter</groupId>

        <artifactId>hzero-starter-fileview-hoffice</artifactId>

     </dependency>

POM中加了这两个依赖后重启hzero-file服务,再测效果一样不行,。

比较公司开发环境发现用的onlyoffice是9.1.0 的版本,是2025年10月发的最新版

我换用latest版本,就是9.1.0的,去掉认证JWT要求:

$ docker exec -it onlyoffice-hzero bash

$ nano /etc/onlyoffice/documentserver/local.json

# 把认证去掉,重启:

$docker exec -it onlyoffice-hzero supervisorctl restart all

结果,本地那个测试html文件也提示无法下载文件,无法保存了,打不开:

看onlyoffice 日志:

$ docker exec -it onlyoffice-hzero tail -f /var/log/onlyoffice/documentserver/docservice/out.log

错误日志

[2025-12-06T11:21:56.832] [ERROR] [localhost] [test-doc-key-001] [uid-17649991598246] nodeJS – postData error: url = http://hzero-gateway:8080/hfle/v1/only-office/save/file;data = {“key”:”test-doc-key-001″,”status”:4,”actions”:[{“type”:0,”userid”:”uid-1764999159824″}]} Error: DNS lookup 172.18.14.48(family:4, host:hzero-gateway) is not allowed. Because, It is private IP address.

豆包说是触发了onlyoffice的内网渗透限制

更改local.json , 把IP限制去掉:

“services”: { “CoAuthoring”: { “sql”: { … }, “token”: { … }, “secret”: { … }, 在这个后面添加:

“requests”: { “restrictions”: { “ip”: { “allow”: [“*”], // 允许所有IP(测试用,生产不推荐) “deny”: [] } } }

再重启
$ supervisorctl restart all

问题依旧,chatgpt, 元宝,豆包均没有给出真正的解决方案, 豆包是瞎说,元宝和chatgpt就不会,他们基本没有onlyoffice的知识。

但在onlyoffice的官网论坛搜索问题,有个答案,并且答案是有用的:

参数 allowPrivateIPAddress 定义是否允许连接私有IP地址。这包括私有IP地址和预留IP地址

文档服务器默认不允许使用内部IP地址。为避免这种情况,请在docker容器中打开/etc/onlyoffice/documentserver/default.json,找到allowPrivateIPAddress参数并将其值改为true。

之后执行supervisorctl restart all并检查问题是否仍然存在。

把这个修改后的文件拷贝出来:

$ docker cp onlyoffice-hzero:/etc/onlyoffice/documentserver/default.json /d02/hzero/project/ps-file/onlyoffice/volumes/onlyoffice/DocumentServer/

顺便把local.json也拷贝出来

$ docker cp onlyoffice-hzero:/etc/onlyoffice/documentserver/local.json /d02/hzero/project/ps-file/onlyoffice/volumes/onlyoffice/DocumentServer/

这个方案确实可以,改了之后本地html中调用onlyoffice可以正常显示:

注意:allowPrivateIPAddress 这个参数本身不能像 JWT_ENABLED 那样通过简单的环境变量来设置,可以通过文件挂载的方式实现持久生效。

HZERO里面文件编辑会报错:

 HZERO-file 服务后台也会报错(认证我去掉了,不是认证问题) ,把hzero-file服务的错误日志给元宝查一下,元宝指出:

根据您提供的完整错误日志,核心问题已经明确:​OnlyOffice文档服务返回了HTTP 308状态码(永久重定向)​,导致HZERO服务无法完成HTML预览生成。以下是关键证据:

​明确的状态码记录​

ERROR o.hzero.starter.fileview.util.HttpUtils: current onlyOffice resultCode was:308

​重定向引发的处理中断​

日志显示在收到308响应后,系统立即抛出CommonException: hfle.error.onlyOffice.generateHtml

关于308重定向的问题,元宝根据他从CSDN别人分享的经验文章,给出了解决方案:

docker run -i -t -d -p 8800:80 \

  -e JWT_ENABLED=false \

  -e USE_UNAUTHORIZED_STORAGE=true \

  -e ONLYOFFICE_HTTPS_HSTS_ENABLED=false \

  onlyoffice/documentserver

编辑/etc/nginx/includes/ds-docservice.conf

全局替换$the_host成$http_host

nginx -s reload

这个方案未能解决308问题,测试发现还是报错,还是308。

我们把hzero-file的日志级别改成debug,看更详细的日志:

2025-12-07T12:04:39.075+08:00 DEBUG 119681 — [hzero-file] [  XNIO-1 task-2] o.h.s.f.service.impl.HofficeServiceImpl  : generateRequestParam param : RequestParam{accessToken=’epFl7vl24D’, docServerUrl=’http://onlyoffice-hzero:8800′, bodyJson='{“document”:{“title”:”公牛集团-aPaaS飞搭低代码项目案例.docx”,”url”:”http://oss.hzero.com.cn:9000/hz-haip/haip01/0/MINIO/343b6feac396458e8bb0817e64442a6b%40%E5%85%AC%E7%89%9B%E9%9B%86%E5%9B%A2-aPaaS%E9%A3%9E%E6%90%AD%E4%BD%8E%E4%BB%A3%E7%A0%81%E9%A1%B9%E7%9B%AE%E6%A1%88%E4%BE%8B.docx?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=hzero.admin%2F20251207%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251207T040439Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=3b2852b7ef47d629f4531bc610952f23f60affa717b561198fb14c34dbd01a3d”,”fileId”:”http://oss.hzero.com.cn:9000/hz-haip/haip01/0/MINIO/343b6feac396458e8bb0817e64442a6b@公牛集团-aPaaS飞搭低代码项目案例.docx”},”permissions”:{“edit”:true,”review”:true,”dealWithReview”:true,”dealWithReviewOnly”:false,”changeReview”:true,”download”:true,”print”:true,”comment”:false},”editor”:{“callbackUrl”:”http://hzero-gateway:8080/hfle/v1/only-office/save/file”,”userId”:”2″,”userName”:”超级管理员”},”customization”:{“logoImage”:””,”logoLink”:””,”preloaderLogoImage”:””},”extra”:”{\”type\”:\”U\”,\”tenantId\”:0,\”bucketName\”:\”haip\”,\”storageCode\”:\”MINIO\”}”}’}

这里面docserverurl 没看到拼接完整的url;http://onlyoffice-hzero:8800/web-apps/apps/api/documents/api.js

在hzero-file的yml里面改下配置再试试看,再次测试报405(Method Not Allowed)错误了。看起来也不是这个问题。调用程序应该是自己做了拼接的。还是改回来。http://onlyoffice-hzero:8800

接下来:

Docker-compose.yml中增加环境变量:

  – JWT_ENABLED=false 

  – USE_UNAUTHORIZED_STORAGE=true 

  – ONLYOFFICE_HTTPS_HSTS_ENABLED=false 

更改后的defauly.json 实现挂载持久化:

      – ${DOCKER_VOLUME_DIRECTORY:-./volumes}/onlyoffice/DocumentServer/default.json:/etc/onlyoffice/documentserver/default.json

重启onlyoffce容器,再次测试,还是308问题;

我在onlyoffice中怎样才能看到请求方发起内容的详细日志?我必须看到hzero-file 发给onlyoffce的详细内容才能明白为啥还有308,

$ ps aux | grep nginx 可以看到:

tail -F /var/log/onlyoffice/documentserver/adminpanel/out.log /var/log/onlyoffice/documentserver/adminpanel/err.log /var/log/onlyoffice/documentserver/docservice/out.log /var/log/onlyoffice/documentserver/docservice/err.log /var/log/onlyoffice/documentserver/converter/out.log /var/log/onlyoffice/documentserver/converter/err.log /var/log/onlyoffice/documentserver/nginx.error.log /var/log/onlyoffice/documentserver/metrics/out.log /var/log/onlyoffice/documentserver/metrics/err.log /var/log/onlyoffice/documentserver-example/out.log /var/log/onlyoffice/documentserver-example/err.log

这条命令应该是看所有log的, 执行这条命令,可以看到所有日志,其中有条日志是我想要看到的:

==> /var/log/onlyoffice/documentserver/nginx.error.log <==

2025/12/07 04:22:22 [error] 29581#29581: *211 open() “/var/www/onlyoffice/documentserver/web-apps/apps/api/documents/api.js/web-apps/apps/api/documents/api.js” failed (20: Not a directory), client: 172.18.0.1, server: , request: “GET /9.1.0-bc930140d198d21185b7c6cf5139630d/web-apps/apps/api/documents/api.js/web-apps/apps/api/documents/api.js HTTP/1.1”, host: “onlyoffice-hzero:8800”

这一条:就是我刚才更改了hzero-file的application.yml中的 doc-server-url 导致的。这条日志印证了hzero-file确实会加上/web-apps/apps/api/documents/api.js ,所以,doc-server-url确实只需要配置为http://onlyoffice-hzero:8800就可以了。

那我现在要接着找我的配置改回http://onlyoffice-hzero:8800后反馈308错误的日志:

可惜我多次刷新,在hzero-file中的log都能看到308,但是在onlyoffice的错误日志跟踪中看不到相关内容,这种错误不会出现在onlyoffice的错误日志中吗?

/var/log/onlyoffice/documentserver/nginx.error.log

/var/log/onlyoffice/documentserver/docservice/out.log /var/log/onlyoffice/documentserver/docservice/err.log

1. ​确认请求是否真正到达OnlyOffice​

查找有308重定向配置的地方:

$ grep “return 30” /etc/nginx/includes/*

返回: /etc/nginx/includes/ds-docservice.conf:

 return 308 $the_scheme://$the_host$the_prefix/9.1.0-$cache_tag$cache;

打开这个配置文件,查看具体内容:

#welcome page
location = / { return 308 $the_scheme://$the_host$the_prefix/welcome/; }

就是说直接访问跟路径的时候,就会重定向到welcome页面,但是从之前的日志可以看出我们设置的http://onlyoffice-hzero:8800 会被容器端口转发到80端口,而在onlyoffice服务器上

root@47397c159d32:/etc/nginx# more nginx.conf

user www-data;

worker_processes 1;

pid /run/nginx.pid;

error_log /var/log/nginx/error.log;

include /etc/nginx/modules-enabled/*.conf;

也就是说主要配置在:/etc/nginx/conf.d/ ds.conf 中:

/etc/nginx/conf.d/ ds.conf

include /etc/nginx/includes/http-common.conf;

server {

  listen 0.0.0.0:80;

  listen [::]:80 default_server;

  server_tokens off;

  set $secure_link_secret 8qldl8B12tCtjYXWA2gS;

  include /etc/nginx/includes/ds-*.conf;

}

也就是说主要配置在:/etc/nginx/includes/ds-docservice.conf 中:

而在ds-docservice.conf中,第一句就是 把根目录重定向到 welcom页面

location = / { return 308 $the_scheme://$the_host$the_prefix/welcome/; }

但我们从之前的日志可以看出,hzero-file服务确实是把 根目录拼接上了/web-apps/apps/api/documents/api.js 再请求onlyoffice的,所以不存在直接请求根目录的情况。

还有第二个308的配置:

#script caching protection
location ~ ^(?<cache>\/web-apps\/apps\/(?!api\/documents\/api\.js$).*)$ {
return 308 $the_scheme://$the_host$the_prefix/9.1.0-$cache_tag$cache;
}

这是缓存策略,也是版本兼容策略,当请求方发出一个固定的路径请求后,onlyoffice可以根据实际版本重定向到不同版本的实际脚本路径。

308 跳转到带版本号的 URL 后,OnlyOffice 配置了专门的 location 处理版本号路径:

location ~ ^/([\d]+\.[\d]+\.[\d]+[\.|-][\w]+)/(?<path>.*)$ {

  proxy_pass http://docservice/$path$is_args$args;

  # 其他 proxy 配置(超时、版本等)

}

作用:剥离版本号前缀(如 9.1.0-abc123/),将剩余路径(web-apps/apps/main.js)代理到 OnlyOffice 后端服务(docservice),确保资源能正确访问。

4. OnlyOffice 业务目的(核心价值)

(1)静态资源长期缓存

/web-apps/apps/ 下的 JS/CSS 等资源变动极少,通过 308 永久重定向到带版本号 + 缓存标签的 URL,让浏览器 / CDN 长期缓存(后续配置中设置 max-age=31536000),大幅减少重复下载。

(2)版本隔离

OnlyOffice 升级版本(如 9.1.0 → 9.2.0)时,修改 308 中的版本号(9.2.0),旧缓存的 URL(9.1.0-xxx)自动失效,浏览器会请求新的版本 URL,避免缓存污染导致的功能异常。

(3)核心文件缓存隔离

通过负向断言排除 api.js,因为该文件包含文档服务器的接口地址、版本逻辑等动态内容,若缓存会导致客户端调用旧接口,因此专门为 api.js 配置了「禁用缓存」规则:

nginx

location ~ ^(\/[\d]+\.[\d]+\.[\d]+[\.|-][\w]+)?\/(web-apps\/apps\/api\/documents\/api\.js)$ {

  expires off;  # 禁用过期缓存

  add_header Cache-Control “no-store, no-cache, must-revalidate”;  # 强制不缓存

  # 其他配置(gzip、alias 等)

}

308 配置的关键注意事项(OnlyOffice 专属)

1. 变量必须提前定义

$the_scheme/$the_host/$the_prefix/$cache_tag 是 OnlyOffice 在主配置中定义的自定义变量,若缺失会导致 308 跳转 URL 异常(如 :///9.1.0-/web-apps/apps/main.js),Nginx 启动报错。

2. 308 缓存与版本升级

308 是永久重定向,浏览器缓存后不会自动失效,因此 OnlyOffice 升级时必须修改版本号(如 9.1.0→9.2.0)或 $cache_tag,让新 URL 触发新请求;

测试 / 开发阶段可临时改用 307(临时重定向),避免缓存干扰。

先改成307试试(conf文件中,只需要把308改成307,别的不用改)

sed -i ‘s/return 308/return 307/g’ /etc/nginx/includes/ds-docservice.conf

nginx -s reload

再次访问hzero-file文件服务的word文档在线编辑,这次没有返回308,返回了405

405是方法不允许,元宝说可能是服务端点配置不正确,建议改成http://onlyoffice-hzero:8800/ConvertService.ashx

再次测试,hzero-file文件服务没有返回错误,但是前端界面显示 error , 并且onlyoffice日志出现错误:
[2025-12-07T09:17:43.588] [WARN] [localhost] [null] [userId] nodeJS – convertRequest unexpected outputtype =

说明不是这么回事。

元宝搜索到 CSDN有篇文章说:有碰到308的问题是因为

onlyoffice容器里的nginx无法正确识别$the_host.

编辑/etc/nginx/includes/ds-docservice.conf

全局替换$the_host成$http_host

重启nginx

nginx -s reload

但实际测试下来也没用,这是个过时的说法。

继续分析,

根路径测试:

curl -I -X GET http://onlyoffice-hzero:8800

HTTP/1.1 307 Temporary Redirect
Server: nginx
Date: Sun, 07 Dec 2025 09:38:34 GMT
Content-Type: text/html
Content-Length: 164
Connection: keep-alive
Location: http://onlyoffice-hzero:8800/welcome/

curl -I -X POST http://onlyoffice-hzero:8800

HTTP/1.1 307 Temporary Redirect
Server: nginx
Date: Sun, 07 Dec 2025 09:40:45 GMT
Content-Type: text/html
Content-Length: 164
Connection: keep-alive
Location: http://onlyoffice-hzero:8800/welcome/

 测试静态资源 307

curl -I -X GET http://onlyoffice-hzero:8800/web-apps/apps/main.js

HTTP/1.1 307 Temporary Redirect
Server: nginx
Date: Sun, 07 Dec 2025 09:43:09 GMT
Content-Type: text/html
Content-Length: 164
Connection: keep-alive
Location: http://onlyoffice-hzero:8800/9.1.0-8b6a79642574012ffddb2cd8aeecfa96/web-apps/apps/main.js

所以,测试下来服务端没啥问题,就是调用端的问题,hzero-file服务的 application.yml中更改编辑器类型配置,再重启:

      # 编辑器类型 onlyOffice/hoffice

      edit-type: ${ONLY_OFFICE_EDIT_TYPE:onlyOffice}

这次有显示了,这是说文档安全令牌的格式不正确:

Hzero-file 服务的日志中没有错误,onlyoffice 容器服务有错误信息:

[2025-12-07T10:11:01.796] [WARN] [localhost] [17651021616605e223b9] [userId] nodeJS – checkJwt error: name = JsonWebTokenError message = jwt malformed token = epFl7vl24D

由于我已经在容器的docker-compose.yml中设置了- JWT_ENABLED=false,所以理论上应该不要求token了,但测试发现,如果在调用的时候传了token,onlyoffice还是会检查token的有效性,刚开始报格式错误,改成标准的jwt格式后又报错验证错误,docker-compose.yml和hzero-file的application.yml两边保持一致都不行,不管是两边都填密钥还是两边都填同一密钥计算出来的长长的TOKEN都通不过验证。

所以后来就想,已经设置jwt验证为false,为啥还要提供token啊,就把hzero-file的application.yml中的 onlyoffice配置部分的token注释掉,这样前端检查的网络中看url 这个api的响应中就没有token了,onlyoffice就不不报错了。

总结:

  1. onlyoffice 最新版的容器 9.1.0版本可用。trail环境用的8.x的版本也可用,看起来不同版本的onlyoffice兼容性都不错。
  2. 非全容器环境,Hzero相关服务都直接运行在linux,非docker网络内的话, onlyoffice 容器的compose-yml中要把minio文件服务的域名和网关服务的域名解析加上。(如果是全容器环境则不需要)

    extra_hosts:

      – “oss.hzero.com.cn:172.18.14.48”

      – “hzero-gateway:172.18.14.48”

  • 为方便demo环境配置,去掉jwt验证,这需要在onlyoffice 容器的compose-yml中加上配置:

    environment:

      – JWT_ENABLED=false

  • demo非全容器环境,hzero-gateway网关地址在onlyoffice看来属于本地host机地址,其默认安全策略禁止访问,导致回调地址不可用,文件不能保存,所以要去掉这个策略,方法是修改default.json,把”allowPrivateIPAddress”: true,为持久有效,拷贝到容器外,修改后进行挂载

    volumes:

      – ${DOCKER_VOLUME_DIRECTORY:-./volumes}/onlyoffice/DocumentServer/default.json:/etc/onlyoffice/documentserver/default.json

备注:在全容器环境,这个配置也需要更改。

  • onlyoffice容器中的local.json 每次启动会被服务器自动修改,因此不要去修改这个文件,也不要去做持久性挂载,网上和AI里面说的很多修改这个文件的方法并不可取。要禁用JWT验证要通过docker-compose.yml配置去设置,而不是修改这个文件。
  • Hzero-file 的application.yml文件中的配置,编辑器类型edit-type一定要配置onlyOffice, 选配平台选配下来的配置文件默认是hoffice, 这个配置不对就导致一系列308,405…等等错误,怎么改都搞不定。后来跟产研聊,hoffice是啥选项? 他们说这是6年前onlyoffice还不成熟,有很多bug, 他们基于开源的onlyoffice,修改了很多bug, 形成了hoffice版本, 但后来onlyoffice本身不断迭代进步,比他们自己的hoffice版本好,他们就放弃了hoffice的继续迭代,直接用onlyoffice了,所以hoffice这个配置选项,早就没用了,只是为了兼容5年前还在用hoffice的用户。

token注释掉,留着就会导致onlyoffice去验证,跟我设置去掉验证冲突。当然我看到公司开发环境和试用环境是留着的,他们可能启用了jwt验证。其他跟开放平台文档的配置保持一致是可以的。

    only-office:

      # 编辑器类型 onlyOffice/hoffice

      edit-type: ${ONLY_OFFICE_EDIT_TYPE:onlyOffice}

      # onlyOffice文件key过期时间

      file-key-expire: ${ONLY_OFFICE_FILE_KEY_EXPIRE:30}

      #token: ${DOC_SERVER_TOKEN:LSe9EvjMC5z8QvF0S3p1P7rAI236tWpd}

      doc-server-url: ${DOC_SERVER_URL:http://onlyoffice-hzero:8800}

      call-back-url: ${DOC_SERVER_CALL_BACK:http://hzero-gateway:8080/hfle/v1/only-office/save/file}

      converter-url: ${DOC_SERVER_CONVERTER_URL:http://onlyoffice-hzero:8800/ConvertService.ashx}

备注:后来在搞容器环境测试的时候,把onlyoffice-hzero改成onlyoffice.hzero.com.cn了:

doc-server-url: ${DOC_SERVER_URL:http://onlyoffice.hzero.com.cn}

converter-url: ${DOC_SERVER_CONVERTER_URL:http://onlyoffice.hzero.com.cn/ConvertService.ashx}

所以要做些改动:
a) 在 /etc/hosts中加上 172.18.14.48 onlyoffice.hzero.com.cn

b) nginx做反向代理:

server {

    listen 80;

    server_name onlyoffice.hzero.com.cn;  # 匹配统一域名

    # 反向代理到Docker网络内的onlyoffice容器8800端口(直接用别名)

    location / {

        proxy_pass http://onlyoffice.hzero.com.cn:8800;  # 直接指向onlyoffice容器服务端口

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 300s;

        proxy_send_timeout 300s;

        proxy_read_timeout 300s;

    }

}

  • 记得在hzero-file的POM文件中加上onlyoffice的依赖,这在开放平台文档中有提到。

        <dependency>

            <groupId>org.hzero.starter</groupId>

            <artifactId>hzero-starter-fileview-onlyoffice</artifactId>

        </dependency>

总之,搞明白了就很好用,也很好配置。

HZERO PaaS平台-Docker版demo笔记(二)Docker版测试 问题5-9

问题五、知识问答涉及的跨域访问问题,HKMS服务访问问题和大模型APIkey问题。

测试知识问答,浏览器控制台看到的错误信息是:

Access to XMLHttpRequest at ‘http://aigc.hzero.com.cn/v1/open/image-emb/common’ from origin ‘http://dev.hzero.com.cn’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.

分析:这是跨域访问被阻止了,按照元宝建议,nginx反向代理添加内容:

        # 添加CORS响应头

        add_header ‘Access-Control-Allow-Origin’ ‘http://dev.hzero.com.cn’ always;

        add_header ‘Access-Control-Allow-Methods’ ‘GET, POST, OPTIONS, PUT, DELETE’ always;

        add_header ‘Access-Control-Allow-Headers’ ‘DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization’ always;

        add_header ‘Access-Control-Expose-Headers’ ‘Content-Length,Content-Range’ always;

        add_header ‘Access-Control-Allow-Credentials’ ‘true’ always;

重启动nginx

知识库问答执行错误:

控制台错误显示交叉验证策略阻止了访问。

分析:

Aigc.hzero.com.cn是个反向代理地址,浏览器发现有跨域访问,会给目标跨域地址发个预检请求(options类型), 反向代理默认会把所有请求发给被代理的服务,也就是后端的hzero-aip-app:8088, hzero-aip-app会怎么处理呢?看hzero-aip-app的application.yml,其中关于跨域访问的配置是:

    # 跨域配置

    cors:

      allowed-origins:

      – ${HZERO_AIP_CORS_ALLOWED_ORIGINS:*}

      allowed-headers:

      – ${HZERO_AIP_CORS_ALLOWED_HEADERS:*}

      allowed-methods:

      – ${HZERO_AIP_CORS_ALLOWED_METHODS:*}

也就是说允许任何来源任何方法(按理应该包含options预检方法),所以正常应该是可以的。然后有重新翻了下开放平台上AIGC的部署文档,发现在反向代理的配置的地方跟原来的版本有变化,按照新的变化,更新了nginx反向代理的配置:

  server {

        listen       80;

        server_name  aigc.hzero.com.cn;

        location / {

          proxy_pass http://hzero-aip-app:8088;

          proxy_set_header Host $host:$server_port;

          proxy_set_header X-Real-IP $remote_addr;

          proxy_set_header Host $host;

          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

          proxy_buffering off;

        }

  }

重启nginx,再测试:

这次没有报跨域访问的错误,只是说链接KMS出了问题,不过这并不稳定,全部容器重启后再次访问,还是出现跨域访问被block的问题,提示很明确:No ‘Access-Control-Allow-Origin’ header is present on the requested resource. 看了哪些网络请求,确实也没提供 Access-Control-Allow-Origin

解决方案:还是在nginx中配置aigc.hzero.com.cn反向代理的地方修改,按照豆包建议做各种nginx的配置修改都没用,最后还是恢复文档中简单配置就又好用了。而且在正常好用的情况下,也没在请求标头中看到Access-Control-Allow-Origin,单独打开没有缓存的chrome测试也是好的。那看来所谓的不稳定表现是原来Edge浏览器缓存原因? nginx配置上不复杂,就按文档就行?后面在多测测吧。

连接KMS的问题:

链接KMS出了什么问题呢?我们查hzero-aip-app服务的日志:

2025-11-29T22:33:19.068+08:00 ERROR 1 — [hzero-aip-app] [r-http-epoll-16] o.h.a.k.domain.search.SearcherWithFlux : HKMS 调用异常:

org.springframework.web.reactive.function.client.WebClientRequestException: finishConnect(..) failed: Connection refused: hzero-hkms/172.18.0.27:18080

从日志看,hzero-aip-app链接HKMS时,链接被拒绝了。那我们先测试这两个容器之间的连通性:

Hzero-aip-app 容器测试访问hzero-hkms:

# echo ‘public class Test { public static void main(String[] args) { try (java.net.Socket s = new java.net.Socket()) { s.connect(new java.net.InetSocketAddress(“hzero-hkms”, 18080), 3000); System.out.println(“✅ 连通成功!”); } catch (Exception e) { System.out.println(“❌ 连通失败: ” + e.getMessage()); } } }’ > Test.java && javac Test.java && java Test && rm -f Test.java Test.class

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

❌ 连通失败: Connection refused

测试下来就是联通失败,看hzero-hkms容器的ip地址,确实是172.18.0.27,而在hzero-aip-app的application.yml中关于HKMS服务的配置是:
      llama:

        gateway-path: ${HZERO_KNOWLEDGE_LLAMA_GATEWAY_PATH:http://hzero-hkms:18080}

这么说,aip-aip-app服务,根据配置中的hzero-hkms这个容器服务名正确的解析了其IP地址。也就是网络可达,但链接被拒绝了。猜测是 HKMS的服务访问策略里面做了什么设置,拒绝了某些来源的链接。通常这种设置在哪里呢?我们在浏览器直接访问hkms服务 http://locaohost:18080 是有响应的。

那么拒绝访问的设置是在hkms服务的web配置中?

我先在容器外,linux 主机中测试下链接HKMS服务,是否能成功:

# echo ‘public class Test { public static void main(String[] args) { try (java.net.Socket s = new java.net.Socket()) { s.connect(new java.net.InetSocketAddress(“localhost”, 18080), 3000); System.out.println(“✅ 连通成功!”); } catch (Exception e) { System.out.println(“❌ 连通失败: ” + e.getMessage()); } } }’ > Test.java && javac Test.java && java Test && rm -f Test.java Test.class
✅ 连通成功!

突然发现自己好傻,18080端口是映射到容器外的端口,在容器里面当然访问不了。

解决方案:

更改 hzero-aip-app的application.yml 更改hkms服务的端口,从 18080 改成80

      llama:

        gateway-path: ${HZERO_KNOWLEDGE_LLAMA_GATEWAY_PATH:http://hzero-hkms:80}

对hzero-hype服务调用的配置端口也要改成80;

同样的问题在hzero-aip-server中也存在,hzero-hkms服务的端口要改成80.

修改完成后,重新构建jar, docker镜像,重启动hzero-aip-app服务 和hzero-aip-server服务。

再次测试知识库问答:

这次没有之前连不上HKMS的错误了,提示了一个新的错误,好型跟大模型调用有关:

查hzero-aip-app服务日志

Caused by: org.springframework.web.client.ResourceAccessException: I/O error on POST request for “https://ark.cn-beijing.volces.com/api/v3/chat/completions”: ark.cn-beijing.volces.com

是调用大模型API遇到了IO意外,没有更详细的信息,不过类似的问题在文档向量化处理时提供了更详细的信息,其实就是无法解析大模型API中的域名:

难道是我们把hzero-aip-app放到容器内去运行了,容器内只能解析docker网络内的容器服务名,确实无法解析大模型API的域名?

在模型账号对接的测试的地方也是遇到同样的问题了:出现了DNS 错误。

想着问下豆包如何解决容器内服务访问外网问题,但是豆包断网了。嗯,想起来了,已经是凌晨12点了,家里的wifi设置了自动断网,

临时链接下手机热点,继续问豆包,但是,突然想起这可能是我断网导致的吧,于是再测试模型账号对接测试:发现正常了。确实是断网的原因。

再做文档向量同步也成功了:

知识问答,报了另外一个错误,说是API KEY 错误,大概是重排模型的APIkey 还没填进去

输入正确的api Key之后再测,知识库问答就OK了:

所以核心问题是容器服务hzero-hkms 的端口问题,我们正常再hzero-aip-app服务和hzero-aip-server服务的application.yml中配置的是容器映射到外面的端口,但是在docker compose 网络内部,不能用映射到外面的端口18080,必须是容器内的端口80。

不过,仔细一想,我们在hzero-aip-app和hzero-aip-server的yml配置文件中对hkms访问的端口改成容器的端口也不行,因为我们还要兼容hzero-aip-app和hzero-aip-server两个服务本身没有在docker 容器内运行的情况。所以最合理的做法是保持hzero-aip-app和hzero-aip-server 的yml配置中的18080端口,但是把HKMS的nginx 的web服务端口从80改成18080,这样hkms容器内外端口就保持一致,可以兼容hzero-aip-app和hzero-aip-server服务在docker compose网络内访问和网络外访问的情况。

执行:

Hzero-aip-app 和hzero-aip-server 对hkms的访问端口配置还是恢复到18080, 更改hkms容器Nginx的web服务端口为18080; 更改hkms 容器的docker-compose.yml中的端口映射为18080:18080;

hype服务也要类似做更改,hype容器之前配置的时候,没有把容器内的web服务配置文件挂载出来,所以在hype的docker-compose.yml中要做下挂载

先在volumes中新建hype目录

$ cd /d01/hzero-dockers/volumes

$ mkdir hype

$ sudo chown -R 33:33 ../volumes/hype

$ sudo chmod -R 755 ../volumes/hype

启动hype 容器

$ cd /d01/hzero-dockers/hzero-hype-docker

$ docker compose up -d

#把原来的web服务启动文件拷贝出来

$ docker cp hzero-hype:/root/execute/bin/start.sh /d01/hzero-dockers/volumes/hype/

#关闭容器

更改 /d01/hzero-dockers/volumes/hype/start.sh, 把端口从80改成10080

#docker-compose.yml中挂载

    volumes:

      – ${DOCKER_VOLUME_DIRECTORY:-../volumes}/hype/start.sh:/root/execute/bin/start.sh

#再启动容器,OK了:

不过有个问题始终存在,那就是每次容器服务全部重启之后再去测试《我的HZERO运营知识库》知识库问答的时候,当我们开始输入问题的时候,系统就会去找相似问题提供选择,这时就会调用aigc.hzero.com.cn 网关中的API了,这个时候涉及跨域,因为我们的原始域是dev.hzero.com.cn , 浏览器发送请求给aigc.hzero.com.cn的时候会告诉服务端这是跨域,等服务端返回消息,要看返回消息中是否包含 响应头(服务器配置):Access-Control-Allow-Origin,并且Access-Control-Allow-Origin 明确是包含了发送的原始域,或者*(所有域);如果返回的消息中没包含,那么浏览器就拒绝把响应消息返回给浏览器前端用户,直接阻塞掉了。

目前测试中发现,当nginx 和 hzero-aip-app 都放在docker容器中运行的时候,nginx的配置中反向代理的域名aigc.hzero.com.cn 指向容器服务名hzero-aip-app:8088 的时候,服务返回的响应中没有Access-Control-Allow-Origin,从而导致被浏览器的Cors(跨域资源共享)策略阻塞。这个时候,如果我们在nginx.conf中配置加上 Access-Control-Allow-Origin: ‘dev.hzero.com.cn’ 也会促发错误,错误信息是Access-Control-Allow-Origin只允许有一条,但实际有两条Access-Control-Allow-Origin: ‘dev.hzero.com.cn’  和 Access-Control-Allow-Origin: ‘*’ , 我们在hzero-aip-app的服务yml配置中明确是:

    # 跨域配置

    cors:

      allowed-origins:

      – ${HZERO_AIP_CORS_ALLOWED_ORIGINS:*}

      allowed-headers:

      – ${HZERO_AIP_CORS_ALLOWED_HEADERS:*}

      allowed-methods:

      – ${HZERO_AIP_CORS_ALLOWED_METHODS:*}

所以,正常hzero-aip-app服务返回的响应中肯定是包含Access-Control-Allow-Origin: ‘*’ 的,加上nginx中配置增加的Access-Control-Allow-Origin: ‘dev.hzero.com.cn’就会出现浏览器提示的错误。 不过诡异的是: 既然浏览器能获得后端服务返回的Access-Control-Allow-Origin: ‘*’ ,那为什么在我的nginx配置中没有增加Access-Control-Allow-Origin: ‘dev.hzero.com.cn’的时候他就获取不到呢? 好了,因为我们在nginx配置中国增加了Access-Control-Allow-Origin而出现重复的Access-Control-Allow-Origin错误之后,我们在nginx配置中把这一条删除掉了,浏览器就不报错了,然后就能正常访问了。这个时候我们可以明确看到,响应头中包含了我们在nginx配置中曾经添加的 Access-Control-Allow-Origin: ‘dev.hzero.com.cn’

那为什么我们明确的已经在nginx的配置文件中删除了这条配置了,他还能在响应头中出现呢?是因为缓存吗? 是哪里的缓存呢?

  1. 删除浏览器数据,刷新,重新登录,响应头中依然包含。工作正常,看起来不是客户端本地缓存。
  2. 重启nginx服务,刷新,响应头中依然包含。工作正常,看起来不是web服务端缓存。
  3. 重启hzero-aip-app服务,响应头中依然包含。工作正常,看起来不是后端服务端缓存。
  4. 重启hzero-gateway服务,响应头中依然包含。工作正常,看起来不是后端服务端缓存。
  5. 究竟是哪里缓存的呢?

#Nginx容器内执行:
# curl -H ‘Origin: dev.hzero.com.cn’ \

-H ‘Authorization: Bearer 7a67e4b8-998d-4e74-a9b8-0f2da0f4da9e’ \

http://hzero-aip-app:8088/v1/open/knowledge/search-question?tenantId=0 \

-i> > >

HTTP/1.1 200 OK

Vary: Origin

Vary: Access-Control-Request-Method

Vary: Access-Control-Request-Headers

Access-Control-Allow-Origin: dev.hzero.com.cn

Access-Control-Expose-Headers: date, content-encoding, server, etag, vary, Cache-Control, Last-Modified, content-type, transfer-encoding, connection, x-application-context, content-disposition

Access-Control-Allow-Credentials: true

Content-Type: application/json

Content-Length: 95

Cache-Control: no-cache, no-store, max-age=0, must-revalidate

Pragma: no-cache

Expires: 0

X-Content-Type-Options: nosniff

X-Frame-Options: DENY

X-XSS-Protection: 0

Referrer-Policy: no-referrer

以上是不通过代理,直接访问http://hzero-aip-app:8088,在给了Origin: dev.hzero.com.cn后,返回包含了Access-Control-Allow-Origin: dev.hzero.com.cn,说明这个确实是后端服务hzero-aip-app返回的,不是nginx返回的。

说明:Access-Control-Allow-Origin: dev.hzero.com.cn 既不是 nginx 配置残留,也不是缓存,而是 后端 hzero-aip-app 的 Spring Boot CORS 框架「动态生成」的!

为什么后端配置 allowed-origins: *,却返回了具体的 dev.hzero.com.cn?

这是 Spring Boot CORS 框架的「隐式适配逻辑」,专门针对「带凭证的跨域请求」:

你的后端配置了 Access-Control-Allow-Credentials: true(响应头中已显示);

根据 CORS 标准:带凭证(Cookie/Token)的跨域请求,Access-Control-Allow-Origin 不能是 *(浏览器会拒绝);

因此 Spring Boot CORS 框架会「智能适配」:当配置 allowed-origins: * 且 allow-credentials: true 时,框架不会返回字面的 *,而是 动态返回请求头中的 Origin 值(即 dev.hzero.com.cn),既满足标准,又实现了「允许所有源 + 带凭证」的需求。

这就是一直困惑的核心原因 —— 后端配置的 * 是「逻辑上允许所有源」,但实际返回的是「请求的具体源」,而非字面的 *。

但是,但是。。。为啥第二天重启平台服务之后,他又会报CORS错误了?

  • 切换到浏览器无痕模式再试,响应头中依然包含。工作正常,看起来也不是缓存问题。
  • 关闭系统代理开机自启,重启服务器,重启整个平台服务,用浏览器无痕模式,再试:

问题就重现了:

第一次调用,响应标头是空的:

第二次调用,响应表头,有内容,并且有明确的错误提示:

我们把注意力集中在502 Bad Gateway上:

这个时候先看nginx中的log:
#1
172.18.0.1 – – [01/Dec/2025:06:49:45 +0000] “OPTIONS /v1/open/knowledge/search-question?tenantId=0 HTTP/1.1” 502 559 “http://dev.hzero.com.cn/” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 Edg/142.0.0.0” “-“

#2

2025/12/01 06:49:45 [error] 32#32: *7 connect() failed (113: No route to host) while connecting to upstream, client: 172.18.0.1, server: aigc.hzero.com.cn, request: “OPTIONS /v1/open/knowledge/search-question?tenantId=0 HTTP/1.1”, upstream: “http://172.18.14.48:8088/v1/open/knowledge/search-question?tenantId=0”, host: “aigc.hzero.com.cn”, referrer: “http://dev.hzero.com.cn/”

#3

172.18.0.1 – – [01/Dec/2025:06:56:17 +0000] “GET / HTTP/1.1” 200 4959 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134” “-“

172.18.0.1 – – [01/Dec/2025:06:56:18 +0000] “GET /adfs/probe HTTP/1.1” 200 4959 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134” “-“

在nginx的日志中,
#1我们看到一条来自客户端 172.18.0.1的options预检请求:

这个172.18.0.1 是我们运行的docker compose网络的网关,也就是运行该docker网络的linux虚拟机的IP地址。

$ docker network inspect hzero-demo | grep -E “Subnet|Gateway”
“Subnet”: “172.18.0.0/16”,
“Gateway”: “172.18.0.1”

   #2这里的upstream指的是上游服务器,说是针对来自172.18.0.1的options预检请求,去链接上游服务器172.18.14.48:8088的时候报错了。这当然会报错,因为不在一个网段内,nginx是运行在容器网络里面的,其自己的IP地址可以看到是:

$ docker inspect –format ‘{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}’ nginx-hzero
172.18.0.2

所以会报bad gateway;

这也就解释了:为什么nginx运行在linux 本机而不是容器内时,不会出问题了。

而 upstream: “http://172.18.14.48:8088/v1/open/knowledge/search-question?tenantId=0″表明nginx把反向代理的配置 hzero-aip-app这个docker容器的服务名错误的

我们来捋一捋:

把这个问豆包,豆包说上游服务器是指具体业务服务,那应该不是172.18.14.48,应该是hzero-aip-app服务乃容器对应的IP才对。

按理说容器内的nginx应该去解析容器服务名hzero-aip-app在容器网络中IP地址,为什么会去解析到容器外的linux主机IP地址?那豆包说了:Nginx 默认不会动态解析服务名(hzero-aip-app),而是在启动时缓存一次 DNS 结果。而 Docker 的服务名解析依赖内置 DNS 服务器(127.0.0.11),若 Nginx 未指定该 DNS,可能会走系统默认 DNS,导致解析错误。

在容器内执行解析命令(用nslookup或ping,若没有nslookup可先装:apt update && apt install dnsutils):

核心修复:给 Nginx 配置「Docker 内置 DNS 解析器」

Nginx 默认不会动态解析服务名(hzero-aip-app),而是在启动时缓存一次 DNS 结果。而 Docker 的服务名解析依赖内置 DNS 服务器(127.0.0.11),若 Nginx 未指定该 DNS,可能会走系统默认 DNS,导致解析错误。

在server块或http块中添加resolver配置,强制 Nginx 使用 Docker 内置 DNS,并设置短缓存(避免解析过时)

    # 核心:添加Docker内置DNS解析器(必须加!)

    resolver 127.0.0.11 valid=60s;  # 127.0.0.11是Docker默认DNS,valid=60s定期刷新解析

resolver_timeout 5s;  # DNS解析超时时间

重启nginx 后问题解决。

回顾:我们之前曾经在windows的hosts文件中添加过对hzero-aip-app的解析,如果碰到异常场景就可能出现这种问题:

异常场景 :Nginx 未配置 resolver(依赖容器默认 DNS)

此时容器内的 Nginx 会使用容器 /etc/resolv.conf 中的 DNS 顺序(优先 127.0.0.11,后备宿主机 DNS):

正常情况下,还是会通过 127.0.0.11 解析到正确的容器 IP,Windows hosts 配置依然无效;

极端情况(比如 Docker 内置 DNS 故障,概率极低):若 127.0.0.11 无法响应,Nginx 会 fallback 到宿主机 DNS;

此时宿主机 DNS 解析 hzero-aip-app 时,会先查询 Windows hosts 文件 —— 如果 hosts 中配置了该域名的映射(如 1.2.3.4),就会返回这个错误 IP,导致 Nginx 代理失败。

但这不是 “冲突”,而是 “配置不规范导致的解析异常”:根源是 Nginx 未显式配置 resolver,而非 hosts 文件和 Docker DNS 的冲突。

问题六、无痕模式下,本地存在代理(VPN)的情况下无法访问:

现象,打开浏览器的无痕模式,访问dev.hzero.com.cn,结果出现:

点继续浏览后,就被阻塞了,死活无法进入下一步,打开检查发现:返回网关错误,去访问什么一个本地的7890端口去了。

元宝分析

根本原因分析:​​

代理端口冲突​(核心原因)

  1. 无痕模式未正确加载代理扩展或配置,导致请求被发送到 127.0.0.1:7890(本地代理端口)
    1. 该端口无活跃代理服务监听,造成网关错误(502)

解决方案:关闭本地系统代理软件。

再次访问,可以继续了。。

问题七、垃圾文件太多的问题

现象:在hzero_hfile.hfle_file表中发现大量的来自接口平台的定时任务的健康检查日志文件,每分钟产生2个文件,所以文件和文件表中的记录就非常多。

看了下定时任务的配置情况:

解决方案:

  1. 在 平台/调度服务/调度管理/调度任务 菜单进入,搜索“接口健康检查”先停掉接口平台健康检查的定期任务。
  2. 执行接口平台日志清理任务:

虽然显示完成了,但去hfle_file表看,并没有清除表中记录:

3、清除调度日志:

但实际只清除了hsdr_job_log表

并没有连带清除 hfle_file表,hfle_file表里面数据没变化.

去平台/开发管理/数据清理/数据清理配置处,执行了平台的数据清理日志和调度日志清理,也没有删除hfle_file表中的日志文件记录:

其他地方找不到系统界面上还有能清除的地方了,那么接下来只能手工清理了:

4、清除文件:在平台/文件管理/文件汇总查询的地方:

查询条件:HITF.HELTH_CHECK, 批量:100条,彻底删除,删除前,先看下minio桶里面的文件:

我看看执行后,是不是minio桶的文件也一并清除了:

实验结果,确实是minio桶的文件也一并被清除了。

不过每次100条,有4万多条要删除,这样删太慢了,接下来,直接删表删文件

select count(1) from hzero_file.hfle_file a where a.directory =’hsdr01/’ and a.file_name like ‘HITF.HEALTH_CHECK%’

–38890 条;

select count(1) from hzero_file.hfle_file a where a.directory =’hsdr01/’ 

–38891 条;

也就是说,目前调度任务日志都是接口平台的健康检查日志,所以一会儿去minio桶里头删除文件的时候,可以把hsdr01/0/MINO目录下的文件全部删除:

执行:

  1. 数据库记录删除:delete from hzero_file.hfle_file a where a.directory =’hsdr01/’ 
  2. MINO桶文件删除:进入hz-hsdr/hsdr01/0/MINIO目录,全选文件,然后点删除。

删除完成发现:hsdr01目录及其所有子目录都被删除掉了

这下OK了,只有100多个真正有用的文件记录了。

后续处理:

在 平台/调度服务/请求定义

找到接口平台健康检查,日志策略改成:仅记录异常。

但实际上这样还不够,直接禁用掉才行

这里禁用也不够,需要在调度服务/调度管理/调度任务 把接口平台的健康检查任务的自动初始化关掉:编辑,把“自动初始化”去掉,否则每次调度服务重启,会自动把这个终止的任务拉起来,而且还会把日志策略初始化成“全量记录”。

注意只有在启用状态才能编辑,非启用状态只能看详情,需要重启调度服务,才能回到启用状态,然后进行编辑。

备注(2025/12/09): 最近rebuild更新了hzero-file服务的jar包,发现清除调度日志的时候已经可以把相关联文件一起删除掉了。

问题八、文件在线编辑不能保存的问题

打开文件编辑之后,修改后点【保存并关闭】按钮后,界面没有提示信息,但后台hzero-file服务有错误日志,保存未成功。

后台日志关键错误信息是:

2025-12-08T10:31:17.514+08:00 ERROR 1 — [hzero-file] [ XNIO-1 task-2] .h.s.f.s.i.OnlyOfficeFeedBackServiceImpl : only office update text failed, callback : OnlyOfficeCallbackDTO{url=’http://onlyoffice-hzero:8800/cache/files/data/17651609109511b5aeb2_351/output.docx/output.docx?md5=1NJT1GsXAaXy9lv1ilKyVw&expires=1765161978&shardkey=17651609109511b5aeb2&filename=output.docx’, key=’17651609109511b5aeb2′, changesurl=’http://onlyoffice-hzero:8800/cache/files/data/17651609109511b5aeb2_351/changes.zip/changes.zip?md5=bK5BsAXe1FWgHbQ6muCZhw&expires=1765161978&shardkey=17651609109511b5aeb2&filename=changes.zip’, users=[2], status=2, notmodified=false} and key : 17651609109511b5aeb2

分析:该日志显示onlyoffice 通过回调API让hzero-file服务去系在onlyoffice缓存中更新后的文件时出错了。

onlyoffice容器日志也有对应的详细错误信息:

日志发给元宝分析,支持下载失败几种可能性,逐一分析:

1、网络连接问题:hzero-file的url api可以获得onlyoffice提供的编辑页面,说明网络连接没问题。

2、安全令牌(JWT)错误:我已经禁用了JWT验证,不是这个原因。

3、回调接口和逻辑是否有问题:hzero-file服务的jar包 和 onlyoffice的版本,docker-compose.yml中的配置跟非全容器环境是一样的,在非全容器环境是可以正常保存的,所以这种原因也排除掉。

4、文件路径或权限问题:OnlyOffice 服务端生成的用于更新的文件临时路径不正确,或 hzero-file 服务没有权限访问该路径,这个要仔细查一下:

我能想到的就是,挂载出来的文件目录权限是否足够,还有就是default.json中除了允许privateIP ,是否还要运行metaIP?

有个差别是我看了当初构建全容器环境的onlyoffice的挂载目录的时候是手工新建的挂载目录结构,但非全容器环境的话目录结构是容器启动时自动生成的,嗯,先尝试把原来目录结构删除掉,重启容器让目录结构也自动生成:

$ cd /d01/hzero-dockers/onlyoffice-docker

$ docker compose down

$ rm -rf /d01/hzero-dockers/volumes/onlyoffice/DocumentServer

#先注释掉docker-compose.yml中的default.json的挂载

$ docker compose up -d

#查看:相关挂载目录已经自动生成

#把default.json拷贝出来

$ docker cp onlyoffice-hzero:/etc/onlyoffice/documentserver/default.json ../volumes/onlyoffice/DocumentServer/

#更改default.json中的设置:”allowPrivateIPAddress”: false

#去掉docker-compose.yml中的default.json的挂载的注释

#重启onlyoffice容器

再次测试文件在线编辑功能,结果问题依旧,看起来不是这个原因。想到安全策略应该是优先被排查的原因,尝试把default.json中的 allowMetaIPAddress 设置为 true ,重启容器再试,结果问题依旧。看来也不是这个配置问题。

把hzero-file服务日志中的错误的文件下来连接地址,在hzero-file容器中直接访问:

# curl -v http://onlyoffice-hzero:8800/cache/files/data/176516391613405bf89d_852/output.docx/output.docx?md5=f9DLPCl-LnrOZBDQ3XcySA&expires=1765165594&shardkey=176516391613405bf89d&filename=output.docx

# *   Trying 172.18.0.9:8800…

* connect to 172.18.0.9 port 8800 failed: Connection refused

* Failed to connect to onlyoffice-hzero port 8800 after 0 ms: Connection refused

* Closing connection 0

#发现居然被拒绝了,想到之前在搜default.json中的private字符串时还有个参数:blockPrivateIP 默认是true, 尝试改成: “blockPrivateIP”: false, 重启onlyoffice容器, 再测试:问题依旧。

突然发现自己傻了,8800是onlyoffice容器外访问的端口,容器网络内应该是80端口,所以对于docker网络内的hzero-file服务也要也要跟容器外实现统一8800端口访问的话,需要更改onlyoffice的nginx端口,从80改成8800端口。

那为什么在hzero-file的application.yml中配置的是8800端口,前端可以成功打开编辑文件呢?也就是成功访问了onlyoffice-hzero:8800呢? 答:那个场景中,hzero-file的API接口 url 只是把onlyoffice-hzero:8800当做拼接字符串的一部分,拼接完成后返回给前端浏览器,真正访问这个地址的是前端浏览器,这是在容器外访问的。跟这里场景不一样,这里回调的时候是hzero-file容器真的要去访问这个地址的。

尝试像以前一样,把容器内的服务的web端口 从默认80改成跟对外映射一样的8800:

备注:这种更改对于简单的Nginx服务很容易,但对于onlyoffice这样的应用未必有用,如果官方未提供更改方法,其配置和规则设置比较多的话,就不一定能改成功了,只能试一试

=======试验开始===============

$ cd /d01/hzero-dockers/onlyoffice-docker

$ docker cp onlyoffice-hzero:/etc/onlyoffice/documentserver/nginx/ds.conf ../volumes/onlyoffice/DocumentServer/

#更改端口为8800

  listen 0.0.0.0:8800;

  listen [::]:8800 default_server;

保存,挂载

– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/onlyoffice/DocumentServer/ds.conf:/etc/onlyoffice/documentserver/nginx/ds.conf

端口映射也改成:

    ports:

      – “8800:8800”

重启onlyoffice容器,再测试: 这次报了个不能下载的错误:

Hzero-file后台服务日志没有错误,onlyoffice 容器日志没有对应的错误

请求 URL 是http://onlyoffice-hzero:8800/…,而onlyoffice-hzero这个域名被解析成了172.18.14.48(这是 OnlyOffice 服务对应的容器的实际 IP),8800是该服务监听的端口。所以 “远程地址 172.18.14.48:8800” 就是你这次请求要连接的目标服务端(OnlyOffice 服务)的 IP 和端口

这没有错,对于浏览器来说,他是在容器网络外的。

对于更改onlyoffice Nginx端口这个事,豆包的分析是:

把 OnlyOffice 的 Web 端口从 80 改成 8800本身不会直接导致 403 错误,但如果端口修改时未同步更新所有相关配置,会间接引发 403(核心是「签名验证 / URL 匹配失败」),具体原因如下:

1. 最可能的原因:签名生成时的端口不匹配

OnlyOffice 缓存文件的md5签名是基于 ** 完整请求 URL(含端口)** 生成的(比如生成签名时会包含http://onlyoffice-hzero:80/…)。

若你仅修改了访问端口为 8800,但:

OnlyOffice 服务端验证签名时,会用实际请求的 URL(http://onlyoffice-hzero:8800/…)重新计算签名。

此时「生成签名的 URL(带 80)」和「实际请求的 URL(带 8800)」不一致,导致md5验证失败,直接返回 403。

这个要访问的edit.bin可以在缓存文件中看到:

那这种情况就要清缓存

# rm -rf /var/lib/onlyoffice/*

# rm -rf /var/cache/nginx/*

继续测试:

这个错误应该是onlyoffice报的错,在hzero-file服务日志和onlyoffice的容器日志中都没有错误信息。

这样,把onlyoffice容器重置一下,再试验:

先把default.json 和 ds.conf 拷贝到 d01\hzero-dockers\volumes\onlyoffice

更改docker-compose.yml的挂载位置:

    volumes:

      – ${DOCKER_VOLUME_DIRECTORY:-../volumes}/onlyoffice/default.json:/etc/onlyoffice/documentserver/default.json

      – ${DOCKER_VOLUME_DIRECTORY:-../volumes}/onlyoffice/ds.conf:/etc/onlyoffice/documentserver/nginx/ds.conf

然后删除 d01\hzero-dockers\volumes\onlyoffice\Documentserver目录

然后重启onlyoffice容器

再次测试依然是 “打开文件时发生错误”, 看起来清缓存解决不了这个问题。

那按照元宝的说法,可能是我这种更改nginx端口的方法不对。

多次实验发现,ds.conf 这个文件不能挂载,挂载会导致混乱,而且在onlyoffice容器启动的时候,提示简历这位文件的软连接失败。

去掉这个挂载以后就可以回到成功打开文件编辑,只是保存失败的问题。

===========试验结束==================

上面的试验表明想通过更改nginx配置的方式来更改onlyoffice容器的web端口从原来的80改为8800,也不可行:onlyoffice的内部各种规则配置有点复杂,不是简单改一个Nginx配置的地方就能无故障使用。

那只能用其他方法绕了,绕的前提是不用为容器环境和非容器环境分别打包jar, 那么可以通过docker-compose.yml配置环境变量的方法,在纯容器环境的docker-compose.yml中,针对回调地址通过extra host 在hzero-file服务的容器内强行把onlyoffice-hzero解析到host机,从host机的8800端口访问,测试也不行,找不到路由。

忽然灵机一动,是不是可以通过反向代理搞定?

我们来捋一捋:

目的:容器内外通过统一域名端口访问onlyoffice的80端口

此图发给豆包,豆包基本明白我的意思,描述基本正确,漏了几点:

你漏了几点:

1、部署了3个容器,除了你说的两个,还有一个nginx容器

2、在nginx容器里面做了反向代理,把onlyoffice.hzero.com.cn 反向代理到dokcer网络内的onlyoffice容器的80端口

我要实现的目的是:在容器网络外的浏览器 和通过docker 网络内的hzero-file容器内都可以通过统一的域名onlyoffice-hzero.com.cn:80来访问 docker 网络内的onlyoffice的80端口。

你觉得我能实现目的吗?

豆包说能:

访问端访问地址实际路由链路
容器内 hzero-fileonlyoffice.hzero.com.cn:80hzero-file → hzero-demo 网络 → Docker DNS 解析别名 → onlyoffice 容器 80(无 nginx 中转)
容器外浏览器onlyoffice.hzero.com.cn:80浏览器 → Linux 宿主机 80 → nginx 容器 80 → 反向代理 → onlyoffice 容器 80

修改点:

  1. hzero-file 的application.yml配置中
  2. doc-server-url 设置成onlyoffice.hzero.com.cn(80端口默认可以省略掉)
  3. onlyoffice容器增加别名:onlyoffice.hzero.com.cn

    networks:

      hzero-demo:

        aliases:

          – onlyoffice.hzero.com.cn  # 配置你要的域名别名(核心)

  • Windows Host中增加解析:172.18.14.48 onlyoffice.hzero.com.cn(如果不是本地demo环境,是企业内网,在内部DNS中添加此解析)
  • nginx容器增加反向代理配置:

server {

    listen 80;

    server_name onlyoffice.hzero.com.cn;  # 匹配统一域名

    # 反向代理到Docker网络内的onlyoffice容器80端口(直接用别名)

    location / {

        proxy_pass http://onlyoffice.hzero.com.cn:80;  # 直接指向onlyoffice容器别名

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 300s;

        proxy_send_timeout 300s;

        proxy_read_timeout 300s;

    }

}

改完后再次运行测试:

查看nginx容器日志:

2025/12/09 05:10:26 [error] 37#37: *15 connect() failed (113: No route to host) while connecting to upstream, client: 172.18.0.1, server: onlyoffice.hzero.com.cn, request: “GET /web-apps/apps/api/documents/api.js HTTP/1.1”, upstream: “http://172.18.14.48:80/web-apps/apps/api/documents/api.js”, host: “onlyoffice.hzero.com.cn”, referrer: “http://dev.hzero.com.cn/”

看起来容器内的nginx把onlyoffice.hzero.com.cn的IP地址解析错误了,应该解析到docker网络内的IP地址而不是host主机地址。为避免混淆,直接更改nginx的方向代理配置:直接用onlyoffice-hzero的容器服务名,不用别名

server {

    listen 80;

    server_name onlyoffice.hzero.com.cn;  # 匹配统一域名

    # 反向代理到Docker网络内的onlyoffice容器80端口(直接用别名)

    location / {

        proxy_pass http://onlyoffice-hzero:80;  # 直接指向onlyoffice容器服务名

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 300s;

        proxy_send_timeout 300s;

        proxy_read_timeout 300s;

    }

}

这次可以正常打开了:

修改后保存,看hzero-file的后台服务日志,已经成功,在更新表了:

下载打开该文件可以看到,更新已经生效:

问题九、如何让配置管理更清晰?

关于文件服务,我决定做些优化,让配置管理更清晰:

一、Minio文件服务:

  1. 在平台/文件管理/文件存储配置/MINIO 处,EndPoint还是改成:oss.hzero.com.cn:9000
  2. 容器服务minio-hzero添加别名:oss.hzero.com.cn
  3. Windows hosts 文件添域名解析:172.18.14.48  oss.hzero.com.cn              #minio 文件服务域名(客户端直接预览PDF需要),去掉对minio-hzero名称的解析。
  4. 修数据:

文档地址

UPDATE hzero_aip.hdoc_document_version SET document_url = REPLACE(document_url, ‘minio-hzero:9000′,’oss.hzero.com.cn:9000’ );

UPDATE hzero_aip.hdoc_document_version SET source_key = REPLACE(source_key, ‘minio-hzero:9000′,’oss.hzero.com.cn:9000’ )

文件地址:

update hzero_file.hfle_file set file_url=REPLACE(file_url, ‘minio-hzero:9000′,’oss.hzero.com.cn:9000’ )

  • kkfielview文件预览服务:
  • 容器服务kkfileview-hzero添加别名:kkv.hzero.com.cn

   之前添加的extra_hosts可以去掉了。

  • Windows hosts 文件添域名解析:172.18.14.48  kkv.hzero.com.cn              # 文件预览服务域名。
  • 更改hzero-file文件服务的application.yml :    

kk-file-view-url: http://kkv.hzero.com.cn:8012/onlinePreview   # kkFileView的文件预览地址

重新构建hzero-file jar包和docker镜像
重启hzero-file服务。

这修改之后,客户端window hosts文件就保留6条解析,别的不用了:
172.18.14.48  dev.hzero.com.cn         #hzero-demo环境 Nginx服务器地址

172.18.14.48  gateway.hzero.com.cn     #网关的地址

172.18.14.48  aigc.hzero.com.cn        # ai-app服务的反向代理

172.18.14.48  kkv.hzero.com.cn        # kkfileview文件预览服务域名

172.18.14.48  oss.hzero.com.cn        # minio文件服务域名(客户端直接预览PDF需要)

172.18.14.48  onlyoffice.hzero.com.cn   # minio 文档在线编辑服务

HZERO PaaS平台-Docker版demo笔记(二)Docker版测试 问题1-4

#启动AI平台的所有容器:

$ bash start-all-dockers-h0base.sh*

$ bash start-ai-part-dockers.sh*

AI平台包括了中间件容器8个,H0基础开发平台服务15个,流程平台服务1个,AI平台服务4个.  其中需要在注册中心出现的java服务是17个(注册中心自己除外)。

全部容器启动完成时间大约10分钟

问题一、启动后去有三个服务成功在注册中心出现:

http://localhost:8000注册中心看服务启动情况,发下三个服务没出现:

1、hzero-schedule

看 hzero-gateway的容器日志

有条错误信息是:Caused by: java.net.UnknownHostException: db.hzero.com.cn: Name or service not known

按理不应该再有访问 db.hzero.com.cn 这个地址的,应该是mysql-hzero才对。

估计是容器中的jar包是老的,没有更新过的。

解决方案:

重新构建jar包,重新构建docker镜像。

#源环境(ubuntu-22.04-hzero)构建jar包:

$ cd /d02/hzero/project/ps-scheduler/

$ bash build.sh

#拷贝Jar包到目标环境

#在windows powershell 中执行

$ cp \\wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-scheduler\target\ps-scheduler.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-scheduler-docker\

#目标环境(ubuntu-22.04)构建docker镜像

$ cd /d01/hzero-dockers/hzero-scheduler-docker

$ docker compose down

$ docker build -t hzero-scheduler-jk-demo:1.12 .

$ docker compose up -d

结果:问题解决,再注册中心可见hzero-scheduler.

2、hzero-massage

看hzero-massage的容器日志:

有条错误信息:Caused by: java.net.UnknownHostException: db.hzero.com.cn: Name or service not known

按理不应该再有访问 redis.hzero.com.cn 这个地址的,应该是redis-hzero才对。

估计是容器中的jar包是老的,没有更新过的。

解决方案:

重新构建jar包,重新构建docker镜像。

#源环境:

$ cd /d02/hzero/project/ps-message/

$ bash build.sh

#Windows PowShell:

cp \\wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-message\target\ps-message.jar \\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-message-docker\

#目标环境:

$ cd /d01/hzero-dockers/hzero-message-docker

$ docker compose down

$ docker build -t hzero-message-jk-demo:1.12 .

$ docker compose up -d

结果:问题解决,再注册中心可见hzero-massage.

3、hzero-gateway

看 hzero-gateway的容器日志

有条错误信息是:Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to redis.hzero.com.cn/<unresolved>:6379

分析:

按理不应该再有访问 redis.hzero.com.cn 这个地址的,应该是redis-hzero才对。

估计是容器中的jar包是老的,没有更新过的。

解决方案:

重新构建jar包,重新构建docker镜像。

结果:问题解决,再注册中心可见hzero-gateway.

解决完上述问题后,在注册中心出现的服务是17个;

好,接下来,我们进入系统,测试,首先要进入系统把AIGC平台中neo4j图数据库地址,、默认向量库elasticsearch的地址、文件管理minio的地址换掉。

这里默认图数据库neo4j的地址换成容器服务名

这里默认向量库elasticsearch的地址换成容器服务名

注意minio配置这个地方:

Endpoint:应用与 MinIO 在同一 Docker 网络时,用容器服务名;否则用宿主机 IP + 端口。

代理地址:必须用外部可访问的地址(宿主机 IP / 域名 / 代理地址),不能用容器服务名。

问题二、登录问题:

首次进入dev.hzero.com.cn 会重定向到登录页面,登录页面地址错误:

分析:

这是我们在之前为容器中运行的oauth服务的application.yml中配置的地址, 看起来这个配置应该用外面的网关域名,不能用容器网络内的容器服务名,因为这个其实相当于定义一个变量返回,而不是真的要oauth服务去调用这个网关。

动作:
hzero-oauth服务的application.yml中

    # oauth 服务基础地址

base-url: ${HZERO_OAUTH_BASE_URL:http://hzero-gateway:8080/oauth}

更改为:

base-url: ${HZERO_OAUTH_BASE_URL:http://gateway.hzero.com.cn:8080/oauth}

重新构建, 重起服务。

结果:可以正常进入登录页面了。问题解决。

问题三、文档预览问题

背景:文件服务minio和 文件预览服务kkfielview原来直接安装在linux Host机上,后来都迁移到docker compose容器内运行了。

迁移后测试:PDF文件可以正常预览:

word和PPT文件预览会报错:

分析:前端检查:

前端会直接去用file服务的application.yml中配置的文件预览URL , 由于都改到容器内运行,所以之前把这个预览地址的URL也改成kkfileview的容器服务名开头了,但这个服务名在容器网络外是无法解析的。

解决方案:在文件服务的application.yml配置中把kk-file-view-url的域名从容器服务名改成容器外能访问的域名:kkv.hzero.com.cn

修改前:kk-file-view-url: http://kkfileview-hzero:8012/onlinePreview   # kkFileView的文件预览地址

修改后:kk-file-view-url: http://dev.hzero.com.cn:8012/onlinePreview   # kkFileView的文件预览地址。

然后重新构建jar,Docke镜像,重启容器。再测,这次kkfileview的URL没问题了,但内容显示404,看浏览器检查网络没有错误信息:

看kkfileview容器日志:

文件下载失败,url:

http://oss.hzero.com.cn:9000/hz-haip/haip01/0/MINIO/b53c59a8e17b4a828b201a649d488f45%40%E8%BD%AF%E4%BB%B6%E6%8E%88%E6%9D%83%E8%AF%81%E6%98%8E.docx

这个文件URL是文档表中存储的文件地址,oss.hzero.com.cn是之前minio服务直接装在host机上时配置的访问域名。所以之前存储的文档地址都是这个域名开开头的,但现在minio改成容器内服务了,以后所有的文档都会以minio的容器服务名开头了,但历史数据还是之前的域名,现在因为kkfileview文件预览服务也在容器内运行,所以无法解析oss.hzero.com.cn这个域名;

解决方案:

更改数据库表中文档url的域名地址为minio的容器服务名:

UPDATE hzero_aip.hdoc_document_version

SET document_url = REPLACE(document_url, ‘oss.hzero.com.cn’, ‘minio-hzero’)

WHERE document_id = 4;

再次测试,可以正常预览了:

kkfileview容器日志也显示正常访问:

2025-11-28 06:06:36.449 INFO 1 — [tp1224347463-48] c.k.w.c.OnlinePreviewController : 预览文件url:

http://minio-hzero:9000/hz-haip/haip01/0/MINIO/b53c59a8e17b4a828b201a649d488f45@软件授权证明.docx,previewType:OFFICE

不过这带来另一个问题就是PDF文件因为不经过kkfileview,直接显示,而且是直接用数据库中存储的URL显示,也没有把文件服务的容器服务名替换成代理地址的域名,所以就反而显示不出来了,解决方案感觉应该前端处理时,如果不调用预览服务进行显示,那么是否也应该把从后端获得的文件URL地址中的域名部分替换成文件服务的代理地址再进行显示? 这样就不会错了。

我在nginx配置反向代理:

# oss.hzero.com.cn  minio服务的反向代理

server {

    listen 80;

    server_name oss.hzero.com.cn;

    location / {

        # 改为后端服务实际IP:端口

        proxy_pass http://minio-hzero:9000;  # 示例:minio-hzero的9000端口

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection “upgrade”;

        proxy_set_header Host $host;  # 保留一个Host配置

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_buffering off;  # 按需开启/关闭(实时交互场景建议关闭)

    }    

重启nginx容器服务

Windows Hosts中配置oss.hzero.com.cn的DNS解析;

我们来看,如果前端执行了代理地址替换:

替换后的地址访问就是OK的:

备注:这个反向代理仅用于临时测试,测试完成后删除掉。

这个问题,产研说会在下个PI中解决掉,就是走代理,只是这个代理是在文件服务中写的,也是解决浏览器不能访问服务器内网Endpoint地址的情况。以前是要求Endpoint内外网能能访问到,解决这个问题之后可以允许Endpoint只能内网访问。

临时解决方案:

1、修数据:文档地址

UPDATE hzero_aip.hdoc_document_version

SET document_url = REPLACE(document_url, ‘oss.hzero.com.cn:9000’, ‘minio-hzero:9000’)

;

UPDATE hzero_aip.hdoc_document_version

SET source_key = REPLACE(source_key, ‘oss.hzero.com.cn:9000’, ‘minio-hzero:9000’)

;

  • windows的hosts中添加解析

172.18.14.48  minio-hzero

个人Demo使用问题暂时解决。

不过这并不稳定,第二天重启服务之后,发现docx 文档预览就不行了:

经过测试从文件服务API :signedURL 返回的负载,响应,预览内容都是正确的,把这返回直接在浏览器访问是可以下载文件的。

但是到了调用kkfileview 去预览的时候出错了:

把这个kkfileView的响应中的URL是:

http://minio-hzero:9000/hz-haip/haip01/0/MINIO/ca310b2e73b94fd1a47a29c6e13bcb5a%40%E4%B8%8A%E6%B5%B7%E7%9B%8A%E5%90%89-%E4%BD%8E%E4%BB%A3%E7%A0%81%E5%B9%B3%E5%8F%B0%E5%BA%94%E7%94%A8%E6%88%90%E5%8A%9F%E6%A1%88%E4%BE%8B.docx?response-content-disposition=attachment;filename*=UTF-8%27%27%E4%B8%8A%E6%B5%B7%E7%9B%8A%E5%90%89-%E4%BD%8E%E4%BB%A3%E7%A0%81%E5%B9%B3%E5%8F%B0%E5%BA%94%E7%94%A8%E6%88%90%E5%8A%9F%E6%A1%88%E4%BE%8B.docx&response-cache-control=must-revalidate,%20post-check=0,%20pre-check=0&response-expires=1764593862292&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=hzero.admin/20251201/us-east-1/s3/aws4_request&X-Amz-Date=20251201T125741Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=e016d6aa9b52dbeac9a7b98f6680fed6e0a467db4d0c233e673b435ca8883b5f

直接访问这个URL返回:

<Error>

<Code>InvalidRequest</Code>

<Message>The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.</Message>

<Resource>/hz-haip/haip01/0/MINIO/ca310b2e73b94fd1a47a29c6e13bcb5a@上海益吉-低代码平台应用成功案例.docx</Resource>

<RequestId>187D19B0939102B8</RequestId>

<HostId>dd9025bab4ad464b049177c95eb6ebf374d3b3fd1af9251148b658df7ac2e3e8</HostId>

</Error>

这就很奇怪,kkfileview 提交给minio的请求为啥要加 .docx?后面那段内容呢?这段内容不加一点问题都没有,加了反而有问题。

解决方案(按优先级排序,从简单到复杂)

核心思路:让 kkfileview 使用的 URL「参数与签名时完全一致」,避免新增参数导致签名失效。

方案 1:禁止 kkfileview 修改原始 URL(最快生效)

kkfileview 新增参数是可配置的,通过关闭「URL 重写」或「参数追加」功能,让它直接转发文件服务返回的 signedURL,不做任何修改。

操作步骤(kkfileview 配置):

找到 kkfileview 的配置文件(通常是 application.properties 或 application.yml);

添加 / 修改以下配置,禁用参数追加和 URL 重写:

properties

# 禁用自动添加 response-content-disposition 参数(关键)

keking.file.preview.add.response.content.disposition=false

# 禁用 URL 重写(避免修改原始 URL)

keking.file.preview.url.rewrite.enabled=false

# 禁用缓存控制参数追加

keking.file.preview.add.response.cache.control=false

执行:把容器kkfileview-hzero

的配置文件:/opt/kkFileView-4.1.0/config/application.properties 挂载出来

$ cd /d01/hzero-dockers/volumes

$ mkdir kkfileview

拷贝命令:

$ docker cp kkfileview-hzero:/opt/kkFileView-4.1.0/config/application.properties /d01/hzero-dockers/volumes/kkfileview/

更改文件权限:

sudo chown -R root:root /d01/hzero-dockers/volumes/kkfileview

sudo chmod -R 755 /d01/hzero-dockers/volumes/kkfileview  

Docker-compose.yml中添加:

    volumes:

      – ${DOCKER_VOLUME_DIRECTORY:-../volumes}/kkfileview/application.properties:/opt/kkFileView-4.1.0/config/application.properties

添加配置后,重启容器,

重启 kkfileview 服务,测试预览是否正常:

结果还是一样,文件名后加签的内容依然存在,看起来不是kkfileview加签的,应该是aip-app服务的开发者加签的,找下产品组…

产品组反馈,是他们加签的,就是应对文件是要授权(登录)才能访问的情况,这个地址是文件加签后的地址,可以直接通过加签后的地址去访问文件。

但是加签的内容在这个场景中被minio认为格式有问题,存在无效的分割符。奇怪的是如果不是在容器环境,是不会报错的,文件名也是经过加签的。

测试:

#第一步:配置 mc 别名(关联 MinIO 实例,关键!)

sh-5.1$ mc alias set my-minio http://minio-hzero:9000 hzero.admin hzero.hand.2020.

Added `my-minio` successfully.

#第二步:验证文件是否存在(避免路径 / 文件名错误)

sh-5.1$ mc ls ‘my-minio/hz-haip/haip01/0/MINIO/ca310b2e73b94fd1a47a29c6e13bcb5a@上海益吉-低代码平台应用成功案例.docx’

[2025-11-30 07:52:51 UTC] 1.3MiB STANDARD ca310b2e73b94fd1a47a29c6e13bcb5a@上海益吉-低代码平台应用成功案例.docx

#第三步:生成加签下载 URL(有效期 1 小时)

sh-5.1$ mc share download ‘my-minio/hz-haip/haip01/0/MINIO/ca310b2e73b94fd1a47a29c6e13bcb5a@上海益吉-低代码平台应用成功案例.docx’ –expire 1h

URL: http://minio-hzero:9000/hz-haip/haip01/0/MINIO/ca310b2e73b94fd1a47a29c6e13bcb5a@上海益吉-低代码平台应用成功案例.docx

Expire: 1 hours 0 minutes 0 seconds

Share: http://minio-hzero:9000/hz-haip/haip01/0/MINIO/ca310b2e73b94fd1a47a29c6e13bcb5a%40%E4%B8%8A%E6%B5%B7%E7%9B%8A%E5%90%89-%E4%BD%8E%E4%BB%A3%E7%A0%81%E5%B9%B3%E5%8F%B0%E5%BA%94%E7%94%A8%E6%88%90%E5%8A%9F%E6%A1%88%E4%BE%8B.docx?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=hzero.admin%2F20251202%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251202T054304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=f2ef45fef57367c86003e28c5185c80fc122d35bbf0d57b3763c91e9c347e08f

#第四步:测试加签 URL 是否有效(kkfileview容器内 curl 测试)

# curl -v -o /tmp/test-mc-sign.docx “http://minio-hzero:9000/hz-haip/haip01/0/MINIO/ca310b2e73b94fd1a47a29c6e13bcb5a%40%E4%B8%8A%E6%B5%B7%E7%9B%8A%E5%90%89-%E4%BD%8E%E4%BB%A3%E7%A0%81%E5%B9%B3%E5%8F%B0%E5%BA%94%E7%94%A8%E6%88%90%E5%8A%9F%E6%A1%88%E4%BE%8B.docx?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=hzero.admin%2F20251202%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251202T054304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=f2ef45fef57367c86003e28c5185c80fc122d35bbf0d57b3763c91e9c347e08f”

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 –:–:– –:–:– –:–:–     0*   Trying 172.18.0.7:9000…

* TCP_NODELAY set

* Connected to minio-hzero (172.18.0.7) port 9000 (#0)

> GET /hz-haip/haip01/0/MINIO/ca310b2e73b94fd1a47a29c6e13bcb5a%40%E4%B8%8A%E6%B5%B7%E7%9B%8A%E5%90%89-%E4%BD%8E%E4%BB%A3%E7%A0%81%E5%B9%B3%E5%8F%B0%E5%BA%94%E7%94%A8%E6%88%90%E5%8A%9F%E6%A1%88%E4%BE%8B.docx?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=hzero.admin%2F20251202%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251202T054304Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=f2ef45fef57367c86003e28c5185c80fc122d35bbf0d57b3763c91e9c347e08f HTTP/1.1

> Host: minio-hzero:9000

> User-Agent: curl/7.68.0

> Accept: */*

>

* Mark bundle as not supporting multiuse

< HTTP/1.1 200 OK

< Accept-Ranges: bytes

< Content-Length: 1409842

< Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document

< ETag: “612676ff41515da42d52f09b2bcfcbeb”

< Last-Modified: Sun, 30 Nov 2025 07:52:51 GMT

< Server: MinIO

< Strict-Transport-Security: max-age=31536000; includeSubDomains

< Vary: Origin

< Vary: Accept-Encoding

< X-Amz-Id-2: dd9025bab4ad464b049177c95eb6ebf374d3b3fd1af9251148b658df7ac2e3e8

< X-Amz-Request-Id: 187D4FBB94215DED

< X-Content-Type-Options: nosniff

< X-Ratelimit-Limit: 8421

< X-Ratelimit-Remaining: 8421

< X-Xss-Protection: 1; mode=block

< Date: Tue, 02 Dec 2025 05:44:56 GMT

<

{ [3468 bytes data]

100 1376k  100 1376k    0     0   168M      0 –:–:– –:–:– –:–:–  168M

* Connection #0 to host minio-hzero left intact

#

豆包分析:

https://www.doubao.com/thread/w75a47efaadfddcb0

豆包结论:所有环境(MinIO 容器、kkfileview 容器、网络、权限)都正常!问题 100% 出在 AIP-App 生成的加签 URL 上!

但实际上我直接在非容器环境运行是没有问题的,所以按理说也不应该是生成的加签URL的问题。是不是我哪里配置还是有问题?

跟产品组沟通,让在kkfileview容器中直接wget 平台生成的加签的URL:

# wget “http://minio-hzero:9000/hz-haip/haip01/0/MINIO/ca310b2e73b94fd1a47a29c6e13bcb5a%40%E4%B8%8A%E6%B5%B7%E7%9B%8A%E5%90%89-%E4%BD%8E%E4%BB%A3%E7%A0%81%E5%B9%B3%E5%8F%B0%E5%BA%94%E7%94%A8%E6%88%90%E5%8A%9F%E6%A1%88%E4%BE%8B.docx?response-content-disposition=attachment;filename*=UTF-8”%E4%B8%8A%E6%B5%B7%E7%9B%8A%E5%90%89-%E4%BD%8E%E4%BB%A3%E7%A0%81%E5%B9%B3%E5%8F%B0%E5%BA%94%E7%94%A8%E6%88%90%E5%8A%9F%E6%A1%88%E4%BE%8B.docx&response-cache-control=must-revalidate,%20post-check=0,%20pre-check=0&response-expires=1764657679219&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=hzero.admin/20251202/us-east-1/s3/aws4_request&X-Amz-Date=20251202T064118Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=c8c2c8dd43a7971e46a4743b138717e9fbc03421b5ad0e49c48dfdb998b5692c”

The name is too long, 549 chars total.

Trying to shorten…

New name is ca310b2e73b94fd1a47a29c6e13bcb5a@上海益吉-低代码平台应用成功案例.docx?response-content-disposition=attachment;filename*=UTF-8”上海益吉-低代码平台应用成功案例.docx&response-cache-control=must-revalidate, po.

–2025-12-02 15:05:37–  http://minio-hzero:9000/hz-haip/haip01/0/MINIO/ca310b2e73b94fd1a47a29c6e13bcb5a%40%E4%B8%8A%E6%B5%B7%E7%9B%8A%E5%90%89-%E4%BD%8E%E4%BB%A3%E7%A0%81%E5%B9%B3%E5%8F%B0%E5%BA%94%E7%94%A8%E6%88%90%E5%8A%9F%E6%A1%88%E4%BE%8B.docx?response-content-disposition=attachment;filename*=UTF-8”%E4%B8%8A%E6%B5%B7%E7%9B%8A%E5%90%89-%E4%BD%8E%E4%BB%A3%E7%A0%81%E5%B9%B3%E5%8F%B0%E5%BA%94%E7%94%A8%E6%88%90%E5%8A%9F%E6%A1%88%E4%BE%8B.docx&response-cache-control=must-revalidate,%20post-check=0,%20pre-check=0&response-expires=1764657679219&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=hzero.admin/20251202/us-east-1/s3/aws4_request&X-Amz-Date=20251202T064118Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=c8c2c8dd43a7971e46a4743b138717e9fbc03421b5ad0e49c48dfdb998b5692c

正在解析主机 minio-hzero (minio-hzero)… 172.18.0.7

正在连接 minio-hzero (minio-hzero)|172.18.0.7|:9000… 已连接。

已发出 HTTP 请求,正在等待回应… 400 Bad Request

2025-12-02 15:05:37 错误 400:Bad Request。

一样的,也是返回400 错误。

然后让试试kkfileview本地上传这个docx文件试试,看看是否能正常预览,本地上传后预览报错:

查日志:

解决方案:

把 /etc/hosts 文件挂载出去

添加dev.hzero.com.cn 的本地解析:

拷贝命令:

$ docker cp kkfileview-hzero:/etc/hosts /d01/hzero-dockers/volumes/kkfileview/

更改文件权限:

sudo chown -R root:root /d01/hzero-dockers/volumes/kkfileview

sudo chmod -R 755 /d01/hzero-dockers/volumes/kkfileview  

Docker-compose.yml中添加:

    volumes:

      – ${DOCKER_VOLUME_DIRECTORY:-../volumes}/kkfileview/hosts:/etc/hosts

添加配置后,重启容器,再测试,本地上传文件预览就OK了:

上面这个办法太复杂,有更简单的,不用这么麻烦,不用挂载host文件,直接在容器服务的docker-compose.yml中 添加extra_hosts解析即可。

    extra_hosts:

     – “dev.hzero.com.cn:127.0.0.1”  # 自定义域名 → 局域网服务IP

所以文件格式没问题,是可以被预览的,问题还是回到encode的地方,我们把平台生成的URL的后半部分在encode 一次,可以正常访问。

所以最终结论就是:程序处理里面需要把后半部分再encode一次。

那为啥之前非容器环境预览没问题呢?我特意查了非容器环境kkfileview的日志:发现其URL的下半部分是被encode过的。

所以看起来也不是环境在容器外还是容器内的问题,就是URL的下半部分需要encode的问题。ps-file\kkv\kkFileView-4.4.0 我容器外的版本高,4.4的,容器是4.1的,难道高版本的kkv 会自己去encode 一下吗?

问了豆包,豆包说:

你的猜想完全正确!核心差异就是 kkfileview 版本不同导致的「URL 自动编码行为」差异:

为什么 4.4 版本会加这个优化?

kkfileview 官方在后续版本(比如 4.2+)中,应该是收到了大量 “URL 含特殊字符导致下载失败” 的反馈,所以在 4.4 版本中新增了「URL 自动编码兜底」逻辑 —— 本质是帮用户处理 “上游应用(如 AIP-App)编码不完整” 的问题,提升兼容性。

而 4.1 版本是较旧的版本,还没有这个兜底逻辑,完全 “依赖上游应用传递标准 URL”,上游漏编码就必然报错。

那我们拉取4.4的镜像试试:

# 官方下载 kkFileView-4.4.0-docker_x64.tar

$ docker load -i kkFileView-4.4.0-docker_x64.tar

更改docker-compose.yml之后重启kkfileview

services:

  kkfileview-hzero:

    image: keking/kkfileview_x64:4.4.0

    container_name: kkfileview-hzero

重启kkV之后再试:好了,问题解决。

所以,这个问题跟kkfileview的版本有关,需要使用4.2以上的版本,跟/opt/kkFileView-4.1.0/config/application.properties 中的配置也没有关系,可以把这个文件的挂载去掉了。

问题四、多模态向量测试找不到文件的问题

背景:进行多模态向量模型测试,上传图片文件测试,报错下载失败。

分析:

看起来是文件地址中包含了oss.hzero.com.cn不能解析,看文件服务日志:

Caused by: io.minio.errors.ErrorResponseException: Object name contains unsupported characters.

这个报错不正确,因为我在老环境里面测试过这个文件是没问题的,所以文件名没问题,看表里面的数据,文件名存储是拼接的是我在minio配置的代理地址。你如果用代理地址的话,在docker网络外访问是可以的,但在docker网络内部访问就不行了。文件服务在Docker容器内运行,所以文件服务就会报错。

看了下存到数据库的地址,发现其实在文件服务配置代理地址的情况下,拼接文件URL地址存入数据库的时候,会用代理地址开头,感觉新的PI中应该把逻辑修改为:不管文件服务是否配置代理地址,存入数据库的文件地址都要用endpoint开头。目前的逻辑,代理地址留空的话,会取endpoint地址开头,否则会去代理地址开头。所以,不要去配置代理地址,会导致问题。代理地址留空就好。

执行:修数据 hzero_file.hfle_file表:

先执行:

update hzero_file.hfle_file set file_url=REPLACE(file_url, ‘oss.hzero.com.cn:9000’, ‘minio-hzero:9000’)

再执行:

update hzero_file.hfle_file set file_url=REPLACE(file_url, ‘oss.hzero.com.cn’, ‘minio-hzero:9000’)

Updated Rows 40814

再次测试:还是有错误,file服务的后台日志显示错误信息是::Caused by: io.minio.errors.ErrorResponseException: Object name contains unsupported characters.

查后台数据库表:

把file_url取出来直接在浏览器访问,是可以成功访问的:

所以这个错误就莫名其妙,是否全部用容器服务名解析就有问题呢?也不是,我在模型配置导入文件就成功的,区别在于这里导入文件,可能没有调用文件服务的URI=/v1/0/files/download/inner

但是这个地方导出下载也成功的,所以也不是下载有问题啊!

当天工作结束,停服务,关机。

第二天开机,启动服务,再测,错误一样,界面上显示的错误消息是:

url[http://gateway.hzero.com.cn:8080/hfle/v1/0/files/redirect-url?bucketName=haip&access_token=afa27805-11b0-40fd-9b13-c5d2107e48ed&url=http%3A%2F%2Fminio-hzero%3A9000%2Fhz-haip%2Fhaip01%2F0%2FMINIO%2Faf9388a45f1d4194bc1ecba6576aba17%40%E6%9F%90%E5%AE%A2%E6%88%B7%E5%90%84%E4%B8%9A%E5%8A%A1%E9%83%A8%E9%97%A8AI%E9%9C%80%E6%B1%82%E4%B8%80%E8%A7%88.png]下载失败

这个 URL后面内容转成可读的就是:

http://minio-hzero:9000/hz-haip/haip01/0/MINIO/af9388a45f1d4194bc1ecba6576aba17@某客户各业务部门 AI 需求一览.png

直接访问这个地址会提示key错误:

看文件服务日志:

io.choerodon.core.exception.CommonException: hfle.error.download.file

Caused by: io.minio.errors.ErrorResponseException: Object name contains unsupported characters.

At org.hzero.starter.file.service.MinioFileServiceImpl.download(MinioFileServiceImpl.java:323)

到数据库中查这个文件记录:

SELECT file_url FROM hzero_file.hfle_file WHERE file_url LIKE ‘%某客户各业务部门%’ AND creation_date >= CURDATE();

返回:

http://minio-hzero:9000/hz-haip/haip01/0/MINIO/af9388a45f1d4194bc1ecba6576aba17@某客户各业务部门AI需求一览.png  , AI两边多了两个空格。

另外我们用一个纯英文文件名测试,现象也是一样的:用响应中的地址可以直接访问,就是说文件URL没有问题,可文件服务就报错:

Hzero-aip-app中的错误日志是:

Caused by: io.choerodon.core.exception.CommonException: haip.error.model.download.url

hzero-file 容器测试访问minio-hzero:

# echo ‘public class Test { public static void main(String[] args) { try (java.net.Socket s = new java.net.Socket()) { s.connect(new java.net.InetSocketAddress(“minio-hzero”, 9000), 3000); System.out.println(“✅ 连通成功!”); } catch (Exception e) { System.out.println(“❌ 连通失败: ” + e.getMessage()); } } }’ > Test.java && javac Test.java && java Test && rm -f Test.java Test.class

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

✅ 连通成功!

联想到今天做文件预览的时候,minio日志报错:

API: SYSTEM.authN

Time: 10:11:23 UTC 11/30/2025

DeploymentID: 45cf993b-5631-4c8d-860e-5bb2f89dec36

Error: invalid semicolon separator in query (*errors.errorString)

5: internal/logger/logger.go:271:logger.LogIf()

4: cmd/logging.go:50:cmd.authNLogIf()

3: cmd/auth-handler.go:129:cmd.getRequestAuthType()

2: cmd/auth-handler.go:621:cmd.setAuthMiddleware.func1()

1: net/http/server.go:2294:http.HandlerFunc.ServeHTTP()

猜想是不是我现在用的minio镜像是mimio:latest 最新版的,查豆包说最新版的minio对请求字符串有严格的检查,可能是不太兼容了,那么要回到老版本,尝试了一个24年的镜像,但启动不起来,原因是minio的元数据在使用最新版本之后,已经升级了,旧版本的minio无法读取新版的元数据。

我原系统功能是好的,看了下原系统上的minio, 版本是RELEASE.2025-06-13T11-33-47Z

这是25年的,也许能兼容latest的元数据格式,尝试:

$ docker pull minio/minio:RELEASE.2025-06-13T11-33-47Z

Status: Downloaded newer image for minio/minio:RELEASE.2025-06-13T11-33-47Z
docker.io/minio/minio:RELEASE.2025-06-13T11-33-47Z

修改minio的docker-compose.yml文件,用这个版本试试。

试验结果还是有问题,看起来跟minio版本没关系。

还是回到文件服务关键错误日志:

Caused by: io.minio.errors.ErrorResponseException: Object name contains unsupported characters.

这个错误看起来跟文件预览的错误类似,是否也是有部分URL少encode了一次?

另一个文件测试,后台文件服务中的错误日志是:
#io.choerodon.core.exception.CommonException: hfle.error.download.file

#Caused by: io.minio.errors.ErrorResponseException: The specified key does not exist.

网页上请求头地址是:http://aigc.hzero.com.cn/v1/open/image-emb/common

请求的负载是:
{“accountCode”:”HAIP.IMAGE_EMB_DOUBAO_COPY”,”inputs”:[{“type”:”image_url”,”imageUrl”:{“url”:”http://gateway.hzero.com.cn:8080/hfle/v1/0/files/redirect-url?bucketName=haip&access_token=00cad27f-13ea-40cc-85f7-ce046da09eb9&url=http%3A%2F%2Fminio-hzero%3A9000%2Fhz-haip%2Fhaip01%2F0%2FMINIO%2F6a5d7178989441899a4bb11525e8a2f1%40PaaS%20%E5%B9%B3%E5%8F%B0%E9%85%8D%E5%9B%BE%20(19).png”}}]}

这个imageUrl在浏览器里面是可以直接访问的。而且这个URL地址明显是已经 encode过的,所以这问题跟文件预览不一样,不是encode的问题。

实际运行的时候是不是在hzero-aip-app那个容器中运行? 如果是,那么确实有问题,容器中没有gateway.hzero.com.cn的域名解析。

解决方案:在hzero-gateway  容器的docker-compose.yml中添加别名:gateway.hzero.com.cn,这样让hzero-aip-app服务在容器网络内的服务也能通过gateway.hzero.com.cn访问到hzero-gateway

## 要求Docker/Docker CE >= 19.x

services:

  hzero-gateway:

    image: hzero-gateway-jk-demo:1.12

    container_name: hzero-gateway

    networks:

      hzero-demo:

        aliases:  # 在此为网关服务设置网络别名

          – gateway.hzero.com.cn  # 添加这一行

更改后重启gateway, 再测试,OK了:

HZERO PaaS平台-Docker版demo笔记(一)Docker版制作

=======================================

1、制作HZERO PaaS 平台 1.12版本的Demo环境的Mysql镜像日志

备注:本文是个人自建Demo系统学习研究过程中的日志,仅供培训学习参考
环境:WSL:Ubuntu-22.04-hzero 系统
说明:该环境独立安装了docker 和docker compose, 没有跟windows dockerDesktop 做集成。
由于制作Docker镜像的过程中需要通过Docker Hub库拉镜像,这个环境无法直接访问Docker Hub库(要梯子,但wsl 子系统无法直接用Windows Host机的代理),所以这个镜像制作多了些麻烦。
后续的其他Docker镜像制作, 放到Ubuntu-22.04 里面制作,Ubuntu-22.04 跟Docker Desktop做了集成,因为DockerDesktop是Windows的应用,可以用梯子,所以就很方便了。
一、启动 MySQL
$ systemctl start mysql

二、导出所有数据库
$ cd /
$ mkdir d03
$ cd /d03
$ mysqldump -u root -p –all-databases > init.sql

$ mkdir mysql-custom && cd mysql-custom
$ cp /d03/init.sql .

三、制作Dockerfile
$ vi my_custom.cnf
写入如下内容:

my_custom.cnf

[mysqld]
max_connections=2000
max_allowed_packet=32M
lower_case_table_names=1
character_set_server=utf8mb4
collation_server=utf8mb4_bin


$ vi Dockerfile

写入如下内容:

基于官方 MySQL 8 镜像

FROM mysql:8.0

设置 MySQL root 密码(可选,也可启动时通过环境变量指定)

ENV MYSQL_ALLOW_EMPTY_PASSWORD=yes

将导出的 SQL 文件复制到 MySQL 自动执行目录

容器启动时,会自动执行 /docker-entrypoint-initdb.d 下的 .sql 文件

COPY init.sql /docker-entrypoint-initdb.d/

复制自定义配置文件到 MySQL 配置目录

COPY my_custom.cnf /etc/mysql/conf.d/

四、构建mysql镜像
$ docker build -t mysql-hzero-jk-demo:1.12 .

报错:拉不到mysql 8.0的镜像,增加国内镜像地址:
$ vi /etc/docker/daemon.json
写入内容:
{
“registry-mirrors”: [
“https://qfebddkjdu.mirror.aliyuncs.com”,
“https://registry.docker-cn.com”,
“https://docker.mirrors.ustc.edu.cn”,
“http://hub-mirror.c.163.com”
]
}
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
$ sudo docker info 看到镜像已经加进去了
$ docker pull mysql:8.0 还是不行
$ curl -I https://registry.docker-cn.com 无法访问,其他几个镜像也是无法访问,阿里云的只允许通过阿里云ECS服务器访问。
这些镜像都不靠谱;
去掉这些不靠谱的镜像
$ rm -f /etc/docker/daemon.json
直接从华为云拉mysql:8.0镜像:
$ docker pull swr.cn-east-2.myhuaweicloud.com/library/mysql:8.0
成功拉取
再次构建:
$ docker build -t mysql-hzero-jk-demo:1.12 .
还是报错:ERROR: failed to build: failed to solve: mysql:8.0: failed to resolve source metadata for docker.io/library/mysql:8.0: failed to do request: Head “https://registry-1.docker.io/v2/library/mysql/manifests/8.0”: read tcp 172.18.14.48:40900->98.90.233.146:443: read: connection reset by peer
怎么没有从本地库获取mysql:8.0呢?
解决方案有两种:
一种是更改 Dockfile,把来源更改掉:
FROM swr.cn-east-2.myhuaweicloud.com/library/mysql:8.0
另一种是把刚才从华为云拉下来的镜像打标签:
docker tag swr.cn-east-2.myhuaweicloud.com/library/mysql:8.0 mysql:8.0
推荐使用方法二,因为这样不需要修改Dockerfile,而且以后如果Dockerfile中其他镜像也有类似问题,可以同样处理。
打完标签后再次构建:
$ docker build -t mysql-hzero-jk-demo:1.12 .
这次成功了,验证:
$ docker images | grep mysql
mysql-hzero-jk-demo 1.12 38408f313597 2 minutes ago 824MB
mysql 8.0 2dd01afbe8df 7 years ago 485MB
swr.cn-east-2.myhuaweicloud.com/library/mysql 8.0 2dd01afbe8df 7 years ago 485MB
测试:停掉mysql
$ systemctl stop mysql
启动mysql 的docker 容器
$ docker run -d –name mysql-hzero-demo -p 3306:3306 mysql-hzero-jk-demo:1.12
启动没成功,
mysql-hzero-demo
4d5fa07458006f585c791adf763bfac46de28ef4b995e935f28c36cc4e9af420
$ docker ps -a 显示启动一会儿就退出了,看日志:
$ docker logs 4d5fa07458006f585c791adf763bfac46de28ef4b995e935f28c36cc4e9af420
错误发生在:
/usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.sql
ERROR 3723 (HY000) at line 516: The table ‘replication_asynchronous_connection_failover’ may not be created in the reserved tablespace ‘mysql’.
元宝分析可能是版本兼容问题,原来数据库版本是8.4.5,拉取的镜像8.0太低了。
解决方案:拉取8.4.5的镜像,试了阿里云、腾讯云、华为云的镜像站点,要么拒绝访问,要么需要用户名密码,用注册的云账户密码也不行。
问豆包有无网页版的下载,提供了Oracle的网站下载页,这个下载页会自动调用docker desktop来拉取,注册docker desktop的用户,打开clash party,在docker desktop的docker Hub里面找 mysql, 发现没有直接8.4.5的镜像,最近的只有8.4 和8.4.7
在dockerdesktop的docker hub里面搜mysql, 拉了8.4.7 版本;
在docker Desktop 的设置/Resources/WSL intergration 中把ubuntu-22.04的集成开关打开,这样在ubuntu-22.04中可以操作docker desktop
打开Ubnuntu-22.04
$ docker images | grep mysql
mysql 8.4.7 b306273d4d36 4 weeks ago 1.08GB
$ cd /d01/dockerimagesbak

格式:docker save -o 导出文件名 镜像名:标签

$ docker save -o mysql-8.4.7.tar mysql:8.4.7
拷贝 这个mysql-8.4.7.tar 到ubuntu-22.04-hzero/d03/mysql-custom 目录下
进入ubuntu-22.04-hzero/d03/mysql-custom,导入镜像

格式:docker load -i 镜像文件.tar

$ docker load -i mysql-8.4.7.tar
导入成功:Loaded image: mysql:8.4.7
验证:
$ docker images | grep mysql
mysql-hzero-jk-demo 1.12 35d024e4c936 13 hours ago 824MB
mysql 8.4.7 67471052edd5 4 weeks ago 788MB
mysql 8.0 2dd01afbe8df 7 years ago 485MB
mysql 8.4.5 2dd01afbe8df 7 years ago 485MB
swr.cn-east-2.myhuaweicloud.com/library/mysql 8.0 2dd01afbe8df 7 years ago 485MB
更改Dockfile ,

$ vi Dockerfile

基于官方 MySQL 8 镜像

FROM mysql:8.4.7

保存退出
再次构建:
$ docker build -t mysql-hzero-jk-demo:1.12 .
构建成功
$ docker images | grep mysql
mysql-hzero-jk-demo 1.12 8c6c4b989154 20 seconds ago 1.13GB
停掉Mysql服务
$ systemctl stop mysql
删除旧容器:
$ docker rm -f mysql-hzero-demo
启动mysql 的docker 容器
$ docker run -d –name mysql-hzero-demo -p 3306:3306 mysql-hzero-jk-demo:1.12
be9ae14a5562c8b28ca6ebeb6cbd25d470d4980045c1c47e8b15a3896d5353d7
root@desktop-jacksen:/d03/mysql-custom#
查看日志:
$ docker logs be9ae14a5562c8b28ca6ebeb6cbd25d470d4980045c1c47e8b15a3896d5353d7
出现错误:
2025-11-19 03:13:26+00:00 [Note] [Entrypoint]: /usr/local/bin/docker-entrypoint.sh: running /docker-entrypoint-initdb.d/init.sql
ERROR 1153 (08S01) at line 3076: Got a packet bigger than ‘max_allowed_packet’ bytes
错误日志给元宝分析后建议修改my_custom.cnf,重建镜像:

[mysqld]
max_connections=2000
max_allowed_packet=512M
lower_case_table_names=1
character_set_server=utf8mb4
collation_server=utf8mb4_bin


再次构建:
$ docker build -t mysql-hzero-jk-demo:1.12 .
删除旧容器:
$ docker rm -f mysql-hzero-demo

启动mysql 的docker 容器

docker run -d –name mysql-hzero-demo -p 3306:3306 mysql-hzero-jk-demo:1.12
3e49dc0282495402dab8fa41f49be132c9d135483a5867aa58aa1b2f2ed7c4bb
root@desktop-jacksen:/d03/mysql-custom#docker logs 3e49dc0282495402dab8fa41f49be132c9d135483a5867aa58aa1b2f2ed7c4bb
这次没有error了
root@desktop-jacksen:/d03/mysql-custom# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e49dc028249 mysql-hzero-jk-demo:1.12 “docker-entrypoint.s…” About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp mysql-hzero-demo

验证:检查 max_allowed_packet 设置

$ docker exec mysql-hzero-demo mysql -u root -e “SHOW GLOBAL VARIABLES LIKE ‘max_allowed_packet’;”
Variable_name Value
max_allowed_packet 536870912
root@desktop-jacksen:/d03/mysql-custom#

进入容器内部测试连接

$ docker exec -it mysql-hzero-demo mysql -u root -e “SELECT 1;”
+—+
| 1 |
+—+
| 1 |
+—+
root@desktop-jacksen:/d03/mysql-custom#

查看所有数据库

$ docker exec -it mysql-hzero-demo mysql -u root -e “SHOW DATABASES;”
$ docker exec -it mysql-hzero-demo mysql -u root -e “SHOW DATABASES;”
+———————+
| Database |
+———————+
| hzero_admin |
| hzero_aip |
| hzero_alert |
| hzero_file |
| hzero_frontal |
| hzero_import |
| hzero_interface |
| hzero_lowcode |
| hzero_lowcodedata |
| hzero_message |
| hzero_modeler |
| hzero_orchestration |
| hzero_platform |
| hzero_report |
| hzero_scheduler |
| hzero_workflow |
| information_schema |
| mysql |
| performance_schema |
| sys |
+———————+

查看数据库大小和数量

$ docker exec -it mysql-hzero-demo mysql -u root -e “
SELECT
table_schema AS ‘数据库’,
COUNT(*) AS ‘表数量’,
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS ‘总大小(MB)’
FROM information_schema.tables
GROUP BY table_schema
ORDER BY SUM(data_length + index_length) DESC;”
+———————+———–+—————+
| 数据库 | 表数量 | 总大小(MB) |
+———————+———–+—————+
| hzero_platform | 344 | 11.42 |
| hzero_modeler | 345 | 10.56 |
| hzero_lowcode | 227 | 9.66 |
| hzero_aip | 250 | 7.88 |
| hzero_interface | 169 | 5.33 |
| mysql | 38 | 5.27 |
| hzero_workflow | 145 | 5.14 |
| hzero_admin | 69 | 2.09 |
| hzero_lowcodedata | 26 | 1.67 |
| hzero_orchestration | 47 | 1.58 |
| hzero_message | 50 | 1.50 |
| hzero_report | 40 | 1.23 |
| hzero_scheduler | 29 | 1.06 |
| hzero_frontal | 30 | 1.00 |
| hzero_alert | 19 | 0.58 |
| hzero_file | 10 | 0.36 |
| hzero_import | 12 | 0.31 |
| sys | 101 | 0.02 |
| performance_schema | 113 | 0.00 |
| information_schema | 78 | 0.00 |
+———————+———–+—————+

验证关键配置参数

$ docker exec -it mysql-hzero-demo mysql -u root -e “
SHOW VARIABLES WHERE
Variable_name IN (‘max_connections’, ‘max_allowed_packet’, ‘lower_case_table_names’,
‘character_set_server’, ‘collation_server’);”
+————————+————-+
| Variable_name | Value |
+————————+————-+
| character_set_server | utf8mb4 |
| collation_server | utf8mb4_bin |
| lower_case_table_names | 1 |
| max_allowed_packet | 536870912 |
| max_connections | 2000 |
+————————+————-+

测试端口

$ nc -z 127.0.0.1 3306 && echo “端口可访问” || echo “端口不可访问”
端口可访问

从宿主机连接测试(确保端口映射正确)

$ mysql -h 127.0.0.1 -P 3306 -u root -e “SELECT 1;” 2>/dev/null && echo “连接成功” || echo “连接失败”
连接失败

查看log

$ docker logs mysql-hzero-demo
2025-11-19T03:39:47.424515Z 16 [Warning] [MY-013360] [Server] Plugin sha256_password reported: ”sha256_password’ is deprecated and will be removed in a future release. Please use caching_sha2_password instead’

外部DBeaver 链接测试:正常

非root用户本地链接测试:正常

$ mysql -h 127.0.0.1 -P 3306 -u hzero -phzero -e “SELECT 1;”
mysql: [Warning] Using a password on the command line interface can be insecure.
+—+
| 1 |
+—+
| 1 |
+—+
#

检查用户权限

$ docker exec -it mysql-hzero-demo mysql -u root -e “
SELECT user, host, authentication_string, plugin FROM mysql.user;”
+——————+———–+————————————————————————+———————–+
| user | host | authentication_string | plugin |
+——————+———–+————————————————————————+———————–+
| hzero | % | $A$005$->l~V[~X[fU)>ja/x.oWsjWwIgUVt5/2iE55KHa.l5royRU1ukIw0EMn0 | caching_sha2_password |
| root | localhost | | caching_sha2_password |
+——————+———–+————————————————————————+———————–+

现在情况已经很清楚了。MySQL 容器运行正常,​非 root 用户(hzero)可以正常连接,这证明 MySQL 服务本身是健康且可访问的。

root只能从容器内访问,这没问题,正常我们用不到root用户。

到这里 制作HZERO PaaS 平台 1.12版本的Demo环境的Mysql镜像 完成了;

但这个镜像的里面MySQL的数据无法持久化,要数据持久化,正确的做法是:


目标环境:
环境:WSL:Ubuntu-22.04系统
1、先建立容器外的mysql数据持久化目录,并修正目录权限(重要)
$ cd /d01/hzero-dockers/volumes
$ mkdir mysql
$ sudo chown -R 999:999 /d01/hzero-dockers/volumes/mysql
2、如果容器还没起,先起容器
$ cd /d01/hzero-dockers/mysql-docker
$ docker compose up -d
等2分钟,完成初始化 ,可以在docker日志中看到:
2025-11-24 02:46:05+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
2025-11-24T02:46:05.189268Z 0 [System] [MY-015015] [Server] MySQL Server – start.
2025-11-24T02:46:06.688842Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections.
3、# 将容器内的数据拷贝出来
$ docker cp mysql-hzero:/var/lib/mysql /d01/hzero-dockers/volumes/mysql
Successfully copied 1.58GB to /d01/hzero-dockers/volumes/mysql
4、# 关闭mysql容器,重建镜像
$ docker compose down
4.1
$ vi my_custom.cnf

写入如下内容:

my_custom.cnf

[mysqld]
max_connections=2000
max_allowed_packet=512M
lower_case_table_names=1
character_set_server=utf8mb4
collation_server=utf8mb4_bin


4.2
$ vi Dockerfile

#写入如下内容:

基于官方 MySQL 8 镜像

FROM mysql:8.4.7

设置 MySQL root 密码(可选,也可启动时通过环境变量指定)

ENV MYSQL_ALLOW_EMPTY_PASSWORD=yes

复制自定义配置文件到 MySQL 配置目录

COPY my_custom.cnf /etc/mysql/conf.d/

4.3、再次构建:
$ docker build -t mysql-hzero-jk-demo:8.4.7 .
构建成功

5、编辑 docker-compose.yml, 挂载数据目录

要求Docker/Docker CE >= 19.x

services:
mysql-hzero:
image: mysql-hzero-jk-demo:8.4.7
container_name: mysql-hzero
user: “999:999” # 添加这一行,指定 mysql 用户
ports:
– “3306:3306”
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 1000m # 容器最大内存
volumes:
– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/mysql:/var/lib/mysql
networks:
default:
name: hzero-demo

external: true

6、再次启动容器
$ cd /d01/hzero-dockers/mysql-docker
$ docker compose up -d
查看日志:
$ docker logs mysql-hzero
2025-11-24T03:23:45.211550Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: ‘8.4.7’ socket: ‘/var/run/mysqld/mysqld.sock’ port: 3306 MySQL Community Server – GPL.
成功启动,DBeaver 访问数据库,数据正常。
备注:这数据库镜像一般使用其原来版本作为标签(如果原来用的标签是1.12,要改成8.47)

将旧镜像名改为新镜像名

$ docker tag mysql-hzero-jk-demo:1.12 mysql-hzero-jk-demo:8.4.7
$ docker rmi mysql-hzero-jk-demo:1.12

改了镜像名之后,docker-compose.yml中的镜像名也要通步更改。

==================================================

2、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-注册服务中心 hzero-register镜像

环境:WSL:Ubuntu-22.04系统
$ cd /d01
$ mkdir hzero-register-docker
$ cd /d01/hzero-register-docker
$ vi Dockerfile

输入内容:

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-register.jar /ps-register.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $SKYWALKING_OPTS -jar /ps-register.jar

保存退出:
重新打包ps-register.jar
为适应Docker,bootstrap.yml 和 appication.yml要改造
来源系统先备份:
在Ubuntu-22.04-hzero系统中,进入
$ cd /d02/hzero/project/ps-register/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
更改 bootstrap.yml
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
更改 application.yml
defaultZone: ${EUREKA_DEFAULT_ZONE:http://dev.hzero.com.cn:8000/eureka}
改成:
defaultZone: ${EUREKA_DEFAULT_ZONE:http://localhost:8000/eureka}
来源系统备份jar
$ cd /d02/hzero/project/ps-register/target
$ cp ps-register.jar ps-register.wsl.ok.jar
来源系统构建 jar
$ cd /d02/hzero/project/ps-register

$ vi build.sh

!/bin/bash

SERVICE_NAME=${PWD##*/}
JAR=$SERVICE_NAME.jar

构建项目

echo “>>> mvn clean package -Dmaven.javadoc.skip=true”
mvn clean package -Dmaven.javadoc.skip=true -Dmaven.test.skip=true || { echo “>>> 构建失败”; exit 1; }
echo “>>> cd target”
cd target || { echo “>>> 找不到target目录”; exit 1; }

重命名JAR文件

if [ -f “app.jar” ]; then
mv app.jar $JAR
echo “>>> 重命名 app.jar 为 $JAR”
else
echo “>>> 警告:app.jar 文件不存在,可能使用其他名称”
JAR=$(ls *.jar 2>/dev/null | head -n1)
if [ -z “$JAR” ]; then
echo “>>> 错误:找不到JAR文件!”
exit 1
fi
echo “>>> 使用找到的JAR文件:$JAR”

fi

$ bash build.sh
构建完成,拷贝ps-register.jar 到Ubuntu-22.04/d01/hzero-dockers/hzero-register-docker
进入Ubuntu-22.04/d01/hzero-dockers/hzero-register-docker
$ cd /d01/hzero-dockers/hzero-register-docker

构建镜像

$ docker build -t hzero-register-jk-demo:1.12 .
构建成功

编辑docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-register:
image: hzero-register-jk-demo:1.12
container_name: hzero-register
ports:
– “8000:8000”
– “8001:8001”
environment:
– JAVA_OPTS=” -Xms300m -Xmx300m -Dspring.profiles.active=dev”
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 600m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

启动容器
$ docker compose up -d
[+] Running 2/2
✔ Network hzero-demo Created 0.1s
✔ Container hzero-register Started 0.7s
检查:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
容器启动没成功
$ docker logs hzero-register
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN
Error: Could not find or load main class “
Caused by: java.lang.ClassNotFoundException: “
豆包分析:
你遇到的核心问题是启动命令中的引号导致 JVM 解析错误,” -Xms300m -Xmx300m -Dspring.profiles.active=dev” 里的双引号被当成了类名的一部分,所以报Could not find or load main class “。
直接解决方案
修改docker-compose.yml中的环境变量配置,去掉 JAVA_OPTS 值的双引号:
$ docker compose down && docker compose up -d

检查容器状态

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b25d8a3a5f4e hzero-register-jk-demo:1.12 “/bin/sh -c ‘exec ja…” 11 seconds ago Up 9 seconds 0.0.0.0:8000-8001->8000-8001/tcp, [::]:8000-8001->8000-8001/tcp hzero-register

查看日志确认启动成功

$ docker logs hzero-register
日志看起来成功了
访问测试:
http://localhost:8000 访问正常;
到这里 制作HZERO PaaS 平台 1.12版本的Demo环境的register 注册中心服务docker镜像 完成了;

==================================================

4、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-平台治理 hzero-admin 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero/project/ps-admin/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero/project/ps-admin/target
$ cp ps-admin.jar ps-admin.wsl.ok.jar
2、更改yml配置文件
application.yml中 mysql数据库的主机域名改成Docker compose容器名 :mysql-hzero
url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}
application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero
redis:
host: ${SPRING_DATA_REDIS_HOST:redis-hzero}
datasource:
hzero:
host: ${SPRING_DATA_REDIS_HOST:redis-hzero}
bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register
# 注册中心地址
defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}
bootstrap.yml中 配置中心的主机域名地址改成localhost
# 配置中心地址
uri: ${SPRING_CLOUD_CONFIG_URI:http://localhost:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero/project/ps-admin/
4、构建适合Docker的Jar包
$ cd /d02/hzero/project/ps-admin/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-admin-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-admin-docker
6、拷贝Jar包到目标环境
在windows powershell 中执行
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-admin\target\ps-admin.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-admin-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-admin-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-admin.jar /ps-admin.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-admin.jar

8、编辑docker-compose.yml

vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-admin:
image: hzero-admin-jk-demo:1.12
container_name: hzero-admin
ports:
– “8060:8060”
– “8061:8061”
environment:
– JAVA_OPTS= -Xms300m -Xmx300m -Dspring.profiles.active=dev
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 600m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

8、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-admin-docker
$ docker build -t hzero-admin-jk-demo:1.12 .
构建成功:
docker images | grep admin
hzero-admin-jk-demo 1.12 b392466e7162 13 seconds ago 1.09GB
9、测试Docker镜像
测试之前先确保 redis-docker 和 mysql-docker,hzero-register 容器已经启动:
$ docker ps

如果没启动可以执行

cd /d01/hzero-dockers/mysql-docker
docker compose up -d
cd /d01/hzero-dockers/redis-docker
docker compose up -d
cd /d01/hzero-dockers/hzero-register-docker

docker compose up -d

启动hzero-admin容器
$ cd /d01/hzero-dockers/hzero-admin-docker
$ docker compose up -d
测试容器中能否连通redis-hzero容器中的redis数据库:
$ docker exec -it hzero-admin /bin/bash
jshell << EOF import java.net.Socket; try { Socket socket = new Socket(“redis-hzero”, 6379); System.out.println(“Connected successfully!”); socket.close(); } catch (Exception e) { System.out.println(“Connection failed: ” + e.getMessage()); } EOF 结果: jshell> Connected successfully!
测试容器中能否链通mysql-hzero容器中的mysql数据库:

进入你的Java容器

$ docker exec -it hzero-platform /bin/bash

在你的Java容器中执行

jshell << EOF try { new java.net.Socket(“mysql-hzero”, 3306).close(); System.out.println(“端口3306可达”); } catch (Exception e) { System.out.println(“端口不可达: ” + e.getMessage()); } EOF 结果: jshell> 端口3306可达
测试web服务:(可以访问)
http://localhost:8061/
true error.error There is a mistake in the program. Please contact the administrator warn No static resource .

==================================================

4、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-平台基础管理 hzero-platform 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero/project/ps-platform/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero/project/ps-platform/target
$ cp ps-platform.jar ps-platform.wsl.ok.jar
2、更改yml配置文件
application.yml中 数据库的主机域名改成Docker compose容器名 :mysql-hzero
url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}
application.yml中 数据库的主机域名 改成Docker composer容器名 :redis-hzero
redis:
host: ${SPRING_DATA_REDIS_HOST:redis-hzero}
bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register
# 注册中心地址
defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}
bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin
# 配置中心地址
uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero/project/ps-platform/
4、构建适合Docker的Jar包
$ cd /d02/hzero/project/ps-platform/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-platform-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-platform-docker
6、拷贝Jar包到目标环境
在windows powershell 中执行
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-platform\target\ps-platform.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-platform-docker\
7、编辑Dockerfile

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-platform.jar /ps-platform.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-platform.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-platform:
image: hzero-platform-jk-demo:1.12
container_name: hzero-platform
ports:
– “8100:8100”
– “8101:8101”
environment:
– JAVA_OPTS= -Xms500m -Xmx500m -Dspring.profiles.active=dev
– REFLEC_OPTS=–add-opens java.base/java.lang=ALL-UNNAMED –add-opens java.base/java.util=ALL-UNNAMED –add-opens java.base/java.util.concurrent=ALL-UNNAMED –add-opens java.base/jdk.internal.loader=ALL-UNNAMED –add-opens java.base/java.net=ALL-UNNAMED –add-opens java.base/java.nio=ALL-UNNAMED –add-opens java.base/java.lang.reflect=ALL-UNNAMED
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 1000m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

8、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-platform-docker
$ docker build -t hzero-platform-jk-demo:1.12 .
构建成功:
root@desktop-jacksen:/d01/hzero-dockers/hzero-platform-docker# docker images | grep platform
hzero-platform-jk-demo 1.12 ea4f8909ae5e 58 seconds ago 1.31GB
9、测试Docker镜像
测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin容器已经启动:
$ cd /d01/hzero-dockers/hzero-platform-docker
$ docker compose up -d
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
375a4973b082 hzero-platform-jk-demo:1.12 “/bin/sh -c ‘exec ja…” 6 minutes ago Up 6 minutes 0.0.0.0:8100-8101->8100-8101/tcp, [::]:8100-8101->8100-8101/tcp hzero-platform
72cf93b6a594 hzero-admin-jk-demo:1.12 “/bin/sh -c ‘exec ja…” 50 minutes ago Up 50 minutes 0.0.0.0:8060-8061->8060-8061/tcp, [::]:8060-8061->8060-8061/tcp hzero-admin
094e45f23cb4 redis:6-alpine “docker-entrypoint.s…” About an hour ago Up About an hour 0.0.0.0:6379->6379/tcp, [::]:6379->6379/tcp redis-hzero
30200cc3a81c mysql-hzero-jk-demo:1.12 “docker-entrypoint.s…” About an hour ago Up About an hour 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp mysql-hzero
b25d8a3a5f4e hzero-register-jk-demo:1.12 “/bin/sh -c ‘exec ja…” 2 days ago Up About an hour 0.0.0.0:8000-8001->8000-8001/tcp, [::]:8000-8001->8000-8001/tcp hzero-register
看日志:docker logs hzero-platform
看起来是正常启动了,访问数据库也都正常
测试web服务:(可以正常访问)
http://localhost:8100
true error.error An error occurred in the program. Please contact the administrator warn No static resource .

==================================================

5、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-License授权管理 hzero-license 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero/project/ps-license/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero/project/ps-license/target
$ cp ps-license.jar ps-license.wsl.ok.jar
2、更改yml配置文件
application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero
  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}
bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register
  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}
bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin
  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
inetutils 网卡设置段:去掉:preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*

3、复制Jar包构建脚本:
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero/project/ps-license/
4、构建适合Docker的Jar包
$ cd /d02/hzero/project/ps-license/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-platform-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-license-docker
6、拷贝Jar包到目标环境
  在windows powershell 中执行
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-license\target\ps-license.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-license-docker\
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-license\licenseAgent\license-agent112a.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-license-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-license-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-license.jar /ps-license.jar
COPY license-agent112a.jar /license-agent112a.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-license.jar

8、编辑docker-compose.yml

vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-license:
image: hzero-license-jk-demo:1.12
container_name: hzero-license
ports:
– “8105:8105”
– “8106:8106”
environment:
– JAVA_OPTS=-Xms200m -Xmx200m -Dspring.profiles.active=dev
– AGENT=-javaagent:/license-agent112a.jar
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 400m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

8、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-license-docker
$ docker build -t hzero-license-jk-demo:1.12 .
构建成功:
docker images | grep license
hzero-license-jk-demo 1.12 a1e6db72ccea 30 seconds ago 1.02GB
如果需要重建,重建后清空悬空镜像:
$ docker image prune
9、测试Docker镜像
测试之前先确保 redis-docker 和 hzero-register 容器已经启动:
$ cd /d01/hzero-dockers/hzero-license-docker
$ docker compose up -d
看日志:
$ docker logs hzero-license
成功启动
测试网络访问:
http://localhost:8105
可以正常访问,镜像构建成功。

==================================================

6、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-身份认证管理 ps-iam-saas 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero/project/ps-iam-saas/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero/project/ps-iam-saas/target
$ cp ps-iam-saas.jar ps-iam-saas.wsl.ok.jar
2、更改yml配置文件
application.yml中 数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}
application.yml中 数据库的主机域名 改成Docker composer容器名 :redis-hzero
  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}
bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register
  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}
bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin
  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero/project/ps-iam-saas/
4、构建适合Docker的Jar包
$ cd /d02/hzero/project/ps-iam-saas/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-iam-saas-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-iam-saas-docker
6、拷贝Jar包到目标环境
  在windows powershell 中执行
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-iam-saas\target\ps-iam-saas.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-iam-saas-docker\
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-license\licenseAgent\license-agent112a.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-iam-saas-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-iam-saas-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-iam-saas.jar /ps-iam-saas.jar
COPY license-agent112a.jar /license-agent112a.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-iam-saas.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-platform:
image: hzero-iam-saas-jk-demo:1.12
container_name: hzero-iam-saas
ports:
– “8030:8030”
– “8031:8031”
environment:
– JAVA_OPTS=-Xms400m -Xmx400m -Dspring.profiles.active=dev
– AGENT=-javaagent:/license-agent112a.jar
– REFLEC_OPTS=–add-opens java.base/java.lang=ALL-UNNAMED –add-opens java.base/java.util=ALL-UNNAMED –add-opens java.base/java.util.concurrent=ALL-UNNAMED –add-opens java.base/jdk.internal.loader=ALL-UNNAMED –add-opens java.base/java.net=ALL-UNNAMED –add-opens java.base/java.nio=ALL-UNNAMED –add-opens java.base/java.lang.reflect=ALL-UNNAMED
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 800m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

8、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-iam-saas-docker
$ docker build -t hzero-iam-saas-jk-demo:1.12 .
构建成功:
$ docker images | grep iam-saas
9、测试Docker镜像
测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin容器已经启动:
$ cd /d01/hzero-dockers/hzero-iam-saas-docker
$ docker compose up -d
看日志:docker logs hzero-iam-saas
看起来是正常启动了,访问数据库也都正常
测试web服务:(可以正常访问)
http://localhost:8030

关闭docker容器:

cd /d01/hzero-dockers/hzero-admin-docker/
docker compose down
cd /d01/hzero-dockers/hzero-iam-saas-docker/
docker compose down
cd /d01/hzero-dockers/hzero-license-docker/
docker compose down
cd /d01/hzero-dockers/hzero-platform-docker/
docker compose down
cd /d01/hzero-dockers/hzero-register-docker/
docker compose down
cd /d01/hzero-dockers/mysql-docker/
docker compose down
cd /d01/hzero-dockers/redis-docker/

docker compose down

==================================================

7、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-OAUTH认证 ps-oauth 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero/project/ps-oauth/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero/project/ps-oauth/target
$ cp ps-oauth.jar ps-oauth.wsl.ok.jar
2、更改yml配置文件
application.yml中 mysql数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}
application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero
  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}
application.yml中 数据库的主机域名 改成Docker composer容器名 :redis-hzero
application.yml中 网关主机域名 改成Docker composer容器名 :hzero-gateway
# oauth 服务基础地址
base-url: ${HZERO_OAUTH_BASE_URL:http://hzero-gateway:8080/oauth}
bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register
  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}
bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin
  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero/project/ps-oauth/
4、构建适合Docker的Jar包
$ cd /d02/hzero/project/ps-oauth/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-oauth-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-oauth-docker
6、拷贝Jar包到目标环境
  在windows powershell 中执行
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-oauth\target\ps-oauth.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-oauth-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-oauth-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-oauth.jar /ps-oauth.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-oauth.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-oauth:
image: hzero-oauth-jk-demo:1.12
container_name: hzero-oauth
ports:
– “8020:8020”
– “8021:8021”
environment:
– JAVA_OPTS=-Xms200m -Xmx200m -Dspring.profiles.active=dev
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 500m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-oauth-docker
$ docker build -t hzero-oauth-jk-demo:1.12 .
构建成功:
$ docker images | grep oauth
hzero-oauth-jk-demo 1.12 f8d746ca59db 20 seconds ago 1.04GB
10、测试Docker镜像

测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin容器已经启动:

cd /d01/hzero-dockers/redis-docker/
docker compose up -d
cd /d01/hzero-dockers/mysql-docker/
docker compose up -d

延时120秒

sleep 120
$ cd /d01/hzero-dockers/hzero-register-docker/
docker compose up -d
cd /d01/hzero-dockers/hzero-admin-docker/
docker compose up -d
cd /d01/hzero-dockers/hzero-oauth-docker

docker compose up -d

看日志:
$ docker logs hzero-oauth
看起来是正常启动了,访问数据库也都正常

==================================================

8、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-网关服务 ps-gateway 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero/project/ps-gateway/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero/project/ps-gateway/target
cp ps-gateway.jar ps-gateway.wsl.ok.jar
2、更改yml配置文件
application.yml中 mysql数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}
application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero
  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}
application.yml中 数据库的主机域名 改成Docker composer容器名 :redis-hzero
application.yml中 网关主机域名 改成Docker composer容器名 :hzero-gateway
# oauth 服务基础地址
base-url: ${HZERO_OAUTH_BASE_URL:http://hzero-gateway:8080/oauth}
bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register
  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}
bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin
  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero/project/ps-gateway/
4、构建适合Docker的Jar包
$ cd /d02/hzero/project/ps-gateway/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-oauth-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-gateway-docker
6、拷贝Jar包到目标环境
  在windows powershell 中执行
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-gateway\target\ps-gateway.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-gateway-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-gateway-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-gateway.jar /ps-gateway.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-gateway.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-gateway:
image: hzero-gateway-jk-demo:1.12
container_name: hzero-gateway
ports:
– “8080:8080”
– “8081:8081”
environment:
– JAVA_OPTS=-Xms200m -Xmx200m -Dspring.profiles.active=dev
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 500m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-gateway-docker
$ docker build -t hzero-gateway-jk-demo:1.12 .
构建成功:
$ docker images | grep gateway
10、测试Docker镜像
测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin容器已经启动:
$ cd /d01/hzero-dockers/hzero-gateway-docker
$ docker compose up -d
看日志:docker logs hzero-gateway
看起来是正常启动了,访问数据库也都正常
测试web服务:(不可正常访问)
http://localhost:8080
返回:
{“failed”:true,”code”:”error.permission.routeNotFound”,”message”:”This request mismatch any routes, uri: %2F”,”type”:”PERMISSION_SERVICE_ROUTE”,”detailsMessage”:”The route you visited does not exist or the related service is not installed”}
表示已经在服务了,成功。

==================================================

9、启动docker compose 容器 mongo-hzero

二、目标环境:
环境:WSL:Ubuntu-22.04系统
1、建立mongo-docker目录
$ cd /d01/hzero-dockers
$ mkdir mongo-docker
$ cd /d01/hzero-dockers/volumes
$ mkdir mongo
$ cd /d01/hzero-dockers/mongo-docker
$ sudo chown -R 1000:1000 ../volumes/mongo
$ sudo chmod -R 755 ../volumes/mongo

$ vi mongo-init.js

db.createUser({
user: “hzero”,
pwd: “hzero”,
roles: [
{ role: “readWrite”, db: “test” }
]

});

2、编辑docker-compose.yml

$ vi docker-compose.yml

services:
mongo-hzero:
image: registry.hand-china.com/hzero-public/mongo:5.0.25
container_name: mongo-hzero
user: “1000:1000” # 添加这一行,指定 mongo 用户
ports:
– “27017:27017”
environment:
– MONGO_INITDB_ROOT_USERNAME=hzero
– MONGO_INITDB_ROOT_PASSWORD=hzero
– MONGO_INITDB_DATABASE=test
volumes:
– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/mongo:/data/db
– ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
networks:
default:
name: hzero-demo

external: true

3、测试Docker 容器
$ cd /d01/hzero-dockers/mongo-docker
$ docker compose up -d
看日志:docker logs mongo-hzero
启动成功

==================================================

10、启动docker compose 容器 elasticsearch-hzero

二、目标环境:
环境:WSL:Ubuntu-22.04系统
1、建立elasticsearch-docker目录
$ cd /d01/hzero-dockers
$ mkdir elasticsearch-docker
$ mkdir volumes
$ cd /d01/hzero-dockers/elasticsearch-docker

windows powershell 中 执行:原有demo数据迁移(包括AI平台的向量数据和关键字索引):

$ cp -r \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero-aipaas\hzero-aigc-docker-compose\elastic\volumes\elastic \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\volumes\

设置 Elasticsearch 数据目录的所有者为 UID=1000 的用户

$ cd /d01/hzero-dockers/elasticsearch-docker
$ sudo chown -R 1000:1000 ../volumes/elastic
$ sudo chmod -R 755 ../volumes/elastic
2、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
elasticsearch-hzero:
image: registry.hand-china.com/hzero-public/elasticsearch:8.12.2
container_name: elasticsearch-hzero
user: “1000:1000” # 添加这一行,指定 Elasticsearch 用户
ports:
– “9200:9200”
– “9300:9300”
environment:
– ELASTIC_PASSWORD=elastic
– discovery.type=single-node
– xpack.security.enrollment.enabled=true
– xpack.security.enabled=true
– ES_JAVA_OPTS=-Xms1g -Xmx1g # 设置 JVM 堆内存为 500M
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 2g # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
volumes:
– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/elastic/data:/usr/share/elasticsearch/data
– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/elastic/plugins:/usr/share/elasticsearch/plugins
networks:
default:
name: hzero-demo

external: true

3、测试Docker 容器
$ cd /d01/hzero-dockers/elasticsearch-docker
$ docker compose up -d
看日志:docker logs elasticsearch-docker
启动成功

==================================================

11、启动docker compose 容器 minio-hzero

二、目标环境:
环境:WSL:Ubuntu-22.04系统
1、建立minio-docker目录
$ cd /d01/hzero-dockers
$ mkdir minio-docker
$ cd volumes
$ mkdir minio
$ cd /d01/hzero-dockers/minio-docker

windows powershell 中执行:原有Demo数据迁移(包括AI平台中的文档)

$ cp -r \wsl.localhost\Ubuntu-22.04-hzero\data\minio \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\volumes\

设置 minio 数据目录的所有者为 UID=1000 的用户

$ cd /d01/hzero-dockers/minio-docker
$ sudo chown -R 1000:1000 ../volumes/minio
$ sudo chmod -R 755 ../volumes/minio
2、编辑docker-compose.yml

$ vi docker-compose.yml

services:
minio-hzero:
image: minio/minio:latest
container_name: minio-hzero
user: “1000:1000” # 添加这一行,指定minio 用户
ports:
– “9000:9000” # MinIO API 端口
– “9001:9001” # MinIO 控制台端口
environment:
– MINIO_ROOT_USER=hzero.admin
– MINIO_ROOT_PASSWORD=hzero.hand.2020.
– MINIO_ACCESS_KEY=hzero.admin # 兼容旧版配置
– MINIO_SECRET_KEY=hzero.hand.2020. # 兼容旧版配置
volumes:
– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/minio:/data # 挂载原有数据目录
command: server /data –address “:9000” –console-address “:9001”
restart: always
networks:
default:
name: hzero-demo

external: true

3、测试Docker 容器
$ cd /d01/hzero-dockers/minio-docker
$ docker compose up -d
看日志:docker logs minio-hzero
启动成功

==================================================

12、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-接口平台 ps-interface 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero-ipaas/project/ps-jipaas-interface/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero-ipaas/project/ps-jipaas-interface/target
$ cp ps-jipaas-interface.jar ps-jipaas-interface.wsl.ok.jar
2、更改yml配置文件
application.yml中 数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}
application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero
  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}
application.yml中 mongo数据库主机域名改成Docker composer容器名 :mongo-hzero
mongodb:
uri: ${SPRING_MONGODB_URI:mongodb://hzero:hzero@mongo-hzero:27017/test}
elasticsearch:
application.yml中 elasticsearch数据库主机域名
# 地址,支持多地址,逗号分隔
host: ${ELASTICSEARCH_HOST:elasticsearch-hzero}

bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register
  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}
bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin
  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero-ipaas/project/ps-jipaas-interface/
4、构建适合Docker的Jar包
$ cd /d02/hzero-ipaas/project/ps-jipaas-interface/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-interface-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-interface-docker
6、拷贝Jar包到目标环境
  在windows powershell 中执行
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero-ipaas\project\ps-jipaas-interface\target\ps-jipaas-interface.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-interface-docker\
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-license\licenseAgent\license-agent110.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-interface-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-interface-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-jipaas-interface.jar /ps-jipaas-interface.jar
COPY license-agent110.jar /license-agent110.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-jipaas-interface.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-interface:
image: hzero-jipaas-interface-jk-demo:1.12
container_name: hzero-interface
ports:
– “8150:8150”
– “8151:8151”
environment:
– JAVA_OPTS=-Xms800m -Xmx800m -Dspring.profiles.active=dev
– AGENT=-javaagent:/license-agent110.jar
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 1500m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-interface-docker
$ docker build -t hzero-jipaas-interface-jk-demo:1.12 .
构建成功:
$ docker images | grep interface
10、测试Docker镜像
测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin,mongo-hzero, elasticsearch-hzero 容器已经启动:
$ cd /d01/hzero-dockers/hzero-interface-docker
$ docker compose up -d
看日志:docker logs hzero-interface

有错误:

For ‘hzero-license’ URL not provided. Will try picking an instance via load-balancing.
For ‘hzero-iam’ URL not provided. Will try picking an instance via load-balancing.
Caused by: java.sql.SQLSyntaxErrorException: Table ‘hzero_interface.iam_role’ doesn’t exist
服务启动没成功,在注册中心未能注册成功。
分析:

iam_role 这张表是在hzero_platform数据库中的,为啥会去hzero_interface数据库中找?奇怪!

可能是license、iam、platform三个服务没有提前启动的原因?
解决方案:

把hzero-license服务 hzero-iam服务 和 hzero-platform 也启动后再启

先停interface服务

$ cd /d01/hzero-dockers/hzero-interface-docker
$ docker compose down

起hzero-license、 hzero-iam、hzero-platform服务

$ cd /d01/hzero-dockers/hzero-license-docker
$ docker compose up -d
$ cd /d01/hzero-dockers/hzero-iam-saas-docker
$ docker compose up -d
$ cd /d01/hzero-dockers/hzero-platform-docker
$ docker compose up -d

再重启interface服务

$ cd /d01/hzero-dockers/hzero-interface-docker
$ docker compose up -d
这次看起来是正常启动了,在注册中心http://localhost:8000中可以看到了,看起来他能找到hzero-iam路由的话,就不会去访问hzero_interface.iam_role,反之就会去访问hzero_interface.iam_role,是实际上hzero_interface数据库中没有iam_role表就出错了。
测试web服务:(可以正常访问)
http://localhost:8150,可以正常转到license服务的Web界面。

==================================================

13、启动docker compose 容器 kkfileview-hzero

二、目标环境:
环境:WSL:Ubuntu-22.04系统
1、建立elasticsearch-docker目录
$ cd /d01/hzero-dockers
$ mkdir kkfileview-docker
2、编辑docker-compose.yml
$ cd /d01/hzero-dockers/kkfileview-docker

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
kkfileview-hzero:
image: keking/kkfileview
container_name: kkfileview-hzero
ports:
– “8012:8012”
networks:
default:
name: hzero-demo

external: true

3、测试Docker 容器
$ cd /d01/hzero-dockers/kkfileview-docker
$ docker compose up -d
看日志:docker logs kkfileview-docker
启动成功
http://localhost:8012 上传一个中文PPT测试预览,正常。

==================================================

14、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-定时任务服务 ps-scheduler 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero/project/ps-scheduler/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero/project/ps-scheduler/target
$ cp ps-scheduler.jar ps-scheduler.wsl.ok.jar
2、更改yml配置文件
application.yml中 mysql数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}

application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero

  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}

application.yml中 数据库的主机域名 改成Docker composer容器名 :redis-hzero

application.yml中 网关主机域名 改成Docker composer容器名 :hzero-gateway

# oauth 服务基础地址
base-url: ${HZERO_OAUTH_BASE_URL:http://hzero-gateway:8080/oauth}

bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register

  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}

bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin

  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:4、构建适合Docker的Jar包
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero/project/ps-scheduler/
$ cd /d02/hzero/project/ps-scheduler/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-scheduler-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-scheduler-docker
6、拷贝Jar包到目标环境

在windows powershell 中执行

$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-scheduler\target\ps-scheduler.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-scheduler-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-scheduler-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-scheduler.jar /ps-scheduler.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-scheduler.jar

8、编辑docker-compose.yml

vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-scheduler:
image: hzero-scheduler-jk-demo:1.12
container_name: hzero-scheduler
ports:
– “8130:8130”
– “8131:8131”
environment:
– JAVA_OPTS=-Xms200m -Xmx200m -Dspring.profiles.active=dev
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 500m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-scheduler-docker
$ docker build -t hzero-scheduler-jk-demo:1.12 .
构建成功:
$ docker images | grep scheduler
10、测试Docker镜像(测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin容器已经启动):
$ cd /d01/hzero-dockers/hzero-scheduler-docker
$ docker compose up -d
看日志:docker logs hzero-scheduler
看起来是正常启动了
http://localhost:8000注册中心中可见hzero-scheduler服务

==================================================

15、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-文件服务 ps-file 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero/project/ps-file/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero/project/ps-file/target
$ cp ps-file.jar ps-file.wsl.ok.jar
2、更改yml配置文件
application.yml中 mysql数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}

application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero

  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}

application.yml中 数据库的主机域名 改成Docker composer容器名 :redis-hzero

application.yml中 网关主机域名 改成Docker composer容器名 :hzero-gateway

# oauth 服务基础地址
base-url: ${HZERO_OAUTH_BASE_URL:http://hzero-gateway:8080/oauth}

application.yml中 KKV主机域名 改成Docker composer容器名 :kkfileview-hzero

preview-type: kkFileView
kk-file-view-url: http://kkfileview-hzero:8012/onlinePreview   # kkFileView的文件预览地址

bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register
  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}
bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin
  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero/project/ps-file/
4、构建适合Docker的Jar包
$ cd /d02/hzero/project/ps-file/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-file-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-file-docker
6、拷贝Jar包到目标环境

在windows powershell 中执行

$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-file\target\ps-file.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-file-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-file-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-file.jar /ps-file.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-file.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-file:
image: hzero-file-jk-demo:1.12
container_name: hzero-file
ports:
– “8110:8110”
– “8111:8111”
environment:
– JAVA_OPTS=-Xms220m -Xmx220m -Dspring.profiles.active=dev
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 500m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-file-docker
$ docker build -t hzero-file-jk-demo:1.12 .
构建成功:
$ docker images | grep file
10、测试Docker镜像(测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin容器已经启动):
$ cd /d01/hzero-dockers/hzero-file-docker
$ docker compose up -d
看日志:docker logs hzero-file
看起来是正常启动了
http://localhost:8000注册中心中可见hzero-file服务

==================================================

16、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-预警服务 ps-alert 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero/project/ps-alert/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero/project/ps-alert/target
$ cp ps-alert.jar ps-alert.wsl.ok.jar
2、更改yml配置文件
application.yml中 mysql数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}

application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero

  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}

application.yml中 数据库的主机域名 改成Docker composer容器名 :redis-hzero

application.yml中 网关主机域名 改成Docker composer容器名 :hzero-gateway

# oauth 服务基础地址
base-url: ${HZERO_OAUTH_BASE_URL:http://hzero-gateway:8080/oauth}

bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register

  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}

bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin

  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero/project/ps-alert/
4、构建适合Docker的Jar包
$ cd /d02/hzero/project/ps-alert/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-file-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-alert-docker
6、拷贝Jar包到目标环境

在windows powershell 中执行

$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-alert\target\ps-alert.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-alert-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-alert-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-alert.jar /ps-alert.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-alert.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-alert:
image: hzero-alert-jk-demo:1.12
container_name: hzero-alert
ports:
– “8115:8115”
– “8116:8116”
environment:
– JAVA_OPTS=-Xms250m -Xmx250m -Dspring.profiles.active=dev
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 500m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-alert-docker
$ docker build -t hzero-alert-jk-demo:1.12 .
构建成功:
$ docker images | grep alert
10、测试Docker镜像(测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin容器已经启动):
$ cd /d01/hzero-dockers/hzero-alert-docker
$ docker compose up -d
看日志:docker logs hzero-alert
看起来是正常启动了
http://localhost:8000注册中心中可见hzero-alert服务

==================================================

17、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-导入服务 ps-import 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero/project/ps-import/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero/project/ps-import/target
$ cp ps-import.jar ps-import.wsl.ok.jar
2、更改yml配置文件
application.yml中 mysql数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}

application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero

  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}

application.yml中 数据库的主机域名 改成Docker composer容器名 :redis-hzero

application.yml中 网关主机域名 改成Docker composer容器名 :hzero-gateway

# oauth 服务基础地址
base-url: ${HZERO_OAUTH_BASE_URL:http://hzero-gateway:8080/oauth}

application.yml中 文件网关域名 改成Docker composer容器名 :hzero-gateway

file:
gateway-path: ${FILE_GATEWAY_URL:http://hzero-gateway:8080/himp}

bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register

  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}

bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin

  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:4、构建适合Docker的Jar包
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero/project/ps-import/
$ cd /d02/hzero/project/ps-import/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-import-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-import-docker
6、拷贝Jar包到目标环境

在windows powershell 中执行

$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-import\target\ps-import.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-import-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-import-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-import.jar /ps-import.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-import.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-import:
image: hzero-import-jk-demo:1.12
container_name: hzero-import
ports:
– “8140:8140”
– “8141:8141”
environment:
– JAVA_OPTS=-Xms220m -Xmx220m -Dspring.profiles.active=dev
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 500m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-import-docker
$ docker build -t hzero-import-jk-demo:1.12 .
构建成功:
$ docker images | grep import
10、测试Docker镜像(测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin容器已经启动):
$ cd /d01/hzero-dockers/hzero-import-docker
$ docker compose up -d
看日志:docker logs hzero-import
看起来是正常启动了
http://localhost:8000注册中心中可见hzero-import服务

==================================================

18、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-消息服务 ps-message 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero/project/ps-message/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero/project/ps-message/target
$ cp ps-message.jar ps-message.wsl.ok.jar
2、更改yml配置文件
application.yml中 mysql数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}

application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero

  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}

application.yml中 数据库的主机域名 改成Docker composer容器名 :redis-hzero

application.yml中 网关主机域名 改成Docker composer容器名 :hzero-gateway

# oauth 服务基础地址
base-url: ${HZERO_OAUTH_BASE_URL:http://hzero-gateway:8080/oauth}

bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register

  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}

bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin

  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:4、构建适合Docker的Jar包
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero/project/ps-message/
$ cd /d02/hzero/project/ps-message/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-message-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-message-docker
6、拷贝Jar包到目标环境

在windows powershell 中执行

$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-message\target\ps-message.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-message-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-message-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-message.jar /ps-message.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-message.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-message:
image: hzero-message-jk-demo:1.12
container_name: hzero-message
ports:
– “8120:8120”
– “8121:8121”
environment:
– JAVA_OPTS=-Xms250m -Xmx250m -Dspring.profiles.active=dev
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 500m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-message-docker
$ docker build -t hzero-message-jk-demo:1.12 .
构建成功:
$ docker images | grep message
10、测试Docker镜像(测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin容器已经启动):
$ cd /d01/hzero-dockers/hzero-message-docker
$ docker compose up -d
看日志:docker logs hzero-message
看起来是正常启动了
http://localhost:8000注册中心中可见hzero-import服务

==================================================

19、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-消息服务 ps-report 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero/project/ps-report/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero/project/ps-report/target
$ cp ps-report.jar ps-report.wsl.ok.jar
2、更改yml配置文件
application.yml中 mysql数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}

application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero

  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}

application.yml中 数据库的主机域名 改成Docker composer容器名 :redis-hzero

application.yml中 网关主机域名 改成Docker composer容器名 :hzero-gateway

# oauth 服务基础地址
base-url: ${HZERO_OAUTH_BASE_URL:http://hzero-gateway:8080/oauth}

bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register

  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}

bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin

  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:4、构建适合Docker的Jar包
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero/project/ps-report/
$ cd /d02/hzero/project/ps-report/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-report-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-report-docker
6、拷贝Jar包到目标环境

在windows powershell 中执行

$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-report\target\ps-report.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-report-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-report-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-report.jar /ps-report.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-report.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-report:
image: hzero-report-jk-demo:1.12
container_name: hzero-report
ports:
– “8210:8210”
– “8211:8211”
environment:
– JAVA_OPTS=-Xms200m -Xmx800m -Dspring.profiles.active=dev
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 1500m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-report-docker
$ docker build -t hzero-report-jk-demo:1.12 .
构建成功:
$ docker images | grep report
10、测试Docker镜像(测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin容器已经启动):
$ cd /d01/hzero-dockers/hzero-report-docker
$ docker compose up -d
看日志:docker logs hzero-report
看起来是正常启动了
http://localhost:8000注册中心中可见hzero-report服务

==================================================

20、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-API文档服务 ps-swagger 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero/project/ps-swagger/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero/project/ps-swagger/target
$ cp ps-swagger.jar ps-swagger.wsl.ok.jar
2、更改yml配置文件
application.yml中 mysql数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}

application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero

  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}

application.yml中 数据库的主机域名 改成Docker composer容器名 :redis-hzero

application.yml中 网关主机域名 改成Docker composer容器名 :hzero-gateway

base-url: ${HZERO_SWAGGER_BASE_URL:http://hzero-gateway:8080}

bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register

  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}

bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin

  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:4、构建适合Docker的Jar包
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero/project/ps-swagger/
$ cd /d02/hzero/project/ps-swagger/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-swagger-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-swagger-docker
6、拷贝Jar包到目标环境

在windows powershell 中执行

$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-swagger\target\ps-swagger.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-swagger-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-swagger-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-swagger.jar /ps-swagger.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-swagger.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-swagger:
image: hzero-swagger-jk-demo:1.12
container_name: hzero-swagger
ports:
– “8050:8050”
– “8051:8051”
environment:
– JAVA_OPTS=-Xms200m -Xmx800m -Dspring.profiles.active=dev
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 1500m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-swagger-docker
$ docker build -t hzero-swagger-jk-demo:1.12 .
构建成功:
$ docker images | grep swagger
10、测试Docker镜像(测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin容器已经启动):
$ cd /d01/hzero-dockers/hzero-swagger-docker
$ docker compose up -d
看日志:docker logs hzero-swagger
看起来是正常启动了
http://localhost:8000注册中心中可见hzero-swagger服务

==================================================

21、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-低代码模型服务 ps-modeler 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero-apaas/project/ps-modeler/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero-apaas/project/ps-modeler/target
$ cp ps-modeler.jar ps-modeler.wsl.ok.jar
2、更改yml配置文件
application.yml中 数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}
application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero
  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}
application.yml中 seta注册主机域名改成Docker composer容器名 :hzero-register
service-url: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}
bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register
  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}
bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin
  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:4、构建适合Docker的Jar包
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero-apaas/project/ps-modeler/
$ cd /d02/hzero-apaas/project/ps-modeler/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-modeler-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-modeler-docker
6、拷贝Jar包到目标环境

在windows powershell 中执行

$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero-apaas\project\ps-modeler\target\ps-modeler.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-modeler-docker\
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-license\licenseAgent\license-agent112a.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-modeler-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-modeler-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-modeler.jar /ps-modeler.jar
COPY license-agent112a.jar /license-agent112a.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-modeler.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-modeler:
image: hzero-modeler-jk-demo:1.12
container_name: hzero-modeler
ports:
– “8085:8085”
– “8086:8086”
environment:
– JAVA_OPTS=-Xms500m -Xmx800m -Dspring.profiles.active=dev
– AGENT=-javaagent:/license-agent112a.jar
– REFLEC_OPTS=–add-opens java.base/java.lang=ALL-UNNAMED –add-opens java.base/java.util=ALL-UNNAMED –add-opens java.base/java.util.concurrent=ALL-UNNAMED –add-opens java.base/jdk.internal.loader=ALL-UNNAMED –add-opens java.base/java.net=ALL-UNNAMED –add-opens java.base/java.nio=ALL-UNNAMED –add-opens java.base/java.lang.reflect=ALL-UNNAMED
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 1500m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-modeler-docker
$ docker build -t hzero-modeler-jk-demo:1.12 .
构建成功:
$ docker images | grep modeler
10、测试Docker镜像
测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin 容器已经启动:
$ cd /d01/hzero-dockers/hzero-modeler-docker
$ docker compose up -d
看日志:docker logs hzero-modeler
测试web服务:(可以正常访问)
http://localhost:8000,可以看到hzero-modeler已经成功注册。

==================================================

22、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-低代码应用服务 ps-lowcode 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero-apaas/project/ps-lowcode/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero-apaas/project/ps-lowcode/target
$ cp ps-lowcode.jar ps-lowcode.wsl.ok.jar
2、更改yml配置文件
application.yml中 数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}
application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero
  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}
application.yml中 seta注册主机域名改成Docker composer容器名 :hzero-register
service-url: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}
bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register
  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}
bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin
  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:4、构建适合Docker的Jar包
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero-apaas/project/ps-lowcode/
$ cd /d02/hzero-apaas/project/ps-lowcode/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-lowcode-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-lowcode-docker
6、拷贝Jar包到目标环境

在windows powershell 中执行

$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero-apaas\project\ps-lowcode\target\ps-lowcode.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-lowcode-docker\
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-license\licenseAgent\license-agent112a.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-lowcode-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-lowcode-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-lowcode.jar /ps-lowcode.jar
COPY license-agent112a.jar /license-agent112a.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-lowcode.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-lowcode:
image: hzero-lowcode-jk-demo:1.12
container_name: hzero-lowcode
ports:
– “8095:8095”
– “8096:8096”
environment:
– JAVA_OPTS=-Xms500m -Xmx800m -Dspring.profiles.active=dev
– AGENT=-javaagent:/license-agent112a.jar
– REFLEC_OPTS=–add-opens java.base/java.lang=ALL-UNNAMED –add-opens java.base/java.util=ALL-UNNAMED –add-opens java.base/java.util.concurrent=ALL-UNNAMED –add-opens java.base/jdk.internal.loader=ALL-UNNAMED –add-opens java.base/java.net=ALL-UNNAMED –add-opens java.base/java.nio=ALL-UNNAMED –add-opens java.base/java.lang.reflect=ALL-UNNAMED
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 1500m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-lowcode-docker
$ docker build -t hzero-lowcode-jk-demo:1.12 .
构建成功:
$ docker images | grep lowcode
10、测试Docker镜像
测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin 容器已经启动:
$ cd /d01/hzero-dockers/hzero-lowcode-docker
$ docker compose up -d
看日志:docker logs hzero-lowcode
测试web服务:(可以正常访问)
http://localhost:8000,可以看到hzero-lowcode已经成功注册。

==================================================

23、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-低代码空数据服务 ps-lowcodedata 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero-apaas/project/ps-lowcodedata/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero-apaas/project/ps-lowcodedata/target
$ cp ps-lowcodedata.jar ps-lowcodedata.wsl.ok.jar
2、更改yml配置文件
application.yml中 数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}
application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero
  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}
application.yml中 seta注册主机域名改成Docker composer容器名 :hzero-register
service-url: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}
bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register
  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}
bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin
  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:4、构建适合Docker的Jar包
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero-apaas/project/ps-lowcodedata/
$ cd /d02/hzero-apaas/project/ps-lowcodedata/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-lowcodedata-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-lowcodedata-docker
6、拷贝Jar包到目标环境
  在windows powershell 中执行
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero-apaas\project\ps-lowcodedata\target\ps-lowcodedata.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-lowcodedata-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-lowcodedata-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-lowcodedata.jar /ps-lowcodedata.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-lowcodedata.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-lowcodedata:
image: hzero-lowcodedata-jk-demo:1.12
container_name: hzero-lowcodedata
ports:
– “8555:8555”
– “8556:8556”
environment:
– JAVA_OPTS=-Xms200m -Xmx300m -Dspring.profiles.active=dev
– REFLEC_OPTS=–add-opens java.base/java.lang=ALL-UNNAMED –add-opens java.base/java.util=ALL-UNNAMED –add-opens java.base/java.util.concurrent=ALL-UNNAMED –add-opens java.base/jdk.internal.loader=ALL-UNNAMED –add-opens java.base/java.net=ALL-UNNAMED –add-opens java.base/java.nio=ALL-UNNAMED –add-opens java.base/java.lang.reflect=ALL-UNNAMED
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 600m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-lowcodedata-docker
$ docker build -t hzero-lowcodedata-jk-demo:1.12 .
构建成功:
$ docker images | grep lowcodedata
10、测试Docker镜像
测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin 容器已经启动:
$ cd /d01/hzero-dockers/hzero-lowcodedata-docker
$ docker compose up -d
看日志:docker logs hzero-lowcodedata
测试web服务:(可以正常访问)
http://localhost:8000,可以看到hzero-lowcodedata已经成功注册。

==================================================

24、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-集成平台前置机 ps-frontal 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero-ipaas/project/ps-frontal/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero-ipaas/project/ps-frontal/target
$ cp ps-frontal.jar ps-frontal.wsl.ok.jar
2、更改yml配置文件
application.yml中 数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}
application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero
  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}
bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register
  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}
bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin
  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:4、构建适合Docker的Jar包
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero-ipaas/project/ps-frontal/
$ cd /d02/hzero-ipaas/project/ps-frontal/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-frontal-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-frontal-docker
6、拷贝Jar包到目标环境

在windows powershell 中执行

$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero-ipaas\project\ps-frontal\target\ps-frontal.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-frontal-docker\
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-license\licenseAgent\license-agent110.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-frontal-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-frontal-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-frontal.jar /ps-frontal.jar
COPY license-agent110.jar /license-agent110.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-frontal.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-frontal:
image: hzero-frontal-jk-demo:1.12
container_name: hzero-frontal
ports:
– “8155:8155”
– “8156:8156”
environment:
– JAVA_OPTS=-Xms200m -Xmx350m -Dspring.profiles.active=dev
– AGENT=-javaagent:/license-agent110.jar
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 700m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-frontal-docker
$ docker build -t hzero-frontal-jk-demo:1.12 .
构建成功:
$ docker images | grep frontal
10、测试Docker镜像
测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin 容器已经启动:
$ cd /d01/hzero-dockers/hzero-frontal-docker
$ docker compose up -d
看日志:docker logs hzero-frontal
看注册中心:
http://localhost:8000,可以看到frontal服务的已经正常注册。

==================================================

25、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-集成平台编排服务 ps-orchestration-all 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero-ipaas/project/ps-orchestration-all/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero-ipaas/project/ps-orchestration-all/target
$ cp ps-orchestration-all.jar ps-orchestration-all.wsl.ok.jar
2、更改yml配置文件
application.yml中 数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}
application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero
  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}
application.yml中 mongo数据库主机域名改成Docker composer容器名 :mongo-hzero
mongodb:
uri: ${SPRING_MONGODB_URI:mongodb://hzero:hzero@mongo-hzero:27017/test}
elasticsearch:

application.yml中 elasticsearch数据库主机域名

# 地址,支持多地址,逗号分隔
host: ${ELASTICSEARCH_HOST:elasticsearch-hzero}

application.yml中 #seta 注册中心 hzero-register

application.yml中 #orchestration网关:

orchestration:
server-uri: ${HZERO_ORCHESTRATION_SERVER_URI:http://hzero-gateway}
bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register
  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}
bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin
  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:4、构建适合Docker的Jar包
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero-ipaas/project/ps-orchestration-all/
$ cd /d02/hzero-ipaas/project/ps-orchestration-all/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-orchestration-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-orchestration-docker
6、拷贝Jar包到目标环境

在windows powershell 中执行

$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero-ipaas\project\ps-orchestration-all\target\ps-orchestration-all.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-orchestration-docker\
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-license\licenseAgent\license-agent110.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-orchestration-docker\
7、编辑Dockerfile
cd /d01/hzero-dockers/hzero-orchestration-docker

vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-orchestration-all.jar /ps-orchestration-all.jar
COPY license-agent110.jar /license-agent110.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-orchestration-all.jar

8、编辑docker-compose.yml

vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-orchestration:
image: hzero-orchestration-all-jk-demo:1.12
container_name: hzero-orchestration
ports:
– “8185:8185”
– “8186:8186”
environment:
– JAVA_OPTS=-Xms200m -Xmx350m -Dspring.profiles.active=dev
– AGENT=-javaagent:/license-agent110.jar
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 700m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-orchestration-docker
$ docker build -t hzero-orchestration-all-jk-demo:1.12 .
构建成功:
$ docker images | grep orchestration
10、测试Docker镜像
测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin 容器已经启动:
$ cd /d01/hzero-dockers/hzero-orchestration-docker
$ docker compose up -d
看日志:docker logs hzero-orchestration
看注册中心:
http://localhost:8000,可以看到orchestration服务的已经正常注册。

==================================================

26、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-流程平台工作流服务 ps-workflow 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero-bpaas/project/ps-workflow/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero-bpaas/project/ps-workflow/target
$ cp ps-workflow.jar ps-workflow.wsl.ok.jar
2、更改yml配置文件
application.yml中 数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}
application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero
  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}
application.yml中 hzero的lock 用的redis数据库改成:容器名:redis-hzero
hzero:
import:
transaction-control: false
lock:
pattern: single
single-server:
address: ${SPRING_REDIS_HOST:redis-hzero}

bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register

  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}

bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin

  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:4、构建适合Docker的Jar包
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero-bpaas/project/ps-workflow/
$ cd /d02/hzero-bpaas/project/ps-workflow/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-workflow-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-workflow-docker
6、拷贝Jar包到目标环境

在windows powershell 中执行

$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero-bpaas\project\ps-workflow\target\ps-workflow.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-workflow-docker\
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-license\licenseAgent\license-agent112a.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-workflow-docker\

7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-workflow-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-workflow.jar /ps-workflow.jar
COPY license-agent112a.jar /license-agent112a.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-workflow.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-workflow:
image: hzero-workflow-jk-demo:1.12
container_name: hzero-workflow
ports:
– “8165:8165”
– “8166:8166”
environment:
– JAVA_OPTS=-Xms500m -Xmx800m -Dspring.profiles.active=dev
– AGENT=-javaagent:/license-agent112a.jar
– REFLEC_OPTS=–add-opens java.base/java.lang=ALL-UNNAMED –add-opens java.base/java.util=ALL-UNNAMED –add-opens java.base/java.util.concurrent=ALL-UNNAMED –add-opens java.base/jdk.internal.loader=ALL-UNNAMED –add-opens java.base/java.net=ALL-UNNAMED –add-opens java.base/java.nio=ALL-UNNAMED –add-opens java.base/java.lang.reflect=ALL-UNNAMED
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 1500m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-workflow-docker
$ docker build -t hzero-workflow-jk-demo:1.12 .
构建成功:
$ docker images | grep workflow
10、测试Docker镜像
测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin 容器已经启动:
$ cd /d01/hzero-dockers/hzero-workflow-docker
$ docker compose up -d
看日志:docker logs hzero-workflow
启动失败:原因是依赖不满足,这个workflow服务之前构建的jar是可以用的,可以成功启动并注册到注册中心,后来本地maven库更改过,看起来是更改后再次打包的jar有问题了。
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘flowExecuteServiceImpl’ defined in URL [jar:nested:/ps-workflow.jar/!BOOT-INF/lib/hzero-boot-modeler-event-driver-2.10.0-1.12.RELEASE.jar!/org/hzero/boot/modeler/event/domain/service/impl/FlowExecuteServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 4: Error creating bean with name ‘eventEncryptHelper’: Lookup method resolution failed
解决方案:把POM中的这一段去掉,重新构建jar 和docker镜像(不需要其作为低代码领域的业务微服务)

org.hzero.boot hzero-boot-modeler-driver 2.10.0-1.12.RELEASE
org.hzero.boot hzero-boot-modeler-client 2.10.0-1.12.RELEASE
操作:

环境:Ubuntu-22.04-hzero

$ cd /d02/hzero-bpaas/project/ps-workflow
$ cp pom.xml pom.xml.bak20251124-OK
$ cd /d02/hzero-bpaas/project/ps-workflow/
$ bash build.sh

windows 环境 PowShell 执行:

$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero-bpaas\project\ps-workflow\target\ps-workflow.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-workflow-docker\
9、构建Docker镜像
环境:Ubuntu-22.04
$ cd /d01/hzero-dockers/hzero-workflow-docker
$ docker compose down
$ docker build -t hzero-workflow-jk-demo:1.12 .
$ docker compose up -d
看日志,这次成功了,在注册中心可以看到workflow已成功注册。

==================================================

27、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-AI平台APP服务 ps-aip-app 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero-aipaas/project/ps-aip-app/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero-aipaas/project/ps-aip-app/target
$ cp ps-aip-app.jar ps-aip-app.wsl.ok.jar
2、更改yml配置文件
application.yml中 数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}
application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero
  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}

application.yml中 redis数据库的主机域名 改成Docker composer容器名 :elasticsearch-hzero

elasticsearch:
hosts: ${ELASTICSEARCH_HOSTS:https://elasticsearch-hzero:9200}

application.yml中 python执行器的主机域名 改成Docker composer容器名 :hzero-hype

  python:
    # python脚本执行地址
    gateway-path: ${HZERO_AIP_AGENT_PYTHON_GATEWAY_PATH:http://hype-hzero:10088}

application.yml中 HKMS切片执行器的主机域名 改成Docker composer容器名 :hzero-hkms

  llama:
    gateway-path: ${HZERO_KNOWLEDGE_LLAMA_GATEWAY_PATH:http://hzero-hkms:18080}

bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register

  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}

bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin

  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:4、构建适合Docker的Jar包
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero-aipaas/project/ps-aip-app/
$ cd /d02/hzero-aipaas/project/ps-aip-app/
$ bash build.sh
构建失败,错误信息:
[ERROR] Failed to execute goal on project ps-aip-app-snapshot: Could not resolve dependencies for project org.hzero:ps-aip-app-snapshot:jar:1.6.1.ALPHA.1.3: Could not find artifact com.volcengine:volc-sdk-java:jar:2.0.5-SNAPSHOT in Hzero (https://nexus.saas.hand-china.com/repository/hzero/) -> [Help 1]
分析:
这个之前是构建成功的,POM文件内容没有变化,失败原因是 volc-sdk-java:jar:2.0.5-SNAPSHOT找不到了,这个好像是火山引擎的SDK吧。
跟产研沟通了下,给的建议是
1、这个依赖在库里确实没有了。
2、建议升级到最新版:
hzero-aip-server 1.6.1.ALPHA.4
hzero-aip-app 1.6.1.ALPHA.4
hzero-front-haip 1.6.1-alpha.4
执行:按建议升级,具体升级过程参考 Unbntu-22.04-hzero /d02/更新日志.txt
升级完成后,构建成功,继续执行后续步骤。
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-aipapp-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-aipapp-docker
6、拷贝Jar包到目标环境

在windows powershell 中执行

$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero-aipaas\project\ps-aip-app\target\ps-aip-app.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-aipapp-docker\
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-license\licenseAgent\license-agent112a.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-aipapp-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-aipapp-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-aip-app.jar /ps-aip-app.jar
COPY license-agent112a.jar /license-agent112a.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-aip-app.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-aip-app:
image: hzero-aip-app-jk-demo:1.12
container_name: hzero-aip-app
ports:
– “8088:8088”
– “8089:8089”
environment:
– JAVA_OPTS=-Xms500m -Xmx1500m -Dspring.profiles.active=dev
– AGENT=-javaagent:/license-agent112a.jar
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 2500m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-aipapp-docker
$ docker build -t hzero-aip-app-jk-demo:1.12 .
构建成功:
$ docker images | grep aip-app
10、测试Docker镜像
测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin 容器已经启动:
$ cd /d01/hzero-dockers/hzero-aipapp-docker
$ docker compose up -d
看日志:docker logs hzero-aip-app,OK的
看注册中心,在注册中心可以看到workflow已成功注册。

==================================================

28、制作HZERO PaaS 平台 1.12版本的Demo环境的HZERO 微服务-AI平台Server服务 ps-aip-server 镜像

一、来源环境:
环境:WSL:Ubuntu-22.04-hzero系统
1、来源环境先备份
$ cd /d02/hzero-aipaas/project/ps-aip-server/src/main/resources
$ cp application.yml application.wsl.ok.yml
$ cp bootstrap.yml bootstrap.wsl.ok.yml
$ cd /d02/hzero-aipaas/project/ps-aip-server/target
$ cp ps-aip-server.jar ps-aip-server.wsl.ok.jar
2、更改yml配置文件
application.yml中 数据库的主机域名改成Docker compose容器名 :mysql-hzero
 url: ${SPRING_DATASOURCE_URL:jdbc:mysql://mysql-hzero:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}
application.yml中 redis数据库的主机域名 改成Docker composer容器名 :redis-hzero
  redis:
  host: ${SPRING_DATA_REDIS_HOST:redis-hzero}

application.yml中 mongo数据库的主机域名 改成Docker composer容器名 :mongo-hzero

mongodb:
  uri: ${SPRING_DATA_MONGODB_URI:mongodb://hzero:hzero@mongo-hzero:27017/haip?authSource=admin}

application.yml中 redis数据库的主机域名 改成Docker composer容器名 :elasticsearch-hzero

elasticsearch:
hosts: ${ELASTICSEARCH_HOSTS:https://elasticsearch-hzero:9200}

application.yml中 python执行器的主机域名 改成Docker composer容器名 :hzero-hype

  python:
    # python脚本执行地址
    gateway-path: ${HZERO_AIP_AGENT_PYTHON_GATEWAY_PATH:http://hype-hzero:10088}

application.yml中 HKMS切片执行器的主机域名 改成Docker composer容器名 :hzero-hkms

  llama:
    gateway-path: ${HZERO_KNOWLEDGE_LLAMA_GATEWAY_PATH:http://hzero-hkms:18080}

bootstrap.yml 中 注册中心的主机域名地址改成docker compose容器名 :hzero-register

  # 注册中心地址
  defaultZone: ${EUREKA_DEFAULT_ZONE:http://hzero-register:8000/eureka}

bootstrap.yml中 配置中心的主机域名地址改成docker compose容器名:hzero-admin

  # 配置中心地址
  uri: ${SPRING_CLOUD_CONFIG_URI:http://hzero-admin:8060/hadm/config}
去掉:
preferred-networks[0]: ${PREFERRED_IP}
增加
ignored-interfaces:
– lo
– docker0
– veth.*
3、复制Jar包构建脚本:4、构建适合Docker的Jar包
$ cp /d02/hzero/project/ps-register/build.sh /d02/hzero-aipaas/project/ps-aip-server/
$ cd /d02/hzero-aipaas/project/ps-aip-server/
$ bash build.sh
二、目标环境:
环境:WSL:Ubuntu-22.04系统
5、建立hzero-aipserver-docker目录
$ cd /d01/hzero-dockers
$ mkdir hzero-aipserver-docker
6、拷贝Jar包到目标环境

在windows powershell 中执行

$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero-aipaas\project\ps-aip-server\target\ps-aip-server.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-aipserver-docker\
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\project\ps-license\licenseAgent\license-agent112a.jar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-aipserver-docker\
7、编辑Dockerfile
$ cd /d01/hzero-dockers/hzero-aipserver-docker

$ vi Dockerfile

FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:17
COPY ps-aip-server.jar /ps-aip-server.jar
COPY license-agent112a.jar /license-agent112a.jar
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8 -Duser.language=zh -Duser.region=zh_CN -Duser.country=zh_CN

ENTRYPOINT exec java -XX:+UnlockExperimentalVMOptions $JAVA_OPTS $REFLEC_OPTS $AGENT $SKYWALKING_OPTS -jar /ps-aip-server.jar

8、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-aip-server:
image: hzero-aip-server-jk-demo:1.12
container_name: hzero-aip-server
ports:
– “8270:8270”
– “8271:8271”
environment:
– JAVA_OPTS=-Xms500m -Xmx2000m -Dspring.profiles.active=dev
– AGENT=-javaagent:/license-agent112a.jar
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 3000m # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
networks:
default:
name: hzero-demo

external: true

9、构建Docker镜像
$ cd /d01/hzero-dockers/hzero-aipserver-docker
$ docker build -t hzero-aip-server-jk-demo:1.12 .
构建成功:
$ docker images | grep aip-server
10、测试Docker镜像
测试之前先确保 redis-docker 和 mysql-docker,hzero-register , hzero-admin 容器已经启动:
$ cd /d01/hzero-dockers/hzero-aipserver-docker
$ docker compose up -d
看日志:docker logs hzero-aip-server,OK的
看注册中心,在注册中心可以看到aip已成功注册。

==================================================

29、启动docker compose 容器 Python沙箱 hzero-hype

二、目标环境:
环境:WSL:Ubuntu-22.04系统
1、建立hzero-hype目录
$ cd /d01/hzero-dockers
$ mkdir hzero-hype-docker
$ cd /d01/hzero-dockers/hzero-hype-docker
2、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-hype:
container_name: hzero-hype
image: registry.hand-china.com/hzero-public/haip-python-executor:0.2
privileged: true
environment:
WORKERNUM: 8
TIMEOUT: 800
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 500m # 容器最大内存(python应用直接限制内存大小)
ports:
– “10080:80”
networks:
default:
name: hzero-demo

external: true

3、测试Docker 容器
$ cd /d01/hzero-dockers/hzero-hype-docker
$ docker compose up -d
出错了:
[+] Running 1/1
✘ hzero-hype Error failed to resolve reference “registry.hand-china.com/hzero-public/haip-python-executor:0.2”: failed to do reques… 5.1s
Error response from daemon: failed to resolve reference “registry.hand-china.com/hzero-public/haip-python-executor:0.2”: failed to do request: Head “https://registry.hand-china.com/v2/hzero-public/haip-python-executor/manifests/0.2”: EOF
看起来是无法从库里面拉取了。
不过我之前拉取过,可以从ubuntu-22.04-hzero的docker镜像库中导出来,在到这边导进来。
在ubuntu-22.04-hzero环境:
$ cd /d03/dockerimagesbak
$ docker images 看下镜像列表

格式:docker save -o 导出文件名 镜像名:标签

$ docker save -o haip-python-executor-0.2.tar registry.hand-china.com/hzero-public/haip-python-executor:0.2
拷贝 这个haip-python-executor-0.2.tar 到ubuntu-22.04 /d01/hzero-dockers/hzero-hype目录下
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d03\dockerimagesbak\haip-python-executor-0.2.tar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-hype-docker\
进入Ubuntu-22.04\d01\hzero-dockers\hzero-hype-docker\ ,导入镜像

格式:docker load -i 镜像文件.tar

$ docker load -i haip-python-executor-0.2.tar
导入成功:Loaded image: registry.hand-china.com/hzero-public/haip-python-executor:0.2
再次启动:docker compose up -d
看日志:docker logs hzero-hype
启动成功

==================================================

30、启动docker compose 容器 文档切片服务 hzero-hkms

二、目标环境:
环境:WSL:Ubuntu-22.04系统
1、建立hzero-hkms目录
$ cd /d01/hzero-dockers
$ mkdir hzero-hkms-docker
$ cd /d01/hzero-dockers/volumes
$ mkdir hkms

windows powershell 中执行:原有数据迁移

$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero-aipaas\hzero-aigc-docker-compose\hkms\nginx.conf \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\volumes\hkms\
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero-aipaas\hzero-aigc-docker-compose\hkms\app.log \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\volumes\hkms\
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero-aipaas\hzero-aigc-docker-compose\hkms\logs \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\volumes\hkms\

设置 hkms 数据目录的所有者为 UID=1000 的用户

$ cd /d01/hzero-dockers/hzero-hkms-docker
$ sudo chown -R 33:33 ../volumes/hkms
$ sudo chmod -R 755 ../volumes/hkms
$ cd /d01/hzero-dockers/hzero-hkms-docker
2、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
hzero-hkms:
container_name: hzero-hkms
image: registry.hand-china.com/hzero-public/hkms-python:1.6.1
# command: sh -c “apt-get update && apt-get install -y iputils-ping
environment:
# HKMS服务进程数量
WORKERNUM: 16
OPENAI_PROXY: “”
# MongoDB地址
MONGO_CONN: mongodb://hzer:hzero@mongo-hzero:27017/hgpt?authSource=admin&authMechanism=SCRAM-SHA-1
# APP URL
HAIP_HOST: http://hzero-aip-app:8088
# 网关地址
FILE_SERVICE_HOST: http://hzero-gateway:8080
# 调用soffice转换文件类型(doc、ppt)时的超时时间,单位:秒。
EMBED_CONVERT_TIME: “120”
# 同步文档向量时,如果文档总长度超过该值(按token计)会中止,不进行向量计算。单位:万token
EMBED_MAX_TEXT_LENGTH: “300”
# 当普通文本中包含源代码块(Markdown格式)时,源代码不参与文本切片时的切片大小计算。但是当源代码块长度超过这个参数设定的值(字符数)时,会进行片段分割(在源代码块前或后,会保持源代码块的完整)。单位:字符。
SRC_BLK_THRESHOLD: “4000”
# 当单个代码块的长度超过此上限时,截断超过部分。单位:字符。
SRC_BLK_THRESHOLD_UPPER: “50000”
# 从向量库、ElasticSearch检索时返回的最大结果数。
EMBED_QUERY_LIMIT_CHUNK: “30”
# 开启debug日志
LOG_CONFIG_FILE: ./bin/log_debug.conf
# 代码插件配置
#ENABLE_CODE_SYNC: “no”
#ASYNC_RDB_URL: “mysql+aiomysql://${MYSQL_USERNAME}:${MYSQL_PASSWORD}@${MYSQL_URL}/hzero_aip”
#RDB_URL: “mysql+pymysql://${MYSQL_USERNAME}:${MYSQL_PASSWORD}@${MYSQL_URL}/hzero_aip”
#CODESYNC_ASYNC_MODE: “no”
# 异步处理配置
#ENABLE_CELERY: “no”
#CELERY_BROKER: “redis://:${REDIS_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}/14”
#CELERY_BACKEND: “redis://:${REDIS_PASSWORD}@${REDIS_HOST}:${REDIS_PORT}/14”
#CELERY_LOG_LEVEL: “DEBUG”
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 3.5g # 容器最大内存(python应用直接限制内存)
volumes:
– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/hkms/nginx.conf:/etc/nginx/sites-available/default
– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/hkms/app.log:/root/hkms/bin/app.log
– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/hkms/logs:/root/hkms/logs
ports:
– “18080:80”
networks:
default:
name: hzero-demo

external: true

3、测试Docker 容器
$ cd /d01/hzero-dockers/hzero-hkms-docker
$ docker compose up -d
出错了:
[+] Running 1/1
✘ hzero-hkms Error failed to resolve reference “registry.hand-china.com/hzero-public/hkms-python:1.6.1”: failed to do request: Head… 5.5s
Error response from daemon: failed to resolve reference “registry.hand-china.com/hzero-public/hkms-python:1.6.1”: failed to do request: Head “https://registry.hand-china.com/v2/hzero-public/hkms-python/manifests/1.6.1”: EOF
分析:
看起来是无法从库里面拉取了。
不过我之前拉取过,可以从ubuntu-22.04-hzero的docker镜像库中导出来,在到这边导进来。
执行:
在ubuntu-22.04-hzero环境:
$ cd /d03/dockerimagesbak
$ docker images 看下镜像列表

格式:docker save -o 导出文件名 镜像名:标签

$ docker save -o hkms-python-1.6.1.tar registry.hand-china.com/hzero-public/hkms-python:1.6.1
拷贝 这个hkms-python-1.6.1.tar 到ubuntu-22.04 /d01/hzero-dockers/hzero-hkms-docker目录下
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d03\dockerimagesbak\hkms-python-1.6.1.tar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\hzero-hkms-docker\
进入Ubuntu-22.04\d01\hzero-dockers\hzero-hkms-docker\ ,导入镜像

格式:docker load -i 镜像文件.tar

$ docker load -i hkms-python-1.6.1.tar
导入成功:Loaded image: registry.hand-china.com/hzero-public/hkms-python:1.6.1
再次启动:docker compose up -d
看日志:docker logs hzero-hkms
正常启动了

==================================================

31、启动docker compose 容器 图数据库 neo4j

二、目标环境:
环境:WSL:Ubuntu-22.04系统
1、建立neo4j-docker目录
$ cd /d01/hzero-dockers
$ mkdir neo4j-docker

windows powershell 中执行:原有数据迁移

$ cp -r \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero-aipaas\hzero-aigc-docker-compose\neo4j\volumes\neo4j \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\volumes\
$ cd /d01/hzero-dockers/neo4j-docker
2、编辑docker-compose.yml

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
neo4j-hzero:
image: registry.hand-china.com/hzero-public/neo4j:5.16.0
container_name: neo4j-hzero
ports:
– “7474:7474”
– “7687:7687”
environment:
– NEO4J_apoc_export_file_enabled=true
– NEO4J_apoc_import_file_enabled=true
– NEO4J_apoc_import_file_use__neo4j__config=true
– NEO4J_PLUGINS=[“apoc”]
– NEO4J_AUTH=neo4j/password
– ES_JAVA_OPTS=-Xms500m -Xmx500m # 设置 JVM 堆内存为 500M
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 1g # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
volumes:
– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/neo4j/data:/data
– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/neo4j/plugins:/plugins
networks:
default:
name: hzero-demo

external: true

3、测试Docker 容器
$ cd /d01/hzero-dockers/neo4j-docker
$ docker compose up -d
出错了:
[+] Running 1/1
✘ neo4j-hzero Error failed to resolve reference “registry.hand-china.com/hzero-public/neo4j:5.16.0”: failed to do request: Head “h… 5.2s
Error response from daemon: failed to resolve reference “registry.hand-china.com/hzero-public/neo4j:5.16.0”: failed to do request: Head “https://registry.hand-china.com/v2/hzero-public/neo4j/manifests/5.16.0”: EOF
分析:
看起来是无法从库里面拉取了。
不过我之前拉取过,可以从ubuntu-22.04-hzero的docker镜像库中导出来,在到这边导进来。
执行:
在ubuntu-22.04-hzero环境:
$ cd /d03/dockerimagesbak
$ docker images 看下镜像列表

格式:docker save -o 导出文件名 镜像名:标签

$ docker save -o neo4j-5.16.0.tar registry.hand-china.com/hzero-public/neo4j:5.16.0
拷贝 这个neo4j-5.16.0.tar 到ubuntu-22.04 /d01/hzero-dockers/neo4j-docker目录下
$ cp \wsl.localhost\Ubuntu-22.04-hzero\d03\dockerimagesbak\neo4j-5.16.0.tar \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\neo4j-docker\
进入Ubuntu-22.04\d01\hzero-dockers\neo4j-docker\ ,导入镜像

格式:docker load -i 镜像文件.tar

$ docker load -i neo4j-5.16.0.tar
导入成功:Loaded image: registry.hand-china.com/hzero-public/neo4j:5.16.0
再次启动:docker compose up -d
看日志:docker logs neo4j-hzero
正常启动了

==================================================

32、启动docker 容器 web服务器 nginx

二、目标环境:
环境:WSL:Ubuntu-22.04系统
1、建立nginx-docker目录
$ cd /d01/hzero-dockers
$ mkdir nginx-docker
$ cd /d01/hzero-dockers/volumes
$ mkdir nginx
$ cd /d01/hzero-dockers/volumes/nginx

windows powershell:复制前端文件 和nginx配置文件

$ cp -r \wsl.localhost\Ubuntu-22.04-hzero\d02\hzero\front\dist \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\volumes\nginx\
$ cp \wsl.localhost\Ubuntu-22.04-hzero\etc\nginx\sites-available\default \wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\volumes\nginx\nginx.conf
编辑\wsl.localhost\Ubuntu-22.04\d01\hzero-dockers\volumes\nginx\nginx.conf
把root目录改成指向 /usr/share/nginx/html
root /usr/share/nginx/html;
location ^~ /mobile-provider {
root /usr/share/nginx/html/packages;

aigc.hzero.com.cn 专用服务器

    # 改为后端服务实际IP:端口
    proxy_pass http://hzero-aip-app:8088;  # 示例:假设后端在本机8088

把433端口的服务Serve配置全部去掉
2、编辑docker-compose.yml
$ cd /d01/hzero-dockers/nginx-docker

$ vi docker-compose.yml

services:
nginx-hzero:
image: nginx:latest
container_name: nginx-hzero
restart: always
ports:
– “80:80”
volumes:
– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/nginx/dist:/usr/share/nginx/html
– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
networks:
default:
name: hzero-demo

external: true

3、测试Docker 容器
$ cd /d01/hzero-dockers/nginx-docker
$ docker compose up -d
$ docker logs nginx-hzero
成功启动
4、测试页面
输入 http://dev.hzero.com.cn
出来首页,但马上报错
http://hzero-gateway:8080/oauth/login
分析:因为容器中 网关地址用了容器名,但现在是在外面,所以解析不到;
解决方案:
在hosts文件中把hzero-gateway 的解析加上
172.18.14.48 hzero-gateway # API网关地址
加上之后可以正常访问 admin/Admin@123!

==================================================

33、启动docker compose 容器 onlyoffice

二、目标环境:
环境:WSL:Ubuntu-22.04系统
1、建立onlyoffice-docker目录
$ cd /d01/hzero-dockers
$ mkdir onlyoffice-docker

建立onlyoffce的volumes目录

$ cd /d01/hzero-dockers/volumes
$ mkdir -p onlyoffice/DocumentServer/{logs,data,lib,db}
$ sudo chown -R 998:998 onlyoffice/DocumentServer
$ sudo chmod -R 755 onlyoffice/DocumentServer
$ sudo chown -R 999:999 onlyoffice/DocumentServer/db
$ sudo chmod -R 755 onlyoffice/DocumentServer/db
2、编辑docker-compose.yml
$cd /d01/hzero-dockers/ onlyoffice-docker

$ vi docker-compose.yml

要求Docker/Docker CE >= 19.x

services:
onlyoffice-hzero:
image: onlyoffice/documentserver
container_name: onlyoffice-hzero
ports:
– “8800:80”
environment:
– JWT_SECRET=your-secret-key # 建议添加JWT密钥(可选但推荐)
– TZ=Asia/Shanghai # 设置时区
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 2g # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)
volumes:
– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/onlyoffice/DocumentServer/logs:/var/log/onlyoffice
– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/onlyoffice/DocumentServer/data:/var/www/onlyoffice/Data
– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/onlyoffice/DocumentServer/lib:/var/lib/onlyoffice
– ${DOCKER_VOLUME_DIRECTORY:-../volumes}/onlyoffice/DocumentServer/db:/var/lib/postgresql
networks:
default:
name: hzero-demo

external: true

3、测试Docker 容器
$ cd /d01/hzero-dockers/onlyoffice-docker
$ docker compose up -d
看日志:docker logs onlyoffice-hzero
正常启动了

HZERO PaaS平台demo升级笔记

本文是H-ZERO 升级笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心 的 各产品技术文档进行升级实践。

实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04

=============================================

2026-02-13 升级HZERO 飞搭 低代码 服务的后端版本 从2.10.0-1.12.RELEASE 升级到 2.10.2-1.12.BETA.2

升级原因:解决“AI生成低代码业务对象和页面” 这个功能中,当卡片询问业务对象的处理方式,选择修改时,报field type不能为空的错误问题。
1、无
2、hzero-lowcode 和hzero-modeler 服务的pom文件 把版本改成 2.10.2-1.12.BETA.2, parent的POM 版本也要升到2.10.2-1.12.BETA.2
然后重新运行bash run.sh
3、无
测试:
未实现预期效果,产研说要继续查问题。
2026-02-28 ,hzero-modeler 服务升级到 2.10.2-1.12.BETA.3
再测试:问题依旧,产研说继续查问题。
2026-03-03,hzero-modeler 服务升级到 2.10.2-1.12.BETA.4
再测试:这次OK了
2026-03-09,因为删除业务对象时因为redis中缺少响应的键值报错,产研说把hzero-lowcode同步升级到版本一致,也即2.10.2-1.12.BETA.4,实测解决了问题。

=============================================

2026-02-11 升级HZERO hzero-aip-server 和hzero-aip-app 到1.6.1.ALPHA.6.13

升级原因:主要是解决跑通Agent:AI生成业务对象和页面 过程中遇到的各种问题
1、无
2、hzero-aip-app 和hzero-aip-server 服务的pom文件 把版本改成 1.6.1.ALPHA.6.13 然后重新运行bash run.sh
3、测试 简易智能体编排中autoagent节点执行错误
2026-03-08 升级hzero-aip-app服务到 1.6.1.ALPHA.7.1,解决了简易智能体编排中autoagent节点执行错误问题。

=============================================

2026-01-29 升级HZERO AI 服务的前端和前端卡片版本

升级原因:解决Agent编排中用到的卡片预览和显示问题
1、无
2、无
3、升级前端组件:
目标版本:
    “hzero-front-haip”: “1.6.1-alpha.6.1”,
    “hzero-front-haip-card”:”1.6.1-alpha.3″,
成功升级完成。

=============================================

2026-01-28 升级HZERO 工作流 从1.20.0-1.12.RELEASE 到 1.20.1-1.12.RELEASE

升级原因:解决流程平台编辑流程后模拟运行时因为时区设置差异导致 不能立即执行的问题。
1、升级种子数据
再次下载:hwkf-resource-1.20-1.12.RELEASE.zip(产研说因为这个修复版加上了咸亨的部分需求,与数据库字段变更,所以要跑下种子数据:表结构和种子数据)
解压后启动脚本,启动完成后 ,在界面上 执行 1和3 成功完成。
2、升级后端服务
hzero-workflow@1.20.1-1.12.RELEASE
更新POM,然后重新bash run.sh 服务启动正常。
3、升级前端组件
hzero-front-hwkf@1.20.2-beta.1
hzero-front-hwkf-mobile@1.20.1-beta.8
更新package.json
yarn
Done in 45.28s.
yarn run build:ms hzero-front-hwkf,hzero-front-hwkf-mobile
Done in 223.22s
完成后执行部署:
$ bash apply_update_to_runtime_env.sh

=============================================

2026-01-21 升级HZERO 集成平台 从1.8.2.RELEASE 到 1.9.1.RELEASE

升级原因:获取1.9.1.RELEASE 版本的 新特性
1、升级种子数据
拉取代码,切换到1.9.RELEASE分支。仓库地址:https://code.choerodon.com.cn/hzero-hitg/jipaas-resource, 下拉, download sorce code 选择zip
拷贝到:\d02\hzero-ipaas\resource-package
$ unzip jipaas-resource-1.9.RELEASE.zip
启动mysql
$ systemctl start mysql
修改 \d02\hzero-ipaas\resource-package\jipaas-resource-1.9.RELEASE 中的application.yml
username: ${SPRING_DATASOURCE_USERNAME:hzero}
password: ${SPRING_DATASOURCE_PASSWORD:hzero}
运行database-init.sh
$ bash database-init.sh
启动完成后访问:http://dev.hzero.com.cn:8099/
进入页面发现是空白的,查启动服务出现错误:
java.io.FileNotFoundException: ../jipaas-resource/docs/mapping/service-mapping.xml (No such file or directory)
但application.yml的配置中地址是对的。
错误出现在database-init.sh中,其中命令中带了错误的配置文件地址的参数:
java -Dhzero.data.mappingFile=../jipaas-resource/docs/mapping/service-mapping.xml -jar hzero-tool-data-install-1.3.17.jar
解决方法,启动命令中去掉配置文件地址参数,使用application.yml中的默认值。
改成:java -Dfile.encoding=utf-8 -jar hzero-tool-data-install-1.3.17.jar
数据初始化页面显示正常。

但是确定要升级吗?
经过跟王凡沟通,暂时先不升了。等稳定一段时间再说。

=============================================

2025-11-25 升级HZERO AI平台 从1.6.1.ALPHA.1.4 到 1.6.1.ALPHA.4

升级目标版本:
hzero-aip-server 1.6.1.ALPHA.4
hzero-aip-app 1.6.1.ALPHA.4
hzero-front-haip 1.6.1-alpha.4
当前版本:
hzero-aip-server 1.6.1.ALPHA.1.3
hzero-aip-app 1.6.1.ALPHA.1.3
hzero-front-haip 1.6.1-alpha.3

升级原因:在准备制作hzero-aip-app服务的docker镜像,需要更改yml之后重新构建jar,但maven构建失败,失败原因是有个火山引擎的依赖包在库里面没有了,无法成功构建原版本,产研建议构建新的版本。
本次升级不涉及修数据,也不涉及AI用到的几个Docker容器升级。

1、升级种子数据
不涉及
2、升级后端服务
hzero-aip-app 和 hzero-aip-server 的POM文件中,版本号从1.6.1.ALPHA.1.3 改成1.6.1.ALPHA.4,然后重新构建。
cd /d02/hzero-aipaas/project/ps-aip-app
bash build.sh
cd /d02/hzero-aipaas/project/ps-aip-server
bash build.sh
构建成功
3 升级前端组件
cd /d02/hzero/front/front
cp package.json package.json.bak20251125
#把package.json中
“hzero-front-haip”: “1.6.1-alpha.3”, 改成 “hzero-front-haip”: “1.6.1-alpha.4”,
改完保存,执行yarn
Done in 27.05s.
然后运行 yarn run build:ms hzero-front-haip
Done in 333.37s
然后运行 bash apply_update_to_runtime_env.sh 拷贝打包文件到目标目录并执行字符串替换
replace complete!

=============================================

2025-09-26 升级HZERO底座从1.12.1.RELEASE 到 1.12.2.RELEASE

参考:开放平台/社区与合作伙伴/文档中心/HZERO指导手册/更新日志/v1.12版本更新/v1.12.2版本更新
主要目的:使用新的轻透主题(类SAP新风格)

1、升级种子数据
下载:https://hsop-hsop.su.bcebos.com/hsop/video/3/HSOP-BAIDU/9c098138b6bd49eba7775fb60bfa737a@hzero-resource_1.12_%E6%B8%85%E9%80%8F%E4%B8%BB%E9%A2%98.zip
执行:bash database-init.sh
报错:database-init.sh: line 15: syntax error: unexpected end of file
解决:dos2unix database-init.sh,再执行
执行 1、更新数据库 3、导入数据 成功完成

2、升级后端服务
把以下目录中POM.xml文件中的版本都从1.12.1.RELEASE替换成1.12.2.RELEASE
/d02/hzero/project
/d02/hzero/project/ps-admin/
/d02/hzero/project/ps-alert/
/d02/hzero/project/ps-file/
/d02/hzero/project/ps-gateway/
/d02/hzero/project/ps-iam-saas/
/d02/hzero/project/ps-import/
/d02/hzero/project/ps-interface/
/d02/hzero/project/ps-license/
/d02/hzero/project/ps-message/
/d02/hzero/project/ps-oauth/
/d02/hzero/project/ps-platform/
/d02/hzero/project/ps-register/
/d02/hzero/project/ps-report/
/d02/hzero/project/ps-scheduler/
/d02/hzero/project/ps-swagger/
构建并启动服务:
bash start_all.sh 所有服务 全部构建成功,启动成功;

3、升级前端组件
文档中前端版本要求:
底座 hzero-front 版本为 1.12.3-beta-international.0
主题模块 @hzero-front-ui/cfg 版本为 4.1.7
组件库 choerodon-ui 版本为 1.6.7
IAM模块 hzero-front-hiam 版本为 1.12.2
检查:
当前的 “hzero-front” : “~1.12.4-alpha.11”, 版本高于文档要求。(后来发现这实际上是个坑,以为根据版本号表面看符合要求,实际不符合,后面有详细说明)
当前 \d02\hzero\front\front\node_modules\hzero-front-ued\package.json 中 dependencies: @hzero-front-ui/cfg”: “4.1.7-alpha.9” 版本符合文档要求
当前\d02\hzero\front\front\node_modules\choerodon-ui\package.json 中显示 version”: “1.6.6”, 低于文档要求
当前 hzero-front-hiam 版本是1.12.1 低于文档要求。
在front目录下的package.json中 更新如下组件:
“hzero-front-hwkf” : “~1.20.0”,
“hzero-front-hpfm” : “~1.12.2”,
“hzero-front-hres” : “~1.12.2”,
“hzero-front-hiam” : “~1.12.2”,
“hzero-front-hmsg” : “~1.12.2”,
“hzero-front-hmnt” : “~1.12.2”,
“hzero-front-hocr” : “~1.12.2”,
“hzero-front-cusz” : “~1.3.1”,
“hzero-front-hfile” : “~1.12.2”,
“hzero-front-himp” : “~1.12.2”,
“hzero-front-hims” : “~1.12.2”,
“hzero-front-hsdr” : “~1.12.2”,
“hzero-front-hsrh” : “~1.12.2”,
“hzero-front-hkms” : “~1.12.2”,
“hzero-front-hitf” : “~1.12.2”,
“hzero-front-hgat” : “~1.12.0”,
“hzero-front-hadm” : “~1.12.2”,
“hzero-front-hevt” : “~1.12.2”,
“hzero-front-hrpt” : “~1.12.2”,
“hzero-front-hprt” : “~1.12.2”,
修改保存后,运行 yarn
Done in 37.36s
然后运行 yarn run build:ms hzero-front-hwkf,hzero-front-hpfm,hzero-front-hres,hzero-front-hiam,hzero-front-hmsg,hzero-front-hmnt,hzero-front-hocr,hzero-front-cusz,hzero-front-hfile,hzero-front-himp,hzero-front-hims,hzero-front-hsdr,hzero-front-hsrh,hzero-front-hkms,hzero-front-hitf,hzero-front-hgat,hzero-front-hadm,hzero-front-hevt,hzero-front-hrpt,hzero-front-hprt
Done in 1208.15s. 成功完成。
然后运行 bash apply_update_to_runtime_env.sh 拷贝打包文件到目标目录并执行字符串替换
然后启动服务:
cd /d02
bash service-lowcode-start-all.sh
在 开发管理->系统工具刷新值集缓存后使用。

4、验证
问题1、在主题选择界面,新的轻透主题可以选择,不过轻透主题的图标裂了,应用主题后,选择控制台就白屏了。
分析:
查nexus库:
hzero-front-1.12.3-beta-international.0.tgz Mon Sep 22 06:59:56 Z 2025 10402507
hzero-front-1.12.4-alpha.11.tgz Mon Jun 16 01:24:14 Z 2025 11503602
我们发现 ,hzero-front-1.12.3-beta-international.0是9月22日发布的,而hzero-front-1.12.4-alpha.11是6月16日发布的。所以这是一个迷惑人的地方,应该是这个原因。
解决方案:
把hzero-front 从hzero-front-1.12.4-alpha.11 更新到 hzero-front-1.12.3-beta-international.0
package.json 中更改为:
“hzero-front” : “1.12.3-beta-international.0”,
保存后执行:
yarn
Done in 30.75s
yarn run build:ms hzero-front
Done in 120.03s.
然后运行 bash apply_update_to_runtime_env.sh 拷贝打包文件到目标目录并执行字符串替换
再次验证:问题依旧
备注:yarn之后在node_mudule目录下hzero-front目录下的package.json 中看不到对choerodon-ui的依赖关系,但在编译后的dist目录下的hzero-front目录下的package.json 中可以看到:
“choerodon-ui”: {
“version”: “1.6.6”
choerodon-ui的升级文档:https://open.hand-china.com/choerodon-ui/zh/docs/other/version-upgrade
yarn list choerodon-ui
└─ choerodon-ui@1.6.6
说明最终编译后的hzero-front使用的choerodon-ui的版本没有达到文档要求,这个问题怎么解决?
查豆包,说要执行 yarn add choerodon-ui@1.6.7 -W 进行升级
执行后报错:error Invariant Violation: expected workspace package to exist for “choerodon-ui”
查 豆包说是 原来的package.json中强制了choerdon-ui的版本:
“resolutions”: {
“choerodon-ui”: “^1.6.6-alpha.25”, // 强制锁定版本,优先级高于 devDependencies 和安装命令
// 其他锁定…
}
要改package.json,于是就 把package.json 中改成:
“choerodon-ui” : “1.6.7”, 然后再次执行:
yarn add choerodon-ui@1.6.7 -W
Done in 31.07s. 成功了。
这条命令会自动更新根目录下package.json中的devDependencies下choerodon-ui版本 “choerodon-ui”: “1.6.7”, 但不会自动更新resolutions段落的choerodon-ui版本,所以两者不一致是会报错。 这条命令成功的效果跟手动同时更改package.json中的devDependencies下choerodon-ui版本和resolutions段落的choerodon-ui版本之后再执行yarn是一样的。
在node_module/choerodon-ui/package.json 中看到版本是1.6.7
问豆包,这个更新成功后,是否有重新编译其他模块,豆包说这个事核心模块,被很多子项目依赖,需要重新编译所有子项目
但我看dist目录下个子模块的package.json, 只有hzero-front中的package.json的lib用了choerodon-ui,其他子模块都是用了hzero-front,而没有直接用choerodon-ui, 所以我判断更新了 choerodon-ui之后只需要单独编译hzero-front即可。
尝试:
执行命令:
yarn run build:ms hzero-front
Done in 112.22s.
然后运行 bash apply_update_to_runtime_env.sh 拷贝打包文件到目标目录并执行字符串替换
重启服务,
再次验证:还是一样,问题依旧
打开dist/packages/hzero_front_hiam/package.json 看到其依赖的hzero-front还是原来版本
“hzero-front”: {
“version”: “1.12.4-alpha.18”
这说明其他子模块的前端还是要重新编译一把才行。另外文档要求@hzero-front-ui/cfg@4.1.7,但当前package.json未锁定版本
“peerDependencies”: {
“@hzero-front-ui/cfg”: “*”,
所以先锁定要求的版本
yarn add @hzero-front-ui/cfg@4.1.7 -W # -W 适用于monorepo根目录安装
Done in 22.01s.
再在resolutions中锁定版本: “resolutions”: {
// 其他已有配置…
“@hzero-front-ui/cfg”: “4.1.7” // 新增此行,锁定版本
}
执行 yarn install 生效配置,并验证版本:yarn list @hzero-front-ui/cfg
└─ @hzero-front-ui/cfg@4.1.7
Done in 0.48s.
然后再重新编译所有子模块:
yarn
yarn run build:ms-all
Done in 1343.68s.
再次打开dist/packages/hzero_front_hiam/package.json 看到其依赖的hzero-front已经是新版本:
“hzero-front”: {
“version”: “1.12.3-beta-international.0”
},
然后运行 bash apply_update_to_runtime_env.sh 拷贝打包文件到目标目录并执行字符串替换
重启服务,
再次验证:问题依旧
联系前端组,帮忙分析后发现是父模块没有编译导致的,于是单独编译父模块:
yarn run build:app
然后运行 bash apply_update_to_runtime_env.sh 拷贝打包文件到目标目录并执行字符串替换
重启服务,
再次验证: 成功了,可以正常使用轻透主题了。
问题解决。

总结:建议hzero 1.12.2 升级文档能改进, 并给出更加具体的给出实操步骤,可避免类似上面的摸索过程,节省时间,具体包括:
1、升级种子数据的database-init.sh 在打包前就把windos格式转成liunx格式(当前文档中是windows格式,执行会报错)。
2、明确提示:hzero-front的 版本 1.12.3-beta-international.0 比 1.12.4-alpha.11 更新,不要被版本号误导。
3、重点提醒主题模块 @hzero-front-ui/cfg 版本为 4.1.7 和 组件库 choerodon-ui 版本为 1.6.7 的要求 可以用以下命令实现(前端不熟悉的人并不知道如何实现文档的要求):
yarn add @hzero-front-ui/cfg@4.1.7 -W # -W 适用于monorepo根目录安装
yarn add choerodon-ui@1.6.7 -W #若遇冲突,需要把著工程目录下的package.json 中resolutions 段的choerodon-ui版本改成跟1.6.7一致。
4、重点提醒前端工程主目录下的package.json更改之后,升级涉及的子模块都编译之后,务必记住不要忘了编译父模块 (否则会导致轻投主题图标丢失和 进入控制台白屏 ,无法实际使用轻透主题)
#编译子模块
yarn run build:ms 子模块名1,子模块名2,……
#编译父模块
yarn run build:app

问题2: AIGC平台/模型对接配置/模型测试 出错:点测试没反应

前端检查错误是:
请求URL http://dev.hzero.com.cn/v1/open/chat/common
请求方法:POST
状态代码:405 Not Allowed
分析:
这个问题是升级HZERO 1.12.2之后出现的,之前AIGC平台单独升级测试过没有问题,是升级底座和主题导致了AIGC平台的问题。
控制台输入 env ,输出有问题:AIGC_HOST是空的,正常应该是 http://aigc.hzero.com.cn
{
“AIGC_HOST”: “”,
“API_HOST”: “http://localhost:8080”,
“WEBSOCKET_HOST”: “http://localhost:8080/hpfm/sock-js”,
“WEBSOCKET_URL”: “http://localhost:8080/hpfm/sock-js”,
“HZERO_FILE”: “http://localhost:8080/hfle”,
“AUTH_HOST”: “http://localhost:8080/oauth”,
“LOGIN_URL”: “http://localhost:8080/oauth/oauth/authorize?response_type=token&client_id=localhost”,
“LOGOUT_URL”: “http://localhost:8080/oauth/logout”,
“AUTH_SELF_URL”: “http://localhost:8080/iam/hzero/v1/users/self”,
“PORTAL_AUTH_SELF_URL”: “http://localhost:8080/iam/hzero/v1/users/portal-self”,
}
看了下生成的DIST目录下的index.html 发现里面的变量直接就是:
env[“AIGC_HOST”] = “”;
env[“API_HOST”] = “http://localhost:8080”;
env[“WEBSOCKET_HOST”] = “http://localhost:8080/hpfm/sock-js”;
env[“PLATFORM_VERSION”] = “saas”;
env[“CLIENT_ID”] = “localhost”;
env[“BASE_PATH”] = “/”;
env[“PUBLIC_URL”] = “/”;
没有需要被替换的 BUILD_变量名
看起来,工程编译目标dist目录下的index.html 中的环境变量定义是直接来自 \d02\hzero\front\front\config\config.ts的:
config.ts内容:
// 配置环境变量
define: {
‘process.env’: {
AIGC_HOST:”,
API_HOST: ‘http://localhost:8080’,
WEBSOCKET_HOST: ‘http://localhost:8080/hpfm/sock-js’,
PLATFORM_VERSION: ‘saas’,
CLIENT_ID: ‘localhost’,
},
},
所以config.ts 内容不对,导致编译后的index.html不存在 BUILD_API_HOST,BUILD_AIGC_HOST…
所以就尝试直接更改config.ts 中的环境变量,把这部分内容从config.prod.ts中拷贝过来,然后单独编译主模块,看看编译后的index.html 是否已经变化:
更改 config.ts内容:
// 配置环境变量
define: {
‘process.env’: {
PUBLIC_URL: ‘/BUILD_PUBLIC_URL/’,
BASE_PATH: ‘/BUILD_BASE_PATH/’,
API_HOST: ‘BUILD_API_HOST’,
AIGC_HOST:’BUILD_AIGC_HOST’,
PLATFORM_VERSION: ‘BUILD_PLATFORM_VERSION’,
WEBSOCKET_HOST: ‘BUILD_WEBSOCKET_HOST’,
CLIENT_ID: ‘BUILD_CLIENT_ID’,
ENV_NAME: ‘BUILD_ENV_NAME’,
BUILD_ENV_ID: ‘BUILD_BUILD_ENV_ID’,
PACKAGE_PUBLIC_URL: ‘BUILD_PACKAGE_PUBLIC_URL’,
},
},
更改后执行: yarn run build:app
Done in 8.97s.
按照前端组的说法,新版的替换范围很小了,基本只需要替换index.html中的内容,新的替换脚本在:
d02\hzero\front\front\docker\enterpoint.sh , 把这个脚本拷贝到 \d02\hzero\front\enterpoint_replace.sh , 然后根据自己的实际情况做了修改,用来替代原来的 run-front.sh
更改 \d02\hzero\front\front\apply_update_to_runtime_env.sh , 调用run-front.sh 改成 enterpoint_replace.sh
运行 bash apply_update_to_runtime_env.sh 拷贝打包文件到目标目录并执行字符串替换
重启 nginx
systemctl restart nginx
浏览器清缓存,重新登录访问:
浏览器/检查/控制台 看变量
env.AIGC_HOST :’http://aigc.hzero.com.cn’ 已经正确了。
再次点击:AIGC平台/模型对接配置/模型测试 ,已经正常了。
问题解决.

问题3:AIGC平台/企业应用库/应用主页/个人问答, 知识问答检索异常

测试:问:汉得AIGC平台会用到这个AIGC_HOST变量吗?
结果:知识问答检索异常,请联系管理员,模型请求产生未知异常,请稍后重试,异常信息为: [WebClientResponseException: 401 error, “Invalid token”]
分析:
查HKMS日志:docker logs hkms ,显示:
DEBUG Starting new HTTP connection (1): dev.hzero.com.cn:8088
DEBUG http://dev.hzero.com.cn:8088 “POST /v1/open/chat/kms HTTP/1.1” 200 None
(utils.py:26) PERFORMANCE (767039bb-a25e-46ac-94bd-cf94ee2f0e2d): LLM_TimeToFirstToken:: 0.982997 seconds
(execute_task.py:39) haip.error.model_request.unknown_exception – 模型请求产生未知异常,请稍后重试,异常信息为: [WebClientResponseException: 401 error, “Invalid token”]
看起来是KMS调用 HAIP服务的 /v1/open/chat/kms 出问题了
查 HAIP服务的日志,可以看到一段相关错误:
Error has been observed at the following site(s):
*__checkpoint ⇢ 401 UNAUTHORIZED from POST https://api.siliconflow.cn/v1/chat/completions [DefaultWebClient]
看起来是调用硅基流动的API引发的错误,但奇怪的是我默认配置的是火山方舟的,难道是“个人问答” 这个应用默认配置了硅基流动的对话模型? 不可能吧,拿我9月17日测试正常用的也是火山方舟的呀,根本没有配置过硅基流动的账号。
唉,不管了,我注册过硅基流动的,我有API KEY,先把那个系统默认的硅基流动账号的API给添加上去。结果还真好了。
但是“个人问答”的配置,我看不到,问了姜州,说正常应该在“企业应用库” 下面的卡片中看到“个人问答”,这个地方进去可以配置,但我的系统中没有,而且我新建应用后可以看到新增的卡片,但点击进去也是空白,没有配置界面。 姜州判断是前端问题。
看了下dist/package/hzero_front_haip/package.json ,依赖的 hzero-front版本还是之前的,并非最新的, 可能上次运行 yarn run build:ms-all 的时候,因为haip的版本正在项目根目录下package.json中没有改,所以没有依赖新的hzero-front重新编译:
“hzero-front”: {
“version”: “1.12.4-alpha.18”
执行动作 yarn run build:ms hzero-front-haip
再查看,就依赖到新版本了:
“hzero-front”: {
“version”: “1.12.3-beta-international.0”
},
然后运行 bash apply_update_to_runtime_env.sh 拷贝打包文件到目标目录并执行字符串替换
重启服务,
再次验证:更新后新增的卡片,但点击进去也是空白的问题解决了,已经可以看到配置界面了,不过”个人问答“的卡片还是没有。
后续继续查,是否数据问题。
我新建了两个应用 “我的简易智能体” 和 “我的HZERO运营知识库” ,然后去数据库查表里面的内容,在HAIP库下面看到haip_application开头的表,然后逐个看里面内容,发现了问题:
在haip_application_admin表中,我新建的应用是有的,但系统自带的“个人问答”没有在里面,结合界面上应用的 管理员配置界面可以知道,这张表是存储应用的管理员配置的。
所以解决方法就是:在这张表上插入两条记录,把“个人问答”的管理员用户和角色给配置上。具体往表里插入的内容只要参考我新建的应用数据即可。

  完成插入后刷新 ”企业应用库“ 界面,就可以看到”个人问答“这个应用了。 
  点击进入看其配置,问答处理模型配置的是:默认对话模型, 继续查 模型组合配置,默认对话模型账户组合中目前配置的账户确实是"硅基流动-DeepSeek-V3 .      

这就把问题原因对上了。
备注: 关于系统预定义的应用“个人问答”, 在企业应用库的卡片管理处看不到的问题,后来跟姜州沟通,说其实也不用那么麻烦要去数据库插记录, 可以把全局配置那的应用权限控制关掉就能看到了 ,试了一下确实可以。
问题解决。

问题4:在知识库问答结果文档引用切片的预览问题, 那些切片的Html源码可以看到,但预览报错 ”未定位到具体片段,已帮您打开来源文件“ ;
分析:
在文档管理的地方,切片预览是正常的,姜州说是前端问题,需要找前端看一下。
跟前端沟团队通后发现是调用的第三方工具库的一个bug:https://github.com/zyl-ui/vue-file-viewer, 正则表达式处理时把文件扩展名给匹配错了,云强是这个开源工具的贡献者,他说会去修复这个Bug,然后发给新版的hzero-front-haip过来(当前版本是”hzero-front-haip”: “1.6.1-alpha.1″)。
解决方案:
云强修复了bug, 发了一个修复版hzero-front-haip@1.6.1-alpha.2.3
执行:前端升级到这个版本,package.json中把hzero-front-haip版本改到1.6.1-alpha.2.3 修改保存后:
yarn
Done in 39.99s.
yarn run build:ms hzero-front-haip
Done in 446.39s.
bash apply_update_to_runtime_env.sh
replace complete!
再起AIGC平台服务,再次测试,这次可以正常预览切片了。
问题解决。

问题5:由于内存少,milvus向量库经常因为OOM原因被杀掉
分析:
个人使用的话,数据量不会很大,按照豆包的比较,数据量在千万级以下用ES就可以,大于亿才必须用milvus. 所以可以考虑使用ES作为默认向量库替代milvus, 这样就可以去掉milvus,节省内存。
解决方案:
1、AIGC 全局配置中,把知识库检索的向量库类型 从milvus改成 ElasticSearch
2、文档管理 把每个文档重新进行向量同步
3、停掉milvus服务
4、重启动aip-app 和 aip-server服务
测试:个人问答,问题:AIGC_HOST 这个变量的作用是?
回答的内容跟使用milvus向量库时几乎相同。
问题解决。

问题6:新建一个问答类应用:“我的HZERO运营知识库”,用火山方舟的DeepSeek V3模型作为对话模型,测试问题:“AIGC_HOST 这个变量的作用是?”结果回答的时英文,而且没有正确回答。
分析:
更改“我的HZERO运营知识库”问答处理模型为“默认对话模型”(硅基流动的DeepSeekV3),跟“个人问答”一致,结果回答还是英文,而且没有回答出来,看来不是模型账户原因。
更改“个人问答”问答模型为“Jack对话-Deep Seek-V3”(火山方舟的DeepSeekV3), 测试同样的问题,没有正确回答。 再把问答模型改回“默认对话模型”,这次坏了,回答是“信息不足,无法回答” 没有引用知识库内容,直接用大模型兜底了。也就是说配置跟原来一样,却回不到原来正确回答问题的状态了。
查HKMS的日志,docker logs hkms 发现HKMS服务检索到了切片,并且跟提示词一起构建了完整的上下文。所以这一步没有问题。 再查haip-app的服务日志发现问题“ : [知识问答] — [服务调用] — [请求为空]”向量数据库缓存更新,刷新内存数据:
[知识问答] — [服务调用] — [请求为空]
所以问题出在HAIP-APP服务。
重启HAIP-APP服务,再测,问题依旧。
问另一个问题“集星獭是什么?” ,结果没有回答出来,换一种问法“汉得的集成平台名称是什么?”,结果能正确回答“汉得的集成平台名称为 H-ZERO iPaaS集成平台”集星獭” ,这说明什么?
执行:
a、在AIGC平台/文档库管理/共享文档/hzero运营文档 下面添加各平台产品介绍的PDF文件并完成向量同步。
b、在AIGC平台/知识库定义/HZERO运营知识库/编辑/知识资源/HZERO运营知识库/资源详情/选择添加文档目录《hzero运营文档》,这样就把《HZERO运营知识库》和《hzero运营文档》目录关联起来了。
c、在AIGC平台/知识库定义/HZERO运营知识库/编辑 点击上面的【测试问答】按钮
d、在测试问答界面,展开左边的配置,检索模式选择向量检索+全文检索+问题索引,对话模型选择Jack对话-Deep Seek-V3,其他默认
e、测试问题“集星獭是什么?” 回答了太多跟零衍相关的信息,不准确。看其引用的文档来自于《零衍系统管理平台推广V1.3.pdf》和《汉得信息集成平台产品介绍1.7.0.PDF》, 配置中使用的相似度最高的片段数量设置是3,这三个片段中前2个来自 《零衍系统管理平台推广_V1.3.pdf》,后1个来自《汉得信息集成平台_产品介绍1.7.0.PDF》,显然由于片段数量设置太少,导致主要的信息来源文档中的片段被忽略了。
调整 “使用的相似度最高的片段数量” 参数为10 ,再次测试问题 “集星獭是什么?”,回答基本是答到点子上了。
说明在RAG应用中,知识库中的词义相关的但对目标问题针对性不强的知识越多,所造成的干扰越多,回答的问题越可能偏离度大。应遵循“少而精”的原则。
f、测试问题“AIGC_HOST这个变量的作用是什么?” 系统会给出英文回答。在测试“请问,AIGC_HOST这个变量的作用是什么?” 系统会给出中文回答。说明问题的开头语言决定了回答的语言。
问题解决。

问题7:文档库管理/共享文档/hzero运营文档/导入文档/文件 ,这里如果选择一个文件夹下的所有文档,假设有10个文档,这些文档会进来,切片,同步向量,刷新后发现这10个文件是同一个文件名。
这应该是个Bug;
实际查看某个文件的切片,发现文件名“移动技术平台-海马汇介绍-建投案例.pdf” 点进去看切片确实工作流的内容。看起来刚才导入的10个文件,内容是对的,文件名被处理错了。
如果选择导入目录,选择整个目录,是可以正确处理的。

问题8:AIGC平台/知识库定义/编辑/资源详情/ 具体文档目录 点击展开 , 会出现白屏。
分析:检查网络后端API返回正常, 是不是前端问题?
跟产研前端基础组沟通了下,他们分析后建议升级choerodon-ui 到1.6.8-alpha.1,我目前是choerodon-ui”: “1.6.7”的:
修改 package.json
升级依赖(devDependencies 和 resolutions两个地方都要改):
“choerodon-ui”: “1.6.8-alpha.1”,
保存后,yarn
Done in 22.52s
检查 node_modules/choerodon-ui/package.json ,确认是1.6.8-alpha.1版本;
然后删掉 dist/packages/hzero_front 文件夹
然后重新编译生成 dist/packages/hzero_front 文件夹就可以了
yarn run build:ms hzero-front
Done in 106.97s.
bash apply_update_to_runtime_env.sh
replace complete!
systemctl restart nginx
再起AIGC平台服务,浏览器清空缓存,再次登录测试,还是白屏。
前端组在对后端返回的jason数据做验证之后,配合检查知识库定义的代码后,发现是 表格记录的父子id有重复,导致的。
已经确认这是一个隐蔽的bug,需要修复,已经给对应的产品组同事反馈了,会调整 知识库定义的代码,这个是aigc应用的问题,不是很紧急,这里不能用也可以在文档库定义的地方查看,不用发紧急版本,产品组计划就随着常规节奏修复发版。
产品前端组发来了AI前端的修复版本:hzero-front-haip@1.6.1-alpha.3
修改packagejson ,更改 “hzero-front-haip”: “1.6.1-alpha.3” 保存
yarn
Done in 20.27s.
yarn run build:ms hzero-front-haip
Done in 304.34s.
bash apply_update_to_runtime_env.sh
启动服务,再测试,可以正常显示,没有出现白屏。
问题解决。

问题9:在“HZERO运营知识库”的【测试问答】界面, 选择jack-对话-deepseek-r1 作为对话模型,问问题“集星獭是什么?” 时出现错误“知识问答检索超时,请稍后重试”
分析
docker logs hkms 显示知识切片+提示词 组合上下文正常,调用aip-app服务 http://dev.hzero.com.cn:8088 “POST /v1/open/chat/kms HTTP/1.1” 200 700 返回 LLM_ResponseTime:: 33.828149 seconds
查aip-app服务日志 显示错误 io.choerodon.core.exception.CommonException: haip.warn.kms.node.timeout

[hzero-aip-app] [ kms-flux-14] o.h.a.k.d.e.ExecutorWrapperWithFlux : [知识问答] — [执行错误] — [错误信息] : 知识问答检索超时,请稍后重试
查aip-app服务的yml中关于检索超时的配置:
knowledge:
# 超时配置
timeout:
# Q&A检索超时
qa: ${HZERO_KNOWLEDGE_TIMEOUT_QA:120s}
# 图谱检索超时
kg: ${HZERO_KNOWLEDGE_TIMEOUT_KG:120s}
# 文档检索超时
doc: ${HZERO_KNOWLEDGE_TIMEOUT_DOC:300s}
# 文档图谱组合检索超时
doc_kg: ${HZERO_KNOWLEDGE_TIMEOUT_DOC_KG:300s}
# 兜底检索超时
empty: ${HZERO_KNOWLEDGE_TIMEOUT_EMPTY:120s}
# 配置超时
config: ${HZERO_KNOWLEDGE_TIMEOUT_CONFIG:30s}
# 深度思考超时
deep: ${HZERO_KNOWLEDGE_TIMEOUT_DEEP:600s}
看起来,也就是 “配置超时” 设置得小了点,把这个改到120S,然后重启 aip-app服务。再次测试,问题依旧;
把其他超时配置全部改到600s,再试, 这次就正常输出了。
问题解决。

问题10:文档《班翎流程平台介绍.pdf》 问题索引向量同步报错:
分析:
aip-server后台服务日志报错信息是:

[hzero-aip] [ EX_DOC-0] o.h.a.d.d.e.c.SyncQuestionVectorCommand : [EX] call model error, chat request:
org.hzero.aip.common.executor.exception.ExecuteException: haip.warn.doc.extractor.callModelError
Caused by: io.choerodon.core.exception.CommonException: org.apache.velocity.exception.ParseErrorException: Encountered

[hzero-aip] [ EX_DOC-0] o.h.a.c.e.i.RedisBackupRequestHandler : [EX] 同步任务执行异常,进入重试队列: 0@DOC@2
[EX] 执行错误, requestKey: 0@DOC@2, command: SYNC_QUESTION_VECTOR, error:haip.warn.doc.extractor.callModelError

[hzero-aip][ EX_DOC-3] o.h.aip.model.infra.helper.ModelHelper : 调用对话大模型异常
java.lang.RuntimeException: java.util.concurrent.TimeoutException
把aip-server后台服务日志报错信息给元宝分析,结论是:
核心问题是:​您的系统在调用对话大模型(如DeepSeek)时,设置的超时时间不足以让模型完成复杂的推理任务。​​
​直接表现​:日志显示,在 org.hzero.aip.model.domain.service.ModelInvokeService.invokeSync 方法中,通过 CompletableFuture.get() 获取结果时超时,抛出了 TimeoutException
​任务背景​:当前任务是为文档“班翎流程平台介绍.pdf”生成问题索引,这是一个需要大模型深度理解和内容概括的CPU/GPU密集型任务。输入的指令(Prompt)非常详细,要求模型基于6W3H要素进行分析并生成大量高质量问题,这必然需要较长的处理时间。
解决方案:
​1. 调整超时设置(最直接有效)​​
检查并延长调用大模型服务的超时时间配置。根据日志,任务运行了约2分钟,建议先将超时时间设置为5-10分钟,并根据模型的实际性能进行调整
在aip服务的application.yml中,针对大模型的超时设置,全部加个0,然后保存:
connection:
# 大模型连接超时时间
connect-timeout: ${HZERO_AIP_HTTP_CONNECT_TIMEOUT:300000}
# 大模型读取超时时间
read-timeout: ${HZERO_AIP_HTTP_READ_TIMEOUT:1000000}
# 大模型写入超时时间
write-timeout: ${HZERO_AIP_HTTP_WRITE_TIMEOUT:5000}
保存后 bash run.sh 重新构建启动aip服务。 再次尝试 ,文档《班翎流程平台介绍.pdf》生成问题索引向量同步成功。
问题解决。

问题11:文档《H-ZERO -Lite版本的部署笔记V2.docx》 问题索引向量同步报错:
界面报错信息是:提取文档调用大模型时发生错误: org.apache.velocity.exception.ParseErrorException: Encountered “:http://dev.hzero.com.cn/workplace}\n\n\u66f4\u6539\u5b8c\u914d\u7f6e\u540e\u542f\u52a8\u6210\u529f\uff0c\u9a8c\u8bc1\uff1a\n\n\n\u5728redis\u7f13\u5b58\u7684db3\u4e2d\u7f13\u5b58\u4fe1\u606f\uff1a\n\n\n\n” at haip[line 30, column 83]
Was expecting one of:
“[” …
“|” …
“}” …
“}” …
分析:
《H-ZERO -Lite版本的部署笔记V2.docx》有232页
这个错误是在aip服务的application.yml中,针对大模型的超时设置,全部加个0之后测试出来依然存在的错误。
但这个错误是提交任务后很快就反馈错误结果了,不会等很久,跟timeout无关。看起来跟数据有关,是数据中存在特殊格式。看起来是少了什么括号了。
上面那一堆乱码,转换成中文可读格式是:http://dev.hzero.com.cn/workplace}更改完配置后启动成功,验证:在redis缓存的db3中缓存信息:
针对这个文档单独提交 问题索引向量同步任务之后aip-server服务后台动作是:
2025-10-13T11:12:34.870+08:00 INFO 9056 — [hzero-aip] [ submit-task-24] o.h.a.c.executor.impl.RedisRequestQueue : [EX] enqueue request: 0@DOC@2
2025-10-13T11:12:34.985+08:00 INFO 9056 — [hzero-aip] [ SR_DOC] o.h.a.c.executor.impl.RedisRequestQueue : [EX] dequeue request: 0@DOC@2
2025-10-13T11:12:34.986+08:00 INFO 9056 — [hzero-aip] [ SR_DOC] o.h.a.c.e.i.RedisBackupRequestHandler : [EX] backup request: 0@DOC@2, time: 1760325154986
2025-10-13T11:12:35.007+08:00 INFO 9056 — [hzero-aip] [ SR_DOC] o.h.a.c.e.impl.DefaultExecuteScheduler : [EX-DOC] submit execute resource: 0@DOC@2
2025-10-13T11:12:35.013+08:00 INFO 9056 — [hzero-aip] [ EX_DOC-24] o.h.a.c.e.impl.DefaultRequestHandler : [EX] request handle resource: 0@DOC@2
把更详细的日志发元宝分析后认为是文档内容含有特殊字符, Velocity 引擎未进行转义处理导致的。
【腾讯文档】更多详细错误信息如下: 2025-10-13T11:13:30.156+08:00 ERROR 9056 — [hzero-aip] [ EX_DOC-24] org.apache.velocity.parser
https://docs.qq.com/aio/DYlFPc2hueGpJcHFp
当前用的对话模型是deepseekv3, 换个环境到trail环境,用openai的gpt对话模型试试看。
测试结果:错误是一样的。

问题12:文档《汉得数字化平台介绍1.11.10.pdf》问题索引向量同步报错: java.util.concurrent.ExecutionException: org.hzero.aip.model.domain.exception.ReactiveFailureException: model reactive failure 《汉得数字化平台介绍1.11.10.pdf》有244页;
这个文档在trail环境用用openai的gpt对话模型是没问题的。看起来是模型的问题。
更改模型组合,把里面的deepseekV3.1去掉,只保留deepSeekV3, 再测试,后台服务有错误日志:

[hzero-aip] [ EX_DOC-25] org.hzero.core.util.JsonUtils : Unexpected end-of-input: was expecting closing quote for a string value
at [Source: REDACTED (StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION disabled); line: 94, column: 18] (through reference chain: java.util.ArrayList[91])

[hzero-aip][ EX_DOC-25] o.h.a.d.d.e.c.SyncQuestionVectorCommand : extract question response null, origin text:
看起来是有些片段调用大模型生成问题索引的时候,大模型返回为空。
不过在运行了1个小时候之后,还是成功完成了。
问题解决。

=============================================

2025-09-15 升级灵猿AI中台 从1.6.0.ALPHA.2.7 到 1.6.1.ALPHA.1

参考 开放平台/社区与合作伙伴/文档中心/汉得灵猿 AI 中台 1.6.1.ALPHA/升级指南/升级到1.6/从1.5升级到1.6/v1.6.1 版本更新

服务版本:1.6.1.ALPHA.1
发布时间:2025年08月25日
前端版本:1.6.1-alpha.1
数据版本:1.6.AIP-BETA

1、升级种子数据:

灵猿AI中台 并没有提供Git的方式获取种子数据,需要到选配平台选配后下载获得:
在 开放平台/开发者/项目中心/在线选配/服务端选配/, 父组件选择HZERO 1.12.1 ,组件选择aip-app 和 aip-server两个组件,选择后获得种子数据、前后端工程。
实际上,对升级而言,这种选配的做法并不实用。 因为对于前端组件,我们只需要知道更新哪几个服务的前端到什么版本号即可,我们会在我们自己的大前端工程中去更新这些组件的版本号即可,并不需要额外的前端工程文件。后端服务组件也是同样道理。
而且,选配下来的aip-app工程中的POM文件中的版本号也对不上,那里面是1.6.1.ALPHA,但我们的升级文档中明确是1.6.1.ALPHA.1, 选配下来的POM文件中的版本号在制品库可能不存在。

对于种子数据,选配下来的种子数据,在application.yml文件中并没有显示AI中台种子数据的版本,而是显示了一个HZERO 的版本 data: version: 1.12.RELEASE ,这个其实会 给读者带来困扰,因为升级文档中要求种子数据版本是:1.6.AIP-BETA。只有点进种子数据目录下具体的Excel文件中可以看到有些数据日期是2025-08-28 ,才能猜测这个种子数据可能符合1.6.1的要求,因为1.6.1的发布日期是2025-08-25;

建议在升级文档中要求 数据版本:1.6.AIP-BETA 的地方,像飞搭一样直接给这个种子数据的git地址,让读者可以直接下载。

灵猿AI中台 坚持用选配的方式下载种子数据,不过说后面改进选配,在选配的结果目录下放个说明文件,明确显式 说明各模块的种子数据版本,这也是个解决方案。

执行: 把刚才选配写下来的种子数据进行安装
执行 1、更新数据库 3、导入数据(AIP服务) 成功完成
说明:第2步,数据修复,不用做,因为里面全是HZERO 平台本身的数据修复,跟AIP没有关系,我的HZERO 基础平台是最新的1.12.1 这一步不用做。

2、升级后端服务
把 2个目录下的POM.xml文件中的版本都从1.6.0.ALPHA.2.7替换成1.6.1.ALPHA.1

  /d02/hzero-aipaas/project/ps-aip-app
  /d02/hzero-aipaas/project/ps-aip-server

在上述上个微服务目录下运行 bash run.sh 构建新版本

启动这2个服务,都成功启动。

3、升级前端组件

更改 /d02/hzero/front/front/package.json文件

cd /d02/hzero/front/front/
cp package.json package.json.bak20250916

编辑 package.json文件

“devDependencies” : {

“hzero-front-haip” : “1.6.0-alpha.2”,

更改成:

“hzero-front-haip”: “1.6.1-alpha.1”,

hzero-front 不用管了,已经是~1.12.4-alpha.11 ,比文档要求的 “~1.11.38-alpha.0” 版本高;

修改保存后,运行 yarn

Done in 27.10s.

然后运行 yarn run build:ms hzero-front-haip

Done in 321.90s. 成功完成。

然后运行 bash apply_update_to_runtime_env.sh 拷贝打包文件到目标目录并执行字符串替换

4、升级试用 docker的几个服务:参考 开放平台/社区与合作伙伴/文档中心/汉得灵猿 AI 中台 1.6.1.ALPHA/中间件部署
下载
wget https://hsop-hsop.su.bcebos.com/hsop/video/3/HSOP-BAIDU/1578eb1c086048c081ead14967515284@hzero-aigc-docker-compose-1.6.1.zip
备份原来的:
cd /d02/hzero-aipaas
cp -rf hzero-aigc-docker-compose hzero-aigc-docker-compose.bak20250916

然后把刚才下载的压缩文件改名,解压缩
unzip hzero-aigc-docker-compose-1.6.1.zip
提示 替换时选择 A
replace hzero-aigc-docker-compose/elastic/analysis-icu-8.12.2.zip? [y]es, [n]o, [A]ll, [N]one, [r]ename: A

4.1 HKMS yml文件修改:

在HKMS容器的yml文件中添加extra_hosts:(这一步的原因:参考:H-ZERO -Lite版本的部署笔记V2.docx/十一、AI平台安装/四、AI平台功能验证/6、Docker安装环境问题)
services:
hkms:
container_name: hkms
image: registry.hand-china.com/hzero-public/hkms-python:1.6.1
extra_hosts:
– “oss.hzero.com.cn:172.18.14.48″ # 格式:”主机名:IP地址”
– “dev.hzero.com.cn:172.18.14.48”

在 volumes: 上面添加限制内存的配置
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 3g # 容器最大内存(python应用直接限制内存)

 4.2 ES的yml配置更改:

原来 – m=1GB的地方改成:

  - ES_JAVA_OPTS=-Xms500m -Xmx500m  # 设置 JVM 堆内存为 500M 
deploy:  # 限制容器总内存(Docker Compose v2.3+)
  resources:
    limits:
      memory: 1g  # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)


4.3 hype yml配置更改:

在 ports: 上面添加限制内存的配置

deploy:  # 限制容器总内存(Docker Compose v2.3+)
  resources:
    limits:
      memory: 500m  # 容器最大内存(python应用直接限制内存大小) 

  4.4 milvus 添加内存配置

在 milvus_standalone_embed.sh中, sudo docker run -d \ 下面添加:

    --memory="600m" \
    --memory-swap="1200m" \


  4.5 neo4j 添加内存配置

在 volumes:上面添加:
– ES_JAVA_OPTS=-Xms500m -Xmx500m # 设置 JVM 堆内存为 500M
deploy: # 限制容器总内存(Docker Compose v2.3+)
resources:
limits:
memory: 1g # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)

实际上,相对于 hzero-aigc-docker-compose-1.6.0-ALPHA.zip, hzero-aigc-docker-compose-1.6.1.zip 只是改了HKMS的镜像版本,其他镜像版本都没变;

HKMS镜像比较大,有1.7G,新版本启动会拉新的镜像,考虑硬盘空间占用,老的版本后面在本地镜像库中要删掉。

5、验证
启动AI平台 bash service-ai-start-all.sh
脚本总执行时间: 0小时12分钟7秒

问题1、平台内置向量库(milvus)的链接配置在升级后被重置了,升级没有保留原来的链接配置,导致向量库链接失败。
修复:向量库地址 从172.0.0.1 改成 dev.hzero.com.cn:19530, 其他不改,测试成功;

问题2、平台内置向量库(ElasticSearch)的链接配置在升级后被重置了,升级没有保留原来的链接配置,导致向量库链接失败。
修复:向量库地址 从172.0.0.1 改成 dev.hzero.com.cn:9200,认证类型从 FINGERPRINT 改成 密码模式,用户名/密码:都设置成elastic , 测试:链接成功

问题3、向量检索,选择平台内置milvus库,检索“飞搭”, 报错:向量库操作失败,请联系管理员!

异常信息:[UNAVAILABLE: io exception]
后台服务报错信息:[hzero-aip] [ XNIO-1 task-5] o.h.a.v.m.MilvusVectorDatabaseClient : [Milvus] searchVector error: UNAVAILABLE: io exception
org.hzero.aip.vector.exception.VectorException: 向量库操作失败,请联系管理员!异常信息:[UNAVAILABLE: io exception]
at org.hzero.aip.vector.milvus.MilvusVectorDatabaseClient.handleResult(MilvusVectorDatabaseClient.java:880) ~[hzero-aip-common-1.6.1.ALPHA.1.jar!/:1.6.1.ALPHA.1]

    第二天,正要让姜州帮忙查问题,重启服务,再次测试居然就正常了,问题解决。

问题4、预置的应用:个人问答,提问问题:“飞搭是什么”测试的时候报错:

        知识问答检索异常,请联系管理员

       HTTPConnectionPool(host='127.0.0.1', port=8088): Max retries exceeded with url: /v1/open/embeddings/common (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f6e47b15610>: Failed to establish a new connection: [Errno 111] Connection refused'))

       看起来是AIP-APP服务报错,看后台日志:

2025-09-17T10:59:22.616+08:00 WARN 10974 — [hzero-aip-app] [ model-9] o.h.a.m.d.s.GradientIntervalStrategy : EMBEDDING@HAIP.AZURE_EMBED is silenced, release time is: 2025-09-17T11:00:22.613709229

      2025-09-17T11:03:06.508+08:00 ERROR 10974 --- [hzero-aip-app] [ BaseExecutor-9] o.h.aip.common.utils.DataDecryptUtils    : ========== decrypt error. Illegal base64 character 2a
      2025-09-17T11:03:07.387+08:00  WARN 10974 --- [hzero-aip-app] [    kms-flux-20] o.h.aip.kms.domain.chain.ChainNodeForQa  : [知识问答] -- [服务调用] -- [请求为空]
      2025-09-17T11:03:07.960+08:00  INFO 10974 --- [hzero-aip-app] [pool-3-thread-3] org.hzero.core.util.CommonExecutor       : [>>ExecutorStatus<<] ThreadPool Name: [init-message-cache], Pool Status: [shutdown=false, Terminated=false], Pool Thread   Size: 3, Largest Pool Size: 128, Active Thread Count: 0, Task Count: 200, Tasks Completed: 200, Tasks in Queue: 0
      2025-09-17T11:03:08.272+08:00  INFO 10974 --- [hzero-aip-app] [    kms-flux-16] o.h.a.v.impl.RedisDatabaseRepository     : 向量数据库缓存更新,刷新内存数据: 2025-09-17 10:53:19.718

       感觉升级种子数据把 默认的向量模型组合中的HAIP.AZURE_EMBED又自动加回来了。我上次版本 默认的向量模型组合配置中已经把 HAIP.AZURE_EMBED 禁用掉了,这次升级后又启用了,因为我没有买AZURE的账号,所以这次升级后要再次禁用掉。

       再次禁用掉就好了,问题解决。

问题5、文档管理/个人文档/上传一个飞搭产品介绍PPT,切片存向量的时候报错:

    调用HKMS执行文件切片时发生错误:Failed: <MilvusException: (code=2, message=Fail connecting to server on dev.hzero.com.cn:19530, illegal connection params or server unavailable)>
    之前碰到过类似问题,是milvus向量库挂掉了,解决方案:重启milvus
    cd /d02/hzero-aipaas/hzero-aigc-docker-compose/milvus
    bash milvus_standalone_embed.sh start
    然后 在界面上点   [重新同步] ,可以成功继续,勾选 ES同步后提交后台处理,过一会反馈 ES同步成功,内容向量库同步失败;
    看docker ps 看milvus-standalone 向量服务是运行的,没有挂。
    看后台服务日志:

java.lang.IllegalArgumentException: 处理失败:HTTPConnectionPool(host=’127.0.0.1′, port=8088): Max retries exceeded with url: /v1/open/embeddings/common (Caused by NewConnectionError(‘: Failed to establish a new connection: [Errno 111] Connection refused’))
2025-09-17T11:37:27.849+08:00 WARN 10613 — [hzero-aip] [BaseExecutor-30] o.h.a.d.l.SyncFailureEventListener : 同步失败,发送站内信 :
SYNC_VECTOR,
{“lastUpdateDate”:”2025-09-17T11:37:27.804+0800″,”objectVersionNumber”:1,”versionId”:7,”documentId”:7,”versionNum”:1,”versionName”:”汉得_aPaaS平台介绍-2025V1.pptx”,”documentUrl”:”http://oss.hzero.com.cn:9000/hz-haip/haip01/0/MINIO/ff179862b45242e5897548302cd8c2a3@汉得_aPaaS平台介绍-2025V1.pptx”,”fileSize”:156337047,”defaultFlag”:1,”tenantId”:0,”docType”:”pptx”,”sourceType”:”DOC”,”deleteFlag”:0,”sourceKey”:”c67bf23357be43a6aebb0edfbad76c3b@http://oss.hzero.com.cn:9000/hz-haip/haip01/0/MINIO/ff179862b45242e5897548302cd8c2a3@汉得_aPaaS平台介绍-2025V1.pptx”,”syncVectorStatus”:”FAILURE”,”syncImageVectorStatus”:”NO”,”syncQaStatus”:”NO”,”syncGraphStatus”:”NO”,”syncQaEsStatus”:”NO”,”syncDocEsStatus”:”WAITING”,”syncLabelStatus”:”NO”,”syncSummaryStatus”:”NO”,”syncChapterStatus”:”NO”,”syncSummaryIndexStatus”:”NO”,”syncDate”:”2025-09-17T11:37:27.804+0800″,”syncMsg”:”处理失败:”,”syncInfo”:”{\”syncVectorStatus\”:\”FAILURE\”,\”syncVectorDate\”:\”2025-09-17T11:37:27.804+0800\”,\”syncVectorMsg\”:\”处理失败:\”,\”syncImageVectorStatus\”:\”NO\”,\”syncGraphStatus\”:\”NO\”,\”syncQuestionStatus\”:\”NO\”,\”syncDocEsStatus\”:\”WAITING\”,\”syncDocEsDate\”:\”2025-09-17T11:37:17.079+0800\”,\”syncQuestionEsStatus\”:\”NO\”,\”syncLabelStatus\”:\”NO\”,\”syncSummaryStatus\”:\”NO\”,\”syncChapterStatus\”:\”NO\”,\”syncSummaryIndexStatus\”:\”NO\”,\”totalLength\”:22674}”,”traceType”:”FILE”,”head”:{“lastUpdateDate”:”2025-09-17T11:37:17.000+0800″,”objectVersionNumber”:1,”documentId”:7,”documentUuid”:”c67bf23357be43a6aebb0edfbad76c3b”,”documentName”:”汉得_aPaaS平台介绍-2025V1.pptx”,”publicFlag”:0,”tenantId”:0,”deleteFlag”:0},”createdByName”:”超级管理员”,”updatedByName”:”超级管理员”,”documentUuid”:”c67bf23357be43a6aebb0edfbad76c3b”,”documentName”:”汉得_aPaaS平台介绍-2025V1.pptx”,”syncing”:false}
2025-09-17T11:37:27.853+08:00 INFO 10613 — [hzero-aip] [ EX_DOC-3] o.h.aip.vector.DatabaseClientManager : [Vector] 创建向量库客户端: {“databaseUuid”:”DEFAULT_ES”,”databaseType”:”FulltextElastic”,”databaseCode”:”DEFAULT”,”databaseName”:”\u5E73\u53F0\u5185\u7F6E\u5411\u91CF\u5E93(ElasticSearch)”,”databaseUrl”:”http:\/\/dev.hzero.com.cn:9200″,”username”:”elastic”,”extConfig”:null,”tenantId”:0}
2025-09-17T11:37:28.084+08:00 INFO 10613 — [hzero-aip] [ EX_DOC-3] i.m.client.AbstractMilvusGrpcClient : HasCollectionParam(collectionName=T0_KMS_DOCUMENT, databaseName=null)
2025-09-17T11:37:28.091+08:00 INFO 10613 — [hzero-aip] [ EX_DOC-3] i.m.client.AbstractMilvusGrpcClient : QueryParam{collectionName=’T0_KMS_DOCUMENT’, partitionNames='[]’, outFields=[doc_id, time, text, doc_source], expr=’doc_source == “c67bf23357be43a6aebb0edfbad76c3b@http://oss.hzero.com.cn:9000/hz-haip/haip01/0/MINIO/ff179862b45242e5897548302cd8c2a3@汉得_aPaaS平台介绍-2025V1.pptx”‘, consistencyLevel=’null’, offset=0, limit=10000, ignoreGrowing=’false’}
看hkms日志: docker logs hkms , 主要错误:
Milvus连接失败 dev.hzero.com.cn:19530 Fail connecting to server… connection params or server unavailable
嵌入服务连接拒绝 127.0.0.1:8088 Connection refused [Errno 111]
看下milvus服务 是否挂掉了:
docker ps | grep milvus
啥也没有,果然挂掉了,什么原因挂掉的? OOM?
grep -i “oom” /var/log/syslog
Sep 16 23:10:06 desktop-jacksen kernel: [14237.094252] Memory cgroup out of memory: Killed process 35278 (milvus) total-vm:9918108kB, anon-rss:550404kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:2924kB oom_score_adj:0
果然是milvus被kill 了。
free
%Cpu(s): 0.9 us, 0.4 sy, 0.0 ni, 98.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 28068.3 total, 228.5 free, 26403.8 used, 1436.1 buff/cache
MiB Swap: 7168.0 total, 2383.0 free, 4785.0 used. 1257.4 avail Mem
28G 内存还是配置太少了;加到30G,更改后 ,重启服务
notepad $env:USERPROFILE.wslconfig

[wsl2]

最大内存限制(可填 GB 或 MB,如 8GB、4096MB)

memory=30GB
linux 虚拟机先停掉AI 平台服务,再关闭WSL服务
wsl –shutdown

再打开 ubuntu-22.04-hzero , 起AI 平台服务,再次测试,依然报错:

资源同步失败
资源名称:汉得_aPaaS平台介绍-2025V1.pptx
同步类型:内容同步(向量库)

失败原因:处理失败:HTTPConnectionPool(host=’127.0.0.1′, port=8088): Max retries exceeded with url: /v1/open/embeddings/common (Caused by NewConnectionError(‘: Failed to establish a new connection: [Errno 111] Connection refused’))

看hkms日志: docker logs hkms , 主要错误:
requests.exceptions.ConnectionError: HTTPConnectionPool(host=’127.0.0.1′, port=8088): Max retries exceeded with url: /v1/open/embeddings/common (Caused by NewConnectionError(‘: Failed to establish a new connection: [Errno 111] Connection refused’))
从HKMS日志中可以看到 , Milvus 向量库的连接完全正常,且查询逻辑执行成功,拿到了预期的 31 条数据,再看milvus服务,没有挂掉。说明这个错误跟milvus向量数据库没有关系。
分析: 因为这是容器内的日志,hkms docker容器访问的127.0.0.1 ,为什么 hkms会用这个固定地址呢? 原来是docker-compse.yml中的配置:
# MongoDB地址
MONGO_CONN: mongodb://:@127.0.0.1:27017/hgpt?authSource=admin&authMechanism=SCRAM-SHA-1
# APP URL
HAIP_HOST: http://127.0.0.1:8088
# 网关地址
FILE_SERVICE_HOST: http://127.0.0.1:8080
这些配置都要改的,改成跟升级前一致:
# MongoDB地址
MONGO_CONN: mongodb://hzer:hzero@localhost:27017/hgpt?authSource=admin&authMechanism=SCRAM-SHA-1
# APP URL
HAIP_HOST: http://dev.hzero.com.cn:8088
# 网关地址
FILE_SERVICE_HOST: http://gateway.hzero.com.cn:8080
更新后 重启hkms容器
cd hkms
docker compose down
docker compose up -d
再次测试,选择上次内容向量同步失败的文档, 做同步处理(异常同步) , 这下成功了, 问题解决。

问题6:菜单路径 AIGC中台/企业应用库/ 点击“知识库定义”,或者 “文档库管理” 或者 “Agent编排” 都显示白屏,需要回车刷新后才能正常显示。
分析: 有人认为是缓存问题,就是升级后前端相互调用的部分文件版本因为缓存导致不一致,可以清空缓存或者用无痕模式看看。 我刷新了缓存,也用了无痕模式,包括浏览器从Edge换成chrome, 结果都一样,还是有问题。
使用检查功能,然后再点击“知识库定义”看标头/网络 状态代码= 200 OK (从磁盘缓存) ,看响应里面是有index.html的内容的。
使用检查功能,然后再点击“文档库管理”看标头/网络 有两个请求URL, 一个是http://gateway.hzero.com.cn:8080/iam/v1/menu-access 状态代码= 204 No Content,看响应里面是空的。 还有个
http://dev.hzero.com.cn/haip/doc/null 状态代码= 200 OK (从磁盘缓存) ,看响应里面有index.html的内容。 回车刷新后正常,回车刷新后第一个请求URL是:http://dev.hzero.com.cn/haip/doc/document
把问题和相关现象给豆包,豆包认为是第一个调用 http://gateway.hzero.com.cn:8080/iam/v1/menu-access 没有得到正确的返回值,导致第二个调用出现null.
查最新的版本可知,hzero-aip最新的小版本已经到 1.6.1.ALPHA.1.3 了,这个比我们升级后的版本更新。
https://nexus.saas.hand-china.com/service/rest/repository/browse/Hzero-Release/org/hzero/hzero-aip/
其前端最新版本是 hzero-front-haip-1.6.1-alpha.1 , 这个跟我们升级后的版本是一致的,没有更新的了。
https://nexus.saas.hand-china.com/service/rest/repository/browse/hzero-ui/hzero-front-haip/

解决方案尝试:把后端版本升级到1.6.1.ALPHA.1.3
测试结果:问题依旧。。。
这个问题后来升级新版轻透主题的过程中,在单独编译前端工程主模块后就解决了。

=============================================

2025-09-11 升级飞搭 从 2.9.1-1.12.BETA.8 到 2.10.0.RELEASE

参考 : 开放平台/社区与合作伙伴/文档中心/汉得aPaaS平台-飞搭 2.10.0.RELEASE/本地化安装部署&升级/《飞搭升级》

1、升级种子数据:

下载2.10的种子数据:git clone -b 2.10-release git@code.choerodon.com.cn:hzero-hlod/hzero-lowcode-resource.git
下载后在application.yml 的数据源配置中把//localhost:3306后面的“/”去掉。(下载的时候后,后来把这个问题报给产品组,让他们改了,后续应该不会又问题了)

按文档执行 1、更新数据库 2、数据修复、3、导入数据

成功完成。

2、升级后端服务:

2.1 把 四个目录下的POM.xml文件中的版本都从2.9.1-1.12.BETA.8替换成2.10.0.RELEASE(注意:2.10.0.RELEASE是适配HZERO 1.11的版本;2.10.0-1.12.RELEASE才是适配HZEERO 1.12的版本,两者依赖的license服务版本不一样,服务启动命令行中使用的license agent版本也不一样,具体下面会讲到)
/d02/hzero-apaas/project
/d02/hzero-apaas/project/ps-lowcode
/d02/hzero-apaas/project/ps-modeler
/d02/hzero-apaas/project/ps-lowcodedata

在上述上个微服务目录下运行 bash run.sh 构建新版本

ps-lowcode 服务构建后启动失败:

2025-09-11 20:31:37.521 ERROR 2800 — [ main] o.s.boot.SpringApplication : Application run failed
java.lang.NoClassDefFoundError: org/springframework/core/type/classreading/ClassFormatException

mvn dependency:tree

[INFO] org.hzero:ps-lowcode:jar:2.10.0.RELEASE
[INFO] +- org.hzero:hzero-lowcode:jar:2.10.0.RELEASE:compile
[INFO] | +- org.hzero.boot:hzero-apaas-common:jar:2.10.0.RELEASE:compile
[INFO] | | +- javax.servlet:javax.servlet-api:jar:4.0.1:compile
[INFO] | | +- com.github.luben:zstd-jni:jar:1.5.2-1:compile

[INFO] | +- org.hzero.starter:hzero-starter-export:jar:1.11.4.RELEASE:compile
[INFO] | | +- org.hzero.starter:hzero-starter-redis:jar:1.11.4.RELEASE:compile
[INFO] | | | +- org.springframework.boot:spring-boot-starter-data-redis:jar:2.7.18:compile

[INFO] | +- org.hzero.license:hzero-starter-license:jar:1.1.0.RELEASE:compile
[INFO] | | +- org.hzero.license:hzero-license-core:jar:1.1.0.RELEASE:compile
[INFO] | | +- org.hzero.license:hzero-license-tool-core:jar:1.1.0.RELEASE:compile

mvn dependency:tree 后发现 2.10.0.RELEASE 默认支持的是1.11的H0 ,但我们的H0 是1.12的

在飞搭文档: 《飞搭HZERO1.12&JDK17 适配》 中提到适配HZERO 1.12版的飞搭配2.10的具体版本号是:2.10.0-1.12.RELEASE

接下来要改POM中的版本,待续。。。。

启动lowcode服务还是失败

Caused by: org.springframework.core.type.classreading.ClassFormatException: ASM ClassReader failed to parse class file – probably due to a new Java class file version that is not supported yet. Consider compiling with a lower ‘-target’ or upgrade your framework version. Affected class: URL [jar:nested:/d02/hzero-apaas/project/ps-lowcode/target/ps-lowcode.jar/!BOOT-INF/lib/hzero-lowcode-2.10.0-1.12.RELEASE.jar!/org/hzero/lowcode/common/api/controller/v1/CommonController.class]

mvn dependency:tree 依赖是 H0的1.12了,没问题
[INFO] — maven-dependency-plugin:3.8.1:tree (default-cli) @ ps-lowcode —
[INFO] org.hzero:ps-lowcode:jar:2.10.0-1.12.RELEASE
[INFO] +- org.hzero:hzero-lowcode:jar:2.10.0-1.12.RELEASE:compile
[INFO] | +- org.hzero.boot:hzero-apaas-common:jar:2.10.0-1.12.RELEASE:compile

[INFO] | +- org.hzero.starter:hzero-starter-export:jar:1.12.1.RELEASE:compile
[INFO] | | +- org.hzero.starter:hzero-starter-redis:jar:1.12.1.RELEASE:compile
[INFO] | | | +- org.springframework.boot:spring-boot-starter-data-redis:jar:3.4.1:compile

[INFO] | +- org.hzero.license:hzero-starter-license:jar:1.1.2.RELEASE:compile
[INFO] | | +- org.hzero.license:hzero-license-core:jar:1.1.2.RELEASE:compile

我们注意到这次依赖的license是1.1.2.RELEASE, 而之前的服务启动命令里面用的licenseAgent是license-agent110.jar(57K),可能是要换新版的licenseAgent,于是把licenseAgent版本换到license-agent112a.jar(61K), 再次启动bash run.sh, 这次启动成功了。
接下来把ps-lowcode,ps-modeler,ps-lowcodedata 三个服务目录下的run.sh 和 run_nobuild.sh 中的 licenseAgent 全部从license-agent110.jar(57K) 改成 license-agent112a.jar(61K)

再次启动这三个服务,都成功启动。

2.2 升级其他服务中依赖飞搭组件的版本
/d02/hzero/project/ps-iam-saas ,更新依赖hzero-apaas-common 到 2.10.0-1.12.RELEASE
/d02/hzero/project/ps-interface ,更新依赖hzero-boot-modeler-client,hzero-boot-modeler-event-client 到 2.10.0-1.12.RELEASE
/d02/hzero/project/ps-platform ,更新依赖hzero-apaas-common 到 2.10.0-1.12.RELEASE

3、升级前端组件

更改 /d02/hzero/front/front/package.json文件
“devDependencies” : {

"hzero-front-hlod" : "~2.9.1-beta.7",
"hzero-front-apaas": "~2.9.1-beta.5",

更改成:

“hzero-front-apaas”: “~2.10.0”,
“hzero-front-hlod”: “~2.10.0”,
“hzero-front-hmde”: “~2.10.0”,
“hzero-apaas-common”: “~2.10.0”,

hzero-front 不用管了,已经是~1.12.4-alpha.11 ,比文档要求的 “hzero-front”: “~1.11.32” 版本高;

修改保存后,运行 yarn

然后运行 yarn run build:ms hzero-front-hlod,hzero-front-apaas,hzero-front-hmde,hzero-apaas-common

Done in 969.29s. 成功完成。

然后运行 bash apply_update_to_runtime_env.sh 拷贝打包文件到目标目录并执行字符串替换

yarn add @feida/core@release @feida/plugin-vue-render@release @feida/shared-utils@release –registry=http://nexus.saas.hand-china.com/repository/hzero-npm-group/
yarn add @feida/vue-cli-plugin-creator@release -D –registry=http://nexus.saas.hand-china.com/repository/hzero-npm-group/

简单来说,这两条命令的作用是从指定的私有 npm 仓库中安装几个 @feida 系列的包,其中前三个是项目运行时需要的依赖,最后一个是开发时需要的依赖。使用特定的 registry 通常是为了获取内部开发的包或有访问权限控制的包。

执行时报错:
error Running this command will add the dependency to the workspace root rather than the workspace itself, which might not be what you want – if you really meant it, make it explicit by running this command again with the -W flag (or –ignore-workspace-root-check).

这个问题要再确认下,是否加 -W 标记

4、数据修复

看到开放平台飞搭文档《飞搭升级》中还要求数据修复动作

数据修复:

curl –location –globoff –request POST ‘http://gateway.hzero.com.cn:8080/hmde/v1/upgrade’ –header ‘Authorization: Bearer 615e9ab0-91d5-4e97-97d7-270b399bc806’

后台服务日志显示成功更新:

2025-09-13T18:09:05.617+08:00 INFO 35638 — [hzero-modeler] [ job-0] o.h.m.c.a.s.i.FixPublicDomainServiceImpl : [FIX] Update 0 script to public domain.
2025-09-13T18:09:05.623+08:00 INFO 35638 — [hzero-modeler] [ job-0] o.h.m.c.a.s.i.FixPublicDomainServiceImpl : [FIX] Update 0 flow to public domain.
2025-09-13T18:09:05.628+08:00 INFO 35638 — [hzero-modeler] [ job-0] o.h.b.a.c.j.d.s.impl.JobLoggerImpl : Step completed
2025-09-13T18:09:05.629+08:00 INFO 35638 — [hzero-modeler] [ job-0] o.h.b.a.c.j.d.s.impl.JobLoggerImpl : Start executing steps:修复导入/导出模板字段多语言数据
2025-09-13T18:09:05.908+08:00 INFO 35638 — [hzero-modeler] [ job-0] o.h.b.a.c.j.d.s.impl.JobLoggerImpl : Step completed
2025-09-13T18:09:05.909+08:00 INFO 35638 — [hzero-modeler] [ job-0] o.h.b.a.c.j.d.s.impl.JobLoggerImpl : Start executing steps:修复业务对象字段默认值类型不符合枚举

curl –location –globoff –request POST ‘http://gateway.hzero.com.cn:8080/hlod/v1/upgrade’ –header ‘Authorization: Bearer 702a1b9c-4334-4f1e-b885-8f1c63e9561d’

后台服务日志显示有一处报错:

2025-09-13T18:11:05.140+08:00 INFO 35873 — [hzero-lowcode] [ job-0] o.h.b.a.c.j.d.s.impl.JobLoggerImpl : Step completed
2025-09-13T18:11:05.141+08:00 INFO 35873 — [hzero-lowcode] [ job-0] o.h.b.a.c.j.d.s.impl.JobLoggerImpl : Start executing steps:修复列表行号属性样式
2025-09-13T18:11:05.359+08:00 ERROR 35873 — [hzero-lowcode] [ job-0] o.h.b.a.c.j.d.s.impl.JobLoggerImpl : Execution failed

org.springframework.dao.DataIntegrityViolationException:

Error updating database. Cause: java.sql.SQLException: Field ‘structure_id’ doesn’t have a default value

The error may exist in org/hzero/lowcode/view/infra/mapper/LowcodeStructureMapper.java (best guess)

The error may involve org.hzero.lowcode.view.infra.mapper.LowcodeStructureMapper.insertSelective-Inline

The error occurred while setting parameters

SQL: INSERT INTO hlod_structure_pub

后面解决了问题,可以再次运行,修复程序通常可以重复运行而不会产生其他问题。

5、验证

看了下原有定制开发的领域的功能,基本没问题。少量问题如下:

问题1、原来2.9版本存在的问题:业务对象LOV打开报错“程序出现错误,请联系管理员” 但不影响保存使用的问题依然存在;

问题2、新建业务对象保存的时候报错:发布失败
Execution failed 蓝图数据保存错误,请联系管理员(No instances available for hzero-lowcodedata)
后台服务日志如下:
2025-09-17T14:30:11.264+08:00 WARN 26303 — [hzero-lowcodedata] [ool-3-thread-12] org.hzero.core.util.CommonExecutor : [>>ExecutorStatus<<] ThreadPool Name: [response-pool], Pool Status: [shutdown=false, Terminated=false], Pool Thread Size: 0, Largest Pool Size: 0, Active Thread Count: 0, Task Count: 0, Tasks Completed: 0, Tasks in Queue: 0
2025-09-17T14:30:11.264+08:00 WARN 26303 — [hzero-lowcodedata] [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization – cancelling refresh attempt: java.lang.OutOfMemoryError: Java heap space
Exception in thread “DiscoveryClient-%d” java.lang.OutOfMemoryError: Java heap space
Exception in thread “job-timeout-monitor” Exception in thread “redisson-timer-6-1” java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Java heap space
看起来是lowcodedata服务的内存设置太少了,看内存使用情况:
jhsdb jmap –heap –pid 26303
Heap Usage:
G1 Heap:
regions = 200
capacity = 209715200 (200.0MB)
used = 207425368 (197.81624603271484MB)
free = 2289832 (2.1837539672851562MB)
98.90812301635742% used
看起来确实不够用,把服务启动命令里面的内存从200M调整到300M,重启服务; 可以正常发布业务对象。
问题解决。

问题3、导出 低代码领域的配置数据出错。(低代码版本:2.10.0-1.12.RELEASE hzero-iam版本:1.12.2.RELEASE)

平台管理员角色>低代码平台>资源管理>数据迁移>数据导出>配置数据 ,选择导出低代码POC演示租户下面 整个领域
导出进程到50%时报错:
ERROR
2025-10-09 17:32:29 服务 hzero-iam 执行数据导入失败,原因:Unable to make field private final byte[] java.lang.String.value accessible: module java.base does not “opens java.lang” to unnamed module @7a419da4, exception: Unable to make field private final byte[] java.lang.String.value accessible: module java.base does not “opens java.lang” to unnamed module @7a419da4
ERROR
2025-10-09 17:32:30 Execution failed 服务 hzero-modeler 远程请求 服务 hzero-iam 失败,原因: 服务 hzero-iam 执行数据导入失败,原因:Unable to make field private final byte[] java.lang.String.value accessible: module java.base does not “opens java.lang” to unnamed module @7a419da4
ERROR
2025-10-09 17:32:30 服务 hzero-modeler 远程请求 服务 hzero-iam 失败,原因: 服务 hzero-iam 执行数据导入失败,原因:Unable to make field private final byte[] java.lang.String.value accessible: module java.base does not “opens java.lang” to unnamed module @7a419da4
针对这个问题,低代码产品组给的建议是iam 服务启动时要加一堆参数:
–add-opens java.base/java.lang=ALL-UNNAMED
–add-opens java.base/java.lang.reflect=ALL-UNNAMED
–add-opens java.base/java.net=ALL-UNNAMED
–add-opens java.base/java.nio=ALL-UNNAMED
–add-opens java.base/java.util=ALL-UNNAMED
–add-opens java.base/java.util.concurrent=ALL-UNNAMED
–add-opens java.base/jdk.internal.loader=ALL-UNNAMED
执行:按建议在服务启动命令中增加这些参数,再重启Iam服务,再次执行导出
结果:hzero-iam 服务报错的问题没有了。
但hzero-platform又报了类似错误,于是针对hzero-platform也做了类似处理,然后重启hzero-platform服务,再次执行导出
结果:hzero-platform服务报错的问题没有了。不过又出了新的问题:
ERROR
2025-10-09 19:13:50 服务 hzero-workflow 执行模块 moduel-workflow 导出失败,原因:{2}, exception: Cannot invoke “java.util.Map.get(Object)” because “contextMap” is null
ERROR
2025-10-09 19:13:50 服务 hzero-workflow 执行数据导出失败,原因:[class java.lang.NullPointerException] Cannot invoke “java.util.Map.get(Object)” because “contextMap” is null
ERROR
2025-10-09 19:13:50 服务 hzero-workflow 执行数据导入失败,原因:Cannot invoke “java.util.Map.get(Object)” because “contextMap” is null, exception: Cannot invoke “java.util.Map.get(Object)” because “contextMap” is null
ERROR
2025-10-09 19:13:51 Execution failed 服务 hzero-modeler 远程请求 服务 hzero-workflow 失败,原因: 远程请求结果丢失, 请检查远程服务 hzero-workflow 的迁移依赖配置是否为最新配置
ERROR
2025-10-09 19:13:51 服务 hzero-modeler 远程请求 服务 hzero-workflow 失败,原因: 远程请求结果丢失, 请检查远程服务 hzero-workflow 的迁移依赖配置是否为最新配置
查开放平台文档 >社区与合作伙伴>文档中心>汉得aPaaS平台-飞搭>常见问题Q&A>数据迁移问题>4. 导入/导出时出现接口不存在提示>
hzero-workflow服务调整
在飞搭配置数据跨环境迁移时,涉及到工作流数据迁移,工作流服务需要添加如下依赖:
复制
org.hzero.boot hzero-apaas-common {apaas-version}
然后重新构建,启动服务hzero-workflow,再次执行导出,这次100%成功完成。
问题解决。

问题4、导出 低代码领域的业务数据出错。(低代码版本:2.10.0-1.12.RELEASE hzero-iam版本:1.12.2.RELEASE)
平台管理员角色>低代码平台>资源管理>数据迁移>数据导出>业务数据 ,选择导出低代码POC演示租户下面的19个业务对象的业务数据。
导出进程到16.67%时报错:
INFO
2025-10-09 19:51:07 Start executing steps:业务数据导出-数据导出
ERROR
2025-10-09 19:51:11 Execution failed For input string: “=an6ymMuMg6DyS-bzleLxbw===”
ERROR
2025-10-09 19:51:11 For input string: “=an6ymMuMg6DyS-bzleLxbw===”
INFO
2025-10-09 19:51:11 业务数据导出失败

#lowcode-import-problem

问题5、导入 低代码领域《POC演示-知识产权管理》 配置数据出错
目标:把WSL虚拟机上的 《POC演示-知识产权管理》这个领域迁移到trail环境的 客户运营试用租户 下
已知:
来源领域:POC演示-知识产权管理
来源领域租户编码:lowcode_poc_tenant
来源领域对应的数据微服务编码:hzero-lowcodedata
来源领域对应的数据微服务的数据库schema:hzero_lowcodedata
目标租户编码:HPOMTRIAL
目标数据微服务编码:hzero-lowcode-data
目标数据微服务的数据库schema:hzero_lowcode_data
编辑已经导出的压缩文件解压后的data.jason文件:(yong vscode 或者cursor 之类的编辑器打开,右键format):
更改 “serviceCode”: “hzero-modeler”/dataList章节下的
“serviceCode\”:\”hzero-lowcodedata\” -> “serviceCode\”:\”hzero-lowcode-data\”
\”databaseName\”:\”hzero_lowcodedata\” -> \”databaseName\”:\”hzero_lowcode_data\”
在 trail环境/客户运营试用租户/低代码平台/数据迁移/ 维护租户映射 当前租户 HPOMTRIAL 映射到 来源租户 lowcode_poc_tenant
上传导出文件DATA_20251009194450.zip,勾选自动导入,但不勾选自动发布(发布了不让删除,万一导入过程中有问题,想删除就麻烦了)
点击 【确认导入】,提示错误:当前服务的迁移配置为空, 请重新检查导出配置,不让导入。
但是如果直接上传没有修改过的压缩文件,是让导入的。那就是修改后重新压缩的格式,导入程序不认。
考虑到雷前之前直接在压缩文件中更改后导入程序是认的,研究压缩程序的差异,雷前用的是360压缩,我这把用系统默认压缩,默认压缩打开的文件是只读的,没法覆盖回去。
360压缩是可以的,先让雷前帮忙处理一下。
上传修改过的压缩文件,在 2.10版中的导入详情界面发现有目标领域映射和目标服务映射,但不可编辑。
询问低代码产品组庆生,回复是:这个是个配置问题,新的已经兼容了,但是还没有发版本,可以先在模型服务加一个配置:hzero.apaas.data-transport.include-services: hzero-modeler, hzero-lowcode, hzero-iam, hzero-platform, hzero-workflow,hzero-lowcodedata
在来源系统的模型服务的application.yml文件中 hzero.apaas 下面加配置:data-transport.include-services: hzero-modeler, hzero-lowcode, hzero-iam, hzero-platform, hzero-workflow,hzero-lowcodedata ,保存
执行 bash run.sh
进入数据迁移界面,发现hzero-iam服务显示为不可用,但实际上在eureka注册中心监控界面可以看到hzero-iam服务状态正常。问低代码开发组,反馈可能是hzero-iam服务的application.yml配置中没有允许数据迁移,看开放平台文档,需要添加:
hzero:
apaas:
data-transport:
enable: true
按要求编辑添加,然后执行 bash run.sh
再次进入数据迁移界面,已经没有hzero-iam服务不可用的错误了,执行导出,可以正常导出。
然后在trail环境执行导入,去掉自动勾选,界面可停留在导入数据源映射界面,但依然没法更改,跟产品组负责数据迁移的同事沟通,说是要升级到最新版本(trail环境得找太祥)
不过我已经在json源文件中更改了,也不用在这里重新映射了,所以不影响。
继续执行导入,报错:
导入失败, ### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry ‘58492f1ab87299eb9239e423aa648d36’ for key ‘hmde_table_u2’ ### The error may exist in org/hzero/modeler/physics/infra/mapper/TableMapper.java (best guess) ### The error may involve org.hzero.modeler.physics.infra.mapper.TableMapper.insertSelective-Inline ### The error occurred while setting parameters ### SQL: INSERT INTO hmde_table (creation_date, created_by, last_update_date, last_updated_by, object_version_number, id, code, type, table_category, datasource_id, name, description, tenant_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ### Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry ‘58492f1ab87299eb9239e423aa648d36’ for key ‘hmde_table_u2’ ; Duplicate entry ‘58492f1ab87299eb9239e423aa648d36’ for key ‘hmde_table_u2’
跟产品组负责数据迁移的同事沟通,说是来源系统的导出数据有问题, 可以在来源系统 低代码平台/物理模型/查看,应该有服务存在数据源未同步成功 的可能
查询发现hzero-platform服务存在此问题,default下面是, 说是需要点旁边单个小点菜单,选择 同步,但点击“同步”后报错:警告程序出现错误,请联系管理员
产品组负责数据迁移的同事说 ,hzero-platform 的application.yml文件中要添加配置,支持物理反扫,于是在application.yml中增加配置:
hzero.modeler:
tableScanEnabled:true
然后重启服务,再次刷新,再次点同步,依然报错,这次的错误是在hzero-platform 的服务日志中:
报错信息是:org.springframework.web.servlet.resource.NoResourceFoundException: No static resource v1/modeler/metadata/database/tables.
产品组负责数据迁移的同事说可能,hzero-platform的POM依赖配置不够,
添加依赖:

org.hzero.boot hzero-boot-modeler-driver 2.10.0-1.12.RELEASE
org.hzero.boot hzero-boot-modeler-client 2.10.0-1.12.RELEASE
保存后,运行 bash run.sh 重新构建jar包并启动服务,结果启动失败,报错信息:
java.lang.IllegalStateException: Error processing condition on org.hzero.boot.api.customize.CustomizeAutoConfiguration.customizeRepository
Caused by: java.lang.ClassNotFoundException: org.hzero.script.client.ScriptExecutorClient
猜测可能跟启动命令参数有关,考虑到workflow服务也是依赖了这两个组件可以正常启动,查看workflow的启动命令,比较下来两者的差异主要是platform服务的启动命令中少了license agent的引用。
把license agent选项在启动命令中加上,在重启服务,依然失败,报错信息跟原来一样,看起来跟license agent没有关系;
跟产品组沟通,反馈是飞搭用的 ScriptExecutorClient 跟H0用的ScriptExecutorClient有冲突。
所以在POM配置中还是把这两个依赖先去掉,否则服务起不来。
临时解决方案是:
直接在数据库更改hzero-platform的datasource , 这个问题在trail环境存在,另一个制造项目业存在,目前都是通过数据库层面datafix的方法解决的。
更改:hzero_modeler.hmde_datasource
update hzero_modeler.hmde_datasource set datasource_type=’MySQL’ where service_code in (‘hzero-platform’,’hzero-workflow’,’hzero-modeler’)
update hzero_modeler.hmde_datasource set schema_name =NULL , database_name=’hzero_platform’ where service_code= ‘hzero-platform’
然后在数据迁移处重新导出 领域
用wps压缩打开data.json进行编辑,关闭时会提示 “data.json已经更新,是否要同步更新到压缩包?“ 选择确认就好了。(备注:系统默认的zip压缩没有这种功能,那是只读的,不能更新到压缩包,如果你解压更改再压缩,格式就不能被识别了)
进入trail环境,平台层(即:hzero平台租户),再次进入数据迁移界面,执行执行导入数据,结果解析到90%的时候就卡住了,长时间过不去,于是就终止进程。
重新上传导入
这次没有上次那个错误了,但又除了一个新的错误,进度卡在导入 hzero-modeler 流程这一步:
导入失败, ### Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry ‘SYS_USER-SYS_USER_S_RULE1-0’ for key ‘hmde_bo_validate_rule_u1’ ### The error may exist in org/hzero/modeler/business/infra/mapper/BusinessObjectValidateRuleMapper.java (best guess) ### The error may involve org.hzero.modeler.business.infra.mapper.BusinessObjectValidateRuleMapper.insertSelective-Inline ### The error occurred while setting parameters ### SQL: INSERT INTO hmde_bo_validate_rule (creation_date, created_by, last_update_date, last_updated_by, object_version_number, validate_rule_id, tenant_id, business_object_code, rule_name, rule_code, rule_type, enabled_flag, rule_source_type, error_info_type, error_info, operational_flag, trigger_type, version) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ### Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry ‘SYS_USER-SYS_USER_S_RULE1-0’ for key ‘hmde_bo_validate_rule_u1’ ; Duplicate entry ‘SYS_USER-SYS_USER_S_RULE1-0’ for key ‘hmde_bo_validate_rule_u1’
跟产品组负责数据迁移的同事沟通,进入来源系统环境/低代码平台/业务对象/预置领域/用户/业务规则,发现里面有两条数据,其中一条是预置的,还有一条是自定义的。这不正常,正常应该只有一条预置的。
进入trail环境 看是只有一条,但类型也是自定义的,不是预置的。
解决方案:datafix ,把重复的那条自定义的删除掉。
delete from hzero_modeler.hmde_bo_validate_rule where validate_rule_id =19
然后在来源环境,租户层,租户管理员身份 再次执行导出
在目标环境,平台层,再次执行导入。
这次终于成功完成导入了。
验证导入的功能:
进入trail环境 的 客户运营试用租户,领域管理,看不到我们导入的领域。
进入trail环境的 平台租户 ,进入领域管理,也看不到我们导入的领域。
在trail环境 平台层管理员身份 进入 低代码平台/SQL执行器,检查领域是否被正确导入:
选择hzero_modeler数据库,执行
select * from hmde_domain where domain_code =’P_IPM’;
可以看到有数据,并且对应的tenantid=806
选择hzero_platform数据库,执行
select * from hpfm_tenant
可以看到tenantid=806的租户确实是我们的目标租户。
进入trail环境,平台层管理员角色,低代码平台/配置权限管理/分配权限
分配目标:按照分配目标所属租户筛选 ,选择 客户运营试用租户,选择租户管理员角色
授权领域:搜 知识产权,选择 POC演示-知识产权管理
保存后,进入 客户运营试用租户 ,进入低代码平台/低代码工作台 ,可以看到 导入的 POC演示-知识产权管理 这个领域了。
进入 这个领域,选择页面 :公司法体维护查询,进入设计器 点”预览” 报错:
操作失败
<公司法体>为虚拟组件,不支持数据查询,建议您前往设计器修改事件流节点
解决方法:把所有的业务对象批量发布一下,进入领域/业务对象, 右上角 [批量发布业务对象] ,每页显示50条,全部勾选20个业务对象,从左边移到右边,然后点【导入】,然后点右上角【业务对象发布情况】可以看到发布进度,等着,大约几分钟完成发布。
然后再次进入页面预览,这次就正常了。测试增删改。也正常。
菜单需要手工建立,先把一二级菜单目录建立好,然后在领域管理/页面 TAB页 做功能发布,选择对应的菜单目录,完成发布即可。
问题解决。
重要提示:导入工作需要切换到平台层,因为有些值集等数据都是平台层的,租户层权限不够。(感觉这个设计后面需要优化,假设一个SaaS的公司,A租户要导入一个应用不太可能取得平台层权限)

问题6:脚本事件的返回问题
问题现象:定义了一个脚本事件C_search_import , 用于调用启信宝API 获取公司的专利、软著等信息。
用AI写的,经过调试可以正常运行并获得正确结果。也可以被按钮调用,能正确获取信息并写入数据库。
但在测试例外情况时,比如特意把APPKEY参数名称写错,按照程序逻辑会抛出例外,但实际在前端执行日志中没看到任何错误,全部是成功。
分析:问题原因是前端执行日志主要用于查看性能分析,跟一般的执行环境不一样,要让前端执行日志看到错误就需要函数return返回具体错误,这需要定义脚本的输出参数(可以在脚本编辑界面点击“配置出入参”,在配置出参的地方,点“JSON维护”可以输入json格式的对象或者对象数组定义,然后解析下。
在配置完出参之后,在process() 一级例外处理处按照出参的json格式 return
测试发现脚本执行结果没有任何输出,跟开发环境上运行有输出的脚本对比,发现其他脚本函数都没有async关键字,而我这个是有的。
去掉async再试,提示脚本中有await ,去掉await再试就OK了,脚本调试的执行结果中就有输出了。也就是说当前飞搭的脚本执行器不支持获取async异步函数的retun内容,所以无法返回脚本执行结果。 要想获得脚本执行结果输出,就只能把函数去掉async,改成同步的。
但这么做引起的另一个问题是:如果去掉async,就不能在当前函数中用await 调用另一个异步函数了,但我最终要调用的启信宝API肯定是个异步函数,如果我不用await语句,我上层函数就无法捕获被调用函数抛出的例外(比如APPKEY错误)。程序逻辑就错误掉了。
而飞搭的脚本执行器不支持获取async异步函数的retun内容也是合理的,要想让脚本执行器返回脚本执行结果就要把函数改成同步的,所以还是要改AI写的代码.
AI改的代码方法就是如果不用await 那么就用.then/.catch 方式调用异步函数,但这种方法效果是一样的,同样不会等到异步函数处理完成再继续执行下面代码,同样导致return的数据是错误的(比如没有出例外的情况再最后return成功,出例外应该在例外处理的地方return 错误,但问题没有等待捕获例外就继续执行了,导致实际有例外错误也返回成功。
这个问题需要飞搭迭代功能支持脚本事件主函数支持async方式调用?
继续让AI想办法,它给出的方法是:
步骤 1:配置脚本出参(JSON 结构)
步骤 2:改写process函数(同步函数 + .then()/.catch()链)
关键逻辑说明
强制等待异步结果:通过.then()/.catch()将结果处理逻辑放入异步回调,确保只有 API 调用完成后才会执行return result,避免 “提前返回”。
统一出参格式:无论成功 / 失败,都通过配置的result对象返回,前端可通过success字段判断状态,通过error.message查看具体错误(解决 “前端看不到错误” 的问题)。
适配平台执行器:虽然process是同步函数,但Promise的回调会进入微任务队列,若飞搭执行器在结束前会等待微任务完成(多数平台会这样处理),则最终会捕获到.then()/.catch()中返回的result。
为什么这能解决问题?
规避async限制:process函数是同步的,符合平台对 “无async关键字” 的要求。
正确捕获异步错误:通过.catch()捕获 API 的所有错误(包括 APPKEY 错误),并写入出参的error字段,确保错误能被前端日志获取。
保证返回时机:.then()/.catch()会等待 API 调用完成后再执行return,避免 “不等结果就返回成功” 的逻辑错误。
关于平台迭代的建议
你提到 “飞搭是否需要迭代支持async主函数”,这确实是更根本的解决方案。
按照这个方法测试,确实可以解决问题。
总结:AI不知道我们的规范要求,所以它刚开始写的process函数就是async的,但这不符合飞搭返回出参的要求。
另外就是AI不能预见各种例外,所以我们测试后发现的各种例外还是要AI继续调整或者自己直接修改。
但AI确实可以帮我写好主要的大部分代码,我们只需要调整改进就好了。
后续要把飞搭写脚本的要求规则整理成AI能理解的文档,以后再写的时候作为上下文给到AI。

HZERO PaaS平台组装笔记(十四)HZERO 飞搭低代码开发安装验证

本文是H-ZERO 安装部署笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心- 《HZERO 轻量版》技术文档进行部署实践,选择快速开始->微服务版进行安装; 但作为初学者, 水平太低, 由于轻量版合并了多个微服务,要改各种配置,过程中遇到多个困难,没有搞定🙂, 后来按照 开放平台->社区与合作伙伴->文档中心- 《HZERO汉得企业级PaaS平台》 技术文档进行 标准版(没有合并微服务的版本) 安装部署实践 ,安装部署成功了。本系列文章记录了这个过程。 本文是安装后的低代码开发功能验证。

需要说明的是,如果不是出于学习研究目的,是不需要这么麻烦的,技术中心有发发行版,可以一键安装,一小时不到可以全部安装完成。

本系类文章是出于学习研究目的,按照技术文档从制品库里面拿各种零件进行组装,所以过程会比较繁琐,供学习研究参考。

实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04

飞搭低代码开发验证

1)新建低代码数据微服务

   低代码里面新建业务对象的时候,系统会自动创建物理表,这个物理表需要有落地的数据库,在微服务模式下,通常每个微服务对应一个数据库,为了管理清晰,我们通常会把新建的数据库对象放入一个独立的微服务对应的数据库中。为此我们要新建一个微服务,命名为ps-lowcodedata

   我们从model工程拷贝新建一个工程 ,编码为ps-lowcodedata

cd /d02/hzero-apaas/project

mkdir ps-lowcode-data

cp -rf ./ps-modeler/* ./ps-lowcodedata

可参考 开放平台/HZERO指导手册 /手工创建项目进行修改(父项目依赖保留apaas的parent ,mysql依赖保留,其他参考Hzero指导手册);

为了能够在飞搭新建领域的时候,能选择到这个微服务,我们需要在POM中添加依赖(参考开放平台/飞搭部署文档):

        <!– 作为领域服务需要 依赖–>

        <dependency>

            <groupId>org.hzero.boot</groupId>

            <artifactId>hzero-boot-modeler-driver</artifactId>

        </dependency>

        <dependency>

            <groupId>org.hzero.boot</groupId>

            <artifactId>hzero-boot-modeler-client</artifactId>

        </dependency>

在application.yml中我们给服务命名为hzero-lowcodedata, 数据源设置为hzero_lowcodedata;

spring:

  application:

    name: hzero-lowcodedata

  datasource:

    url: ${SPRING_DATASOURCE_URL:jdbc:mysql://db.hzero.com.cn:3306/hzero_lowcodedata?useUnicode=true&characterEncoding=utf-8&useSSL=false&useInformationSchema=true&allowPublicKeyRetrieval=true}

    username: ${SPRING_DATASOURCE_USERNAME:hzero}

    password: ${SPRING_DATASOURCE_PASSWORD:hzero}

然后在数据库里面创建一个hzero_lowcodedata的库,赋权给hzero用户;

mysql -u root -p

CREATE DATABASE IF NOT EXISTS hzero_lowcodedata CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

GRANT ALL PRIVILEGES ON hzero_lowcodedata.* TO ‘hzero’@’%’;

FLUSH PRIVILEGES;

EXIT;

Run.sh 中Agent去掉,其他保留;

修改完成后,启动服务,可在注册中心看到:

在飞搭新建领域的时候,选服务也可以选到了:

我们新建一个调研问卷的领域:

领域名称:调研问卷

领域编码:RSHQ

服务:hzero-lowcodedata

描述:各种调研问卷

领域图标:lingyu

然后新建一个业务对象:飞搭应用调研问卷

问题1、 建了一个业务对象,使用飞搭的通用导入功能,结果在上传导入文件时报错:数据上传失败;

分析:

检查页面,看网络部分调用,返回都是200 OK,不过最后一个API 调用返回的reponse是:
{

    “status”: “UPLOAD_FAILED”,

    “processing”: false,

    “percentNum”: 100,

    “batchNumber”: “9cb166baa41bc4cd8b54b33b3c5125cb”,

    “numbers”: [

查飞搭模型服务的日志,应该是调用hzero的file服务,应该是file服务出问题了。

2025-07-22T15:11:29.835+08:00 ERROR 7985 — [hzero-modeler] [ XNIO-1 task-2] .BusinessObjectImportTemplateServiceImpl : UPLOAD_FILE_ERROR

io.choerodon.core.exception.CommonException: 文件上传失败,请检查配置信息
at org.hzero.core.util.ResponseUtils.lambda$static$1(ResponseUtils.java:54) ~[hzero-starter-core-1.12.0.RELEASE.jar!/:1.12.0.RELEASE]
at org.hzero.core.util.ResponseUtils.getResponse(ResponseUtils.java:133) ~[hzero-starter-core-1.12.0.RELEASE.jar!/:1.12.0.RELEASE]
at org.hzero.core.util.ResponseUtils.getResponse(ResponseUtils.java:82) ~[hzero-starter-core-1.12.0.RELEASE.jar!/:1.12.0.RELEASE]
at org.hzero.boot.file.FileClient.uploadAttachment(FileClient.java:185) ~[hzero-boot-file-1.12.0.RELEASE.jar!/:1.12.0.RELEASE]
at org.hzero.boot.file.FileClient.uploadAttachment(FileClient.java:215) ~[hzero-boot-file-1.12.0.RELEASE.jar!/:1.12.0.RELEASE]
at org.hzero.modeler.business.app.service.impl.BusinessObjectImportTemplateServiceImpl.uploadFile(BusinessObjectImportTemplateServiceImpl.java:843) ~[hzero-modeler-2.9.1-1.12.BETA.6.jar!/:2.9.1-1.12.BETA.6]
at org.hzero.modeler.business.app.service.impl.BusinessObjectImportTemplateServiceImpl.importUploadField(BusinessObjectImportTemplateServiceImpl.java:783) ~[hzero-modeler-2.9.1-1.12.BETA.6.jar!/:2.9.1-1.12.BETA.6]
at

查file服务的配置,文件存储使用了mino服务,但因为之前没调试过,链接测试是失败的。

按照之前安装mino时的配置,更正这里的配置,让测试链接通过:

再次导入,成功了:

 问题解决。

我们并新建了一个租户,新建了了一个用户张三,赋予了新租户的租户管理员角色,然后在新的租户下面新建了一个领域:POC演示-知识产权管理。

在进行低代码开发时发现:

问题2、设计模式下点击附件字段时,提示权限不够的错误:“该用户没有此接口或值集的访问权限, 请联系管理员分配权限后访问

看起来是lowcode服务调用了hfile 的hfle/v1/2/lovs/sql/data服务,但用户张三没有配置该服务的权限。这个问题有点怪,默认应该给权限,而不是要额外去设置。

我们尝试切换到admin用户,就没有这个问题,确实是用户权限问题,但按理有租户管理员角色的用户默认应该有此权限,否则就是每个开发用户都要额外去配置权限了。

备注:另外虽然在设计时报这个错,但运行时是可以正常工作的。

针对问题2:

研发团队提醒可能是LOV和报表鉴权问题,建议按飞搭部署文档要求改一下:

解决方案尝试:参考飞搭部署文档要求:

HZERO1.10.3或1.11.0以上版本可在HZERO网关服务的yml中添加启动参数,默认跳过Lov和报表鉴权

# 是否开启请求头参数 H-AS-Check 鉴权

hzero:

gateway:

helper:

# 是否开启请求头参数 H-AS-Check 鉴权

encryption:

enabled: true

但经过测试,这个方法无效,我们更改了yml配置文件,重启了网关服务,问题依旧,然后我们让飞搭服务也重启了,页面字段删掉重新保存 ,问题依然存在。

然后搜索开放平台文档,在飞搭的FAQ中发现类似问题,飞搭给的解决方案第二种是:

按照这种方法试验了一下,问题依然存在。

备注,在飞搭2.9的部署文档中,飞搭后端工程部署/HZERO服务调整 章节,其他调整都OK,但针对platform的调整,增加对hzero-apaas-common的依赖没有问题,增加对hzero-boot-modeler-driver和hzero-boot-modeler-client的依赖会导致服务启动失败。 本来增加这两个依赖的目的是让platform服务能成为飞搭新建领域时能成为可选微服务。但实际上也没必要,因为我们自定义的领域通常都会选择lowcodedata服务作为基础微服务的。 把platform也作为自定义领域的可选微服务反而不好,违背了微服务的数据隔离原则。

问题3:Master-Detail界面,保存明细出错:在专利授权申请界面,填入专利授权明细,然后先保存明细,再保存头记录会报错:

然后从列表页,进入Form页详情的时候也会报这个错;

去数据库查看,发现专利授权明细表里面,没有保存父表的记录ID,是空的。

同样的问题在公司法体的明细子记录操作上也存在:

分析:

虽然两个主从表结构的明细表中都没有保存跟主表主键关联的字段值,但两者还是不一样,在第一个例子中,他会报加密后的主键的错误,那是因为明细表中关联字段的类型不是“关联关系”类型的,而是整数型的,这违背了设计者的期望,所以就报错; 解决方案就是把明细表上的关联字段在业务对象上更改为“关联关系”类型;

第二个例子中,确实明细表的业务对象上关联字段设置为“关联关系”类型的,所以没有报错,但为什么也没有存储到数据库?

那是因为,表单设计时,在明细列表中没有把这个关联字段放到界面上去,并且没有设置默认值,所以平台没有保存具体的值到数据库;解决方案是:你需要把这个字段放到界面上去,然后显示模式设置为隐藏,然后再给这个字段设置默认值,这样就会保存到数据库了;

你如果不这样做,低代码的设计者不会自动为这个字段赋值,并保存。这个设计感觉是个缺陷,因为已经建立了主从关系,当明细表新增记录的时候,低代码平台应该自动赋值默认值,而不应该再要求低代码的开发人员再去把这个字段放到界面上,并一定要设置这个字段的默认值才实现保存。 这样做增加了低代码开发人员的工作量。

其他实践发现:
1、如果你在明细对象已经设置了“关联关系”类型的字段,关联了主表的主键,那么在界面设计时增加明细列表组件的时候,平台会自动为你创建master-detail的页面关系,不需要手工创建。

2、在Master-detail 关系的界面中,如果你要控制明细行上有LOV配置的字段的选择内容根据主表记录的某个字段值进行过滤,那么可以通过在这个字段属性-“数据范围控制”来设置。

  1. 在保存头记录的时候,并不会自动保存行记录,需要在按钮行为的生效关系中把之前定义的主从关系加上,加上后点击主记录的保存,会同时把子记录的保存也执行了。

问题4:我们在点击 业务对象的值列表时报错:程序出现错误,请联系管理员

后台模型服务日志中有错误的详细情况:

  • 异常信息​:
    io.choerodon.core.exception.CommonException: 程序出现错误,请联系管理员
    触发位置:TableModelMetadataHandlerRedisImpl.loadModelCacheFromDb()。
  • 直接原因​:
    在尝试从数据库加载模型缓存时,ResponseUtils.getResponse()方法调用失败(可能因数据库查询异常、缓存数据不完整或Redis连接问题)

问题5:新建前端自定义脚本报错:数据不存在。

分析:点击脚本分类值列表,发现是空的,但看上去有默认值“自定义分类” 实际上这个默认值是假的,空的;

添加值列表的值之后,再确定,问题就解决了。 问题已反馈给产研,作为Bug解决修复。

问题6:执行自定义脚本时报错:pool没有初始化

分析,看你起来这个错误是lowcode服务报的错误,把错误信息给AI知识库,回答的信息产品组看了之后,全是错误的,都是回答H0规则引擎相关的东西,跟实际原因和解决不搭边。

产品组说实际原因之前安装部署时 漏掉了飞搭客户端部署这个步骤,是要参考开放平台飞搭文档进行进行飞搭客户端部署:

我们的错误发生在lowcode服务中,所以我们要在lowcode服务的application.yml中增加客户端配置。

实际执行:

我们按文档在lowcode 服务的POM添加了下面这两个引用之后,服务启动就失败了:

            <dependency>

                <groupId>org.hzero.boot</groupId>

                <artifactId>hzero-boot-modeler-driver</artifactId>

            </dependency>

            <dependency>

                <groupId>org.hzero.boot</groupId>

                <artifactId>hzero-boot-modeler-event-driver</artifactId>

            </dependency>

Error starting ApplicationContext. To display the condition evaluation report re-run your application with ‘debug’ enabled.
2025-08-15T11:05:03.015+08:00 ERROR 62965 — [hzero-lowcode] [ main] o.s.boot.SpringApplication : Application run failed

回撤,恢复原状,正常重启lowcode 服务,服务恢复正常。

然后再尝试再lowcodedata服务中添加这两个引用后重启,服务启动成功,OK,那就用lowcodedata服务 当作客户端服务试用吧。

更改lowcodedata服务的application.yml文件,按要求添加飞搭客户端服务配置,再次重启成功。

再回到执行脚本的地方,点击按钮,执行脚本,这次没有报“pool没有初始化”的错误,看起来脚本是被执行了。

看执行日志,也确实被执行了:

但是没有按照我们预期的产生结果,我们预期是从启信宝查询公司的商标信息,导入到本地的公司商标信息对象中,但实际上没有出现这样的结果。

在前端只能看到成功执行了脚本,并不能看到脚本执行的明细,去lowcodedata服务的日志中看到一条提示:

开始处理公司: 上海汉得信息技术股份有限公司 的商标信息

处理过程中发生错误: require is not defined

上面这条提示是我们在脚本中打的log , 看起来脚本执行遇到问题了,提示错误是“require is not defined”

我们再到model服务中看看,是否能找到更多线索。。。 没有找到。

那我们怎么查问题呢? 最土的办法就是去脚本里面多打几处日志,定位问题发生的位置。

AI写的代码中进行MD5加密处理的时候require了一个通用库,这个库脚本引擎不支持,所以报了“ require is not defined”错误,

改成在线编辑中插入函数,查找md5, 用了H0.Tenant.DataSecurityHelper.md5

方法,运行后继续报错: 处理过程中发生错误: _h0_data_encrypt is not defined

跟产品组沟通了,检查了运行客户端的lowcodedata服务的yml配置文件,没啥问题,他自己的飞搭2.9适配hzero 1.12环境中没有复现该错误,于是建议我升级到新的版本,从2.9.1-1.12.BETA.6 升级到2.9.1-1.12.BETA.8

我把modeler,lowcode,lowcodedata三个服务全部升级到了2.9.1-1.12.BETA.8,就正常执行了,后台服务日志中显示正确反馈了md5加密结果:

进入getIntellectualPropertyStat() sign=  5bb8e4aa0bb5fc9c19a0c43403a79951

不过接着又报了错误:

处理过程中发生错误: require is not defined

看来还有地方是AI写的代码 require 了什么内容,得继续寻找修改, 是requestAPI方法里面,AI代码 const request = require(‘request’); 因为飞搭脚本运行环境不支持所以报错,替代方法是飞搭提供了BASE.HttpClient.doGet(url,header,body) 四个API可以替代,于是就把飞搭提供的四个API的介绍全部给了豆包,让豆包重写了requestAPI方法。

重写之后可以用,后面碰到要用request的地方也都让豆包重写了,脚本可以从启信宝获取到商标信息,然后就是往业务对象中插入,刚开始用http 调用,因为通过网关调用需要token,否则也会报权限错误,但脚本环境没有获取当前用户token的API,产品组建议改成feign调用,可能是种子数据有问题,我的环境中缺少feign调用的例子文档,产品组给了个例子,按照例子调用报错误:

Feign调用批量更新失败: Cannot read property ‘selectClient’ of undefined

处理过程中发生错误: 批量更新失败: Cannot read property ‘selectClient’ of undefined

跟支持组同事沟通了一下,他说有些功能在租户不支持,到平台层才支持,建议试试平台层,于是在平台层去新建了一个内容一致的脚本,配置入参后发布,在租户层调用,结果系统没有任何报错,但也实际没有执行脚本。 前端页面日志显示成功完成了事件的整个流程,但实际执行一闪而过,后台服务也没有任何痕迹。很奇怪。

所以尝试下来平台层也解决不了这个问题。

再回到租户层的脚本使用,至少后服务中能看到整个执行的日志,也确实能看到成功获取到了启信宝的商标信息。

接下来,换方法,让AI直接用脚本函数来插入内容到业务对象,而不是使用飞塔提供的业务对象的增删改的API了。

经测试已经成功了。

问题7:在页面编辑界面/取值/复合取值,写了一个除法取值的公式后校验未通过,一直报错:括号未正确匹配

分析:看其他复合取值是可以成功校验通过的,仔细比较发现报错的原因是界面字段名称包含了中文的括号。

这是作为bug处理 还是不作为Bug,但要在帮助文档中做重点提醒?

问题8:在页面编辑界面/取值/复合取值,支持if语法,但提示 else关键字无法识别;

分析:

我是在if 条件满足的{}里面加了分号的,所以遇到这种问题了,产品组说支持if else, 但不支持加分号的多条语句。

也就是相当于仅支持单行的if else;经测试,简单的可以,但复杂的不行,会报错“无法解析字符”但同样的表达式,三元操作是可以的:

解决方法:用三元操作替代:

问题9:在页面编辑界面点保存按钮时报错:[valuePaths[12].value 长度需要在0和1200之间; ]

分析:在页面编辑界面/取值/自定义取值 处,有个自定义取值的设置的JS代码字符数超过了1200, 删掉大多数代码,仅保留少数代码后界面保存成功。

那么1200个字符数控制是否太少了?下面这段自定义取值代码业不长,字符数已经达到1743个了。

产品组说应该是后端限制了,让后端加大长度限制。

问题10:飞搭如何实现类似明道云表单编辑界面的规则配置?

比如当某个字段值为A的时候,要隐藏一批界面上的字段,同时显示一批字段,并让一批字段只读。

分析,目前没有完全一样的功能,但可以变通实现,方法如下:

  1. 先建“条件”,把“条件”当规则用。
  2. 点击界面上任何一个字段,可以在右边属性页看到“批量操作”。
  3. 在“批量操作”界面,选择一批字段进行“批量属性设置”,并选择启动这些属性设置的“条件”。(按类型分几次操作,比如隐藏的一批操作一次,显示的一批再操作一次,只读的一批再操作一次)
  4. 打开“条件”编辑界面,选择依赖查询(条件右边的三个小点停留一会显示菜单里面能看到这个“依赖查询”),可以看到该条件下所有的依赖(也就是引用到该条件的地方),实际上相当于看到了该“条件”规则下所有影响到的各种设置和改变。

备注:

发现问题1: 就是字段按条件显示/隐藏 的属性设置,只能设置一条规则,但实际需求是两条规则,即:当满足条件A时隐藏,当满足条件B时显示。这个怎么设置?

跟产品组沟通了一下,这个没问题,对于这种非此即彼的二选一类型的属性,一旦设置条件,那么不满足组条件的自然就是相当于设置了反面条件。

发现问题2:想批量撤销之前的一批字段的属性设置(比例批量取消3个字段的条件只读属性设置),目前看还不行,尝试了批量操作里面的“重置”没起作用。

临时解决方案是逐个取消。

问题11:写了一段用H0.Tenant.ModelerHelper.selectList 获取记录的JS脚本,用到查询条件>=, AI写的代码用的比较操作符是“GREATER_EQUAL” 运行后报错,提示这个比较操作符不被支持。

又改成“GE”,“GREATER_OR_EQUAL” 还是报错:”localizedMessage”: “Operator type [GREATER_OR_EQUAL] not supported”,AI能建议的就这几种,都不行。

分析:产品组沟通提示用这个方法的示例上面的配置条件功能配置查询条件,然后点“插入”生成代码,看看用的是什么操作符。

经测试,用的是 GREATER_THAN_OR_EQUAL_TO ,难怪AI试来试去都不对。

建议以后写代码的时候都用 系统提供方法的 配置插入的功能。

问题12:计算结果字段跟被计算字段不能联动

问题详细描述:我有字段A,B,C,设置C字段的默认值是符合取值 =A/B ,但A或者B字段的值改变的时候,发现C的值没有跟随联动。

分析:跟产品组沟通,产品组说需要在A字段和B字段上建立 “值改变”的触发器,在出发器中给C赋值为复合取值。

如果符合取值的计算字段涉及了5个以上字段的计算,则实现联动就非常麻烦,需要在5个字段上添加触发器。

当前解决方案:通过触发器实现,希望将来低代码产品能自动联动,无需开发人员再设置触发器(目前市场上主流低代码平台都是这么实现的)

问题13:打开详情页面,由于默认宽度比较窄,显示太拥挤了。

分析:打开详情页面虽然是平台默认功能,无需开发即可实现,但实际也是平台自动帮忙写了一个按钮触发器,调了一个跳转至详情页的事件流,事件流里面调用了一个“页面弹窗”的节点,在这个节点配置中可以看到默认的详情页宽度是800像素。

解决方案:调整默认节点配置中宽度像素到合理的值,比如可以选择百分比,设置为80%;

问题14:设计了一个移动页面,预览时提示“抱歉,你访问的页面不存在”

分析:可能是飞搭移动端部署没完成。

在 开放平台/社区与合作伙伴/文档中心/汉得aPaaS平台-飞搭/本地化部署&升级/飞搭移动端部署 这个章节有具体指导。

一、依赖安装

cd /d02/hzero/front/front

cp package.json package.json.bak20251030

yarn add apaas-mobile-provider@release -W –registry=http://nexus.saas.hand-china.com/repository/hzero-npm-group/

Done in 14.27s.

yarn add @hips/plugin-usein-hzeroapp -W -D –registry=http://nexus.saas.hand-china.com/repository/hzero-npm-group/

Done in 16.19s.

执行后查看package.json 发现 “apaas-mobile-provider”: “^2.4.1” 文档说建议2.6.X最新版本,需要更改成 ~2.6.0 ,更改后再次yarn

yarn

Done in 14.34s.

  • 环境变量配置:

更改  \d02\hzero\front\front\config\config.ts

添加:

      MOBILE_PREVIEWER_HOST: ‘BUILD_MOBILE_PREVIEWER_HOST’,

      FEIDA_MOBILE_ACCESS_URL: ‘BUILD_FEIDA_MOBILE_ACCESS_URL’,

      AMAP_KEY: ‘BUILD_AMAP_KEY’,

      AMAP_JSCODE: ‘BUILD_AMAP_JSCODE’,

      AMAP_SERVICE_HOST: ‘BUILD_AMAP_SERVICE_HOST’,

      VUE_APP_HTTP_BASE_URL: ‘BUILD_HWKF_MOBILE_PREVIEWER_HOST’,

      FEIDA_MOBILE_MF_URL: ‘BUILD_FEIDA_MOBILE_MF_URL’

  • 依赖构建配置

更改  \d02\hzero\front\front\config\config.ts

添加:

  plugins: [

    require.resolve(‘hzero-front’),

    ‘@hips/plugin-usein-hzeroapp’,

  ],

  hzeroUseHips: [

    {

      import: { name: ‘apaas-mobile-provider’, distDir: ‘dist’ },

      export: { name: ‘mobile-provider’, distDir: process.env.BUILD_DIST_PATH },

      usage: “command”,

      env: {

        HttpBaseUrl: ‘BUILD_MOBILE_API_HOST’,  // 移动端基地址

        ClientId: ‘BUILD_CLIENT_ID’, // clientId,与 PC 使用同一个变量即可

        AMapKey: ‘BUILD_AMAP_KEY’, // 仅当需要使用地图组件时需要

        AMapJsCode: ‘BUILD_AMAP_JSCODE’, // 仅当需要使用地图组件时需要

        AMapServiceHost: ‘BUILD_AMAP_SERVICE_HOST’, // 仅当需要使用地图组件时需要

        ApaasMFUrl: ‘BUILD_FEIDA_MOBILE_MF_URL’, // 提供给工作流的 MF 组件访问地址

        AIGCBaseUrl: ‘BUILD_AIGC_HOST’, // 使用 AIGC 相关能力需要

      },

    },

  ],

更改\d02\hzero\front\front\package.json

添加:

    “build:mobile”: “cross-env UMI_ENV=prod BUILD_DIST_PATH=./dist node ./node_modules/umi/bin/umi.js build-hips-subapp”

更改后执行:

yarn run build:app

Done in 7.33s.

再执行yarn build:mobile

Done in 2.11s.

更改 /d02/hzero/front/enterpoint_replace.sh

添加:

BUILD_MOBILE_API_HOST=”http://gateway.hzero.com.cn:8080″

BUILD_MOBILE_PREVIEWER_HOST=”http://dev.hzero.com.cn”

BUILD_FEIDA_MOBILE_ACCESS_URL=”http://dev.hzero.com.cn/mobile-provider/”

BUILD_AMAP_KEY=””

BUILD_AMAP_JSCODE=””

BUILD_AMAP_SERVICE_HOST=””

BUILD_FEIDA_MOBILE_MF_URL=””

sed -i “s#BUILD_MOBILE_PREVIEWER_HOST#$BUILD_MOBILE_PREVIEWER_HOST#g” /d02/hzero/front/dist/index.html

sed -i “s#BUILD_FEIDA_MOBILE_ACCESS_URL#$BUILD_FEIDA_MOBILE_ACCESS_URL#g” /d02/hzero/front/dist/index.html

sed -i “s#BUILD_MOBILE_API_HOST#$BUILD_MOBILE_API_HOST#g” /d02/hzero/front/dist/index.html

sed -i “s#BUILD_MOBILE_API_HOST#$BUILD_MOBILE_API_HOST#g” /d02/hzero/front/dist/packages/mobile-provider/index.html

sed -i “s#BUILD_AMAP_KEY#$BUILD_AMAP_KEY#g” /d02/hzero/front/dist/index.html

sed -i “s#BUILD_AMAP_KEY#$BUILD_AMAP_KEY#g” /d02/hzero/front/dist/packages/mobile-provider/index.html

sed -i “s#BUILD_AMAP_JSCODE#$BUILD_AMAP_JSCODE#g” /d02/hzero/front/dist/index.html

sed -i “s#BUILD_AMAP_JSCODE#$BUILD_AMAP_JSCODE#g” /d02/hzero/front/dist/packages/mobile-provider/index.html

sed -i “s#BUILD_AMAP_SERVICE_HOST#$BUILD_AMAP_SERVICE_HOST#g” /d02/hzero/front/dist/index.html

sed -i “s#BUILD_AMAP_SERVICE_HOST#$BUILD_AMAP_SERVICE_HOST#g” /d02/hzero/front/dist/packages/mobile-provider/index.html

sed -i “s#BUILD_CLIENT_ID#$BUILD_CLIENT_ID#g” /d02/hzero/front/dist/packages/mobile-provider/index.html

sed -i “s#BUILD_FEIDA_MOBILE_MF_URL#$BUILD_FEIDA_MOBILE_MF_URL#g” /d02/hzero/front/dist/packages/hwkf-mobile/index.html

sed -i “s#BUILD_FEIDA_MOBILE_MF_URL#$BUILD_FEIDA_MOBILE_MF_URL#g” /d02/hzero/front/dist/packages/mobile-provider/index.html

sed -i “s#BUILD_AIGC_HOST#$BUILD_AIGC_HOST#g” /d02/hzero/front/dist/packages/mobile-provider/index.html

更改:/d02/hzero/front/front/src

添加:
const configureParams = () => ({

  showMobileUedConfig: true, // 开启用户主题配置页面移动端配置显示

});

export default { configureParams };

  • 部署替换

cd /d02/hzero/front/front

bash apply_update_to_runtime_env.sh

replace complete!

五、修改Ngnix配置

cd /etc/nginx/sites-available

cp default default.bak20251030

编辑default,添加:

location ^~ /mobile-provider {

    root /d02/hzero/front/dist/packages;

    try_files $uri /mobile-provider/index.html;

}

然后修改default , 然后重启nginx , 然后再次运行

  • 启动服务,再次预览移动端界面

从功能第一个List主页面进入,再打开表单页可以正常预览,直接进第二个页面还是不能正常预览,不过在清掉缓存后再打开就可以了:

问题解决。

问题15: 详情页面参数用模糊查询可以,但精确查询不行。

详细描述:把检测报告的移动端详情页面设置为功能首页,然后公开分享移动端功能,得到一个公开分享链接:

http://dev.hzero.com.cn/mobile-provider/?publicCode=5de5ac21-c476-4c1e-961d-4511d6a93ff7

更改详情页面的脚本事件-详情查询,把查询条件从主键改成报告编号(在取值界面 新增页面参数 repNo 表示报告编号),查询条件为 等于

拼接分享链接,加上&repNo=ACS20240921001

http://dev.hzero.com.cn/mobile-provider/?publicCode=5de5ac21-c476-4c1e-961d-4511d6a93ff7&repNo=ACS20240921001

http://dev.hzero.com.cn/mobile-provider/?publicCode=5de5ac21-c476-4c1e-961d-4511d6a93ff7&editFlag=false&repNo=ACS20240922002

测试发现查询内容为空。但是如果把查询条件改成模糊匹配, 则能查询出该报告编号对应的内容。这是问什么呢? 经过试验,原来是参数名区分大小写!

问题16: 如果要打印很逼真的标签,现有的标签打印管理功能排版不方便。

分析: 目前的标签打印管理主要使用与简洁的条码或者二维码标签打印。如果要打印很逼真的标签,比如能效等级标签,建议用RTF模板,如果其中含有二维码,可以参考文档  汉得焱牛开放平台/社区与合作伙伴/文档中心/HZERO汉得企业级PaaS平台/1.10.3 RELEASE/服务列表/报表平台/开发者指南/高级操作/定义模板文件/RTF模板/二维码。

在report 服务的application.yml中已经配置了    

# 二维码生成url

qrCodeUrl:${HZERO_QR_CODE_URL:${hzero.gatewayPath}/hrpt/v1/codes?text=}

所以在RTF模板中,设置一个图片占位符,在设置图片格式的可选文字中,设置url:{concat(QR_CODE_URL,MESSAGE_CODE)} 即可,其中Message_code 就是一段要转成二维码显示的字符串,在这个需求场景中就是 移动页面共享链接带查询报告编号的URL

测试:word2016 , 按文档提示在图片的可选文字加上内容之后,报表预览不显示任何内容,应该是后台处理出错了。

报表服务的后台日志显示:

at java.base/java.lang.Thread.run(Thread.java:842) ~[na:na]

Caused by: oracle.xml.xslt.XSLException: <Line 74, Column 229>: XML-22013: (Error) Error in expression: ‘concat(QR_CODE_URL,<?mbSharelinkErcode?>)}’)’.

把日志中相关错误信息给豆包,豆包分析认为:问题点在于:在 XSL 的concat函数中,使用了 <?manufacturerName?> 这种 XML 处理指令(PI)格式 来引用变量,但这是不符合 XPath 语法的。XSL 中引用数据变量应使用 XPath 表达式(如 /DATA/ROW/mbSharelinkErcode),而非 XML 处理指令(<? … ?> 格式仅用于 XML 解析器的指令,不能直接作为变量引用)。

按照豆包建议修改后:

实际测试,

使用 normalize-space(/DATA/ROW/mbSharelinkErcode) or ‘default’ 生成的二维码不对。不是我们期望的移动页面链接地址

使用url:{concat(‘http://dev.hzero.com.cn:8080/hrpt/v1/codes?text=’,/DATA/ROW/mbSharelinkErcode)} 生成的二维码可以打开移动页面,但是移动页面未查询到指定记录。

查看 数据集 对应的例子xml输出,mbSharelinkErcode 是含有报告编号参数的:

<data>

<row>

<mbSharelinkErcode>http://dev.hzero.com.cn/mobile-provider/?publicCode=5de5ac21-c476-4c1e-961d-4511d6a93ff7&repNo=ACS20240922002</mbSharelinkErcode>

</row>

</data>

但是生成的二维码为什么就不含报告编号参数呢? 是生成二维码的API问题?

尝试把值直接替换进去试试:

http://dev.hzero.com.cn/mobile-provider/?publicCode=5de5ac21-c476-4c1e-961d-4511d6a93ff7&repNo=ACS20240922002

http://dev.hzero.com.cn:8080/hrpt/v1/codes?text=http://dev.hzero.com.cn/mobile-provider/?publicCode=5de5ac21-c476-4c1e-961d-4511d6a93ff7&repNo=ACS20240922002

发现这个二维码实际解析出来的地址确实丢了后面的报告编号参数:

二维码解析出来的内容就是http://dev.hzero.com.cn/mobile-provider/?publicCode=5de5ac21-c476-4c1e-961d-4511d6a93ff7

也就是说这个二维码生成API有bug ,这个事如果不去改API,有什么方法能绕过这个Bug吗?

豆包认为 问题出在URL 参数的转义处理上:当mbSharelinkErcode的值本身包含&符号(如&repNo=…)时,直接拼接进codes?text=后面会被解析为新的 URL 参数分隔符,导致&repNo=…被二维码生成 API 误判为codes接口自身的参数,而非text参数的一部分,从而被截断。

解决方法:对 URL 进行URL 编码(Percent-Encoding)

需要将mbSharelinkErcode的值进行 URL 编码,把特殊字符(如&、?等)转换为编码后的形式(&→%26,?→%3F),确保整个链接作为text的完整参数传递。可以用encode-for-uri进行转移,比如:

<fo:external-graphic

  src=”url(‘{concat(‘http://dev.hzero.com.cn:8080/hrpt/v1/codes?text=’, encode-for-uri(/DATA/ROW/mbSharelinkErcode))}’)”

  …

/>

按照豆包的方法修改测试可行。

====

另外我们看数据集的例子输出xml

<DATA>

<QR_CODE_URL>${hzero.gatewayPath}/hrpt/v1/codes?text=</QR_CODE_URL>

<ROW>

….

</ROW>  

可以看到QR_CODE_URL这个字段是存在数据集中的,是报表服务自动加上去的,之前文档上直接用这个字段是不行的,文档中给的例子是:url:{concat(QR_CODE_URL,MESSAGE_CODE)} ,那么我们改成带路径的是否可以呢?试试:

url:{concat(/DATA/QR_CODE_URL,encode-for-uri(/DATA/ROW/mbSharelinkErcode))}

测试结果也是后台报错:

2025-11-02T13:32:40.229+08:00  WARN 3266 — [hzero-report] [  XNIO-1 task-2] oracle.xdo                               : java.io.FileNotFoundException: /d02/hzero/project/ps-report/target/${hzero.gatewayPath}/hrpt/v1/codes (No such file or directory)

看起来带路径之后,字段内容是正确获取到了,但hzero.gatewayPath没有被正确替换,说明还是有bug;

算了,还是改回直接可用的吧:

url:{concat(‘http://dev.hzero.com.cn:8080/hrpt/v1/codes?text=’,encode-for-uri(/DATA/ROW/mbSharelinkErcode))}

模板设计:

标签报表生成:

扫描二维码之后显示的移动页面。

备注,刚开始RTF模板做的标签打印无法正常显示,以为是 是RTF文档格式问题,按照帮助文档提供的BIPubliser地址链接到Oracle网站下载,但发现Oracle最新版的已经不叫BIPublisher,要下载之前版本的才有BiPublisher, 如果下载bupublisher 10g desktop, 提示要安装JRE, 于是下载bipublisher 11g, 这里面有两个版本,64位和32位的,安装64位的,提示要安装32位的,安装32位的提示要先安装JRE16以上 版本,去Oracle网站下载,16以上没有JRE,只有JDK,下了个JDK, 按照AI提示linke了JRE,然后配置环境变量设置JAVA_HOME 和Path,但重新安装Bipublisher的时还提示要安装JRE,AI说可能是版本问题,因为安装的JDK是64位的,32的BiPublisher可能要去找32的JRE,所以就去找32的JRE16以上的版本,发现没有,说是Oracle自Java11之后就不再提供32的版本了,所以必须用64位的,看了安装的word 2016之前是32的,于是就重新安装64的, 然后想着这次安装64的BIPublisher应该允许了,不会提示我再去安装32的了,可惜,即使office从32位换到了64位,安装64位的BIPubliser的时候依然提示要求装32位的BIPublisher,没办法,那干脆下载全套 BI Publisher 10.1.3.4.2 for Windows (32/64 bit) ,这个下载很慢,等着…

下载这个安装后有很多rtf模板的例子, 这个可以参考下,至于是否一定要用BiPublisher Desktop for Office的插件,我看未必,现在xsl-fo 相关语法问题都可以直接问豆包,元宝之类的AI , 那个biPubliser 都是很多年前的版本,跟最新版本的Office 和Java JRE版本的兼容都有问题,要打一个版本匹配的组合,将来会是个麻烦问题,因此能不用就不用了。

另外,多次测试过程中还碰到后台报表服务报内存溢出的错误:

jakarta.servlet.ServletException: Handler dispatch failed: java.lang.OutOfMemoryError: Java heap space

解决方案: 把内存从400M调整到800M;

总结:如果有类似需求:

工厂机器能效检测报告,检测完成后需要打印对应的能效等级标签,标签贴到机器上,购买机器的用户扫描标签上的二维码,可以看到该机器的详细能效官方鉴定信息,这个详细信息的布局是适配手机移动页面的。

解题步骤如下:

  1. 新建业务对象 [能效检测报告]
  2. 新建 PC布局页面
  3. 新建 移动布局页面,表单类型,新建完成后自动生成列表查询页面和详情页面。并生成一个移动页面功能。把表单详情页设置为功能首页。
  4. 设置 移动布局页面 功能的公开分享链接
  5. 在移动布局页面的 表单详情页/取值/页面参数 中添加参数:报告编码 repNo (注意大小写)
  6. 更改移动布局页面的 表单详情页 的事件流/详情查询,把查询条件从默认的主键ID 改成报告编号,等于参数报告编码 repNo (注意大小写)

7、在业务对象【能效检测报告】上添加一个字段:<移动报告公开分享链接>, 取值来源: 复合取值 ,合并 移动布局页面功能的公开分享链接 和 &repNo=数据域的报告编号

8、在业务对象 [能效检测报告] PC布局页面添加一个按钮【打印能效标签】,调用标签报表打印功能

9、制作标签报表的RTF模板,使用表格布局,图片+背景设置使得设计跟我们看到的冰箱空调上的能效等级标签类似。其中的二维码部分,使用一个任意图片作为占位符,控制显示大小和位置,使用微软的Word编辑图片的”可选文字“,可选文字中输入类似这样的字符串:

url:{concat(‘http://dev.hzero.com.cn:8080/hrpt/v1/codes?text=’,encode-for-uri(/DATA/ROW/mbSharelinkErcode))} 这里的mbSharelinkErcode就是对应的字段:<移动报告公开分享链接>

http://dev.hzero.com.cn:8080 是服务器网关地址。

备注:要用微软Word才能编辑图片的可选文字,WPS没有这个功能。如果曾经被WPS编辑保存过,导致可选文字无法显示,那么用Word再打开,先另存为docx 把格式改过来,再另存为RTF就有了。

  1. 定义数据集和报表
  2. 按钮的响应时间中国调用报表。

完成。

问题17: 报表平台/标签打印管理 ,如果模板类型选择 富文本,则编辑模板时会白屏,一直转圈,检查发现前端错误:

plugin.js:1  Uncaught SyntaxError: Unexpected token ‘<‘

ckeditor.js:267  Uncaught TypeError: Cannot read properties of null (reading ‘icons’)

    at Object.<anonymous> (ckeditor.js:267:254)

    at Object.<anonymous> (ckeditor.js:266:243)

    at x (ckeditor.js:261:193)

    at Array.y (ckeditor.js:261:336)

    at z (ckeditor.js:261:420)

at ckeditor.js:262:360

分析:因为我们用清透主题时,已经升级了hzero-front的版本,这个可能是报表服务的前端版本没有升级,检查 /d02/hzero/front/dist/packages/hzero_front_hrpt/package.json ,看到版本是  “version”: “1.12.2”, 应该说是挺新的,查nexus 制品库,看看有没有更新的版本:

https://nexus.saas.hand-china.com/service/rest/repository/browse/hzero-ui/hzero-front-hrpt/

https://nexus.saas.hand-china.com/ 搜hzero-ui , 进入查找 hzero-front-hrpt , 以html方式预览,可以清晰的看到时间,发现1.12.2 已经是最新的了,没有更新的了。

hzero-front-hrpt-1.12.2.tgzFri Sep 12 07:26:03 Z 20256699748 

看起来不是升级的事了,问下前端架构组吧,看是什么原因,怎么解决 ,这个问题在trail环境也存在,但是在开发环境不存在,开发环境是正常的。

跟前端架构组沟通,反馈是:之前是因为 hzero-front 里配置加了个 ckeditor 插件  但是 ckeditor 里边没有  会报这个错  但现在用这个 hzero-front 应该没有这个问题的,建议升级到 hzero-front@1.12.3-beta-international.2 hzero-boot-public@2.1.58-alpha.0 再测试。

编辑 /d02/hzero/front/front/package.json

    “hzero-front”: “1.12.3-beta-international.2”,

yarn

Done in 19.91s.

编辑 d02\hzero\front\front\node_modules\hzero-front\package.json

 “hzero-boot-public”: “2.1.58-alpha.0”,

cd d02\hzero\front\front\node_modules\hzero-front

yarn

[5/5] Building fresh packages…
success Saved lockfile.
$ node ./postinstall/index.js
$ npm run transpile:umi && npm run transpile

> hzero-front@1.12.3-beta-international.2 transpile:umi
> tsc -p tsconfig-hzerojs.json

error TS5058: The specified path does not exist: ‘tsconfig-hzerojs.json’.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

先不管这个错误了,回到主目录:重新编译hzero-front

cd d02\hzero\front\front\

yarn run build:ms hzero-front

Done in 159.61s

bash apply_update_to_runtime_env.sh

重启服务再试。发现问题依旧,ckeditor 目录下的plugins目录还是旧的。

单独编译父模块:

      yarn run build:app

Done in 18.83s.

这下plugins目录更新了

再次部署:

bash apply_update_to_runtime_env.sh

再起服务,再次测试,这下OK了:

问题解决。

问题18: hzero-lowcode-data 服务名称不一致引起的导入问题

当我新增低代码开发领域时,要指定领域对应的存储数据的服务,平台并未规定这个服务的名称和对应的数据库schema名称,
这就导致会让开发者任意发挥。 比如trail环境用的服务名是hzero-lowcode-data,数据库schema是hzero_lowcode_data, 而自己安装的平台用的是hzero-lowcodedata和hzero_lowcodedata, 其他人或者其他公司也可能用其他的名称,这样,在数据迁移的时候,不同安装实例上定制开发的低代码领域依赖的数据服务和数据库schema不一样就很常见,跨系统导出/导入的时候就会因为差个差异而报错,在2.10版的时候,可以手工更改导出文件的jason文件来解决,之前的一个案例详情可参考下文:

Jack.Shang的技术博客 » HZERO PaaS平台demo升级笔记

HZERO PaaS平台组装笔记(十三)虚拟机拷贝后的便利化配置改进

本文是H-ZERO 安装部署笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心- 《HZERO 轻量版》技术文档进行部署实践,选择快速开始->微服务版进行安装; 但作为初学者, 水平太低, 由于轻量版合并了多个微服务,要改各种配置,过程中遇到多个困难,没有搞定🙂, 后来按照 开放平台->社区与合作伙伴->文档中心- 《HZERO汉得企业级PaaS平台》 技术文档进行 标准版(没有合并微服务的版本) 安装部署实践 ,安装部署成功了。本系列文章记录了这个过程。

需要说明的是,如果不是出于学习研究目的,是不需要这么麻烦的,技术中心有发发行版,可以一键安装,一小时不到可以全部安装完成。

本文是出于学习研究目的,按照技术文档从制品库里面拿各种零件进行组装,所以过程会比较繁琐,供学习研究参考。

实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04

十三、虚拟机拷贝后的便利化配置改进

1、虚拟机拷贝后的IP地址变更便利化

我这个服务器是WSL的,为了避免各服务注册的时候系统选择错误的网卡IP地址,我在bootstrap.yml文件中加了这么一段:
    inetutils:

      # 设置首选网卡,对于本机有多块网卡的情况,可以设置首选网卡来注册

      # 指定忽略的网卡

      ignored-interfaces[0]: lo

      # 选择注册的网段

      preferred-networks[0]: 172.18.14.48

如果我换台机器,另一台机器的IP地址就不172.18.14.48 了,我有20多个微服务,每个yml的配置都要改,很麻烦的,所以使用方案一:使用通配符或环境变量自动识别 IP

在run.sh 中:

WSL_IP=$(ip -4 addr show eth0 | grep -oP ‘(?<=inet\s)\d+(\.\d+){3}’)

export PREFERRED_IP=$WSL_IP

JAVA_OPTS=”-DPREFERRED_IP=$PREFERRED_IP  -Xms350m -Xmx350m -Dspring.profiles.active=dev”

在bootstrap.yml中:

    inetutils:

      # 设置首选网卡,对于本机有多块网卡的情况,可以设置首选网卡来注册

      # 指定忽略的网卡

      ignored-interfaces[0]: lo

      # 选择注册的网段

      preferred-networks[0]: ${PREFERRED_IP}

这样在另一台机器导入就不用每个yml文件去改IP了;

2、Hosts文件设置

拷贝虚拟机后需要根据新IP把Windows和Linux的host文件设置下;在hosts文件中把172.18.14.48替换成导入后新的IP172.18.14.48 dev.hzero.com.cn # 配置数据库所在服务器地址
172.18.14.48 db.hzero.com.cn # 配置后端服务所在服务器地址
172.18.14.48 redis.hzero.com.cn # 配置redis服务所在服务器地址

172.18.14.48 dev.hzero.org # oauth基础地址hzero-oauth可访问的网关地址
172.18.14.48 gateway.hzero.com.cn # oauth基础地址hzero-oauth可访问的网关地址(新)
172.18.14.48 document.hzero.org # hzero-file 用到的地址
172.18.14.48 redis.hzero.org #分布式锁用到的配置地址
172.18.14.48 mongo.hzero.com.cn #集成平台服务编排要用的mongoD

HZERO PaaS平台组装笔记(十二)内存调整

本文是H-ZERO 安装部署笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心- 《HZERO 轻量版》技术文档进行部署实践,选择快速开始->微服务版进行安装; 但作为初学者, 水平太低, 由于轻量版合并了多个微服务,要改各种配置,过程中遇到多个困难,没有搞定🙂, 后来按照 开放平台->社区与合作伙伴->文档中心- 《HZERO汉得企业级PaaS平台》 技术文档进行 标准版(没有合并微服务的版本) 安装部署实践 ,安装部署成功了。本系列文章记录了这个过程。

需要说明的是,如果不是出于学习研究目的,是不需要这么麻烦的,技术中心有发发行版,可以一键安装,一小时不到可以全部安装完成。

本文是出于学习研究目的,按照技术文档从制品库里面拿各种零件进行组装,所以过程会比较繁琐,供学习研究参考。

实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04

十二、内存调整

查看Java进程堆内存

使用命令查看进程内存使用: jhsdb jmap –heap –pid 99556

看进程的分配内存,实际使用内存,剩余内存

按照保留剩余内存大约不低于30% 并且不低于100M的原则重新调整了各服务的启动内存配置。

查看中间件保留内存:

top -p $(pgrep redis)

或者

htop -p $(pgrep nginx | tr ‘\n’ ‘,’)

我们接下来研究最低的开发平台融合版所需要的最低内存:

试验数据如下:

豆包评价:

附5: 豆包的评价:

### 一、整体内存使用概况分析

从 `top` 命令输出看:

– 物理内存(Mem)总量约 `19866.3 MiB`(约 20GB ),已使用 `18472.8 MiB`,空闲 `1134.8 MiB` ,缓存占用 `258.8 MiB` ;交换分区(Swap)总量 `5120.0 MiB`,已使用 `4147.0 MiB`,空闲 `973.0 MiB` 。整体内存使用偏紧张,交换分区已有较多占用,若业务继续申请内存,可能因物理内存不足触发交换,影响性能。

### 三、总结与建议

– **内存是否够用**:当前系统内存整体紧张,物理内存剩余少,交换分区已大量使用,现有 Java 微服务若同时达 `xmx` 配置,内存大概率不够,需关注业务高峰及后续扩容。  

– **`xmx` 优化方向**:  

  – 调低 `ps-swagger`、`ps-interface` 等高配置、低使用的 `xmx` ,释放资源。  

  – 对接近 `xmx` 上限的服务(如 `ps-platform`、`ps-admin`  ),结合业务增长预期适度调高。  

  – 定期监控各服务堆内存使用峰值,根据实际负载动态调整 `xmx` ,同时考虑增加物理内存或优化服务内存占用(如代码优化、减少不必要对象创建 ),缓解系统内存压力。

最终建议:当前内存已到临界值,建议增加 8GB 物理内存;

====================================================================

我现在个人用,公司发的联想昭阳笔记本,默认是40G总内存,默认分配50%给WSL,也就是 20G内存,跑开发平台高低代码融合版,正好够用, 速度还挺快,连续开机2天2夜,系统日志没有出现OOM错误(可正常操作,比如自己个人使用做低代码开发),但再加集成平台或者 AI平台就抗不住了,会出现OOM内存溢出。 后面单跑集成平台的时候,可以把低代码的三个服务停掉,肯定是们没有问题的; 单跑AI平台,把低代码的三个服务停掉应该不够,应为微服务方面,AI平台内存消耗要比低代码多2G,AI平台还要加几个中间件服务,估计再20G基础上还得再加5G内存;


root@desktop-jacksen:~# grep -i “oom” /var/log/syslog
root@desktop-jacksen:~# top
top – 11:08:38 up 30 min, 1 user, load average: 0.26, 0.93, 2.58
Tasks: 52 total, 1 running, 51 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.7 us, 0.8 sy, 0.0 ni, 98.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 19866.3 total, 192.7 free, 18740.5 used, 933.1 buff/cache
MiB Swap: 5120.0 total, 1625.7 free, 3494.3 used. 808.5 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3083 root 20 0 10.4g 1.2g 23260 S 2.3 6.4 9:23.41 java
7985 root 20 0 10.8g 1.7g 23924 S 2.3 8.6 6:10.39 java
3977 root 20 0 10.3g 1.4g 23712 S 2.0 7.0 6:15.60 java
8181 root 20 0 10.8g 1.5g 23912 S 2.0 7.8 5:17.99 java
1890 root 20 0 10.2g 802164 23180 S 1.7 3.9 5:39.81 java
7736 root 20 0 11.0g 1.6g 23960 S 1.7 8.2 6:17.97 java

具体实验:在启动了h0+workflow+lowcode之后,如果再起frontal 和 ORCHESTRATION服务的化,内存就严重不够了,会出现OOM kill , 两次发现模型服务被杀了;这种OOM导致的被杀,再微服务的日志里面没有任何异常,它是在正常写日志的情况下突然被杀的,要查证据就要看操作系统日志:

使用命令:

grep -i “oom” /var/log/syslog   可以看到:

Jul 18 17:00:32 desktop-jacksen kernel: [43061.488894] Out of memory: Killed process 359965 (java) total-vm:11392040kB, anon-rss:2057460kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:5340kB oom_score_adj:0

Jul 18 20:17:00 desktop-jacksen kernel: [53622.006409] Out of memory: Killed process 360680 (java) total-vm:11183648kB, anon-rss:2022436kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:4984kB oom_score_adj:0

另外就是实验发现:仅保留 h0+workflow+lowcode 18 个微服务时,20G内存能用,但如果做低代码开发,连续工作5小时,不断做各种业务对象、页面等开发,内存也能用光,如下:

top – 19:26:26 up 3:50, 1 user, load average: 0.44, 1.06, 0.74
Tasks: 52 total, 1 running, 51 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.4 us, 0.2 sy, 0.0 ni, 99.1 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 19866.3 total, 165.9 free, 19615.0 used, 85.4 buff/cache
MiB Swap: 5120.0 total, 0.0 free, 5120.0 used. 24.7 avail Mem

在这种极限情况下,没有出现OOM,但有的时候偶尔会卡,估计时内存不足的情况下等待IO 出现的。

还是建议:即便针对18个微服务,内存也比20G调整大一点,比如放到22G;

调整虚拟机内存:使用 PowerShell 调整 WSL 虚拟机内存大小的步骤如下,全程通过命令行操作,无需手动寻找文件路径:

步骤 1:打开 PowerShell
  • 按下 Win + X,选择「Windows PowerShell(管理员)」(或「终端(管理员)」并切换到 PowerShell 标签)。
步骤 2:创建或编辑 .wslconfig 配置文件

在 PowerShell 中执行以下命令,直接用记事本打开(或创建)配置文件:

notepad $env:USERPROFILE\.wslconfig

如果是首次配置,会提示 “无法找到文件”,点击「确定」创建新文件即可。

步骤 3:添加内存限制配置

在记事本中写入以下内容(根据需求修改参数):

[wsl2]

# 最大内存限制(可填 GB 或 MB,如 8GB、4096MB)

memory=30GB

# 可选:CPU 核心数限制(根据电脑实际核心数设置,如 12 核)

processors=12

# 可选:交换空间大小(默认是内存的 25%,可手动设置,如 8GB)

swap=8GB

  • 说明:memory 是核心参数,设置 WSL 能使用的最大内存;其他参数按需添加。
  • 写完后保存文件并关闭记事本。
步骤 4:重启 WSL 使配置生效

在 PowerShell 中执行命令,关闭所有 WSL 实例:

wsl –shutdown

  • 等待几秒后,重新打开 WSL(如 Ubuntu 终端),新的内存限制即可生效。
步骤 5:验证内存配置(可选)

在 WSL 终端中执行以下命令,查看内存总量是否与设置一致:

free -h

  • 输出结果中,Total 列的数值应接近配置的 memory 大小。

通过以上步骤,即可用 PowerShell 完成 WSL 内存大小的调整,适用于 WSL 2 版本(目前主流版本)。

HZERO PaaS平台组装笔记(十一)AI平台安装

本文是H-ZERO 安装部署笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心- 《HZERO 轻量版》技术文档进行部署实践,选择快速开始->微服务版进行安装; 但作为初学者, 水平太低, 由于轻量版合并了多个微服务,要改各种配置,过程中遇到多个困难,没有搞定🙂, 后来按照 开放平台->社区与合作伙伴->文档中心- 《HZERO汉得企业级PaaS平台》 技术文档进行 标准版(没有合并微服务的版本) 安装部署实践 ,安装部署成功了。本系列文章记录了这个过程。

需要说明的是,如果不是出于学习研究目的,是不需要这么麻烦的,技术中心有发发行版,可以一键安装,一小时不到可以全部安装完成。

本文是出于学习研究目的,按照技术文档从制品库里面拿各种零件进行组装,所以过程会比较繁琐,供学习研究参考。

实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04

十一、AI平台安装

参考开放平台/AI平台的安装部署文档:

一、中间件安装

AI平台新增使用多个中间件,milvus(向量库)、neo4j(图数据库)、elasticsearch(全文检索)、hkms(指示检索和切片)、hpye(python沙箱)

开放平台提供了Docker 的部署方式,依赖的中间件软件提供了默认的 docker-compose 部署方式(要求Docker/Docker CE >= 19.x

请先下载下面提供的安装介质,并解压到安装环境。

hzero-aigc-docker-compose-1.6.0-ALPHA.zip

配置调整之后,只需要依次进入每个目录,运行 docker-compose up -d 命令启动组件即可。

启动完成后通过 docker ps -a 命令查看容器状态。

要使用Docker, 我们windows系统已经安装了docker desktop , 带的docker引擎是v28.04的,完全满足要求; 只需要在设置中跟我们hzero虚拟机做个整合,我们的虚拟机就能用docker了,所有的WSL虚拟机可以共享windows主机的docker, 不用重复安装;

开放平台提供的docker镜像中除了新增的中间件,还包括了已经安装的mysql,Redis,MongoDB ,这些因为我们之前在本机已经安装了,就不需要用docker另外再启服务了。 之前我们没有安装的中间件就用开放平台提供的镜像把它启起来。

二、中间件配置和启动

在HKMS的服务配置中,对于MongoDB 的要求是得有个hgpt数据库;   

# MongoDB地址

MONGO_CONN: mongodb://<username>:<password>@127.0.0.1:27017/hgpt?authSource=admin&authMechanism=SCRAM-SHA-1

admin> db.grantRolesToUser(“hzero”, [
… { role: “readWrite”, db: “hgpt” },
… { role: “dbAdmin”, db: “hgpt” }
… ])
{ ok: 1 }

创建完成后可以验证下:

mongosh “mongodb://hzero:hzero@localhost:27017/hgpt?authSource=
admin&authMechanism=SCRAM-SHA-1″

Es服务


Docker 服务 Es配置,按照开放平台文档启动ES的docker服务时,拉elasticsearch 镜像报错。问了姜州,他说他可以拉,那文档没错,怀疑是主机代理问题,把主机代理clash关闭后就可以正常拉了。

在 目录下运行 docker-compose up -d, 下拉镜像并启动服务

root@desktop-jacksen:/d02/hzero-aipaas/hzero-aigc-docker-compose/elastic# docker-compose up -d
WARN[0000] /d02/hzero-aipaas/hzero-aigc-docker-compose/elastic/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 11/11
✔ elasticsearch Pulled 58.7s
✔ 0c64192e9533 Pull complete 0.1s
✔ 70c9415a17bd Pull complete 0.1s
✔ 4f4fb700ef54 Pull complete 0.0s

[+] Running 2/2
✔ Network aigc Created 0.1s
✔ Container elasticsearch Started 

ElasticSearch 容器启动完成之后,需先将插件拷贝到容器内部:

docker cp analysis-icu-8.12.2.zip elasticsearch:/usr/share/elasticsearch

docker cp analysis-ik-8.12.2.zip elasticsearch:/usr/share/elasticsearch

拷贝没成功;

在执行 安装ES插件的时候报错,说容器没启动,但尝试去启动容器后几秒钟,容器就自动down了,把日志给元宝分析,元宝说是内存配置问题,默认会使用宿主机内存的一半,我们linux虚拟机分配了25G内存,它用一半就是12.5G,日志中显示用了12.5G,元宝说大概率会导致OOM,但我去syslog中没查到oom错误。 元宝说原来的ES 的docker的内存配置有问题:

    environment:

      – ELASTIC_PASSWORD=elastic

      – discovery.type=single-node

      – xpack.security.enrollment.enabled=true

      – xpack.security.enabled=true

      – m=1GB

这里  – m=1GB ,这种配置,现在docker不认,要改成:

– ES_JAVA_OPTS=-Xms500m -Xmx500m  # ✅ 设置 JVM 堆内存为 500MB

改了之后重启,依然几秒后就down了,不过这次错误原因说是 获得文件锁失败,元宝说是权限问题,我是用共享的windows主机上的docker desktop,他使用的系统用户是Windows的用户a, 这个用户在linux中创建的/d02/hzero-aipaas/hzero-aigc-docker-compose/elastic/volumes 目录上没有权限,但这个在配置文件中被配置成被docker容器使用,所以就出问题了,解决方案是改变权限:

chown -R 1000:1000 /d02/hzero-aipaas/hzero-aigc-docker-compose/elastic/volumes/elastic

或者:

chmod 777 -R /d02/hzero-aipaas/hzero-aigc-docker-compose/elastic/volumes(个人机用推荐)

检查并停止冲突进程

docker ps -a | grep elasticsearch

docker stop 83c184ba23c4 && docker rm 83c184ba23c4

再启动:

docker start elasticsearch

这次成功了;

先将插件拷贝到容器内部:

docker cp analysis-icu-8.12.2.zip elasticsearch:/usr/share/elasticsearch

docker cp analysis-ik-8.12.2.zip elasticsearch:/usr/share/elasticsearch

然后进入ES容器内:

docker exec -ti elasticsearch /bin/bash

安装ES插件:

bin/elasticsearch-plugin install file:/usr/share/elasticsearch/analysis-icu-8.12.2.zip

bin/elasticsearch-plugin install -b file:/usr/share/elasticsearch/analysis-ik-8.12.2.zip

退出ES容器

Ctrl+P+Q

重启ES:

docker restart elasticsearch

ES链接的密码在yml文件中可以查到:  ELASTIC_PASSWORD=elastic

Mivilus服务

Miviuls 容器启动脚本中添加内存限制:

    sudo docker run -d \

        –memory=”600m” \

        –memory-swap=”600m” \

否则会使用很大内存,导致内存不够用,但内存放到600m,实际使用向量是仅用于个人学习,测试,不能超过5万条向量,超过内存不够用,需要扩内存,重启。

启动mivilus服务 可以正常启动:

HKMS服务

这是一个python服务, 经测试内存在2G都会出现OOM,我把内存上限放到了3g, 没有再出现oom错误

Neo4j

在yml中配置,设置内存500M,上限1G;

 – ES_JAVA_OPTS=-Xms500m -Xmx500m  # 设置 JVM 堆内存为 500M

 deploy:  # 限制容器总内存(Docker Compose v2.3+)

      resources:

        limits:

          memory: 1g  # 容器最大内存(建议为 JVM 内存的 1.5~2 倍)

验证可用性:

密码在配置文件中可以查到:- NEO4J_AUTH=neo4j/password

HKMS

HKMS的内存要设置到3G,否则会报OOM启动不了;这个比较吃内存

HPYE

HPYE的内存可设置到500M

注意这是python应用,不能用xms 和xmx 设置内存,只能用:
    deploy:  # 限制容器总内存(Docker Compose v2.3+)

      resources:

        limits:

          memory: 500m  # 容器最大内存(python应用直接限制内存大小)

这些容器启动后的内存消耗情况:

三、微服务安装

到选配平台,参考部署文档,以hzero 1.12.1 父组件开始,把hzero-aip-server和hzero-aip-app选配下来:

1、种子数据安装
2、启动 aip-server 服务

1.1 编辑服务的application.yml文件在数据库链接rul中添加:allowPublicKeyRetrieval=true

server-uri改一下  

1.2因为yml配置文件中要用到MongoDB , 且要求的URI配置是: uri: ${SPRING_DATA_MONGODB_URI:mongodb://hzero:hzero@mongo.hzero.com.cn:27017/haip?authSource=admin}

所以需要创建hzero用户 和 db “haip”

root@desktop-jacksen:/d02/hzero-aipaas/resource-package# mongosh

test> use admin
switched to db admin
admin> db.createUser({
… user: “hzero”,
… pwd: “hzero”,
… roles: [
… { role: “readWrite”, db: “haip” }, // 允许读写haip数据库
… { role: “dbAdmin”, db: “haip” } // 允许管理haip数据库(如创建索引)
… ]
… })
{ ok: 1 }
admin>

完成后可用命令验证下: mongosh “mongodb://hzero:hzero@localhost:27017/haip?authSource=
admin”

1.3  编辑 服务的bootstrap.yml 文件,在 spring.cloud层级下添加网卡选择:

    inetutils:

      # 设置首选网卡,对于本机有多块网卡的情况,可以设置首选网卡来注册

      # 指定忽略的网卡

      ignored-interfaces[0]: lo

      # 选择注册的网段

      preferred-networks[0]: 172.18.14.48

      文档和选配平台的版本是1.6.0.ALPHA,实际制品库中没有,要改成1.6.0.ALPHA.1.15

1.4 把原来服务模块下的run.sh 和stop.sh都拷贝过来;

编辑run.sh ,把端口号改成跟服务的 bootstrap.yml文件中定义的端口号一致,把 AGENT 变量改成

-javaagent:/d02/hzero/project/ps-license/licenseAgent/license-agent111.jar

构建成功,但启动失败,看日志是 java.io.FileNotFoundException有点像Licens 服务的Agent版本问题, mvn dependency:tree  命令看license 版本是1.1.2 版本的,按理说用license-agent111.jar是对的。

跟姜州沟通,他先让我在POM中,在dependencies前面加这个试试:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-bom</artifactId>
            <version>4.1.116.Final</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

试了一下,发现错误依旧,然后又让我把选配出来的POM中的这一段删除掉,说这段版本不对,要去掉。

再次尝试,发现就OK了

但这个服务似乎特别吃资源:长期耗掉2G的内存资源(只给它分配了1G)

看日志是调用Schedule服务没成功(没启这个服务),另外就是一直显示线程池的信息;

2025-07-18T10:32:50.093+08:00  INFO 334102 — [hzero-aip] [pool-3-thread-3] org.hzero.core.util.CommonExecutor       : [>>ExecutorStatus<<] ThreadPool Name: [monitor], Pool Status: [shutdown=false, Terminated=false], Pool Thread Size: 0, Largest Pool Size: 0, Active Thread Count: 0, Task Count: 0, Tasks Completed: 0, Tasks in Queue: 0

把启动内存调整到2G再试,用jhsdb jmap –heap –pid 335142看内存长期要消耗1.6G

注册中心已经可以看到了:

1、启动 aip-app 服务

所需配置更改鱼aip-Server 类似,服务启动后注册中心可见

jhsdb jmap –heap –pid 336108

Heap Usage:
G1 Heap:
regions = 2048
capacity = 2147483648 (2048.0MB)
used = 1799735976 (1716.3619766235352MB)
free = 347747672 (331.63802337646484MB)
83.80673713982105% used

jhsdb jmap –heap –pid 335142

Heap Usage:
G1 Heap:
regions = 2048
capacity = 2147483648 (2048.0MB)
used = 1730237952 (1650.08349609375MB)
free = 417245696 (397.91650390625MB)
80.57048320770264% used

AI平台的这两个java服务 (进程ID分别为336108和335142 ) 耗内存比较大,若以jmap 看,内存消耗1.6+1.7 =3.3G,但在linux操作系统层面却消耗了20G*(16.5%+17%)=6.7G,这是为什么呢?

元宝分析给了差异本质​:操作系统统计的RES包含JVM堆内存+堆外内存+共享库,而jmap仅显示堆内存

从wsl的Linux的top命令看,3个Java服务长期占了7.2G内存:但是WSL windows的资源管理器看整个WSL虚拟机只占了3.3G。假设我在一套真正的Linux服务上运行微服务,内存需求我应该参考哪个呢?

元宝回答:

原因解释:为什么Windows显示更少?

  • WSL2的动态内存回收​:WSL2使用的VM会主动将Linux子系统中的空闲内存返还给Windows主机。
  • 内存压缩技术​:WSL2使用内存压缩减少实际物理内存占用。
  • 缓存统计口径​:Linux将磁盘缓存(buff/cache)计入”used”,而Windows不计入VmmemWSL的内存占用。

真正的Linux推荐内存配置公式

服务总内存=(所有进程RES总和)×1.2+系统预留

四、AI平台功能验证

   1、点击 企业应用库/个人问答时错误

点击 企业应用库/个人问答 时出现错误;元宝分析日志后指出的问题是:

错误原因分析:未知字段引用

  • 错误信息​:Unknown column ‘hkp.include_children_flag’ in ‘IN/ALL/ANY subquery’
    • 直接原因​:SQL语句中引用了表别名 hkp(对应表 haip_knowledge_permission)的字段 include_children_flag,但该字段在数据库表中实际不存在。
    • 具体位置​:错误发生在权限控制的子查询中(涉及组织架构和职位的权限校验逻辑)

解决方案:添加缺失字段

ALTER TABLE haip_knowledge_permission

  ADD include_children_flag TINYINT(1) DEFAULT 0 COMMENT ‘是否包含子节点:0否,1是’;

跟姜州沟通了下,他说选配平台的种子数据可能有问题,要用他发的种子数据,我把版本号报给他,他发了一个新版的1.6 alpha版种子数据给我;

停AI服务,升级数据库种子数据;

升级种子数据第2步和第3步会报错,

其中第2步报错信息:

日志如下:

解决方案:

在service-mapping.xml里面加了一条
    <service name=”hzero-orchestration” filename=”hzero_orchestration” schema=”hzero_orchestration” description=”集成平台-服务编排”/>

其中第3步,按照姜州提示,hzero_workflow和hzero_alert不要勾选,再次运行第3步,这次把这两个勾选去掉,就可以了(备注种子数据脚本是可以重复执行的,他的执行逻辑是略过已有数据,是增量更新,对于少数系统数据会执行覆盖更新,对于最终客户经常可能修改的数据不会覆盖)

升级好种子数据之后,这个问题就解决了。

问题解决。

2、MCP插件中心报页面不存在

查看原来的hzero_front_aip的前端版本是7月19日构建的1.2.0-alpha.2版本

我们曾经单独构建过工作流的前端,也因为集成平台的问题更新过另外两个微服务的前端,我们先去看看最新的AI前端的版本是多少?

我们到 /d02/hzero/front/front目录下

现在 package.json文件中加一个前端模块:

 “hzero-front-haip” : “~1.2.0-alpha.2”,

在当前当前选配工程的front目录下执行yarn(这一步是把最新的版本拉到node_moudules目录下):

之后运行npx umi hzero-info 查看当前yarn拉下来的新的模块版本:

hzero-front-haip version : 1.2.0-hzerocli.0

把package.json中的hzero-front-haip版本设置成新的1.2.0-hzerocli.0

然后单独构建 hzero-front-haip

yarn run build:ms hzero-front-haip

Done in 204.82s.
root@desktop-jacksen:/d02/hzero/front/front#

4、再把新的dist目录拷贝到原来位置,更改目录权限,再执行run-front.sh 替换字符串

cp -rf /d02/hzero/front/front/dist  /d02/hzero/front/

sudo chown -R www-data:www-data /d02/hzero/front/dist

sudo chmod -R 755 /d02/hzero/front/dist

cd /d02/hzero/front/

./run-front.sh

重启服务后,经测试,发现问题依旧。

姜州说前端版本太低了,他给的AI平台的前后端版本是:

hzero-aip-server        1.6.0.ALPHA.2
hzero-aip-app        1.6.0.ALPHA.2
hzero-front-haip        1.6.0-alpha.2
hkms        1.6.0

在package.jason中把前端版本设置到1.6.0-alpha.2,然后yarn, 再npx umi hzero-info

hzero-front-haip version : 1.6.0-alpha.0-ys-9

重新构建。出现错误,看起来是hzero-front库里面的文件;应该需要更新hzero-front

问了前端架构组,需要把hzero-front 升级到1.12.4-alpha.11才有这个文件;

Package.json中把hzero-front设置成1.12.4-alpha.11,然后yarn 获得库依赖文件 , 然后重新build,

yarn run build:ms hzero-front-haip

Done in 305.25s.
root@desktop-jacksen:/d02/hzero/front/front#

这次成功了,再次启动服务测试:发现出了其他问题:

而且其他好多界面也不正常,还不如原来那个版本;

跟姜州沟通了下,说1.6.0-alpha.0-ys-9这个版本不对,姜州问了前端,前端说1.6.0-alpha.2这个版本早就推到制品库了(最新的都2.1了)

问豆包,说是版本的模糊匹配导致的,解决方案是在package.json中把版本好前面的~去掉,强制精确匹配。

再次yarn , 然后在yarn.lock中搜索hzero-front-haip ,可以看到要求的版本和实际匹配的版本是一致了。

hzero-front-haip@1.6.0-alpha.2:

  version “1.6.0-alpha.2”

重新build:

yarn run build:ms hzero-front-haip

再把新的dist目录拷贝到原来位置,更改目录权限,再执行run-front.sh 替换字符串

cp -rf /d02/hzero/front/front/dist  /d02/hzero/front/

sudo chown -R www-data:www-data /d02/hzero/front/dist

sudo chmod -R 755 /d02/hzero/front/dist

cd /d02/hzero/front/

./run-front.sh

经测试,这个问题依然存在, 姜州说要把接口平台和集成平台的前置机两个模块的前端也更新到新的版本:

“hzero-front-hitf”: “1.12.1-beta.1”,
    “jipaas-front-jitf”: “1.8.0-alpha.1”,

我先看下我现在的版本:

我目前的hzero-front-hitf 是1.12.1-beta.4 版本的,满足要求,jipaas-front-jitf 不存在

加到package.json中去单独build jipaas-front-jitf ,yarn后build

yarn run build:ms jipaas-front-jitf

经测试,依然有问题:

看起来是hzero-front缺东西,考虑上次按照前端架构组建议把hzero-front版本在 package.json中改成1.12.4-alpha.11 版本之后,只是yarn ,并没有build ,可能是这个原因,接下来停服务,单独build hzro-front

yarn run build:ms hzero-front

Done in 98.76s.

再次测试,MCP界面有了,而且企业应用库,Agent编排界面也正常了(之前hzero-front-haip 更新到1.6.0-alpha.2 但hzero-front没有build到1.12.4-alpha.11的时候打开是无内容的)

不过还是有错误:

问了石云,说是在接口平台中要添加依赖:

hzero-interface服务加

<dependency>

            <groupId>org.jipaas.boot</groupId>

            <artifactId>jipaas-boot-interface</artifactId>

            <version>1.8.0-SNAPSHOT</version>

            <optional>true</optional>

        </dependency>

实际上不是在hzero-interface中添加依赖,而是说:集成平台小组开发的基于hzero-interface,为MCP另外开发了微服务jipaas-interface,这个jipaas-interface已经依赖了hzero-interface, 要用MCP服务,得另外安装jipaas-interface服务,安装部署文档参考:

https://open.hand-china.com/document-center/doc/component/4026/19683?doc_id=532364&doc_code=221662#%E9%83%A8%E7%BD%B2

简单来说,就是如果你要用MCP功能,那么就要用jipaas-interface 替换hzero-interface

可以把hzero-interface的工程目录ps-interface拷贝过来,放到hzero-ipaas/project目录下,ps-interface 目录改名为ps-jipaas-interface, 修改POM文件,parent 依赖改成

    <parent>

        <groupId>com.hand</groupId>

        <artifactId>person-jipaas-parent</artifactId>

        <version>1.8.1</version>

    </parent>

依赖部分,把对hzero-interface的依赖改成:

            <dependency>

                <groupId>org.jipaas</groupId>

                <artifactId>jipaas-interface</artifactId>

                <version>1.8.0.BETA</version>

            </dependency>

其他不变,另外jipaas-interface中增加了对license 的依赖,启动脚本命令中把agent加上。

停掉原来的hzero-interface 服务,启动这个新的jipaas-interface服务,这个jipaas-interface侦听端口跟原来的hzero-interface是一样的,yml中的服务名用的也是hzero-interface , 路由前缀也没变hitf , 所以跟原来用hzero-interface是一样的,基本是无感替换。

服务替换启动后再测试:就OK了

问题解决。

3、新建模型对接,测试报错(Nginx配置)

新建一个模型对接,测试时报错,看网络是api调用被限制了。

看调用地址没有走网关,为什么没走网关,要看下前端逻辑,点发起程序,搜索关键字v1/open

发现有些地方,在这个地址前面要拼接变量AIGC_HOST

在前端 dist 目录下的index.htm中这个变量还没有被设置替换:

在开放平台文档搜索 AIGC_HOST , 找到如下说明:

看起来是部署问题,我们在前端dist中还没有做BUILD_AIGC_HOST的替换

文档只是举例,实际应该替换成什么地址呢?

EUREKA中可以看到hzero-aip-app服务的地址:

那就取这个地址试试看: 更改 index.html中的变量,保存;

然后清除浏览器历史记录,重新登录,发现还是有问题,没办法,只能再试试全局替换

全局替换后清除浏览器数据再测试,问题依旧,再仔细看代码,发现很多地方是跟HZERO_HAIP变量链接的。

查开放平台文档,只有一处地方提到:是23年新增的一个变量;

突然思考:是否搞错问题方向了:

路由前缀haip是 hzero-aip   server的服务路由,也就是这里调用的路由不是hzero-aip-app的路由,实际上hzero-aip-app是没有路由前缀的。

但是开放平台文档明确这是hzero-aip-app 服务中的API:

并且文档也明确了:

所以,调用这种hzero-aip-app服务中的API前面的地址不是网关地址,是正常的。

切换到租户管理员角色,可以在AIGC中台的通用配置中看到全局配置的菜单,开放平台AIGC中台全局配置说明文档中说:开放API地址就是hzero-aip-app服务的对外暴露地址

把这个地址配上,重新登录,测试新建的火山DeepSeek账户,问题依旧。

在文档中看到这么一段:就是配置AIGCapp的地址,做反向代理到hzero-aip-app对外暴露的服务网址,想着设置AIGC_HOST 变量以及这个全局配置的地方要提供的地址都是为了发布AI应用供外部页面嵌入或者直接外部访问时要用的地址。跟我们遇到的账户配置测试时发现的错误没有关系。

按照最佳实践做配置,windows, linux的host文件中都添加一条

172.18.14.48 aigc.hzero.com.cn #AI服务网关地址

run-front.sh中改成:

replace_in_files “BUILD_AIGC_HOST” “http://aigc.hzero.com.cn” “js”

replace_in_files “BUILD_AIGC_HOST” “http://aigc.hzero.com.cn” “html”

AIGC中台的通用设置的全局配置中的开放API地址也改成http://aigc.hzero.com.cn

Nginx中反向代理按文档配置;

Server_name aigc.hzero.com.cn

Proxy_pass http://127.0.0.1:8088

nginx主配置:

/etc/nginx/nginx.conf

nginx站点配置:

/etc/nginx/sites-available/

先备份nginx配置:

cd /etc/nginx

cp nginx.conf nginx.conf.bak20250802

cd sites-available

cp default default.bak.20250802

然后修改default , 然后重启nginx , 然后再次运行 /d02/hzero/front/front/apply_update_to_runtime_env.sh

这么做当然是没有解决 新建模型账户测试出错的问题,那个问题,估计是前端程序写得有问题。

跟前端架构组沟通了下,分析过程如下:

查找问题:

可以看到前端拼接路由的逻辑:

发现这里有问题,正常应该是:

下面这样从环境变量_env_ 获取”AIGC_HOST” 变量的值,但这里是{}空的,表示没有从_env_环境变量取值,可能是缺失了AIGC_HOST环境变量的定义;

 查前端工程文件中的config目录下的congfig.ts 和config.prod.ts 发现缺失没有AIGC_HOST变量的定义。

解决方案:

在配置文件中加上AIGC_HOST变量的定义:

Config.ts 加上:

Congfig.prod.ts 加上:

然后重新yarn, yarn build:ms , apply_update_to_runtime_env.sh

yarn run build:ms hzero-front-haip

经测试已经OK了:

问题解决。

2、向量模型 ES的链接测试报错

ES服务的测试链接报错,刚开始是前端版本太低,没有密码认证选项。后来升级的1.6.0.ALPHA.2 版本就有了密码认证选项了,但就算输入正确的用户名密码依然报错。

服务错误日志中显示后端服务的版本还是1.6.0.ALPHA.1.15的。

at org.hzero.aip.app.service.impl.VectorDatabaseServiceImpl.testConnection(VectorDatabaseServiceImpl.java:155) ~[hzero-aip-server-1.6.0.ALPHA.1.15.jar!/:1.6.0.ALPHA.1.15]

升级到1.6.0.ALPHA.2 再试, 依然有问题。

跟姜州沟通,说是要升级:

后端更新到新版本
hzero-aip-server 1.6.0.ALPHA.2.7    
hzero-aip-app 1.6.0.ALPHA.2.7

升级后再测试,OK了:

问题解决。

3、新建火山图文向量模型对接,测试时报400 badrequest 错误

先以租户管理员角色,进开发管理/值集配置,搜索 HAIP.ACCOUNT_TYPE_MODEL 添加火山新的图文向量模型ID

然后新建一个模型对接配置:Jack-火山-向量模型-图文,选择刚才添加的模型ID,API-KEY 是确认OK的。然后进行测试,出现这个错误,之前火山的文本模型deepseek-V3配置到这个平台测试是OK的,说明联通火山的模型服务没有问题,看起来是h0自己的图形附件处理过程有问题。

看起来是调用hzero-aip-app 服务在处理附件时出现错误

看后台日志,好像是hzero-aip-app 把图片附件的地址传给火山方舟,火山方舟根据这个地址下载图片的时候找不到图片链接域名对应主机就报错了,因为我们用的是虚拟机,这个域名也是自己在本机host文件中设置的,我们的虚拟机能访问外网,但外网是访问不了我们的虚拟机内网的,所以出现这种情况?

#question4-embding

4、Docker 安装环境问题:个人问答应用,上传文件,向量化解析时发生错误:

从错误反馈看是hzero-aip-server 中调用HKMS链接milvus时发生错误:

http://gateway.hzero.com.cn:8080/haip/v1/open/documents/personal/knowledge?tenantId=0
调用HKMS执行文件切片时发生错误:处理失败:<MilvusException: (code=2, message=Fail connecting to server on dev.hzero.com.cn:19530, illegal connection params or server unavailable)>\”}”

分析:

先看milvus本身的状态是OK的:

再看HKMS的日志:

看起来是HKMS服务自己链接Milvus失败,但为什么呢?

看hkmk docker容器的日志:

问题是HKMS docker容器链接milvus服务失败。在容器内ping也ping不通

由于WSL网络中,HKMS使用docker-compose.yml配置中指定网络:aigc, 这个aigc网络的网关是windows主机上的一张虚拟网卡地址;windows可以ping通这个地址,但linux虚拟机ping不同这个地址,所以liunx也就不能跟HKMS容器实现网络互通。而milvus容器使用脚本启动,没有指定网络,它通过端口映射,可以通过linux虚拟机的IP访问到服务,但HKMS与虚拟机网络不互通,因此HKMS访问不到milvus.

解决方案有两个:
1、docker-compose.yml中把HKMS的网络模式改成host模式,因为host模式下,端口映射不起作用,所以就要在容器外的nginx的侦听端口从80直接改成18080,这样hkms应该就可以访问到linux host机的IP地址了。缺点是HKMS原来是bridge模式,并且加入了aigc网络,所以跟neo4j, es, hpye这几个容器之间可以通过容器名直接联通相互访问。但改成host模式之后就不能相互访问了。 我估计hkms服务本身也没有这种设计和需求,所以应该没关系。

2、把milvus从命令启动模式改成 yml配置使用docker-compose 启动的方式,并且在yml配置中加入网络aigc, 这样milvus就能跟hkms在同一网络中了。在dokcer容器内,同一网络的其他容器可以通过容器的服务名访问,那我们在aigc的向量库配置的地方,测试链接地址直接写milvus的docker容器名,然后在liunx虚拟机的host文件中把这个容器名的解析加上,这样hzero-aip-server服务可以访问到这个milvus , 而且链接串传给hkms容器内的服务后,HKMS也可以访问到milvus .

感觉第一种方案简单一些,先试试。

经测试不行,hzero-aip-server 无法链接127.0.0.1:18080端口,访问被拒绝,豆包解释:通常与容器内 Nginx 未正常启动、配置未生效或WSL 环境的网络特殊性有关。关键原因:WSL 环境中 host 模式的端口绑定在 Docker 虚拟机,而非 WSL 发行版。所以这种方案否决掉。

它不在aigc这个网络中,与HKMS不能互通,而且HKMS容器内也访问不了linux虚拟机的IP地址。

尝试第2种方案,HKMS可以链接到milvus,但另一个错误又出现了,HKMS访问附件是链接失败,因为附件是要链接mino服务,它也是访问不到的,但mino服务没有用容器,是直接安装在linux 虚拟机上的,没法用刚才的办法解决。所以这种方案也否决掉。

为了测试容器间的网络互通性,需要在容器内安装ping命令工具:

apt-get update && apt-get install -y iputils-ping

导致这一切问题的根源在于我使用了windows docker desktop, 虽然能共享docker,不用在虚拟机中另外安装docker ,但问题就是创建的aigc网络也没有在我的Linux虚拟机中生成虚拟网卡,而是在windows docker desktop自己的WSL中去生成桥接的aigc网络网卡了,这就导致我的linux虚拟机与aigc网络不能互通。

所以终极解决方案是

3、在linux虚拟机中单独安装docker 和docker compose 插件,问下豆包“ubuntu 22.04里面如何安装docker 和docker compose”,豆包会给出详细步骤,按指导安装很快的。

在我的wsl虚拟机单独安装docker软件后再次启动这些docker容器,这次我从docker容器里面就可以ping通linux虚拟机的IP地址了,这样网络就通了。

再次测试:发现还是报错,这次是HKMS 的错误

docker logs hkms 看容器日志:

Traceback (most recent call last):
File “./kms_process.py”, line 458, in process_file
File “./loader/doc_loader.py”, line 264, in load_document_from_url
File “./loader/doc_loader.py”, line 201, in download_from_url
Exception: Failed to download file. Detail error: <urlopen error [Errno -2] Name or service not known>
2025-08-07 10:29:32 [46] [INFO] process_file存在错误:Failed to download file. Detail error: <urlopen error [Errno -2] Name or service not known>,file_url=http://oss.hzero.com.cn:9000/hz-haip/haip01/0/MINIO/0a02eb2273824e11bbecd18dc5a60006%40HZERO%EF%BC%88H0%EF%BC%89%E5%BC%80%E5%8F%91%E5%B9%B3%E5%8F%B0-%E4%BA%A7%E5%93%81%E7%99%BD%E7%9A%AE%E4%B9%A6V1.6.pdf?response-content-disposition=attachment%3Bfilename%3DHZERO%25EF%25BC%2588H0%25EF%25BC%2589%25E5%25BC%2580%25E5%258F%2591%25E5%25B9%25B3%25E5%258F%25B0-%25E4%25BA%25A7%25E5%2593%2581%25E7%2599%25BD%25E7%259A%25AE%25E4%25B9%25A6V1.6.pdf&response-cache-control=must-revalidate%2C%20post-check%3D0%2C%20pre-check%3D0&response-expires=1754533773094&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=hzero.admin%2F20250807%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20250807T022932Z&X-Amz-Expires=300&X-Amz-SignedHeaders=host&X-Amz-Signature=b2c4f279f63370d726cd97eb0fe4e0966cf2a237e181b2daf5cd38025d93e803
2025-08-07 10:29:32 [46] [ERROR] Failed to download file. Detail error: <urlopen error [Errno -2] Name or service not known>


看起来是HKMS 服务下载文件不成功, 我们进入容器内,ping下这个网址oss.hzero.com.cn 
docker exec -it hkms bash

root@406f2c57c70c:~/hkms# ping oss.hzero.com.cn
ping: oss.hzero.com.cn: Name or service not known

PING 172.18.14.48

 (172.18.14.48) 56(84) bytes of data.
64 bytes from 172.18.14.48: icmp_seq=1 ttl=64 time=0.059 ms
64 bytes from 172.18.14.48: icmp_seq=2 ttl=64 time=0.048 ms

我们在linux虚拟机的/etc/hosts文件中配置oss.hzero.com.cn 域名指向172.18.14.48 ,可惜容器内不能自动解析主机的hosts

在HKMS容器的yml文件中添加extra_hosts:

services:

  hkms:

    container_name: hkms

    image: registry.hand-china.com/hzero-public/hkms-python:1.6.0

    extra_hosts:

      – “oss.hzero.com.cn:172.18.14.48″  # 格式:”主机名:IP地址”

      – “dev.hzero.com.cn:172.18.14.48”

然后重启容器

再进容器测试联通性,OK了:

root@24052bb231d7:~/hkms# ping oss.hzero.com.cn
PING oss.hzero.com.cn (172.18.14.48) 56(84) bytes of data.
64 bytes from dev.hzero.com.cn (172.18.14.48): icmp_seq=1 ttl=64 time=7.34 ms
64 bytes from dev.hzero.com.cn (172.18.14.48): icmp_seq=2 ttl=64 time=0.034 ms

再到界面测试:

刚才那个错误没了,但出现另一个错误:

资源同步失败

资源名称:HZERO(H0)开发平台-产品白皮书V1.6.pdf

同步类型:内容同步(向量库)

失败原因:调用HKMS执行文件切片时发生错误:处理失败:T0_KMS_DOCUMENT

docker logs hkms  容器日志中更详细的日志是: 缺集合:T0_KMS_DOCUMENT


Traceback (most recent call last):

db.exception.KnowledgeCollectionNotExists: T0_KMS_DOCUMENT
2025-08-07 11:05:42 [41] [INFO] process_file存在错误:T0_KMS_DOCUMENT,file_url=http://oss.hzero.com.cn:9000/hz-haip/haip01/0/MINIO/0a02eb2273824e11bbecd18dc5a60006%40HZERO%2025-08-07 11:05:42 [41] [ERROR] T0_KMS_DOCUMENT
Traceback (most recent call last):
File “./db/milvus_knowledge_store.py”, line 831, in _get_collection
File “/usr/local/lib/python3.11/site-packages/pymilvus/orm/collection.py”, line 137, in __init__
raise SchemaNotReadyException(
pymilvus.exceptions.SchemaNotReadyException: <SchemaNotReadyException: (code=1, message=Collection ‘T0_KMS_DOCUMENT’ not exist, or you can pass in schema to create one.)>

但实际上是存在的:

发现这里的向量模型没有配置,另外全局配置中用的也是默认向量组合,那个组合没有配置API key , 得改成我已经配置API Key得账户组合:jack多模态向量-豆包组合1

不过改成这个向量之后,保存的时候提示:向量字段的长度与模型维度不匹配,请检查相关配置

在操作界面会报错误:

资源同步失败

资源名称:HZERO(H0)开发平台-产品白皮书V1.6.pdf

同步类型:内容同步(向量库)

失败原因:调用HKMS执行文件切片时发生错误:处理失败:haip.error.hkms.milvus_error – Collection field dim is 1536, but entities field dim is 2048

重建T0_KMS_DOCUMENT集合,先释放,再删除,再新建:

删除操作成功,再新建:

新建完成后加载:

再次同步,没有报错,去文档管理看到已经同步成功了:

ES同步要在第三步勾选:

问题解决。

5、个应用导航的编排,点测试运行就报错,后台日志报 “: 400 BAD_REQUEST ”

调用的地址是

ws://aigc.hzero.com.cn/websocket?access_token=5e915e24-1ecc-4224-a20d-e82a15c5c5d0&appSessionId=c537c1c4-925e-43a6-ad12-e2eba13b7a2d&interactionFlowCode=APPLICATION_NAVIGATION&appFlowVersionNum=1&processorKey=interaction-pc&tenantId=0

我看到前端环境变量 websocket_host是另一个地址:

跟何博沟通了下,何博说那是平台用的WS地址,并非AI 用的WS地址,所以不影响,怀疑是Nginx反向代理设置的地方往请求头里面少加了内容,看了下nginx的反向代理配置:

# aigc.hzero.com.cn 专用服务器
server {
    listen 80;
    server_name aigc.hzero.com.cn;

    location / {
        # 改为后端服务实际IP:端口
        proxy_pass http://127.0.0.1:8088;  # 示例:假设后端在本机8088
        proxy_set_header Host $host;  # 保留一个Host配置
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_buffering off;  # 按需开启/关闭(实时交互场景建议关闭)
    }
}

确实没有”upgrade”这样的connection

于是就让加了两条配置:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;

加了之后重启nginx , 然后就没有那个错误了

问题解决。

6、文档管理/文件预览出错(需安装KKv):

解决方案:

安装 kkfile view 或者only office服务,并配置文件服务,详情可参考开放平台/HZERO汉得企业级PaaS平台/服务列表/文件管理/组件列表/文件管理/开发者指南/文件预览配置

我们这里安装轻量一点的kkv(KKV部署指南参考文档预览 – Gitee.com

1、先下载KKV(花90加入KKV知识星球,可以获得最新版本)

cd /d02/hzero/project/ps-file/kkv

tar -xvf kkFileView-4.4.0.tar.gz

cd ./kkFileView-4.4.0/bin

./startup.sh

2、在文件服务的POM中添加依赖:

        <dependency>

            <groupId>org.hzero.starter</groupId>

            <artifactId>hzero-starter-fileview-core</artifactId>

        </dependency>

        <dependency>

            <groupId>org.hzero.starter</groupId>

            <artifactId>hzero-starter-fileview-kk</artifactId>

            <optional>true</optional>

        </dependency>

然后在文件服务的yml配置中加上下面配置

kk-version: 4      #3以下版本可不指定(版本3.x写3,版本4.x写4)

    preview-type: kkFileView

    kk-file-view-url: http://dev.hzero.com.cn:8012/onlinePreview   # kkFileView的文件预览地址

重新构建启动文件服务

cd /d02/hzero/project/ps-file

sh run.sh

3、拷贝windows目录下的字体文件(这里拷贝字体并处理是为了解决预览时的乱码问题):

cp -r /mnt/c/windows/fonts/* /usr/share/fonts

  • 执行 sudo fc-cache -fv /usr/share/fonts 后,无需重启服务器
  • 若个别应用程序未识别到新字体,重启该应用程序即可。

4、重启kkv(字体问题解决要生效,需要重启kkv)

cd /d02/hzero/project/ps-file/kkv/kkFileView-4.4.0/bin

./shutdown.sh

./startup.sh

 再次测试:

word文档预览显示正常,问题解决。

7、文档向量化时发生错误,链接不到milvus服务器,milvus服务意外关闭

milvus在总服务启动脚本中成功启动,链接测试也OK,之前向量化操作也成功,突然出现这种情况,肯定时milvus被以外关闭了。

把milvus的日志丢给元宝,元宝猜测是能时发生OOM了,dmesg查系统日志,果然:

dmesg | grep -E ‘kill|oom|segfault|milvus’

[ 3425.898442] milvus invoked oom-killer: gfp_mask=0x1100cca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0

[ 3425.900369] Memory cgroup out of memory: Killed process 3040 (milvus) total-vm:9695748kB

total-vm: 9695748 kB ≈ 9.2 GB

  • 表示该进程(或容器内所有进程总和)​尝试使用的虚拟内存达到了约 9.2GB

由于笔记本内存有限,我在milvus的启动脚本中设置的内存是600M,物理+交换也是600M,也就是交换分区为0, 但元宝说这只是物理内存限制,并未限制住虚拟内存。

根本原因总结:Milvus(或其所在的容器/控制组)尝试使用的内存超过了系统或 cgroup 设置的内存上限,触发了 OOM Killer,导致 Milvus 被强制终止。​

解决方案:

把–Memory-swap设置到1.2G, 重启milvus

HZERO PaaS平台组装笔记(十)BPaaS流程平台安装

本文是H-ZERO 安装部署笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心- 《HZERO 轻量版》技术文档进行部署实践,选择快速开始->微服务版进行安装; 但作为初学者, 水平太低, 由于轻量版合并了多个微服务,要改各种配置,过程中遇到多个困难,没有搞定🙂, 后来按照 开放平台->社区与合作伙伴->文档中心- 《HZERO汉得企业级PaaS平台》 技术文档进行 标准版(没有合并微服务的版本) 安装部署实践 ,安装部署成功了。本系列文章记录了这个过程。

需要说明的是,如果不是出于学习研究目的,是不需要这么麻烦的,技术中心有发发行版,可以一键安装,一小时不到可以全部安装完成。

本文是出于学习研究目的,按照技术文档从制品库里面拿各种零件进行组装,所以过程会比较繁琐,供学习研究参考。

实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04

十、BPaaS 流程平台安装

在/d02 目录下新建目录hzero-bpaas

在hzero 1.12.1父组件下选配工作流服务组件:

下载后放入/d02/hzero-bpaas目录下:

这注意,种子数据初始化工程resource-package.zip 并没有拷贝过来,因为工作流和低代码平台的种子数据初始化工程都没有更新到选配平台,需要直接从猪齿鱼git仓库拉下来;

首先确保自己已经在猪齿鱼git仓库有账号(汉得系员工的账号会自动同步到猪齿鱼git仓库)

关于工作流服务的种子数据如何安装,在开放平台文档中并未明确提及,只是在从1.19升级到1.20中有提及,具体参考:开放平台/社区与合作伙伴/文档中心/班翎流程平台WittyFlow,选择:1.20.0Release

在文档目录:班翎工作流服务/组件列表/班翎工作流组件WittyFlow/升级指南/升级到1.20/流程组件/从1.19升级到1.20

登录猪齿鱼的git库:https://code.choerodon.com.cn/hzero-hzero-cust/hwkf-resource/-/tree/1.20-1.12.RELEASE?ref_type=heads

git clone -b 1.20-1.12.RELEASE git@code.choerodon.com.cn:hzero-hzero-cust/hwkf-resource.git

拉到本地后,更改application.yml文件,在数据库链接rul中添加:allowPublicKeyRetrieval=true

然后运行 启动

先更新数据库,再导入数据(因为我们是新安装,不是升级,第2步不需要),完成后在数据库中查看一下

1、启动workflow流程服务:

从选配下来的workflow工程服务的POM文件看,其workflow的snap-shop版本还是1.9的,说明workflow团队尚未完成对hzero 1.12的适配,至少在选配平台上尚未完成这项工作,所以我们需要更改POM文件内容,具体参考:开放平台/社区与合作伙伴/文档中心/班翎流程平台WittyFlow,选择:1.20.0Release

在文档目录:班翎工作流服务/组件列表/班翎工作流组件WittyFlow/升级指南/升级到1.20/流程组件/底座兼容Hzero1.12 目录下有具体的POM文件内容,替换一下即可。

然后就是常规处理步骤:

1.1 编辑服务的application.yml文件在数据库链接rul中添加:allowPublicKeyRetrieval=true

server-uri改一下  

orchestration:

    server-uri: ${HZERO_ORCHESTRATION_SERVER_URI:http://gateway.hzero.com.cn}

1.2  编辑 服务的bootstrap.yml 文件,在 spring.cloud层级下添加网卡选择:

    inetutils:

      # 设置首选网卡,对于本机有多块网卡的情况,可以设置首选网卡来注册

      # 指定忽略的网卡

      ignored-interfaces[0]: lo

      # 选择注册的网段

      preferred-networks[0]: 172.18.14.48

1.3 把原来服务模块下的run.sh 和stop.sh都拷贝过来;

编辑run.sh ,把端口号改成跟服务的 bootstrap.yml文件中定义的端口号一致,把 AGENT 变量改成

-javaagent:/d02/hzero/project/ps-license/licenseAgent/license-agent111.jar

1.4 由于apaas-common依赖中使用了反射机制,去访问内部类中的方法,所以启动项目时需要添加这行命令

–add-opens java.base/java.lang=ALL-UNNAMED –add-opens java.base/java.util=ALL-UNNAMED –add-opens java.base/java.util.concurrent=ALL-UNNAMED

执行 sh run.sh

构建失败,应该是1.20.0-1.12.RELEASE的工作流版本还没推到制品库

关闭中间件,关机,周一再弄。

systemctl stop mysql redis nginx mongod minio

周二听说工作流团队已经把1.20.0-1.12.RELEASE版本推到制品库了,再次执行sh run.sh,这次构建成功了:

不过启动服务失败了:

按照开放平台工作流部署文档要求改:

修改启动类 !!!

  • 修改启动类名称改为HzeroWorkflowApplication
  • 启动类添加注解**@EnableHzeroWorkflow**

  开放平台文档这部分内容是错误的,不应该改,选配完成就保持是对的。

  按照开放平台工作流升级文档《升级到1.20/流程组件/底座兼容Hzero1.12》修改application.yml 和 bootstrap.yml 然后再运行run.sh ,依然是可以构建,但服务启动失败。错误日志看是却少类文件,后面跟工作流团队小伙伴一起调整了几次POM均不成功,后来干脆把工作流团队小伙伴自己构建工作流服务的POM 拷贝过来稍加修改,启动依然失败,表象是license服务调用有问题,但看到一个out of Memory的提示,于是把启动内存从300M调整到一个G就启动成功了;

  实际工作中,我们不可能用研发团队自己的POM,因为里面依赖项非常多,既然我们构建自己组件的时候已经依赖他们的组件,就不需要在POM文件里面再重复引入,于是我们在这个能正常启动的POM上进行删除内容,直到能正常启动服务且显式依赖最少,最终得到一个最简的POM

<?xml version=”1.0″ encoding=”UTF-8″?>

<project xmlns=”http://maven.apache.org/POM/4.0.0″ xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

         xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

    <modelVersion>4.0.0</modelVersion>

    <parent>

        <groupId>org.hzero</groupId>

        <artifactId>hzero-parent</artifactId>

        <version>1.12.1.RELEASE</version>

    </parent>

    <groupId>org.hzero</groupId>

    <artifactId>ps-workflow-snapshot</artifactId>

    <version>1.20.0-1.12.RELEASE</version>

    <name>ps-workflow</name>

    <dependencies>

        <dependency>

            <groupId>org.hzero</groupId>

            <artifactId>hzero-workflow</artifactId>

            <version>1.20.0-1.12.RELEASE</version>

        </dependency>

        <!– spring-boot 这一段去掉,服务能起来,但在注册中心就看不到这个服务 因为 hzero-workflow对该组件的依赖选项 option=true ,意味着只对他自己有效,不会传递给依赖他的组件  –>

        <dependency>

            <groupId>org.springframework.cloud</groupId>

            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

            <optional>true</optional>

        </dependency>

        <!– db driver 这段去掉就报错,服务起不来 因为 hzero-workflow对该组件的依赖选项 option=true ,意味着只对他自己有效,不会传递给依赖他的组件  –>

        <!– Spring Boot 启动时会自动配置数据源  如果找不到 MySQL 驱动类,导致数据源初始化失败,最终服务启动失败。–>

        <dependency>

            <groupId>com.mysql</groupId>

            <artifactId>mysql-connector-j</artifactId>

            <optional>true</optional>

        </dependency>

    </dependencies>

    <repositories>

        <repository>

            <id>HzeroRelease</id>

            <name>Hzero-Release Repository</name>

            <url>http://nexus.saas.hand-china.com/content/repositories/Hzero-Release/</url>

        </repository>

        <repository>

            <id>HskpRelease</id>

            <name>Hskp-Release Repository</name>

            <url>http://nexus.saas.hand-china.com/content/repositories/hskp-release/</url>

        </repository>

        <repository>

            <id>HzeroSnapshot</id>

            <name>Hzero-Snapshot Repository</name>

            <url>http://nexus.saas.hand-china.com/content/repositories/Hzero-Snapshot/</url>

        </repository>

    </repositories>

</project>

构建Wrokflow的前端工程:

上次从产品组那里拷贝过来的Dist文件没有工作流的前端模块,所以需要单独构建;

由于构建前端工程的过程中至少需要8G剩余内存,所以如果原来已经启动了很多服务,需要把服务先停掉,等我们构建完成之后再重新启动,先停掉所有服务:

root@desktop-jacksen:/d02# sh service-stop-all.sh

1、把原来dist目录拷贝到当前选配工程的front目录下(因为要合并dist/packages/microConfig.json 这个文件每个模块有对应的hash值,没法直接手动改,必须靠程序去合并更改)

cp -rf /d02/hzero/front/dist /d02/hzero-bpaas/front

2、查看当前当前选配工程的front目录下的package.json文件,hzero-front-hwkf 的版本是1.9.0 ,依赖的hzero-front 是1.12.0

在当前当前选配工程的front目录下执行(这一步是把最新的版本拉到node_moudules目录下):

yarn

之后运行npx umi hzero-info 查看当前yarn拉下来的各模块版本:

[System Information]
OS Version : linux – 5.15.167.4-microsoft-standard-WSL2
NodeJS Version : 20.19.3
YARN Version : 1.22.22

[Dependence Information]
@hzerojs/preset-hzero version : 1.3.9
choerodon-ui version : 1.6.6
hzero-front version : 1.12.2
umi version : 3.5.43

[Standard Module Information]
hzero-front-hwkf version : 1.19.1

3、在当前选配工程的front目录下执行:

yarn run build:ms hzero-front-hwkf(这会单独打包这个子模块,并往dist目录下的microConfig.json写拼接内容)

编译失败  , 报了一堆缺文件的错误;考虑到上次单独编译iam 和接口平台是成功的,那么我考虑是否在上次那个工程中把hwkf模块加上,在那边去构建?

于是我们到 /d02/hzero/front/front目录下在package.jason文件中加上hwkf模块:

再次执行构建命令:

cd /d02/hzero/front/front

root@desktop-jacksen:/d02/hzero/front/front# yarn

root@desktop-jacksen:/d02/hzero/front/front# yarn run build:ms hzero-front-hwkf

这次构建依然失败,不过比上次构建错误少很多,上次是16个错误,这次只有3个错误,而且这三个错误都是引用了apaas中的组件,缺少这些组件引起的,估计这是apaas前端新增的几个组件,我如果重新构建下apaas的前端,也许就有了。

在package.jason 中添加apaas模块:

“hzero-front-apaas”: “~2.9.1-beta.5”,

再次 yarn

再次 npx umi hzero-info 查看新版本

hzero-front-apaas version : 2.9.1-beta.8

再次build

yarn run build:ms hzero-front-hwkf

这次只有一个错误了:

在package.jason 中把hzero-front-hlod加上,再次yarn 把库拉下来,然后再次build hwkf

这次成功了:

4、再把新的dist目录拷贝到原来位置,更改目录权限,再执行run-front.sh 替换字符串

cp -rf /d02/hzero/front/front/dist  /d02/hzero/front/

sudo chown -R www-data:www-data /d02/hzero/front/dist

sudo chmod -R 755 /d02/hzero/front/dist

cd /d02/hzero/front/

./run-front.sh

  1. 然后再重启所有后台服务:

cd /d02/hzero/project

sh start_all.sh

测试: 工作流界面可以打开,不过报授权不够的错误:

看授权信息,有workflow的授权,但版本是1.19.* 的,而我们用的版本已经到了1.20.0-1.12.RELEASE,所以重新申请授权,更换授权信息就可以了。

2、WorkForm服务

 流程团队说,这个服务已经不维护了,也不需要安装。

HZERO PaaS平台组装笔记(九)aPaaS低代码平台安装

本文是H-ZERO 安装部署笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心- 《HZERO 轻量版》技术文档进行部署实践,选择快速开始->微服务版进行安装; 但作为初学者, 水平太低, 由于轻量版合并了多个微服务,要改各种配置,过程中遇到多个困难,没有搞定🙂, 后来按照 开放平台->社区与合作伙伴->文档中心- 《HZERO汉得企业级PaaS平台》 技术文档进行 标准版(没有合并微服务的版本) 安装部署实践 ,安装部署成功了。本系列文章记录了这个过程。

需要说明的是,如果不是出于学习研究目的,是不需要这么麻烦的,技术中心有发发行版,可以一键安装,一小时不到可以全部安装完成。

本文是出于学习研究目的,按照技术文档从制品库里面拿各种零件进行组装,所以过程会比较繁琐,供学习研究参考。

实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04

九、aPaaS低代码平台安装:

在/d02目录下新建目录hzero-apaas

ls -al ~/.ssh/id_rsa.pub  # 查看RSA密钥,如果没有密钥,创建一个:

ssh-keygen -t rsa -b 4096 -C “your_email@example.com”  # 生成RSA密钥

在生成过程中,按提示连续按回车键即可,无需设置密码。

cat ~/.ssh/id_rsa.pub  #查看密钥,把看到的密钥在猪齿鱼平台填入

ssh -T git@code.choerodon.com.cn  #验证,正常会看到欢迎词

然后可以按文档指示下载种子数据工程了:

git clone -b 2.9-release git@code.choerodon.com.cn:hzero-hlod/hzero-lowcode-resource.git

下周三(7月16日)飞搭产品团队会发2.10版本的产品,新增功能比较多,比如零代码开发能力、AI辅助设计能力、支持通用组件开发能力等等都是大功能;

2.10版本会发两个版本,for-hzero-1.11 和for-hzero-1.12两个版本;之所以会发两个版本是因为hzero 1.11 到 1.12 JDK版本做了大升级,从JDK 8升级到了 JDK 17;  飞搭要分别为hzero 1.11的客户提供JDK8的客户端,为hzero 1.12的客户提供JDK 17的客户端;

飞搭 2.11版本之后将不再兼容hzero 1.11版本;

今天是7月16日,得到消息是2.10的测试未完成,不能按计划发版,那就先安装2.9版本的,目前DIST 文件是7月9日构建的 前端全模块工程,里面的飞搭前端版本是 2.9.1-beta.5 , 这个前端版本对应的后端飞搭服务版本适配 hzero 1.12 ,需要的后端服务是2.9 -1.12

先安装数据库

1.1 编辑服务的application.yml文件在数据库链接rul中添加:allowPublicKeyRetrieval=true ,然后运行database-init.sh ,启动web页面,成功导入:

但现在以hzero 1.12.1父组件选配低代码组件,得到的是2.10版的,所以数据要升级到2.10版

git clone -b 2.10-release git@code.choerodon.com.cn:hzero-hlod/hzero-lowcode-resource.git

可惜运行第一步更新数据库出错,是数据库URL里面多了一个/, 估计是版本数据有问题,未经充分测试,故意防止其他人成功运行,以免破坏数据的。

那这样的话,我们就还是安装2.9.0 for hzero1.12的版本吧,把选配下来的工程更改下依赖的版本就好了,支持组给了一个产品组打的包,版本号是:2.9.1-1.12.BETA.6,父组件也设置为这个版本。

1、启动model服务

  1. 编辑服务的application.yml文件在数据库链接rul中添加:allowPublicKeyRetrieval=true

1.2  编辑 服务的bootstrap.yml 文件,在 spring.cloud层级下添加网卡选择:

    inetutils:

      # 设置首选网卡,对于本机有多块网卡的情况,可以设置首选网卡来注册

      # 指定忽略的网卡

      ignored-interfaces[0]: lo

      # 选择注册的网段

      preferred-networks[0]: 172.18.14.48

1.3 把原来服务模块下的run.sh 和stop.sh都拷贝过来;

编辑run.sh ,把端口号改成跟服务的 bootstrap.yml文件中定义的端口号一致,把 AGENT 变量改成

-javaagent:/d02/hzero/project/ps-license/licenseAgent/license-agent111.jar

服务构建成功,但启动失败,同样的工程支持组同事在他本地是可以成功启动服务的,那就把本地仓库中的hzero目录下的内容清掉再试;

cd /root/.m2/repository/org/hzero

rm -rf ./*

再重新启动 sh run.sh  问题依旧。 经测试发现,如果在启动命令中用agent103 就会出现找不到类的错误:java.lang.NoClassDefFoundError: org/springframework/core/NestedIOException

如果启动命令中不用javaaget参数或者用agent111就不会出现找不到类的错误;

构建Maven依赖树,输出内容粘贴到记事本,然后查找license ,可以看到依赖的版本,

mvn dependency:tree | grep -i license

如果父组件依赖的是

<parent>

        <groupId>org.hzero</groupId>

        <artifactId>hzero-apaas-parent</artifactId>

        <version>2.9.1-1.12.BETA.6</version>

    </parent>

那么Maven树里面依赖的license就是1.1.0.BETA 版本的

如果父组件依赖的是

    <parent>

        <groupId>org.hzero</groupId>

        <artifactId>hzero-parent</artifactId>

        <version>1.12.1.RELEASE</version>

    </parent>

那么Maven树里面依赖的license 就是1.1.2版本的

这说明2.9.1-1.12.BETA.6版本的model服务依赖的是1.1.0.BETA版本的license服务,应该使用license-agent110.jar ;

在run.sh 中更换javaAgent启动参数为license-agent110.jar 后再次启动就能正常启动了,License那段检查过了,日志停在提示

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to bind properties under ‘hzero.lock.single-server.port’ to int:

Property: hzero.lock.single-server.port
Value: “${spring.redis.port}”
Origin: class path resource [application.yml] from ps-modeler.jar – 186:13
Reason: failed to convert java.lang.String to int (caused by java.lang.NumberFormatException: For input string: “${spring.redis.port}”)

Action:

Update your application’s configuration

把application.yml文件中redis 配置换位老的格式,就正常启动了

不过日志中一直提示不健康,不能注册到Admin

2025-07-16T21:34:10.627+08:00 ERROR 132048 — [hzero-modeler] [ration-Executor] o.h.boot.admin.AdminAutoRegistration     : [hzero-modeler] is unhealthy, cannot be registered to the admin

2025-07-16T21:34:15.643+08:00 ERROR 132048 — [hzero-modeler] [  XNIO-1 task-2]

324043

2、启动lowercode服务

  1. 编辑服务的application.yml文件在数据库链接rul中添加:allowPublicKeyRetrieval=true

1.2  编辑 服务的bootstrap.yml 文件,在 spring.cloud层级下添加网卡选择:

    inetutils:

      # 设置首选网卡,对于本机有多块网卡的情况,可以设置首选网卡来注册

      # 指定忽略的网卡

      ignored-interfaces[0]: lo

      # 选择注册的网段

      preferred-networks[0]: 172.18.14.48

1.3 把原来服务模块下的run.sh 和stop.sh都拷贝过来;

编辑run.sh ,把端口号改成跟服务的 bootstrap.yml文件中定义的端口号一致,把 AGENT 变量改成

-javaagent:/d02/hzero/project/ps-license/licenseAgent/license-agent111.jar

  • 启动LowCode服务

   所需配置改动跟model服务类似,启动之后在注册中心可见

HZERO PaaS平台组装笔记(八)iPaaS集成平台安装

本文是H-ZERO 安装部署笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心- 《HZERO 轻量版》技术文档进行部署实践,选择快速开始->微服务版进行安装; 但作为初学者, 水平太低, 由于轻量版合并了多个微服务,要改各种配置,过程中遇到多个困难,没有搞定🙂, 后来按照 开放平台->社区与合作伙伴->文档中心- 《HZERO汉得企业级PaaS平台》 技术文档进行 标准版(没有合并微服务的版本) 安装部署实践 ,安装部署成功了。本系列文章记录了这个过程。

需要说明的是,如果不是出于学习研究目的,是不需要这么麻烦的,技术中心有发发行版,可以一键安装,一小时不到可以全部安装完成。

本文是出于学习研究目的,按照技术文档从制品库里面拿各种零件进行组装,所以过程会比较繁琐,供学习研究参考。

实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04

八 、iPaaS集成平台安装:

选配与数据初始化:

从集成平台-父工程 1.8开始选配,选配这三个组件

      先完成数据初始化:

mongoDB安装: 集成平台的服务编排要用到mongoDB,所以要先安装

     在腾讯元宝中输入:ubuntu 22.04 安装 mongoDB的命令

     按照元宝指示执行MongoDB的安装命令,安装完成后,创建用户hzero

root@desktop-jacksen:/d02# mongosh

test> db.createUser({
… user: “hzero”,
… pwd: “hzero”,
… roles: [
… “readWrite”,
… “dbAdmin”
… ]
… })
{ ok: 1 }
test>

在/etc/hosts中加条记录:

172.18.14.48 mongo.hzero.com.cn #集成平台服务编排要用的mongoDB地址

root@desktop-jacksen:/d02# nano /etc/mongod.conf

更改bindIp ,从127.0.0.1 改成0.0.0.0 在任何地址上侦听

bindIp: 0.0.0.0

然后重启服务:

sudo systemctl restart mongod

然后开始安装启动服务

1、启动 orchestration-all 编排服务

1.1 编辑服务的application.yml文件在数据库链接rul中添加:allowPublicKeyRetrieval=true

server-uri改一下  

orchestration:

    server-uri: ${HZERO_ORCHESTRATION_SERVER_URI:http://gateway.hzero.com.cn}

1.2  编辑 服务的bootstrap.yml 文件,在 spring.cloud层级下添加网卡选择:

    inetutils:

      # 设置首选网卡,对于本机有多块网卡的情况,可以设置首选网卡来注册

      # 指定忽略的网卡

      ignored-interfaces[0]: lo

      # 选择注册的网段

      preferred-networks[0]: 172.18.14.48

1.3 把原来服务模块下的run.sh 和stop.sh都拷贝过来;

编辑run.sh ,把端口号改成跟服务的 bootstrap.yml文件中定义的端口号一致,把 AGENT 变量改成

-javaagent:/d02/hzero/project/ps-license/licenseAgent/license-agent111.jar

运行./run.sh  , 构建成功,但服务启动失败:

日志:

跟石云沟通,说是,启动的javaAgent版本不对,改成110版本就好了。试了一下,果然成功了,在注册中心可见:

2、启动frontal 前置机服务

相关配置更改类似 编排服务

构建时碰到问题:

把POM.xml中依赖组件的具体版本号去掉就可以了

3、启动  frontal-proxy前置机代理服务

这个前置机代理,暂时不需要部署。

4、安装后逐菜单检查:

问题1、服务编排/应用连接器 : 白屏

服务编排/应用连接器,点进去会出现白屏:

HZERO PaaS平台组装笔记(七)改装标准版-重新选配初始化

本文是H-ZERO 安装部署笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心- 《HZERO 轻量版》技术文档进行部署实践,选择快速开始->微服务版进行安装; 但作为初学者, 水平太低, 由于轻量版合并了多个微服务,要改各种配置,过程中遇到多个困难,没有搞定🙂, 后来按照 开放平台->社区与合作伙伴->文档中心- 《HZERO汉得企业级PaaS平台》 技术文档进行 标准版(没有合并微服务的版本) 安装部署实践 ,安装部署成功了。本系列文章记录了这个过程。

需要说明的是,如果不是出于学习研究目的,是不需要这么麻烦的,技术中心有发发行版,可以一键安装,一小时不到可以全部安装完成。

本文是出于学习研究目的,按照技术文档从制品库里面拿各种零件进行组装,所以过程会比较繁琐,供学习研究参考。

实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04

七、放弃Lite版-改装标准版-重新选配初始化

Lite版因为服务合并了,跟标准文档说明相比,估计有很多配置要改,作为初学者,不熟悉,感觉搞不定了;是否可以考虑没有合并服务的标准版?

我们原来使用合并的hzero-lite服务是因为听说每个服务都要2G内存,如果不合并,基础服务就要有9+5 =14个,就要28G内存了,再加上飞搭3个就要34G内存了。个人笔记本跑不动,但实际我们测试下来,个人开发测试用的话,这些服务平均每个分配500M足够了(有的多一些,比如hzero-admin 给500M够了,可以稳定不掉线,有的少一些 ,比如注册中心300M够了,也可以稳定不掉线);

所以即使我们不合并服务,开发平台高低代码融合版也就14+3=17个服务,8.5G 内存就够了。没必要用Lite合并服务版;毕竟没有合并的版本已经久经沙场,比较稳定了。

接下来我打算弃用Lite合并服务,直接单独安装那9个服务了;


1、从选配开始,把注册中心、license服务、平台治理(admin)、网关、接口平台、以及lite合并的9个服务(iam、oauth、message、platform、import、file、scheduler、swagger、report) 重新选配成一个工程。

2、把 redis缓存中内容全部清除

  1. 把 数据库中的三个库删除掉
  2. 重新初始化数据
  3. 重新起后台服务
  4. 重新替换前端工程中的字符串(参考下hzerojs 手册,把原替换脚本缺失的内容完善一下)
  5. 验证安装可用性;

1)重新选配

1 、把原来hzero 目录改名hzero-lite , 建立新的hzero目录,新选配的内容放入这个新的hzero目录

进入开放平台/开发者/项目中心

选择或者新建一个项目:

进入服务选配:

进入服务端选配:这里简单说明下,虽然还有另外的前端选配和移动端选配,一般都用不到到,服务选配后会自动生成前端工程,所以无需进行前端选配。

点击进入选配平台:

先建立一个父组件,H-ZERO个人学习版父组件,版本跟选择依赖的HZERO父组件保持一致,点确定计入下一步:

点击“批量添加”选择我们要的组件(14个):

确认进入下一步:

服务前缀我们还是填ps

全选13项,进入下一步:

显示我们的选配结果,点下一步:

先导出工程,再下载种子数据,其他没有用;

全部下载到本地:

下载完毕,关闭当前页面,进入下一步:下载种子数据:

到这里选配准备工作就完成了。

2)清除Redis和mysql数据

接下来我们把之前安装的数据库和redis中的数据清掉:

redis中只有db1有内容:

清空的命令:redis-cli -n 1 链接redis,选择1库,用flushdb命令清空

root@desktop-jacksen:/d02/hzero/project/ps-register# redis-cli -n 1
127.0.0.1:6379[1]> FLUSHDB
OK
127.0.0.1:6379[1]> keys *
1) “websocket:socket-nodes:c40a8eb763364dec91c956c3ab2209fb”
2) “websocket:socket-nodes:all”
127.0.0.1:6379[1]> flushdb
OK
127.0.0.1:6379[1]> keys *
(empty array)
127.0.0.1:6379[1]> exit
root@desktop-jacksen:/d02/hzero/project/ps-register#

查看清空后的结果:

接着把mysql中的库删除掉:

把这三个库删除掉:

mysql> drop database hzero_admin;
Query OK, 68 rows affected (1.30 sec)

mysql> drop database hzero_interface;
Query OK, 162 rows affected (2.14 sec)

mysql> drop database hzero_platform;
Query OK, 444 rows affected (5.07 sec)

接下来重新初始化数据:先在/d02/hzero目录下新建resource-package目录,然后把resource-package.zip拷贝过去解压缩

root@desktop-jacksen:/d02/hzero# mkdir resource-package
root@desktop-jacksen:/d02/hzero# cp resource-package.zip ./resource-package

root@desktop-jacksen:/d02/hzero# cd resource-package

root@desktop-jacksen:/d02/hzero/resource-package# unzip resource-package.zip

3)数据初始化

先在/d02/hzero目录下新建一个project 目录,把project.zip拷贝到这个目录下,解压缩

编辑\resource-package 目录下的application.yml文件,做两处修改
1、替换MySQL驱动字符串
2、在链接数据库的url链接中增加红框部分参数。

此举是为了兼容MySQL8

更改初始化脚本的执行模式,然后执行脚本:

chmod +x database-init.sh

root@desktop-jacksen:/d02/hzero/resource-package# chmod +x database-init.sh
root@desktop-jacksen:/d02/hzero/resource-package# ./database-init.sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 111M 100 111M 0 0 12.9M 0 0:00:08 0:00:08 –:–:– 10.8M
HZERO 1.12.RELEASE 更新开始…………..
启动工具…

……

The project address: http://127.0.1.1:8099

脚本执行完毕会启动一个web服务,可以打开这也页面,我的虚拟机IP是172.18.14.48,所以访问地址替换成:172.18.14.48:8099

点全选,然后点更新数据库

这个过程是往数据库中建库建表,大概需要3分钟,完成会提示更新完成。

由于我们是新建系统,不是升级系统,所以第二步可以跳过,不用做,直接做第三步 导入数据,这一步,也点全选,然后点“导入”

这一步是往数据库中导入种子数据

这个导入也很快,就几分钟;增加了8个数据库

找个表验证下数据:hzero_platform库里的 iam_menu表,3994条数据,对的。

4)构建jar并启动服务

进入project 目录,执行 mvn install , 这会把父组件(包括其所有依赖的组件)安装到本地,我们这次是最新的1.12.1,应该有些新的包会刷新到本地库。

接下来开始修改各服务的配置文件,启动服务;

接下来进入各子模块,用命令 mvn clean package -Dmaven.test.skip=true

就按从上到下的顺序:

就按照从上到下的顺序构建:
drwxr-xr-x 4 root root 4096 Jul 6 15:33 ps-admin/
drwxr-xr-x 4 root root 4096 Jul 6 15:33 ps-file/
drwxr-xr-x 4 root root 4096 Jul 6 15:33 ps-gateway/
drwxr-xr-x 4 root root 4096 Jul 6 15:33 ps-iam-saas/
drwxr-xr-x 4 root root 4096 Jul 6 15:33 ps-import/
drwxr-xr-x 4 root root 4096 Jul 6 15:33 ps-interface/
drwxr-xr-x 4 root root 4096 Jul 6 15:33 ps-license/
drwxr-xr-x 4 root root 4096 Jul 6 15:33 ps-message/
drwxr-xr-x 4 root root 4096 Jul 6 15:33 ps-oauth/
drwxr-xr-x 4 root root 4096 Jul 6 15:33 ps-platform/
drwxr-xr-x 4 root root 4096 Jul 6 15:33 ps-register/
drwxr-xr-x 4 root root 4096 Jul 6 15:33 ps-report/
drwxr-xr-x 4 root root 4096 Jul 6 15:33 ps-scheduler/
drwxr-xr-x 4 root root 4096 Jul 6 15:33 ps-swagger/

所有的子模块都顺利构建成功,除了ps-license除外,原因是潇葳之前说过,他的license服务不能依赖hzero的父组件,要依赖他license的父组件,在POM中把ps-license的父组件改成:

   <parent>

        <groupId>org.hzero.license</groupId>

        <artifactId>hzero-license-parent</artifactId>

       <version>1.0.3.RELEASE</version>

   </parent>

再次构建就OK了;

1、启动register服务

把原来的注册中心模块下的 run.sh 脚本拷贝过来,并在application.yml中加上网卡IP地址选择:

  cloud:

    inetutils:

      # 设置首选网卡,对于本机有多块网卡的情况,可以设置首选网卡来注册

      # 指定忽略的网卡

      ignored-interfaces[0]: lo

      # 选择注册的网段

      preferred-networks[0]: 172.18.14.48

运行 run.sh 后启动成功,验证页面:

2、启动License 服务

2.1 把原来license服务模块下的run.sh 和stop.sh都拷贝过来;

2.2 把原来license 服务模块下的licenseAgent 目录拷贝过来,里面有启动命令里面要用的agent文件

2.3 在bootstrap.yml文件中添加网卡选择:

    inetutils:

      # 设置首选网卡,对于本机有多块网卡的情况,可以设置首选网卡来注册

      # 指定忽略的网卡

      ignored-interfaces[0]: lo

      # 选择注册的网段

      preferred-networks[0]: 172.18.14.48

然后运行run.sh 成功启动服务,验证:

访问8105端口,可以看到license服务的页面,

点激活链接:会打开远程的汉得开放平台的网站页面,里面会显示你曾经申请的授权记录,选择一条通过审核的license授权申请,确认还有剩余激活次数,然后点右上角的“激活”按钮,会出来一个激活码的页面,把这个激活码复制下来。(顺便发送邮件,可以在你邮箱中保存这个激活码),关闭窗口,回到自己的license服务页面。

填入激活码验证,然后点验证按钮,可以看到激活成功;

点查看详情,可以看到具体授权信息:

在注册中心,我们也可以看到license服务已经成功注册;

license服务出现向注册中心发心跳不稳定的问题,主要原因还是eurke的版本不兼容,

把iam的POM拷贝过来改了一下,现在OK了,已经起来了,后面就观察到比较稳定不掉线了。

3、启动iam服务

3.1 把原来license服务模块下的run.sh 和stop.sh都拷贝过来;

编辑run.sh ,把端口号改成跟iam bootstrap.yml文件中定义的端口号一致 8030,把 AGENT 变量改成

-javaagent:/d02/hzero/project/ps-license/licenseAgent/license-agent111.jar

3.2 编辑iam服务的application.yml文件在数据库链接rul中添加:allowPublicKeyRetrieval=true

3.3  编辑 iam服务的bootstrap.yml 文件,在 spring.cloud层级下添加网卡选择:

    inetutils:

      # 设置首选网卡,对于本机有多块网卡的情况,可以设置首选网卡来注册

      # 指定忽略的网卡

      ignored-interfaces[0]: lo

      # 选择注册的网段

      preferred-networks[0]: 172.18.14.48

运行./run.sh  ,成功启动,在注册中心可以看到服务已经注册上来了:

redis中也有内容了:

4、启动oauth 服务

oauth需要做的配置改动给iam类似,2个区别是
1、启动命令行不需要AGENT,  所以在run.sh中AGENT 留空即可 AGENT=””.
2、application.yml文件中,登录成功后重定向的URL地址改成:success-url: ${HZERO_OAUTH_LOGIN_SUCCESS_URL:http://dev.hzero.com.cn/workplace}

更改完配置后启动成功,验证:

在redis缓存的db3中缓存信息:

5、启动message服务

所需配置改动跟oauth类似

运行./run.sh 成功启动,但看日志在等待注册到hzero-admin

2025-07-06T18:08:39.327+08:00 INFO 64303 — [hzero-message] [ XNIO-1 task-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 4 ms
2025-07-06T18:08:39.421+08:00 WARN 64303 — [hzero-message] [ration-Executor] o.h.boot.admin.AdminAutoRegistration : Register to [hzero-admin] server failed! retry to execute until success…

不过过了几十秒,它还是跳过这个步骤,继续向注册中心报到成功了:

所以,这里留个问题,是否一定要先启动hzero-admin再启动hzero-message?

1、启动admin服务

所需配置改动跟oauth类似

服务启动后在注册中心可见:

redis缓存可见hadm目录下的路由配置信息:

2、启动platform服务

所需配置更改通oauth类似,platform 服务内容比较多,启动内存从300M改成500M

启动后:

3、启动file服务

所需配置改动与 oauth类似

启动后在注册中心可见:

4、启动import服务

所需配置改动与 oauth类似

启动后在注册中心可见:

5、启动interface服务

所需配置改动与 oauth类似,调整下操作顺序,更加顺利:

10.1 编辑服务的application.yml文件在数据库链接rul中添加:allowPublicKeyRetrieval=true

10.2  编辑服务的bootstrap.yml 文件,在 spring.cloud层级下添加网卡选择:

    inetutils:

      # 设置首选网卡,对于本机有多块网卡的情况,可以设置首选网卡来注册

      # 指定忽略的网卡

      ignored-interfaces[0]: lo

      # 选择注册的网段

      preferred-networks[0]: 172.18.14.48

     10.3  把原来oauth服务模块下的run.sh 和stop.sh都拷贝过来;编辑文件 ,把端口号改成跟bootstrap.yml文件中定义的端口号一致

启动后在注册中心可见:

6、启动report服务

所需配置改动与 interface类似

启动后在注册中心可见:

7、启动schedule服务

所需配置改动与 interface类似

启动后在注册中心可见:

Redis 缓存情况:

注意 在db4中可见gateway的配置缓存:

8、启动swagger服务

所需配置改动与 interface类似

启动后,在注册中心未见,查日志有SQL错误,有timeout, AI分析日志说是驱动不兼容或者mysql服务端问题或者网络问题, 实际盘查都没问题,mysql 的 error 日志今天一天都没有异常;网络都在同一台服务更不会有问题,AI没有给出正确的分析思路。 我仔细对比跟其他服务的POM和yml的配置差异,发现yml中数据库链接地址不一样,要改:

重新启动后在注册中心可见:

测试:http://172.18.14.48:8080/swagger/swagger-ui.html

9、启动gateway服务

所需配置改动与 interface类似,有个额外的配置是要添加下服务的端口,这应该是选配平台上准备文件的失误:

服务启动后,在注册中心可见:

  1. 启动alert 服务(这个服务是因为后面接口平台测试时发现缺少这个服务报错而后加的)

所需配置改动与 interface类似

服务启动后,在注册中心可见:

服务问题排查

问题1、license服务不稳定问题

License服务不稳定,时不时的会从注册中心掉线,其他服务就很稳定,基本从不掉线;

日志分析显示主要原因是eureka的版本不一致,也就是license服务依赖的eureke和注册中心依赖的eureka版本不一致,注册中心依赖的hzero parent 1.12.1 父组件,直接选配的license服务依赖这个组件构建不成功,需要改配置,把父组件改成 hzero-license的1.0.3父组件才能构建成功,这hzero-license的1.0.3父组件 跟hzero parent 1.12.1 父组件用的eureka的版本不一致可能不一致。

解决:潇葳说他后面新发版了1.1.2.RELEASE版本的license服务,使得新的license服务,可以依赖hzero parent 1.12.1 父组件成功构建,需要把本地maven库中hzero目录下的内容全部清除掉重新构建 ,然后启动命令中的agent要用112a版本的。

操作:

  1. 把license服务的POM文件改一下,license服务依赖改成1.1.2.RELEASE,依赖的parent组件改成hzero parent 1.12.1 父组件。
  2. 编辑run.sh文件把agent 改成license-agent112a.jar
  3. 清空本地库中hzero目录下的内容,再次执行run.sh构建

cd /root/.m2/repository/org/hzero

rm -rf ./*

cd /d02/hzero/project/ps-license

./run.sh

测试失败:构建的时候就报错了,错误显示是缺少mysql依赖的版本,但之前1.0.3版本的pom也没提供MySQL版本,也不会报错。所以实际不是版本问题,就是1.1.2版本的问题;

潇葳说license服务不需要和依赖MySQL ,就把它去掉了,去掉可以构建成功,但运行报错,潇葳另外给了一份application.yml文件,再次重启,还报错,元宝分析日志说是​依赖包完整性或配置问题 于是就把iam的POM文件拷贝一份过来,去掉mysql 依赖,替换组件名称和主依赖组件,改成了新的license的POM文件,重新构建启动,这次OK了,后面就是观察稳定性:

5)Nginx设置和前端工程重新替换标签:

1、已经编译好的前端工程Dist标签替换

nginx主配置:

/etc/nginx/nginx.conf

nginx站点配置:

/etc/nginx/sites-available/

  1. 在/d01/hzero  目录下新建front目录,并dist.zip文件拷贝过来, 然后解压缩

rm -rf dist

unzip dist.zip

2、更改dist 目录权限

sudo chown -R www-data:www-data /d02/hzero/front/dist

sudo chmod -R 755 /d02/hzero/front/dist

3、把原来front 目录下的run-front.sh拷贝过来,运行:

./run-front.sh

2、前端发现问题排查:

问题1:无法登录问题

在oauth的日志中 ,提示找不到静态文件 logo.svg

解决方案:在oauth的 src/main/resource 目录下新建static目录,把 /front/dist 目录下的hzero_logo_loading.svg拷贝过来,改名葳logo.svg

这么改了之后似乎没啥用;

输入超级用户 admin/Admin@123! 之后,界面重定向到了dev.hzero.com.cn/portal/home, 没有重定向到登录成功后的地址dev.hzero.com.cn/workplace;

看oauth的后台日志,报告了:

Client not assign any role! clientId: hzero-front-dev

解决方案:换成 hzero-front-uat

但问题依旧;

看前端检查,发现第一个接口调用返回404,前端架构组说这里应该返回401才对,这是取登录用户自身基础信息的接口,没登陆的时候正常用改返回401,那么前端会重定向到登录界面。

在swagger 界面去测试(http://172.18.14.48:8080/swagger/swagger-ui.html),模块选择hzero-iam

Ctrl + F 查找 self

找到Self 接口,展开

点【Excute】 执行测试,也是反馈404 ,点这个接口右上角的 锁图标进行登录认证测试:

Client 填入跟我们前端替换的client id 保持一致,勾选default, 然后点Authorizes 进行认证测试:

会跳到登录界面:

输入用户信息进行登录,登录后会跳到下面界面,一直打转:

检查错误类似:

Swagger 界面检查:

这里测试的时候返回状态应该是401; 问题定位在后端服务;

看后端iam日志:这里swagger点测试的时候,后端iam日志没有反应,说明这个服务没有到iam那里,可能在网关就被拦截掉了。

看后端网关服务日志:网关报错了:

查iam_permission表,确实找不到这个接口:

Select * from iam_permission where path like ‘%/hzero/v1/users/self%’

发现没记录;

删除记录:

Delete from iam_permission where  code like ‘hzero-iam%’

然后重启iam服务,启动完成后iam服务会把内容重新刷进iam_permission表,再查询发现有了:

再次进入系统,可以正常进入界面了:

再去swagger测试,状态返回就是401,而不是404了; 404通常表明在iam_permission表中没有信息,那是不正常的。 前端调用接口如果返回404,大概率是在iam_permission表中缺失信息,那为什么会出现这种情况呢? 我们之前出现过 /hzero/v1/users/self 这个接口在iam_permission缺失信息导致404,导致主页没登陆情况下无法重定向到登录界面的问题,后来重启iam服务,才在iam_permission表中出现这个接口的,这说明iam_permission表中内容的构建是不稳定的。

问题2:show-flag服务报404错误问题:

在swagger里面查,有这个接口,但执行也报404错误

去 iam_permission 表里查询, 查不到这条路由记录,于是就把iam_permission表中hzero-admin开头的路由记录都删除了

delete from iam_permission where code like ‘hzero-admin%’

然后再重启hzero-admin服务,发现没有把记录刷回来,在hzero-admin 的日志里面没有看到刷iam_permission的日志,在hzero-iam的日志里面倒是能看到刷permission的日志。

产品组说,iam_permission表是hzero-iam服务负责的表,按照微服务设计原则,其他微服务不会直接操作这张表的,所以到一定是hzero-iam服务刷进去的。 可以到开发管理/系统工具中去重新刷一下:

操作成功之后,再去看数据库:

Iam_permission表中就又有记录了。

缺失的那条 show-flag的路由也进来了:

界面访问上,show-flag 接口反馈200, 不报错了:

那这里引发一个问题:

为什么之前在iam_permission表中, iam服务的 接口/users/self 接口会缺失? 还有这个admin服务的show-flag接口会缺失?

在iam服务的启动日志中能不能看到报错日志?是什么原因导致初次启动所有服务的时候,iam没有刷全?是内存 配置少了吗?日志中搜索memory可能不到跟内训有关的错误日志。

把这个iam服务日志整个看了一遍,只有一处错误,就是检查自己不健康不能注册到admin, 没有其他错误了;

但这个错误应该不影响permission记录刷不全的问题。

2025-07-07T21:27:16.372+08:00 ERROR 446187 — [hzero-iam] [ration-Executor] o.h.b.a.t.health.CheckHealthServiceImpl  : [hzero-iam] is unhealthy, cannot be registered to the admin

org.springframework.web.client.RestClientException: http transport failed, cause: I/O error on GET request for “http://172.18.14.48:8030/v2/actuator/health”: Connect to http://172.18.14.48:8030 [/172.18.14.48] failed: Connection refused

所以这个问题依然是个迷。

3、逐菜单查验,

现在已经能正常登录了,接下来逐个菜单查验,看看是否都可用,是否有错误。

可用:就是点菜单能正常显示。

是否有错误:主要看检查/网络/里面对所有接口的调用是否都返回200OK

问题1 角色管理这三个菜单,点击没反应

请前端前端架构组团队帮忙看了之后,让空白处点击邮件查看源代码,打开了index.html , 发现里面BASE_PATH有错误.  

更改保存后再测试就OK了,角色管理菜单打开就有内容了:

顺便把前端替换脚本也修复一下:

问题2 接口平台/个人集成映射配置

这个错误,表面上看是调用后台接口,Get方法不被支持,但网络里面看所有的后台接口调用都是返回200 Ok,并没有错误,请前端架构组团队帮忙看了,

跟后台石云团队沟通了下,他们说最新的前端已经修复了这个问题,给的建议是:

iam前端更新到:hzero-front-hiam@1.12.1

hitf前端更新到:hzero-front-hitf: 1.12.1-beta.3

后端接口平台话清理掉本地maven的interface的相关缓存(org/hzero/boot/hzero-boot-interface@1.12.1、org/hzero/hzero-interface-gateway@1.12.1、org/hzero/hzero-interface-saas@1.12.1),重新打包。

具体操作:

重新构建iam和hitf的前端工程
  1. 把原来dist目录拷贝到当前选配工程的front目录下(因为要合并dist/packages/microConfig.json 这个文件每个模块有对应的hash值,没法直接手动改,必须靠程序去合并更改)

cp -rf /d02/hzero/front/dist /d02/hzero/front/front

  • 更改当前当前选配工程的front目录下的package.json文件,更新这两个前端模块的版本hzero-front-hiam@1.12.1,hzero-front-hitf@1.12.1-beta.3

在当前当前选配工程的front目录下执行(把最新的版本拉到node_moudules目录下):

yarn

之后运行npx umi hzero-info 查看当前yarn拉下来的各模块版本:

/d02/hzero/front/front# npx umi hzero-info

[System Information]
OS Version : linux – 5.15.167.4-microsoft-standard-WSL2
NodeJS Version : 20.19.3
YARN Version : 1.22.22

[Dependence Information]
@hzerojs/preset-hzero version : 1.3.6
choerodon-ui version : 1.6.6
hzero-front version : 1.12.2
umi version : 3.5.43

[Standard Module Information]
hzero-front-hpfm-dpc version : 2.1.4-beta.0
hzero-front-hfile version : 1.12.1
hzero-front-hsdr version : 1.12.1
hzero-front-hrpt version : 1.12.1
hzero-front-hpfm version : 1.12.1
hzero-front-hmsg version : 1.12.1
hzero-front-hitf version : 1.12.1-beta.4
hzero-front-himp version : 1.12.1
hzero-front-hiam version : 1.12.1
hzero-front-hgat version : 1.12.0
hzero-front-hadm version : 1.11.4
hzero-front-cusz version : 1.3.0

  • 在当前选配工程的front目录下执行:

yarn run build:ms hzero-front-hiam,hzero-front-hitf

(这会单独打包这里两个子模块,并往dist目录下的microConfig.json写拼接内容,这里要注意看下microConfig.json的内容是否只是更新了两个子模块的内容,而不是更新了全文见内容,因为我们选配的模块不全,原来那个Dist 是 1.12.0 比较全的版本,还包括了低代码的,如果是根据当前选配的工程来生成microConfig.json的话就不符合我们的要求,需要另外想其他办法解决这个问题)

编译失败  , 跟前端架构组团队沟通,说可能是内存不够,查内存

root@desktop-jacksen:/d02/hzero/front/front# free -h
total used free shared buff/cache available
Mem: 19Gi 14Gi 4.4Gi 2.0Mi 211Mi 4.3Gi
Swap: 5.0Gi 4.8Gi 210Mi

只有4G剩余,不够,剩余内存要大于8G,建议停掉后端服务后重新执行。

停掉后端服务之后剩余17G够了:

root@desktop-jacksen:/d02/hzero/project# free -h
total used free shared buff/cache available
Mem: 19Gi 1.5Gi 17Gi 2.0Mi 158Mi 17Gi
Swap: 5.0Gi 429Mi 4.6Gi

再次执行编译子模块的命令:

这次编译成功了:

The bundle size is significantly larger than recommended.
Consider reducing it with code splitting: https://umijs.org/docs/load-on-demand
You can also analyze the project dependencies using ANALYZE=1

Done in 289.98s.
root@desktop-jacksen:/d02/hzero/front/front#

检查了一下  dist/packages/microConfig.json 文件内容,原来存在的,不在我们本次选配范围内模块还在,应该OK的;

从时间戳来看,他应该只改了 dist/packages/microConfig.json 文件,dist/packages/hzero_front_hiam目录,dist/packages/hzero_front_hitf目录。

  • 再把新的dist目录拷贝到原来位置,更改目录权限,再执行run-front.sh 替换字符串

cp -rf /d02/hzero/front/front/dist  /d02/hzero/front/

sudo chown -R www-data:www-data /d02/hzero/front/dist

sudo chmod -R 755 /d02/hzero/front/dist

cd /d02/hzero/front/

./run-front.sh

  • 然后再重启所有后台服务:

cd /d02/hzero/project

sh start_all.sh

测试: 再次访问这个界面,原来的错误没有了,确实解决问题了。

不过这次因为第一次关闭所有微服务,再启动所有微服务,发现了两个新问题:

  1. report服务没有注册到注册中心,后来通过把内存从300M加到500M重启动解决了。
  2. Swagger文档看接口平台的API文档的时候报错:
    Unable to render this definition

The provided definition does not specify a valid version field.

Please indicate a valid Swagger or OpenAPl version field.Supported version fields are swagger: “2.0” and those thatmatch openapi: 3.0.n (forexample, openapi: 3.0.0 ).

这个问题,实际原因不是系统提示的这个问题,后来也是把接口平台的内训从500M加到700M重启解决了。

问题是,之前非批量启动服务的时候,并没有出现这个问题,另外还注意到,一次性批量启动这么多微服务的时候,虚拟机的内训消耗飙到了18G,而服务全部启动完成后,慢慢降下来,降到了10G,这说明批量启动微服务的时候,可能存在内存争用导致异常。

问题3 接口平台/服务注册/编辑

分析:

这是后端返回的错误:

在后台接口平台的服务日志中确实能找到 target must …的java报错信息,怀疑是不是内存太小导致的,把接口平台服务内存加大到2G再重启,再测试问题依旧,看起来跟内存无关,还是把内存恢复设置到700M

问了石云,石云说是种子数据有问题,因为服务编排没有安装,所以应该把这条数据删除掉就可以了。(或者另外安装服务编排的服务(属于集成平台模块),也就没有错误了)

但实测情况是安装了编排服务后问题依旧存在:

看接口平台后台服务的日志:

问题4 接口平台/API预警

分析: 这是后端接口返回的错误:

错误分析结果是有个预警服务没有安装

解决:安装预警服务;具体步骤也是选配平台选配后先数据初始化,在安装启动服务,具体这里就不展开了可以参考本文 七、重新选配服务/四、构建jar并启动服务/ 15、启动alert服务;

alert服务启动后再测试就没有问题了:

问题5 接口平台/集成工作台

解决:这个错误在安装 编排服务和前置机服务后就没有了。

问题6 接口平台/API门户/产品首页:

解决:这个错误在安装 编排服务和前置机服务后就没有了。

HZERO PaaS平台组装笔记(六)前端应用服务部署

本文是H-ZERO 安装部署笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心- 《HZERO 轻量版》技术文档进行部署实践,选择快速开始->微服务版进行安装; 但作为初学者, 水平太低, 由于轻量版合并了多个微服务,要改各种配置,过程中遇到多个困难,没有搞定🙂, 后来按照 开放平台->社区与合作伙伴->文档中心- 《HZERO汉得企业级PaaS平台》 技术文档进行 标准版(没有合并微服务的版本) 安装部署实践 ,安装部署成功了。本系列文章记录了这个过程。

需要说明的是,如果不是出于学习研究目的,是不需要这么麻烦的,技术中心有发发行版,可以一键安装,一小时不到可以全部安装完成。

本文是出于学习研究目的,按照技术文档从制品库里面拿各种零件进行组装,所以过程会比较繁琐,供学习研究参考。

实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04

六、前端应用部署

直接把编译完成的前端工程dist.zip 放到front目录,解压缩;

配置ngnix:

1、修改默认站点配置文件:

cd /etc/nginx/sites-available
cp default default.bak.20250702
nano default

内容:

# Default server configuration

#

server {

    listen 80 default_server;

    listen [::]:80 default_server;

    root /d02/hzero/front/dist;

    # Add index.php to the list if you are using PHP

    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location ~ \/[a-z.0-9]+\.(js|css|gif|png|jpg)$ {

        expires 7d;

    }

    location / {

        root /d02/hzero/front/dist;  

        index index.html index.htm;

        try_files $uri /index.html;

    }

    error_page 500 502 503 504 /50x.html;

        location = /50x.html {

        root /d02/hzero/front/dist;

    }

}

2、修改主配置文件:

cd /etc/nginx/

nano nginx.conf

把默认的server 部分配置注释掉:避免跟默认站点配置default中的Server配置冲突,添加主配置中没有的HTTP参数

# 仅添加主配置中没有的HTTP参数
log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
‘$status $body_bytes_sent “$http_referer” ‘
‘”$http_user_agent” “$http_x_forwarded_for”‘;
access_log /var/log/nginx/access.log main;

gzip_buffers 32 4k;
gzip_comp_level 6;
gzip_min_length 200;
gzip_types text/css text/xml application/javascript;

# server {
#        listen       80;
#        # server_name  localhost;
#        location / {
#          root /hzero/hzero-front/html;
#          try_files $uri $uri/ /index.html;
#        }
#  }

Nginx默认用户是www-data,要使得这个用户对root 的目录有权限

sudo chown -R www-data:www-data /d02/hzero/front/dist

sudo chmod -R 755 /d02/hzero/front/dist

改完,重启Nginx

sudo systemctl restart nginx

拷贝过来的前端工程里面有很多占位符号需要替换,有个脚本可以替换

#!/bin/bash

# 获取时间戳

TIME_ID=$(date +%s)

# 定义替换函数

replace_in_files() {

  local pattern=$1

  local replacement=$2

  local ext=$3

  find dist -type f -name “*.$ext” | while IFS= read -r file; do

    sed -i “s|$pattern|$replacement|g” “$file”

  done

}

# 开始替换

replace_in_files “BUILD_BUILD_ENV_ID” “$TIME_ID” “js”

replace_in_files “BUILD_BUILD_ENV_ID” “$TIME_ID” “html”

replace_in_files “BUILD_BUILD_ENV_ID” “$TIME_ID” “json”

replace_in_files “BUILD_BASE_PATH” “/” “js”

replace_in_files “/BUILD_PUBLIC_URL/” “/” “js”

replace_in_files “/BUILD_PUBLIC_URL/” “/” “css”

replace_in_files “/BUILD_PUBLIC_URL/” “/” “html”

replace_in_files “/BUILD_PUBLIC_URL/” “/” “json”

replace_in_files “BUILD_API_HOST” “http://dev.hzero.org:8080” “js”

replace_in_files “BUILD_API_HOST” “http://dev.hzero.org:8080” “html”

replace_in_files “BUILD_AIGC_STREAM_PRINT_FLAG” “false” “js”

replace_in_files “BUILD_AIGC_STREAM_PRINT_STEP” “3” “js”

replace_in_files “BUILD_AIGC_STORAGE_CODE” “KMS” “js”

replace_in_files “BUILD_CLIENT_ID” “hzero-front-uat” “js”

replace_in_files “BUILD_WEBSOCKET_HOST” “http://dev.hzero.org:8080/hpfm/sock-js” “js”

replace_in_files “BUILD_CUSTOMIZE_ICON_NAME” “customize-icon” “js”

replace_in_files “BUILD_MULTIPLE_SKIN_ENABLE” “true” “js”

replace_in_files “BUILD_TOP_MENU_UNION_LABEL” “true” “js”

replace_in_files “BUILD_TOP_MENU_LABELS” “DEFAULT” “js”

replace_in_files “BUILD_SVG_ICON_ENABLE” “true” “js”

这个脚本是根据产品组给的脚本改的,原来哪个脚本估计是centOS上的,直接在ubuntu上运行没起作用,让豆包和元宝改得都有问题,这是让chatgpt改的,可以成功运行。

改了之后,在浏览器访问http://dev.hzero.com.cn

在更多工具/开发人员工具/应用程序,把本地存储、会话存储、cookie都清空

为了使用无痕模式,需要启用https访问:

在ngnix的default站点配置里面启用SSL

# SSL configuration

    #

    listen 443 ssl default_server;

    listen [::]:443 ssl default_server;

    #

    # Note: You should disable gzip for SSL traffic.

    # See: https://bugs.debian.org/773332

    #

    # Read up on ssl_ciphers to ensure a secure configuration.

    # See: https://bugs.debian.org/765782

    #

    # Self signed certs generated by the ssl-cert package

    # Don’t use them in a production server!

    #

    include snippets/snakeoil.conf;

snakeoil.conf 里面是引用了证书和Key,默认不存在,可以安装证书生成工具来生成:

# 安装证书生成工具

root@desktop-jacksen:/d02/hzero/project/ps-license# sudo apt-get install ssl-cert  

# 生成默认自签名证书

root@desktop-jacksen:/etc/ssl# sudo make-ssl-cert generate-default-snakeoil root@desktop-jacksen:/etc/ssl# ll root@desktop-jacksen:/etc/ssl/certs# ls -l /etc/ssl/certs/ssl-cert-snakeoil.pem ls -l /etc/ssl/private/ssl-cert-snakeoil.key -rw-r–r– 1 root root 1119 Jul 3 16:50 /etc/ssl/certs/ssl-cert-snakeoil.pem -rw-r—– 1 root ssl-cert 1704 Jul 3 16:50 /etc/ssl/private/ssl-cert-snakeoil.key

.pem文件就是证书文件,可以拷贝改下扩展名成为.cer文件导入浏览器,让浏览器信任站点(如果不进行信任认证,浏览器会拒绝对该站点的https访问)

root@desktop-jacksen:/etc/ssl/certs# sudo cp /etc/ssl/certs/ssl-cert-snakeoil.pem /d02/hzero/ssl-cert-snakeoil-hzero.cer

在 Chrome 和 Edge 浏览器中手动将自签名证书添加到信任列表的方法如下:

Chrome 浏览器6

  1. 首先获取自签名证书文件,确保其为.cer格式。如果没有,可以在含有该证书的页面上,点击地址栏左侧的锁形图标,选择 “证书信息”,在 “详细信息” 选项卡中点击 “复制到文件”,按照证书导出向导,将其保存为 DER 编码的二进制 X.509(.CER)格式。
  2. 打开 Chrome 浏览器,进入设置页面,在搜索栏中输入 “证书”,找到 “安全性” 中的 “管理证书” 选项并点击。
  3. 在弹出的 “证书” 窗口中,选择 “受信任的根证书颁发机构” 标签。
  4. 点击 “导入” 按钮,启动证书导入向导,点击 “下一步”。
  5. 选择之前保存好的自签名证书文件,然后点击 “下一步”。
  6. 确认将证书存储在 “受信任的根证书颁发机构”,点击 “下一步”,最后点击 “完成”。
  • 重启 Chrome 浏览器,此时自签名证书已被添加到信任列表中,访问相关网站时将不再提示证书不信任错误。

Edge 浏览器1

  1. 同样先获取自签名证书的.cer文件,方法可参考 Chrome 浏览器相关步骤。
  2. 点击 Edge 浏览器右上角的三个点图标,选择 “设置”。
  3. 进入设置页面后,点击左侧菜单栏中的 “隐私、搜索和服务”,然后在右侧找到 “安全性”,打开 “证书管理”。
  4. 在 “证书” 窗口中,选择 “受信任的证书颁发机构”,点击 “导入”。
  5. 在证书导入向导页面点击 “下一步”,选择已准备好的证书文件,再点击 “下一步”。
  6. 保持证书存储区域为默认的 “受信任的根证书颁发机构”,点击 “下一步”,最后点击 “完成”。
  7. 重启 Edge 浏览器,即可使证书生效,浏览器将信任该自签名证书。

访问:https://dev.hzero.com.cn,报了下面的错误,看起来还有BUILD_BASE_PATH 没有被替换成功。

看了下,原来的脚本只是替换了所有js文件中的改占位符,需要把html中的也替换以下,脚本另外单独执行针对该占位符,替换html的动作。

BUILD_CLIENT_ID 替换不彻底,在run-front.sh中只替换了js ,没有替换html

单独执行,替换html

直接http://dev.hzero.com.cn 访问,会自动重定向到网关调用oauth 服务的登录界面:

登录后出错:

这是个重定向错误,实际是通过认证已经获得了Token,因为你直接用重定向的地址访问是OK的:

我们来分析下原因

在网关服务的yml配置中把这个静态资源加入的skippath之后这个错误没有了,不过他依然不会自动重定向到目标地址。

直接打开http://dev.hzero.com.cn , 刷新页面,检查前端错误,发现有一系列api调用失败,其中有4条是跟hmsg有关的,用微软的copliet分析,并查网关的后台日志,抛给腾讯元宝分析后给的提议是:

查网关的yml配置,发现这个配置是有的,不过目录层级错了; – id 跟routes在同一层级了,应该- id 在routes的下一层,修改后重启。

重启问题依旧

后来又查资料说,可能网关取了自定义的动态路由数据,这个层级高于网关yml中的静态路由设置,就是下面这条:

于是就把它设置成False , 并且把其他几个合并的服务的路由的开头路径也在路由配置中执行hzero-lite服务;

重启网关后,发现问题更大了,主菜单都显示不了;

大模型说可能是缓存没更新,于是就把redis缓存全部删除,(重启Lite服务可以重建这些缓存)

删除缓存,启lite服务后,看到hadm下的路由规则全部执行hzero-lite 了,可是网关日志中看到:对应 /hmsg/**的请求的permission检查还是去数据库的iam_permission中查询服务名=hzero-message 的记录,

可由于服务做了合并,messagei相关的服务路由的服务名在数据库中都变成hzero-lite ,自然permission检查就失败了;

所以对于那些报错的关键问题是要让网关在permission和路由转发的时候都使用hzero-lite作为新的服务名,为此我们在网关中做了各种映射配置,但都没起作用,因为 动态路由规则优先,所以在配置中关闭了动态路由规则获取,但也报错,而且看hzero-admin的日志,对于hmsg/**相关的服务,它就是要去找hzero-message ,怎么改配置,清缓存,更新缓存都无济于事。

HZERO PaaS平台组装笔记(五)后端应用服务部署

本文是H-ZERO 安装部署笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心- 《HZERO 轻量版》技术文档进行部署实践,选择快速开始->微服务版进行安装; 但作为初学者, 水平太低, 由于轻量版合并了多个微服务,要改各种配置,过程中遇到多个困难,没有搞定🙂, 后来按照 开放平台->社区与合作伙伴->文档中心- 《HZERO汉得企业级PaaS平台》 技术文档进行 标准版(没有合并微服务的版本) 安装部署实践 ,安装部署成功了。本系列文章记录了这个过程。

需要说明的是,如果不是出于学习研究目的,是不需要这么麻烦的,技术中心有发发行版,可以一键安装,一小时不到可以全部安装完成。

本文是出于学习研究目的,按照技术文档从制品库里面拿各种零件进行组装,所以过程会比较繁琐,供学习研究参考。

实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04

五、后端应用服务部署

配置hosts:这一步前面已经完成

vim /etc/hosts

127.0.0.1 db.hzero.com.cn # 配置数据库所在服务器地址

127.0.0.1 dev.hzero.com.cn # 配置后端服务所在服务器地址

127.0.0.1 redis.hzero.com.cn # 配置redis服务所在服务器地址

修改服务配置文件

修改每个服务模块的application.yml,主要涉及到数据库、Redis、注册中心、配置中心等地址等通用信息修改,另外一些服务特殊配置也需要注意。

问题:\target\classes\application.yml,  \src\main\resource\sapplication.yml 该哪个?

答:\src\main\resource\sapplication.yml ;因为后面的每个模块的服务启动脚本run.sh,会把target 删除,然后把resource里面的文件覆盖过去。 

需要更改的内容:

  1. 每个模块的application.yml中的Jdbc链接都要加&allowPublicKeyRetrieval=true

url: ${SPRING_DATASOURCE_URL:jdbc:mysql://db.hzero.com.cn:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}

  • 在 \ps-lite\target\classes\application-custom.yaml(这个文件被ps-lite的application.yml导入,所以是其配置的一部分)我们看到:

它用到了好几个域名:
dev.hzero.org

document.hzero.org

redis.hzero.org

这几个也得加到hosts文件中去:

vim /etc/hosts

127.0.0.1 dev.hzero.org # oauth基础地址hzero-oauth可访问的网关地址

127.0.0.1 document.hzero.org  # hzero-file 用到的地址

127.0.0.1 redis.hzero.org #分布式锁用到的配置地址

备注:hosts文件是wsl自动生成的,每天第一次重启会自动生成,从而覆盖你修改的配置,要组织自动生成需要在wsl.conf中添加如下配置

/etc/wsl.conf:
[network]
generateHosts = false

3、ps-gateway的application.yml配置中,原来是

  cloud:

    gateway:

      filter:

        secure-headers:

          frame-options: ${SECURE_HEADERS_FRAME_OPTIONS:allow-from http://hzeronf.saas.hand-china.com}

把http://hzeronf.saas.hand-china.com改成 http://dev.hzero.com.cn

豆包说要改,把实际文件的扩展名改成yml(resoure里面要改,会拷贝覆盖到target)

编写服务启动脚本

编写后端服务启动脚本,这里给出ps-lite服务的启动脚本创建流程,对于其它后端服务来说只需要将该脚本的 端口号调整为对应后端服务的 端口号,再将其复制到对应 后端服务根目录即可。由于iam,oauth等服务都合共到lite了,所以我们就把iam的默认端口8030给他了: 另外标准的内存分配是2G,但我们个人学习用,这个lite合并服务合并了多个服务,我们分配给他1G;其他注册中心、网关、平台治理、接口平台 都各分配500M就可以了。飞搭比较耗资源,我们给他两个服务各1G;

cd ps-lite

vim run.sh

SERVICE_NAME=${PWD##*/}

JAR=$SERVICE_NAME.jar

MPORT=8030

echo “>>> mvn clean package -Dmaven.javadoc.skip=true”

mvn clean package -Dmaven.javadoc.skip=true -Dmaven.test.skip=true

echo “>>> cd target”

cd target

mv app.jar $JAR

echo “>>> kill -9 $(lsof -t -sTCP:LISTEN -i:$MPORT)”

kill -9 $(lsof -t -sTCP:LISTEN -i:$MPORT)

JAVA_OPTS=”-Xms1024m -Xmx1024m -Dspring.profiles.active=dev”

echo “>>> nohup java -jar $JAVA_OPTS $JAR >app.log 2>&1 &”

BUILD_ID=dontKillMe nohup java -jar $JAVA_OPTS $JAR >app.log 2>&1 &

保存后,更改执行权限:

chmod +x run.sh

启动后端服务

在每个服务目录下面执行run.sh脚本即可,建议按照如下顺序进行启动,注意监控注册中心,确保每个服务都启动成功。(含各服务建议分配端口)

服务简码默认端口描述是否必须备注
hzero-registerHREG8000注册中心_
hzero-configHCFG8010配置服务不安装各服务则需要关闭配置中心的配置
hzero-iamHIAM8030IAM服务1.10.0之后的版本需要先部署hzero-license并配置产品授权,具体请参考产品授权,在《其他》章节中有一些简单的说明
hzero-adminHADM8060平台治理服务_
hzero-platformHPFM8100平台服务
hzero-gatewayHGWY8080网关服务
hzero-oauthHOTH8020认证服务
hzero-swaggerHSWG8050Swagger测试服务开发环境可装
hzero-reportHRPT8210报表服务 
hzero-schedulerHSDR8130调度服务 
hzero-messageHMSG8120消息服务 
hzero-fileHFLE8110文件服务 
hzero-importHIMP8140导入服务 

第一个ps-register 服务

在ps-register目录下运行 ./run.sh

root@desktop-jacksen:/d02/hzero/project/ps-register# ./run.sh

看app.log中不断增加的日至可以确定服务已经在运行

  • Eureka 服务端地址,本例默认向 http://dev.hzero.com.cn:8000/eureka。

验证可用:

到注册中心的日志中可以找到生成的密码,用户名默认是user,登录后看到的信息如下:

有疑问的是ip地址怎么会是 10.255.255.254?

这个问题:解决方案如下:在bootstrap.yml配置文件中添加:

spring:

  cloud:

    inetutils:

      # 设置首选网卡,对于本机有多块网卡的情况,可以设置首选网卡来注册

      # 指定忽略的网卡

      ignored-interfaces[0]: lo

      # 选择注册的网段

      preferred-networks[0]: 172.18.14.48

添加这个配置后,重启,网址就使用我们指定的正常网址了(所有服务的bootstrap.yml文件中都要加这个配置,否则IP地址都会错误,因为我们用的是虚拟机,有多个网址);

第二个ps-lite  服务,在目录下运行 ./run.sh

因为:hzero-lite 合并了 HZERO 微服务中的如下服务,基本涵盖了单体应用必备的功能。

  • hzero-oauth:登录认证服务
  • hzero-iam:身份管理服务
  • hzero-platform:平台服务
  • hzero-swagger:Swagger文档测试服务
  • hzero-message:消息服务
  • hzero-file:文件服务
  • hzero-scheduler:调度服务
  • hzero-import:导入服务
  • hzero-report:报表服务
  • hzero-gateway-helper:用户鉴权组件
  • platform-mdm:主数据插件
  • platform-hr:HR组织架构插件
  • platform-org:组织信息插件
  • platform-search:检索插件
  • platform-dsr:数据源路由管理插件
  • platform-cusz:个性化插件
  • platform-gantt:甘特图插件

看日志,不成功,错误信息:

at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88) ~[ps-lite.jar:1.12.0.RELEASE]

Caused by: java.io.FileNotFoundException: JAR entry org/hzero/lite/config/ not found in /d02/hzero/project/ps-lite/target/ps-lite.jar!/BOOT-INF/classes

at org.springframework.boot.loader.jar.JarURLConnection.throwFileNotFound(JarURLConnection.java:175) ~[ps-lite.jar:1.12.0.RELEASE]

解决方案(豆包):

解决方案

创建配置类目录及基础配置类
在 src/main/java/org/hzero/lite/ 下新建 config 包(即创建 src/main/java/org/hzero/lite/config/ 目录),并添加一个基础配置类 AppConfig.java,示例:

package org.hzero.lite.config;

import org.springframework.context.annotation.Configuration;

// 标记为 Spring 配置类,让扫描机制识别@Configurationpublic class AppConfig {

// 可在此添加 Bean 定义、导入其他配置等}

重新打包验证
执行 mvn clean package -Dmaven.test.skip=true 重新构建项目,然后检查 JAR 包中是否包含 org/hzero/lite/config/AppConfig.class:

jar -tf target/app.jar | grep “org/hzero/lite/config/”

这次有了.

再次运行 ./run.sh

刚才那个问题没有了,但又提示缺少另一个core入口:

at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88) ~[ps-lite.jar:1.12.0.RELEASE]

Caused by: java.io.FileNotFoundException: JAR entry org/hzero/lite/core/ not found in /d02/hzero/project/ps-lite/target/ps-lite.jar!/BOOT-INF/classes

at org.springframework.boot.loader.jar.JarURLConnection.throwFileNotFound(JarURLConnection.java:175) ~[ps-lite.jar:1.12.0.RELEASE]

这个lite 看起来是卡住了,产品组说,启动脚本中要加license agent , 因为lite合并了iam服务,iam服务要用到license; 所以ps-lite的启动命令中要添加license的agent:

由于license控制策略一直在与时俱进,有关Hzero 各版本和license各版本的对应关系,请参考:汉得焱牛开放平台,中间试过好几个license agent文件,都出现不兼容问题,最后换的那个解决了不兼容问题。

重新启动ps-lite服务,发现还是有其他错误:提示什么类没有找到。 按照产品组建议,把POM文件中的部分插件依赖去掉就好了:

还有个问题就是提示数据库链接错误,那是因为在原始选配出来得yml文件中链接的mysql数据库是hzero_lite, 数据初始化的时候用的是hzero_platform,所以链接串中要改成hzero_platform

url: ${SPRING_DATASOURCE_URL:jdbc:mysql://db.hzero.com.cn:3306/hzero_platform?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true}

还有就是因为Lite服务合并了多个服务,只给1G内存的话,服务启动非常慢,半小时过去了,状态还是starting启动过程中。

把内存加到2G再重启服务,发现一晚上过去了还是starting状态,看日志,出现了两个错误:

一个是访问iam服务失败,应该是访问路径问题:产品组说这个没有关键影响,可以忽略;

另外一个是插入iam_permission 表失败,原因是数据重复,主键冲突;

按照产品组建议,把原表里面内容清空掉了:

产品组认为服务没有完成启动,成为up状态,可能还是内存不够,于是我们把内存加到4G ,再次重启服务;

过了半小时,还是没有UP状态,查看日志,发现有错误:

编辑 run.sh 把上述启动选项加上,再重启:这个错误没了,不过在注册中心的状态还是starting,没有UP (UP是所有依赖的服务启动没有错误spring系统自己设置的标记) ,没有UP标记就是表明服务没有启动成功;

产品组分析发现,lite启动的时候去调用license服务检查,但license服务又需要调用iam服务获取在线用户数,但因为iam服务合并到了lite 服务,这个时候iam服务还没有UP就是就掉不成功,这就使得lite 和 license相互调用不成功,陷入死循环。

解决方案:把application-custom.yml中HZERO_LICENSE_TYPE:从空改成lite,意思是让lite服务不要去调用license服务验证是否授权,而是从 .lic license授权文件中解密读取读取模块授权信息,从而避免跟license服务相互调用死锁。

直接去开放平台 下载授权文件(文件名随意,只要扩展名是.lic就行)放到resource 目录下,再次运行./run.sh 会把文件拷贝到target目录。

看日志,发现lic文件读取失败,但命中了redis缓存,但没用,潇葳说缓存中内容也是加密的,开放平台现在默认下载的1.0.3版本的lic文件,但lite服务目前依赖的license start只能解密1.0.0版本的lic文件,于是重新申请了1.0.0版本的lic文件,再次重启lite服务,这次能正确读取.lic文件中的授权信息了。

但是。。 注册中心中的状态依然是starting ,没有UP

产品组认为之前的合并的lite服务,本想用于单体和微服务两种场景,现在看起来是不合适了,于是他又另外打包了一个lite合并服务微服务版(区别于lite合并服务单体版),并且他还发现了另外几处问题,一并修改了。

后面选配lite服务,就要选新的lite合共服务微服务版。

现在简单起见,我们直接在现有的lite服务的POM中把依赖改一下:

把依赖改成 hzero-lite-cloud :

这个hzero-lite-cloud在启动的时候将不再调用license服务去检查授权情况,只在被调用的时候给license服务拦截,去检查license服务。这样就避免了启动时跟license服务相互死锁;

既然已经避免了相互死锁,我们在yml文件中,把HZERO_LICENSE_TYPE:改成空

另外hzero-lite-cloud的启动类,也改了,选配平台上的模板要改,原来的模板时错误的,注解中还用了chroden, 要改成下面这样:

再次重启 ./run.sh

这次 终于成功了:

登录验证:

发现验证错误,说用户名/密码不对, 检查iam_user表发现没有默认用户,说明原来导入数据有问题,进一步检查发现在hzero-menu-user-role-lable.xlsx的 sheet页 《菜单标签数据》有两行引用内容存在,出现#REF,这个问题导致这个Excel中的相当一部分数据导入不成功,其中包括iam_user表的内容。

解决方案:把出现 #REF的两行数据删除掉,再次重新导入hzer_platform模块的数据。

导入完成后,检查数据库发现有数据了,表示导入成功:

再次重启./run.sh,验证登录:

第三个:ps-license服务(依然是要先启动注册中心服务):

文档说1.10版本之后,hzero-iam组件(这个组件也被合并到了lite组件)需要购买授权后方能正常使用,因此 hzero-lite 服务也需要相关授权。

License处理主要有两种模式,这里用第一种模式:

  1. 部署 hzero-license 服务进行统一管理
    该模式的优势在于,可以集中管理,如平台使用了多个受License控制的服务组件时,这种模式更加便捷。如采用此种模式,可在选配部署组件时追加选配 hzero-license 组件

因为前面没选配hzero-license 服务,我们再单独选配下这个服务:

下载后的resoure package里面没啥内容,不需要安装数据库表?有个 平台许可证管理.zip , 改名成ps-license.zip 上传服务器的project 目录下,pom.xml中MySQL依赖部分改一下:

<dependency>

<groupId>com.mysql</groupId>

<artifactId>mysql-connector-j</artifactId>

</dependency>

另外把lite依赖也加一下,自注册配置也加一下。然后启动(注册中心先启动):

另外:hzero 1.12 需要的license服务是1.0.3版本,所以POM文件中需要给更改如下:

进入ps-license目录,重新build一下:

root@desktop-jacksen:/d02/hzero/project/ps-license# mvn clean package -Dmaven.test.skip=true
[INFO] Scanning for projects…

另外,还需要一个license  Agent的jar文件,这个需要向潇威申请,不同版本对应的agent文件不一样。本例需要的是license-agent103.jar ,把它放到新建的目录licenseAgent目录下

启动服务命令中把agent加上:

运行./run.sh

日志报错:

chatgpt分析:

按照这个方法修改POM文件后再重新Builder:

进入ps-license目录,重新build一下:

root@desktop-jacksen:/d02/hzero/project/ps-license# mvn clean package -Dmaven.test.skip=true
[INFO] Scanning for projects…

builder之后再起服务依然报错!

后来问了潇威,说父组件依赖不对,因为我们的父组件依赖的是ps-demo-parent  0.0.1实际依赖的是hzero1.12.0 , 这个license服务不能依赖hzero1.12.0 ;

要改成依赖依赖license的父组件:

<parent>

        <groupId>org.hzero.license</groupId>

        <artifactId>hzero-license-parent</artifactId>

       <version>1.0.3.RELEASE</version>

</parent>

再次改POM文件:

进入ps-license目录,重新build一下:

root@desktop-jacksen:/d02/hzero/project/ps-license# mvn clean package -Dmaven.test.skip=true
[INFO] Scanning for projects…

build报错,说mysql 问题,POM中还是要恢复到原始的SQL配置:

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

</dependency>

改了之后再次builder就成功了;可以打开license 服务页面了:

看日志:刚才那个报错没有了,剩下就是向注册中心注册失败,原因也是验证问题(向注册中心注册需要验证,通过web页面访问也需要验证)。但各服务的yml配置文件中都默认不使用用户验证机制)

后来按产品组建议,在注册中心POM 中去掉对lite的依赖,再重新构建,启动后注册中心就不需要验证了。

测试license服务:向开放平台申请license, 审批通过后,用上面界面上的“激活链接”按钮获取激活验证码,复制后在填入验证:提示激活成功;

以一个已经购买产品的租户下的用户角色进入开放平台,进入 应用市场->我购买的产品

点【申请license授权】

填入 申请信息,包括申请授权的产品列表,license版本(当前只有1.0.3及以上版本这一个选项)、申请环境类型、环境名称,然后点【提交申请】

提交申请,等待审核员审批,审批通过后可以查看【license授权记录】

点【查看激活详情】,可以看到具体激活情况:

要激活刚刚安装的服务器授权,打开license服务的访问界面,点击【激活链接】

系统会直接链接远程的开放平台,打开开放平台页面,显示激活码:

复制激活码,到本地界面进行验证:

验证显示:激活成功。 则表示license 收取激活的动作全部完成。

对ps-license服务监控一段时间后发现会自动从注册中心消失,看日志是因为发生某种错误,导致心跳发送失败:

豆包分析可能是版本不兼容问题:

考虑到之前注册中心服务,因为增加了对lite的依赖导致,spring Sercurity的配置被非预期的覆盖,导致需要验证(期望不需要验证);后来问了产品组,说h0 1.12用的Erueka是<version>4.2.0</version>, 我直接在license服务中把Erueka的版本指定到相同版本再重启,能坚持4小时,4小时后心跳又失败了。 再后来是潇葳新发了一个license服务的版本1.1.2.RELEASE(原来是1.0.3), 那么ps-license服务的POM文件中parent和依赖全部改成这个新版本重新Builde解决问题,改了之后再重新执行./run.sh

按照产品组建议,那个对lite 的依赖 在 hzero-lite、hzero-admin、hzero-register、hzero-gateway、hzero-license 这几个服务不需要加 ,除了这几个服务之外的服务才需要加,比如飞搭低代码的服务就需要加

再打开注册中心页面,可以看到license 服务已经注册上来了:

第三个 ps-admin 平台治理服务

root@desktop-jacksen:/d02/hzero/project/ps-admin# ./run.sh

日志里面没啥错误,应该是OK的。

第四个 ps-gateway 网关服务

日志中有些路由找不到,这个需要更改application.yml文件中关于spring cloud 路由的配置,因为很多服务合并到hzero-lite了,哪些合并掉的服务路由的入口要改成hzero-lite , 比如原来hzero-iam, hzero-imp 等都要改成hzero-lite 。

另外我们发现注册中心gateway 中网关服务没有显示端口,需要在yml文件中server节点下面添加端口配置:

添加后重新启动就好了:

第五个 ps-interface 网关服务

HZERO PaaS平台组装笔记(四)数据库初始化

本文是H-ZERO 安装部署笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心- 《HZERO 轻量版》技术文档进行部署实践,选择快速开始->微服务版进行安装; 但作为初学者, 水平太低, 由于轻量版合并了多个微服务,要改各种配置,过程中遇到多个困难,没有搞定🙂, 后来按照 开放平台->社区与合作伙伴->文档中心- 《HZERO汉得企业级PaaS平台》 技术文档进行 标准版(没有合并微服务的版本) 安装部署实践 ,安装部署成功了。本系列文章记录了这个过程。

需要说明的是,如果不是出于学习研究目的,是不需要这么麻烦的,技术中心有发发行版,可以一键安装,一小时不到可以全部安装完成。

本文是出于学习研究目的,按照技术文档从制品库里面拿各种零件进行组装,所以过程会比较繁琐,供学习研究参考。

实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04

四、数据库初始化

配置数据库信息

打开resource种子数据项目,编辑application.yml配置文件,因为用的是mysql8,需要将驱动类替换为com.mysql.cj.jdbc.Driver

另外可以看到,其链接的数据库是db.hzero.com.cn, 用户名/密码是hzero/hzero

所以,要设置host ,并在数据库中创建hzero用户,并赋予全部权限;

  1. vim /etc/hosts

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateHosts = false
127.0.0.1 localhost
127.0.1.1 desktop-jacksen. desktop-jacksen

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

127.0.0.1 db.hzero.com.cn # 配置数据库所在服务器地址
127.0.0.1 dev.hzero.com.cn # 配置后端服务所在服务器地址
127.0.0.1 redis.hzero.com.cn # 配置redis服务所在服务器地址 

2、并在数据库中创建hzero用户,并赋予全部权限;(这一步如果在之前 安装数据库那一步已经完成,这里就不用做了)

root@desktop-jacksen:~# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.4.5 MySQL Community Server – GPL

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> CREATE USER ‘hzero’@’%’ IDENTIFIED BY ‘hzero’;
Query OK, 0 rows affected (0.02 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO ‘hzero’@’%’ WITH GRANT OPTION;
Query OK, 0 rows affected (0.02 sec)

mysql> exit
Bye
root@desktop-jacksen:~#

启动数据初始化安装器

在bash窗口运行database-init.sh脚本,运行成功后控制台会输出链接地址,复制链接地址到浏览器中访问。

root@desktop-jacksen:/d02/hzero/resource-package# chmod +x database-init.sh
root@desktop-jacksen:/d02/hzero/resource-package# ./database-init.sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 111M 100 111M 0 0 13.5M 0 0:00:08 0:00:08 –:–:– 10.7M

HZERO 1.12.RELEASE 更新开始…………..


启动工具…

rt(s): 8099 (http) with context path ”
2025-06-28 12:42:54.912 INFO 1481 — [ main] o.hzero.installer.InstallerApplication : Started InstallerApplication in 8.913 seconds (JVM running for 9.416)
========================================================================================
Help document: https://open.hand-china.com/document-center/doc/component/1356/13924?doc_id=34571
The project address: http://127.0.1.1:8099
========================================================================================

IPv4 address for eth0: 172.18.14.48

在host机上访问:http://172.18.14.48:8099

看起来缺少了飞搭两个服务的初始化数据;

按顺序初始化

依次执行数据库更新、数据修复和数据更新,确保每个步骤成功后再往后续步骤执行。

复制

  1. (1)更新数据库:将部署服务所需的数据库勾选上,确认勾选无误后先点击`更新数据库`按钮更新数据库信息。
  2. (2)数据修复:根据环境中数据库的类型来勾选对应数据库的数据修复脚本,勾选完成后点击`数据修复`按钮完成数据修复,如果新安装平台,此步骤可以忽略。
  3. (3)导入数据:勾选需要导入的数据后点击`导入数据`按钮将期初数据进行导入。执行完毕后可连接到数据库中检查执行情况。

更新数据库的时候,出现了一闪而过的更正错误提示“处理出错”,没理会,继续第三步,界面提示导入完成。

导入完成,CTRL+C 结束

检查数据(正常应该出现每个模块对应的数据库):

mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| sys |
+——————–+
4 rows in set (0.00 sec)

mysql>

很显然,安装失败,实际没成功;

在bash窗口重新 运行database-init.sh脚本,然后把控制台的错误信息给豆包,豆包罢工了,说“抱歉,我还在学习中,你可以使用中文向我提问。”,把错误信息给元宝

元宝对日志的分析:

错误原因分析

1、MySQL 8.0 的默认认证插件
MySQL 8.0 及以上版本默认使用 caching_sha2_password 插件,该插件要求客户端通过 SSL 加密或从服务器检索公钥进行身份验证。若未启用 SSL 且未显式允许公钥检索,则会触发此错误

  • JDBC 驱动的安全限制
    在连接字符串中未配置 allowPublicKeyRetrieval=true 时,JDBC 驱动(如 MySQL Connector/J)会阻止公钥检索,导致连接失败。

3、日志中的关键证据

Caused by: java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed

at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110)

解决方案:

chatgpt最推荐的解决办法(适用于你的情况)

 修改 JDBC URL:

将你的 JDBC 连接字符串 增加两个参数

properties

复制编辑

jdbc:mysql://localhost:3306/hzero?allowPublicKeyRetrieval=true&useSSL=false

替换掉你原来的连接字符串。

为什么不建议再用 mysql_native_password

你当前使用的是 MySQL 8.4.5,这是个较新的版本,mysql_native_password.so 插件不再默认附带,而且 安全性较低,未来会逐渐被弃用。

插件缺失是故意设计(更安全);

官方推荐继续使用 caching_sha2_password,并通过连接串调整;

连接安全依赖参数而非降级插件。

更改后再试:

因为是新安装最新的1.12版本,更新完成后,执行第三步

完成后再检查:

mysql> show databases;
+——————–+
| Database |
+——————–+
| hzero_admin |
| hzero_interface |
| hzero_platform |
| information_schema |
| mysql |
| performance_schema |
| sys |
+——————–+
7 rows in set (0.01 sec)

界面上显示的几个数据库是都进去了;

HZERO PaaS平台组装笔记(三)Lite版安装介质准备

本文是H-ZERO 安装部署笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心- 《HZERO 轻量版》技术文档进行部署实践,选择快速开始->微服务版进行安装; 但作为初学者, 水平太低, 由于轻量版合并了多个微服务,要改各种配置,过程中遇到多个困难,没有搞定🙂, 后来按照 开放平台->社区与合作伙伴->文档中心- 《HZERO汉得企业级PaaS平台》 技术文档进行 标准版(没有合并微服务的版本) 安装部署实践 ,安装部署成功了。本系列文章记录了这个过程。

需要说明的是,如果不是出于学习研究目的,是不需要这么麻烦的,技术中心有发发行版,可以一键安装,一小时不到可以全部安装完成。

本文是出于学习研究目的,按照技术文档从制品库里面拿各种零件进行组装,所以过程会比较繁琐,供学习研究参考。

实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04

三、H-ZERO安装介质准备

安装介质包括:

服务端选配:现在项目中心,新建一个项目,我这里新建了一个H-ZERO平台个人研究学习版的项目;

打开项目,进入服务选配

进入选配平台,会看到服务端选配、前端选配、移动端选配;安装平台通常只需要做服务端选配,因为服务端选配完成也会自动生成前端工程;不需要再做前端选配。

进入之后,要选择一个父组件,原来没有父组件,就新建了一个父组件:H-ZERO个人学习版父组件,然后进入下一步:

在右边的批量添加里面选择组件:

组件查询条件输入 “轻量”会出来HZERO轻量组合服务,选上:

依次把网关、注册中心 也选上,在输入平台治理查询条件后会出来平台治理和平台治理客户端,这里只要选择平台治理就可以了,不用选平台治理客户端,这个平台治理客户端是你新建微服务时,如果要调用平台治理服务的功能,才需要选择,相当于调用平台治理服务的SDK,可以在开发时手工添加依赖就好了,不用在选配平台选。

轻量版服务组合中并未包含接口平台(接口平台后面做得越来越复杂,已经难以合并到轻量版的服务组合中去了),所以单独把接口平台在选配时添加进来。

我们这里选HZERO轻量服务组合、网关、注册中心、平台治理、接口平台、飞搭模型服务、飞搭配应用服务 七个;

点“确认” ,输入服务前缀,这里输入的前缀在后面生成的Project目录下的每个模块目录都会加上这里输入的前缀,要求是小写字母命名;

我们是个人学习版,personal study , 简称ps , 所以就用ps作为前缀;配置中心和注册中心留空,表示用默认值:

确认批量修改,回到上个界面,这里服务名称和服务编码不用输入,在右边 打勾”全选7项“,进入”下一步“ 即可生成工程和种子数据;

在生成的工程中,要做些修改:

此处,将lite服务由单体服务架构转为微服务架构,服务与服务之间的访问需要经过中转,所以服务下需要引入一个适配器来进行服务中转的适配。
需要在除了LITE服务之外的其他服务中加入以下依赖:

  1. <properties>
  2.     <hzero.lite.cloud.version>1.12.0.RELEASE</hzero.lite.cloud.version>
  3. </properties>
  4. <dependency>
  5.         <groupId>org.hzero.starter</groupId>
  6.         <artifactId>hzero-starter-litecloud-adapter</artifactId>
  7.         <version>${hzero.lite.cloud.version}</version>
  8. </dependency>

并在配置文件 application.yml 中开启服务注册的自动注册功能

复制

  1. spring:
  2.   cloud:
  3.     service-registry:
  4.       auto-registration:
  5.         enabled: true
  6. 比如: 在ps-gateway的pom配置文件里面,<properties> 的内容要加在<project> 的直接子目录下;
  7. 找到<!–依赖组件列表–> , 把内容<dependency> 内容粘贴到这里,然后单独保存。

备注: 按照产品组建议,那个对lite 的依赖 在 hzero-lite、hzero-admin、hzero-register、hzero-gateway、hzero-license 这几个服务不需要加 ,除了这几个服务之外的服务才需要加,比如飞搭低代码的服务就需要加

在ps-lite的配置文件 application.yml 中开启服务注册的自动注册功能

在ps-gateway的配置文件 application.yml 中开启服务注册的自动注册功能

……类似方法把其他几个模中也开启服务注册的自动注册功能(具体如何添加,要看各模块的yml文件内容,有的已经有cloud章节了,那么在cloud章节下添加内容就好了,有的没有cloud章节,那就就把cloud章节添加进去。(如果碰到保存报错的情况,不要管,继续操作,后面在IDE环境中直接更改)

种子数据调整

增加跳过初始化数据的表

由于单体服务在进行微服务部署的时候,需要从数据库加载权限信息,而该权限信息在服务合并之后有所变化,所以这里不需要初始化权限信息,而是由服务启动后自动刷入。所以我们需要跳过权限表的初始化数据。

把刚才下载的文件,上传到linux服务器,解压缩:

drwxr-xr-x 5 root root 4096 Jun 27 17:41 ./
drwxr-xr-x 4 root root 4096 Jun 27 17:41 ../
drwxr-xr-x 10 root root 4096 Jun 27 17:39 front/
drwxr-xr-x 9 root root 4096 Jun 27 17:35 project/
drwxr-xr-x 7 root root 4096 Jun 27 17:37 resource-package/
root@desktop-jacksen:/d02/hzero#

在/resource-package/docs/mapping/service-mapping.xml文件中加入如下的配置即可:

复制

  1. <skip-table>
  2.         iam_permission,iam_permission_tl
  3. </skip-table>

调整初始化的路由

单体服务在微服务化之后,路由的配置信息有所变化,所以需要调整路由初始化文件。
将/resource-package/init-data/hzero-admin/hzero-admin/hzero-service.xlsx文件替换为
新的 hzero-service.xlsx文件

接下来构建可运行的Jar文件

父组件发布到Maven仓库

先把父组件发布到Maven仓库,在总工程下面有个POM文件,这个就是父组件;

我们自己学习用,没有可用的Maven私服,可以本地仓库进行安装,确保本地的服务能够依赖到项目父组件即可:

默认maven的本地仓库位置在:

/root/.m2/repository

进入project 目录,执行 mvn install , 这会把父组件(包括其所有依赖的组件)安装到本地仓库

root@desktop-jacksen:/d02/hzero# cd project
root@desktop-jacksen:/d02/hzero/project# ll
-rw-r–r– 1 root root 1691 Jun 27 13:52 pom.xml
drwxr-xr-x 4 root root 4096 Jun 27 17:35 ps-modeler/
drwxr-xr-x 4 root root 4096 Jun 27 17:35 ps-register/
root@desktop-jacksen:/d02/hzero/project# mvn install
[INFO] Scanning for projects…
Downloading from Hzero: http://nexus.saas.hand-china.com/repository/hzero/org/hzero/hzero-parent/1.12.0.RELEASE/hzero-parent-1.12.0.RELEASE.pom
Downloaded from Hzero: http://nexus.saas.hand-china.com/repository/hzero/org/hzero/hzero-parent/1.12.0.RELEASE/hzero-parent-1.12.0.RELEASE.pom (96 kB at 796 kB/s)
Downloading from Hzero: http://nexus.saas.hand-china.com/repository/hzero/org/springframework/boot/spring-boot-starter-parent/3.4.1/spring-boot-starter-parent-3.4.1.pom

……

Downloading from Hzero: http://nexus.saas.hand-china.com/repository/hzero/org/springframework/spring-core/6.2.1/spring-core-6.2.1.jar
Downloading from Hzero: http://nexus.saas.hand-china.com/repository/hzero/org/springframework/spring-jcl/6.2.1/spring-jcl-6.2.1.jar

……

Downloaded from central: https://repo.maven.apache.org/maven2/net/java/dev/jna/jna-platform/5.13.0/jna-platform-5.13.0.pom (2.3 kB at 18 kB/s)

……

[INFO] Installing /d02/hzero/project/pom.xml to /root/.m2/repository/com/hand/ps-demo-parent/0.0.1/ps-demo-parent-0.0.1.pom
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 44.728 s

接下来进入各子模块,用命令 mvn clean package -Dmaven.test.skip=true

构建jar文件, 先构建 ps-admin 模块

root@desktop-jacksen:/d02/hzero/project/ps-admin# pwd
/d02/hzero/project/ps-admin
root@desktop-jacksen:/d02/hzero/project/ps-admin# mvn clean package -Dmaven.test.skip=true
[INFO] Scanning for projects…
[INFO]
[INFO] ——————< org.hzero:ps-admin-saas-snapshot >——————
[INFO] Building ps-admin-saas 1.12.0.RELEASE
[INFO] ——————————–[ jar ]———————————
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/3.4.0/maven-clean-plugin-3.4.0.pom

……

[INFO] The original artifact has been renamed to /d02/hzero/project/ps-admin/target/app.jar.original
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 46.631 s

构建成功,生成了jar文件:

同样的命令构建其他模块的Jar

备注:lite在构建是报错:
1、依赖里面,hzero-lite没有指定版本号,解决方案:给他指定版本号:<version>1.12.0.RELEASE</version>

依赖里面,说mysql 连接器没有指定版本号:
<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

</dependency>

实际原因,参考其他模块,应该改成:

<dependency>

<groupId>com.mysql</groupId>

<artifactId>mysql-connector-j</artifactId>

</dependency>

改完之后再构建就成功了:

Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/commons/commons-lang3/3.7/commons-lang3-3.7.jar (500 kB at 153 kB/s)
[INFO] Replacing main artifact with repackaged archive
[INFO]
[INFO] — spring-boot-maven-plugin:2.5.6:repackage (default) @ ps-lite-snapshot —
[INFO] Replacing main artifact with repackaged archive
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 01:18 min
[INFO] Finished at: 2025-06-27T19:33:54+08:00
[INFO] ————————————————————————
root@desktop-jacksen:/d02/hzero/project/ps-lite#

lowcode在构建时也报错, 解决方案与Lite类似:

[ERROR] The project org.hzero:ps-lowcode-snapshot:2.9.0.RELEASE (/d02/hzero/project/ps-lowcode/pom.xml) has 2 errors
[ERROR] ‘dependencies.dependency.version’ for org.hzero:hzero-lowcode:jar is missing. @ line 21, column 25
[ERROR] ‘dependencies.dependency.version’ for mysql:mysql-connector-java:jar is missing. @ line 40, column 25
[ERROR]

低代码modeler构建时也存在类似问题,解决方案一样;

其他模块没有问题,全部构建成功!

HZERO PaaS平台组装笔记(二)安装中间件

本文是H-ZERO 安装部署笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心- 《HZERO 轻量版》技术文档进行部署实践,选择快速开始->微服务版进行安装; 但作为初学者, 水平太低, 由于轻量版合并了多个微服务,要改各种配置,过程中遇到多个困难,没有搞定🙂, 后来按照 开放平台->社区与合作伙伴->文档中心- 《HZERO汉得企业级PaaS平台》 技术文档进行 标准版(没有合并微服务的版本) 安装部署实践 ,安装部署成功了。本系列文章记录了这个过程。

需要说明的是,如果不是出于学习研究目的,是不需要这么麻烦的,技术中心有发发行版,可以一键安装,一小时不到可以全部安装完成。

本文是出于学习研究目的,按照技术文档从制品库里面拿各种零件进行组装,所以过程会比较繁琐,供学习研究参考。

实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04

二、安装中间件

MySQL安装

root@desktop-jacksen:/d02/hzero# mysql -version
Command ‘mysql’ not found

root@desktop-jacksen:/d02/hzero# sudo apt install mysql-server
Reading package lists… Done
Building dependency tree… Done
Reading state information… Done
The following additional packages will be installed:

……

Done!

检查状态:

root@desktop-jacksen:/d02/hzero# sudo service mysql status
● mysql.service – MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2025-06-26 13:36:01 CST; 5min ago
Process: 9699 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 9707 (mysqld)
Status: “Server is operational”
Tasks: 37 (limit: 23831)
Memory: 374.9M
CGroup: /system.slice/mysql.service
└─9707 /usr/sbin/mysqld

 

登录MySQL,创建远程登录管理用户hzero

root@desktop-jacksen:/d02/hzero# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.42-0ubuntu0.22.04.1 (Ubuntu)

Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> CREATE USER ‘hzero’@’%’ IDENTIFIED BY ‘hzero’;
Query OK, 0 rows affected (0.03 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO ‘hzero’@’%’ WITH GRANT OPTION;
Query OK, 0 rows affected (0.02 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql>

调整数据库默认配置, 进入/etc/mysql/mysql.conf.d/mysqld.cnf配置文件,添加如下配置项

root@desktop-jacksen:/etc/mysql/mysql.conf.d# vi mysqld.cnf

在[mysqld] 章节最后添加:
#
#
max_connections=2000

max_allowed_packet=32M

# lower_case_tabel_names default is 0 , change to 1 well cause service restart failue
# lower_case_table_names=1

character_set_server=utf8mb4

collation_server=utf8mb4_bin

原安装文档中要求 lower_case_table_names=1 

原但会导致MySQL服务重启失败,所以这个配置没改; 原因是:

数据目录权限问题(Linux 默认行为:lower_case_table_names=1 要求 MySQL 将表名统一转换为小写存储,但 Linux 文件系统默认区分大小写。若数据目录中的表文件(如 User.frm)与转换后的表名(如 user.frm)冲突,会导致启动失败。)

已有数据库兼容性问题(若数据库中已存在大小写不同但实际是同一表名的对象(如 User 和 user),启用此参数会导致命名冲突。)

文件系统限制(若 MySQL 数据目录挂载在区分大小写的文件系统(如 ext4)上,而表名在磁盘上以混合大小写存储,会导致无法找到表文件。)

但这个配置必须且重要的,由于历史原因,H-ZERO 早期并没有对数据库对象命名的大小写做严格的规范,所以如果这个配置不改掉,会导致运行错误。

应用程序要求mysql配置 lower_case_table_names=1, 这个配置一旦Mysql启动之后就改不了,需要在安装完MySQL SERver后,未启动前就把这个配置改掉。 我现在需要分四步走:

第一步,把现有安装的mysql 卸载掉;

第二步,重新安装Mysql ,但不要立马启动服务;

第三步,更改配置 lower_case_table_names=1

第四步,启动Mysql 服务

把这段提示词给到chatgpt,会给你正确的指导,按指导可以很快完成;但如果给到豆包或者腾讯元宝,会把你带到沟里去。

mysql> SHOW VARIABLES LIKE ‘lower_case_table_names’;
+————————+——-+
| Variable_name | Value |
+————————+——-+
| lower_case_table_names | 1 |
+————————+——-+
1 row in set (0.01 sec)

mysql>

sudo systemctl restart mysql

附:chatgpt的指导
你这个需求非常合理,因为 lower_case_table_names=1 这个配置必须在 初始化数据目录前 设置,MySQL 一旦初始化完成就无法更改这个参数,除非删库重来。因此我们需要控制 MySQL 安装过程,确保配置在初始化前就已设置好。

✅ 你的目标步骤简述如下:

  • 卸载现有 MySQL 安装和数据;
  • 重新安装 MySQL,但阻止其立即启动;
  • 修改配置文件,设置 lower_case_table_names=1;
  • 手动初始化数据目录;
  • 启动 MySQL 服务。

下面是完整可执行步骤。

🔁 第一步:卸载 MySQL 并清理数据

sudo systemctl stop mysql

sudo apt purge mysql-server mysql-client mysql-common mysql-server-core-* mysql-client-core-*

sudo rm -rf /etc/mysql /var/lib/mysql /var/log/mysql

sudo apt autoremove –purge

sudo apt autoclean

确保 MySQL 的相关数据与配置被干净移除。

🧱 第二步:安装但不启动 MySQL

安装 MySQL 服务器但阻止自动启动服务。

sudo apt update

sudo apt install mysql-server -y

安装完成后立即停止服务防止自动初始化(非常关键!)

sudo systemctl stop mysql

sudo systemctl disable mysql

sudo rm -rf /var/lib/mysql  # 清除刚自动生成的数据目录

✍️ 第三步:配置 lower_case_table_names=1

编辑配置文件:

bash

复制编辑

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

在 [mysqld] 段中添加或修改:

[mysqld]

lower_case_table_names=1

保存并退出。

🔧 第四步:手动初始化数据库

使用如下命令初始化(会根据配置写入 lowercase 设置):

sudo mysqld –initialize –user=mysql

这一步会生成数据目录和 root 的临时密码,记录在日志中:

sudo grep ‘temporary password’ /var/log/mysql/error.log

🚀 第五步:启动 MySQL 服务

sudo systemctl start mysql

sudo systemctl enable mysql

首次登录:

sudo mysql -u root -p# 输入日志中看到的临时密码

然后立即修改 root 密码:

ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘YourNewPassword!’;

✅ 验证配置是否生效

登录后:

SHOW VARIABLES LIKE ‘lower_case_table_names’;

应返回:

| Variable_name          | Value |+————————+——-+

| lower_case_table_names | 1     |+————————+——-+

🧠 补充说明

lower_case_table_names=1 是在 Linux 下实现 不区分大小写表名 的唯一方式;

注意这会影响开发团队的 SQL 编码规范(表名全部小写更稳妥);

MySQL 初始化成功后,该参数不能再改,除非你删除数据目录重新初始化。

Redis安装

root@desktop-jacksen:/d02/hzero# redis-server –version
Command ‘redis-server’ not found, but can be installed with:
apt install redis-server
root@desktop-jacksen:/d02/hzero# sudo apt install redis-server
Reading package lists… Done

……

root@desktop-jacksen:/d02/hzero# redis-server –version
Redis server v=6.0.16 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=a3fdef44459b3ad6

查看状态:

root@desktop-jacksen:/d02/hzero# sudo systemctl status redis-server
● redis-server.service – Advanced key-value store
Loaded: loaded (/lib/systemd/system/redis-server.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2025-06-26 15:10:31 CST; 7min ago

设置开机自动启动:

root@desktop-jacksen:/d02/hzero# sudo systemctl enable redis-server
Synchronizing state of redis-server.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable redis-server
root@desktop-jacksen:/d02/hzero#

Minio 安装

1. 下载 MinIO 服务器

root@desktop-jacksen:/d02/hzero# wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/

2. 创建数据目录

root@desktop-jacksen:/# sudo mkdir -p /data/minio
root@desktop-jacksen:/# sudo chown -R $USER:$USER /data/minio

3. 配置环境变量

创建 /etc/default/minio 文件:添加一下内容:

MINIO_VOLUMES=”/data/minio”
MINIO_OPTS=”–address :9000 –console-address :9001″
MINIO_ROOT_USER=hzero.admin
MINIO_ROOT_PASSWORD=hzero.hand.2020.
MINIO_ACCESS_KEY=hzero.admin
MINIO_SECRET_KEY=hzero.hand.2020.

4. 创建 systemd 服务

sudo nano /etc/systemd/system/minio.service,添加一下内容:

[Unit]
Description=MinIO
Documentation=https://docs.min.io
Wants=network-online.target
After=network-online.target

[Service]
User=root
Group=root
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_OPTS $MINIO_VOLUMES
Restart=always
LimitNOFILE=65536
TimeoutStopSec=infinity
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

5. 启动并设置开机自启

sudo systemctl daemon-reloadsudo 

systemctl enable miniosudo 

systemctl start miniosudo 

systemctl status minio  # 检查服务状态

1、验证安装

打开浏览器,访问 http:服务器IP:9001/,使用配置的用户名和密码登录。

root@desktop-jacksen:/usr/local/bin# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.14.48 netmask 255.255.240.0 broadcast 172.18.15.255
inet6 fe80::215:5dff:fec4:f69b prefixlen 64 scopeid 0x20<link>
ether 00:15:5d:c4:f6:9b txqueuelen 1000 (Ethernet)

备注:关机前先停服务,尽量避免信息丢失:
sudo systemctl stop mysql redis nginx minio

启动时也用systemctl启动, systemctl会检查状态,如果开机已经自启动,它会忽略,不会重复启动,也不会报错;
sudo systemctl start mysql redis nginx minio

HZERO PaaS平台组装笔记(一)基础环境搭建

本文是H-ZERO 安装部署笔记,出于学习研究目的,刚开始按照开放平台->社区与合作伙伴->文档中心- 《HZERO 轻量版》技术文档进行部署实践,选择快速开始->微服务版进行安装; 但作为初学者, 水平太低, 由于轻量版合并了多个微服务,要改各种配置,过程中遇到多个困难,没有搞定🙂, 后来按照 开放平台->社区与合作伙伴->文档中心- 《HZERO汉得企业级PaaS平台》 技术文档进行 标准版(没有合并微服务的版本) 安装部署实践 ,安装部署成功了。本系列文章记录了这个过程。

需要说明的是,如果不是出于学习研究目的,是不需要这么麻烦的,技术中心有发发行版,可以一键安装,一小时不到可以全部安装完成。

本文是出于学习研究目的,按照技术文档从制品库里面拿各种零件进行组装,所以过程会比较繁琐,供学习研究参考。

实践系统环境:windows自带的Linux虚拟机 WSL ,linux版本在微软应用商店选择 Ubuntu22.04

一、基础环境搭建

  产品组说 HZERO 轻量版技术文档未来得及更新,按照HZERO指导手册->部署配置->服务部署 章节的版本要求进行部署;

安装Git

安装Git之前先执行如下命令检查服务器上是否已经安装了Git,若已经安装了Git环境则可跳过此步骤(若服务器上Git版本过低建议删除原Git重新安装)。

  1. git –version

root@desktop-jacksen:/d02/hzero# git –version
git version 2.34.1
root@desktop-jacksen:/d02/hzero#

系统中已经有git, 版本2.34.1 ,高于安装要求,满足要求;

安装Maven

安装Maven之前先执行下面的命令检查环境中是否已经安装Maven,若已经安装了Maven则可跳过此步骤(若Maven版本过低建议删除后重新安装)。

  1. mvn -v

root@desktop-jacksen:/d02/hzero# mvn -v
Command ‘mvn’ not found, but can be installed with:
apt install maven

root@desktop-jacksen:/d02/hzero# apt install maven
Reading package lists… Done
Building dependency tree… Done
Reading state information… Done
The following additional packages will be installed:

0 upgraded, 44 newly installed, 0 to remove and 20 not upgraded.
Need to get 54.8 MB of archives.
After this operation, 196 MB of additional disk space will be used.
Do you want to continue? [Y/n] y

……

done.
done.
root@desktop-jacksen:/d02/hzero#

root@desktop-jacksen:/d02/hzero# mvn -v
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.27, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: en, platform encoding: UTF-8
OS name: “linux”, version: “5.15.167.4-microsoft-standard-wsl2”, arch: “amd64”, family: “unix”

系统中原来没有Maven, 按提示用 apt install maven 命令安装完成,版本3.6.3 高于安装要求,满足要求。(注意这里安装时因为默认链接国外网站获取来源,所以要把Windows Host机上的翻墙软件代理比如Clash打开)

安装Node

之前看HzeroJs技术手册->快速开始部分,是先安装nvm(一个Node 版本管理工具), 再安装Node,yarn 的

安装nvm

# 设置国内加速地址

export NVM_SOURCE=https://gitee.com/mirrors/nvm.git

export NVM_NODEJS_ORG_MIRROR=https://cdn.npmmirror.com/binaries/node

curl -o- https://gitee.com/mirrors/nvm/raw/master/install.sh | bash

# 永久保存环境变量

echo ‘export NVM_SOURCE=https://gitee.com/mirrors/nvm.git’ >> ~/.bashrc

echo ‘export NVM_NODEJS_ORG_MIRROR=https://cdn.npmmirror.com/binaries/node’  >> ~/.bashrc

root@desktop-jacksen:/d02/hzero# nvm -v
0.40.3

通过nvm 再安装 Node

nvm install 20

nvm use 20

备注: Node版本20 ,高于安装要求, HzeroJS 手册上,快速开始部分说:

node 18 和 node 20 , 在比较低的 hzerojs 版本会有报错

升级相关依赖 下面依赖或以上版本,就不会报错

 “@hzerojs/preset-hzero”: “~1.2.23”,

 “hzero-front”:”~1.11.14-alpha.0″,

root@desktop-jacksen:/d02/hzero# node -v
v20.19.3

nvm alias default 20 # 设置默认 nvm 的 node 版本

再安装pnpm 和yarn

npm install -g pnpm yarn

lerna(用于管理具有多个package的JavaScript项目的工具。)

  • 执行如下命令全局安装:$ npm install –global lerna

root@desktop-jacksen:/d02/hzero# npm install –global lerna

added 566 packages in 26s

79 packages are looking for funding
run `npm fund` for details
root@desktop-jacksen:/d02/hzero# lerna –version

8.2.2
root@desktop-jacksen:/d02/hzero#

关于lerna请参考https://lernajs.io/
请注意安装完lerna,在linux服务器可能需要执行如下链接命令,才能使lerna生效

root@desktop-jacksen:/d02/hzero# which yarn
/root/.nvm/versions/node/v20.19.3/bin/yarn
root@desktop-jacksen:/d02/hzero# which lerna
/root/.nvm/versions/node/v20.19.3/bin/lerna
root@desktop-jacksen:/d02/hzero# ln -s /root/.nvm/versions/node/v20.19.3/bin/yarn /usr/local/bin/yarn
root@desktop-jacksen:/d02/hzero# ln -s /root/.nvm/versions/node/v20.19.3/bin/lerna /usr/local/bin/lerna

安装JDK

在安装JDK之前需执行下面的命令来检查服务器上是否已经安装过Java环境,若已经安装过17版本的Java则可跳过JDK安装。若版本较低则需卸载历史版本的Java环境,重新安装。

复制

  1. java -version

root@desktop-jacksen:/d02/hzero# java -version
openjdk version “11.0.27” 2025-04-15
OpenJDK Runtime Environment (build 11.0.27+6-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.27+6-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)

默认是Java 11不符合安装要求,下载JDK17

https://download.oracle.com/otn/java/jdk/17.0.15%2B9/4f092786cec841d58ae21840b10204d7/jdk-17.0.15_linux-x64_bin.tar.gz

将下载好的JDK安装包上传到服务器的/usr/local/src目录下,上传完成后解压。

tar -zxvf jdk-17.0.15_linux-x64_bin.tar.gz

将解压好的JDK移动到/usr/local下

mv  jdk-17.0.15 /usr/local

配置环境变量

vim /etc/profile

在最后添加如下环境变量配置后保存并退出:

export JAVA_HOME=/usr/local/jdk-17.0.15
export JRE_HOME=/usr/local/jdk-17.0.15/jre
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

执行如下命令使配置文件生效:

root@desktop-jacksen:/usr/local/src# source /etc/profile

验证JDK安装情况:

root@desktop-jacksen:/usr/local/src# java -version
java version “17.0.15” 2025-04-15 LTS
Java(TM) SE Runtime Environment (build 17.0.15+9-LTS-241)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.15+9-LTS-241, mixed mode, sharing)

安装Nginx

root@desktop-jacksen:/usr/local/src# nginx -v
Command ‘nginx’ not found, but can be installed with:
apt install nginx-core # version 1.18.0-6ubuntu14.6, or
apt install nginx-extras # version 1.18.0-6ubuntu14.6
apt install nginx-light # version 1.18.0-6ubuntu14.6
root@desktop-jacksen:/usr/local/src# apt install nginx-extras

……

root@desktop-jacksen:/usr/local/src# nginx -v
nginx version: nginx/1.18.0 (Ubuntu)
root@desktop-jacksen:/usr/local/src#

系统中原来没有Nginx, 按提示用 apt install nginx-extras 命令安装完成,版本1.18.0 高于安装要求,满足要求。

检查Nginx服务状态:

root@desktop-jacksen:/usr/local/bin# sudo systemctl status nginx
● nginx.service – A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2025-06-26 11:31:59 CST; 5h 23min ago

浏览器访问: