Files
trading_bot_v4/ha-setup/MIGRATION_FROM_HOSTINGER.md
mindesbunister ba1fe4433e feat: Indicator score bypass - v11.2 sends SCORE:100 to bypass bot quality scoring
Changes:
- moneyline_v11_2_indicator.pinescript: Alert format now includes SCORE:100
- parse_signal_enhanced.json: Added indicatorScore parsing (SCORE:X regex)
- execute/route.ts: Added hasIndicatorScore bypass (score >= 90 bypasses quality check)
- Money_Machine.json: Both Execute Trade nodes now pass indicatorScore to API

Rationale: v11.2 indicator filters already optimized (2.544 PF, +51.80% return).
Bot-side quality scoring was blocking proven profitable signals (e.g., quality 75).
Now indicator passes SCORE:100, bot respects it and executes immediately.

This completes the signal chain:
Indicator (SCORE:100) → n8n parser (indicatorScore) → workflow → bot endpoint (bypass)
2025-12-26 11:40:12 +01:00

12 KiB

Migration from Hostinger Secondary Server

Date: December 21, 2025 Current Secondary: srvfailover01 (72.62.39.24) - Hostinger VPS Reason: Cost reduction - server too expensive for passive HA role


Current Setup Analysis

Hostinger Server (srvfailover01 - 72.62.39.24)

  • Uptime: 26 days
  • Disk Usage: 20GB / 99GB (21% used)
  • Running Containers:
    • trading-bot-v4-secondary (unhealthy - expected for passive)
    • trading-bot-postgres (streaming replica)
    • n8n (for webhook routing)
    • trading-bot-nginx (reverse proxy)
  • Role: Passive secondary with auto-failover via DNS (INWX API)
  • Database: PostgreSQL streaming replication from primary (95.216.52.28)
  • DNS Failover: Monitors primary every 30s, switches tradervone.v4.dedyn.io on failure

What Needs to be Preserved

Critical Data:

  1. Trading bot code + configuration (synced daily from primary)
  2. Database (replicated from primary - can restore from primary)
  3. .env file with wallet keys (MUST backup securely)
  4. n8n workflows (if different from primary)
  5. DNS failover scripts (/usr/local/bin/dns-failover-monitor.py)
  6. SSL certificates (if using Let's Encrypt)
  7. Docker compose configurations
  8. Logs for debugging (optional)

NOT Critical (can rebuild):

  • node_modules (688MB)
  • .next (198MB)
  • .git (133MB - can clone from git)
  • Python virtual envs
  • Docker images (can rebuild)

Space Requirements

Minimum Backup Size (Critical Data Only)

Project files (without node_modules/.next/.git): ~500MB
Database backup: 40MB
n8n data: ~50MB
Logs (optional): ~100MB
-------------------------------------------
Total: ~700MB (compressed: ~200MB)
  • RAM: 4GB minimum (8GB recommended)
  • CPU: 2 cores minimum
  • Disk: 50GB minimum (100GB recommended for growth)
  • Network: 1Gbps, low latency to primary
  • Cost Target: <$10/month (vs Hostinger's premium pricing)
  • Alternatives: Hetzner CX22 ($6/mo), Oracle Free Tier, Contabo VPS

Pre-Migration Checklist

1. Verify Primary is Healthy

# From anywhere
curl -s http://95.216.52.28:3001/api/health | jq .

# Check database replication status
ssh root@95.216.52.28 'docker exec trading-bot-postgres psql -U postgres -c "SELECT client_addr, state, sync_state FROM pg_stat_replication;"'
# Should show: 72.62.39.24 | streaming | async

2. Stop Auto-Failover (CRITICAL)

# Stop DNS failover monitor on Hostinger
ssh root@72.62.39.24 'systemctl stop dns-failover'
ssh root@72.62.39.24 'systemctl disable dns-failover'

# Verify stopped
ssh root@72.62.39.24 'systemctl status dns-failover'
# Should show: inactive (dead)

3. Document Current Configuration

# Save current DNS state
dig tradervone.v4.dedyn.io +short
# Should return: 95.216.52.28 (primary)

# Save database replication config
ssh root@72.62.39.24 'docker exec trading-bot-postgres cat /var/lib/postgresql/data/postgresql.auto.conf' > /tmp/secondary-pg-config.txt

# Save container status
ssh root@72.62.39.24 'docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"' > /tmp/secondary-containers.txt

Migration Procedure

Phase 1: Backup Critical Data (30 minutes)

Run this script on Hostinger server:

#!/bin/bash
# Save as: /root/backup-for-migration.sh

BACKUP_DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/tmp/trading-bot-migration-$BACKUP_DATE"
ARCHIVE_NAME="trading-bot-migration-$BACKUP_DATE.tar.gz"

echo "🔄 Starting backup for migration..."
mkdir -p "$BACKUP_DIR"

# 1. Project files (exclude large unnecessary directories)
echo "📦 Backing up project files..."
cd /root/traderv4-secondary
tar czf "$BACKUP_DIR/project-files.tar.gz" \
  --exclude='node_modules' \
  --exclude='.next' \
  --exclude='.git' \
  --exclude='*.log' \
  --exclude='.backtester' \
  --exclude='backtester/data/*.csv' \
  --exclude='cluster' \
  .

# 2. .env file (CRITICAL - contains wallet keys)
echo "🔐 Backing up environment variables..."
cp /root/traderv4-secondary/.env "$BACKUP_DIR/.env"

# 3. Database backup
echo "💾 Backing up database..."
docker exec trading-bot-postgres pg_dump -U postgres -Fc trading_bot_v4 > "$BACKUP_DIR/trading_bot_v4.dump"

# 4. n8n workflows and data
echo "📝 Backing up n8n data..."
docker run --rm \
  --volumes-from n8n \
  -v "$BACKUP_DIR":/backup \
  alpine tar czf /backup/n8n-data.tar.gz -C /home/node/.n8n .

# 5. DNS failover scripts
echo "🌐 Backing up DNS failover scripts..."
mkdir -p "$BACKUP_DIR/dns-scripts"
cp /usr/local/bin/dns-failover-monitor.py "$BACKUP_DIR/dns-scripts/" 2>/dev/null || echo "dns-failover-monitor.py not found"
cp /usr/local/bin/manual-dns-switch.py "$BACKUP_DIR/dns-scripts/" 2>/dev/null || echo "manual-dns-switch.py not found"
cp /etc/systemd/system/dns-failover.service "$BACKUP_DIR/dns-scripts/" 2>/dev/null || echo "dns-failover.service not found"

# 6. Docker compose files
echo "🐳 Backing up Docker configurations..."
cp /root/traderv4-secondary/docker-compose*.yml "$BACKUP_DIR/"

# 7. SSL certificates (if using Let's Encrypt)
echo "🔒 Backing up SSL certificates..."
if [ -d "/etc/letsencrypt" ]; then
  tar czf "$BACKUP_DIR/letsencrypt.tar.gz" -C /etc letsencrypt
fi

# 8. Logs (last 7 days only)
echo "📋 Backing up recent logs..."
journalctl -u dns-failover --since "7 days ago" > "$BACKUP_DIR/dns-failover-journal.log" 2>/dev/null || true
docker logs trading-bot-v4-secondary --tail 10000 > "$BACKUP_DIR/trading-bot.log" 2>/dev/null || true
cp /var/log/dns-failover.log "$BACKUP_DIR/" 2>/dev/null || true

# 9. Create manifest
echo "📄 Creating backup manifest..."
cat > "$BACKUP_DIR/MANIFEST.txt" <<EOF
Backup Date: $BACKUP_DATE
Server: srvfailover01 (72.62.39.24)
Purpose: Migration from Hostinger to new secondary server

Contents:
- project-files.tar.gz: Trading bot source code (no node_modules)
- .env: Environment variables with wallet keys (SENSITIVE)
- trading_bot_v4.dump: PostgreSQL database backup (40MB)
- n8n-data.tar.gz: n8n workflows and settings
- dns-scripts/: DNS failover automation scripts
- docker-compose*.yml: Container orchestration
- letsencrypt.tar.gz: SSL certificates (if present)
- *.log: Recent operational logs

Migration Steps:
1. Transfer this archive to new server
2. Extract and deploy on new server
3. Update IP addresses in scripts (72.62.39.24 → NEW_IP)
4. Update DNS failover on primary to point to NEW_IP
5. Test failover before decommissioning Hostinger
6. Cancel Hostinger subscription

EOF

# 10. Create final archive
echo "📦 Creating final archive..."
cd /tmp
tar czf "$ARCHIVE_NAME" "trading-bot-migration-$BACKUP_DATE"

# Calculate sizes
ARCHIVE_SIZE=$(du -h "$ARCHIVE_NAME" | cut -f1)
DIR_SIZE=$(du -sh "$BACKUP_DIR" | cut -f1)

echo ""
echo "✅ Backup complete!"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Archive: /tmp/$ARCHIVE_NAME"
echo "Size (compressed): $ARCHIVE_SIZE"
echo "Size (uncompressed): $DIR_SIZE"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "Next steps:"
echo "1. Download: scp root@72.62.39.24:/tmp/$ARCHIVE_NAME ."
echo "2. Verify: tar tzf $ARCHIVE_NAME | head -20"
echo "3. Transfer to new server when ready"
echo ""

Phase 2: Transfer to Safe Storage

# From your local machine or primary server
scp root@72.62.39.24:/tmp/trading-bot-migration-*.tar.gz /home/icke/backups/

# Or use rsync for resume capability
rsync -avz --progress root@72.62.39.24:/tmp/trading-bot-migration-*.tar.gz /home/icke/backups/

# Verify integrity
tar tzf trading-bot-migration-*.tar.gz > /dev/null && echo "✅ Archive valid" || echo "❌ Archive corrupted"

Phase 3: Deploy on New Server (when ready)

Will provide detailed deployment script after you provide new server access.

Basic steps:

  1. Install Docker + Docker Compose
  2. Extract backup archive
  3. Update IP addresses (72.62.39.24 → NEW_IP) in all configs
  4. Setup PostgreSQL streaming replication from primary
  5. Deploy containers
  6. Update DNS failover scripts on primary to monitor NEW_IP
  7. Test failover (stop primary, verify secondary takes over)
  8. Monitor for 1-2 weeks before canceling Hostinger

Decommissioning Hostinger (ONLY after new server proven)

Pre-Decommission Checklist

  • New secondary running for 2+ weeks without issues
  • Successful failover test completed
  • DNS updates working correctly
  • Database replication healthy (0 lag)
  • Telegram alerts working from new secondary
  • No active trades during decommission window

Safe Decommission

# 1. Stop all containers
ssh root@72.62.39.24 'cd /root/traderv4-secondary && docker compose down'

# 2. Verify primary is NOT using Hostinger as replica
ssh root@95.216.52.28 'docker exec trading-bot-postgres psql -U postgres -c "SELECT client_addr FROM pg_stat_replication;"'
# Should NOT show 72.62.39.24

# 3. Final backup (just in case)
ssh root@72.62.39.24 'docker exec trading-bot-postgres pg_dump -U postgres -Fc trading_bot_v4 > /tmp/final-backup.dump'
scp root@72.62.39.24:/tmp/final-backup.dump /home/icke/backups/hostinger-final-backup.dump

# 4. Cancel Hostinger subscription
# (via Hostinger control panel)

Cost Savings

Current Hostinger Cost (estimate)

  • Hostinger VPS Premium: ~$20-40/month
  • Annual cost: ~$240-480

Alternative Providers (recommendations)

  1. Hetzner CX22 - €5.83/month (~$6.50)

    • 2 vCPU, 4GB RAM, 40GB SSD, 20TB traffic
    • Located in Germany (good latency to primary)
  2. Oracle Cloud Free Tier - FREE

    • 1-4 OCPU, 1-24GB RAM, 200GB storage
    • Lifetime free (with minimal usage)
  3. Contabo VPS S - $6.99/month

    • 4 vCores, 8GB RAM, 200GB SSD
    • Unlimited traffic

Estimated Savings

  • Moving to Hetzner: $13-33/month saved ($156-396/year)
  • Moving to Oracle Free: $20-40/month saved ($240-480/year)

Security Considerations

⚠️ CRITICAL: The .env file contains your Drift wallet private key

Secure Transfer Methods:

  1. Use SCP over SSH (encrypted in transit)
  2. Encrypt archive before transfer: gpg -c trading-bot-migration.tar.gz
  3. Delete from Hostinger AFTER confirming new server works
  4. Never transfer via unencrypted channels (FTP, HTTP, email)

After Migration:

  1. Rotate any API keys that were on Hostinger (if paranoid)
  2. Update firewall rules on primary to block old IP (72.62.39.24)
  3. Monitor for unauthorized access attempts

Rollback Plan

If new server fails:

  1. Immediate: Re-enable DNS failover on Hostinger

    ssh root@72.62.39.24 'systemctl start dns-failover'
    
  2. Restart containers:

    ssh root@72.62.39.24 'cd /root/traderv4-secondary && docker compose up -d'
    
  3. Verify health:

    ssh root@72.62.39.24 'curl -s http://localhost:3001/api/health'
    
  4. Keep Hostinger active until new server stable


Timeline

  1. Today (Dec 21): Create backup, store safely (THIS SCRIPT)
  2. When new server ready: Deploy and configure (1-2 hours)
  3. Week 1: Test new secondary, monitor health checks
  4. Week 2: Perform failover test (controlled)
  5. Week 3: If stable, decommission Hostinger
  6. Week 4: Confirm cost savings in billing

Questions Before Proceeding

  1. What's the budget for new secondary server? (<$10/mo?)
  2. Geographic preference? (Europe/US/Asia)
  3. Managed vs unmanaged? (Docker pre-installed or DIY?)
  4. Any specific provider requirements/restrictions?

Summary

Safe to proceed: YES Data at risk: NO (all backed up to primary + this backup) Downtime during migration: ZERO (primary stays active) Estimated savings: $156-480/year Time to complete: 2-4 hours setup + 2 weeks validation

Next step: Run backup script above, then provide new server access when ready.