0xhardman

0xhardman

twitter
medium
jike
github

部署自定义 Blockscout ブロックチェーンブラウザ ガイド

イントロダクション#

ご存知の通り、blockscout は Ethereum エコシステムのオープンソースブロックチェーンブラウザです。ローカル開発環境で blockscout を開発するのは非常に簡単で、設定ファイルの rpc を少し変更するだけでシームレスに起動できます。しかし、blockscout は頻繁に更新されるため、開発者が自分の運営するチェーンに blockscout をデプロイするのは少し面倒です。変更が必要な設定がやや複雑で、落とし穴も多いため、筆者は詳細なデプロイガイドを提供し、皆さんの参考にしていただければと思います。

全体的な考え方#

全体として、私たちが関心を持つファイルは docker-compose ディレクトリ内にあり、基本的な操作もその下で行います。次に、services ディレクトリ内の docker コンテナサービス設定ファイル、envs ディレクトリ内の環境変数ファイル、proxy ディレクトリ内の Nginx 設定ファイルに注目する必要があります。大まかな手順は以下の通りです:

  1. SSL 証明書を生成する
  2. docker-compose 起動ファイルを設定する
  3. envs 環境設定を変更する
  4. proxy Nginx 設定を変更する

サーバー設定#

CPU: 4 コア / 8 コア

RAM: 8GB / 16GB / 32GB

DISK: 120GB または 500GB NVME SSD または Standard SSD

OS: Linux(Ubuntu が個人的に好ましい)、MacOS

前提条件#

  • Docker(V20+)と Docker Compose(V2+)がインストール済み
  • ドメインが設定済み(例:testnetexplorer.karpak.paratrix.xyz)
  • SSL 証明書が取得済み(HTTPS サポート用)
  • ブロックチェーン RPC ノードが設定済み(HTTP+WS)、注意:rpc ノードでも https を有効にする必要があります。そうしないと blockscout は接続できません。
  • 80/443/8080/8081 ポートが開放されている

デプロイ手順#

1. SSL 証明書の準備#

certbot を使用して ssl 証明書を生成することをお勧めします。以下は詳細な手順です:

1.1 certbot のインストール#

# certbotをインストール
apt-get update
apt-get install -y certbot

1.2 証明書を生成する(Docker が 80 ポートを占有している場合)#

blockscout が起動すると、80 ポートを占有するため、certbot のスタンドアロンモードを使用します:

方法 1: Docker サービスを一時停止する

# 80ポートを占有しているDockerコンテナを停止
docker-compose -f custom-rpc.yml down

# certbotを使用して証明書を生成
certbot certonly --standalone -d your-domain.com --email [email protected] --agree-tos --no-eff-email

# 生成が完了したらDockerサービスを再起動
docker-compose -f custom-rpc.yml up -d

2.3 自動更新の設定#

# 自動更新スクリプトを作成
cat > /root/renew-cert.sh << 'EOF'
#!/bin/bash
# 証明書自動更新スクリプト

# ログファイルを設定
LOG_FILE="/var/log/cert-renewal.log"

# 開始時間を記録
echo "$(date): 証明書更新プロセスを開始" >> $LOG_FILE

# ドメインをチェック
DOMAIN="your-domain.com"

# 証明書の有効期限をチェック
EXPIRY=$(openssl x509 -in /etc/letsencrypt/live/$DOMAIN/fullchain.pem -text -noout | grep "Not After" | cut -d: -f2-)
EXPIRY_DATE=$(date -d "$EXPIRY" +%s)
CURRENT_DATE=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_DATE - $CURRENT_DATE) / 86400 ))

echo "$(date): 証明書はあと $DAYS_LEFT 日で期限切れ" >> $LOG_FILE

# 証明書が30日以内に期限切れになる場合、更新を試みる
if [ $DAYS_LEFT -lt 30 ]; then
    echo "$(date): 証明書が30日以内に期限切れになるため、更新を試みます" >> $LOG_FILE
    
    # Dockerサービスを停止
    docker-compose -f custom-rpc.yml down >> $LOG_FILE 2>&1
    
    # certbotを使用して更新を試みる
    certbot renew >> $LOG_FILE 2>&1
    
    # Dockerサービスを再起動
    docker-compose -f custom-rpc.yml up -d >> $LOG_FILE 2>&1
    
    echo "$(date): 証明書更新プロセスが完了しました" >> $LOG_FILE
else
    echo "$(date): 証明書の有効期限は十分で、更新の必要はありません" >> $LOG_FILE
fi
EOF

# 実行権限を追加
chmod +x /root/renew-cert.sh

# crontabに追加し、毎週日曜日の午前0時に実行
echo "0 0 * * 0 /root/renew-cert.sh" | crontab -

1.3 証明書の位置#

生成された証明書は通常以下の場所にあります:

  • 証明書パス: /etc/letsencrypt/live/your-domain.com/fullchain.pem
  • 秘密鍵パス: /etc/letsencrypt/live/your-domain.com/privkey.pem

これらのパスを Nginx や他のサービスに設定してください。

2. カスタムネットワーク設定#

2.1 docker-compose 設定ファイル#

docker-compose/anvil.ymlファイルを参考にして、docker-compose/custom-rpc.ymlファイルを作成します。nft 関連のサービスはまだ設定せず、ブロックチェーンネットワークパラメータを設定します:
ps:docker-compose の設定ファイルの環境変数は、実際には services 内の環境変数(つまり envs 内の環境変数)を上書きするため、変更が必要な環境変数のみを設定すればよいです。

version: '3.9'

services:
  # 基本サービス設定
  redis-db:
    extends:
      file: ./services/redis.yml
      service: redis-db

  # データベース初期化サービス
  db-init:
    extends:
      file: ./services/db.yml
      service: db-init

  db:
    depends_on:
      db-init:
        condition: service_completed_successfully
    extends:
      file: ./services/db.yml
      service: db

  # バックエンドサービス、これがダウンすると何も見えなくなります
  backend:
    depends_on:
      - db
      - redis-db
    extends:
      file: ./services/backend.yml
      service: backend
    links:
      - db:database
    environment:
        # ブロックチェーンネットワーク特有の設定
        ETHEREUM_JSONRPC_VARIANT: 'geth'  # ノードタイプに応じて調整
        ETHEREUM_JSONRPC_HTTP_URL: 'https://your-rpc-endpoint'
        ETHEREUM_JSONRPC_TRACE_URL: 'https://your-rpc-endpoint'
        ETHEREUM_JSONRPC_WS_URL: 'wss://your-ws-endpoint'
        ETHEREUM_JSONRPC_FALLBACK_HTTP_URL: 'https://your-rpc-endpoint'
        ETHEREUM_JSONRPC_FALLBACK_TRACE_URL: 'https://your-rpc-endpoint'
        CHAIN_ID: 'あなたのチェーンID'
        INDEXER_DISABLE_INTERNAL_TRANSACTIONS_FETCHER: 'true'  # 必要に応じて調整、最初はオンにして、必要に応じてオフにすることをお勧めします
        INDEXER_DISABLE_PENDING_TRANSACTIONS_FETCHER: 'true'  # 必要に応じて調整、最初はオンにして、必要に応じてオフにすることをお勧めします

  # その他のサービス設定
  visualizer:
    extends:
      file: ./services/visualizer.yml
      service: visualizer

  sig-provider:
    extends:
      file: ./services/sig-provider.yml
      service: sig-provider

  frontend:
    depends_on:
      - backend
    extends:
      file: ./services/frontend.yml
      service: frontend
    environment:
      NEXT_PUBLIC_NETWORK_ID: 'あなたのチェーンID'  # 例: '262144'
      NEXT_PUBLIC_NETWORK_RPC_URL: https://your-rpc-endpoint
      NEXT_PUBLIC_API_HOST: 'your-domain'  # 例: 'testnetexplorer.karpak.paratrix.xyz'
      NEXT_PUBLIC_API_PROTOCOL: https
      NEXT_PUBLIC_STATS_API_HOST: https://your-domain:8080
      NEXT_PUBLIC_NETWORK_NAME: あなたのネットワーク名
      NEXT_PUBLIC_NETWORK_SHORT_NAME: あなたのネットワーク略称
      NEXT_PUBLIC_NETWORK_ID: あなたのチェーンID
      NEXT_PUBLIC_NETWORK_CURRENCY_NAME: あなたの通貨名
      NEXT_PUBLIC_NETWORK_CURRENCY_SYMBOL: あなたの通貨シンボル
      NEXT_PUBLIC_APP_HOST: your-domain
      NEXT_PUBLIC_APP_PROTOCOL: https
      NEXT_PUBLIC_VISUALIZE_API_HOST: https://your-domain:8081
      NEXT_PUBLIC_IS_TESTNET: true  # あなたのネットワークタイプに応じて設定
      NEXT_PUBLIC_API_WEBSOCKET_PROTOCOL: wss
      NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID: あなたのWalletConnectプロジェクトID # 書かないと契約を検証できません https://cloud.reown.com/
      NEXT_PUBLIC_NETWORK_LOGO: あなたのネットワークLogo URL *OSSに保存することをお勧めします*
      NEXT_PUBLIC_NETWORK_ICON: あなたのネットワークIcon URL *OSSに保存することをお勧めします*

  
  stats-db-init:
    extends:
      file: ./services/stats.yml
      service: stats-db-init

  stats-db:
    depends_on:
      stats-db-init:
        condition: service_completed_successfully
    extends:
      file: ./services/stats.yml
      service: stats-db

  # 統計サービス設定、このサービスがエラーを出すとチャートが見えなくなります
  stats:
    depends_on:
      - stats-db
      - backend
    extends:
      file: ./services/stats.yml
      service: stats
    environment:
      STATS__BLOCKSCOUT_API_URL: https://your-domain # これは簡単に見落とされます

  user-ops-indexer:
    depends_on:
      - db
      - backend
    extends:
      file: ./services/user-ops-indexer.yml
      service: user-ops-indexer

  # プロキシサービス設定
  proxy:
    depends_on:
      - backend
      - frontend
      - stats
    extends:
      file: ./services/nginx.yml
      service: proxy

2.2 関連コマンド:#

# サービスを起動
docker-compose -f custom-rpc.yml up -d

# ログを確認
docker-compose -f custom-rpc.yml logs -f

# サービスを停止
docker-compose -f custom-rpc.yml down

設定ファイルを変更した場合はサービスを再起動し、関連するイメージを再構築する必要があります:

docker-compose -f custom-rpc.yml down
docker-compose -f custom-rpc.yml up -d

2.3 説明#

ここまで来れば、サーバーの IP にアクセスすることで対応するフロントエンドページが表示されるはずです。ブラウザの開発者ツールを開いてネットワークリクエストを確認し、rpc/api が正常に動作しているかをチェックしてください。一部のサービスは ssl のためにクロスオリジンの問題が発生する可能性があるため、nginx で解決します。

3. Nginx プロキシの設定#

3.1 Nginx 設定テンプレートの更新#

docker-compose/proxy/default.conf.templateファイルを編集し、HTTPS サポートを追加します:

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

# HTTPサーバー - HTTPSにリダイレクト
server {
    listen       80;
    server_name  your-domain;
    
    # すべてのHTTPリクエストをHTTPSにリダイレクト
    location / {
        return 301 https://$host$request_uri;
    }
}

# HTTPSサーバー
server {
    listen       443 ssl;
    server_name  your-domain;
    
    # SSL証明書設定
    ssl_certificate     /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    
    proxy_http_version 1.1;

    location ~ ^/(api(?!-docs$)|socket|sitemap.xml|auth/auth0|auth/auth0/callback|auth/logout) {
        proxy_pass            ${BACK_PROXY_PASS};
        proxy_http_version    1.1;
        proxy_set_header      Host $host;
        proxy_set_header      X-Real-IP $remote_addr;
        proxy_set_header      X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header      X-Forwarded-Proto $scheme;
        proxy_set_header      Upgrade $http_upgrade;
        proxy_set_header      Connection $connection_upgrade;
        proxy_cache_bypass    $http_upgrade;
    }
    
    location / {
        proxy_pass            ${FRONT_PROXY_PASS};
        proxy_http_version    1.1;
        proxy_set_header      Host $host;
        proxy_set_header      X-Real-IP $remote_addr;
        proxy_set_header      X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header      X-Forwarded-Proto $scheme;
        proxy_set_header      Upgrade $http_upgrade;
        proxy_set_header      Connection $connection_upgrade;
        proxy_cache_bypass    $http_upgrade;
    }
}

# 統計サービスHTTPS設定 (8080ポート)
server {
    listen       8080 ssl;
    server_name  your-domain;
    
    # SSL証明書設定
    ssl_certificate     /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    
    proxy_http_version 1.1;
    proxy_hide_header Access-Control-Allow-Origin;
    proxy_hide_header Access-Control-Allow-Methods;
    add_header 'Access-Control-Allow-Origin' 'https://your-domain' always;
    add_header 'Access-Control-Allow-Credentials' 'true' always;
    add_header 'Access-Control-Allow-Methods' 'PUT, GET, POST, OPTIONS, DELETE, PATCH' always;

    # その他の設定...
}

# 可視化サービスHTTPS設定 (8081ポート)
server {
    listen       8081 ssl;
    server_name  your-domain;
    
    # SSL証明書設定
    ssl_certificate     /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    
    # その他の設定...
}

3.2 Nginx サービス設定の更新#

docker-compose/services/nginx.ymlファイルを編集し、SSL 証明書のマウントと HTTPS ポートを追加します:

services:
  proxy:
    image: nginx:1.25.1-alpine
    restart: always
    extra_hosts:
      - 'host.docker.internal:host-gateway'
    volumes:
      - "../proxy:/etc/nginx/templates"
      - "/root/certs/live/your-domain/fullchain.pem:/etc/nginx/ssl/fullchain.pem:ro"
      - "/root/certs/live/your-domain/privkey.pem:/etc/nginx/ssl/privkey.pem:ro"
    environment:
      BACK_PROXY_PASS: ${BACK_PROXY_PASS:-http://backend:4000}
      FRONT_PROXY_PASS: ${FRONT_PROXY_PASS:-http://frontend:3000}
    ports:
      - target: 80
        published: 80
      - target: 443
        published: 443
      - target: 8080
        published: 8080
      - target: 8081
        published: 8081

4. サービスを起動#

以下のコマンドを使用して、カスタム Blockscout ブロックチェーンブラウザを起動します:

cd blockscout/docker-compose
docker-compose -f docker-compose/custom-rpc.yml up -d

5. デプロイの検証#

https://your-domainにアクセスして、Blockscout ブロックチェーンブラウザが正常にデプロイされたかを確認します。

よくある問題のトラブルシューティング#

  1. ブロックチェーンノードに接続できない

    • RPC エンドポイントが正しく設定されているか確認
    • ネットワーク接続が正常であることを確認
    • ファイアウォール設定が関連ポートを許可しているか確認
  2. HTTPS 証明書の問題

    • 証明書パスが正しいか確認
    • 証明書が有効であるか確認
    • Nginx 設定が証明書ファイルを正しく参照しているか確認
  3. データベース初期化に失敗

    • データベース設定を確認
    • 詳細なエラーメッセージを得るためにログを確認

まとめ#

以上の手順を通じて、HTTPS および WSS 接続をサポートし、カスタムドメインからアクセスできるカスタム Blockscout ブロックチェーンブラウザを成功裏にデプロイできます。主な変更点は以下の通りです:

  1. HTTPS/SSL サポートの追加
  2. カスタムブロックチェーンネットワークパラメータ
  3. カスタムドメインの設定
  4. RPC エンドポイントの設定
  5. カスタムネットワークブランド(名前、アイコンなど)

具体的なニーズに応じて、上記の設定を調整してください。

参考文献#

[1] docker-compose デプロイメントドキュメントhttps://docs.blockscout.com/setup/deployment/docker-compose-deployment
[2] 環境変数の説明https://docs.blockscout.com/setup/env-variables
[3] フロントエンド環境変数 https://github.com/blockscout/frontend/blob/main/docs/ENVS.md

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。