6. 部署文档

6.1. 核心服务部署文档

DID核心服务主要包含以下三个服务:

  • DID(did)服务主要实现DID核心逻辑提供gRPC接口;

  • DID-ADMIN(did-admin)服务主要实现管理员DID相关业务逻辑包含DID核心逻辑;

  • 网关服务(did-gateway)主要实现转发、代理相关请求和权限管理。

6.1.1. DID服务(did)

6.1.1.1. 硬件配置

配置 最低配置 推荐
CPU 1.5Hz 2.4Hz
内存 8G 16G
核心 4核 8核
带宽 2Mb 10Mb

6.1.1.2. 软件环境准备

软件 版本 描述
k8s v1.18+
kubectl工具 与k8s集群匹配
redis v7.2+ 缓存
mysql v8+ 数据库

数据库可选:人大金仓,postgresql等数据库

6.1.1.3. 安装物料

软件 描述
did/etc did配置文件
did/did.7z 合约文件
did/deployment.yaml k8s配置文件

下载DID物料包 https://git.chainweaver.org.cn/chainweaver/did/did/-/releases/v1.1.0 物料包内容如下:

.
├── did  # did服务安装物料     ├── deployment.yaml
│     ├── did-v1.1.0.7z
│     └── etc
│         ├── crypto-config
│              ├── ca
│                   └── ca.crt
│              ├── client1.key
│              ├── client1.pem
│              ├── client1.tls.crt
│              └── client1.tls.key
│         ├── did.yaml
│         ├── sdk_config_pk.yml
│         └── templates
│             ├── 100000.json
│             ├── 100001.json
│             ├── 100002.json
│             └── 100003.json
├── did-admin # did-admin 服务安装物料     ├── deployment.yaml
│     └── etc
│         └── did-admin.yaml
└── did-gateway # did-admin 服务安装物料
    ├── deployment.yaml
    └── etc
        ├── did-gateway.yaml
        └── tls
            ├── server.crt
            ├── server.csr
            └── server.key

DID服务配置文件列表

did
├── deployment.yaml # k8s配置文件
├── did-v1.1.0.7z   # did合约
└── etc             # 启动时初始化依赖
    ├── crypto-config # 连接链节点依赖
       ├── ca        
          └── ca.crt
       ├── client1.key
       ├── client1.pem
       ├── client1.tls.crt
       └── client1.tls.key
    ├── did.yaml           # 服务配置
    ├── sdk_config_pk.yml  # 连接链节点配置
    └── templates          # 初始化VC模板内容
        ├── 100000.json
        ├── 100001.json
        ├── 100002.json
        └── 100003.json

6.1.1.4. 配置did.yaml

需根据自身需要修改did/etc/did.yaml,如下所示:

隐私数据加密相关操作步骤参考:附录:配置加密 数据库配置、密码等可加密

配置签发机构的信息:

...

# 配置签发机构的信息
CNBN:
  # 签发机构DID
  DID: did:cndid:cndid
  # 密钥对,必须是国密
  Crypto:
    PublicKey: "etc/crypto-config/client1.pem"
    PrivateKey: "etc/crypto-config/client1.key"
  # 对外暴露的地址
  Service:
    - "http://192.168.1.181:30002/api/v1"

...

数据库配置:

在启动前需要提前创建对应数据库 CREATE DATABASE did;

...

#DataSource: host=127.0.0。1 port=54321 user=system password=123456 dbname=did sslmode=disable client_encoding=UTF8
#Type: kingbase
DataSource: root:passw0rd@tcp(127.0.0.1:6379)/did?parseTime=true&loc=Asia%2fShanghai
Type: mysql # kingbase,mysql

...

Redis缓存配置:

...

# 缓存配置
RedisConf:
  Host: 127.0.0.1:6379
  Pass: password

...

6.1.1.5. 部署步骤

6.1.1.5.1. 整体流程
  • 修改配置文件

  • 启动did服务(若未部署合约则报错)

  • 查询did服务对应数据库的管理台did document

  • 部署did合约

  • 重启did服务

6.1.1.5.2. 部署到Kubernetes集群

使用`kubectl create` 命令创建挂载的map文件:

# 创建配置文件
kubectl create cm did-configmap-yml --from-file=./etc/did.yaml --from-file=./etc/sdk_config_pk.yml --dry-run=client -o yaml > did-configmap-yml.yaml --insecure-skip-tls-verify

kubectl create cm did-configmap-cnbn-key --from-file=./etc/crypto-config/client1.key --from-file=./etc/crypto-config/client1.pem --dry-run=client -o yaml > did-configmap-cnbn-key.yaml --insecure-skip-tls-verify

kubectl create cm did-configmap-cnbn-key-ca --from-file=./etc/crypto-config/ca/ca.crt --dry-run=client -o yaml > did-configmap-cnbn-key-ca.yaml --insecure-skip-tls-verify

kubectl create cm did-configmap-templates --from-file=./etc/templates --dry-run=client -o yaml > did-configmap-templates.yaml --insecure-skip-tls-verify

使用`kubectl apply` 命令应用map文件:

# 部署
kubectl apply -f did-configmap-yml.yaml  -n=did --insecure-skip-tls-verify
kubectl apply -f did-configmap-cnbn-key.yaml -n=did --insecure-skip-tls-verify
kubectl apply -f did-configmap-cnbn-key-ca.yaml -n=did --insecure-skip-tls-verify
kubectl apply -f did-configmap-templates.yaml -n=did --insecure-skip-tls-verify

使用`kubectl apply` 命令部署资源定义文件到Kubernetes集群:

如果该步骤拉不到镜像请参考附录kubectl操作指南

kubectl apply --force --record -n=did -f deployment.yaml --insecure-skip-tls-verify
6.1.1.5.3. 验证部署检查Pod状态,确保DID服务已成功启动并运行

初次部署需要启动后获取DID document信息,安装did合约成功后重启。

利用`kubectl get` 命令查看服务是否启动

kubectl get pod  -n did | grep did

返回结果如下,1/1则表示微服务有一个实例,启动成功1个pod实例,如果是2/2则表示有两个实例,启动成功了2个pod实例。

didXXXXX-XXX      1/1     Running   0               1d

检查Service和Ingress资源配置,保外部访问路径和端口正确:

kubectl get svc,ing -n did | grep did

利用日志验证是否部署成功,日志会有如下输出:

did rpc server version: v1.0.0, name: did, git commit: 49416ff,git Branch: develop,build time: 2024-04-11T07:35:09Z
6.1.1.5.4. 拷贝document(链上已有合约忽略此步骤)

执行SQL语句,查询`id = ‘did:cndid:cndid’` 的document内容:

SELECT document
FROM did
WHERE id = 'did:cndid:cndid';
6.1.1.5.5. 部署合约 did.7z(链上已有合约忽略此步骤)

下载CMC命令:v2.3.3版本发布页面

使用CMC命令:长安链CMC工具(pk)

注意:--contract-name字段值需要和did.yaml中的ChainMaker.ContractName字段值一致,参数中的didDocument的值为上一步查询的json内容,需转义。

./cmc client contract user create --contract-name=did --runtime-type=DOCKER_GO \
--byte-code-path=./did.7z --version=1.0 --sdk-conf-path=./etc/sdk_config_pk.yml \
--gas-limit=999999999 --sync-result=true \
--params='{"didDocument":"{\"@context\":\"https://www.w3.org/ns/did/v1\",\"id\":\"did:cnbn:7d5e485e5fb34bc1846848c50c9eeb38e8ba62fe\",......}"}'
6.1.1.5.6. 重启did服务
kubectl rollout restart deployment -n did did

6.1.2. DID-ADMIN服务(did-admin)

6.1.2.1. 硬件配置

配置 最低配置 推荐
CPU 1.5Hz 2.4Hz
内存 8G 16G
核心 4核 8核
带宽 2Mb 10Mb

6.1.2.2. 软件环境准备

软件 版本 描述
k8s v1.18+
kubectl工具 与k8s集群匹配

6.1.2.3. 安装物料

软件 描述
did-admin/etc did-admin配置文件
did-admin/deployment.yaml k8s配置文件

配置文件列表

did-admin
├── deployment.yaml
└── etc
    └── did-admin.yaml

6.1.2.4. 配置

6.1.2.4.1. 配置did-admin.yaml

需根据自身需要修改did-admin/etc/did-admin.yaml,如下所示:

DID服务地址

...

# did服务地址
GrpcTarget: did-service:17787

...

6.1.2.5. 部署步骤

6.1.2.5.1. 进入到目录
cd did-admin
6.1.2.5.2. 部署到Kubernetes集群

使用`kubectl create` 命令创建挂载的map文件:

kubectl create cm did-admin-configmap-yml --from-file=./etc/did-admin.yaml --dry-run=client -o yaml > did-admin-configmap-yml.yaml --insecure-skip-tls-verify

使用`kubectl apply` 命令应用map文件:

kubectl apply -n=did -f did-admin-configmap-yml.yaml --insecure-skip-tls-verify

使用`kubectl apply` 命令部署资源定义文件到Kubernetes集群:

如果该步骤拉不到镜像请参考附录kubectl操作指南

kubectl apply -n=did --force -f deployment.yaml --insecure-skip-tls-verify
6.1.2.5.3. 验证部署检查Pod状态,确保DID服务已成功启动并运行

利用`kubectl get` 命令查看服务是否启动

kubectl get pod -n did | grep did-admin

返回结果如下,1/1则表示微服务有一个实例,启动成功1个pod实例,如果是2/2则表示有两个实例,启动成功了2个pod实例。

did-admin-XXXXX-XXX      1/1     Running   0               1d

检查Service和Ingress资源配置,保外部访问路径和端口正确:

kubectl get svc,ing -n did | grep did-admin

利用health接口验证是否部署成功(ip为k8s work的地址, host为端口号)

http://ip:host/api/v1/did/health

结果如下:

{"code":200000,"msg":"操作成功","data":{"version":"v1.0.0","name":"did-admin","buildTime":"2024-04-11T08:13:36Z","gitCommit":"ec0cc7a","gitBranch":"develop","startTime":"2024-04-11T16:14:20+08:00","now":"2024-04-11T16:16:55+08:00"}

6.1.2.6. 签发VC

以上步骤全部完成,需要对did:cndid:cndid签发VC 请参考签发VC文档

6.2. 网关服务(did-gateway)

6.2.1. 硬件配置

配置 最低配置 推荐
CPU 1.5Hz 2.4Hz
内存 8G 16G
核心 4核 8核
带宽 2Mb 10Mb

6.2.2. 软件环境准备

软件 版本 描述
k8s v1.18+
kubectl工具 与k8s集群匹配

6.2.3. 安装物料

软件 描述
did-gateway/etc did-gateway配置文件
did-gateway/deployment.yaml k8s配置文件

配置文件列表

did-gateway
├── deployment.yaml
└── etc
    ├── did-gateway.yaml
    └── tls
        ├── server.crt
        ├── server.csr
        └── server.key

6.2.4. 配置

6.2.4.1. 配置did-gateway.yaml

需根据自身需要修改did-gateway/etc/did-gateway.yaml,如下所示:

CA证书和密钥地址

...

# Https CA证书
CertFile: ./etc/tls/server.crt
# Https CA密钥
KeyFile: ./etc/tls/server.key

...

did-admin服务地址

...

# cnbn服务地址
DIDAdmin: did-admin-service:17786

...

6.2.5. 部署步骤

6.2.5.1. 进入到目录

cd did-gateway

6.2.5.2. 部署到Kubernetes集群

使用`kubectl create` 命令创建挂载的map文件:

kubectl create cm did-gateway-configmap-yml --from-file=./etc/did-gateway.yaml --dry-run=client -o yaml > did-gateway-configmap-yml.yaml --insecure-skip-tls-verify
kubectl create cm did-gateway-configmap-tls-key --from-file=./etc/tls/server.key --from-file=./etc/tls/server.crt --dry-run=client -o yaml > did-gateway-configmap-tls-key.yaml

使用`kubectl apply` 命令应用map文件:

kubectl apply -n=did -f did-gateway-configmap-yml.yaml --insecure-skip-tls-verify
kubectl apply -n=did -f did-gateway-configmap-tls-key.yaml --insecure-skip-tls-verify

使用`kubectl apply` 命令部署资源定义文件到Kubernetes集群:

如果该步骤拉不到镜像请参考附录kubectl操作指南

kubectl apply -n=did --force --record -f deployment.yaml --insecure-skip-tls-verify
6.2.5.2.1. 验证部署检查Pod状态,确保DID服务已成功启动并运行

利用`kubectl get` 命令查看服务是否启动

kubectl get pod -n did | grep did-gateway

返回结果如下,1/1则表示微服务有一个实例,启动成功1个pod实例,如果是2/2则表示有两个实例,启动成功了2个pod实例。

did-gateway-XXXXX-XXX      1/1     Running   0               1d

检查Service和Ingress资源配置,保外部访问路径和端口正确:

kubectl get svc,ing -n did | grep did-gateway

利用health接口验证是否部署成功(ip为k8s work的地址,host为端口号)

https://ip:host/api/v1/did/health

结果如下:

{"code":200000,"msg":"操作成功","data":{"version":"v1.0.0","name":"did-gateway","buildTime":"2024-04-11T07:09:18Z","gitCommit":"8263170","gitBranch":"develop","startTime":"2024-04-11T15:13:50+08:00","now":"2024-04-11T15:13:55+08:00"}

6.3. 管理台部署文档

6.3.1. 高可用方案

二进制部署高可用方案,可用虚拟IP加2个负载完成。

  • VIP转发到2个nginx

  • nginx负载到各个服务

  • SDK与DID管理台通过VIP访问

  • 各个微服务之间也使用VIP进行访问

6.3.1.1. 硬件配置

配置 最低配置 推荐
CPU 1.5Hz 2.4Hz
内存 8G 16G
核心 4核 8核
带宽 2Mb 10Mb

6.3.1.2. 软件环境准备

软件 版本 描述
docker 18+ 可选
k8s v1.18+ 可选
docker-compose v2.26+ 可选
redis集群 7.2+ 单机/集群
mysql v8+ mysql数据库
可访问的Docker镜像服务 - 存储镜像

数据库可选:人大金仓,postgresql等数据库

6.3.2. docker-compose单机版部署

数据库可选:人大金仓,postgresql等数据库

安装物料包:
物料包

解压物料包:

    tar xvf ./did-mgr-docker-compose-v1.1.0.tar.gz

6.3.2.1. docker与docker-compose

  • 确保已有一个运行中的Docker,版本建议为18或更高。

  • 已安装docker-compose命令行工具,用于docker-compose.yml的部署。

6.3.2.2. Docker镜像仓库

项目方准备一个公网可访问的Docker镜像仓库,用于存储“DID管理台”微服务的镜像。在后续运行部署流程时会自动拉取,如果Docker所在环境无法访问互联网,需要手动先在可联网的机上从Docker-compose镜像仓库下载并保存镜像文件: - did-kms.tar - did-mgr-holder-service.tar - did-mgr-issuer-service.tar - did-mgr-common-service.tar - did-mgr-front.tar

  • 将下载的文件转移到Docker所在服务器磁盘,然后载入Docker镜像到服务器。载入命令在物料包中,执行:

  ./load_docker_image.sh 

即可。

6.3.2.3. 部署流程

6.3.2.3.1. 根据实际需要修改 config 文件

在实际项目使用中可能会存在测试环境、预生产环境、生产环境等多套环境,请根据实际环境的需求调整etc文件夹中yaml配置文件中的参数。

did-kms-etc
└── kms.yaml
did-mgr-common-service-etc
└── did-mgr-common-service-api.yaml
did-mgr-holder-service-etc
└── holder.yaml
did-mgr-issuer-service-etc
└── vc-issuer-api.yaml

**【注意:DID管理台服务在启动时会自动连接数据库并创建对应的表,在配置数据库连接字符串时,请确保数据库已经创建,而且账号具有在该数据库中创建表的DDL权限。】 **

6.3.2.3.1.1. 修改kms.yaml
Name: kms.rpc
ListenOn: 0.0.0.0:17781
Timeout: 30000
DidService: https://192.168.1.181:30032 #修改为真实的DID服务地址
Database:
  DbType: "mysql"                                                    
  DSN: "root:passw0rd@tcp(ip:13306)/kms_database?parseTime=true"
#  DbType: "kingbase"
#  DSN: "host=192.168.1.181 port=54321 user=SYSTEM password=passw0rd dbname=test sslmode=disable"

注:DidService表示DID服务,请将该字段修改为真实的DID服务地址。

6.3.2.3.1.2. 修改did-mgr-common-service-api.yaml
Name: did-mgr-common-service-api
Host: 0.0.0.0
Port: 17782
MaxBytes: 5368709120
Timeout: 10000

service:
  issuer: did-mgr-issuer-service:17784 
  holder: did-mgr-holder-service:17783
  did: http://192.168.1.181:30002 #修改连接到的DID服务地址

adminUser:
  user: admin    #修改默认用户名
  password: password    #修改默认密码

jwt:
  expires_time: 7200
  issuer: did-mgr-issuer-service:17884 
  key: "!@#$abcd%^&*++``123" #修改jwt的key

注:did字段表示DID服务,请将该字段修改为真实的DID服务地址。

6.3.2.3.1.3. 修改holder.yaml
Name: holder
Host: 0.0.0.0
Port: 17783
GrpcTarget: did-kms:17781

DidService: https://192.168.1.181:30003
# mysql链接地址,满足 $user:$password@tcp($ip:$port)/$db?$queries 格式即可
#DataSource: root:passw0rd@tcp(192.168.1.181:13306)/holder_database?parseTime=true
Database:
  DbType: "kingbase" #修改为mysql或者kingbase(人大金仓)
  DSN: "root:passw0rd@tcp(mysql:3306)/holder_database?parseTime=true"
  #连接mysql或者人大金仓的数据库连接字符串

注:DidService表示DID服务,请将该字段修改为真实的DID服务地址。

6.3.2.3.1.4. 修改 vc-issuer-api.yaml
Name: vc-issuer-api
Host: 0.0.0.0
Port: 17784

Database:
  DbType: "mysql" #修改为mysql或者kingbase(人大金仓)
  DSN: "root:passw0rd@tcp(mysql-mgr-service:3306)/mgr_issuer?charset=utf8mb4&parseTime=true&loc=Local" #连接mysql或者人大金仓的数据库连接字符串

Issuer:
  DID: "" #修改颁发者的DID
  IdPrefixUrl: "http://192.168.1.181:30003/api/v1/did/vc/" #修改服务的URL前缀

DID:
  Endpoint: "192.168.1.181:30003" #DID服务的IP和端口

KMS:
  Endpoints:
    - "did-kms:17781" #DID-KMS服务的server和端口

注:

  • Endpoint字段表示DID服务,请修改为真实的DID服务地址。

  • IdPrefixUrl字段的URL前缀修改为真实的DID服务地址。

  • Endpoints字段表示DID -KMS服务,检查其格式是否如上述所示。

6.3.2.3.2. 创建Docker容器,部署DID管理台服务

使用docker-compose命令部署资源定义文件到docker,以startAll.sh启动所有DID管理台微服务为例(包括数据库):

docker-compose -f ./db-docker-compose.yml \
-f ./did-kms-docker-compose.yml \
-f ./did-mgr-common-service-docker-compose.yml \
-f ./did-mgr-holder-service-docker-compose.yml \
-f ./did-mgr-issuer-service-docker-compose.yml \
-f ./did-mgr-front.yml \
up -d

如果已经提前准备了数据库,无需通过脚本启动数据库那么可以将启动命令改为:

docker-compose -f ./did-kms-docker-compose.yml \
-f ./did-mgr-common-service-docker-compose.yml \
-f ./did-mgr-holder-service-docker-compose.yml \
-f ./did-mgr-issuer-service-docker-compose.yml \
-f ./did-mgr-front.yml \
up -d
6.3.2.3.3. 检查容器部署状态

执行以下命令,确保“DID管理台”微服务已成功启动并运行:

 docker ps | grep did-kms

返回结果如下,则表示启动成功。

25473b8ce360   hub-dev.cnbn.org.cn:17754/opennet/did-kms:v1.1.0                  "./kms"                  1 hours ago   Up 1 hours   0.0.0.0:17781->17781/tcp, :::17781->17781/tcp
6.3.2.3.4. 访问“DID管理台”

在物料包中提供了checkHealth.sh,运行后可以检查每个服务是否正常运行。其中did-mgr-common-service是对SDK提供服务的网关。

./checkHealth.sh
6.3.2.3.5. 初始化“DID管理台”数据

打开管理台网站: http://{NodeIP}:8888 然后注册用户,导入私钥或者企业实名认证生成新私钥,第一个注册的用户将是did管理台的管理员。

注:NodeIP默认为localhost

6.3.2.4. 修改配置管理

在DID管理台中,所有配置通过yaml文件进管理,避免在镜像中硬编码配置。当前配置不满足预期,需要进行调整时可根据需要更新* .yaml中的部分的内容,并使用停止容器然后启动容器以应用新的配置。

#关闭现有容器
./stopAll.sh

#重新启动容器,将会重新加载配置文件
./startAll.sh

6.3.2.5. 服务的升级

当DID管理台微服务有新版本发布时,需要更新对应的镜像和容器。可以执行:

./upgradeAll.sh

更新镜像,重启服务,并检查服务状态。

6.3.3. k8s集群版部署

6.3.3.1. 软件环境准备

软件 版本 描述
k8s集群 v1.18+
kubectl工具 与k8s集群匹配
redis集群 7.2+
mysql v8+ mysql数据库
可访问的Docker镜像服务 - 存储镜像

物料包下载:
物料包

解压物料包:

tar xvf did-mgr-k8s-v1.1.0.tar.gz
6.3.3.1.1. k8s集群
  • 确保已有一个运行中的Kubernetes集群,版本建议为v1.18或更高。

  • 已安装并配置kubectl命令行工具,用于与Kubernetes集群交互。

6.3.3.1.2. docker 镜像仓库

项目方准备一个公网可访问的Docker镜像仓库,用于存储“DID管理台”微服务的镜像。在后续运行部署流程时会自动拉取,如果Kubernetes所在环境无法访问互联网,需要自建Docker镜像仓库服务,并将先在可联网的机上从Docker镜像仓库下载并保存镜像文件: - did-kms.tar - did-mgr-holder-service.tar - did-mgr-issuer-service.tar - did-mgr-common-service.tar - did-mgr-front.tar

再载入这些镜像到Kubernetes能访问的自建Docker镜像仓库服务中。

6.3.3.2. 部署流程

6.3.3.2.1. 配置 namespace.yaml

检查是否存在did namespace,若无记录则创建Namespace

    kubectl get ns|grep did

创建 did namespace

# 创建namespace
kubectl create namespace did
6.3.3.2.2. 根据实际需要修改 ConfigMap

**【注意:DID管理台服务在启动时会自动连接数据库并创建对应的表,在配置数据库连接字符串时,请确保数据库已经创建,而且账号具有在该数据库中创建表的DDL权限。】 **

6.3.3.2.2.1. 修改 did-kms-configmap
    apiVersion: v1
    data:
      kms.yaml: |-
        Name: kms.rpc
        ListenOn: 0.0.0.0:17781
        Timeout: 30000
        DidService: https://192.168.1.181:30032
        Database:
          DbType: "mysql"                                                    
          DSN: "root:passw0rd@tcp(ip:13306)/kms_database?parseTime=true"
       #  DbType: "kingbase"
       #  DSN: "host=192.168.1.181 port=54321 user=SYSTEM password=passw0rd dbname=test sslmode=disable"
        kind: ConfigMap
    metadata:
      name: did-kms-configmap

注:

  • DidService表示DID服务,请将该字段修改为真实的DID服务地址。

  • DSN字段定义了数据库连接,请修改为真实的数据库连接信息。

6.3.3.2.2.2. 修改did-mgr-common-service-configmap
    apiVersion: v1
    data:
      did-mgr-common-service-api.yaml: |-
        Name: did-mgr-common-service-api
        Host: 0.0.0.0
        Port: 17782
        MaxBytes: 5368709120
        Timeout: 10000
  
        service:
          issuer: http://did-mgr-issuer-service:17884
          holder: http://did-mgr-holder-service:17883
          did: http://192.168.1.181:30002
  
        adminUser:
          user: admin
          password: password
  
        jwt:
          expires_time: 7200
          issuer: did-mgr-issuer-service:17884
          key: "!@#$abcd%^&*++``123"
    kind: ConfigMap
    metadata:
      creationTimestamp: null
      name: did-mgr-common-service-configmap

注:

  • did字段定义了DID服务,请将其改为真实的DID服务地址。

  • issuer与holder字段的端口号请依据实际修改。

  • 请修改jwt的key值。

6.3.3.2.2.3. 修改did-mgr-holder-service-configmap
    apiVersion: v1
    data:
      holder.yaml: |-
        Name: holder
        Host: 0.0.0.0
        Port: 27781
        GrpcTarget: did-kms-service:17781
        Database:
          DbType: "mysql"
          DSN: "root:passw0rd@tcp(9.135.0.21:3306)/holder_database?parseTime=true"
    kind: ConfigMap
    metadata:
      creationTimestamp: null
      name: did-mgr-holder-service-configmap

注:

  • DSN字段定义了数据库连接,请修改为真实的数据库连接信息。

  • Port定义了holder服务的端口号,其他服务中有关holder信息的配置按照此处填写。

6.3.3.2.2.4. 修改did-mgr-issuer-service-configmap
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: did-mgr-issuer-service-configmap
    data:
      vc-issuer-api.yaml: |-
        Name: vc-issuer-api
        Host: 0.0.0.0
        Port: 17784
        Database:
          DbType: "mysql"
          DSN: "root:passw0rd@tcp(9.135.0.21:3306)/mgr_issuer?charset=utf8mb4&parseTime=true&loc=Local"
        Issuer:
          DID: "did:cnbn:b27356b68f224d6394dabb69144bdf7e"
          IdPrefixUrl: "http://192.168.1.181:30002/api/v1/did/vc/"
        DID:
          Endpoint: "192.168.1.181:30032"
        KMS:
          Endpoints:
            - "did-kms-service:17781"

注:

  • DSN字段定义了数据库连接,请修改为真实的数据库连接信息。

  • DID字段修改为颁发者的DID。

  • IdPrefixUrl字段前缀修改为真实的DID服务地址。

  • Endpoint字段定义了DID服务,请修改为真实的DID服务地址。

6.3.3.2.2.5. 修改did-mgr-front-configmap

这里主要是前端网页的Nginx配置,具体如下:

    gzip_types
      application/atom+xml
      application/javascript
      application/json
      application/rss+xml
      application/vnd.ms-fontobject
      application/x-font-ttf
      application/x-web-app-manifest+json
      application/xhtml+xml
      application/xml
      application/octet-stream
      font/opentype
      image/svg+xml
      image/x-icon
      text/css
      text/plain
      text/x-component;
  
    server {
        listen 8888;
        root /usr/share/nginx/html;
        index index.html;
  
        location / {
         try_files $uri $uri/ /index.html;
        }
  
        location /api/ {
          proxy_read_timeout 300;
          proxy_pass http://192.168.3.170:18782/;
        }
  
    }

注:proxy_pass字段修改为真实的did-mgr-common-service-api服务地址。

6.3.3.2.3. 部署到k8s集群

使用kubectl apply命令部署资源定义文件到k8s集群,以did-kms微服务为例:

  kubectl apply -f did-kms-deployment.yaml
6.3.3.2.4. 检查pod状态

执行下列命令,确保”DID管理台”微服务已成功启动并运行:

kubectl get pod -n did

返回结果如下,1/1则表示微服务有一个实例,启动成功1个pod实例,如果是2/2则表示有两个实例,启动成功了2个pod实例。

  did-kms-XXXXX-XXX      1/1     Running   0               1d

检查Service资源配置,保外部访问路径和端口正确:

  kubectl get svc -n did | grep did-kms
6.3.3.2.5. 部署其他微服务

使用相同的方法,运行kubectl apply可以部署剩余的管理台微服务:

  kubectl apply -f did-mgr-common-service-deployment.yaml
  kubectl apply -f did-mgr-issuer-service-deployment.yaml
  kubectl apply -f did-mgr-holder-service-deployment.yaml
  kubectl apply -f did-mgr-front.yaml

也可以直接使用./deployAll.sh来部署所有的DID管理台微服务。

6.3.3.2.6. 检查各“DID管理台”微服务

根据各个Service的配置,通过curl或其他HTTP客户端访问“DID理台”的URL:

    curl -s http://{NodeIP}:30782/api/v1/did/health
    curl -s http://{NodeIP}:30783/api/v1/did/health
    curl -s http://{NodeIP}:30784/api/v1/did/health

注:NodeIP默认为localhost,端口号请填写真实的服务端口。

如果服务正常,那么将返回成功的消息。

6.3.3.2.7. 初始化did管理台数据

打开管理台网站: http://{NodeIP}:8888 然后注册用户,导入私钥或者企业实名认证生成新私钥,第一个注册的用户将是did管理台的管理员。

注:NodeIP默认为localhost。

6.3.3.3. 配置管理

在DID管理台中,所有配置应通过k8s的ConfigMap进管理,避免在镜像中硬编码配置。当前配置不满足预期,需要进行调整时可执行以下命令进行配置的更新。

  • 根据需要更新deployment.yaml中的ConfigMap部分的内容,并使用kubectl rollout restart重启Pod以应用新的配置。

# 载入修改后的配置到k8s
kubectl apply -f deployment.yaml  
# 重启对应的微服务,以应用修改后的配置
kubectl rollout restart deployment/did-kms

6.3.3.4. 服务升级

当DID管理台微服务有新版本发布时,需要更新对应的镜像和容器。

6.3.3.4.1. 更新“DID管理台”服务的镜像

更新镜像可以进行如下操作, 以did-kms服务升级为v1.1.1为例:

  • 打开did-kms-deployment.yaml,找到其中的

image: hub-dev.cnbn.org.cn/opennet/did-kms:v1.1.0

将其改为:

image: hub-dev.cnbn.org.cn/opennet/did-kms:v1.1.1
6.3.3.4.2. 更新DID管理台服务的容器

接下来使用以下命令将变更应用到k8s中:

kubectl apply -f did-kms-deployment.yaml
kubectl rollout restart did-kms

即可通知k8s更新pod容器为最新的镜像的实例。

6.3.4. 二进制单机版部署

本章节适用于企业环境无K8s集群,无Docker,采用单机二进制部署的场景。

6.3.4.1. 软件环境准备

软件 版本 描述
redis集群 7.2+
mysql v8+ mysql数据库
Nginx 1.24+
Linux部署物料包 - did-mgr-bin.tar.gz

6.3.4.2. 部署流程

6.3.4.2.1. 解压物料包

物料包

    tar xvf ./did-mgr-bin-v1.1.0.tar.gz
6.3.4.2.2. 根据实际需要修改config文件

在实际项目使用中可能会存在测试环境、预生产环境、生产环境等多套环境,请根据实际环境的需求调整.yaml配置文件中的参数:

    did-kms-etc
    └── kms.yaml
    did-mgr-common-service-etc
    └── did-mgr-common-service-api.yaml
    did-mgr-holder-service-etc
    └── holder.yaml
    did-mgr-issuer-service-etc
    └── vc-issuer-api.yaml

**【注意:DID管理台服务在启动时会自动连接数据库并创建对应的表,在配置数据库连接字符串时,请确保数据库已经创建,而且账号具有在该数据库中创建表的DDL权限。】 **

6.3.4.2.2.1. 修改kms.yaml
    Name: kms.rpc
    ListenOn: 0.0.0.0:17781
    Timeout: 30000 
    DidService: https://192.168.1.181:30032 #修改为真实的DID服务地址
    Database:
      DbType: "mysql"
      DSN: "root:passw0rd@tcp(192.168.1.182:13306)/kms_database?parseTime=true"
    #  DbType: "kingbase"
    #  DSN: "host=192.168.1.181 port=54321 user=SYSTEM password=passw0rd dbname=test sslmode=disable"

注:

  • DidService表示DID服务,请将该字段修改为真实的DID服务地址。

  • DSN字段请修改为真实的数据库连接信息。

6.3.4.2.2.2. 修改did-mgr-common-service-api.yaml
    Name: did-mgr-common-service-api
    Host: 0.0.0.0
    Port: 17782
    MaxBytes: 5368709120
    Timeout: 10000
  
    service:
      issuer: did-mgr-issuer-service:17784 
      holder: did-mgr-holder-service:17783
      did: http://192.168.1.181:30002 #修改连接到的DID服务地址
  
    adminUser:
      user: admin    #修改默认用户名
      password: password    #修改默认密码
  
    Database:
      DbType: "mysql"
      DSN: "root:passw0rd@tcp(192.168.1.182:13306)/en1common_database?parseTime=true"#修改为真实的数据库连接信息

    jwt:
      expires_time: 7200
      issuer: did-mgr-issuer-service:17884 
      key: "!@#$abcd%^&*++``123" #修改jwt的key

注:

  • did表示DID服务,请修改为真实的DID服务地址。

  • DSN字段请修改为真实的数据库连接信息。

  • 请修改jwt的key值。

6.3.4.2.2.3. 修改holder.yaml
    Name: holder
    Host: 0.0.0.0
    Port: 17783
    GrpcTarget: did-kms:17781
    
    DidService:  http://192.168.1.181:30003 #修改连接到的DID服务地址 
    # mysql链接地址,满足 $user:$password@tcp($ip:$port)/$db?$queries 格式即可
    #DataSource: root:passw0rd@tcp(192.168.1.181:13306)/holder_database?parseTime=true
    Database:
        DbType: "kingbase" #修改为mysql或者kingbase(人大金仓)
        DSN: "root:passw0rd@tcp(mysql:3306)/holder_database?parseTime=true" #连接mysql或者人大金仓的数据库连接字符串

注:

  • DidService表示DID服务,请将该字段修改为真实的DID服务地址。

  • DSN字段请修改为真实的数据库连接信息。

6.3.4.2.2.4. 修改vc-issuer-api.yaml
    Name: vc-issuer-api
    Host: 0.0.0.0
    Port: 17784
  
    Database:
      DbType: "mysql" #修改为mysql或者kingbase(人大金仓)
      DSN: "root:passw0rd@tcp(mysql:3306)/mgr_issuer?charset=utf8mb4&parseTime=true&loc=Local" #连接mysql或者人大金仓的数据库连接字符串
  
    Issuer:
      DID: "" #修改颁发者的DID
      IdPrefixUrl: "" #修改服务的URL前缀
  
    DID:
      Endpoint: "192.168.1.181:30003" #DID服务的IP和端口
  
    KMS:
      Endpoints:
        - "did-kms:17781" #DID-KMS服务的server和端口

注:

  • DidService表示DID服务,请将该字段修改为真实的DID服务地址。

  • DSN字段请修改为真实的数据库连接信息。

  • 修改颁发者的DID。

  • 修改IdPrefixUrl前缀为真实的DID服务地址。

6.3.4.2.3. 运行二进制,部署DID管理台后台服务

使用./startAll.sh命令部署DID管理台服务,以启动所有DID管理台微服务为例(数据库请提前启动好):

    #!/bin/bash

    # Start did-kms and output logs to did-kms.log
    nohup ./did-kms -f ./did-kms-etc/kms.yaml > did-kms.log 2>&1 &
  
    # Start did-mgr-holder-service and output logs to did-mgr-holder-service.log
    nohup ./did-mgr-holder-service -f ./did-mgr-holder-service-etc/holder.yaml > did-mgr-holder-service.log 2>&1 &
  
    # Start did-mgr-issuer-service and output logs to did-mgr-issuer-service.log
    nohup ./did-mgr-issuer-service -f ./did-mgr-issuer-service-etc/vc-issuer-api.yaml > did-mgr-issuer-service.log 2>&1 &
  
    # Start did-mgr-common-service and output logs to did-mgr-common-service.log
    nohup ./did-mgr-common-service -f ./did-mgr-common-service-etc/did-mgr-common-service-api.yaml > did-mgr-common-service.log 2>&1 &
  
    echo "All services have been started."
6.3.4.2.4. 检查进程状态

执行完上面的 startAll.sh后,需要执行下面的命令,确认“DID管理台”微服务已成功启动并运行:

  ps aux | grep did

返回结果如下,则表示启动成功:

    devinyz+ 3255760  1.6  0.2 2125964 47460 pts/0   Sl   11:31   0:00 ./did-kms -f ./did-kms-etc/kms.yaml
    devinyz+ 3255761  1.6  0.3 2171468 57412 pts/0   Sl   11:31   0:00 ./did-mgr-holder-service -f ./did-mgr-holder-service-etc/holder.yaml
    devinyz+ 3255762  1.6  0.3 2238116 54528 pts/0   Sl   11:31   0:00 ./did-mgr-issuer-service -f ./did-mgr-issuer-service-etc/vc-issuer-api.yaml
    devinyz+ 3255763  0.6  0.1 1863036 29528 pts/0   Sl   11:31   0:00 ./did-mgr-common-service -f ./did-mgr-common-service-etc/did-mgr-common-service-api.yaml
6.3.4.2.5. 在Nginx中部署“DID管理台”前端

在物料包中提供了did-mgr-front.tar.gz,解压该物料包:

    tar xvf did-mgr-front.tar.gz

将获得dist文件夹和deploy文件夹。

在deploy文件夹中包含Nginx配置文件,复制其到Nginx配置文件夹:

    sudo cp deploy/nginx/conf.d/default.conf /etc/nginx/conf.d

dist文件夹为前端相关html、js等文件,修改/etc/nginx/conf.d/default.conf文件,将默认的/usr/share/nginx/html替换为之前解压出来的dist文件夹路径:

    root/data/did-mgr-front/dist;

proxy_pass的值为前面部署的did-mgr-common-service的URL,如:

    proxy_pass http://localhost:17782/;

判断Nginx服务是否正常启动:

    sudo systemctl status nginx

注:如果启动失败,请检查Nginx服务日志,排除错误之后重启Nginx服务。

重启Nginx服务,浏览器访问: http://{服务器IP}:8888 即可!

6.3.4.2.6. 初始化did管理台数据

打开管理台网站: http://{NodeIP}:8888 然后注册用户,导入私钥或者企业实名认证生成新私钥,第一个注册的用户将是did管理台的管理员。

6.3.4.3. 修改配置管理

在DID管理台中,所有配置yaml文件进管理,避免在镜像中硬编码配置。当前配置不满足预期,需要进行调整时可执行以下命令进行配置的更新。

  • 对于后端服务: 根据需要更新*.yaml中的部分的内容,并使用stopAll.sh停止进程,然后启动服务以应用新的配置。

    #关闭现有DID服务
    ./stopAll.sh
    #重新启动DID服务,将会重新加载配置文件
    ./startAll.sh
  • 对于前端服务,因为是基于Nginx,请使用Nginx服务的命令进行服务的关闭和重启。

     #关闭Nginx服务
    sudo systemctl stop nginx
    #重启Nginx服务
    sudo systemctl restart nginx

6.3.4.4. 服务的升级

当DID管理台微服务有新版本发布时,需要更新对应的二进制。 在服务器上载入最新的物料包,并执行以下命令:

    ./upgradeAll.sh

系统会自动完成物料包的解压、服务的停止、二进制文件的替换、服务的启动等动作。

6.4. 同步服务部署文档

6.4.1. 设计方案

子链合约部分我们介绍为了保证子链与主链did 状态数据库一致,我们需要以块为最小单位进行同步迁移。所以我们得到以下同步服务流程:

  1. 同步服务监听主链区块

  2. 同步服务解析主链区块,并检查是否存在在关注列表的 did topic,存在进入第三步,否则丢弃并回到第一步

  3. 同步服务按照主链区块中交易顺序构建 did event 数据 list

  4. 同步服务将整理的主链中某个块的 event 数据打包,调用同步合约进行上链操作

  5. 子链 did 同步合约将同步服务的 event 数据解包并写入链上

6.4.2. 部署流程

6.4.2.1. 硬件配置

配置 最低配置 推荐
CPU 1.5Hz 2.4Hz
内存 8G 16G
核心 4核 8核
带宽 2Mb 10Mb

6.4.2.2. 合约部署

本服务应用前提需要两条 ChainMaker 链,请自行部署搭建,主链安装DID合约,子链安装DID同步合约。

主链DID合约在:DID合约

DID同步合约在:DID同步合约

可下载已编译好的文件同步合约 进行部署,或根据服务器配置自行编译后部署

请将以上两个合约安装到对应的ChainMaker链上。

6.4.2.3. docker 方式部署

6.4.2.3.1. 软件依赖
名称 版本 描述
docker 18+ 运行服务
docker-compose v1.26+ docker部署工具

注:

  • 确保已有一个运行中的Docker,版本建议为18或更高。

  • 已安装docker-compose命令行工具,用于docker- compose.yml的部署。

  • 确保可以从长安链镜像仓库hub-dev.cnbn.org.cn拉取镜像。

6.4.2.3.2. 创建etc目录,准备配置文件:

配置文件目录结构如下:

did-sync
├── docker-compose.yml
└── etc
    ├── config.yaml               # 服务配置文件
    ├── mainchain_user.key        # 主链 SDK 客户端用户交易签名私钥
    ├── sdk_config_mainchain.yml  # 主链 SDK 配置文件
    ├── sdk_config_subchain.yml   # 子链 SDK 配置文件
    └── subchain_user.key         # 子链 SDK 客户端用户交易签名私钥
  1. 主链 sdk 配置文件:sdk_config_mainchain.yml

  2. 子链 sdk 配置文件:sdk_config_subchain.yml

  3. 服务配置文件:config.yaml 配置项如下,请根据注释自行调整

需确认以下部分: 1、syncContract部分:主链did合约名称,若有特殊要求(明确知道需同步数据起止区块高度)可自行配置,默认将同步所有; 2、主子链配置文件路径,子链同步合约名称是否正确。

system:
  env: test
  db-type: sqlite

# 日志配置
zap:
  # 日志输出级别
  level: debug
  # 日志格式, json 格式 或者 console
  format: console
  # 日志输出前缀
  prefix: "[did-sync]"
  # 日志输出路径
  path: ./logs/service.log
  # 是否显示代码行号
  show-line: true
  # 是否打印到控制台
  log-in-console: false

# 监听主链did合约信息
syncContract:
  # 主链DID合约名称
  name: "DID"
  topic: #设置为空表示监听当前合约下的所有event
  #    - "SetDidDocument"
  #    - "SetTrustRootList"
  #    - "RevokeVc"
  #    - "AddBlackList"
  #    - "DeleteBlackList"
  #    - "AddTrustIssuer"
  #    - "DeleteTrustIssuer"
  #    - "Delegate"
  #    - "RevokeDelegate"
  #    - "SetVcTemplate"
  #    - "VcIssueLog"
  #    - "DisableVcTemplate"
  #    - "EnableVcTemplate"  
  # 如果结束高度设置为-1,则一直同步
  endHeight: -1
  # 开始同步 主链区块高度
  startHeight: 0

# 子链配置信息
subCmSdk:
  # DID 同步合约名称
  contractName: "DIDSub"
  chainConfig:
    sdkPath: "./etc/sdk_config_subchain.yml"
    chainId: "chain_sub_test"

# 主链配置信息
mainCmSdk:
  chainConfig:
    sdkPath: "./etc/sdk_config_mainchain.yml"
    chainId: "chain_main_test"
6.4.2.3.3. 准备 docker-compose.yml 文件

可自行拉取服务镜像:

docker pull hub-dev.cnbn.org.cn/opennet/did-sync:v1.2.0_qc

docker-compose.yml 文件内容如下:

services:
  did-sync:
    image: hub-dev.cnbn.org.cn/opennet/did-sync:v1.2.0_qc
    container_name: did-sync
    volumes:
      - ./etc:/did-sync/etc
      - ./logs:/did-sync/logs
      - ./data:/did-sync/data
    restart: always
6.4.2.3.4. 使用 docker-compose 命令部署资源定义文件到 docker:
docker-compose -f ./docker-compose.yml up -d
6.4.2.3.5. 验证部署检查容器状态:
docker ps | grep did-sync

返回结果如下,则表示启动成功。

CONTAINER ID   IMAGE                                            COMMAND        CREATED          STATUS                          PORTS     NAMES
cedf2c8beaf3   hub-dev.cnbn.org.cn/opennet/did-sync:v1.2.0_qc   "./did-sync"   4 seconds ago   Up 3 seconds             did-sync

若未成功启动可查看docker容器日志检查原因:

docker logs did-sync
6.4.2.3.6. 查看服务日志:
cat ./logs/service.log 

返回结果如下,则表示启动成功。

========
  
     _____ _____ _____         _____
    |  __ \_   _|  __ \       / ____|
    | |  | || | | |  | |_____| (___  _   _ _ __   ___
    | |  | || | | |  | |______\___ \| | | | '_ \ / __|
    | |__| || |_| |__| |      ____) | |_| | | | | (__
    |_____/_____|_____/      |_____/ \__, |_| |_|\___|
                                      __/ |
                                     |___/
  
========
Service Name: DID Sync Service
Version: v1.2.0_qc
Build Time:  2024-08-15 08:07:41
Git Commit:  v1.2.0_qc(a8d35d9d)
Start Time:  2024-08-15T16:44:30+08:00
Now Time:    2024-08-15T16:44:30+08:00


2024-08-15 16:44:30.878 [INFO]  [did-sync]      did-sync/main.go:64     Starting did sync service
6.4.2.3.7. 停止服务:
docker-compose -f ./docker-compose.yml down

若要清空数据请删除 logs目录及 etc 目录下的 sqlite.db 本地数据库文件

6.4.2.4. k8s 部署方式

6.4.2.4.1. 软件依赖
名称 版本 描述
docker 18+ 拉取镜像使用
k8s v1.18+ 服务 Kubernetes 集群
kubectl工具 与k8s集群匹配

注:

  • 确保已有一个运行中的 Kubernetes 集群,版本建议为v1.18或更高

  • 已安装并配置kubectl命令行工具,用于与 Kubernetes 集群交互

  • 确保可以从长安链镜像仓库 hub-dev.cnbn.org.cn 拉取镜像

6.4.2.4.2. 将镜像载入k8s的work节点

项目方准备一个公网可访问的Docker镜像仓库,用于存储DID微服务的镜像。在后续运行部署流程时会自动拉取,如果Kubernetes所在环境无法访问互联网,需要手动载入Docker镜像到Kubernetes的Worker节点,执行如下命令:

# 手动载入Docker镜像,找个能连hub-dev.cnbn.org.cn的服务器
docker pull hub-dev.cnbn.org.cn/opennet/did-sync:v1.2.0_qc
# 保存文件到本地
docker save -o did-sync-v1.2.0.tar hub-dev.cnbn.org.cn/opennet/did-sync:v1.2.0_qc
# 自行上传文件 did-sync-v1.2.0.tar 到Kubernetes的Worker节点服务器
# Kubernetes的Worker节点服务器载入镜像
docker load -i did-sync-v1.2.0.tar

#查看是否载入成功
docker images | grep hub-dev.cnbn.org.cn/opennet/did-sync
# 若显示如下说明成功
hub-dev.cnbn.org.cn/opennet/did-sync                                     v1.2.0_qc     cdf19ec76c3a   2 hours ago     190MB
6.4.2.4.3. 准备 deployment.yaml 配置文件

配置文件目录结构如下:

did-sync
└── deployment.yaml

deployment.yaml 文件内容如下,请自行修改 ConfigMap 配置相关内容:

注:

  • config.yaml 为服务配置文件,请确认简单主链did合约信息、同步合约名称和主子链配置(sdk_config文件路径)是否正确

  • *.key 文件为用户私钥,sdk_config.yml 文件为链 SDK 配置文件 请确保内容正确

apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: did-sync-configmap
data:
  # 服务配置
  config.yaml: |+
    system:
      env: test
      db-type: sqlite

    # 日志配置
    zap:
      # 日志输出级别
      level: debug
      # 日志格式, json 格式 或者 console
      format: console
      # 日志输出前缀
      prefix: "[did-sync]"
      # 日志输出路径
      path: ./logs/service.log
      # 是否显示代码行号
      show-line: true
      # 是否打印到控制台
      log-in-console: false

    # 监听主链did合约信息
    syncContract:
      # 主链DID合约名称
      name: "DID"
      topic: #设置为空表示监听当前合约下的所有event
      #    - "SetDidDocument"
      #    - "SetTrustRootList"
      #    - "RevokeVc"
      #    - "AddBlackList"
      #    - "DeleteBlackList"
      #    - "AddTrustIssuer"
      #    - "DeleteTrustIssuer"
      #    - "Delegate"
      #    - "RevokeDelegate"
      #    - "SetVcTemplate"
      #    - "VcIssueLog"
      #    - "DisableVcTemplate"
      #    - "EnableVcTemplate"  
      # 如果结束高度设置为-1,则一直同步
      endHeight: -1
      # 开始同步 主链区块高度
      startHeight: 0

    # 子链配置信息
    subCmSdk:
      # DID 同步合约名称
      contractName: "DIDSub"
      chainConfig:
        sdkPath: "./etc/sdk_config_subchain.yml"
        chainId: "chain_sub_test"

    # 主链配置信息
    mainCmSdk:
      chainConfig:
        sdkPath: "./etc/sdk_config_mainchain.yml"
        chainId: "chain_main_test"

  mainchain_user.key: |
    -----BEGIN PRIVATE KEY-----
    MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgelqvKuVT3RMtKqC3
    ZCJI4Tac8tYkS50erVjLPe+rhBegCgYIKoEcz1UBgi2hRANCAARe9ivpYoa0yirj
    VPmCAm8XYbqhuj2RWdPhTr81/B15t/0Zp/oL0g48l4vWp/89X3n9S94g2VIYECbN
    VpYRWCRs
    -----END PRIVATE KEY-----
  sdk_config_mainchain.yml: |
    chain_client:
      # 链ID
      chain_id: "chain_main_test"

      # 客户端用户交易签名私钥路径
      user_sign_key_file_path: "./etc/mainchain_user.key"
      # 客户端用户交易签名私钥密码(无密码则不需要设置)
      #  user_sign_key_pwd: "123"
      # 签名使用的哈希算法,和节点保持一直
      crypto:
        hash: SM3
      auth_type: public
      # 同步交易结果模式下,轮询获取交易结果时的最大轮询次数,删除此项或设为<=0则使用默认值 10
      retry_limit: 20
      # 同步交易结果模式下,每次轮询交易结果时的等待时间,单位:ms 删除此项或设为<=0则使用默认值 500
      retry_interval: 500
      # txid配置项:默认支持TimestampKey,如果开启enableNormalKey则使用NormalKey
      enable_normal_key: false

      nodes:
        - # 节点地址,格式为:IP:端口:连接数
          node_addr: "127.0.0.1:12391"
          # 节点连接数
          conn_cnt: 10

      rpc_client:
        max_receive_message_size: 100 # grpc客户端接收消息时,允许单条message大小的最大值(MB)
        max_send_message_size: 100 # grpc客户端发送消息时,允许单条message大小的最大值(MB)
        send_tx_timeout: 60 # grpc 客户端发送交易超时时间
        get_tx_timeout: 60 # rpc 客户端查询交易超时时间

  sdk_config_subchain.yml: |
    chain_client:
      # 链ID
      chain_id: "chain_sub_test"

      # 客户端用户交易签名私钥路径
      user_sign_key_file_path: "./etc/subchain_user.key"
      # 客户端用户交易签名私钥密码(无密码则不需要设置)
      #  user_sign_key_pwd: "123"
      # 签名使用的哈希算法,和节点保持一直
      crypto:
        hash: SM3
      auth_type: public
      # 同步交易结果模式下,轮询获取交易结果时的最大轮询次数,删除此项或设为<=0则使用默认值 10
      retry_limit: 20
      # 同步交易结果模式下,每次轮询交易结果时的等待时间,单位:ms 删除此项或设为<=0则使用默认值 500
      retry_interval: 500
      # txid配置项:默认支持TimestampKey,如果开启enableNormalKey则使用NormalKey
      enable_normal_key: false

      nodes:
        - # 节点地址,格式为:IP:端口:连接数
          node_addr: "127.0.0.1:12395"
          # 节点连接数
          conn_cnt: 10

      rpc_client:
        max_receive_message_size: 100 # grpc客户端接收消息时,允许单条message大小的最大值(MB)
        max_send_message_size: 100 # grpc客户端发送消息时,允许单条message大小的最大值(MB)
        send_tx_timeout: 60 # grpc 客户端发送交易超时时间
        get_tx_timeout: 60 # rpc 客户端查询交易超时时间
  subchain_user.key: |
    -----BEGIN EC PRIVATE KEY-----
    MHcCAQEEIMiaCfztbtenIgNHKjqFHtgJy9B3cyWVLIfM0bFn86pUoAoGCCqGSM49
    AwEHoUQDQgAEjXCPDCb9TjjPCKDSo85EDRr7El79ZpWR9xeu9zMidwDcF3U4Zt1u
    AudJ3nLiANAxRsKqPmXIiAu5kOF9Svrd8Q==
    -----END EC PRIVATE KEY-----


---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: did-sync
spec:
  replicas: 1
  selector:
    matchLabels:
      app: did-sync
  template:
    metadata:
      labels:
        app: did-sync
    spec:
      containers:
        - name: did-sync
          image: hub-dev.cnbn.org.cn/opennet/did-sync:v1.2.0_qc
          volumeMounts:
            - name: config-volume
              mountPath: /did-sync/etc
      volumes:
        - name: config-volume
          configMap:
            name: did-sync-configmap
6.4.2.4.4. 部署到 Kubernetes 集群

使用kubectl apply命令部署资源定义文件到 Kubernetes 集群:

kubectl apply -f ./deployment.yaml

验证部署检查Pod状态,确保 DID 同步服务已成功启动并运行:

kubectl get pods | grep did-sync

返回结果如下,1/1则表示微服务有一个实例,启动成功1个pod实例。

NAME                       READY   STATUS    RESTARTS   AGE
did-sync-xxxxx-xxx         1/1     Running   0          2s

若未成功启动可查看 k8s pod检查原因:

# 查看pod详情
kubectl describe pod did-sync-xxxxx-xxx
# 查看pod日志
kubectl logs did-sync-xxxxx-xxx

服务启动后进入服务查看运行日志:

# 进入服务pod
kubectl exec -it did-sync-xxxxx-xxx -- /bin/sh
# 查看日志
tail -f ./logs/service.log 
6.4.2.4.5. 停止服务:
kubectl delete -f ./deployment.yaml

6.5. APP后端服务部署

6.5.1. 后端 k8s部署方式

6.5.1.1. 硬件配置

配置 最低配置 推荐
CPU 1.5Hz 2.4Hz
内存 8G 16G
核心 4核 8核
带宽 2Mb 10Mb

6.5.1.2. 软件环境准备

软件 版本 描述
docker 18+ docker容器服务
docker-compose v1.26+
redis集群 7.2+
mysql V8+ mysql数据库
可访问的Docker镜像服务 - 存储镜像

数据库可选:人大金仓,postgresql等数据库

6.5.1.2.1. Kubernetes集群
  • 确保已有一个运行中的Kubernetes集群,版本建议为v1.18或更高。

  • 已安装并配置kubectl命令行工具,用于与Kubernetes集群交互

6.5.1.2.2. Docker镜像仓库
  • 项目方准备一个公网可访问的Docker镜像仓库,用于存储“DID APP后台”微服务的镜像。在后续运行部署流程时会自动拉取。

  • 如果Kubernetes所在环境无法访问互联网,需要手动载入Docker镜像到Kubernetes的Worker节点。载入命令在物料包中,执行以下流程:

docker pull hub-dev.cnbn.org.cn/opennet/did-app-backend:v1.1.0
docker save did-app-backend-v1.1.0.tar hub-dev.cnbn.org.cn/opennet/did-app-backend:v1.1.0
# 上传文件 did-app-backend-v1.1.0.tar 到服务器
docker load -i did-app-backend-v1.1.0.tar

6.5.1.3. 部署流程

  • 下载部署仓库: https://git.chainweaver.org.cn/chainweaver/did/did-app-backend

  • 在下载的仓库的k8s目录下,即是k8s的部署did-app-backend-deployment.yaml,该文件是服务的部署文件,也是did-app-backend-configmap配置文件

【注意:DID APP后台服务在启动时会自动连接数据库并创建对应的表,在配置数据库连接字符串时,请确保数据库已经创建,而且账号具有在该数据库中创建表的DDL权限】

6.5.1.3.1. 根据实际需要修改ConfigMap

在实际项目使用中可能会存在测试环境、预生产环境、生产环境等多套环境,请根据实际环境的需求调整ConfigMap中的参数,如复制份数、日志输出等。

6.5.1.3.2. 修改did-app-backend-configmap

修改did-app-backend-deployment.yaml中的ConfigMap配置(以下是一些关键的配置描述):

  • mysql:改为实际的数据库的服务配置

  mysql:
      #数据库类型 mysql、kingbase
      db_type: "mysql"
      #数据库服务登录信息
      dsn: root:passw0rd@tcp(192.168.1.35:3311)/did_app?charset=utf8&parseTime=True&loc=Local
      max_idle_conns: 10
      max_open_conns: 100
      time_out: 20
  • email_auth_code:改为实际发邮件的服务配置

  email_auth_code:
      #邮箱服务配置
      host: "xxx"
      #邮箱服务端口
      port: 11465
      #邮箱服务账号
      username: "xxx"
      #邮箱服务密码
      passwd: "xxx"
      #邮箱服务发件人
      from: "xxx"
      #邮箱验证码有效期
      expiration_time: 300
      #邮箱验证码发送间隔
      send_time: 60
      #邮箱验证码长度
      size: 6
  • auth_code:改为实际下发短信的服务配置

  # 腾讯云下发短信信息
    auth_code:
      # 腾讯云短信服务配置,一般是sms.tencentcloudapi.com
      domain: xxx
      # 腾讯云短信服务代理地址,如果是内网无法连接互联网,可以设置代理地址
      proxy: ""
      # 腾讯云短信服务密钥id
      secret_id: xxx
      # 腾讯云短信服务密钥
      secret_key: xxx
      # 短信验证码有效期
      expiration_time: 300
      # 短信验证码发送间隔
      send_time: 60
      # 短信验证码长度
      size: 6
      # 短信模板(腾讯云短信服务申请的模版)
      template:
        # 通用模板您正在操作xxx,验证码为: {1},请于5分钟内填写,如非本人操作,请忽略本短信。
        default: xxx
        # 邀请码短信:
        #您的同事(手机号:{1})已在「xxx平台」创建了企业账号,并将您设置为{2},请登录账号,选择「认领新的管理员身份」。 登录手机号:{3} 登录密码 :{4}
        invitation: xxx
      # 腾讯云短信服务appid
      app_id: xxx
      # 短信发送者(可配置成如xxx平台)
      sign_name: xxx
  • RedisConf:改为实际缓存数据库的服务配置

  RedisConf:
    # redis模式,如node、cluster
    Type: node
    # redis地址
    Host: 192.168.3.170:16379
    # redis密码
    Pass: passw0rd
  • did:改为实际did-admin服务地址

# did-admin服务配置
did:
  # did-admin核心服务地址
  urlAddr: http://did-admin-service:17781
  • auth_service:电子营业执照调用参数配置

  auth_service:
      # 是否开启mock.
      # false: 真实调用
      # true: mock调用,使用模拟数据进行实名认证
      mock: true
      # 电子营业执照服务地址
      url: xxx
      # 如果是内网无法连接互联网,可以设置代理地址
      proxy: ""
      # 电子营业执照服务sys code
      sys_code: xxx
      # 电子营业执照服务auth code
      auth_code: xxx
      # 暂时不需要,任意配置即可
      sign: xxx
      # 版本,目前配置为1
      version: 1
6.5.1.3.3. 部署到Kubernetes集群
  • 使用kubectl apply命令部署资源定义文件到Kubernetes集群:

  kubectl apply -f did-app-backend-deployment.yaml
6.5.1.3.4. 验证部署检查Pod状态,确保DID APP后台微服务已成功启动并运行
  • 利用kubectl get 命令查看服务是否启动

  kubectl get pod -n did| grep did-app

返回结果如下,1/1则表示微服务有一个实例,启动成功1个pod实例,如果是2/2则表示有两个实例,启动成功了2个pod实例:

  did-app-XXXXX-XXX      1/1     Running   0               1d

检查Service和Ingress资源配置,保外部访问路径和端口正确:

kubectl get svc,ing -n did| grep did-app
  • 利用health接口验证是否部署成功(ip为k8s work的地址,host为端口号)

curl -X GET https://ip:host/api/v1/did-app/health

返回结果如下,表示部署成功:

{"code":200000,"msg":"操作成功","data":{"version":"v1.0.0","app_chinese_name":"航运贸易app","didIssuer":"did:cndid:cndid","personAuthEnable":false,"downloadLink":"https://zxchain-wallet-1258344699.cos.ap11.apk"}}

6.6. APP应用编译

6.6.1. 简介

航运贸易APP是一款使用flutter构建的移动端APP,在运行源码前需要安装并下载flutter相关SDK。

flutter 开发文档:https://docs.flutter.dev/

6.6.2. 准备工作

  • 按照官方文档提示安装flutter并完成相关设置。

  • 由于本app目前仅支持Android,所以可以忽略IOS相关配置。

  • 推荐使用VSCode编辑器,需安装flutter和dart相关插件。

6.6.3. SDK版本要求

SDK 版本号
Flutter SDK >= 3.22.2+
Dart SDK 3.3.0+ 4.0.0-
Android SDK 34.0.0+

以上版本供参考,可根据官方文档提示适当升级。

6.6.4. 源码下载和运行

  • 源码地址:https://git.chainweaver.org.cn/chainweaver/did/did-app-front 。

  • 源码下载完成后可用VSCode打开。

  • 运行以下命令安装依赖:

 flutter pub get
  • 点击VSCode左侧【运行和调试】按钮启动项目。

6.6.5. 修改配置文件

  • 配置文件地址:lib/utils/const/const.dart;

  • 配置解释:

 static String env = 'dev'; //修改此处env变量,改变app运行环境
  static dynamic byEnv({dynamic dev, dynamic preview, dynamic production}) {
    return env == 'dev' ? dev : (env == 'preview' ? preview : production);
  }

  //设置服务地址
  //app的后端服务
  static String didAppBaseUrl = byEnv(
      dev: "http://dev.com", //开发环境
      preview: 'https://preview.cn', //预览环境
      production:
          'https://production.cn' //生产环境
      );
  //存证后端服务
  static String didAuthAppBaseUrl = byEnv(
      //存证2的公共存证的测试环境的访问方式
      dev: "http://192.168.1.135:8280",
      preview: 'https://tdh-api-pre.cnbn.org.cn',
      production: 'https://tdh-api.cnbn.org.cn:19981');

6.6.6. 准备证书

  • 准备有效的Android证书

  • 使用debug启动模式(即直接使用VSCode进行编译)可以不用证书,注释下方代码中debug配置即可,配置文件地址: android/app/build.gradle

    signingConfigs{
        release { //配置证书
            storeFile file("cdid.android.keystore")
            storePassword "chainmaker"
            keyPassword "chainmaker"
            keyAlias "cdid"
        }

    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            proguardFiles '../proguard-rules.pro'
            shrinkResources true
        }
        //没有证书,运行debug模式删除此配置即可
        debug {
            signingConfig signingConfigs.release
        }
    }

6.6.7. 编译和安装

  • 编译:在根目录下执行以下命令:

flutter build apk --obfuscate --split-debug-info=./split_debug_info.
  • 编译完成后,在/build/app/outputs/flutter-apk目录下会生成名为app-release.apk的文件。

  • 安装:安装此apk。

6.6.8. 调试模式

  • 启动调试模式:app安装完成后打开,在开屏页多次点击【欢迎使用】文字,进入项目后,浮动展示bug图标,表示进入了调试模式。

  • 点击bug图标可以查看当前的请求及错误日志等信息。