# 数据产品登记与认证安装部署
## 概述
数据要素流通平台基于k3s环境部署,提供了一键部署脚本和yaml文件,用户可以根据自己的需求,选择部署对应的服务,
可根据实际情况调整适配yaml文件。
## 环境依赖
### 硬件要求
| 配置 | 最低配置 | 推荐配置 |
| ---- | -------- | -------- |
| CPU | 1.5GHz | 2.4GHz |
| 内存 | 16GB | 64GB |
| 核心 | 8核 | 16核 |
| 带宽 | 20Mb | 40Mb |
### 软件依赖
| 名称 | 版本 | 描述 | 是否必须 |
| -------------- | -------- | ---------------------------------------------------- | -------- |
| docker | 24+ | 运行核心组件及服务 | 是 |
| docker-compose | v2.24.6+ | 本地部署长安链服务 | 否 |
| k3s | v1.28.2+ | 与 Kubernetes 集群进行交互和管理,管理核心组件及服务 | 是 |
| helm | v3.14.0+ | 管理 Kubernetes 应用部署的包,管理服务任务 | 是 |
## 基础环境安装
### 安装docker
参考官网:https://docs.docker.com/engine/install/
安装完成后,执行以下命令进行验证:
```shell
➜ ~ docker version
Client:
Version: 24.0.6-rd
API version: 1.43
Go version: go1.20.7
Git commit: da4c87c
Built: Wed Sep 6 16:39:20 2023
OS/Arch: darwin/amd64
Context: desktop-linux
Server: Docker Desktop 4.27.1 (136059)
Engine:
Version: 25.0.2
API version: 1.44 (minimum version 1.24)
Go version: go1.21.6
Git commit: fce6e0c
Built: Thu Feb 1 00:23:17 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.28
GitCommit: ae07eda36dd25f8a1b98dfbf587313b99c0190bb
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0
```
[//]: # (### 2.2 docker registry部署)
### k3s集群部署
> 注:安装K3S前需要先完成Docker安装
#### 使用脚本安装
下面以 `Linux`为例进行安装,
使用K3S安装脚本进行安装,具体步骤如下:
```shell
#1. 下载K3S安装脚本和依赖包
➜ ~ wget -c "https://get.k3s.io" -O install.sh
➜ ~ wget -c "https://github.com/k3s-io/k3s/releases/download/v1.28.2%2Bk3s1/k3s"
➜ ~ wget -c "https://github.com/k3s-io/k3s/releases/download/v1.28.2%2Bk3s1/k3s-airgap-images-amd64.tar.gz"
➜ ~ wget -c "https://github.com/k3s-io/k3s/releases/download/v1.28.2%2Bk3s1/k3s-images.txt"
➜ ~ wget -c "https://github.com/k3s-io/k3s/releases/download/v1.28.2%2Bk3s1/sha256sum-amd64.txt"
# 2. 设置K3S配置文件
➜ ~ mkdir -p /etc/rancher/k3s/
➜ ~ tee /etc/rancher/k3s/config.yaml <<-'EOF'
docker: true
tls-san: k3s.domain.com
service-node-port-range: 30000-40000
kubelet-arg: system-reserved=cpu=500m,memory=512Mi,ephemeral-storage=1024Mi,pid=100
kubelet-arg: kube-reserved=cpu=500m,memory=512Mi,ephemeral-storage=1024Mi,pid=100
kubelet-arg: eviction-hard=memory.available<1024Mi,nodefs.available<10%,imagefs.available<10%
kubelet-arg: eviction-minimum-reclaim=memory.available=500Mi,nodefs.available=500Mi,imagefs.available=500Mi
EOF
# 3. 导入K3S镜像,并执行安装脚本
➜ ~ docker load -i k3s-airgap-images-amd64.tar.gz
➜ ~ cp -f k3s /usr/local/bin/
➜ ~ chmod 700 /usr/local/bin/k3s
➜ ~ chmod 700 install.sh
➜ ~ INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh
```
安装完成后,执行以下命令进行验证:
```shell
➜ ~ k3s -v
k3s version v1.21.4+k3s- ()
go version go1.16.6
➜ ~ kubectl get ns
NAME STATUS AGE
default Active 420d
kube-system Active 420d
kube-public Active 420d
```
#### 使用Rancher-Desktop安装
除命令行安装k3s外,还可使用Rancher Desktop工具进行可视化安装。
Rancher Desktop官网为:https://rancherdesktop.io/
安装步骤:https://docs.rancherdesktop.io/getting-started/installation/#linux
### helm安装
Helm是Kubernetes的包管理工具,可以方便的在Kubernetes集群中部署应用。
Helm安装官网:https://helm.sh/docs/intro/install/
安装Rancher后,默认会安装helm,如果未安装可以通过脚本单独安装,步骤如下:
```shell
➜ ~ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
➜ ~ chmod 700 get_helm.sh
➜ ~ ./get_helm.sh
```
安装完成后,使用以下命令进行验证:
```shell
➜ ~ helm version
version.BuildInfo{Version:"v3.13.1", GitCommit:"3547a4b5bf5edb5478ce352e18858d8a552a4110", GitTreeState:"clean", GoVersion:"go1.20.8"}
```
## 数据要素流通平台部署
### 获取部署脚本
```shell
# 1. 获取数据要素流通平台部署脚本
➜ ~ git clone https://git.chainweaver.org.cn/chainweaver/ida/ida-deployment.git
# 2. 切换到v2.0.0 tag
➜ ~ git checkout v2.0.0
```
### 部署长安链和智能合约
#### 部署长安链
数据要素流通平台依赖长安链(需要启用docker go VM),需要先部署长安链。如果已经部署长安链,可以跳过该步骤。
- 长安链提供了多种部署方式, 可以参考官方部署文档,如: [通过Docker部署链][通过Docker部署链]
#### 安装智能合约
数据要素流通平台智能合约包括数据产品登记合约:
- 数据产品登记合约: `ida`合约
智能合约的部署方式与链的管理方式有关,一般有两种方式:
- 通过管控台管理的链:合约可以通过管控台直接部署或升级
- 无管控台管理的链:合约需要通过命令行部署或升级
> 注:多个参与方分别部署数据要素流通平台时,一条链上合约也仅需部署一次,无需每个参与方分别部署。
下面以命令行部署为例:
```shell
## 1. 使用ida-deployment进行合约部署
```shell
# 1. 进入合约部署目录
➜ cd ida-deployment/contract
# 2. 查看合约压缩包和部署脚本
➜ tree -L 2
.
├── contracts # mira和ida合约文件
│ ├── contract_ida.7z
├── crypto-config # 长安链用户证书,需要根据实际情况进行替换(下面为cert模式链的证书列表)
│ ├── wx-org1.chainmaker.org
│ ├── wx-org2.chainmaker.org
│ ├── wx-org3.chainmaker.org
│ └── wx-org4.chainmaker.org
├── deploy.sh # 部署合约脚本
├── scripts # 部署合约脚本、配置文件(支持cert模式和pk模式)
│ ├── cmc
│ ├── create_contract.sh
│ ├── create_contract_pk.sh
│ ├── sdk_config.yml
│ ├── sdk_config_pk.yml
│ ├── upgrade_contract.sh
│ └── upgrade_contract_pk.sh
└── upgrade.sh # 升级合约脚本
# 3. 执行脚本部署智能合约
# 支持cert模式和pk模式, 以cert模式为例
➜ ./deploy.sh cert
# 如果是升级合约,执行upgrade.sh脚本。
# 支持cert模式和pk模式, 同时支持升级ida合约
# 以升级ida合约为例:
# ida:v2.0.0表示ida合约升级到v2.0.0版本
➜ ./upgrade.sh cert ida:v2.0.0 mira:v1.1.0
```
### 部署公共服务和ida组件
ida-deployment提供了公共服务和ida组件的部署脚本,用户可以根据实际情况进行部署,默认使用版本为`v2.0.0`
#### 初始化环境
- 切换到helm目录
helm目录默认数据库是mysql;
如果需要使用kingbase数据,需要切换到helm_kingbase目录
当前采用的KingbaseES_V008R006C008B0014版本,推荐用户部署时采用官方最新版本,可自行在部署脚本中修改
```shell
cd ida-deployment/helm
```
- 创建namespace, "public"和"ida" 服务
```shell
kubectl create ns public
kubectl create ns ida
```
- 创建数据放置的文件夹,这里示例中,数据放置在数据放置服务器上的(这里是k8s-node1节点):: /mnt/data,需要提前创建
- **文件夹要在服务部署的k8s/k3s的节点机器上创建**
public目录
```shell
mkdir -p /mnt/data/public/mysql # mysql 数据存储路径, 如果采用kingbase数据库,这里mysql修改为kingbase,其中的"public"为上一步创建的namespace
mkdir -p /mnt/data/public/redis # redis 数据存储路径, 其中的"public"为上一步创建的namespace
mkdir -p /mnt/data/public/key/logs # key 日志存储路径, 其中的"public"为上一步创建的namespace
mkdir -p /mnt/data/public/chain/logs # chain 日志存储路径, 其中的"public"为上一步创建的namespace
```
ida目录
```shell
mkdir -p /mnt/data/ida/certification/logs # certification 日志存储路径, 其中的"ida"为上一步创建的namespace
mkdir -p /mnt/data/ida/registration/logs # registration 日志存储路径, 其中的"ida"为上一步创建的namespace
mkdir -p /mnt/data/ida/gateway/logs # gateway 日志存储路径, 其中的"ida"为上一步创建的namespace
mkdir -p /mnt/data/ida/circulation/logs # circulation 日志存储路径, 其中的"ida"为上一步创建的namespace
```
#### 启动服务
- 启动public 服务, 自定义的配置如mysql password等可在public/values.yaml中修改
- 节点名称查询,其中NAME列是节点名称
```shell
$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
k8s-master Ready control-plane 246d v1.28.2 192.168.1.181 CentOS Linux 7 (Core) 3.10.0-1160.119.1.el7.x86_64 containerd://1.6.33
k8s-node1 Ready 222d v1.26.9 192.168.1.182 CentOS Linux 7 (Core) 3.10.0-1160.105.1.el7.x86_64 containerd://1.6.27
```
命令解析
```shell
helm install public ./public helm安装public服务,并且配置目录在./public
--namespace public 设置namespace
--set global.contract.name=ida 设置配置文件中的合约名称变量
--set 'global.nodeAffinity.values[0]=k8s-node1' 设置配置文件中的节点名称
--set global.dataPath=/mnt/data 设置配置文件中的数据目录
```
命令执行
```shell
helm install public ./public --namespace public --set global.contract.name=ida --set 'global.nodeAffinity.values[0]=k8s-node1' --set global.dataPath=/mnt/data
```
- 启动ida 服务, 自定义的配置如mysql password等可在public/values.yaml中修改
命令解析
```shell
helm install ida ./ida --namespace ida helm安装ida服务,并且配置目录在./ida
--set global.publicNameSpace=public 指定public的namespace,这里前面的示例为 public
--set global.contract.name=ida 指定合约名称,这里示例为 ida
--set 'global.nodeAffinity.values[0]=k8s-node1' 指定数据希望放置的K8S节点名称,这里示例为 k8s-node1
--set global.dataPath=/mnt/data 指定数据存储路径,这里示例为 /mnt/data
--set global.circulation.nodePort=31090 指定 circulation 服务的nodePort,这里示例为 31090
```
命令执行
```shell
helm install ida ./ida --namespace ida --set global.publicNameSpace=public --set global.contract.name=ida --set 'global.nodeAffinity.values[0]=k8s-node1' --set global.dataPath=/mnt/data --set global.circulation.nodePort=31090
```
#### 查看服务状态
```shell
kubectl get pods -n public
kubectl get pods -n ida
```
- 本地生成yaml文件,方便调试
```shell
# 生成public yaml文件
helm template public ./public --namespace public --set global.contract.name=ida --set 'global.nodeAffinity.values[0]=k8s-node1' --set global.dataPath=/mnt/data > ../output_public.yaml
# 生成ida yaml文件
helm template ida ./ida --namespace ida \
--set global.publicNameSpace=public \
--set global.contract.name=ida \
--set 'global.nodeAffinity.values[0]=k8s-node1' \
--set global.dataPath=/mnt/data \
--set global.circulation.nodePort=31090 > ../output_ida.yaml
```
#### 卸载服务
```shell
# 卸载 public
helm uninstall public --namespace public
# 卸载 ida
helm uninstall ida --namespace ida
# 删除namespace
kubectl delete ns public
kubectl delete ns ida
# 删除数据
rm -rf /mnt/data/public
rm -rf /mnt/data/ida
```
#### 服务验证
安装完成后,执行以下命令进行验证:
```shell
# 查看public命名空间下的pod,如果以下服务正常运行,说明公共服务组件部署成功
➜ ~ kubectl get pod -n public
NAME READY STATUS RESTARTS AGE
mysql-8c648b66b-4clz5 1/1 Running 0 3m18s
redis-797cf49c8c-wkgvw 1/1 Running 0 3m18s
key-ff87f646f-288qc 1/1 Running 0 3m18s
chain-f5f7f896c-2b2nl 1/1 Running 0 3m18s
# 查看ida命名空间下的pod,如果以下服务正常运行,说明ida组件部署成功
➜ ~ kubectl get pod -n ida
NAME READY STATUS RESTARTS AGE
circulation-6c6cffffcc-nvkdl 1/1 Running 0 3m19s
gateway-6bd8cf8c9b-7gwsb 1/1 Running 0 3m19s
certification-64d8885b57-8c9qj 1/1 Running 0 3m19s
registration-6db56bccc5-bxrp7 1/1 Running 0 3m19s
```
## 服务列表
必选组件安装成功后,集群中会部署以下服务或组件:
| 服务/组件名称 | 说明 | 命名空间 | 部署类型 | Docker镜像名称 | K8S Service名称 | dataPath / logPath |
|:--------------------:|:--------------:|:------:|:----------:|:--------------------:|:-----------------------:|:----------------------------------:|
| mysql | 公共服务-存储 | public | Deployment | mysql | mysql | /mnt/data/public/mysql (mysql存储目录) |
| redis | 公共服务-缓存 | public | Deployment | redis | redis | /mnt/data/public/redis (redis存储目录) |
| key | 公共服务-链密钥管理 | public | Deployment | public-key | key | /mnt/data/public/key/logs |
| chain | 公共服务-链服务 | public | Deployment | public-chain | chain | /mnt/data/public/chain/logs |
| certification | IDA-数据产品认证服务 | ida | Deployment | ida-certification | certification | /mnt/data/ida/certification/logs |
| registration | IDA-数据产品登记服务 | ida | Deployment | ida-registration | registration | /mnt/data/ida/registration/logs |
| gateway | IDA-网关 | ida | Deployment | ida-gateway | gateway | /mnt/data/ida/gateway/logs |
| circulation | IDA-数据要素流通平台前端 | ida | Deployment | ida-circulation | circulation | /mnt/data/ida/circulation/logs |
## 部署验证
部署完成后,可以通过前端页面**登录模块-用户列表-区块链配置-合约配置-链账户配置-平台配置**全流程进行验证。
详细步骤请参考,文档中**3.4. 产品使用说明-公共模块**: [用户使用手册链接](./02_用户使用说明.md)
[通过Docker部署链]: https://docs.chainmaker.org.cn/v3.0.0/html/instructions/%E5%90%AF%E5%8A%A8%E6%94%AF%E6%8C%81Docker_VM%E7%9A%84%E9%93%BE.html
[数据要素登记服务部署脚本]: https://git.chainweaver.org.cn/ChainWeaver/ida/gateway
[可信计算服务部署脚本]: https://git.chainweaver.org.cn/ChainWeaver/mira/mira-deployment
[用户证书]: https://docs.chainmaker.org.cn/v3.0.0/html/instructions/%E5%90%AF%E5%8A%A8%E6%94%AF%E6%8C%81Docker_VM%E7%9A%84%E9%93%BE.html#id11
[用户登录]: https://chainweaver.org.cn/dataCirculation/02_%E7%94%A8%E6%88%B7%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.html#id11
[配置链账户]: https://chainweaver.org.cn/dataCirculation/02_%E7%94%A8%E6%88%B7%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.html#id28