Última actualizació: 2024-02-20
Introducció
Fa ara més de 4 anys que vaig descobrir el Fedivers i durant aquest temps, encara que el meu compte principal retiolus@mamot.fr estigui en un servidor que no em pertany, he allotjat i administrat una pila de nodes siguin de Lemmy, Mastodon, Misskey, Pleroma, Pixelfed o encara GoToSocial.
Una preocupació present en allotjar serveis públics a internet és la seva sostenibilitat en el temps i per assolir-ho un dels factors més importants són les còpies de seguretat. He utilitzat durant molt de temps BorgBackup, una eina que desduplica, comprimeix i xifra les còpies de seguretat. Tot i no haver necessitat mai recuperar una còpia de seguretat, he hagut de migrar servidors en diverses ocasions, fent-ho manualment en l’instant, ja que la restauració amb Borg pot ser més complexa, especialment pel que fa als permisos dels fitxers i els enllaços simbòlics.
Malgrat que hi ha molts recursos disponibles sobre com fer còpies de seguretat d’un servidor Mastodon, molts d’aquests scripts segueixen un patró similar: realitzar una còpia del servidor Mastodon a un altre servidor. Aquest enfocament pot ser pràctic, però implica tenir un segon servidor (que pot ser costós) o exposar l’ordinador personal a Internet, amb tot el que això comporta en termes de configuració i seguretat.
Personalment, preferia una solució on l’ordinador local fos el que iniciés la connexió amb el servidor Mastodon, en lloc del contrari. Això em permetria executar scripts de còpies de seguretat des de qualsevol màquina sense haver d’exposar-la a Internet o realitzar configuracions complicades. A continuació, explico com ho he fet.
Configuració inicial
Durant la instal·lació de Mastodon es crea un usuari mastodon amb la opció --disabled-login, la qual cosa significa que l’usuari no té contrasenya i no pot iniciar sessió, ni tan sols per SSH, llevat que sigui mitjançant l’usuari root o un usuari amb permisos d’administració. Per permetre l’accés per SSH, cal seguir aquests passos:
-
En la màquina des de la qual volem connectar-nos al servidor, generem una parella de claus SSH si encara no en tenim una.
ssh-keygen -t rsa -b 4096Això generarà una clau privada (que mai s’ha de compartir) i una clau pública a
~/.ssh/id_rsa.pub. -
Per poder afegir la clau pública al servidor, necessitem obtenir seu contingut.
cat ~/.ssh/id_rsa.pub -
Ens conectem al servidor on està instal-lat Mastodon, utilitzant un usuari que ja tingui permisos per connectar-se via SSH.
ssh usuari@servidorOn
userés el nom d’usuari iservidorés la direcció IP o el nom de domini del servidor. -
Iniciem sessió com a usuari
mastodon:sudo su - mastodon -
Per autoritzar la connexió SSH amb la clau pública, hem de afegir-la al final del fitxer
~/.ssh/authorized_keysde l’usuarimastodon.nano ~/.ssh/authorized_keys -
Si hem seguit els passos correctament, hauríem de poder connectar-nos per SSH a l’usuari
mastodondel servidor amb:ssh mastodon@servidor
Construcció del script
-
Activem les sortides d’error i fem que el script s’aturi si alguna comanda retorna un error
set -eo pipefail -
Definim les variables de la data actual, adreça IP o nom del servidor on està instal·lada la instància de Mastodon i el nom d’usuari amb el qual ens connectem al servidor
NOW=$(date +"%Y-%m-%d-%H-%M-%S") SERVER="kfem.cat" USER="mastodon" -
Comprovem que les dependències necessàries per al script estiguin instal·lades
check_dependency() { command -v "$1" >/dev/null 2>&1 || { echo >&2 "Error: $1 és necessari però no està instal·lat. S'interromp l'execució."; exit 1; } } check_dependency scp check_dependency pg_dump check_dependency gzip check_dependency pv check_dependency rsync check_dependency stat -
Eliminem els fitxers d’antigues còpies de seguretat de la base de dades que tinguin més de dues setmanes
find . -maxdepth 1 -type f -mtime +14 -delete -
Copiem els secrets i la configuració de Mastodon des del servidor
scp "$USER"@"$SERVER":/home/mastodon/live/.env.production ./.env.production -
Exportem i comprimim la base de dades de Mastodon amb la data actual, mostrant el progrés de la transferència basant-se en el pes de les antigues còpies i la velocitat de la xarxa
last_sql_gz_size=$(stat -c %s $(ls -1t *.sql.gz | head -n1)) ssh "$USER"@"$SERVER" "pg_dump -U mastodon -d mastodon_production | gzip -c" | pv -pterb --size "$last_sql_gz_size" > "./mastodon_production_$NOW.sql.gz" -
Sincronitzem els fitxers carregats pels usuaris
rsync -azP --delete "$USER"@"$SERVER":/home/mastodon/live/public/system/ system
Script final
A continuació, el script final que permet realitzar còpies de seguretat de Mastodon des de qualsevol ordinador, sempre que la seva clau pública s’hagi afegit prèviament a les autoritzades del servidor Mastodon:
#!/bin/bash
set -eo pipefail
NOW=$(date +"%Y-%m-%d-%H-%M-%S")
SERVER="kfem.cat"
USER="mastodon"
check_dependency() {
command -v "$1" >/dev/null 2>&1 || { echo >&2 "Error: $1 és necessari però no està instal·lat. S'interromp l'execució."; exit 1; }
}
check_dependency scp
check_dependency pg_dump
check_dependency gzip
check_dependency pv
check_dependency rsync
check_dependency stat
echo "Eliminant fitxers de base de dades més antics de dues setmanes..."
find . -maxdepth 1 -type f -mtime +14 -delete
echo "Copiant els secrets de l'aplicació..."
scp "$USER"@"$SERVER":/home/mastodon/live/.env.production ./.env.production
echo "Exportant la base de dades comprimida amb la data actual..."
last_sql_gz_size=$(stat -c %s $(ls -1t *.sql.gz | head -n1))
echo "Mida estimada de l'arxiu de còpia de seguretat de la base de dades: $last_sql_gz_size bytes"
echo "Realitzant la còpia de seguretat i comprimint la base de dades..."
ssh "$USER"@"$SERVER" "pg_dump -U mastodon -d mastodon_production | gzip -c" | pv -pterb --size "$last_sql_gz_size" > "./mastodon_production_$NOW.sql.gz"
echo "Sincronitzant els fitxers carregats pels usuaris..."
rsync -azP --delete "$USER"@"$SERVER":/home/mastodon/live/public/system/ system
echo "Execució del script completada."