# DID-核心服务部署文档
DID核心服务主要包含三个服务DID服务(did),DID-ADMIN服务(did-admin),DID OpenApi服务(did-gateway)。
DID服务主要实现DID核心逻辑提供gRPC接口;
DID-ADMIN服务主要实现管理员DID相关业务逻辑包含DID核心逻辑;
DID OpenApi服务主要实现转发、代理相关请求和权限管理。
## DID服务(did)
### 软件环境准备
| 软件        | 版本           | 描述           |
| ----------- | -------------- | -------------- |
| k8s         | v1.18+         | 基于docker容器 |
| kubectl工具 | 与k8s集群匹配  |                |
| redis       | 7.2+           |                |
| 人大金仓    | KingbaseES V8+ | 兼容mysql      |
### 安装物料
| 软件                           | 描述                                                         |
| ------------------------------ | ------------------------------------------------------------ |
| did/opennet\_did\_v0\_1.tar.gz | did镜像                                                      |
| did/etc                        | did配置文件etc
├── crypto-config│
   ├── client1.key│
   └── client1.pem
├── did.yaml
├── sdk\_config\_pk.yml
└── templates
   ├── 100000.json
   ├── 100001.json
   ├── 100002.json
   └── 100003.json其中crypto-config为区块链管理员证书(由运维人员配置自己的证书) |
| did/did.7z                     | 合约文件                                                     |
| did/deployment.yaml            | k8s配置文件                                                  |
 
### 配置namespace
配置namespace.yaml
```yaml
apiVersion: v1
kind: Namespace
metadata:
  name: did
```
### 配置did.yaml
需根据自身需要修改etc/did.yaml,如下所示:
隐私数据加密相关操作步骤参考:附录9.1
配置签发机构的信息:
```yaml
...
# 配置签发机构的信息
Admin:
  # 签发机构DID
  DID: did:cndid:cndid
  # 密钥对,必须是国密
  Crypto:
    # 配置秘钥列表维护原则(如果违背可能会导致一系列问题)
    # 1. 秘钥对只能添加不能删除、修改
    # 2. 不可以修改秘钥顺序
    - # Signer 签名公钥 可以修改,列表中只能有一个为true
      Signer: true
      # PublicKey 公钥
      PublicKey: "etc/crypto-config/client1.pem"
      # PrivateKey 私钥
      PrivateKey: "etc/crypto-config/client1.key"
  # 对外暴露的地址
  Service:
    - "http://192.168.1.181:30002/api/v1"
```
数据库配置:
```yaml
...
#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
Type: mysql # kingbase,mysql
...
```
Redis缓存配置:
```yaml
...
# 缓存配置
RedisConf:
  Host: 127.0.0.1:6379
  Pass: passw0rd
  
...
```
### 将镜像载入k8s的work节点
项目方准备一个公网可访问的Docker镜像仓库,用于存储DID微服务的镜像。在后续运行部署流程时会自动拉取,如果Kubernetes所在环境无法访问互联网,需要手动载入Docker镜像到Kubernetes的Worker节点。镜像物料包中,执行:
```shell
# 手动载入Docker镜像,找个能连hub-dev.cnbn.org.cn的服务器
docker pull hub-dev.cnbn.org.cn/opennet/did:v1.1.0
docker save did-app-backend-v1.1.0.tar hub-dev.cnbn.org.cn/opennet/did:v1.1.0
# 上传文件 did-app-backend-v1.1.0.tar 到服务器
docker load -i did:v1.1.0.tar
```
### 部署步骤
#### 部署到Kubernetes集群
使用\`kubectl create\` 命令创建挂载的map文件:
```shell
cd did
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-templates --from-file=./etc/templates --dry-run=client -o yaml > did-configmap-templates.yaml --insecure-skip-tls-verify
```
使用\`kubectl apply\` 命令应用map文件: 
```shell
kubectl apply -f did-configmap-yml.yaml --insecure-skip-tls-verify
kubectl apply -f did-configmap-cnbn-key.yaml --insecure-skip-tls-verify
```
使用\`kubectl apply\` 命令部署资源定义文件到Kubernetes集群:
```shell
kubectl apply --force --record -f deployment.yaml --insecure-skip-tls-verify
```
#### 验证部署检查Pod状态,确保DID服务已成功启动并运行
利用\`kubectl get\` 命令查看服务是否启动
```shell
kubectl get pod  -n did | grep did
```
返回结果如下,1/1则表示微服务有一个实例,启动成功1个pod实例,如果是2/2则表示有两个实例,启动成功了2个pod实例。
```shell
didXXXXX-XXX      1/1     Running   0               1d
```
检查Service和Ingress资源配置,保外部访问路径和端口正确:
```shell
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
```
#### 拷贝document(链上已有合约忽略此步骤)
执行SQL语句,查询\`id = 'did:cndid:cndid'\` 的document内容:
```sql
SELECT document FROM did WHERE id = 'did:cndid:cndid';
```
#### 部署合约 did.7z(链上已有合约忽略此步骤)
cmc可以从[https://git.chainmaker.org.cn/chainmaker/chainmaker-go/-/releases/v2.3.3](https://git.chainmaker.org.cn/chainmaker/chainmaker-go/-/releases/v2.3.3)中获得。
在XXX处替换为1.1.5.3中拷贝的document,contract-name要与did.yaml中ContractName一致:
```
./cmc client contract user create --contract-name=DIDhy --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":"XXX"}'
```
## DID-ADMIN服务(did-admin)
### 软件环境准备
| 软件        | 版本          | 描述           |
| ----------- | ------------- | -------------- |
| k8s         | v1.18+        | 基于docker容器 |
| kubectl工具 | 与k8s集群匹配 |                |
### 安装物料
| 软件                                     | 描述                                    |
| ---------------------------------------- | --------------------------------------- |
| did-admin/opennet\_did-admin\_v0\_1.tar.gz | did-admin镜像                            |
| did-admin/etc                             | did-admin配置文件etc
└── did-admin.yaml |
| did-admin/deployment.yaml                 | k8s配置文件                             |
### 配置
#### 配置did-admin.yaml
需根据自身需要修改etc/did-admin.yaml,如下所示:
DID服务地址
```
...
# did服务地址
GrpcTarget: did-service:17787
...
```
### 将镜像载入k8s的work节点
项目方准备一个公网可访问的Docker镜像仓库,用于存储did-admin微服务的镜像。在后续运行部署流程时会自动拉取,如果Kubernetes所在环境无法访问互联网,需要手动载入Docker镜像到Kubernetes的Worker节点。镜像物料包中,执行:
```
# 手动载入Docker镜像,找个能连hub-dev.cnbn.org.cn的服务器
docker pull hub-dev.cnbn.org.cn/opennet/did-admin:v1.1.0
docker save did-admin:v1.1.0.tar hub-dev.cnbn.org.cn/opennet/did-admin:v1.1.0
# 上传文件 did-admin:v1.1.0.tar 到服务器
docker load -i did-admin:v1.1.0.tar
```
### 部署步骤
#### 进入到目录
```
cd did-admin
```
#### 部署到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 -f did-admin-configmap-yml.yaml --insecure-skip-tls-verify
```
使用\`kubectl apply\` 命令部署资源定义文件到Kubernetes集群:
```
kubectl apply --force -f deployment.yaml --insecure-skip-tls-verify
```
#### 验证部署检查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"}
```
## DID OpenApi服务(did-gateway)
### 软件环境准备
| 软件        | 版本          | 描述           |
| ----------- | ------------- | -------------- |
| k8s         | v1.18+        | 基于docker容器 |
| kubectl工具 | 与k8s集群匹配 |                |
### 安装物料
| 软件                                           | 描述                                                                                                                                         |
| ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| did-gateway/opennet\_did-gateway\_v0\_1.tar.gz | did-gateway镜像                                                                                                                              |
| did-gateway/etc                                | did-gateway配置文件etc├── did-gateway.yaml└── tls├── server.crt├── server.csr└── server.key其中tls中为https协议的CA证书和密钥 |
| did-gateway/deployment.yaml                    | k8s配置文件                                                                                                                                  |
### 配置
#### 配置did-gateway.yaml
需根据自身需要修改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
...
```
### 3.4 将镜像载入k8s的work节点
项目方准备一个公网可访问的Docker镜像仓库,用于存储DID OpenApi微服务的镜像。在后续运行部署流程时会自动拉取,如果Kubernetes所在环境无法访问互联网,需要手动载入Docker镜像到Kubernetes的Worker节点。镜像物料包中,执行:
```
# 手动载入Docker镜像,找个能连hub-dev.cnbn.org.cn的服务器
docker pull hub-dev.cnbn.org.cn/opennet/did-gateway:v1.1.0
docker save did-gateway:v1.1.0.tar hub-dev.cnbn.org.cn/opennet/did-gateway:v1.1.0
# 上传文件 did-gateway:v1.1.0.tar 到服务器
docker load -i did-gateway:v1.1.0.tar
```
### 部署步骤
#### 进入到目录
```
cd did-gateway
```
#### 部署到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 -f did-gateway-configmap-yml.yaml --insecure-skip-tls-verify
kubectl apply -f did-gateway-configmap-tls-key.yaml --insecure-skip-tls-verify
```
使用\`kubectl apply\` 命令部署资源定义文件到Kubernetes集群:
```
kubectl apply --force --record -f deployment.yaml --insecure-skip-tls-verify
```
#### 验证部署检查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"}
```