FISCO BCOS离线部署问题记录并解决

前言

因项目需求团队要求,部署的服务器都不能访问外网,所以自己尝试了区块链底层网络节点、控制台、Webase 等离线部署,当然也遇到遇到坑,由此记录下来。

步骤一:底层链的部署安装

借鉴参考这个博文思路完成的底层链部署安装,即在一台有网络的服务器先在线安装好,然后将提前预设好的无网络服务器 ip 信息提前设置好,再移动节点信息到无网络的离线服务器上。
没有什么坑,一路还算顺畅。
FISCO BCOS离线无网络部署安装系列教程之底层链的部署安装(思路一)

步骤二:配置并使用控制台

这里参考FISCO BCOS官网步骤即可,受步骤1启发,提前下载好download_console.sh脚本文件,安装官方下载路径即可。

配置并使用控制台

步骤三:部署及调用HelloWorld合约

这里依然参考官网步骤即可。
部署及调用HelloWorld合约

步骤四:webase 搭建

参考官网,需要提前装好 jdk 环境(建议1.8)
webase 搭建
也可以参考这个更全面复杂版本,因我们项目不需要如此复杂的功能,即采用官网版本即可
FISCO BCOS离线无网络部署安装系列教程之区块链浏览器fisco-bcos-browser v2.2.1的部署安装

步骤五:合约编译

当 webase 搭建好后,将项目所需合约文件(即.sol 文件)放到页面(http://x.x.x.x:5002/WeBASE-Front)合约管理页面功能-合约 IDE 中,将主合约编译、部署,即可在合约列表中看到。
在这里插入图片描述
合约列表中可看到编译部署后的合约,可通过调用合约测试合约方法是否生效
在这里插入图片描述

期间需要先创建一个测试用户才行,后续也会用到这个用户的.pem 文件
在这里插入图片描述

步骤六:分布式存储数据–链下mysql同步链上数据(世界状态库)

因项目查询速率需求,我们做了链下 mysql 同步链上数据的扩展需求,分别拉取了世界状态库数据和历史状态库数据,这步为同步世界状态库数据。
参考官网步骤分布式存储

踩坑1:mysql 版本选择

前提需先离线安装 mysql(建议5.7版本)一个小坑,我离线部署时使用 docker 的mysql8版本镜像试过,不能实现分布式存储数据同步,所以建议还是采用官网使用的5.7版本为好。

踩坑2:group.1.ini配置文件修改

根据官网步骤操作到修改group.1.ini配置文件时,除了官方所说的数据库名称、用户名、密码、ip、端口号需要修改的同事,还要注意一个小细节也要修改,就是在storage 下有一个 type 类型,默认的是 rocksdb,但是因为我们项目采用的是 mysql 所以这里也要同步改成 type=mysql 才行,这个真是隐藏的大坑呀,官网教程也是用的 mysql 却一点没有提及修改此处。
在这里插入图片描述

步骤七:数据导出系统组件–链下mysql同步链上数据(历史状态库)

除了世界状态库,区块链更多需要溯源、检索等需求的时候就需要查询历史状态了,所以还需要同步历史状态库,同理也是参考官网部署方式数据导出系统组件
基本也是安装官网,将所需的脚本先下载好,再移动到离线服务器上,再通过修改一些配置文件等操作达到目的。

踩坑1:脚本执行中需要下载安装gradle

但是这次的脚本不能直接在离线服务器上运行,因为脚本中涉及到下载gradle wrapper,但是在离线服务器中是没有办法连接外网的,所以此行不通,我也有尝试在服务器中自己安装,但是执行脚本的时候还是会有依赖包等问题,总之就是此行不通了。
解决方式:也是借鉴步骤1的思路,在一个可联网的环境下先执行脚本运行完成,生成脚本运行后的 Data-Export*.jar 包,再移动到离线服务器中即可。

踩坑2:配置文件环境更改

在application.properties文件修改中的 ip应该修改为离线服务器的 ip,替换掉127.0.0.1,不然运行 jar 本会访问底层链不通

踩坑2:配置合约

遇到运行 jar 包后出现合约方法和事件数据没有导出的情况,最终还是根据官方提示,删除config/solidity/下已配置的未成功导出数据的合约,并将config/solidity/bin/(非国密目录/ecc/、国密目录为/sm/)下bin文件的内容替换为合约部署位置(如WeBase)编译得到的binary,然后清理数据库表重新启动即可
在这里插入图片描述

附功能提示

1:端口检查

因离线服务器,所有的端口都没有默认开启,所以上述操作中遇到用到的一些常用端口需要自己手动打开防火墙,比如(3306、20200、30300、8485、5002)等

firewall-cmd --list-ports	#查看已经开放的端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent #开放端口3306
firewall-cmd --reload		#重启firewall
firewall-cmd --list-ports	#检查3306是否开放

2.docker启动 mysql 时区选择

因我后续更改为 docker 启动 mysql5.7版本,服务器的时区检查(date 命令)后显示是 CST,但是通过 docker启动的 mysql 版本默认时区是 UTC,所以就出现时区不一致,当时启动历史版本库的 jar 包的时候一直创建不了 data-export 库我以为是这个时区的问题,好折腾了一翻,也记录一下吧。
在docker 创建容器时给设置时区如下命令:

docker run -p 3306:3306 --name mymysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -e TZ=Asia/Shanghai -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0

修改Docker容器中的mysql时区的三种方式
mysql 怎么修改时区

3.其他博文参考

CentOS7.5离线安装jdk1.8
centos7下离线安装MySQL5.7

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值