- SANKOFA_CUTOVER_PLAN: live backends table, fix TBDs, historical step labels - SANKOFA_THE_ORDER_CHECKLIST: replace with done + bypass + pointers - DNS comprehensive + streamlined tables: the-order row and sankofa zone live - E2E Cloudflare runbook: the-order backend column Made-with: Cursor
14 KiB
Sankofa Cutover Plan
Last Updated: 2026-03-27
Document Version: 1.1
Status: Active Documentation (historical procedure + live targets)
Live NPM routing (2026-03-27): Sankofa / Phoenix / The Order / Studio are on production backends. Canonical: ALL_VMIDS_ENDPOINTS.md, RPC_ENDPOINTS_MASTER.md. The Order: NPM → 192.168.11.39:80 (VMID 10210 HAProxy) → 192.168.11.51:3000 (portal 7801). Fleet updater: scripts/nginx-proxy-manager/update-npmplus-proxy-hosts-api.sh. NPM proxy host numeric IDs below may differ from your DB—verify in NPM UI.
Date: 2026-01-20
Status: Cutover Plan for Sankofa Services Deployment
Purpose: Step-by-step plan to cutover Sankofa domains from temporary Blockscout routing to actual Sankofa services
Current state (post-cutover)
Sankofa zone domains (authoritative backends)
| Domain | NPMplus forwards to (HTTP) | Origin stack | Notes |
|---|---|---|---|
sankofa.nexus, www.sankofa.nexus |
192.168.11.51:3000 |
VMID 7801 portal | www → 301 apex in NPM |
phoenix.sankofa.nexus, www.phoenix.sankofa.nexus |
192.168.11.50:4000 |
VMID 7800 API | www → 301 apex |
the-order.sankofa.nexus, www.the-order.sankofa.nexus |
192.168.11.39:80 |
VMID 10210 → .51:3000 |
www → 301 apex; HAProxy: provision-order-haproxy-10210.sh |
studio.sankofa.nexus |
192.168.11.72:8000 |
VMID 7805 | — |
SSL: Terminated at NPMplus (Let’s Encrypt). Do not point these hostnames at Blockscout (192.168.11.140) except for explorer domains.
Historical note (pre-2026 cutover)
Previously these hostnames temporarily targeted Blockscout. The step-by-step below documents that migration; IDs (SSL cert / proxy host #) were examples—confirm in your NPMplus instance.
Pre-Cutover Checklist
Before proceeding with cutover, verify:
1. Sankofa Services Deployed and Validated
- Sankofa services deployed on Proxmox VMs
- VMIDs assigned and documented
- IP addresses assigned and documented
- Services running and healthy
- Health endpoints responding
Verification Commands:
# Check if Sankofa VMs exist
for vmid in <SANKOFA_VMIDS>; do
ssh root@<PROXMOX_HOST> "pct status $vmid"
done
# Test health endpoints
for ip in <SANKOFA_IPS>; do
curl -I http://$ip:80
done
2. VMIDs and IPs Assigned
Document the following before cutover:
| Domain | Target VMID | Target IP | Target Port | Service Type | Notes |
|---|---|---|---|---|---|
sankofa.nexus |
7801 | 192.168.11.51 | 3000 | Portal | Sankofa Portal (Microsoft Website) |
www.sankofa.nexus |
7801 | 192.168.11.51 | 3000 | Portal | Sankofa Portal (Microsoft Website) |
phoenix.sankofa.nexus |
7800 | 192.168.11.50 | 4000 | API | Phoenix API (Azure-like Portal) |
www.phoenix.sankofa.nexus |
7800 | 192.168.11.50 | 4000 | API | Phoenix API (Azure-like Portal) |
the-order.sankofa.nexus |
10210 | 192.168.11.39 | 80 | HAProxy edge | Proxies to portal 7801 :3000; app the_order |
Note: www.the-order.sankofa.nexus uses the same NPM upstream as apex; NPM advanced_config 301 → https://the-order.sankofa.nexus.
3. Health Endpoints Verified
- All Sankofa services have health endpoints
- Health endpoints return HTTP 200 or appropriate status
- Health endpoints respond within acceptable timeout
Example Health Check:
# Test health endpoint
curl -I http://<SANKOFA_IP>:<PORT>/health
# Expected: HTTP 200
4. Internal Connectivity Tested
- NPMplus can reach Sankofa services internally
- Test from NPMplus container:
curl -I http://<SANKOFA_IP>:<PORT> - Verify no firewall rules blocking internal traffic
Verification Command:
NPMPLUS_VMID=10233
NPMPLUS_HOST=192.168.11.11
ssh root@"$NPMPLUS_HOST" "pct exec $NPMPLUS_VMID -- curl -I http://<SANKOFA_IP>:<PORT>"
5. SSL Certificates Valid
- Verify certificates exist for all 5 Sankofa domains
- Check certificate expiration dates
- Renew certificates if expired (or allow auto-renewal)
Verification Command:
bash scripts/verify/export-npmplus-config.sh
# Check certificates.json for Sankofa domains
Cutover Steps
Step 1: Verify Current State
Before making changes, document current state:
- Export Current NPMplus Configuration:
bash scripts/verify/export-npmplus-config.sh
- Verify Current Routing:
# Check current proxy hosts for Sankofa domains
NPM_URL="https://192.168.11.166:81"
NPM_EMAIL="nsatoshi2007@hotmail.com"
# Note: Use .env file for credentials in production
# NPM_PASSWORD="your-password" # Set in .env file
TOKEN_RESPONSE=$(curl -s -k -X POST "$NPM_URL/api/tokens" \
-H "Content-Type: application/json" \
-d "{\"identity\":\"$NPM_EMAIL\",\"secret\":\"$NPM_PASSWORD\"}")
TOKEN=$(echo "$TOKEN_RESPONSE" | jq -r '.token')
# Get current proxy host for sankofa.nexus (example)
curl -s -k -X GET "$NPM_URL/api/nginx/proxy-hosts" \
-H "Authorization: Bearer $TOKEN" | \
jq '.[] | select(.domain_names[] == "sankofa.nexus")'
- Document state (historical pre-cutover):
- Before cutover, these domains pointed at
192.168.11.140:80(Blockscout) - SSL certificates existed (example IDs: 51, 57, 60, 63, 64); proxy hosts (example 21–25)—confirm in your NPM DB
- Before cutover, these domains pointed at
Step 2: Deploy Sankofa Services
Complete Sankofa service deployment:
-
Deploy Services:
- Deploy Sankofa services on Proxmox VMs
- Assign VMIDs and IP addresses
- Configure services (nginx if needed, application config, etc.)
-
Verify Services Running:
for vmid in <SANKOFA_VMIDS>; do
ssh root@<PROXMOX_HOST> "pct status $vmid"
ssh root@<PROXMOX_HOST> "pct exec $vmid -- curl -I http://localhost:<PORT>"
done
- Document actual IPs/ports (✅ filled in Current state section and ALL_VMIDS_ENDPOINTS.md)
Step 3: Update NPMplus Proxy Hosts
Update all 5 Sankofa proxy hosts to point to actual services:
Option A: Update via NPMplus API
NPM_URL="https://192.168.11.166:81"
NPM_EMAIL="nsatoshi2007@hotmail.com"
# Note: Use .env file for credentials in production
# NPM_PASSWORD="your-password" # Set in .env file
TOKEN_RESPONSE=$(curl -s -k -X POST "$NPM_URL/api/tokens" \
-H "Content-Type: application/json" \
-d "{\"identity\":\"$NPM_EMAIL\",\"secret\":\"$NPM_PASSWORD\"}")
TOKEN=$(echo "$TOKEN_RESPONSE" | jq -r '.token')
# Update sankofa.nexus (example)
# Replace <TARGET_IP> and <TARGET_PORT> with actual values
HOST_ID=21
curl -s -k -X PUT "$NPM_URL/api/nginx/proxy-hosts/$HOST_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"forward_scheme": "http",
"forward_host": "<TARGET_IP>",
"forward_port": <TARGET_PORT>,
"allow_websocket_upgrade": false
}'
Option B: Update via NPMplus Web UI
- Access NPMplus:
https://192.168.11.166:81 - Navigate to: Proxy Hosts
- For each Sankofa domain:
- Click Edit
- Update Forward Hostname/IP:
<TARGET_IP> - Update Forward Port:
<TARGET_PORT> - Update Forward Scheme:
http(orhttpsif needed) - Save
Domains to Update:
| Domain | Proxy Host ID | Current Backend | New Backend |
|---|---|---|---|
sankofa.nexus |
21 | 192.168.11.140:80 | 192.168.11.51:3000 |
www.sankofa.nexus |
22 | 192.168.11.140:80 | 192.168.11.51:3000 |
phoenix.sankofa.nexus |
23 | 192.168.11.140:80 | 192.168.11.50:4000 |
www.phoenix.sankofa.nexus |
24 | 192.168.11.140:80 | 192.168.11.50:4000 |
the-order.sankofa.nexus |
25 (example) | 192.168.11.140:80 (old) | 192.168.11.39:80 (10210 HAProxy) |
Note: Use update-npmplus-proxy-hosts-api.sh for domain-based updates; proxy host IDs vary.
Step 4: Verify SSL Certificates
Check certificate validity:
- Verify Certificates Exist:
bash scripts/verify/export-npmplus-config.sh
# Check certificates.json for Sankofa domains
- Check Certificate Expiration:
# For each Sankofa domain
for domain in sankofa.nexus www.sankofa.nexus phoenix.sankofa.nexus www.phoenix.sankofa.nexus the-order.sankofa.nexus; do
echo | openssl s_client -connect "$domain:443" -servername "$domain" 2>/dev/null | \
openssl x509 -noout -dates
done
- Renew if Expired (if needed):
- Access NPMplus UI
- Navigate to SSL Certificates
- Select certificate and click Renew
- Or wait for auto-renewal (if enabled)
Expected: All certificates valid until 2026-04-16 (auto-renewal enabled).
Step 5: Test End-to-End Routing
Verify complete routing flow:
- Test DNS Resolution:
for domain in sankofa.nexus www.sankofa.nexus phoenix.sankofa.nexus www.phoenix.sankofa.nexus the-order.sankofa.nexus; do
echo -n "$domain: "
dig +short "$domain" @8.8.8.8
done
- Test HTTPS Requests:
for domain in sankofa.nexus www.sankofa.nexus phoenix.sankofa.nexus www.phoenix.sankofa.nexus the-order.sankofa.nexus; do
echo -n "$domain: "
curl -s -o /dev/null -w "%{http_code}" "https://$domain"
echo ""
done
- Test Internal Connectivity:
NPMPLUS_VMID=10233
NPMPLUS_HOST=192.168.11.11
for ip in <SANKOFA_IPS>; do
ssh root@"$NPMPLUS_HOST" "pct exec $NPMPLUS_VMID -- curl -I http://$ip:<PORT>"
done
Expected Results:
- DNS resolves to
76.53.10.36 - HTTPS requests return HTTP 200 (or appropriate status)
- SSL certificates valid and match domains
- Internal connectivity succeeds
Step 6: Update Source-of-Truth Data
Update canonical data model:
- Run Verification:
bash scripts/verify/run-full-verification.sh
- Review Generated JSON:
cat docs/04-configuration/INGRESS_SOURCE_OF_TRUTH.json | jq '.backend_vms[] | select(.public_domains[] | contains("sankofa"))'
- Update Status Fields:
- Change
status: "documented"tostatus: "verified"for Sankofa domains - Update
backend_vmsarray with actual Sankofa VM details - Remove Sankofa from
issuesarray (or mark as resolved)
- Change
Step 7: Update baseline documentation
Status 2026-03-27: Comprehensive and streamlined DNS/NPM tables, RPC_ENDPOINTS_MASTER, and ALL_VMIDS_ENDPOINTS list live backends (including The Order via 10210). Re-open this step only if VMIDs or IPs change.
Rollback Plan
If cutover fails or issues occur:
Immediate Rollback (Within 5 Minutes)
- Restore NPMplus Proxy Hosts:
# Restore sankofa.nexus to Blockscout (example)
HOST_ID=21
curl -s -k -X PUT "$NPM_URL/api/nginx/proxy-hosts/$HOST_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"forward_scheme": "http",
"forward_host": "192.168.11.140",
"forward_port": 80,
"allow_websocket_upgrade": false
}'
-
Repeat for All 5 Domains:
- Update all 5 proxy hosts back to
192.168.11.140:80
- Update all 5 proxy hosts back to
-
Verify Rollback:
# Test domains
for domain in sankofa.nexus www.sankofa.nexus phoenix.sankofa.nexus www.phoenix.sankofa.nexus the-order.sankofa.nexus; do
curl -I "https://$domain"
done
Complete Rollback (If Needed)
-
Restore from Backup:
- If NPMplus backup exists, restore database
- Or manually update all proxy hosts via UI
-
Verify Services:
- Verify Blockscout still responds on
192.168.11.140:80 - Test all Sankofa domains route to Blockscout
- Verify Blockscout still responds on
Post-Cutover Validation Checklist
After cutover, verify:
1. DNS Resolution
- All Sankofa domains resolve to
76.53.10.36 - DNS propagation complete (test from external DNS servers)
2. SSL Certificates
- All certificates valid and match domains
- No certificate errors in browser
- Certificate chain valid
3. HTTPS Requests
- All Sankofa domains respond with HTTP 200 (or appropriate status)
- No 502 Bad Gateway errors
- No 503 Service Unavailable errors
4. Service Functionality
- Sankofa services accessible via HTTPS
- All features working correctly
- Health endpoints responding
5. Internal Connectivity
- NPMplus can reach all Sankofa services
- Internal HTTP requests succeed
- No firewall issues
6. Monitoring
- Set up monitoring for Sankofa services
- Configure alerts for service downtime
- Monitor certificate expiration
Verification Scripts
Run full verification after cutover:
# Full verification
bash scripts/verify/run-full-verification.sh
# Specific tests
bash scripts/verify/verify-end-to-end-routing.sh
bash scripts/verify/verify-backend-vms.sh
bash scripts/verify/export-npmplus-config.sh
Timeline Estimate
| Task | Estimated Time | Notes |
|---|---|---|
| Pre-cutover verification | 30 minutes | Verify services deployed |
| Update NPMplus proxy hosts | 15 minutes | 5 domains to update |
| Verify SSL certificates | 10 minutes | Check expiration |
| Test end-to-end routing | 20 minutes | Test all domains |
| Update documentation | 15 minutes | Update source-of-truth and baseline docs |
| Total | 90 minutes | Without rollback |
Success Criteria
Cutover is successful if:
- ✅ All 5 Sankofa domains route to actual Sankofa services (not Blockscout)
- ✅ All SSL certificates valid and working
- ✅ All HTTPS requests return HTTP 200 (or appropriate status)
- ✅ Internal connectivity verified
- ✅ Source-of-truth JSON updated
- ✅ Baseline documentation updated
Related Documentation
- Verification Runbook:
docs/04-configuration/INGRESS_VERIFICATION_RUNBOOK.md - Comprehensive Architecture:
docs/04-configuration/DNS_NPMPLUS_VM_COMPREHENSIVE_ARCHITECTURE.md - Streamlined Table:
docs/04-configuration/DNS_NPMPLUS_VM_STREAMLINED_TABLE.md - NPMplus API Scripts:
scripts/nginx-proxy-manager/update-npmplus-proxy-hosts-api.sh
Last Updated: 2026-01-20
Maintained By: Infrastructure Team
Status: Cutover Plan Ready - Awaiting Sankofa Service Deployment