イントロダクション#
ご存知の通り、blockscout は Ethereum エコシステムのオープンソースブロックチェーンブラウザです。ローカル開発環境で blockscout を開発するのは非常に簡単で、設定ファイルの rpc を少し変更するだけでシームレスに起動できます。しかし、blockscout は頻繁に更新されるため、開発者が自分の運営するチェーンに blockscout をデプロイするのは少し面倒です。変更が必要な設定がやや複雑で、落とし穴も多いため、筆者は詳細なデプロイガイドを提供し、皆さんの参考にしていただければと思います。
全体的な考え方#
全体として、私たちが関心を持つファイルは docker-compose ディレクトリ内にあり、基本的な操作もその下で行います。次に、services ディレクトリ内の docker コンテナサービス設定ファイル、envs ディレクトリ内の環境変数ファイル、proxy ディレクトリ内の Nginx 設定ファイルに注目する必要があります。大まかな手順は以下の通りです:
- SSL 証明書を生成する
- docker-compose 起動ファイルを設定する
- envs 環境設定を変更する
- 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 ブロックチェーンブラウザが正常にデプロイされたかを確認します。
よくある問題のトラブルシューティング#
-
ブロックチェーンノードに接続できない
- RPC エンドポイントが正しく設定されているか確認
- ネットワーク接続が正常であることを確認
- ファイアウォール設定が関連ポートを許可しているか確認
-
HTTPS 証明書の問題
- 証明書パスが正しいか確認
- 証明書が有効であるか確認
- Nginx 設定が証明書ファイルを正しく参照しているか確認
-
データベース初期化に失敗
- データベース設定を確認
- 詳細なエラーメッセージを得るためにログを確認
まとめ#
以上の手順を通じて、HTTPS および WSS 接続をサポートし、カスタムドメインからアクセスできるカスタム Blockscout ブロックチェーンブラウザを成功裏にデプロイできます。主な変更点は以下の通りです:
- HTTPS/SSL サポートの追加
- カスタムブロックチェーンネットワークパラメータ
- カスタムドメインの設定
- RPC エンドポイントの設定
- カスタムネットワークブランド(名前、アイコンなど)
具体的なニーズに応じて、上記の設定を調整してください。
参考文献#
[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