312 lines
5.5 KiB
Markdown
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.
|