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 downExpected: 所有 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.svgCreate:
refs/blockscout/docker-compose/baby-assets/babydriver-logo-dark.svgCreate:
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_blocks、total_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