383 lines
9.5 KiB
Bash
383 lines
9.5 KiB
Bash
|
|
#!/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 ""
|