Steem dev 分支部署测试网络文档
文档信息
- 代码基线:steemit/steem 仓库
dev分支,HEAD =088c93b446931732922c4acf9280bb966f3f5286("pre-migration: commit all changes",2026-06-22,作者 ety001)- 撰写日期:2026-07-28
- 姊妹篇:《Steem 测试网启动详细教程》(基于
main分支b2f8567),本文中简称「main 教程」,引用其章节号写作「main 教程 §X.Y」- 事实来源:本文所有技术事实出自三份输入——dev 分支部署事实清单(标注为 dev 分支
路径:行号)、main 分支源码事实清单(同样以路径行号标注,dev 与 main 在共识层逐字节相同,故行号两分支通用,个别差异会注明)、main 教程。未在三份输入中出现的内容不会出现在本文中。- 读者前提:Steem 生态维护者(本人即 dev 分支迁移提交的作者),熟悉 Linux / Docker / C++ 构建。文中命令均可逐行复制执行。
1. dev 分支是什么
1.1 定位
dev 是 steemit/steem 当前活跃开发分支。自 main(b2f8567,2025-04-23)之后,dev 上新增了 11 个提交(PR #3699–#3707 共 9 个合并提交 + 无 PR 号的 b9fbf5f + HEAD 提交 088c93b),内容全部是构建系统 / CI 现代化迁移,不含任何共识代码变更。
提交历史(git log --oneline,从新到旧):
| 提交 | 说明 |
|---|---|
088c93b | pre-migration: commit all changes(HEAD,2026-06-22;仅新增 .dockerignore 与 scripts/deploy_regression.sh、scripts/rpc_regression_test.sh 两个 EC2 回归脚本,git show --stat 验证 3 文件 +242 行) |
b9fbf5f | Remove EOL Ubuntu 20.04 from CI matrix |
496cb88 | Enable Basic Tests and Use 4 Theads to Build (#3707) |
aa4b202 | Init Pipeline (#3706)(新增 .github/workflows/build-steemd.yml) |
2b653e4 | Fixes and Refactor the Docker files (#3705) |
5309b3f | Compile steemd on Debian 13 (Trinx) (#3703) |
19429e6 | Fix test_block_log (#3704) |
ba57a33 | Make Steem Great Again: Support AzureLinux3! (#3702) |
6f3650a | Make steemd compiled at Ubuntu24.04 (#3701) |
daac5d5 | Add Ubuntu 22.04 Support for steemd (#3700) |
bb537cc | Refactor and Cleanup: Ubuntu20.04 and Remove Ubuntu18.04 (#3699) |
b2f8567 | decrease fullnode p2p log output(= main HEAD,对比基准) |
1.2 迁移内容四项
- C++14 → C++17:
CMakeLists.txt:6-8设置CMAKE_CXX_STANDARD 17且CMAKE_CXX_STANDARD_REQUIRED ON(main 为CMAKE_CXX_STANDARD 14,CMakeLists.txt:5)。 - vendor 依赖改回 5 个真正的 git 子模块:main 上 3 个 vendor 目录已 vendored 进树(普通 tree,submodule update 是空操作);dev 上变为 5 个真 gitlink(160000),新增 rocksdb 与 cyoencode 两个子模块(
.gitmodules:10-15;git ls-tree HEAD验证)。 - 旧根 Dockerfile 三件套删除 →
deploy/下 7 个新 Dockerfile:根目录Dockerfile、Dockerfile.new、Builder.DockerFile全部移除,替换为deploy/Dockerfile.{ubuntu20.04,ubuntu22.04,ubuntu24.04,debian13,azurelinux3.0,ci.tests,smoketests}。 - 新增 GitHub Actions:
.github/workflows/build-steemd.yml(PR #3706),matrix 构建 4 个发行版镜像并在构建内跑单元测试(详见第 6 章)。
1.3 关键结论:部署变了,链行为没变
共识层与 main 逐字节一致,经 diff 验证:
libraries/protocol/include/steem/protocol/config.hpp:完全一致(链 ID、initminer 密钥、TESTNET_BLOCK_LIMIT 等常量零变化)。libraries/protocol/hardfork.d/:diff -rq完全一致,无新增 .hf 文件。libraries/chain/database.cpp:不在 main↔dev diff 列表中;1 号块自动激活全部硬分叉的机制仍在 database.cpp:3302-3336。IS_TEST_NET文件清单:两分支grep -rl "IS_TEST_NET"后 diff,清单完全一致,无新增测试网专属行为文件。
唯一与链行为沾边的差异是主网 p2p 默认种子列表更新(p2p_default_seeds.hpp:删除 seed-east/central/west.steemit.com 等失效节点,新增 seed.steemworld.org、seed.moecki.online 等现役社区种子;doc/seednodes.txt 同步更新)——仅影响主网互联,测试网无影响(测试网默认种子仍为空列表,p2p_default_seeds.hpp:6-8 的 #ifdef IS_TEST_NET 分支未动)。
因此:测试网最小配置、initminer 密钥、1 号块激活全部硬分叉机制、cli_wallet 操作等,全部沿用 main 教程 §4 的结论,本文不重复展开,只做引用。
1.4 main vs dev 部署差异总表(部署行动视角)
| # | 你要做的事 | main 时代 | dev 时代 |
|---|---|---|---|
| 1 | 选编译器 | gcc ≥ 4.8 即可(C++14) | 实践 gcc ≥ 9(C++17 + STANDARD_REQUIRED,CMakeLists.txt:6-8;CI 用 gcc 11/13/14) |
| 2 | 克隆后 | submodule update 是空操作,可跳过 | 必须 git submodule update --init --recursive,否则编译必败 |
| 3 | 准备 Boost | 系统包 1.65(Ubuntu 18.04) | 最低 1.78(doc/building.md:15);20.04/22.04/azurelinux 需源码编译,24.04/debian13 用系统包 |
| 4 | 打源码补丁 | 不需要 | 新 gcc(11/13/14)手工构建必须打 patches/ 下对应补丁 |
| 5 | Docker 构建 | docker build -t steemit/steem . | docker build -f deploy/Dockerfile.<发行版> .(根目录已无默认 Dockerfile) |
| 6 | 构建测试网镜像 | 根 Dockerfile 内置 steemd-testnet | 必须显式 --build-arg BUILD_STEEM_TESTNET=ON(默认 OFF = 主网 MIRA 低内存版) |
| 7 | 跑节点容器 | docker run steemit/steem(entrypoint 自动起节点) | 新镜像无 ENTRYPOINT,必须显式给 steemd 命令行 |
| 8 | CI 验证 | Jenkinsfile/circle.yml/cloudbuild.yaml(均指向已删除的旧 Dockerfile,实际不可用) | 复用 .github/workflows/build-steemd.yml(GitHub Actions,4 发行版 matrix + 单测) |
| 9 | 支持平台 | Ubuntu 16.04 首选、18.04 Docker、macOS | Ubuntu 20.04/22.04/24.04、Debian 13、AzureLinux 3.0(doc/building.md:5-12);16.04/14.04 文档已删除 |
| 10 | 共识/测试网行为 | — | 与 main 逐字节相同,直接引用 main 教程 §4 |
2. 环境准备
2.1 支持平台矩阵
dev 的 doc/building.md 新增 "Supported OS" 一节(:5-12),列出 5 个 Dockerfile 链接,并称「本地构建请安装对应 Dockerfile 里的依赖」。Ubuntu 16.04/14.04 的构建说明已整段删除,老系统教程作废。
各平台编译工具链版本(出处:deploy/*.Dockerfile 基础镜像与包安装段):
| 平台 | Dockerfile | gcc | cmake | Boost 来源 |
|---|---|---|---|---|
| Ubuntu 20.04 | deploy/Dockerfile.ubuntu20.04 | 9 | 3.16 | 源码编译 1.78.0(Dockerfile.ubuntu20.04:66-79,archives.boost.io,sha256=94ced8b7…63be7 校验) |
| Ubuntu 22.04 | deploy/Dockerfile.ubuntu22.04 | 11 | 3.22 | 源码编译 1.78.0(Dockerfile.ubuntu22.04:64-77;注释:系统自带为 1.74) |
| Ubuntu 24.04 | deploy/Dockerfile.ubuntu24.04 | 13 | 3.28 | 系统包 libboost-all-dev(1.83) |
| Debian 13 (trixie) | deploy/Dockerfile.debian13 | 14 | 3.31 | 系统包 libboost-all-dev(1.83) |
| AzureLinux 3.0 | deploy/Dockerfile.azurelinux3.0 | tdnf 安装 | tdnf 安装 | 源码编译 1.78.0(Dockerfile.azurelinux3.0:81-94;注释:"Azure Linux 3.0 does not have a fixed default version of the Boost") |
注意:dev 的 doc/building.md 中 macOS 一节(boost160 Homebrew 流程)原样保留,与新 Boost ≥1.78 要求矛盾,属陈旧内容;Windows 一节改为 "use WSL2 with Docker Desktop"(doc/building.md:138)。
2.2 硬件
- 编译内存 8GB RAM(doc/building.md:3,与 main 相同)。
- 内存不足时的 4GB swap 补救方案,见 main 教程 §2.2,命令可直接照抄,此处不重复。
2.3 Boost 红线
- 文档明确最低 Boost 1.78(doc/building.md:15 新增 "Boost version" 一节)。
- 注意:根
CMakeLists.txt:158仍写FIND_PACKAGE(Boost 1.58 REQUIRED ...)——CMake 层面的最低版本声明没有改,实际要求 1.78 只写在文档和 Dockerfile 里,勿被 1.58 误导。 - Boost ≥ 1.69 时 CMake 会追加
-fvisibility=hidden(CMakeLists.txt:161-164,与 main 相同的既有逻辑)。
各平台 Boost 来源一览:
| 平台 | Boost 版本 | 获取方式 |
|---|---|---|
| Ubuntu 20.04 / 22.04 | 1.78.0 | 源码编译(Dockerfile 内从 archives.boost.io 下载,sha256 校验后 bootstrap + b2 安装) |
| AzureLinux 3.0 | 1.78.0 | 同上,源码编译 |
| Ubuntu 24.04 | 1.83 | apt install libboost-all-dev |
| Debian 13 | 1.83 | apt install libboost-all-dev |
手工构建时,若在 20.04/22.04/AzureLinux 上,需照抄对应 Dockerfile 的 Boost 源码编译段自行安装 Boost 1.78;24.04/debian13 直接装系统包即可。
2.4 C++17 编译器要求
CMAKE_CXX_STANDARD 17+CMAKE_CXX_STANDARD_REQUIRED ON(CMakeLists.txt:6-8):不支持 C++17 的旧编译器(gcc < 7)直接不可用。- 实践矩阵:gcc 9(ubuntu20.04)、gcc 11(ubuntu22.04)、gcc 13(ubuntu24.04)、gcc 14(debian13)均可构建(对应 Dockerfile 即证据)。AzureLinux 3.0 用 tdnf 安装 gcc/gcc-c++。
- 注意:CMakeLists.txt 里 GCC ≥ 4.8 / Clang ≥ 3.3 的版本检查(:17-24)逐字保留未改,形同虚设——真正门槛是 C++17。
3. 获取源码与子模块初始化(dev 最大行为差异)
3.1 克隆 dev 分支
git clone --branch dev https://github.com/steemit/steem.git
cd steem
git rev-parse HEAD
# 应输出 088c93b446931732922c4acf9280bb966f3f5286(本文基线)
3.2 子模块初始化是必须步骤
这是 dev 相对 main 最大的行为差异:main 上 3 个 vendor 目录已 vendored 进树(git ls-tree 显示 040000 tree),git submodule update --init --recursive 是空操作;dev 上 5 个路径全部是真 gitlink(160000 commit,git ls-tree HEAD 验证),不初始化则这些目录为空,cmake/make 必然失败。
git submodule update --init --recursive
5 个子模块(.gitmodules;固定提交由 gitlink 记录):
| 路径 | 上游仓库 | pin 的提交 | 说明 |
|---|---|---|---|
libraries/fc/vendor/diff-match-patch-cpp-stl | github.com/leutloff/diff-match-patch-cpp-stl | ba3bbe3cdba5d461e241b756a50085c3602a3b5a | main 已有(原为 vendored) |
libraries/fc/vendor/secp256k1-zkp | github.com/cryptonomex/secp256k1-zkp | bd067945ead3b514fba884abd0de95fc4b5db9ae | main 已有(原为 vendored) |
libraries/fc/vendor/websocketpp | github.com/zaphoyd/websocketpp | 4dfe1be74e684acca19ac1cf96cce0df9eac2a2d | main 已有(原为 vendored) |
libraries/vendor/rocksdb | github.com/facebook/rocksdb | 1601da40496d456419bb23946bbea4ceb1bd9d78 | dev 新增(.gitmodules:10-12) |
libraries/fc/vendor/cyoencode | github.com/calzakk/CyoEncode | 245586e86d8308d911694853a43bde919a44c56f | dev 新增(.gitmodules:13-15) |
3.3 rocksdb 与 cyoencode 是什么、被谁用
- rocksdb:Facebook 的 LSM-tree KV 存储,是 MIRA(
ENABLE_MIRA=ON)的状态存储后端。使用方式与 main 完全相同:libraries/vendor/CMakeLists.txtGLOB 子目录并add_subdirectory,mira 链接rocksdbtarget(libraries/mira/CMakeLists.txt:56,与 main 逐字相同)。main 上它也是 vendored 代码,dev 只是把它从「拷进树」改回「子模块引用」。- 注意:即使 Ubuntu 24.04 的 Dockerfile 安装了系统包
librocksdb-dev(Dockerfile.ubuntu24.04:66)并传了-DUSE_VENDORED_ROCKSDB=OFF(Dockerfile.ubuntu24.04:79),该参数在全库 CMake 中没有任何定义(grep 验证),被静默忽略——实际仍编译 vendored rocksdb 子模块。所以 rocksdb 子模块在任何平台上都是必需的。
- 注意:即使 Ubuntu 24.04 的 Dockerfile 安装了系统包
- cyoencode:C 语言 base64 编解码库(CyoEncode/CyoDecode)。fc 把它编译进库:
libraries/fc/CMakeLists.txt:241-242将vendor/cyoencode/src/CyoDecode.c、CyoEncode.c编入 fc(main 用的路径是 vendoredvendor/cyoencode-1.0.2/src/,diff 验证),供fc/src/crypto/base64.cpp使用。
3.4 忘记初始化的后果
不执行 submodule 初始化时,websocketpp / secp256k1 / diff-match-patch / rocksdb / cyoencode 五个目录全为空:
- cmake 配置期即会因找不到子目录的 CMakeLists.txt / 源文件而报错(
add_subdirectory目标不存在); - 即便配置侥幸通过,编译期会以「头文件找不到」形态失败(如
websocketpp/...include 缺失、fc 编译时找不到CyoDecode.c等)。
自检命令:
git submodule status
# 5 行,每行前缀应为空格(已检出)而非 "-"(未初始化)
ls libraries/vendor/rocksdb/CMakeLists.txt libraries/fc/vendor/cyoencode/src/CyoEncode.c
4. 原生编译(无 Docker)
4.1 依赖安装(按发行版,从对应 Dockerfile 的 apt/tdnf 段提取)
Ubuntu 20.04 / 22.04(deploy/Dockerfile.ubuntu20.04:40-62;22.04 几乎相同):
sudo apt-get update
sudo apt-get install -y \
git jq build-essential cmake libssl-dev libsnappy-dev \
python3-jinja2 doxygen autoconf automake libyajl-dev \
libreadline-dev libtool liblz4-tool ncurses-dev libgflags-dev \
zlib1g-dev libbz2-dev liblz4-dev libzstd-dev wget
Ubuntu 24.04(deploy/Dockerfile.ubuntu24.04):在上述 20.04/22.04 清单基础上,Boost 改用系统包、额外安装 librocksdb-dev——即去掉源码编译 Boost 的步骤,并:
sudo apt-get update
sudo apt-get install -y libboost-all-dev librocksdb-dev
# 其余基础包照抄 deploy/Dockerfile.ubuntu24.04 的 apt 段(与 20.04/22.04 清单同源)
注意:24.04 尽管安装了系统 librocksdb-dev(Dockerfile.ubuntu24.04:66),实际仍编译 vendored rocksdb 子模块(见 §3.3 的 USE_VENDORED_ROCKSDB 说明)。
Debian 13(deploy/Dockerfile.debian13):与 24.04 同样使用系统 Boost(libboost-all-dev),包差异是以 lz4 替代 liblz4-tool、无 libssl-dev 重复项——基础包照抄 deploy/Dockerfile.debian13 的 apt 段即可。
AzureLinux 3.0(deploy/Dockerfile.azurelinux3.0:41-79,tdnf 包管理,RPM 系包名):
# 包清单照抄 deploy/Dockerfile.azurelinux3.0:41-79,关键包包括:
tdnf install -y gcc gcc-c++ cmake openssl-devel snappy-devel \
python3-jinja2 yajl-devel readline-devel lz4-devel xz-devel \
gflags-devel zstd-devel kernel-headers patch
ln -s /usr/bin/make /usr/bin/gmake # Dockerfile.azurelinux3.0:97
update-ca-trust # Dockerfile 内含此步骤
在 20.04 / 22.04 / AzureLinux 上还需按 §2.3 源码编译安装 Boost 1.78.0(步骤照抄对应 Dockerfile 的 Boost 段:下载 → sha256 校验 → bootstrap → b2 install)。
4.2 子模块初始化
git submodule update --init --recursive # 必须,见第 3 章
4.3 打源码补丁(新 gcc 必需)
dev 新增 patches/ 目录(main 无),共三个补丁,按发行版/gcc 版本选择:
| 补丁 | 修什么 | 哪些平台需要 | 出处 | ||
|---|---|---|---|---|---|
patches/rocksdb-cmake.patch | 给 vendored rocksdb 的 CMakeLists.txt 加 add_compile_options(-Wno-error=array-bounds)——gcc 12+ 把 rocksdb 源码的 array-bounds 警告升级为 error | gcc 12+ 的平台:ubuntu24.04、debian13、azurelinux3.0 | 对应 Dockerfile 在 git submodule update 后 git apply,并带 ` | echo "Patch already applied…"` 容错 | |
patches/websocketpp-patch-ini-asio.patch | 把 init_asio(io_service_ptr) 从 websocketpp transport/asio/connection.hpp 的 protected 区移到 public 区(配合 webserver/local_endpoint.hpp 的新 Boost.Asio 适配改动) | azurelinux3.0、ubuntu20.04、ubuntu22.04、ubuntu24.04 | 同上 | ||
patches/websocketpp-cx20-fix.patch | 完整的 C++20 风格修复:模板类内注入类名做构造/析构函数名(~endpoint<connection,config>() {} → ~endpoint() {} 等,涉及 endpoint.hpp、logger/basic.hpp、logger/syslog.hpp、roles/server_endpoint.hpp),同时包含 init_asio 迁移 | 仅 debian13(gcc 14 需要完整修复,而不仅是 init_asio) | Dockerfile.debian13:73-75 |
打补丁命令(子模块目录内 git apply,容错写法照抄 Dockerfile):
# gcc 11/13 平台(ubuntu20.04/22.04/24.04、azurelinux3.0):
(cd libraries/fc/vendor/websocketpp && git apply ../../../patches/websocketpp-patch-ini-asio.patch) \
|| echo "Patch already applied, skipping"
# debian13 / gcc 14(改用完整 C++20 修复补丁):
(cd libraries/fc/vendor/websocketpp && git apply ../../../patches/websocketpp-cx20-fix.patch) \
|| echo "Patch already applied, skipping"
# gcc 12+ 平台(ubuntu24.04、debian13、azurelinux3.0):
(cd libraries/vendor/rocksdb && git apply ../../../patches/rocksdb-cmake.patch) \
|| echo "Patch already applied, skipping"
4.4 cmake 配置与编译
mkdir -p build && cd build
# 主网见证人节点版(对齐 deploy/ Dockerfile 的默认参数):
cmake -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local/steemd \
-DSTEEM_STATIC_BUILD=ON \
-DENABLE_MIRA=ON \
-DLOW_MEMORY_NODE=ON \
-DCLEAR_VOTES=ON \
-DSKIP_BY_TX_ID=ON \
-DBUILD_STEEM_TESTNET=OFF \
..
# 私有测试网版(改用以下配置;单元测试也必须用它,doc/building.md:41):
# cmake -DCMAKE_BUILD_TYPE=Release \
# -DBUILD_STEEM_TESTNET=ON \
# -DLOW_MEMORY_NODE=OFF -DCLEAR_VOTES=ON -DSKIP_BY_TX_ID=ON ..
make -j$(nproc) steemd
make -j$(nproc) cli_wallet
cmake 参数逐项说明(deploy/ 各 Dockerfile :4-16 的统一 build-arg 默认值,注释原文:"The default build params are for low memory mira version. This usually are used as a witness node."):
| 参数 | 默认 | 作用 |
|---|---|---|
CMAKE_BUILD_TYPE | Release | 发布构建 |
STEEM_STATIC_BUILD | ON | 静态链接 libstdc++/libgcc(Docker 默认;手工构建可 OFF) |
ENABLE_MIRA | ON | RocksDB 状态存储 |
LOW_MEMORY_NODE | ON | 共识-only 低内存节点(见证人/种子推荐) |
CLEAR_VOTES | ON | 清理共识不再需要的旧投票 |
SKIP_BY_TX_ID | ON | 禁用按交易 id 查询账户历史 |
BUILD_STEEM_TESTNET | OFF | 私有测试网必须显式 ON;单元测试也必须 ON(doc/building.md:41) |
ENABLE_COVERAGE_TESTING | OFF | 覆盖率 |
CHAINBASE_CHECK_LOCKING | OFF(Dockerfile 默认) | chainbase 锁检查 |
UNIT_TEST / DOXYGEN / BUILD_TESTING | OFF/OFF/ON | 仅 Dockerfile 内使用(见第 5 章) |
NUMBER_BUILD_THREADS | 空(缺省 nproc-1) | Dockerfile 的 make -j 逻辑,doc/building.md:19-21 |
其余 OPTION(ENABLE_SMT_SUPPORT、CHAINBASE_CHECK_LOCKING、STEEM_STATIC_BUILD 等)的语义与 main 完全一致,完整速查表见 main 教程 §3.2。
常用 util target(与 main 相同,无新工具):chain_test、plugin_test、mira_test、get_dev_key、sign_transaction、test_fixed_string、test_block_log、test_sqrt、size_checker、schema_test、js_operation_serializer、cat-parts(dev 差异仅两处:programs/util/CMakeLists.txt:35-37 给 sign_transaction 增加链接 equihash——C++17 下符号解析需要;programs/util/test_block_log.cpp 经 19429e6 修复):
make -j$(nproc) get_dev_key sign_transaction chain_test
4.5 已知坑(CMake 层面)
- 残留
-std=c++11:CMakeLists.txt Linux 分支仍残留-std=c++11追加(:205/:230),但CMAKE_CXX_STANDARD 17生成的-std=gnu++17在编译命令行中位置靠后,靠后生效,实际以 C++17 编译。属残留而非错误,不用处理。 -Wno-error=sign-compare:dev 新增add_compile_options(-Wno-error=sign-compare)(CMakeLists.txt:9),防止新 gcc 下 sign-compare 警告升级为错误。- pthread 显式链接:新增
find_package(Threads REQUIRED)(CMakeLists.txt:159)与-pthread编译/链接标志(CMakeLists.txt:166-167)。 - fc 的 git 版本嵌入:
libraries/fc/CMakeLists.txt:251-264(dev 新增)在 cmake 配置期执行git rev-parse HEAD/git log -1 --format=%ct生成 GIT_REVISION_SHA / GIT_REVISION_UNIX_TIMESTAMP 写入 git_revision.cpp——在无.git的源码拷贝中配置会丢失版本信息(Docker 构建因 .dockerignore 不排除 .git 而无碍)。
4.6 产物路径
build/programs/steemd/steemd # 节点守护进程
build/programs/cli_wallet/cli_wallet # 命令行钱包
build/programs/util/get_dev_key # 密钥派生工具
build/programs/util/sign_transaction # 交易签名工具
build/tests/chain_test # 单元测试(须 BUILD_STEEM_TESTNET=ON 构建)
make install 可选,前缀由 -DCMAKE_INSTALL_PREFIX 决定(Docker 镜像用 /usr/local/steemd)。验证构建是否为测试网版:./programs/steemd/steemd --help | grep chain-id(--chain-id 仅 IS_TEST_NET 构建存在,chain_plugin.cpp:353-355)——细节见 main 教程 §3.5。
5. Docker 构建与部署(核心章节)
5.1 deploy/ 七镜像分工
dev 删除根目录旧 Dockerfile 三件套(Dockerfile、Dockerfile.new、Builder.DockerFile),替换为 deploy/ 下 7 个 Dockerfile:
| Dockerfile | 基础镜像 | 定位 | 补丁 | CI matrix |
|---|---|---|---|---|
Dockerfile.ubuntu20.04 | ubuntu:20.04(gcc 9) | 生产构建(两阶段) | init_asio | 否(b9fbf5f 移出,EOL;文件保留) |
Dockerfile.ubuntu22.04 | ubuntu:22.04(gcc 11) | 生产构建 | init_asio | 是 |
Dockerfile.ubuntu24.04 | ubuntu:24.04(gcc 13) | 生产构建 | init_asio + rocksdb | 是 |
Dockerfile.debian13 | debian:13 trixie(gcc 14) | 生产构建 | cx20-fix + rocksdb | 是 |
Dockerfile.azurelinux3.0 | azurelinux/base/core:3.0 | 生产构建 | init_asio + rocksdb | 是 |
Dockerfile.ci.tests | ubuntu:18.04(gcc 7,Boost 1.65) | CI 单测(构建后跑 chain_test/plugin_test/test_fixed_string) | 不打 | 否(疑不可用,见 §5.7) |
Dockerfile.smoketests | phusion/baseimage:0.11(Ubuntu 18.04,gcc 7) | 冒烟测试,内置 testnet 构建 | 不打 | 否(疑已坏,见 §5.7) |
五个生产 Dockerfile 的通用结构(ci.tests/smoketests 除外):两阶段(builder + final);builder 阶段 ADD . /usr/local/src → git submodule update --init --recursive → git apply 补丁 → cmake -DCMAKE_INSTALL_PREFIX=/usr/local/steemd … → make -j$NUMBER_BUILD_THREADS(缺省 nproc-1)→ make install → 可选单测 → 可选 doxygen;final 阶段仅 COPY --from=builder /usr/local/steemd /usr/local/steemd + 安装运行时库(libsnappy-dev、libreadline-dev)。
与 main 旧镜像的对应关系:
| main | dev | 关系 |
|---|---|---|
Dockerfile(phusion 冒烟 + 三配置安装) | deploy/Dockerfile.smoketests | 搬迁,仅删 ARG BUILD_TAG=0.23.x 一行 |
Dockerfile.new(ubuntu:18.04 单阶段) | 五个生产 Dockerfile | 替代/升级:两阶段、新发行版、新 Boost、入 PATH;失去 entrypoint/EXPOSE 直接起节点的能力 |
Builder.DockerFile | deploy/Dockerfile.ci.tests | 替代(但缺 submodule 步骤,疑不可用) |
根目录直接 docker build . | 无默认 Dockerfile | 必须 -f deploy/…(doc/building.md:55 的示例有笔误,见 §8) |
5.2 构建命令模板
docker build -f deploy/Dockerfile.<名> \
--build-arg NUMBER_BUILD_THREADS=N \
--build-arg UNIT_TEST=ON|OFF \
--build-arg BUILD_STEEM_TESTNET=ON|OFF \
-t steem:<标记> .
统一的 build-arg 默认值(各文件 :4-16;注释原文:"The default build params are for low memory mira version. This usually are used as a witness node."):
CMAKE_BUILD_TYPE=Release STEEM_STATIC_BUILD=ON ENABLE_MIRA=ON LOW_MEMORY_MODE=ON
CLEAR_VOTES=ON SKIP_BY_TX_ID=ON BUILD_STEEM_TESTNET=OFF ENABLE_COVERAGE_TESTING=OFF
CHAINBASE_CHECK_LOCKING=OFF UNIT_TEST=OFF DOXYGEN=OFF BUILD_TESTING=ON NUMBER_BUILD_THREADS(空)
即默认构建的是「MIRA + 低内存 + 静态链接 + 主网」的见证人节点版。所有 build 参数还会写入镜像内 /etc/build_info 供追溯。
常用实例:
# 主网见证人节点版(全部默认参数):
docker build -f deploy/Dockerfile.ubuntu24.04 -t steem:ubuntu24.04 .
# 私有测试网版(必须显式 BUILD_STEEM_TESTNET=ON,见下节):
docker build -f deploy/Dockerfile.ubuntu24.04 \
--build-arg BUILD_STEEM_TESTNET=ON --build-arg LOW_MEMORY_MODE=OFF \
-t steem:testnet .
# CI 同款(带单元测试):
docker build -f deploy/Dockerfile.ubuntu22.04 \
--build-arg NUMBER_BUILD_THREADS=4 --build-arg UNIT_TEST=ON \
-t steem:ubuntu22.04 .
5.3 测试网必须显式 BUILD_STEEM_TESTNET=ON
这是 Docker 部署中最容易踩的坑:main 时代根 Dockerfile 内置 testnet 三镜像(steemd-testnet/default/full),测试网二进制开箱即有;dev 的新 Dockerfile 统一以 --build-arg BUILD_STEEM_TESTNET=ON 显式 opt-in,默认 OFF。按 main 教程的思路直接 docker build -f deploy/Dockerfile.ubuntu24.04 .,得到的是主网 MIRA 低内存版,没有 --chain-id 选项、跑不了私有测试网。
唯一例外是 Dockerfile.smoketests,它保留了 main 时代内置的 TESTNET 构建(:74/108/147)——但该镜像在 dev 上疑已坏(见 §5.7),不建议依赖。
5.4 新镜像形态与启动方式
新生产镜像与 main 时代镜像形态差异巨大:
| 方面 | main 时代(steemit/steem 预构建镜像) | dev 新镜像 |
|---|---|---|
| 阶段 | 单阶段大镜像 | 两阶段(builder + final),final 仅含 /usr/local/steemd + 运行时库 |
| ENTRYPOINT | 有(steemdentrypoint.sh 体系) | 无 |
| EXPOSE | 8090 + 2001 | 无 |
| CMD | /usr/local/bin/steemdentrypoint.sh | CMD ["cat", "/etc/build_info"](仅打印构建参数) |
| VOLUME | /var/lib/steemd | /var/steem |
| PATH | — | ENV PATH=/usr/local/steemd/bin:$PATH(steemd 入 PATH) |
推论:不能 docker run 直接起节点——不加命令运行容器只会打印 /etc/build_info 然后退出。启动节点必须显式给 steemd 命令行:
docker run -d --name steemd-node \
-v $PWD/data:/var/steem \
-p 8090:8090 -p 2001:2001 \
steem:<标记> \
/usr/local/steemd/bin/steemd --data-dir=/var/steem
(scripts/deploy_regression.sh:41-53 正是这种用法的实例。)
注意:dev 的 5 个新发行版 Dockerfile 不再打入 contrib/ 下的任何配置与脚本(仅 smoketests 仍 ADD 它们);容器内没有 config-for-docker.ini,也没有 entrypoint 环境变量体系。数据目录里的 config.ini 由 steemd 首次启动自动生成(application.cpp:161-169),之后可 docker cp 出来修改再挂载回去,或直接用 -v 挂载写好的 ini + --config。
5.5 README 警示:Dockerized P2P Node / 环境变量章节已过时
dev 的 README.md 相对 main 仅 3 处实质变化(新增 GHA badge、Quickstart/Building 链接改相对路径),其余章节(Dockerized P2P Node、环境变量清单、PaaS、System Requirements 等)与 main 完全相同——但这些章节描述的仍是 main 时代 steemit/steem 预构建镜像(contrib/steemdentrypoint.sh 体系:USE_WAY_TOO_MUCH_RAM、STEEMD_SEED_NODES、USE_PAAS 等环境变量)的行为,与 dev 新 Dockerfile 产物不一致(新镜像无 entrypoint,环境变量无人消费)。
该环境变量体系如今仅对 Dockerfile.smoketests 镜像有效(它仍打入 contrib 全部文件并 CMD /usr/local/bin/steemdentrypoint.sh)。在 dev 新镜像上部署时,请以上一节 §5.4 的显式命令行方式为准,不要照搬 README 的 docker run steemit/steem 示例。
5.6 .dockerignore 与构建上下文
.dockerignore 为 dev 新增(088c93b 引入):排除 .deps/、build/、*.o/*.a/*.so、*.log、node_modules、__pycache__——不排除 .git。这是关键设计:各 Dockerfile 的 builder 阶段 ADD . /usr/local/src 会把 .git 一起带进构建上下文,然后在镜像内自行执行 git submodule update --init --recursive。
实际影响:
- 在子模块未初始化的工作树上也能 docker build——子模块在镜像内拉取(需要构建环境能访问 github.com)。
- 构建上下文会包含整个
.git目录,首次构建传输量较大;不要用git clean-类方式裁掉.git再构建。 - fc 的 git 版本嵌入(fc/CMakeLists.txt:251-264,见 §4.5)依赖
.git存在,Docker 构建天然满足。
5.7 镜像内跑单元测试机制 + 两个遗留镜像状态
- UNIT_TEST=ON:5 个生产 Dockerfile 在 builder 阶段
make install后、UNIT_TEST=ON 时执行./tests/scripts/run_unit_tests.sh(如 Dockerfile.ubuntu20.04:111-115)。该脚本(52 行,dev 新增)依次跑 test_fixed_string、test_block_log、test_sqrt、size_checker、schema_test、js_operation_serializer、get_dev_key(带参数xyz "wit-block-signing-0:101")、ctest -j4 --output-on-failure;chain_test -t basic_tests/curation_weight_test被注释掉(注释:"broken on main branch before the changes…TODO")。DOXYGEN=ON 时另跑 doxygen + check_reflect + get_config_check.sh。单测在 docker build 的 builder 阶段内执行——构建即验证,测试失败则镜像构建失败。 - Dockerfile.ci.tests(疑不可用):FROM ubuntu:18.04(gcc 7 + 系统 Boost 1.65),单阶段,cmake 参数含
-DENABLE_STD_ALLOCATOR_SUPPORT=ON(根 CMakeLists 中无此 OPTION 声明,静默忽略,同 main 结论)与-DBUILD_STEEM_TESTNET=ON;构建后直接跑./tests/chain_test、./tests/plugin_test、./programs/util/test_fixed_string(:44-55)。但它没有git submodule update步骤(grep 验证)——在 dev 的 gitlink 子模块结构下,除非构建上下文里子模块已初始化,否则必定失败;且 cloudbuild.yaml 引用它时把文件名拼错(见 §6.4)。结论:遗留,当前不可用。 - Dockerfile.smoketests(疑已坏):与 main 根
Dockerfile的 diff 只有 1 行(删除ARG BUILD_TAG=0.23.x)。结构同 main:BUILD_STEP 1 跑 ctest/chain_test/mira_test + Debug coverage;BUILD_STEP 2 把 TESTNET+SMT 版装到/usr/local/steemd-testnet、主网低内存版装到/usr/local/steemd-default、主网全节点版装到/usr/local/steemd-full,并生成/etc/steemdversion;运行形态保留老镜像的 EXPOSE 8090 2001、VOLUME /var/lib/steemd、steemd 用户、contrib 全套配置与CMD /usr/local/bin/steemdentrypoint.sh。它执行git submodule update --init --recursive(:69,:102,:141,:171),在 dev 下能取到子模块;但 gcc 7 + Boost 1.65 与 dev 的 C++17 / Boost≥1.78 要求不匹配,且不打任何补丁,不在 CI matrix 中——冒烟构建在 dev 上很可能已坏,仅作为 main 老 Dockerfile 的存档对应物。
6. GitHub Actions CI 复用
6.1 build-steemd.yml 解读
.github/workflows/build-steemd.yml(47 行,dev 独有,main 无 .github 目录,PR #3706 引入):
- 触发条件(:3-10):
push:仅当deploy/**或 workflow 文件自身变化时;pull_request:无路径限制;workflow_dispatch:手动触发。
- runner:
ubuntu-latest(:13)。 - matrix(:16-22):
fail-fast: true,4 个 Dockerfile:Dockerfile.azurelinux3.0、Dockerfile.debian13、Dockerfile.ubuntu22.04、Dockerfile.ubuntu24.04(ubuntu20.04 在 b9fbf5f 被移出 matrix,Dockerfile 本身仍保留;ci.tests 与 smoketests 不在 matrix)。 - 步骤(:24-47):
actions/checkout@v4→sudo -E docker build --no-cache --build-arg NUMBER_BUILD_THREADS=4 --build-arg UNIT_TEST=ON -t steem:<发行版名> -f deploy/<Dockerfile> .。 - 产物:仅在 CI 本地打
steem:azurelinux3.0等 tag 的镜像,不推送 registry、不上传 artifact。 - 测试:
UNIT_TEST=ON触发各 Dockerfile 内 builder 阶段执行./tests/scripts/run_unit_tests.sh(见 §5.7),构建内嵌单测。
6.2 一个反直觉但关键的设计细节
workflow 的 actions/checkout@v4 未配置 submodules: true——表面看子模块是空的,CI 理应失败。实际能工作的原因在 §5.6:.dockerignore 不排除 .git,ADD . /usr/local/src 把 .git 带进构建上下文,各 Dockerfile 内部自行执行 git submodule update --init --recursive。
如果你复用/改造该 workflow,务必保留这条链路的某一环:要么 checkout 加 submodules: true(或 submodules: recursive),要么确保 .dockerignore 不排除 .git 且 Dockerfile 内有 submodule update 步骤。两头都砍掉,构建必败。
6.3 在自己的 fork / 服务器上复用
fork 仓库:dev 分支自带该 workflow,fork 后对
deploy/**的 push、任意 PR、或 Actions 页面手动 Run workflow 即触发,零改动可用。自建 runner / 其他 CI 系统:核心就一条命令,直接照抄 workflow 的构建步骤:
sudo -E docker build --no-cache \ --build-arg NUMBER_BUILD_THREADS=4 \ --build-arg UNIT_TEST=ON \ -t steem:ubuntu24.04 \ -f deploy/Dockerfile.ubuntu24.04 .依次对 4 个发行版执行即等价于 CI matrix。注意 CI 用
--no-cache(保证干净构建)与NUMBER_BUILD_THREADS=4(适配 GitHub 免费 runner 的资源);自有构建机可调大线程数并去掉--no-cache提速。用途定位:该 workflow 是「构建验证 + 单测」流水线,不是发布流水线(不推镜像)。需要发布镜像时在构建后自行
docker save/docker push。
6.4 遗留 CI 文件状态
| 文件 | 状态 |
|---|---|
cloudbuild.yaml | 构建文件从 ../Builder.DockerFile 改为 ../deploy/Dockfile.ci.tests——有拼写错误 "Dockfile"(cloudbuild.yaml),且 Builder.DockerFile 已删除、ci.tests 自身疑不可用(§5.7)。该配置当前不可用。 |
Jenkinsfile | 与 main 完全相同(diff 无差异),内容仍引用旧流程,属遗留。 |
ciscripts/ | 与 main 完全相同(diff -rq 无差异),遗留。 |
circle.yml | 测试命令从 -f Dockerfile.test 改为 -f deploy/Dockerfile.smoketests(注意 main 的 circle.yml 引用的 Dockerfile.test 在 main 树中也不存在,本就属遗留;而 smoketests 在 dev 上疑已坏,§5.7)。 |
结论:dev 上唯一可用的 CI 是 GitHub Actions build-steemd.yml,其余均为遗留。
7. 测试网部署(dev 上的测试网)
7.1 前提:链行为零变化
如 §1.3 所述,dev 的共识层与 main 逐字节相同(config.hpp / hardfork.d / database.cpp / IS_TEST_NET 清单 diff 验证)。因此以下测试网事实全部不变,细节直接引用 main 教程,本文不重复:
- 链 ID 默认
9afbce9f2416520733bacb370315d32b6b2c43d6097576df1c1222859d91eecc(= sha256("testnet"),config.hpp:16),可用--chain-id覆盖(dev 的 chain_plugin.cpp:354); - initminer 公私钥(WIF
5JNHfZYKGaomSFvd4NUdQ9qMcEAC43kujbfjueTHpVapX1Kzq2n、公钥TST6LLegbAgLAy28EHrffBVuANFWcFgmqRMW13wBmTExqFE9SCkg4,config.hpp:14-15); - 1 号块自动激活全部 24 个硬分叉(dev 的 database.cpp:3302-3336,与 main 同一段代码);
- 测试网最小 config.ini、cli_wallet 连接与操作、RC 白名单、多节点见证人排班、debug_node 工具箱。
对应章节:最小配置与启动验证 → main 教程 §4.2 / §4.3;cli_wallet → main 教程 §4.4;RC 注意事项 → main 教程 §4.5;多节点 → main 教程 §5。
7.2 变化的是构建路径
dev 上获得测试网二进制有三条路:
原生编译:第 4 章完整流程(子模块 → 补丁 → cmake),cmake 加
-DBUILD_STEEM_TESTNET=ON:cmake -DCMAKE_BUILD_TYPE=Release \ -DBUILD_STEEM_TESTNET=ON \ -DLOW_MEMORY_NODE=OFF -DCLEAR_VOTES=ON -DSKIP_BY_TX_ID=ON .. make -j$(nproc) steemd cli_walletDocker 构建:任一生产 Dockerfile 加
--build-arg BUILD_STEEM_TESTNET=ON(§5.3,默认 OFF,必须显式):docker build -f deploy/Dockerfile.ubuntu24.04 \ --build-arg BUILD_STEEM_TESTNET=ON --build-arg LOW_MEMORY_MODE=OFF \ -t steem:testnet .smoketests 镜像:内置 testnet 构建(安装到
/usr/local/steemd-testnet,TESTNET+SMT+MIRA),用法与 main 老镜像相同(EXPOSE 8090/2001、steemdentrypoint.sh 体系)。但注意 §5.7 的结论:gcc 7 + Boost 1.65 与 dev 的 C++17 要求不匹配、不打补丁、不在 CI matrix,冒烟构建在 dev 上很可能已坏,仅作为存档对应物,不建议作为部署路径。
7.3 dev 专属「测试网快速启动」精简流程
以下流程可独立跟随(原生编译路径;Docker 路径见 §5.3 + §5.4)。共识层细节出处见 main 教程对应章节。
# 1) 获取源码 + 子模块(dev 必须,§3)
git clone --branch dev https://github.com/steemit/steem.git
cd steem
git submodule update --init --recursive
# 2) 打补丁(按发行版选择,§4.3;以 ubuntu22.04 为例只需 init_asio 补丁)
(cd libraries/fc/vendor/websocketpp && git apply ../../../patches/websocketpp-patch-ini-asio.patch) \
|| echo "Patch already applied, skipping"
# 3) 编译测试网版(§4.4)
mkdir -p build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_STEEM_TESTNET=ON \
-DLOW_MEMORY_NODE=OFF -DCLEAR_VOTES=ON -DSKIP_BY_TX_ID=ON ..
make -j$(nproc) steemd cli_wallet
# 4) 初始化数据目录(首次启动自动生成 config.ini,application.cpp:161-169)
./programs/steemd/steemd -d ~/steem-testnet-data
# 看到生成 config.ini 后 Ctrl-C
用下面的最小 config.ini(与 main 教程 §4.2 相同,零变化)整体替换 ~/steem-testnet-data/config.ini:
plugin = webserver p2p json_rpc witness
plugin = condenser_api database_api network_broadcast_api block_api rc_api
enable-stale-production = true
required-participation = 0
witness = "initminer"
private-key = 5JNHfZYKGaomSFvd4NUdQ9qMcEAC43kujbfjueTHpVapX1Kzq2n
webserver-http-endpoint = 127.0.0.1:8090
webserver-ws-endpoint = 127.0.0.1:8090
p2p-endpoint = 127.0.0.1:9876
shared-file-size = 1G
(各行含义与出处——witness 值必须带引号按 JSON 解析、webserver 端点无默认值必须显式指定、shared-file-size 默认 54G 可调小——全部见 main 教程 §4.2。)
启动与 curl 验证(同 main 教程 §4.3):
# 5) 启动:日志应出现 STARTING TEST NETWORK 横幅与 initminer 公私钥,随后 3 秒一块
./programs/steemd/steemd -d ~/steem-testnet-data
# 6) 另开终端验证:链 ID 应为 9afbce9f…eecc
curl -s --data '{"jsonrpc":"2.0","method":"database_api.get_version","params":[],"id":1}' http://127.0.0.1:8090 | python3 -m json.tool
# head_block_number 应每 3 秒递增
curl -s --data '{"jsonrpc":"2.0","method":"database_api.get_dynamic_global_properties","params":[],"id":1}' http://127.0.0.1:8090 | python3 -m json.tool
# 应含 "IS_TEST_NET": true、"STEEM_ADDRESS_PREFIX": "TST"、"TESTNET_BLOCK_LIMIT": 3000000
curl -s --data '{"jsonrpc":"2.0","method":"database_api.get_config","params":[],"id":1}' http://127.0.0.1:8090 | python3 -m json.tool
cli_wallet 连接(测试网构建无需链 ID 参数,细节见 main 教程 §4.4):
./programs/cli_wallet/cli_wallet -s ws://127.0.0.1:8090
7.4 回归脚本(主网定位,非测试网)
dev 新增两个脚本(088c93b 引入,配合 PR #3712 的仓库迁移验证),定位是 EC2 上的主网回归,与私有测试网无关(种子、block_log、steemit 账户均为主网对象),列此供部署主网节点时参考:
scripts/deploy_regression.sh(104 行):用法./deploy_regression.sh <docker_image_tar>(:7)。流程:docker load镜像(脚本内写死ety001/test-steem:latest,:13)→ 建/steem-regression/{test-a,test-b}目录 → Test A:容器从 1 号块全量同步,显式命令行起 steemd(--data-dir=/var/steem、http/ws 端点、5 个--p2p-seed-node,:41-53)→ Test B:先wget https://steemit-dev-blockchainstate.s3.amazonaws.com/block_log-latest(约 381GB,:61)再--replay-blockchain --force-validate重放(:75-88)。端口映射:A=18091/18090/12001,B=28091/28090/22001。不在 GitHub Actions 中运行,是手工/EC2 运维脚本;它同时是 dev 新镜像「显式命令行起 steemd」用法的官方实例。scripts/rpc_regression_test.sh(130 行):对两个节点各发 10 个 RPC 做跨节点一致性校验(注释:"RPC Regression Test for PR #3712",:3)。测试项:database_api.get_dynamic_global_properties、block_api.get_block(1 与 head)、database_api.get_config、get_hardfork_properties、get_witness_schedule、condenser_api.get_accounts([steemit])、condenser_api.get_block(1)、get_reward_funds、rc_api.get_rc_accounts(:58-110);跨节点比对块 1/100000/1000000/10000000/50000000 的 block_id(:114-128);任一 FAIL 则 exit 1(:136-138)。依赖:curl、jq、两节点已在 18091/28091 监听。
8. 常见坑排查表
| 现象 | 根因 | 解决 | 出处 |
|---|---|---|---|
cmake 配置期报子目录 CMakeLists.txt 不存在 / 编译期找不到 websocketpp 头文件、CyoDecode.c 等 | dev 上 5 个 vendor 目录是真 gitlink,未执行 submodule 初始化时全为空 | git submodule update --init --recursive(main 上该命令是空操作,dev 上是硬依赖) | .gitmodules:10-15;git ls-tree HEAD 5 个 160000 gitlink |
| 编译 rocksdb 报 array-bounds 错误 | gcc 12+ 把 rocksdb 源码的 array-bounds 警告升级为 error | (cd libraries/vendor/rocksdb && git apply ../../../patches/rocksdb-cmake.patch)(加 -Wno-error=array-bounds) | patches/rocksdb-cmake.patch;Dockerfile.ubuntu24.04:72-73 等 |
编译 webserver 报 init_asio protected 访问错误 | websocketpp 把 init_asio(io_service_ptr) 放在 protected 区,新 Boost.Asio 适配代码需要 public 访问 | gcc 11/13 平台打 websocketpp-patch-ini-asio.patch;debian13/gcc14 打完整的 websocketpp-cx20-fix.patch | patches/ 两个补丁;webserver/local_endpoint.hpp 适配改动 |
| debian13/gcc 14 上 websocketpp 大量模板构造/析构报错 | gcc 14 要求完整 C++20 风格修复(注入类名做构造/析构函数名等),init_asio 补丁不够 | 改用 patches/websocketpp-cx20-fix.patch(含 init_asio 迁移) | Dockerfile.debian13:73-75 |
| cmake 找到了 Boost 但编译 Boost.Asio 相关代码大量报错 | Boost 低于 1.78;CMakeLists.txt:158 只声明 1.58,具误导性 | 按 doc/building.md:15 准备 Boost ≥ 1.78(20.04/22.04/azurelinux 源码编译,24.04/debian13 系统包) | doc/building.md:15;deploy/*.Dockerfile Boost 段 |
| 旧机器 gcc 7 直接编不过 | dev 要求 C++17 且 STANDARD_REQUIRED | 换 gcc ≥ 9 的平台(实践矩阵:gcc 9/11/13/14) | CMakeLists.txt:6-8 |
docker build -f deploy/Dockerfile.ubuntu24.04 . 后跑不出测试网,steemd 没有 --chain-id | 忘了 --build-arg BUILD_STEEM_TESTNET=ON;默认 OFF = 主网 MIRA 低内存版 | 重建:--build-arg BUILD_STEEM_TESTNET=ON(main 教程的思路在 dev 上不适用) | 各 Dockerfile ARG 默认(:4-16);chain_plugin.cpp:354 |
docker run steem:<标记> 打印一段构建信息就退出 | 新镜像无 ENTRYPOINT,CMD 只是 cat /etc/build_info | 显式给命令:docker run ... steem:<标记> /usr/local/steemd/bin/steemd --data-dir=/var/steem | 各 Dockerfile final 阶段 CMD;scripts/deploy_regression.sh:41-53 |
| 按 README 的 Dockerized P2P Node / 环境变量章节部署不生效 | 这些章节是 main 时代 entrypoint 体系的描述,与新镜像不一致 | 以本文 §5.4 为准;环境变量体系仅 smoketests 镜像仍支持 | README.md(与 main 相同部分);dev-brief 1.3 |
docker build -t steemit/steem -f deploy/Dockerfile. . 报错找不到文件 | doc/building.md:55 的示例有笔误,"Dockerfile." 后缺文件名 | 实际应为 deploy/Dockerfile.ubuntu22.04 之类 | doc/building.md:55 |
Google Cloud Build 构建失败:找不到 deploy/Dockfile.ci.tests | cloudbuild.yaml 拼写错误("Dockfile"),且 ci.tests 镜像本身疑不可用 | 放弃 cloudbuild,用 GitHub Actions(§6) | cloudbuild.yaml;§6.4 |
| ci.tests 镜像构建失败(子模块为空) | Dockerfile.ci.tests 没有 git submodule update 步骤(grep 验证) | 属遗留,建议直接用带 UNIT_TEST=ON 的生产 Dockerfile 替代 | deploy/Dockerfile.ci.tests;§5.7 |
| smoketests 镜像构建失败 | gcc 7 + Boost 1.65 不满足 dev 的 C++17 / Boost ≥1.78,且不打补丁、不在 CI matrix | 属存档对应物,不建议在 dev 上使用 | deploy/Dockerfile.smoketests;§5.7 |
ubuntu24.04 上传了 -DUSE_VENDORED_ROCKSDB=OFF 却仍在编译 vendored rocksdb | 该参数在全库 CMake 中无定义(grep 验证),被静默忽略 | 无需处理(行为即编译子模块);知道即可,勿依赖该开关 | Dockerfile.ubuntu24.04:79 |
| 编译告警 sign-compare 满天飞但未中断 | dev 已加 -Wno-error=sign-compare | 正常,无需处理 | CMakeLists.txt:9 |
看到 -std=c++11 又看到 C++17 设置,担心标准不对 | CMakeLists.txt 残留 -std=c++11(:205/:230),但 -std=gnu++17 在命令行靠后生效 | 无需处理,实际以 C++17 编译 | CMakeLists.txt:6-8, 205, 230 |
| 无 .git 的源码拷贝构建后版本信息缺失 | fc 在 cmake 配置期用 git rev-parse HEAD 取版本 | 保留 .git 构建(Docker 构建因 .dockerignore 不排除 .git 天然满足) | libraries/fc/CMakeLists.txt:251-264;.dockerignore |
| 测试网运行期问题(不出块、RC、引号、资产符号等) | 与 main 完全相同 | 见 main 教程 §8 排查表 | main 教程 §8 |
9. 附录
9.1 dev 分支部署速查表
| 项 | 值 / 命令 | ||
|---|---|---|---|
| 分支 / 基线 commit | dev / 088c93b446931732922c4acf9280bb966f3f5286(2026-06-22) | ||
| 克隆 | git clone --branch dev https://github.com/steemit/steem.git | ||
| 子模块(必须) | git submodule update --init --recursive(5 个真 gitlink;rocksdb pin 1601da40) | ||
| 编译器 | C++17;实践 gcc 9/11/13/14 | ||
| Boost | ≥ 1.78(doc/building.md:15;CMake 声明 1.58 勿信) | ||
| 原生构建(主网) | cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_MIRA=ON -DLOW_MEMORY_NODE=ON -DCLEAR_VOTES=ON -DSKIP_BY_TX_ID=ON .. && make -j$(nproc) steemd cli_wallet | ||
| 原生构建(测试网) | 同上但 -DBUILD_STEEM_TESTNET=ON -DLOW_MEMORY_NODE=OFF | ||
| Docker 构建模板 | `docker build -f deploy/Dockerfile.<名> --build-arg NUMBER_BUILD_THREADS=N --build-arg UNIT_TEST=ON | OFF --build-arg BUILD_STEEM_TESTNET=ON | OFF -t steem:<标记> .` |
| 测试网开关 | 必须显式 BUILD_STEEM_TESTNET=ON(默认 OFF = 主网 MIRA 低内存版) | ||
| 容器启动 | docker run -d -v <data>:/var/steem -p 8090:8090 -p 2001:2001 steem:<标记> /usr/local/steemd/bin/steemd --data-dir=/var/steem(无 entrypoint,必须显式命令) | ||
| CI 触发 | push 改 deploy/** / 任意 PR / workflow_dispatch;matrix = azurelinux3.0 + debian13 + ubuntu22.04 + ubuntu24.04 | ||
| 产物路径 | build/programs/steemd/steemd、build/programs/cli_wallet/cli_wallet(原生);镜像内 /usr/local/steemd/bin/(Docker) |
9.2 main vs dev 文件级差异索引
根 CMakeLists.txt 全部 4 处 diff:
| 位置 | 变化 |
|---|---|
| CMakeLists.txt:6-8 | CMAKE_CXX_STANDARD 14 → 17,新增 CMAKE_CXX_STANDARD_REQUIRED ON |
| CMakeLists.txt:9 | 新增 add_compile_options(-Wno-error=sign-compare) |
| CMakeLists.txt:159 | Boost 查找后新增 find_package(Threads REQUIRED) |
| CMakeLists.txt:166-167 | 新增 -pthread 编译与链接标志 |
(未变:cmake_minimum_required 3.2(:3)、GCC/Clang 版本检查(:17-24)、FIND_PACKAGE(Boost 1.58 ...)(:158)、全部 OPTION、Linux 分支残留 -std=c++11(:205/:230)。)
新增文件/目录(dev 独有):
deploy/:7 个 Dockerfile(ubuntu20.04/22.04/24.04、debian13、azurelinux3.0、ci.tests、smoketests)patches/:rocksdb-cmake.patch、websocketpp-cx20-fix.patch、websocketpp-patch-ini-asio.patch.github/workflows/build-steemd.yml.dockerignore(不排除 .git)scripts/deploy_regression.sh、scripts/rpc_regression_test.shtests/scripts/run_unit_tests.sh
删除文件:
- 根目录
Dockerfile、Dockerfile.new、Builder.DockerFile - doc/building.md 中 Ubuntu 16.04 / 14.04 + 手工 Boost 1.60 的构建说明(整段删除)
逐字节相同(关键共识与配置):libraries/protocol/include/steem/protocol/config.hpp、libraries/protocol/hardfork.d/、libraries/chain/database.cpp、IS_TEST_NET 文件清单、40 个 plugin.json、contrib/ 全部 14 个文件、external_plugins/、example_plugins/、cli_wallet(除 2 处 C++17 引用修复)。
兼容性修复(无语义变化,了解即可):webserver/local_endpoint.hpp(新 Boost.Asio 适配)、database_api_objects.hpp:381-388(-Werror=maybe-uninitialized)、chainbase/allocators.hpp 等头文件补充、fc 大量 crypto 源文件 -Werror 兼容、fixed_string.hpp(C++17 兼容,protocol 目录唯一差异文件)、p2p_default_seeds.hpp 主网种子更新(测试网分支未动)。
文档类差异(不影响构建,了解即可):doc/git-guidelines.md 的 docker build 示例被改为 docker build -f deploy/ubuntu20.04——新示例缺 "Dockerfile." 前缀,本身是个不可用示例(同类笔误见 §8 坑表 building.md:55 条目);doc/mira-tuning.md 仅将链接改为相对路径,无内容变化。此外 tests/ 下若干测试基建文件亦有差异(如 test_block_log 修复,见 §4.4)。
9.3 参考链接
- 仓库:https://github.com/steemit/steem (本文基线 dev@088c93b)
- CI workflow:https://github.com/steemit/steem/blob/dev/.github/workflows/build-steemd.yml
- 迁移 PR:#3699(Ubuntu20.04 重构、移除 18.04)、#3700(Ubuntu 22.04)、#3701(Ubuntu 24.04)、#3702(AzureLinux 3.0)、#3703(Debian 13)、#3704(Fix test_block_log)、#3705(Dockerfile 重构)、#3706(Init Pipeline)、#3707(启用基础测试 + 4 线程构建);仓库迁移 PR #3712(配合 088c93b 的回归脚本与测试镜像
ety001/test-steem) - 姊妹篇:《Steem 测试网启动详细教程》(main@b2f8567),本文 §1.3、§7.1 大量引用其 §4/§5/§8
10. 结语
dev 分支的迁移是一次纯粹的「部署面」现代化:C++17、真子模块、多发行版 Dockerfile、GitHub Actions——链的共识行为一行未动。对维护者而言,新的心智模型只有三条:子模块必须 init、测试网必须显式 opt-in、容器必须显式给 steemd 命令。建议的下一步:
- 基于 dev 重建测试网:按 §7.3 流程在目标发行版上跑通「子模块 → 补丁 → 构建 → 最小 config.ini → curl 验证」全链路,替换掉基于 main 老镜像的现有环境。
- 跑 chain_test:
BUILD_STEEM_TESTNET=ON构建后make -j$(nproc) chain_test && ./tests/chain_test(单测必须用测试网构建,doc/devs/testing.md),或直接用UNIT_TEST=ON的 Docker 构建让tests/scripts/run_unit_tests.sh在 builder 阶段自动执行(§5.7)。 - 用 CI 验证自己的补丁:在 fork 上向 dev 提 PR 即触发 4 发行版 matrix 构建 + 单测(§6.3),把「我的改动能否跨发行版编译」交给流水线回答。
- 关注仓库迁移进展:088c93b("pre-migration")与两个 EC2 回归脚本是配合 PR #3712 仓库迁移的收尾(测试镜像
ety001/test-steem);迁移落地后注意远端地址与 CI 状态的变化,必要时用scripts/deploy_regression.sh+rpc_regression_test.sh做主网回归验证(§7.4)。
注意:与 main 教程相同的提醒——测试网 3,000,000 块封顶(TESTNET_BLOCK_LIMIT,config.hpp:43;database.cpp:796 断言),按 3 秒一块约 104 天,到期前规划好重建或快照迁移;initminer 公私钥是公开常量(启动横幅直接打印),永远不要把这套测试网配置用于承载真实价值的场景。
Upvoted! Thank you for supporting witness @jswit.