Paolo Ronco
PORTFOLIO
Gestire un sito web su un server locale (on-premises) offre molti vantaggi in termini di controllo e personalizzazione, ma porta con sé un rischio importante: la continuità operativa.Un server in casa o in ufficio non può garantire uptime del 100% — basta un blackout, un problema hardware o, come nel mio caso, la lontananza durante le vacanze, e il sito potrebbe restare offline per ore o giorni.
Per questo ho deciso di implementare una soluzione di Replica + Failover su Cloud, che permette di:
scp
✅ Gestisce le richieste normalmente
✅ Cloudflare indirizza le richieste alla VM cloud✅ Il sito rimane online, i servizi continuano a funzionare
OnPremise:
Per ogni servizio dockerizzato (come NGINX o altri), creo un backup dei volumi usando un container Alpine temporaneo.Alla fine, trasferisco tutto al cloud tramite SCP.
Esempio — WebServer di esempio:
#!/bin/bashDATE=$(date +"%Y%m%d-%H%M")BACKUP_DIR="/root/backups"CLOUD_USER="inserisci_username"CLOUD_IP="inserisci_ip_cloud"SSH_KEY="inserisci_chiave_ssh"REMOTE_PATH="/home/inserisci_username/webserver_backup_${DATE}.tar.gz"mkdir -p ${BACKUP_DIR}cd ${BACKUP_DIR}# Backup volumi Dockerdocker run --rm -v inserisci_volume_id1:/volume -v $(pwd):/backup alpine sh -c "cd /volume && tar czf /backup/nginx_backup.tar.gz ."docker run --rm -v inserisci_volume_id2:/volume -v $(pwd):/backup alpine sh -c "cd /volume && tar czf /backup/html_backup.tar.gz ."# Crea archivio unico e trasferisce al cloudtar czf webserver_backup_${DATE}.tar.gz nginx_backup.tar.gz html_backup.tar.gzscp -i ${SSH_KEY} webserver_backup_${DATE}.tar.gz ${CLOUD_USER}@${CLOUD_IP}:${REMOTE_PATH}rm -f nginx_backup.tar.gz html_backup.tar.gz
Eseguo un dump SQL dal container MySQL/MariaDB e lo trasferisco al cloud:
#!/bin/bashDATE=$(date +"%Y%m%d-%H%M")LOCAL_DUMP="/root/wordpress_db_backup_${DATE}.sql"CLOUD_USER="inserisci_username"CLOUD_IP="inserisci_ip_cloud"SSH_KEY="inserisci_chiave_ssh"DB_USER="inserisci_db_user"DB_PASS="inserisci_db_password"DB_NAME="inserisci_db_name"docker exec inserisci_nome_container_db mysqldump --no-tablespaces -u ${DB_USER} -p"${DB_PASS}" ${DB_NAME} > ${LOCAL_DUMP}scp -i ${SSH_KEY} ${LOCAL_DUMP} ${CLOUD_USER}@${CLOUD_IP}:/home/inserisci_username/
Esempio di crontab:
0 3 * * * /root/scripts/replica_webserver.sh0 4 * * * /root/scripts/replica_wordpress.sh
Cloud:
Sul cloud, scompatto i backup ricevuti e li ripristino sui volumi Docker:
#!/bin/bashBACKUP_FILE=$(ls -t /home/inserisci_username/webserver_backup_*.tar.gz | head -n 1)RESTORE_DIR="/root/restore_temp"mkdir -p ${RESTORE_DIR}tar xzf ${BACKUP_FILE} -C ${RESTORE_DIR}docker run --rm -v inserisci_volume_id1:/data -v ${RESTORE_DIR}:/backup alpine sh -c "rm -rf /data/* && tar xzf /backup/nginx_backup.tar.gz -C /data"docker run --rm -v inserisci_volume_id2:/data -v ${RESTORE_DIR}:/backup alpine sh -c "rm -rf /data/* && tar xzf /backup/html_backup.tar.gz -C /data"rm -rf ${RESTORE_DIR}
#!/bin/bashDUMP_PATH=$(ls -t /home/inserisci_username/wordpress_db_backup_*.sql | head -n 1)CONTAINER_DB="inserisci_nome_container_db"DB_USER="inserisci_db_user"DB_PASS="inserisci_db_password"DB_NAME="inserisci_db_name"docker cp "$DUMP_PATH" "$CONTAINER_DB:/wordpress_db_backup.sql"docker exec -i "$CONTAINER_DB" mysql -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" -e "SET FOREIGN_KEY_CHECKS=0;DROP TABLE IF EXISTS wp_commentmeta, wp_comments, wp_links, wp_options, wp_postmeta, wp_posts, wp_term_relationships, wp_terms, wp_term_taxonomy, wp_usermeta, wp_users;SET FOREIGN_KEY_CHECKS=1;"docker exec -i "$CONTAINER_DB" sh -c "mysql -u $DB_USER -p\"$DB_PASS\" $DB_NAME < /wordpress_db_backup.sql"
0 5 * * * /root/scripts/restore_webserver.sh0 6 * * * /root/scripts/restore_wordpress.sh
Cloudflare:
Su entrambe le macchine (Proxmox e Cloud), attivo il tunnel Cloudflare:
cloudflared service install inserisci_token_tunnel
Cloudflare gestisce automaticamente il traffico in base alla disponibilità del container on-premises o della VM cloud.
Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *
Commento *
Nome *
E-mail *
Sito web
Salva il mio nome, email e sito web in questo browser per la prossima volta che commento.
Invia commento