260 lines
7.9 KiB
Bash
260 lines
7.9 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# Final fix for Firefly - direct approach
|
||
|
|
# Usage: ./scripts/fix-firefly-final.sh
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
R630_02_IP="192.168.11.12"
|
||
|
|
ML110_IP="192.168.11.10"
|
||
|
|
RPC_IP="192.168.11.250"
|
||
|
|
|
||
|
|
# Colors
|
||
|
|
RED='\033[0;31m'
|
||
|
|
GREEN='\033[0;32m'
|
||
|
|
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"; }
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
log_info "═══════════════════════════════════════════════════════════"
|
||
|
|
log_info " FINAL FIREFLY FIX"
|
||
|
|
log_info "═══════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
# Fix VMID 6200 - Direct file edit
|
||
|
|
log_info "Fixing VMID 6200 - Removing port 5001 from docker-compose.yml..."
|
||
|
|
|
||
|
|
ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@${R630_02_IP} \
|
||
|
|
"pct exec 6200 -- bash" <<'EOF'
|
||
|
|
cd /opt/firefly
|
||
|
|
|
||
|
|
# Read the file, remove the port 5001 line specifically for firefly-core
|
||
|
|
python3 <<'PYTHON_EOF'
|
||
|
|
import re
|
||
|
|
|
||
|
|
with open('docker-compose.yml', 'r') as f:
|
||
|
|
content = f.read()
|
||
|
|
|
||
|
|
# Find firefly-core section and remove port 5001 line
|
||
|
|
lines = content.split('\n')
|
||
|
|
result = []
|
||
|
|
in_firefly_core = False
|
||
|
|
in_ports = False
|
||
|
|
skip_next = False
|
||
|
|
|
||
|
|
for i, line in enumerate(lines):
|
||
|
|
if 'firefly-core:' in line:
|
||
|
|
in_firefly_core = True
|
||
|
|
in_ports = False
|
||
|
|
result.append(line)
|
||
|
|
elif in_firefly_core and line.strip().startswith('ports:'):
|
||
|
|
in_ports = True
|
||
|
|
result.append(line)
|
||
|
|
elif in_firefly_core and in_ports and '- "5001:5001"' in line:
|
||
|
|
# Skip this line
|
||
|
|
continue
|
||
|
|
elif in_firefly_core and in_ports and line.strip() and not line[0].isspace():
|
||
|
|
# End of ports section
|
||
|
|
in_ports = False
|
||
|
|
result.append(line)
|
||
|
|
elif in_firefly_core and line.strip() and not line[0].isspace() and ':' in line:
|
||
|
|
# New service or section
|
||
|
|
in_firefly_core = False
|
||
|
|
in_ports = False
|
||
|
|
result.append(line)
|
||
|
|
else:
|
||
|
|
result.append(line)
|
||
|
|
|
||
|
|
with open('docker-compose.yml', 'w') as f:
|
||
|
|
f.write('\n'.join(result))
|
||
|
|
|
||
|
|
print("docker-compose.yml updated")
|
||
|
|
PYTHON_EOF
|
||
|
|
|
||
|
|
# Verify
|
||
|
|
echo "Verifying ports configuration:"
|
||
|
|
grep -A 10 'firefly-core:' docker-compose.yml | grep -E 'ports:|"500' || echo "Port 5001 removed"
|
||
|
|
EOF
|
||
|
|
|
||
|
|
log_success "Configuration updated"
|
||
|
|
|
||
|
|
# Remove all firefly-core containers and networks
|
||
|
|
log_info "Cleaning up containers and networks..."
|
||
|
|
ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@${R630_02_IP} \
|
||
|
|
"pct exec 6200 -- bash" <<'EOF'
|
||
|
|
cd /opt/firefly
|
||
|
|
docker-compose stop firefly-core 2>/dev/null || true
|
||
|
|
docker rm -f firefly-core 2>/dev/null || true
|
||
|
|
docker network prune -f 2>/dev/null || true
|
||
|
|
echo "Cleanup complete"
|
||
|
|
EOF
|
||
|
|
|
||
|
|
# Start firefly-core
|
||
|
|
log_info "Starting firefly-core..."
|
||
|
|
ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@${R630_02_IP} \
|
||
|
|
"pct exec 6200 -- bash" <<'EOF'
|
||
|
|
cd /opt/firefly
|
||
|
|
docker-compose up -d firefly-core
|
||
|
|
sleep 5
|
||
|
|
docker ps --format '{{.Names}}\t{{.Status}}' | grep firefly
|
||
|
|
EOF
|
||
|
|
|
||
|
|
# For VMID 6201 - Create new container with correct storage
|
||
|
|
log_info "Setting up VMID 6201..."
|
||
|
|
|
||
|
|
# Check if we can migrate or need to recreate
|
||
|
|
log_info "VMID 6201 requires storage migration. Options:"
|
||
|
|
log_info "1. Recreate container with correct storage (recommended)"
|
||
|
|
log_info "2. Migrate storage (if data is important)"
|
||
|
|
|
||
|
|
log_warn "VMID 6201 will be recreated with correct storage..."
|
||
|
|
log_info "Creating new Firefly container on ml110..."
|
||
|
|
|
||
|
|
# Create new container (6201) with correct storage
|
||
|
|
ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@${ML110_IP} \
|
||
|
|
"pct create 6201 local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst \
|
||
|
|
--hostname firefly-ali-1 \
|
||
|
|
--net0 name=eth0,bridge=vmbr0,ip=192.168.11.57/24,gw=192.168.11.1 \
|
||
|
|
--rootfs local:50 \
|
||
|
|
--memory 2048 \
|
||
|
|
--cores 2 \
|
||
|
|
--storage local \
|
||
|
|
--unprivileged 0 2>&1" || log_warn "Container may already exist or template issue"
|
||
|
|
|
||
|
|
# Start and configure
|
||
|
|
if ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@${ML110_IP} \
|
||
|
|
"pct start 6201 2>&1"; then
|
||
|
|
sleep 5
|
||
|
|
|
||
|
|
log_info "Installing Docker..."
|
||
|
|
ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@${ML110_IP} \
|
||
|
|
"pct exec 6201 -- bash" <<'EOF'
|
||
|
|
apt-get update -qq >/dev/null 2>&1
|
||
|
|
apt-get install -y docker.io docker-compose python3 >/dev/null 2>&1
|
||
|
|
systemctl enable docker >/dev/null 2>&1
|
||
|
|
systemctl start docker >/dev/null 2>&1
|
||
|
|
echo "Docker installed"
|
||
|
|
EOF
|
||
|
|
|
||
|
|
log_info "Creating Firefly installation..."
|
||
|
|
ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@${ML110_IP} \
|
||
|
|
"pct exec 6201 -- bash" <<EOF
|
||
|
|
mkdir -p /opt/firefly
|
||
|
|
|
||
|
|
cat > /opt/firefly/docker-compose.yml <<'COMPOSE_EOF'
|
||
|
|
version: '3.8'
|
||
|
|
|
||
|
|
services:
|
||
|
|
postgres:
|
||
|
|
image: postgres:15-alpine
|
||
|
|
container_name: firefly-postgres
|
||
|
|
environment:
|
||
|
|
POSTGRES_USER: firefly
|
||
|
|
POSTGRES_PASSWORD: \${DB_PASSWORD:-firefly}
|
||
|
|
POSTGRES_DB: firefly
|
||
|
|
volumes:
|
||
|
|
- postgres-data:/var/lib/postgresql/data
|
||
|
|
restart: unless-stopped
|
||
|
|
networks:
|
||
|
|
- firefly-network
|
||
|
|
|
||
|
|
ipfs:
|
||
|
|
image: ipfs/kubo:latest
|
||
|
|
container_name: firefly-ipfs
|
||
|
|
ports:
|
||
|
|
- "5001:5001"
|
||
|
|
- "4001:4001"
|
||
|
|
volumes:
|
||
|
|
- ipfs-data:/data/ipfs
|
||
|
|
restart: unless-stopped
|
||
|
|
networks:
|
||
|
|
- firefly-network
|
||
|
|
|
||
|
|
firefly-core:
|
||
|
|
image: ghcr.io/hyperledger/firefly:latest
|
||
|
|
container_name: firefly-core
|
||
|
|
depends_on:
|
||
|
|
- postgres
|
||
|
|
- ipfs
|
||
|
|
environment:
|
||
|
|
- FF_DATABASE_TYPE=postgres
|
||
|
|
- FF_DATABASE_URL=postgres://firefly:\${DB_PASSWORD:-firefly}@postgres:5432/firefly?sslmode=disable
|
||
|
|
- FF_BLOCKCHAIN_TYPE=ethereum
|
||
|
|
- FF_BLOCKCHAIN_RPC=http://${RPC_IP}:8545
|
||
|
|
- FF_BLOCKCHAIN_WS=ws://${RPC_IP}:8546
|
||
|
|
- FF_CHAIN_ID=\${CHAIN_ID:-138}
|
||
|
|
- FF_NODE_NAME=firefly-node-ali-1
|
||
|
|
- FF_API_PUBLICURL=\${PUBLIC_URL:-http://localhost:5000}
|
||
|
|
- FF_IPFS_API=http://ipfs:5001
|
||
|
|
- FF_IPFS_GATEWAY=http://ipfs:8080
|
||
|
|
- FF_LOGGING_LEVEL=info
|
||
|
|
ports:
|
||
|
|
- "5000:5000"
|
||
|
|
volumes:
|
||
|
|
- firefly-data:/var/lib/firefly
|
||
|
|
restart: unless-stopped
|
||
|
|
networks:
|
||
|
|
- firefly-network
|
||
|
|
|
||
|
|
volumes:
|
||
|
|
postgres-data:
|
||
|
|
ipfs-data:
|
||
|
|
firefly-data:
|
||
|
|
|
||
|
|
networks:
|
||
|
|
firefly-network:
|
||
|
|
driver: bridge
|
||
|
|
COMPOSE_EOF
|
||
|
|
|
||
|
|
cat > /etc/systemd/system/firefly.service <<'SERVICE_EOF'
|
||
|
|
[Unit]
|
||
|
|
Description=Hyperledger Firefly
|
||
|
|
After=docker.service
|
||
|
|
Requires=docker.service
|
||
|
|
|
||
|
|
[Service]
|
||
|
|
Type=oneshot
|
||
|
|
RemainAfterExit=yes
|
||
|
|
WorkingDirectory=/opt/firefly
|
||
|
|
ExecStart=/usr/bin/docker-compose -f /opt/firefly/docker-compose.yml up -d
|
||
|
|
ExecStop=/usr/bin/docker-compose -f /opt/firefly/docker-compose.yml down
|
||
|
|
Restart=on-failure
|
||
|
|
|
||
|
|
[Install]
|
||
|
|
WantedBy=multi-user.target
|
||
|
|
SERVICE_EOF
|
||
|
|
|
||
|
|
systemctl daemon-reload
|
||
|
|
systemctl enable firefly.service
|
||
|
|
systemctl start firefly.service
|
||
|
|
sleep 5
|
||
|
|
docker ps --format '{{.Names}}\t{{.Status}}' | grep firefly || echo "Starting..."
|
||
|
|
EOF
|
||
|
|
else
|
||
|
|
log_warn "Could not start container 6201"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Final status
|
||
|
|
echo ""
|
||
|
|
log_info "═══════════════════════════════════════════════════════════"
|
||
|
|
log_info " FINAL STATUS"
|
||
|
|
log_info "═══════════════════════════════════════════════════════════"
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
log_info "VMID 6200 (r630-02):"
|
||
|
|
ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@${R630_02_IP} \
|
||
|
|
"pct exec 6200 -- docker ps --format '{{.Names}}\t{{.Status}}' 2>/dev/null | grep firefly" || echo " Checking..."
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
log_info "VMID 6201 (ml110):"
|
||
|
|
ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no root@${ML110_IP} \
|
||
|
|
"pct exec 6201 -- docker ps --format '{{.Names}}\t{{.Status}}' 2>/dev/null | grep firefly" || echo " Checking..."
|
||
|
|
|
||
|
|
echo ""
|
||
|
|
log_success "Fix complete!"
|