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.
No spam, guaranteed.Unsubscribe anytime
We don’t spam! Read more in our privacy policy
Check your inbox or spam folder to confirm your subscription.
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