Symbol ブロックチェーンのカスタムネットワーク(プライベートネットワーク)を Web UI で構築・管理するブロックチェーン-ネットワーク-ランチャー(BNL)です。
Docker コンテナ 1 つを起動するだけで、Symbol ノードの設定・起動・停止・監視がすべてブラウザから操作できます。
- 🖥️ Web UI — React + Tailwind CSS によるモダンなダッシュボード
- 🔧 ノード管理 — 起動 / 停止 / 再起動 / フルリセットをワンクリック
- 🌐 ネットワーク参加 — Seed ファイルのインポートでカスタムネットワークへ、または公式ネットワーク(mainnet / testnet)へ参加
- 📊 リアルタイム監視 — ブロック高・ファイナリティ高・ピア数・ハーベスト状態・ネットワーク通貨を表示
- 📜 ターミナルログ — Docker コンテナログを WebSocket でリアルタイム表示
- 🔑 アドレス管理 — ノードのアドレス・公開鍵をワンクリックでコピー
- 💾 バックアップ / リストア — 設定のみ / フル(ブロックデータ含む)の 2 種類の zip バックアップに対応
- 🔍 Explorer — Symbol Explorer をビルド・起動して自ネットワークのブロックを閲覧
- ☁️ ネットワーク公開 — Cloudflare 連携でノードをインターネットに公開
- 📡 Beacon 書き出し — ノードが観測したネットワーク状態を Transport 鍵で署名し、検証可能な Beacon File として書き出し
- 🔒 ログイン認証 —
ADMIN_PASSWORDを設定するとパスワード保護を有効化 - 🌍 多言語対応 — 日本語 / English 切り替え
- 🌙 ダーク / ライトテーマ — 好みに応じて切り替え
最新 UI のイメージです。
┌─────────────────────────────────────────────────────┐
│ symbol-manager コンテナ │
│ │
│ ┌─────────────┐ ┌──────────────────┐ │
│ │ Frontend │ │ Backend │ │
│ │ React │◄────►│ Express + WS │ │
│ │ Vite :5173 │ │ :4000 │ │
│ └─────────────┘ └──────┬───────────┘ │
│ │ docker.sock │
└──────────────────────────────┼──────────────────────┘
▼
┌────────────────────────┐
│ symbol-bootstrap │
│ (sibling containers) │
│ │
│ api-node-0 :7900 │
│ rest-gateway :3000 │
│ broker │
│ db (MongoDB) │
└────────────────────────┘
| 要件 | バージョン |
|---|---|
| Docker | 20.10 以上 |
| Docker Compose | v2 以上 |
| OS | Windows / macOS / Linux |
| メモリ | 8 GB 以上推奨 |
| ディスク | 20 GB 以上の空き容量 |
💡 推奨: ネイティブ Linux + Docker Engine(Docker Desktop 不要)
git clone https://github.com/bootarou/blockchain-network-launcher.git
cd blockchain-network-launchercp .env.example .envデフォルト設定のままでも起動できます。以下を変更したい場合のみ .env を編集してください。
SYMBOL_TARGET_DIR— ブロックチェーンデータの保存先(大容量ディスクに変更する場合)ADMIN_PASSWORD— 設定すると Web UI にログイン認証がかかりますBIND_ADDRESS— デフォルトは127.0.0.1(ローカルのみ)。LAN や他 PC からアクセスする場合は0.0.0.0に変更(ADMIN_PASSWORDとの併用推奨)
docker compose build
⚠️ Docker Compose v2.34+ (Docker Desktop 4.45+) では Bake がデフォルト有効になり、ビルドが失敗する場合があります。その場合:PowerShell:
$env:COMPOSE_BAKE="false"; docker compose buildLinux / macOS:
COMPOSE_BAKE=false docker compose build
docker compose up -dhttp://localhost:5173
💡 デフォルトでは
127.0.0.1にのみバインドされるため、同じマシンからしかアクセスできません。他の PC からアクセスする場合は.envでBIND_ADDRESS=0.0.0.0を設定してください。ADMIN_PASSWORDを設定している場合は、初回アクセス時にログイン画面が表示されます。
- Configuration タブで Assembly =
dual、Preset =bootstrapを選択 - ホスト IP、フレンドリーネーム等を設定
- Start で起動(設定は自動保存されます)— ネメシスブロックが生成されノードが起動
- Join Network タブでソースノードの REST API URL を入力
- Import Seed File でネットワーク管理者から受け取った Seed ファイルをインポート
- Configuration タブで設定を確認 → 操作ページで Start(設定は自動保存されます)
- Join Network タブで既知ノード(mainnet / testnet)を選択、または REST API URL を入力して設定を取り込み
- Configuration タブで設定を確認 → 操作ページで Start(設定は自動保存されます)
公式ネットワークでは Seed ファイルは不要です。ネットワーク設定は自動で取得されます。
- Share Network タブで Seed ファイルをダウンロード
- 参加者に Seed ファイルと REST API URL を配布
- Backup タブで「設定のみ」または「フル(ブロックデータ含む)」を選んで zip をダウンロード
- リストアは zip をアップロードするだけ。復元後は画面が自動で再読み込みされます
詳細な手順・注意事項は docs/backup-restore.md を参照してください。
- Explorer タブで Symbol Explorer をビルド・起動し、自ネットワークのブロックやトランザクションをブラウザで閲覧できます(デフォルトポート:
8090) - Publish タブで Cloudflare(API トークン・Zone ID・Account ID)を設定すると、ノードをインターネットに公開できます
詳しい操作手順は MANUAL.md を参照してください。
Beacon タブで、稼働中のノードが観測したネットワーク状態を、そのノードの
Transport 秘密鍵で署名した Beacon File(*.beacon.json)として書き出せます。
Beacon は「この Transport Identity を持つノードが、この接続先で、このネットワーク 状態を観測した」という署名済みの宣言です。ネットワーク単位ではなく ノード単位 で生成します。
含まれる情報は次のとおりです。
| 項目 | 内容 |
|---|---|
| ネットワーク | generationHash |
| ノード識別 | transportPublicKey(署名者)/ mainPublicKey(関連付け情報) |
| P2P 接続先 | p2pHost / p2pPort |
| REST 接続先 | apiHost / apiPort / apiScheme |
| 観測ブロック | height / blockHash / blockTimestamp |
書き出しの流れです。
- Beacon タブを開くと、設定と稼働ノードから値が自動収集されます
- 収集時に
generationHash・mainPublicKey・transportPublicKeyが実ノードの値と一致するか照合されます。1 つでも食い違えば生成しません - 接続先(host / port / scheme)を確認し、必要なら編集します。編集した値がそのまま署名対象になります
- ネットワークパスワードを入力して 「Beacon を書き出す」 をクリック
- 署名後、SDK 自身でオフライン検証し、
format/hash/signature/metadataがすべて有効な場合のみファイルがダウンロードされます
いくつか設計上の要点があります。
p2pPort/apiPortは「外部から実際に接続するポート」を優先します。docker portで公開ポートを取得するため、17900:7900のような構成では 17900 が入りますapiSchemeはポート番号から推測しません。 判定材料が無い場合は警告を出し、ユーザーが確認・変更します- P2P と REST は別ホストにできます。 Cloudflare トンネルやリバースプロキシで REST だけ別 FQDN になる構成に対応しています
- プライベート IP でも生成は可能です。外部検証ができない旨の警告を出すだけで、エラーにはしません(Gateway や VPN 経由の運用があるため)
- Transport 秘密鍵はバックエンド内でのみ扱います。 復号は署名の直前に行い、使用後は必ずゼロ化します。画面・ログ・API レスポンス・Beacon File のいずれにも出しません
Beacon Protocol の実装(正規化・ハッシュ・署名・ファイル形式・検証)は BNL 内には持たず、
独立した Beacon SDK をバージョン固定
(github:bootarou/beacon#v1.0.0)で利用しています。Protocol の正本は SDK 側です。
ℹ️ 現時点の BNL の役割は Beacon File の生成までです。外部への送信、ブロック チェーンへの記録、第三者によるオンライン検証は後続フェーズ(BEYOND)が担当します。
├── backend/
│ ├── server.ts # Express API + WebSocket サーバー
│ ├── beacon.ts # Beacon 生成(収集・鍵照合・署名・自己検証)
│ ├── addresses-crypto.ts # addresses.yml の復号(server/beacon で共有)
│ ├── beacon.test.ts # Beacon のテスト
│ └── package.json
├── frontend/
│ ├── src/
│ │ ├── App.tsx # メインアプリケーション
│ │ ├── components/ # React コンポーネント
│ │ ├── i18n/ # 多言語リソース (ja/en)
│ │ ├── lib/ # API クライアント・ユーティリティ
│ │ └── theme/ # テーマ管理
│ ├── index.html
│ └── vite.config.ts
├── shared/
│ └── custom-preset.yml # symbol-bootstrap カスタムプリセット
├── docs/
│ ├── backup-restore.md # バックアップ/リストア手順書
│ └── screenshots/ # スクリーンショット
├── .env.example # 環境設定のテンプレート
├── docker-compose.yml
├── Dockerfile
├── start.sh # コンテナ起動スクリプト
└── MANUAL.md # ユーザーマニュアル
- React 19 + TypeScript
- Vite — 高速ビルド & HMR
- Tailwind CSS 4 — ユーティリティファーストCSS
- Lucide React — アイコン
- WebSocket — リアルタイムログ・ステータス更新
- Node.js 20 + TypeScript (tsx)
- Express 5 — REST API
- WebSocket (ws) — ターミナルログ配信
- symbol-bootstrap — ノード構成・起動管理
- Docker CLI — サイドカーコンテナ操作 (DinD パターン)
- @nftdrive/beacon-sdk — Beacon Protocol v1(正規化・署名・検証)。
v1.0.0固定
.env ファイル(.env.example をコピーして作成)で設定します。
| 変数 | デフォルト | 説明 |
|---|---|---|
SYMBOL_TARGET_DIR |
/var/lib/symbol-target |
symbol-bootstrap のターゲットディレクトリ(ブロックデータ保存先) |
ADMIN_PASSWORD |
(空 = 認証なし) | Web UI の管理パスワード。設定するとログイン認証が有効化 |
BIND_ADDRESS |
127.0.0.1 |
Web UI ポート (4000, 5173) のバインドアドレス。0.0.0.0 で LAN / リモートからアクセス可 |
SYMBOL_BOOTSTRAP_REPO |
https://github.com/bootarou/symbol-bootstrap.git |
symbol-bootstrap の Git リポジトリ URL(ビルド時) |
NODE_ENV |
development |
実行環境 |
PORT |
4000 |
バックエンド API ポート |
| ポート | 用途 |
|---|---|
5173 |
Frontend (Vite dev server) — BIND_ADDRESS にバインド(デフォルト: ローカルのみ) |
4000 |
Backend API & WebSocket — BIND_ADDRESS にバインド(デフォルト: ローカルのみ) |
3000 |
Symbol REST Gateway (symbol-bootstrap が管理) |
7900 |
Symbol P2P ノード (symbol-bootstrap が管理) |
8090 |
Symbol Explorer(Explorer 起動時のデフォルト、変更可) |
- MANUAL.md — 詳細なユーザーマニュアル(Docker Host Mode、nodeEqualityStrategy、トラブルシューティング等)
- docs/backup-restore.md — バックアップ / リストア手順書(バックアップの種類、ケース別の復元動作、注意事項)
- docs/wsl-lan-setup.md — WSL2 ホストの LAN 公開手順書(mirrored モード / portproxy、ファイアウォール設定)
- docs/join-config-sync-audit.md — 参加ノードに同期されない設定の棚卸し(REST から取得できない設定と、同期が途中で止まる原因)
- docs/incident-2026-07-04-join-node-crash.md — 障害レポート:JOIN ノードがエポック2到達後にクラッシュループする問題
main は公式 catapult イメージ(symbolplatform/symbol-server)を使う標準版です。派生ブランチは用途別に分かれており、いずれも main の内容を取り込み済みです。
| ブランチ | 既定の catapult イメージ | 用途 |
|---|---|---|
main |
symbolplatform/symbol-server:gcc-1.0.3.9 |
標準版。1.0.3.6 / 1.0.3.7 / 1.0.3.9 から選択 |
feat-custom-catapult |
同上(公式のまま) | 自前ビルドの catapult イメージを検証する土台 |
feat-empty-block-policy-cf |
nftdrive/bnl-catapult-server:1.0.3.9-cf1-ebp |
非 PQC の BNL 統合イメージ版 |
feat-PQC-custom-catapult |
nftdrive/bnl-catapult-server-pqc:1.0.3.9-bnl |
耐量子計算機暗号(PQC)専用版 |
feat-empty-block-policy |
nftdrive/bnl-catapult-server-pqc:1.0.3.9-bnl-ebp |
PQC 版 + 空ブロック抑制 |
派生の系統は 2 本に分かれます。ブランチ名からは読み取れませんが、-cf が付く方が非 PQC です。
main
├─ feat-custom-catapult … カスタムイメージ対応(非 PQC)
│ └─ feat-empty-block-policy-cf … BNL 統合イメージを既定に
└─ feat-PQC-custom-catapult … PQC 専用
└─ feat-empty-block-policy … PQC + 空ブロック抑制
.env の CUSTOM_SERVER_IMAGE / CUSTOM_CONFIG_PATCHES で、ローカルビルドの catapult イメージと追加 config プロパティを Configuration の選択肢に加えられます。未設定なら main と同じ動作で、既定イメージは公式のままです。追加したキーは Configuration UI で編集でき、REST の /network/properties にも公開されます。設定例は .env.example に記載しています。
feat-custom-catapult の子孫です。非 PQC の統合 BNL イメージ 1.0.3.9-cf1-ebp(chainFinalizationHeight + 空ブロックポリシー)を既定で提供し、既知の BNL イメージには必要な config パッチを自動注入します。
耐量子計算機暗号版です。symbol-bootstrap も pqc-bootstrap ブランチ(ML-DSA-44 の鍵・証明書、iVRF による VrfKeyLink)を使い、UI も PQC 専用に絞られています。
⚠️ 公式ネットワーク(mainnet / testnet)には参加できません。 公式ノードの URL を指定すると、取り込み時にofficial Symbol network (ed25519)エラーで明示的に拒否されます。
feat-PQC-custom-catapult の子孫です。空ブロック抑制ポリシー(emptyBlockPolicy)を追加し、private / data chain では heartbeat(既定 86400 秒間隔)を既定値にします。トランザクションが無い間もブロックを生成し続ける従来動作(normal)に対して、ディスク消費を抑えられます。
main の修正は定期的に取り込んでください。 取り込みが遅れると、JOIN ノードの proof.index.dat 問題やクラッシュ自動復旧、インフレーション設定の不一致対策といった既知の障害対策が入らないまま運用することになります。これらは catapult のバージョンや PQC の有無に依存しないため、どの派生ブランチでも同じ問題が発生します。
ISC
