Come eseguire il backup del container MariaDB

+

File:Docker (container engine) logo.svg - Wikipedia

L’uso dei container docker permette di gestire agilmente la configurazione dei server, gestendo le applicazioni in maniera efficace. E’ quindi una buona idea avere una istanza del SQL server MariaDB, all’interno di un container. Nel nostro esempio MariaDB è l’ SQL server utilizzato insieme a WordPress per il nostro sito web. Ricordiamo che MariaDB è un sostituto di MySQL. Avendo però i database all’interno del container, la procedura per effettuare il backup richiede alcuni passi, vediamo quali.

Per eseguire in tranquillità le operazioni di manutenzione del sito, come l’aggiornamento dei plugin o del wordpress medesimo, si è reso necessario il backup locale del database, tramite il salvataggio in un file SQL.

Per effettuare il backup del database presente nel container docker, è necessario soltanto il comando sottostante:

docker-compose exec -T mariadb sh -c 'exec mysqldump "$MYSQL_DATABASE" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD"'
Code language: JavaScript (javascript)

mariadb è il nome del servizio presente nel file docker-compose.yml

Alternativamente il seguente è il comando equivalente se non usiamo docker-compose, wordpress_mariadb_1 è il nome del container:

docker exec wordpress_mariadb_1 sh -c 'exec mysqldump "$MYSQL_DATABASE" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD"'
Code language: JavaScript (javascript)

Il comando mostrerà sullo standard output il dump SQL del database, per salvarlo in un file dovrà essere aggiunto al termine del comando " > nome_file.sql"

Per semplificare la creazione del backup è stato creato uno shell script in maniera similare a quanto fatto nell’articolo Come esportare i certificati di traefik.

#!/bin/sh cd /srv/wordpress/ DATE=`date +"%Y-%m-%d"` FILENAME="database_${DATE}.sql" docker-compose exec -T mariadb sh -c 'exec mysqldump "$MYSQL_DATABASE" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD"' > database_backup/$FILENAME
Code language: PHP (php)

Riga 5 – Salva la data odierna in una variabile, nel formato %Y-%m-%d, es. 2021-09-26
Riga 6 – Salva in una variabile il nome del file formattato con la data, es. database_2021-09-26.sql
Riga 8 – Esegue il comando per ricevere il dump del database ed indica come percorso di salvataggio la cartella database_backup/ e la variabile della riga 6

Esecuzione automatica

Possiamo usare crontab per automatizzare l’esecuzione periodica dello script precedentemente creato.

# "crontab -e" è solitamente il comando modificare crontab 0 0 * * 0 /usr/bin/sh /srv/wordpress/backup-database.sh >/dev/null 2>&1
Code language: PHP (php)

Il valore 0 0 * * 0 esegue il comando ogni domenica alla mezzanotte.

Il sito adesso è nativamente attivo su IPv6

CC-BY Christoph Scholz

Da oggi il sito supporta nativamente le connessioni tramite il protocollo IPv6.
Di seguito in sintesi i passaggi che abbiamo effettuato per abilitarlo.
Molti saranno riferiti al provider utilizzato per il sito, OVH.

  1. Impostazione del reverse DNS (facoltativo)
  2. Annotazione dei dati IPv6
  3. Impostazione zona DNS
  4. Attivazione IPv6 sul server (necessario accesso SSH)
Continua a leggere Il sito adesso è nativamente attivo su IPv6

Come esportare i certificati di traefik

In seguito alla sostituzione del reverse proxy nginx con traefik abbiamo riscontrato una mancanza nei servizi di posta ospitati sul server.
Purtroppo questi ultimi avevano la necessita dei certificati TLS che solitamente vengono generati per la navigazione web, ad esempio il certificato del dominio linux.livorno.it.

Fino a quel momento i servizi di posta utilizzavano i certificati generati dal programma certbot (let’s encrypt), ma in seguito alla migrazione verso traefik i certificati venivano direttamente gestiti da lui, senza la necessità di utilizzare un programma esterno al reverse proxy come certbot.

Traefik però salva i propri certificati in un file dal nome acme.json, quindi in modo differente rispetto ai soliti file privkey.pem e fullchain.pem.
Come soluzione è stato pensato uno shell script per convertire parti del contenuto json in file pem.

#!/bin/sh cd /srv/traefik/ ACME=`cat acme.json` CERTIFICATES=`echo $ACME | jq '.myresolver.Certificates[]'` DOMAIN_CERTIFICATE=`echo $CERTIFICATES | jq 'select( .domain.main == "linux.livorno.it" )'` KEY_B64=`echo $DOMAIN_CERTIFICATE | jq -r '.key'` CERT_B64=`echo $DOMAIN_CERTIFICATE | jq -r '.certificate'` echo $KEY_B64 | base64 --decode > certificates/privkey.pem echo $CERT_B64 | base64 --decode > certificates/fullchain.pem
Code language: PHP (php)

In questo breve guida non approfondirò l’utilizzo di jq, maggiori info qui.

Riga 5 – Lettura del file acme.json e salvataggio del contenuto in un variabile
Riga 6 – Salvo in una variabile la lista Certificates del dizionario myresolver
Riga 7 – Il comando select seleziona ogni elemento della lista Certificates che ha il valore linux.livorno.it nella chiave name del dizionario domain. Gli elementi selezionati vengono salvati in una variabile.
Righe 9-10 – Vengono salvate in due variabili i valori delle chiavi key e certificate.
Righe 12-13 – Vengono decodificate in base64 le variabili e salvato il contenuto in due file, privkey.pem e fullchain.pem.

Un ultimo passo

Traefik mantiene aggiornati i certificati e non li fa scadere, ma anche noi dovremo aggiornare i file pem generati dal nostro script affinché non scadano.
La soluzione migliore è usare crontab, tramite cui possiamo inserire un comando temporizzato.

# "crontab -e" è solitamente il comando modificare crontab 0 0 * * 0 /usr/bin/sh /srv/traefik/esporta-certificati.sh >/dev/null 2>&1
Code language: PHP (php)

Il valore 0 0 * * 0 esegue il comando ogni domenica alla mezzanotte.