记录一下所需要的安装程序,接下来可能要做迁移,东西要重新弄过,有点麻烦的。

Hyper-V虚拟机配置

网络配置

开启电脑Hyper-V功能,在Hyper-V中添加一个内部交换机(假设取名为NAT-VM),然后在管理员权限的Powershell/Windows Terminal中执行一下命令

#查看 NAT-VM 的 ifindex
Get-NetAdapter
#创建ip,InterfaceIndex参数自行调整为上一步获取到的ifindex。这一步等同于在 控制面版-网卡属性 中设置ip
New-NetIPAddress -IPAddress 192.168.56.1 -PrefixLength 24 -InterfaceIndex 6
#创建nat网络,这一步是教程中的关键命令,24为子网掩码位数,即:255.255.255.0
New-NetNat -Name NAT-VM -InternalIPInterfaceAddressPrefix 192.168.56.0/24

使用tftpd64配置DHCP服务器,设置开机启动。不要叉掉tftpd64的窗口,在任务栏图标选择隐藏

虚拟机配置

使用官方的Ubuntu Server镜像安装(似乎也可以用ubuntu-minimal),不要在安装过程中选择安装docker,因为系统会使用snap安装,后续权限管理会比较麻烦。

修改软件源为https://mirrors.ustc.edu.cn

过程中添加宿主机的代理地址,方便访问外网。

免密码使用sudo

sudo visudo

在%sudo 一栏最后一个ALL前添加NOPASSWD:,最终效果如下

%sudo   ALL=(ALL:ALL) NOPASSWD:ALL

加入Zerotier

#安装zerotier
curl -s https://install.zerotier.com | sudo bash
#加入网络
sudo zerotier-cli join 83048a06326f196c
#添加moon中转主机
sudo zerotier-cli orbit db53baa8e6 db53baa8e6

安装docker(这是为了别的东西,也是图方便)

#如果有的话,清除旧的docker
sudo apt remove docker docker-engine docker.io containerd runc
#安装依赖
sudo apt install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
#添加密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
#添加apt软件源
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
#更新软件源
sudo apt update
#安装docker
sudo apt-get install docker-ce docker-ce-cli containerd.io

Docker备份、恢复、迁移

在原主机上执行:

#查看docker容器情况
sudo docker ps
#创建docker快照
sudo docker commit -p $container_id $image_name
#备份到tar文件
sudo docker save -o $location $image_name

执行完后,将生成的tar文件复制到新主机,执行:

#从tar文件恢复
sudo docker load -i $location
#检查镜像是否恢复成功
sudo docker images
#从镜像生成容器
#这里记录一下某js定时面板的指令,方便使用
sudo docker run -dit \
  -v $PWD/ql/config:/ql/config \
  -v $PWD/ql/log:/ql/log \
  -v $PWD/ql/db:/ql/db \
  -v $PWD/ql/repo:/ql/repo \
  -v $PWD/ql/raw:/ql/raw \
  -v $PWD/ql/scripts:/ql/scripts \
  -p 5700:5700 \
  --name qinglong \
  --hostname qinglong \
  --restart unless-stopped \
  whyour/qinglong:latest

docker免sudo执行

# 创建docker用户组
sudo groupadd docker
# 将当前用户添加到docker用户组
sudo usermod -aG docker $USER
# 重启docker服务
sudo systemctl restart docker
# 切换或者退出当前账户,重新登入
exit

安装openjdk-14

使用openjdk14是考虑到openjdk是开源的,代码开放,审计方便且安全,也不涉及商业问题。

#下载openjdk14安装包
wget https://download.java.net/openjdk/jdk14/ri/openjdk-14+36_linux-x64_bin.tar.gz
#解压
tar xvf openjdk-14+36_linux-x64_bin.tar.gz
#移动到不那么容易误删的位置
sudo mkdir /usr/local/java
sudo mv ./jdk-14 /usr/local/java/jdk14
#设置环境变量
sudo nano /etc/profile.d/jdk.sh
#添加以下代码
export JAVA_HOME=/usr/local/java/jdk14
export PATH=$PATH:$JAVA_HOME/bin
#更新环境
source /etc/profile.d/jdk.sh

安装lnmp

#使用无人值守工具
wget http://soft.vpser.net/lnmp/lnmp1.8.tar.gz -cO lnmp1.8.tar.gz && tar zxf lnmp1.8.tar.gz && cd lnmp1.8 && LNMP_Auto="y" DBSelect="5" DB_Root_Password="t9*ScJ&oJyZ4M@" InstallInnodb="y" PHPSelect="11" SelectMalloc="2" CheckMirror="n" ./install.sh lnmp

Fisco BCOS国密链部署

采用源码编译方式获得Fisco Bcos二进制文件,再使用官方提供的build_chain.sh搭建一条拥有四个节点的国密区块链

依赖安装

sudo apt install -y g++ libssl-dev openssl cmake git build-essential autoconf texinfo flex patch bison libgmp-dev zlib1g-dev automake libtool

下载代码

git clone https://github.com/FISCO-BCOS/FISCO-BCOS.git -b master-2.0

准备编译

cd FISCO-BCOS
mkdir -p build && cd build
cmake ..
make #可添加多线程

下载build_chain脚本并使用

cd ~ && mkdir -p fisco && cd fisco
curl -LO https://github.com/FISCO-BCOS/FISCO-BCOS/releases/download/v2.8.0/build_chain.sh && chmod u+x build_chain.sh

#使用-e指定刚刚编译完成的二进制fisco-bcos来生成链
#使用-g搭建国密版本链
#使用-G设置`chain.sm_crypto_channel=true`。确认sdk支持的情况下(Java SDK 以及 Web3sdk v2.5.0+),可以指定-G参数,连接也使用国密SSL
./build_chain.sh -l 127.0.0.1:4 -p 30300,20200,8545 -g -G

这样会生成一个全链路国密版本的四个节点文件

启动BCOS链

bash nodes/127.0.0.1/start_all.sh

获取并使用Fisco Bcos控制台

#获取控制台
cd ~/fisco && curl -LO https://github.com/FISCO-BCOS/console/releases/download/v2.8.0/download_console.sh && bash download_console.sh
#复制控制台配置文件
cp -n console/conf/config-example.toml console/conf/config.toml
#配置控制台证书
cp -r nodes/127.0.0.1/sdk/* console/conf/
#启动
cd ~/fisco/console && bash start.sh

部署WeBase套件

安装节点前置服务

因为本机部署了一条四节点的链,而每个节点对应一个前置服务,因此需要在本机运行四个前置服务。

#拉取代码并进入目录
git clone https://github.com/WeBankBlockchain/WeBASE-Front.git
cd WeBASE-Front
#编辑build.gradle,注释掉下面这行
#maven { url 'https://dl.bintray.com/ethereum/maven/' }
#为保证gradle兼容性,使用gradlew编译
chmod +x ./gradlew && ./gradlew build -x test
#拷贝配置
cd dist
cp -r conf_template conf
#修改配置
cd conf
#将节点所在目录下nodes/${ip}/sdk下的所有文件拷贝到当前conf目录
cp -r nodes/${ip}/sdk/* ./conf/

修改application.yml

spring:
  datasource:
    url: jdbc:h2:file:./h2/webasefront;DB_CLOSE_ON_EXIT=FALSE // 默认H2库为webasefront,建议修改数据库存放路径;
...
server: 
  port: 5003                    // 服务端口
  context-path: /WeBASE-Front
sdk: 
  ...
  ip: 127.0.0.1                 // 连接节点的监听ip
  channelPort: 20200            // 连接节点的链上链下端口
  certPath: conf                // sdk证书的目录,默认为conf
logging:
  config: classpath:log4j2.xml
  level:
    com.webank.webase.front: info //建议修改为warn或更高级别,不然会生成海量日志
constant: 
  keyServer: 127.0.0.1:5004     // 密钥服务的IP和端口(WeBASE-Node-Manager服务或者WeBASE-Sign服务,不同服务支持的接口不同),如果作为独立控制台使用可以不配置
  aesKey: EfdsW23D23d3df43          // aes加密key(16位) 如启用,各互联的子系统的加密key需保持一致
  transMaxWait: 30              // 交易最大等待时间
  monitorDisk: /                // 要监控的磁盘目录,配置节点所在目录(如:/data)
  monitorEnabled: true          // 是否监控数据,默认true
  nodePath: /fisco/nodes/127.0.0.1/node0      //配置所连节点的绝对路径,用于监控节点配置与日志
...

退回到WeBASE-Front,将dist目录复制出另外三个副本,并编辑副本中的application.yml,修改其中的数据库、服务端口和节点信息,分别对应不同的节点。端口冲突会导致服务无法启动

#启动前置服务
cd dist
#启动
bash start.sh
#停止
bash stop.sh
#检查
bash status.sh

分别进入dist的副本,进行同样的操作。

#进入控制台
http://{deployIP}:{frontPort}/WeBASE-Front
示例:http://localhost:5002/WeBASE-Front

安装签名服务

#拉取代码
git clone https://github.com/WeBankBlockchain/WeBASE-Sign.git
#进入目录
cd WeBASE-Sign
#为保证gradle兼容性,使用gradlew编译
chmod +x ./gradlew && ./gradlew build -x test
#下面两步也可以在phpmyadmin图形界面上执行,更直观
#登录MySQL:
mysql -u ${your_db_account} -p${your_db_password}  例如:mysql -u root -p123456
#新建数据库:
CREATE DATABASE IF NOT EXISTS {your_db_name} DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
#为保安全性,最好是专门新增一个用户,给予这个数据库的全部权限后,后续全部使用这个用户来操作,而不是直接使用root用户操作

#修改配置
cd dist
#复制配置文件
cp conf_template conf -r
#修改配置文件
nano conf/application.yml
server: 
  # 本工程服务端口,端口被占用则修改
  port: 5004
  context-path: /WeBASE-Sign

spring: 
  datasource: 
    # 数据库连接信息
    url: jdbc:mysql://127.0.0.1:3306/webasesign?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8
    # 数据库用户名
    username: "dbUsername"
    # 数据库密码
    password: "dbPassword"
    driver-class-name: com.mysql.cj.jdbc.Driver
    
constant: 
  # aes加密key(16位),如启用,各互联的子系统的加密key需保持一致
  aesKey: EfdsW23D23d3df43
#启动服务
#在dist目录下
启动:bash start.sh
停止:bash stop.sh
检查:bash status.sh

安装节点管理服务

#拉取代码
git clone https://github.com/WeBankBlockchain/WeBASE-Node-Manager.git
#进入目录
cd WeBASE-Node-Manager
#为保证gradle兼容性,使用gradlew编译
chmod +x ./gradlew && ./gradlew build -x test
#新建数据库,这里和上面的顺序类似
...
#修改脚本配置
cd  dist/script
nano webase.sh #修改服务器名称、用户名和密码
#数据库初始化
bash webase.sh ${dbIP} ${dbPort} 
实例:bash webase.sh 127.0.0.1 3306
#回到dist目录,复制配置文件模板到conf
cp conf_template conf -r
#修改application.yml
nano conf/application.yml #修改数据库相关信息以及log level

针对国密,要将application.ymlsdk.encryptType0改成1

#在dist目录下:
启动:bash start.sh
停止:bash stop.sh
检查:bash status.sh

安装WeBase管理平台

#拉取代码
git clone https://github.com/WeBankBlockchain/WeBASE-Web.git
#进入目录
cd WeBASE-Web
#下载solc-bin
bash ./get_solc_js.sh
#返回上级目录,拉取移动端代码
cd ..
git clone https://github.com/WeBankBlockchain/WeBASE-Web-Mobile.git

然后修改nginx.conf,下面是示例:

server {
        listen       5000 default_server; # 前端端口(端口需要开通策略且不能被占用)
        server_name  127.0.0.1;           # 服务器ip,也可配置为域名
        location / {
            root   /data/WeBASE-Web/dist;   # 前端文件路径(文件需要有权限访问)
            # 下面是移动端nginx配置
             if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" )
           {
            root   /data/WeBASE-Web-Mobile/dist;
           }
            index  index.html index.htm;
            try_files $uri $uri/ /index.html =404;
        }

        include /etc/nginx/default.d/*.conf;

        location /mgr {
            proxy_pass    http://10.0.0.1:5001/;   #节点管理服务ip和端口
            proxy_set_header        Host             $host;
            proxy_set_header        X-Real-IP         $remote_addr;
            proxy_set_header        X-Forwarded-For     $proxy_add_x_forwarded_for;
        }
    }

重启nginx

sudo nginx -s reload

访问http://{deployIP}:{webPort}测试

部署WeIdentity

采用可视化部署方式,部署WeIdentity实体身份标识服务

下载部署工具

wget -c https://gitee.com/WeBank/WeIdentity-Build-Tools/raw/master/common/script/install/weid_install.sh

执行安装脚本

chmod u+x weid_install.sh
./weid_install.sh
cd weid-build-tools

启动

./start.sh

访问http://{deployIP}:6021继续进行可视化部署

可视化部署

  • 选择“WeID + WeBASE集成模式”
  • 从WeBase控制台粘贴相关信息
  • 选择“联盟链委员会管理员”
  • 配置区块链节点

    • 机构名称
    • AMOP 通讯 ID,建议使用英文,并确保该 ID 在联盟链中唯一
    • 配置区块链节点 IP 和 Channel 端口

      • 配置说明:填入集成 WeIdentity Java SDK 的service(或者部署 WeIdentity Rest Service),所需连接的区块链节点的内网或公网 IP。Channel 端口为该节点的Channel端口。
      • 配置要求:格式为区块链节点 IP:Channel 端口。如需使用多个区块链节点, 请用半角逗号”,”分隔。
      • 连接单个节点的配置示例:10.10.4.1:20200
      • 连接多个节点的配置示例:10.10.4.1:20200,10.10.4.2:20200,127.0.0.1:20200
    • 配置SDK证书

      • 配置说明:连接区块链节点时需要使用的 SDK 证书。
      • 请从您的FISCO-BCOS节点安装目录获取 SDK 证书文件(包括三个文件:ca.crt, node.crt 和 node.key), 可能正在下面两个目录: ~/fisco/nodes/127.0.0.1/sdk/ 或 ~/fisco/generator/tmp_one_click/agencyA/sdk/。
  • 选择主群组:应该只有一个默认的群组
  • 配置数据库(MySQL)
  • 创建机构的 WeID:WeBASE同步账户模式
  • 部署 WeIdentity 智能合约:设置链ID和用户名

FISCO BCOS各种服务占用端口:

记录各种服务原始文档中所占用的端口以及修改位置

端口说明修改位置
80Nginx默认监听端口/usr/local/nginx/conf/nginx.conf
/usr/local/nginx/conf/vhost/*.conf
3306MySQL数据库占用端口/etc/my.cnf
5000WeBase管理平台前端端口/usr/local/nginx/conf/nginx.conf
/usr/local/nginx/conf/vhost/*.conf
5001WeBase节点管理服务端口WeBASE-Node-Manager/dist/conf/application.yml
5003WeBase节点前置服务端口WeBASE-Front/dist/conf/application.yml
5004WeBase签名服务端口WeBASE-Sign/dist/conf/application.yml
如果你想请我喝可乐,请随意赞赏