6cfccbefd2a6522cc08dbaac952be1ec74ed2b16
Proxmox HA Cluster Setup
Setup automatico di un cluster HA a 2 nodi su Proxmox per applicazioni Python con:
- MySQL (su VM1)
- Redis Master-Slave
- 3 Orchestratori
- 2 FTP Server in HA
- HAProxy + Keepalived per VIP
- Promtail per log shipping a Loki
Architettura
VM1 (192.168.1.10) PRIMARY VM2 (192.168.1.11) SECONDARY
├── MySQL ├── Redis Slave
├── Redis Master ├── Orchestrator 2
├── Orchestrator 1 ├── Orchestrator 3
├── FTP Server 1 ├── FTP Server 2
├── HAProxy (MASTER) ├── HAProxy (BACKUP)
└── Keepalived (priority 100) └── Keepalived (priority 50)
VIP: 192.168.1.100
Prerequisiti
- Proxmox VE installato e configurato
- Accesso SSH al nodo Proxmox
- Chiave SSH pubblica per accesso alle VM
- Rete configurata (192.168.1.0/24 nell'esempio)
- Server Loki/Grafana (192.168.1.200)
Quick Start
1. Configurazione
Modifica scripts/provision-ha-cluster.sh con i tuoi parametri:
- IP delle VM
- VIP
- Gateway
- Chiave SSH pubblica
- Risorse (CPU, RAM, disco)
Oppure usa lo script interattivo:
cd scripts
./setup-config.sh
2. Provisioning VM
Esegui sul nodo Proxmox:
cd scripts
chmod +x *.sh
./provision-ha-cluster.sh
Lo script:
- Scarica Ubuntu Cloud Image
- Crea template Cloud-Init
- Crea 2 VM (ID 201 e 202)
- Configura networking
- Installa Docker
- Avvia le VM
Tempo richiesto: ~5-10 minuti
3. Deploy Applicazione
Su VM1:
# Copia file
scp -r vm1/* root@192.168.1.201:/opt/myapp/
# SSH e deploy
ssh root@192.168.1.201
cd /opt/myapp
cp .env.example .env
# Modifica .env con le tue password
./deploy-ha.sh
Su VM2:
# Copia file
scp -r vm2/* root@192.168.1.202:/opt/myapp/
# SSH e deploy
ssh root@192.168.1.202
cd /opt/myapp
cp .env.example .env
# Modifica .env (stesse password di VM1!)
./deploy-ha.sh
4. Verifica
cd scripts
./verify-cluster.sh
5. Test Failover
cd scripts
./test-failover.sh
Makefile
Per comodità, usa il Makefile:
# Provisioning completo
make provision
# Verifica cluster
make verify
# Test failover
make test-failover
# SSH nelle VM
make ssh-vm1
make ssh-vm2
# Vedi log
make logs-vm1
make logs-vm2
# Distruggi tutto
make destroy
Configurazione
Variabili d'ambiente (.env)
Configura in entrambe le VM (stessi valori!):
VIP=192.168.1.100
MYSQL_ROOT_PASSWORD=...
MYSQL_DATABASE=myapp
MYSQL_USER=appuser
MYSQL_PASSWORD=...
REDIS_PASSWORD=...
LOKI_HOST=192.168.1.200
LOKI_PORT=3100
Ports
21: FTP3306: MySQL (tramite HAProxy)6379: Redis (tramite HAProxy)8404: HAProxy Stats30000-30009: FTP Passive
Servizi
Accesso ai servizi
Tutti i servizi sono accessibili tramite VIP:
# FTP
ftp 192.168.1.100
# MySQL
mysql -h 192.168.1.100 -u appuser -p
# Redis
redis-cli -h 192.168.1.100
# HAProxy Stats
http://192.168.1.100:8404
Grafana/Loki
Log disponibili in Grafana:
# Tutti i log
{cluster="myapp-cluster"}
# Per servizio
{job="ftp-server"}
{job="orchestrator"}
{job="mysql"}
Troubleshooting
VIP non risponde
# Verifica su entrambe le VM
docker compose logs keepalived
ip addr show | grep 192.168.1.100
Failover non funziona
# Verifica connettività tra le VM
ping 192.168.1.10
ping 192.168.1.11
# Controlla keepalived
docker compose logs keepalived
Servizi non si avviano
# Verifica log
docker compose logs
# Verifica risorse
free -h
df -h
Redis sync non funziona
# Su VM2
docker compose exec redis redis-cli INFO replication
Struttura File
proxmox-ha-setup/
├── scripts/
│ ├── provision-ha-cluster.sh # Provisioning Proxmox
│ ├── setup-config.sh # Config interattiva
│ ├── verify-cluster.sh # Verifica cluster
│ └── test-failover.sh # Test HA
├── vm1/
│ ├── docker-compose.yml # Services VM1
│ ├── haproxy.cfg # HAProxy config
│ ├── keepalived-master.conf # Keepalived MASTER
│ ├── promtail-config.yml # Promtail config
│ ├── .env.example # Environment template
│ ├── deploy-ha.sh # Deploy script
│ └── Dockerfile # App container
├── vm2/
│ └── (stessi file di vm1)
├── README.md
└── Makefile
Manutenzione
Aggiungere nuovi orchestratori
Modifica docker-compose.yml e aggiungi:
orchestrator-4:
# ... config
Scalare FTP servers
# Aggiungi più istanze FTP editando docker-compose.yml
# Poi:
docker compose up -d --scale ftp-server-1=2
Backup Database
# Su VM1
docker compose exec mysql mysqldump -u root -p myapp > backup.sql
Update applicazione
# Pull codice aggiornato
git pull
# Rebuild e restart
docker compose build
docker compose up -d
Sicurezza
- Cambia tutte le password di default in
.env - Configura firewall su Proxmox
- Abilita SSL/TLS per FTP (FTPS)
- Usa autenticazione forte per MySQL
- Aggiorna regolarmente le immagini Docker
Migrazione a Produzione
Per usare il cluster Galera in produzione:
- Rimuovi il servizio
mysqldadocker-compose.yml - Punta
DB_HOSTal tuo cluster Galera - Mantieni tutto il resto identico
License
MIT
Support
Per problemi o domande, apri una issue.
Description
Languages
Shell
93.4%
Dockerfile
5.2%
Makefile
1.4%