2025-11-01 16:58:21 +01:00
2025-11-02 11:14:40 +01:00
2025-10-31 21:00:14 +01:00
2025-10-31 21:00:14 +01:00
2025-10-31 21:00:14 +01:00

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: FTP
  • 3306: MySQL (tramite HAProxy)
  • 6379: Redis (tramite HAProxy)
  • 8404: HAProxy Stats
  • 30000-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:

  1. Rimuovi il servizio mysql da docker-compose.yml
  2. Punta DB_HOST al tuo cluster Galera
  3. Mantieni tutto il resto identico

License

MIT

Support

Per problemi o domande, apri una issue.

Description
No description provided
Readme 308 KiB
Languages
Shell 93.4%
Dockerfile 5.2%
Makefile 1.4%