# 基本架构和特性

从前面的讲解中可以看到，区块链服务平台能够有效加速对区块链技术的应用，解决企业和开发者进行手动运营管理的负担。但是这些方案都是商业用途，并且只能在线使用。

![Cello 典型应用场景](/files/-M5y-T8GEpB6iVbeYiR5)

超级账本的 Cello 项目为本地搭建区块链服务管理平台提供了开源的解决方案，可以实现在多种类型的物理资源上实现区块链网络的生命周期管理。

正如 Cello 的名字所蕴意，它就像一把精巧的大提琴，以区块链为琴弦，可以奏出更加动人的乐章。

## 基本架构和特性

Cello 项目由笔者领导的 IBM 技术团队于 2017 年 1 月贡献到超级账本社区，主要基于 Python 和 Javascript 语言编写。该项目的定位为区块链管理平台，支持部署、运行时管理和数据分析等功能，可以实现一套完整的 BaaS 系统的快速搭建。其基本架构如下图所示。

![Cello 基本架构](/files/-M5y-T8JSXgdR3nssQsq)

在实现区块链环境快速部署的同时，Cello 也提供了不少对区块链平台进行运行时管理的特性，这些特性总结如下。

* 管理区块链的全生命周期，包括创建、配置、使用、健康检查、删除等。
* 支持多种基础架构作为底层资源池，包括裸机、虚拟机、容器云（Docker、Swarm、Kubernetes）等。
* 支持多种区块链平台及自定义配置（目前以支持超级账本 Fabric 为主）。
* 支持监控和分析功能，实现对区块链网络和智能合约的运行状况分析。
* 提供可插拔的框架设计，包括区块链平台、资源调度、监控、驱动代理等都很容易引入第三方实现。

下面具体介绍如何以 Docker 主机为资源池，用 Cello 快速搭建一个区块链服务平台。

## 环境准备

Cello 采用了典型的主从（Master-Worker）架构。用户可以自行准备一个 Master 物理节点和若干个 Worker 节点。

其中，Master 节点负责管理（例如，创建和删除）Worker 节点中的区块链集群，其通过 8080 端口对外提供网页 Dashboard，通过 80 端口对外提供 RESTful API。Worker 节点负责提供区块链集群的物理资源，例如基于 Docker 主机或 Swarm 的方式启动多个集群，作为提供给用户可选的多个区块链网络环境。

下图中展示了一个典型的 Master-Worker 部署拓扑。每个节点默认为 Linux（如 Ubuntu 22.04）服务器或虚拟机。

![Cello 部署拓扑示例](/files/-M5y-T8KSzPzSr_S6HuL)

为了支持区块链网络，Worker 和 Master 节点需要配备足够的物理资源。例如，如果希望在一个 Worker 节点上能够启动至少 10 个区块链集群，则建议节点配置至少为 8 CPU、16G 内存、100G 硬盘容量。

## 下载 Cello 源码

Cello 代码的官方仓库在 Github 上，读者可以获取代码。例如通过如下命令从官方仓库下载 Cello 源码。

```sh
$ git clone https://github.com/hyperledger-cello/cello.git && cd cello
```

## 配置 Worker 节点

### 安装和配置 Docker 服务

首先安装 Docker，推荐使用 1.12 或者更新的版本。可通过如下命令快速安装 Docker。

```sh
$ curl -fsSL https://get.docker.com/ | sh
```

安装成功后，不要把 Docker daemon 以未加密方式暴露到所有网络地址的 2375 端口。Docker API 等价于主机 root 权限，生产或联网环境应优先使用 SSH Docker context；确需远程 API 时，应使用 TLS 认证的 2376 端口并限制来源地址。

```sh
$ docker context create cello-worker --docker "host=ssh://cello@worker.example.com"
$ docker --context cello-worker ps
```

如果历史 Cello 组件只能填写 Daemon URL，可让 Worker 仅在本机回环地址监听，再通过 SSH 隧道或内网代理映射，避免公网监听：

```sh
$ ssh -L 127.0.0.1:2375:127.0.0.1:2375 cello@worker.example.com
```

### 下载 Docker 镜像

对于超级账本 Fabric v1.0 集群所需的镜像，可以使用如下命令进行自动下载。

```sh
$ cd scripts/worker_node_setup && bash download_images.sh
```

### 防火墙配置

为了确保 Worker 上的容器可以正常访问，通过如下命令确保主机开启 IP 转发。

```sh
$ sysctl -w net.ipv4.ip_forward=1
```

同时检查主机的 iptables 设置，确保必要的 Fabric 业务端口被打开（如 7050\~10000 等）。不要向公网开放未认证的 `2375` 端口；如必须使用远程 Docker API，应使用 TLS 认证的 `2376` 并限制安全组来源。

## 配置 Master 节点

### 准备环境与启动服务

首先确保安装了 Docker Compose V2。然后可以通过如下命令对 Master 节点进行配置，包括设置本地存储路径和启动服务。

```sh
$ export CELLO_STORAGE_PATH=$(pwd)/cello
$ make local
```

如果希望自行构建 Cello 所需的 Docker 镜像，可运行：

```sh
$ make docker
```

随后通过运行如下命令来启动 Cello 相关的组件服务，包括 `cello-agent-docker`、`postgres`、`cello-api-engine` 和 `cello-dashboard`。

```sh
$ make start
```

如果启动过程没有提示出现问题，则说明当前环境满足了运行条件。如果出现问题，可通过查看日志信息进行定位。可以在终端看到类似以下的容器输出，说明服务启动成功：

```sh
CONTAINER ID   IMAGE                            COMMAND                  CREATED         STATUS         PORTS                                                                                  NAMES
81e6459965ec   hyperledger/cello-agent-docker   "gunicorn server:app…"   4 seconds ago   Up 2 seconds   127.0.0.1:5001->5001/tcp                    cello.docker.agent
04367ab6bd5e   postgres:11.1                    "docker-entrypoint.s…"   4 seconds ago   Up 2 seconds   127.0.0.1:5432->5432/tcp                    cello-postgres
29b56a279893   hyperledger/cello-api-engine     "/bin/sh -c 'bash /e…"   4 seconds ago   Up 2 seconds   127.0.0.1:8080->8080/tcp                    cello-api-engine
a272a06d8280   hyperledger/cello-dashboard      "bash -c 'nginx -g '…"   4 seconds ago   Up 2 seconds   127.0.0.1:8081->8081/tcp                    cello-dashboard
```

### 管理平台服务

运行 `make stop` 可以停止服务。

若希望停止并清理所有容器，可运行如下命令。

```sh
$ make clean
```

可以通过如下命令查看支持的所有 Make 操作规则。

```sh
$ make help
```

## 使用 Cello 管理区块链

Cello 服务启动后，管理员可以通过 Cello 的 Dashboard 页面管理区块链。

默认情况下，可通过 Master 节点的 8081 端口访问 Dashboard（例如 localhost:8081）。默认的登录用户名和密码为 `admin:pass`。

![Cello Dashboard](/files/-M5y-T8P1MQOyaktlhan)

如图，Dashboard 有多个页面，各页面的功能如下。

| 页面               | 功能                |
| ---------------- | ----------------- |
| Overview         | 展示系统整体状态          |
| System Status    | 展示一些统计信息          |
| Hosts            | 管理所有主机（Worker 节点） |
| Active Chains    | 管理资源池中的所有链        |
| Inused Chains    | 管理正在被用户占用的链       |
| Released History | 查看链的释放历史          |

### Hosts 页面

在 Hosts 页面，管理员可以管理所有资源池中已存在的主机，或添加新主机。表格中会显示主机的类型、状态、正在运行的区块链数量、区块链数量上限等。所有设定为 non-schedulable （不会自动分配给用户）的主机会用灰色背景标识，如下图所示。

![Hosts 页面](/files/-M5y-T8S4Wo0n1mz5Q8R)

点击一个主机的 Action 下拉菜单，有如下选项可供操作该主机。

* Fillup：将主机运行的区块链数添加至上限。
* Clean：清理主机中所有未被用户占用的链。
* Config：更改主机配置，如名称和链数量上限。
* Reset：重置该主机，只有当该主机没有用户占用的链时可以使用。
* Delete：从资源池中删除该主机。

点击 Hosts 页面的 Add Host 按钮，可以向资源池中添加主机。需要设定该主机的名称、Daemon URL 地址（例如，Worker 节点的 docker daemon 监听地址和端口）、链数量上限、日志配置、是否启动区块链至数量上限、是否可向用户自动分配，如下图所示。

![添加主机](/files/-M5y-T8TrQUAWIpOoNAR)

### Active Chains 页面

Active Chains 页面会显示所有正在运行的链，包括链的名称、类型、状态、健康状况、规模、所属主机等信息。正在被用户占用的链会用灰色背景标识，如下图所示。

![Active Chains 页面](/files/-M5y-T8UGQGPO6EpQxS3)

点击一条链的 Actions 下拉菜单，有如下选项可供操作该链。

* Start：如果这条链处于停止状态，则启动。
* Stop：停止运行中的链。
* Restart：重新启动这条链。
* Delete：删除这条链。
* Release：将占用的链释放，随后会被删除。

点击 Active Chains 页面的 Add Chain 按钮，可以向资源池中添加更多链（如果还有未被占满的主机），如下图所示。

![添加链](/files/-M5y-T8VItYGniXVT0XT)

## 用户控制台，申请使用Chain

用户可以登录User Dashboard来申请和使用Chain

![登录页面](/files/-M5y-T8W_2KwwjSaoru1)

### Chain列表页面

Chain列表页面显示所有用户已经申请的链。

![Chain列表页面](/files/-M5y-T8X9nGl2Pw8zylN)

### Chain详情页面

Chain详情页面可以查看链的基本信息（链高度，channel数，链码安装/实例化个数，最近的block/transaction），操作历史记录。

![Chain详情页面](/files/-M5y-T8Yz-3j9UJ-NxLv)

### 智能合约模板列表页面

这个页面列取用户自己上传的智能合约代码模板，支持多个版本管理。

![智能合约模板列取页面](/files/-M5y-T8ZPoH-hde2DFJR)

### 智能合约模板详情页面

在合约模板详情页面可以查看智能合约模板的详情，包括合约多版本列表，部署列表，部署合约。

![智能合约详情页面](/files/-M5y-T8_RK0H4in23hQs)

### 智能合约操作页面

在这个页面可以invoke/query已经部署好的智能合约。

![智能合约操作页面](/files/-M5y-T8anNUnKmXg2lTs)

### 智能合约运行列表页面

这个页面可以查看所有已经部署，包括成功和失败的智能合约的列表。

![智能合约运行列表页面](/files/-M5y-T8bK2sAY5zO-HgC)

## 基于 Cello 进行功能扩展

Cello 已经提供了完整的区块链管理功能，并提供了图形界面和 API。

用户可以通过向 Cello 的 Master 节点（默认为 80 端口）发送 RESTful API 来申请、释放区块链，或查看区块链相关信息，如其对外开放的接口，可供用户进行远程交互。RESTful API 的说明可在 Cello 的文档中查阅。

对于区块链服务提供者，可以利用这些 API 为用户呈现友好的区块链申请和操作界面，在 Cello 的基础之上构建和实现更多功能。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://yeasy.gitbook.io/blockchain_guide/14_baas/cello.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
