Files
metamask-integration/scripts/deploy-blockscout.sh
2026-03-02 12:14:14 -08:00

383 lines
9.5 KiB
Bash
Executable File

#!/bin/bash
# Deploy Blockscout Explorer for ChainID 138 with MetaMask integration
# This script creates deployment configuration and setup instructions
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
# Colors
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
log_info "========================================="
log_info "Blockscout Deployment Configuration"
log_info "========================================="
log_info ""
# Create deployment directory
DEPLOY_DIR="$PROJECT_ROOT/blockscout-deployment"
mkdir -p "$DEPLOY_DIR"
# Create Docker Compose configuration
log_info "Creating Docker Compose configuration..."
cat > "$DEPLOY_DIR/docker-compose.yml" << 'EOF'
version: "3.8"
services:
blockscout-db:
image: postgres:15
container_name: blockscout-db
environment:
- POSTGRES_USER=blockscout
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-blockscout}
- POSTGRES_DB=blockscout
volumes:
- blockscout-db-data:/var/lib/postgresql/data
networks:
- blockscout-network
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U blockscout"]
interval: 10s
timeout: 5s
retries: 5
blockscout:
image: blockscout/blockscout:latest
container_name: blockscout
depends_on:
blockscout-db:
condition: service_healthy
environment:
# Database
- DATABASE_URL=postgresql://blockscout:${POSTGRES_PASSWORD:-blockscout}@blockscout-db:5432/blockscout
# Network
- ETHEREUM_JSONRPC_HTTP_URL=http://192.168.11.211:8545
- ETHEREUM_JSONRPC_WS_URL=ws://192.168.11.211:8546
- ETHEREUM_JSONRPC_TRACE_URL=http://192.168.11.211:8545
# Chain Configuration
- COIN=ETH
- NETWORK=DeFi Oracle Meta Mainnet
- SUBNETWORK=Mainnet
- BLOCK_TRANSFORMER=base
- CHAIN_ID=138
# Features
- SHOW_ADDRESS_MARKETCAP_PERCENTAGE=true
- ENABLE_ACCOUNT_BALANCE_CACHE=true
- ENABLE_EXCHANGE_RATES=true
- EXCHANGE_RATES_COINGECKO_COIN_ID=ethereum
- ENABLE_SOURCIFY_INTEGRATION=true
- SOURCIFY_SERVER_URL=https://sourcify.dev/server
- ENABLE_TXS_STATS=true
- TXS_STATS_DAYS_TO_COMPILE_AT_INIT=1
# MetaMask Portfolio CORS Configuration
- ENABLE_CORS=true
- CORS_ALLOWED_ORIGINS=https://portfolio.metamask.io,https://metamask.io,https://chainlist.org,https://explorer.d-bis.org
- CORS_ALLOWED_METHODS=GET,POST,OPTIONS
- CORS_ALLOWED_HEADERS=Content-Type,Authorization,Accept
- CORS_MAX_AGE=3600
# Token Metadata API
- ENABLE_TOKEN_METADATA_API=true
- TOKEN_METADATA_CACHE_ENABLED=true
- TOKEN_METADATA_CACHE_TTL=3600
# Logo Serving
- ENABLE_TOKEN_LOGO_SERVING=true
- TOKEN_LOGO_BASE_URL=https://explorer.d-bis.org/images/tokens
# API Rate Limiting
- API_RATE_LIMIT_ENABLED=true
- API_RATE_LIMIT_PER_MINUTE=120
# Security
- SECRET_KEY_BASE=${SECRET_KEY_BASE:-change-me-in-production-use-openssl-rand-hex-32}
ports:
- "4000:4000"
networks:
- blockscout-network
restart: unless-stopped
volumes:
- blockscout-logs:/var/log/blockscout
- blockscout-static:/var/www/blockscout/priv/static
volumes:
blockscout-db-data:
blockscout-logs:
blockscout-static:
networks:
blockscout-network:
driver: bridge
EOF
log_success "Created: $DEPLOY_DIR/docker-compose.yml"
# Create Kubernetes deployment
log_info "Creating Kubernetes deployment configuration..."
cat > "$DEPLOY_DIR/blockscout-deployment.yaml" << 'EOF'
apiVersion: v1
kind: Namespace
metadata:
name: blockscout
---
apiVersion: v1
kind: ConfigMap
metadata:
name: blockscout-config
namespace: blockscout
data:
# Database
DATABASE_URL: "postgresql://blockscout:blockscout@blockscout-db:5432/blockscout"
# Network
ETHEREUM_JSONRPC_HTTP_URL: "http://192.168.11.211:8545"
ETHEREUM_JSONRPC_WS_URL: "ws://192.168.11.211:8546"
ETHEREUM_JSONRPC_TRACE_URL: "http://192.168.11.211:8545"
# Chain Configuration
COIN: "ETH"
NETWORK: "DeFi Oracle Meta Mainnet"
SUBNETWORK: "Mainnet"
BLOCK_TRANSFORMER: "base"
CHAIN_ID: "138"
# MetaMask Portfolio CORS
ENABLE_CORS: "true"
CORS_ALLOWED_ORIGINS: "https://portfolio.metamask.io,https://metamask.io,https://chainlist.org,https://explorer.d-bis.org"
CORS_ALLOWED_METHODS: "GET,POST,OPTIONS"
CORS_ALLOWED_HEADERS: "Content-Type,Authorization,Accept"
CORS_MAX_AGE: "3600"
# Token Metadata API
ENABLE_TOKEN_METADATA_API: "true"
TOKEN_METADATA_CACHE_ENABLED: "true"
TOKEN_METADATA_CACHE_TTL: "3600"
# Logo Serving
ENABLE_TOKEN_LOGO_SERVING: "true"
TOKEN_LOGO_BASE_URL: "https://explorer.d-bis.org/images/tokens"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: blockscout
namespace: blockscout
spec:
replicas: 1
selector:
matchLabels:
app: blockscout
template:
metadata:
labels:
app: blockscout
spec:
containers:
- name: blockscout
image: blockscout/blockscout:latest
ports:
- containerPort: 4000
envFrom:
- configMapRef:
name: blockscout-config
env:
- name: SECRET_KEY_BASE
valueFrom:
secretKeyRef:
name: blockscout-secrets
key: secret-key-base
volumeMounts:
- name: blockscout-static
mountPath: /var/www/blockscout/priv/static
volumes:
- name: blockscout-static
persistentVolumeClaim:
claimName: blockscout-static-pvc
---
apiVersion: v1
kind: Service
metadata:
name: blockscout
namespace: blockscout
spec:
selector:
app: blockscout
ports:
- port: 80
targetPort: 4000
type: LoadBalancer
EOF
log_success "Created: $DEPLOY_DIR/blockscout-deployment.yaml"
# Create deployment checklist
cat > "$DEPLOY_DIR/DEPLOYMENT_CHECKLIST.md" << 'EOF'
# Blockscout Deployment Checklist
## Pre-Deployment
- [ ] Server/Cluster is provisioned
- [ ] Docker/Kubernetes is installed
- [ ] Database is ready
- [ ] RPC endpoints are accessible
- [ ] DNS is configured
- [ ] SSL certificates are ready
## Deployment Steps
### Docker Compose Deployment
1. **Prepare Environment**:
```bash
cd blockscout-deployment
cp .env.example .env
# Edit .env with your values
```
2. **Generate Secret Key**:
```bash
SECRET_KEY_BASE=$(openssl rand -hex 32)
echo "SECRET_KEY_BASE=$SECRET_KEY_BASE" >> .env
```
3. **Start Services**:
```bash
docker-compose up -d
```
4. **Verify Deployment**:
```bash
docker-compose ps
docker-compose logs blockscout
```
5. **Access Blockscout**:
- URL: http://localhost:4000
- Or via nginx reverse proxy
### Kubernetes Deployment
1. **Create Namespace**:
```bash
kubectl apply -f blockscout-deployment.yaml
```
2. **Create Secrets**:
```bash
kubectl create secret generic blockscout-secrets \
--from-literal=secret-key-base=$(openssl rand -hex 32) \
-n blockscout
```
3. **Verify Deployment**:
```bash
kubectl get pods -n blockscout
kubectl get services -n blockscout
```
4. **Check Logs**:
```bash
kubectl logs -f deployment/blockscout -n blockscout
```
## Post-Deployment
- [ ] Blockscout is accessible
- [ ] CORS headers are configured
- [ ] Token metadata API works
- [ ] Logo serving works
- [ ] Explorer shows transactions
- [ ] API endpoints are accessible
- [ ] Portfolio integration tested
## Verification
### Test Blockscout
```bash
# Test Blockscout is running
curl http://localhost:4000/api/v2/health
# Test CORS headers
curl -I -X OPTIONS http://localhost:4000/api/v2/tokens/0x... \
-H "Origin: https://portfolio.metamask.io" \
-H "Access-Control-Request-Method: GET"
# Test token metadata API
curl http://localhost:4000/api/v2/tokens/0x93E66202A11B1772E55407B32B44e5Cd8eda7f22
```
### Expected Results
- ✅ Blockscout is accessible
- ✅ CORS headers are present
- ✅ Token metadata API returns data
- ✅ Logo URLs are accessible
- ✅ Transactions are visible
## Troubleshooting
### Blockscout Not Starting
1. Check database connection
2. Check RPC endpoint accessibility
3. Check logs: `docker-compose logs blockscout`
4. Verify environment variables
5. Check resource limits
### CORS Not Working
1. Verify CORS environment variables
2. Check nginx configuration (if using reverse proxy)
3. Test CORS headers
4. Verify allowed origins
### API Not Working
1. Check API endpoints are enabled
2. Verify database is populated
3. Check API logs
4. Test API endpoints directly
---
**Last Updated**: 2026-01-26
EOF
log_success "Created: $DEPLOY_DIR/DEPLOYMENT_CHECKLIST.md"
log_info ""
log_info "========================================="
log_info "Blockscout Deployment Config Complete!"
log_info "========================================="
log_info ""
log_info "Files created in: $DEPLOY_DIR"
log_info " - docker-compose.yml (Docker deployment)"
log_info " - blockscout-deployment.yaml (Kubernetes deployment)"
log_info " - DEPLOYMENT_CHECKLIST.md (deployment guide)"
log_info ""
log_info "Next steps:"
log_info "1. Review deployment files"
log_info "2. Configure environment variables"
log_info "3. Deploy Blockscout"
log_info "4. Verify CORS configuration"
log_info "5. Test Portfolio integration"
log_info ""