Migration Guide
How to migrate your existing blockchain infrastructure to ChainLaunch from manual setups, Docker Compose, Kubernetes, or other platforms.
Migration Paths
| From | Complexity | What migrates | What doesn't |
|---|---|---|---|
| Manual Docker/Docker Compose | Low | Network config, keys, ledger data | Docker Compose files (replaced by ChainLaunch) |
| Hyperledger Bevel | Medium | Network topology, crypto material, channels | Helm charts, K8s manifests |
| Kubernetes (manual) | Medium | Network config, persistent volumes | K8s manifests, operators |
| Kaleido / Chainstack | Medium-High | Network config, keys (if exportable) | Platform-specific features |
| Another ChainLaunch instance | Low | Everything via backup/restore or templates | Instance-specific settings |
Migrate from Docker Compose
This is the most common migration path — you have a Fabric or Besu network running in Docker containers managed by docker-compose.yml.
Step 1: Install ChainLaunch
curl -fsSL https://chainlaunch.dev/deploy.sh | bash
Step 2: Document Your Current Network
Before migrating, inventory your existing setup:
# List running blockchain containers
docker ps --filter "label=org.hyperledger" --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}"
# For Fabric — find your crypto material
ls crypto-config/ # or organizations/ depending on your setup
# For Besu — find your genesis and keys
cat genesis.json
ls keys/
Record:
- Organization names and MSP IDs (Fabric)
- Number of peers, orderers, CAs per org
- Channel names and member orgs
- Validator addresses (Besu)
- Chain ID and consensus settings (Besu)
Step 3: Create Organizations in ChainLaunch
For each organization in your existing network:
# Via API
curl -X POST http://localhost:8100/api/v1/organizations \
-H "Content-Type: application/json" \
-d '{
"name": "Org1",
"mspId": "Org1MSP",
"description": "Migrated from Docker Compose"
}'
Step 4: Import Crypto Material
ChainLaunch can import existing keys and certificates:
# Import an existing CA certificate + key
curl -X POST http://localhost:8100/api/v1/keys/import \
-H "Content-Type: application/json" \
-d '{
"name": "org1-ca-key",
"type": "CA",
"organizationId": 1,
"certificate": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
"privateKey": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----"
}'
Repeat for each organization's CA, TLS, and identity keys.
Step 5: Create Nodes
Create nodes in ChainLaunch that correspond to your existing containers:
curl -X POST http://localhost:8100/api/v1/nodes \
-H "Content-Type: application/json" \
-d '{
"name": "peer0-org1",
"platform": "FABRIC",
"nodeType": "FABRIC_PEER",
"organizationId": 1
}'
Step 6: Stop Old Containers and Start New Ones
# Stop the old Docker Compose setup
docker-compose down
# Start nodes via ChainLaunch
curl -X POST http://localhost:8100/api/v1/nodes/{nodeId}/start
Step 7: Verify
# Check all nodes are running
curl http://localhost:8100/api/v1/nodes | jq '.[].status'
# Check channels (Fabric)
curl http://localhost:8100/api/v1/networks | jq '.[].name'
Migrate from Hyperledger Bevel
Bevel uses Helm charts on Kubernetes. The key difference is that Bevel manages crypto material in Vault and network config in Helm values files.
Step 1: Export from Bevel
# Export crypto material from Vault
vault kv get -format=json secret/crypto/peerOrganizations/org1/peers/peer0/msp > peer0-msp.json
# Export channel config
kubectl exec -it peer0-org1 -- peer channel fetch config -o orderer:7050 -c mychannel
# Export genesis block (Besu)
kubectl exec -it validator-0 -- cat /data/genesis.json > genesis.json
Step 2: Install ChainLaunch and Import
Follow Steps 1-5 from the Docker Compose migration above, using the exported crypto material.
Step 3: Recreate Network Topology
Use ChainLaunch's testnet command to recreate the network structure, then import the existing ledger data:
# Create the network structure
chainlaunch testnet fabric \
--name migrated-network \
--org "Org1MSP,Org2MSP" \
--peerOrgs "Org1MSP,Org2MSP" \
--ordererOrgs "Org1MSP" \
--channels mychannel \
--peerCounts "Org1MSP=2,Org2MSP=1" \
--ordererCounts "Org1MSP=3"
Migrate Between ChainLaunch Instances
The easiest migration — use backup/restore or network templates.
Option A: Backup and Restore
# On the source instance: create a backup
curl -X POST http://localhost:8100/api/v1/backups \
-H "Content-Type: application/json" \
-d '{"targetId": 1}'
# On the target instance: restore
chainlaunch backup restore \
--s3-endpoint="..." \
--bucket-name="..." \
--output="$HOME/chainlaunch-restore"
See Restore from Backup for the full procedure.
Option B: Network Templates (Pro)
Export a network as a portable template and import it on another instance:
# Export
curl http://localhost:8100/api/v1/networks/templates/export/1 > my-network-template.json
# Validate on the target
curl -X POST http://localhost:8100/api/v1/networks/templates/validate \
-H "Content-Type: application/json" \
-d @my-network-template.json
# Import
curl -X POST http://localhost:8100/api/v1/networks/templates/import \
-H "Content-Type: application/json" \
-d @my-network-template.json
Templates include variable placeholders (${orgName.mspId}) that are resolved during import, making them portable across environments.
Post-Migration Checklist
- All organizations created with correct MSP IDs
- All nodes running and healthy
- Channels/networks visible in the dashboard
- Chaincode/smart contracts deployed and queryable
- Monitoring configured for the new nodes
- Backup schedule configured
- Old infrastructure decommissioned
- DNS records updated (if applicable)
- Team members have access (RBAC configured)
Troubleshooting
Ledger data not syncing
If peers can't sync existing ledger data after migration:
- Ensure the genesis block matches the original network
- Check that the MSP IDs match exactly (case-sensitive)
- Verify the orderer TLS certificates are correct
Certificate mismatch
If nodes can't communicate after migration:
- Re-export and re-import the TLS certificates
- Ensure the CA chain is complete (root CA + intermediate CAs)
- Check that certificate subject names match the node hostnames
Next Steps
- Quick Start if starting fresh instead of migrating
- Backups to protect your migrated network
- Network Templates for portable network definitions