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)
This commit is contained in:
374
ha-setup/MIGRATION_FROM_HOSTINGER.md
Normal file
374
ha-setup/MIGRATION_FROM_HOSTINGER.md
Normal file
@@ -0,0 +1,374 @@
|
||||
# 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)
|
||||
```
|
||||
|
||||
### Recommended New Server Specs
|
||||
- **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
|
||||
```bash
|
||||
# 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)
|
||||
```bash
|
||||
# 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
|
||||
```bash
|
||||
# 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:**
|
||||
|
||||
```bash
|
||||
#!/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
|
||||
|
||||
```bash
|
||||
# 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
|
||||
```bash
|
||||
# 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
|
||||
```bash
|
||||
ssh root@72.62.39.24 'systemctl start dns-failover'
|
||||
```
|
||||
|
||||
2. **Restart containers:**
|
||||
```bash
|
||||
ssh root@72.62.39.24 'cd /root/traderv4-secondary && docker compose up -d'
|
||||
```
|
||||
|
||||
3. **Verify health:**
|
||||
```bash
|
||||
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.
|
||||
Reference in New Issue
Block a user