Files
proxmox-ha-setup/README.md
2025-10-31 21:00:14 +01:00

312 lines
5.5 KiB
Markdown

# 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:
```bash
cd scripts
./setup-config.sh
```
### 2. Provisioning VM
Esegui sul nodo Proxmox:
```bash
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:
```bash
# 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:
```bash
# 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
```bash
cd scripts
./verify-cluster.sh
```
### 5. Test Failover
```bash
cd scripts
./test-failover.sh
```
## Makefile
Per comodità, usa il Makefile:
```bash
# 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!):
```bash
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:
```bash
# 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:
```logql
# Tutti i log
{cluster="myapp-cluster"}
# Per servizio
{job="ftp-server"}
{job="orchestrator"}
{job="mysql"}
```
## Troubleshooting
### VIP non risponde
```bash
# Verifica su entrambe le VM
docker compose logs keepalived
ip addr show | grep 192.168.1.100
```
### Failover non funziona
```bash
# 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
```bash
# Verifica log
docker compose logs
# Verifica risorse
free -h
df -h
```
### Redis sync non funziona
```bash
# 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:
```yaml
orchestrator-4:
# ... config
```
### Scalare FTP servers
```bash
# Aggiungi più istanze FTP editando docker-compose.yml
# Poi:
docker compose up -d --scale ftp-server-1=2
```
### Backup Database
```bash
# Su VM1
docker compose exec mysql mysqldump -u root -p myapp > backup.sql
```
### Update applicazione
```bash
# 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.