Blockscout 部署 — 实现

For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.

Goal: 用 Blockscout 全栈 Docker 替换 matter-labs/block-explorer,连接本地 BabyDriver era-core 节点,zkSync 原生支持 + 品牌定制。

Architecture: Blockscout 官方 Docker 镜像 + 自定义 docker-compose-baby.yaml(单文件自包含)。所有服务通过 nginx 代理对外暴露,backend 通过 host.docker.internal:3050 连接 era-core。使用官方 env 文件作为基础,通过 compose environment 覆盖 BabyDriver 特有配置。

Tech Stack: Blockscout 9.x (Elixir), Next.js frontend, PostgreSQL 17, Redis, nginx, Docker Compose

Design Doc: docs/plans/2026-03-03-blockscout-replacement-design.md


Task 1: 停止旧 matter-labs block explorer

Context: 当前 refs/block-explorer 有 5 个 Docker 容器在运行(app:3010, worker:3001, data-fetcher:3040, api:3020, postgres:5433)。需要先停掉,释放端口 3010。

Files:

  • Read: refs/block-explorer/docker-compose-baby.yaml

Step 1: 停止旧容器

Run:

cd /Users/judybaby/CodeBase/github/Layer2/refs/block-explorer
docker compose -f docker-compose-baby.yaml down

Expected: 所有 5 个容器停止。

Step 2: 确认端口已释放

Run:

Expected: 无输出(端口已释放)。注意 :3050 和 :5432 仍被 era-core 使用,不应影响。

Step 3: 确认 era-core 仍在运行

Run:

Expected: 返回 {"jsonrpc":"2.0","result":"0x...","id":1}(era-core 正常)。


Task 2: 创建 BabyDriver logo 目录 + nginx 配置

Context: Blockscout 前端通过 env var 指定 logo URL,同时 nginx proxy 需要自定义端口(3010 代替默认 80)。

Files:

  • Create: refs/blockscout/docker-compose/baby-assets/babydriver-logo.svg

  • Create: refs/blockscout/docker-compose/baby-assets/babydriver-logo-dark.svg

  • Create: refs/blockscout/docker-compose/baby-proxy/default.conf.template

Step 1: 创建 logo 资源目录

Run:

Step 2: 复制 logo 文件

复制已有的 BabyDriver logo SVG 文件:

Step 3: 创建自定义 nginx 配置

Create refs/blockscout/docker-compose/baby-proxy/default.conf.template:

Step 4: 验证文件结构

Run:

Expected: 2 个 SVG 文件 + 1 个 nginx 配置文件。


Task 3: 创建 docker-compose-baby.yaml

Context: 单文件自包含的 Docker Compose,不使用 extends。引用官方 env 文件作为基础,通过 environment 覆盖 BabyDriver 专有值。

重要: 跳过 nft_media_handler(需 AWS 配置)和 user-ops-indexer(无 ERC-4337 合约),开发环境不需要。

Files:

  • Create: refs/blockscout/docker-compose/docker-compose-baby.yaml

Step 1: 创建 docker-compose-baby.yaml

Create file at refs/blockscout/docker-compose/docker-compose-baby.yaml:

Step 2: 验证 YAML 语法

Run:

Expected: 无错误输出(YAML 有效)。


Task 4: 拉取镜像并启动所有服务

Context: 首次启动需要拉取约 2-3 GB 的 Docker 镜像。启动后 Blockscout 会自动运行数据库迁移、创建表结构、开始索引。

前置条件: era-core 节点运行在 host:3050

Files:

  • Read: refs/blockscout/docker-compose/docker-compose-baby.yaml

Step 1: 确认 era-core 正在运行

Run:

Expected: 返回当前区块号。如果 era-core 没运行,需要先启动:

Step 2: 拉取所有镜像

Run:

Expected: 拉取 blockscout, frontend, stats, visualizer, sig-provider, smart-contract-verifier, postgres:17, redis:alpine, nginx。

Step 3: 启动所有服务

Run:

Expected: 所有容器启动。db-init 和 stats-db-init 完成后退出(正常)。

Step 4: 查看启动日志

Run:

Expected: 看到数据库迁移完成、开始索引的日志。关键日志:

  • "Running migrations..." — 数据库迁移

  • "Block Fetcher started" — 开始索引区块

  • ERROR 级别日志

Step 5: 确认所有容器状态

Run:

Expected: 除 db-init 和 stats-db-init(Exited 0)外,所有容器 Up/Running。


Task 5: 验证索引 + API

Context: Blockscout 后端应该已自动从 block 0 开始索引 era-core 的所有区块。

Step 1: 检查 API 健康状态

Run:

Expected: 返回 JSON,包含 total_blockstotal_transactions 等字段。total_blocks 应 > 0。

Step 2: 检查区块索引

Run:

Expected: 返回区块列表 JSON。应该能看到 block 0 及后续区块。

Step 3: 检查交易索引

Run:

Expected: 返回交易列表(如果有交易的话)。

Step 4: 检查 zkSync batch 信息

Run:

Expected: 返回 zkSync batch 列表(如果 batch 索引已启用)。可能返回空列表或 404 — 取决于 era-core 是否已提交 batch 到 L1。


Task 6: 验证前端 + 品牌 + 最终确认

Context: 验证前端页面能正常显示 BabyDriver 品牌,区块数据可浏览。

Step 1: 检查前端可访问

Run:

Expected: 200

Step 2: 检查 logo 资源可访问

Run:

Expected: 两个都返回 200

Step 3: 验证 Stats API

Run:

Expected: 返回 JSON(可能是空数据或初始统计)。如果返回错误可忽略(stats 服务需要一些时间收集数据)。

Step 4: 在浏览器中验证

用浏览器打开以下 URL 并检查:

  • http://localhost:3010 — 首页显示 BabyDriver 名称和 logo

  • http://localhost:3010/blocks — 区块列表

  • http://localhost:3010/txs — 交易列表

  • 点击任意区块进入详情页

Step 5: 记录最终状态

Run:

Expected: 所有服务运行正常,区块已索引。


故障排除

Backend 连不上 era-core

如果失败,检查 Docker Desktop 的 host.docker.internal 支持。

数据库迁移失败

前端显示空白

索引停滞

Last updated