Con questo tutorial vorrei mostrarti come ho creato un ambiente di test sul mio server not-managed per avere in sviluppo una copia esatta del sito web, sempre allineato con il sito live.
Per server not-managed intendo un server che non è gestito da nessuno, se non dal proprietario tramite shell SSH. Non è quindi un tutorial per tutti ma per i web master che hanno un proprio server o per chi sta imparando a gestire in autonomia la sua macchina, fisica o virtuale che sia.
Per lavorare su nuove implementazioni e correzioni di questo blog avevo la necessità di un ambiente di sviluppo perfettamente allineato con il sito web live, sempre aggiornato, una copia identica insomma. Non è infatti consigliabile mettere le mani direttamente sul sito online, dato che un piccolissimo errore potrebbe compromettere la funzionalità del sito web. Quindi sempre meglio fare le prove prima su un sito web separato, testare, e quando tutto funziona replicare le modifiche sul sito live.
Premesse del tutorial
- Devi avere accesso root al tuo server Linux
- Come database viene usato MySQL
- Il sito di sviluppo viene inserito nello stesso server del sito live
- Il sito di sviluppo viene rigenerato ogni notte
- Per la procedura uso Cron su server Ubuntu, in particolare il file /etc/crontab
Creare un ambiente di sviluppo con Cron
Per creare la copia di sviluppo nello stesso server ho usato Cron, che è un programmatore di lavoro basato sul tempo ed è presente in sistemi operativi per computer simili a Unix (Cron è preinstallato in tutte le macchine Linux).
Gli utenti che configurano e gestiscono ambienti software usano Cron per pianificare lavori (comandi o script di shell) da eseguire periodicamente a orari, date o intervalli fissi. In genere questo software automatizza la manutenzione o l’amministrazione del sistema, sebbene la sua natura generica lo renda utile per cose come scaricare file da Internet, e-mail a intervalli regolari e moltissime altre attività ricorrenti. L’origine del nome cron deriva dalla parola greca per tempo, χρόνος (chronos).
Con Cron ho automatizzato il processo di generazione dell’ambiente di test facendo girare gli script ogni notte.
Mappatura del nuovo host nel web server
Come prima cosa devi creare nel tuo web server il nuovo host per il sito web di sviluppo, sia che usi Apache o Nginx.
Per creare un host nel web server, se usi NGINX, puoi fare riferimento alla prima parte di questa guida: Guida alla configurazione di un web server LEMP. Se usi Apache troverai centinaia di guide online.
Nel mio caso ho creato un host chiamato dev.evemilano.com che usa protocollo HTTPS (generato da Certbot).
Con CloudFlare, che uso come DNS, ho mappato il sottodominio “dev” sullo stesso IP del server live.
Crea un nuovo database MySQL
Ora che hai configurato il web server a rispondere al nuovo sotto dominio, devi creare un database vuoto in MySQL. Se usi PHPMyAdmin è molto semplice, ricordati di assegnare i permessi utente al nuovo database. Se non usi PHPMyAdmin procedi come da esempio:
- Accedi via SSH alla tua macchina.
- Accedi a MySQL come utente root.
mysql -u -p
- A questo punto puoi scegliere di assegnare al database lo stesso user del database live, oppure puoi crearne uno nuovo (per semplicità potresti mantenere lo stesso user).
GRANT ALL PRIVILEGES ON *.* TO 'db_user'@'localhost' IDENTIFIED BY 'P@s$w0rd123!';
- Se hai creato un nuovo utente devi fare logout da MySQL scrivendo “\q” (senza virgolette).
- e poi accedere con il nuovo utente (sostituisci db_user con il nuovo nome utente) con user e password che ti verranno richiesti.
mysql -u db_user -p
- Ora puoi creare il nuovo database (sostituisci nome_db_sviluppo con il nome che vuoi dare al nuovo database).
CREATE DATABASE nome_db_sviluppo;
Copia del database MySQL
Hai creato un nuovo database con i permessi utente, ora devi pianificare la copia del database live in quello di sviluppo.
Di seguito puoi vedere le righe di Cron che eseguono le seguenti azioni:
- Ottimizzare tutte le tabelle MySQL
- Creare una copia del database live
- Svuotare il database di sviluppo (ora è vuoto ma in futuro non lo sarà)
- Copiare database live dentro il database di sviluppo
Il seguente Cron parte alle 4.05 di mattino, un momento dove tipicamente il server è tranquillo.
###
# Opt + Dump + Del + Import db MYSQL per sito DEV
###
# Opt all db
# gira alle 4.05
5 4 * * * root mysqlcheck -Aos -u root -password_database_live
# Dump db con delete old db
# gira alle 4.10
10 4 * * * root mysqldump --add-drop-table -u root -password_database_live nome_db_live> /home/file_sviluppo/nome_db_sviluppo.dump
# Importa nuovo db in DEV
# gira alle 4.15
15 4 * * * root mysql -u root -password_database_sviluppo nome_db_sviluppo < /home/file_sviluppo/nome_db_live.dump
Se hai creato correttamente il nuovo database e lo hai riempito con i dati del database live è già un’ottima cosa, il difficile diciamo che è fatto. Ora in pratica hai importato nel database di sviluppo il database live, hai una copia esatta che dovremo modificare più avanti.
Copia dei file del sito web
Adesso concentriamoci sui file del sito web live, dobbiamo copiare tutta la cartella che contiene il sito live in una nuova cartella per il sito di sviluppo. Inizia creandoti una nuova cartella possibilmente nello stesso folder che contiene il sito live, ad esempio:
- /var/www/html/tuosito (live)
- /var/www/html/sviluppo (sviluppo)
Di seguito puoi vedere le righe di Cron che eseguono le seguenti azioni:
- Svuotare la cartella sviluppo (ora è vuota ma domani non lo sarà)
- Copiare la cartella del sito live dentro la cartella di sviluppo
###
# Clona sito live in cartella DEV
###
# svuota cartella dev
# gira alle 4.20
20 4 * * * root rm -r /var/www/html/sviluppo/
# clona il sito live in sviluppo
# gira alle 4.25
25 4 * * * root cp -r /var/www/html/tuosito/ /var/www/html/sviluppo/
Nota: i nomi delle cartelle usate nel tutorial possono variare dalle tue, come anche l’ubicazione del sito live e di sviluppo. Ad esempio, potrebbe essere in /home/ oppure in altri posti. In questo tutorial cerca di apprendere le logiche ed i processi più che i puntamenti assoluti.
Personalizzazione delle configurazioni sito di sviluppo
Ora dobbiamo modificare alcuni file e configurazioni del sito web di sviluppo:
- il file wp-config (dato che il sito di sviluppo usa un altro database)
- il robots.txt (per chiuderlo ai bot)
- l’URL del sito e della homepage presente nel database di sviluppo
Nel mio caso ho creato la cartella /home/file_sviluppo/ inserendo i file wp-config.php e robots.txt precompilati e pronti per essere copiati.
Nel nuovo file wp-config.php devi cambiare i dati del database di sviluppo che hai generato ad inizio tutorial (db_name, db_user e db_password) e gli URL del sito e della homepage (WP_SITEURL e WP_HOME).
define('DB_NAME', '********************');
define('DB_USER', '********************');
define('DB_PASSWORD', '********************');
...
define('WP_HOME','https://dev.tuosito.com');
define('WP_SITEURL','https://dev.tuosito.com');
Il file robots.txt del sito di sviluppo dovrebbe essere chiuso.
user-agent: *
disallow: /
Salva questi file in una cartella a tua scelta, nel tutorial ho usato /home/file_sviluppo/
Di seguito puoi vedere le righe di Cron che eseguono le seguenti azioni:
- Copiare il file wp-config.php
- Copiare il file robots.txt
- Cambiare l’URL del sito web nel database di sviluppo
- Cambiare l’URL della home nel sito di sviluppo
# copia il file wp-config preconfigurato
# gira alle 4.30
30 4 * * * root cp -r /home/file_sviluppo/sviluppo-wp-config.php /var/www/html/sviluppo/wp-config.php
# copia il file robots.txt DEV preconfigurato
# gira alle 4.35
35 4 * * * root cp -r /home/file_sviluppo/robots.txt /var/www/html/sviluppo/robots.txt
# cambia Site URL in mysql Sviluppo
# gira alle 4.40
40 4 * * * root mysql -u root -password_database_sviluppo nome_db_sviluppo --execute="update nome_db_sviluppo_options set option_value = 'https://dev.tuosito.com' where option_id = 1"
# cambia Home URL in mysql Sviluppo
# gira alle 4.45
45 4 * * * root mysql -u root -password_database_sviluppo nome_db_sviluppo --execute="update nome_db_sviluppo_options set option_value = 'https://dev.tuosito.com' where option_id = 37"
Nell’esempio ho usato come URL del sito di sviluppo dev.tuosito.com, cambialo in base a come hai configurato il tuo host di sviluppo.
Ripristino permessi FTP
L’ultima cosa da fare è ripristinare i giusti permessi in modo che tu possa caricare immagini e plugin nel sito web di sviluppo senza incorrere in errori. Cambia la cartella in base a dove si trovano i tuoi siti nel server.
###
# ripristina permessi /var/www/http
###
# gira alle 4.50
50 4 * * * root chown -R www-data:www-data /var/www/html
# IMPORTANTE - lascia sempre una riga vuota alla fine del file Cron per evitare seguente errore
# ERROR Missing newline before EOF, this crontab file will be ignored
Nota: l’utente a cui ho assegnato i permessi è www-data ma per il tuo caso potrebbe essere differente. Controlla il nome utente assegnato a PHP.
Verifica errori crontab
Come avrai notato, il processo inizia alle 4.05 di mattino e finisce alle 4.50. Quindi la mattina dopo ti troverai un sito web di sviluppo identico al sito live. Ogni giorno si riscrive.
Cron viene loggato dentro /var/log/syslog. Appena salvi il cron file puoi monitorare in tempo reale eventuali errori usando i comandi tail e grep. Scrivi questo comando nella console SSH.
tail -f /var/log/syslog | grep --line-buffered cron
Se hai fatto tutto correttamente, non dovresti vedere errori tipo questo:
Jul 9 09:39:01 vm cron[1129]: Error: bad day-of-month; while reading /etc/cron.d/new
In alternativa puoi studiare il syslog con grep
grep cron /var/log/syslog
Per sapere come configurare Cron in base ai tuoi orari puoi usare questo sito molto utile: Crontab.guru
Considerazioni
Nel mio caso rigenero il sito di sviluppo ogni notte, così di giorno posso fare tutti gli esperimenti che voglio, e poi ritrovarmi la mattina seguente il sito di sviluppo perfettamente allineato al sito live. Nel caso tu avessi bisogno di più giorni per effettuare i test, dovresti commentare le righe del Cron così da evitare il reset.
Il mio lavoro è fare SEO, non sono un sistemista, queste cose le ho imparate da solo leggendo guide online ed usando un pochino di logica, quindi sicuramente qualche esperto potrebbe consigliare procedure migliori o più efficaci. Ci tenevo comunque a condividere quello che ho fatto perché magari potrebbe tornare utile a qualcuno. Se hai consigli lascia un commento :)