Escenario ilustrativo (hipotético): Jordan administra un pequeño servidor Nextcloud en Ubuntu. Los archivos de la aplicación se encuentran en /var/www/nextcloud, los archivos de usuario en /srv/nextcloud-data, MariaDB almacena la base de datos de Nextcloud y se puede acceder a un host Linux externo a través de SSH. Jordan desea una copia de seguridad diaria que pueda inspeccionarse y restaurarse, no simplemente una entrada de cron que se ejecute sin errores.
Este ejemplo proporciona a Jordan un flujo de trabajo repetible con Restic y cron. Las rutas, las cuentas de servicio, los nombres de las bases de datos y la programación son ejemplos; sustitúyalos por los valores de su instalación. Los comandos no implican que esta configuración se haya ejecutado o probado en un servidor real.
Qué debe contener una copia de seguridad de Nextcloud útil
Una simple copia de carpeta puede omitir la información que Nextcloud necesita para reconectar archivos, usuarios, recursos compartidos y configuraciones. El manual de administración de Nextcloud 35 actual enumera cinco elementos que deben conservarse: el directorio de configuración, las aplicaciones personalizadas (si las hay), el directorio de datos, el directorio de temas y la base de datos. La guía de restauración indica que la base de datos, el directorio de datos y los archivos de configuración son esenciales. Lea el manual correspondiente a su versión de Nextcloud instalada antes de adaptar el ejemplo.
Jordan opta por realizar una copia de seguridad del directorio completo de la aplicación, que incluye la configuración, las aplicaciones y los temas, además del directorio de datos independiente y una copia de seguridad de la base de datos. También se necesita una copia independiente de cada ubicación de almacenamiento externo si Nextcloud almacena el contenido del usuario fuera de la aplicación /srv/nextcloud-data. Restic solo puede proteger las rutas que el proceso de copia de seguridad puede leer.
Las instrucciones oficiales de Nextcloud para realizar copias de seguridad describen el modo de mantenimiento y las copias de seguridad de la base de datos. Sus instrucciones de restauración explican por qué la base de datos y el árbol de archivos deben provenir de un punto de recuperación compatible.
1. Preparar Restic y sus credenciales
Instala Restic desde la fuente de paquetes de confianza y confirma que esté disponible para la cuenta que ejecutará la tarea. El ejemplo asume que la tarea se ejecuta como root para que pueda leer los archivos de Nextcloud y la copia de seguridad de la base de datos. Utiliza un repositorio SFTP remoto para que un fallo del servidor de aplicaciones de Jordan no borre la única copia de seguridad.
restic version
install -d -m 700 /root/.config/restic
install -d -m 700 /root/.config/nextcloud
Crea una contraseña segura para el repositorio de Restic y guárdala /root/.config/restic/nextcloud-passwordcon permisos de administrador. Mantén una copia de seguridad de esa contraseña en un lugar seguro, separado del servidor y del repositorio. Restic cifra los datos del repositorio, pero perder la contraseña puede inutilizar esas copias de seguridad cifradas. No incluyas la contraseña directamente en el script ni en la línea de cron.
Configure el acceso SSH no interactivo para la cuenta de respaldo en el host remoto y verifique su clave de host a través de un canal de confianza. Establezca la ubicación del repositorio a continuación en un directorio que la cuenta pueda escribir:
export RESTIC_REPOSITORY='sftp:backup@vault.example.net:/srv/restic/nextcloud'
export RESTIC_PASSWORD_FILE='/root/.config/restic/nextcloud-password'
restic init
Inicialice un repositorio solo una vez. La guía de preparación de repositorios de Restic documenta los sistemas de almacenamiento compatibles y el proceso de inicialización. Considere el archivo de contraseñas y la clave SSH como credenciales confidenciales y restrinja el acceso a ellos.
2. Mantenga la base de datos y los archivos en un punto compatible.
Nextcloud recomienda el modo de mantenimiento para las copias de seguridad, ya que bloquea los nuevos inicios de sesión y las sesiones existentes para evitar inconsistencias en los datos. El comando debe ejecutarse como el usuario HTTP; en una configuración típica de paquetes de Ubuntu, ese usuario es www-data. La ventana de mantenimiento de Jordan abarca el volcado de la base de datos y la copia de seguridad de Restic, por lo que los usuarios no pueden trabajar en Nextcloud durante ese tiempo.
Para MariaDB, el manual de Nextcloud utiliza mariadb-dump --single-transaction. Almacene las credenciales de la base de datos en un archivo de configuración de cliente protegido, por ejemplo /root/.config/nextcloud/mariadb.cnf, en lugar de incrustar una contraseña en el comando:
[client]
user=nextcloud_backup
password=REPLACE_WITH_A_SECRET
host=localhost
Restringe el archivo con chmod 600 /root/.config/nextcloud/mariadb.cnf. Crea una cuenta de base de datos con solo los privilegios necesarios para tu servidor y procedimiento de volcado. Si tu Nextcloud usa PostgreSQL o SQLite, sustituye su método de copia de seguridad documentado; no ejecutes el comando MariaDB sin modificarlo.
3. Crea un script de copia de seguridad protegido.
Jordan guarda el siguiente archivo /usr/local/sbin/nextcloud-restic-backupy lo hace ejecutable. Utiliza un bloqueo para evitar ejecuciones superpuestas, activa el modo de mantenimiento antes de crear el volcado, realiza una copia de seguridad del volcado con los directorios de la aplicación y los datos, e intenta desactivar el modo de mantenimiento incluso si un comando posterior falla.
#!/usr/bin/env bash
set -Eeuo pipefail
umask 077
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export RESTIC_REPOSITORY='sftp:backup@vault.example.net:/srv/restic/nextcloud'
export RESTIC_PASSWORD_FILE='/root/.config/restic/nextcloud-password'
NC_DIR='/var/www/nextcloud'
DATA_DIR='/srv/nextcloud-data'
DB_NAME='nextcloud'
DB_CNF='/root/.config/nextcloud/mariadb.cnf'
DUMP_DIR='/var/backups/nextcloud'
LOCK_FILE='/run/lock/nextcloud-restic-backup.lock'
STAMP=$(date -u +%Y%m%dT%H%M%SZ)
DUMP_FILE="$DUMP_DIR/nextcloud-$STAMP.sql"
maintenance_started=0
mkdir -p "$DUMP_DIR"
exec 9>"$LOCK_FILE"
flock -n 9 || { echo 'A Nextcloud backup is already running.' >&2; exit 1; }
finish() {
result=$?
trap - EXIT
if [[ "$maintenance_started" == 1 ]]; then
sudo -u www-data -- php "$NC_DIR/occ" maintenance:mode --off || result=1
fi
rm -f -- "$DUMP_FILE" || result=1
exit "$result"
}
trap finish EXIT
sudo -u www-data -- php "$NC_DIR/occ" maintenance:mode --on
maintenance_started=1
mariadb-dump --defaults-extra-file="$DB_CNF" --single-transaction \
--default-character-set=utf8mb4 --databases "$DB_NAME" > "$DUMP_FILE"
restic backup --tag nextcloud "$NC_DIR" "$DATA_DIR" "$DUMP_FILE"
Tras revisar las rutas, cree el ejecutable con permisos de root y modo 700. El script asume que la instalación utiliza www-data, MariaDB y las rutas indicadas; compruébelas config/config.phpprimero con la configuración de su servidor web. También asume que ningún otro administrador ha habilitado previamente el modo de mantenimiento. Si el comando, el volcado o la carga de Restic fallan, el intérprete de comandos finaliza con un error y el sistema intenta restaurar el servicio; revise los registros para confirmar que esto ocurrió. El volcado se almacena con permisos restrictivos y se elimina tras la ejecución.
Este sencillo patrón mantiene el sitio inaccesible durante todo el proceso de escaneo y carga de Restic. Para un directorio de datos grande, esto puede ser demasiado tiempo. Si su sistema de archivos o plataforma de almacenamiento lo admite, utilice una copia de seguridad coordinada de la base de datos y una instantánea de almacenamiento, o bien otro diseño de copia de seguridad coherente con la aplicación. Asegúrese de que la base de datos y la instantánea de archivos representen un punto en el tiempo compatible; copiar de forma independiente una base de datos activa y un directorio de datos cambiante puede generar una copia de seguridad difícil de restaurar.
4. Programa la tarea con cron.
Una vez que la ejecución manual se haya completado correctamente, Jordan instala el script y lo programa para un período de inactividad. Como usuario root, edite el crontab de root sudo crontab -ey agregue:
15 2 * * * /usr/local/sbin/nextcloud-restic-backup >> /var/log/nextcloud-restic.log 2>&1
Este ejemplo comienza a las 2:15 a. m. según la zona horaria del cron del servidor; elija una hora en la que la ventana de mantenimiento sea aceptable. Cron tiene un entorno más reducido que una consola interactiva, por lo que el script se configura PATHexplícitamente y utiliza rutas absolutas. Cree el archivo de registro con permisos restrictivos y configure la rotación de registros, o envíe la salida al servicio de registro habitual de su sistema. La programación con Cron solo inicia la tarea: no confirma que la copia de seguridad haya finalizado ni que la restauración vaya a funcionar.
5. Configure la retención y verifique el resultado.
Tras realizar una copia de seguridad correctamente, Jordan comprueba que aparece una instantánea:
restic snapshots --tag nextcloud
restic check
restic checkComprueba la estructura del repositorio. Una comprobación periódica restic check --read-datatambién lee los datos almacenados y puede consumir una cantidad considerable de tiempo de red y disco, por lo que debe programarse según el tamaño del repositorio y las necesidades de recuperación. La guía de retención de instantáneas de Restic explica que eliminar instantáneas y podar datos sin referencia son tareas independientes, y que la poda bloquea el repositorio. Comience con una prueba y una política que se ajuste a sus requisitos de retención.
restic forget --tag nextcloud --keep-daily 7 --keep-weekly 5 \
--keep-monthly 12 --dry-run
Revise las instantáneas que se proponen eliminar. Cuando esté conforme, elimine --dry-runy agregue --prune; ejecute la limpieza cuando no entre en conflicto con la copia de seguridad nocturna. Estos recuentos de retención son un ejemplo, no una política universal. Considere la retención legal, el almacenamiento disponible y hasta qué punto necesita recuperar información.
La prueba decisiva consiste en un simulacro de restauración. Restaura una instantánea reciente en un directorio temporal de un sistema independiente, sin sobrescribir las rutas de Nextcloud activas de Jordan:
restic restore latest --tag nextcloud --target /tmp/nextcloud-restore-check
Confirme que el árbol restaurado contiene la configuración, los datos y el volcado de la base de datos esperados, e inspeccione los archivos representativos. Para una recuperación completa, siga el manual de restauración de Nextcloud en un entorno aislado y verifique el inicio de sesión, el acceso a los archivos y los recursos compartidos esperados antes de utilizar el procedimiento. La documentación de restauración de Restic describe cómo seleccionar instantáneas y destinos de restauración.
Cómo saber cuándo es necesario cambiar este enfoque.
La tarea programada de Jordan solo es adecuada si la ventana de mantenimiento coincide con la duración de la copia de seguridad y todas las rutas de datos necesarias son locales y legibles. Modifique el diseño cuando aparezca cualquiera de estas señales:
- El sitio permanece en modo de mantenimiento más tiempo del que los usuarios pueden tolerar: planifique instantáneas coordinadas u otro método coherente con la aplicación.
- Los registros muestran rutas faltantes, errores de permisos, un volcado de base de datos fallido o una salida de Restic distinta de cero: corrija estos problemas antes de considerar la instantánea como completa.
- Los datos se almacenan en un dispositivo externo o en otro servidor: incluya una copia de seguridad consistente de dicho almacenamiento en el plan de recuperación.
- Una restauración de prueba carece de archivos, configuración, estado de la base de datos o código de aplicación/tema necesario: actualice los datos de entrada de la copia de seguridad y repita el procedimiento.
- La contraseña de Restic o las credenciales SSH solo existen en el servidor del que se realiza la copia de seguridad: guarde las credenciales de recuperación por separado y verifique que un administrador autorizado pueda acceder a ellas.
Para Jordan, el éxito es observable: el registro cron muestra que la ejecución se completó, restic snapshotsenumera una instantánea etiquetada reciente, las comprobaciones del repositorio no reportan errores y un proceso de restauración recupera una instancia de Nextcloud coherente. Un comando programado es el inicio de una rutina de copia de seguridad; solo un conjunto completo y restaurable de datos de base de datos, configuración, aplicación y usuario proporciona una ruta de recuperación práctica.
Referencias oficiales