Cenário ilustrativo (hipotético): Jordan administra um pequeno servidor Nextcloud no Ubuntu. Os arquivos da aplicação estão em `/usr/local/nextcloud` /var/www/nextcloud, os arquivos do usuário estão em /srv/nextcloud-data`/usr/local/nextcloud`, o MariaDB armazena o banco de dados do Nextcloud e um host Linux remoto está disponível via SSH. Jordan deseja um backup noturno que possa ser inspecionado e restaurado, e não apenas uma entrada no cron que seja executada sem erros.
Este exemplo fornece a Jordan um fluxo de trabalho repetível com Restic e cron. Os caminhos, contas de serviço, nomes de banco de dados e agendamento são exemplos; substitua-os pelos valores da sua instalação. Os comandos não implicam que esta configuração tenha sido executada ou testada em um servidor real.
O que um backup utilizável do Nextcloud deve conter
Uma cópia de uma pasta por si só pode omitir as informações necessárias para o Nextcloud reconectar arquivos, usuários, compartilhamentos e configurações. O Manual de Administração do Nextcloud 35 lista cinco itens que devem ser mantidos: o diretório de configuração, aplicativos personalizados (se houver), o diretório de dados, o diretório de temas e o banco de dados. O guia de restauração afirma que o banco de dados, o diretório de dados e os arquivos de configuração são essenciais. Leia o manual correspondente à sua versão do Nextcloud instalada antes de adaptar o exemplo.
Jordan optou por fazer backup do diretório completo do aplicativo, incluindo configurações, aplicativos e temas, além do diretório de dados separado e um dump do banco de dados. Uma cópia separada de cada local de armazenamento externo também é necessária caso o Nextcloud armazene conteúdo do usuário fora do diretório raiz /srv/nextcloud-data. O Restic só pode proteger caminhos que o processo de backup consegue ler.
As instruções oficiais de backup do Nextcloud descrevem o modo de manutenção e os backups do banco de dados. Suas instruções de restauração mostram por que o banco de dados e a árvore de arquivos devem vir de um ponto de recuperação compatível.
1. Prepare a Restic e suas credenciais.
Instale o Restic a partir de uma fonte confiável e confirme se ele está disponível para a conta que executará a tarefa. O exemplo pressupõe que a tarefa seja executada como root para que possa ler os arquivos do Nextcloud e o dump do banco de dados. Ele usa um repositório SFTP remoto para que uma falha no servidor de aplicativos de Jordan não apague também a única cópia de segurança.
restic version
install -d -m 700 /root/.config/restic
install -d -m 700 /root/.config/nextcloud
Crie uma senha forte para o repositório Restic e salve-a /root/.config/restic/nextcloud-passwordcom permissões somente de root. Mantenha uma cópia de segurança dessa senha em um local seguro, separado do servidor e do repositório. O Restic criptografa os dados do repositório, mas perder a senha pode tornar esses backups criptografados inutilizáveis. Não insira a senha diretamente no script ou na linha do cron.
Configure o acesso SSH não interativo para a conta de backup no host remoto e verifique a chave do host por meio de um canal confiável. Defina o local do repositório abaixo para um diretório no qual a conta tenha permissão de escrita:
export RESTIC_REPOSITORY='sftp:backup@vault.example.net:/srv/restic/nextcloud'
export RESTIC_PASSWORD_FILE='/root/.config/restic/nextcloud-password'
restic init
Inicialize um repositório apenas uma vez. O guia de preparação de repositórios do Restic documenta os backends de armazenamento suportados e a inicialização. Trate o arquivo de senhas e a chave SSH como credenciais confidenciais e restrinja o acesso a eles.
2. Mantenha o banco de dados e os arquivos em um ponto compatível.
O Nextcloud recomenda o modo de manutenção para backups, pois ele bloqueia novos logins e sessões existentes para evitar inconsistências de dados. O comando deve ser executado como o usuário HTTP; em uma configuração típica de pacote Ubuntu, esse usuário é o `sudo` www-data. A janela de manutenção do Jordan dura até o despejo do banco de dados e o backup do Restic, portanto, os usuários não podem trabalhar no Nextcloud durante esse período.
Para o MariaDB, o manual do Nextcloud usa mariadb-dump --single-transaction`. Armazene as credenciais do banco de dados em um arquivo de configurações padrão do cliente protegido, por exemplo , `/etc /root/.config/nextcloud/mariadb.cnf/client.d/`, em vez de incorporar uma senha no comando:
[client]
user=nextcloud_backup
password=REPLACE_WITH_A_SECRET
host=localhost
Restrinja o arquivo com chmod 600 /root/.config/nextcloud/mariadb.cnf. Crie uma conta de banco de dados com apenas os privilégios necessários para o seu servidor e procedimento de despejo. Se o seu Nextcloud usa PostgreSQL ou SQLite, substitua-o pelo método de backup documentado; não execute o comando do MariaDB sem alterações.
3. Crie um script de backup protegido
Jordan salva o seguinte arquivo como /usr/local/sbin/nextcloud-restic-backupexecutável. Ele usa um bloqueio para evitar execuções sobrepostas, ativa o modo de manutenção antes de criar o despejo de memória, faz backup do despejo com os diretórios de aplicativo e dados e tenta desativar o modo de manutenção mesmo que um comando posterior falhe.
#!/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"
Após revisar os caminhos, crie o executável com privilégios de root e permissões de administrador 700. O script pressupõe que a instalação utilize www-datao MariaDB e os caminhos listados; verifique-os em relação config/config.phpà configuração do seu servidor web primeiro. Também pressupõe que nenhum outro administrador tenha habilitado o modo de manutenção. Se o comando, o dump ou o upload do Restic falhar, o shell será encerrado com um erro e o mecanismo de interrupção tentará restaurar o serviço; verifique os logs para confirmar se isso ocorreu. O dump é armazenado com permissões restritivas e removido após a execução.
Este padrão simples mantém o site indisponível durante toda a varredura e upload do Restic. Para um diretório de dados grande, isso pode demorar muito. Use um dump coordenado do banco de dados e um snapshot do armazenamento, ou outro design de backup consistente com o aplicativo, se o seu sistema de arquivos ou plataforma de armazenamento o suportar. Certifique-se de que o banco de dados e o snapshot do arquivo representem um ponto compatível no tempo; copiar independentemente um banco de dados ativo e um diretório de dados em constante mudança pode gerar um backup difícil de restaurar.
4. Agende a tarefa com o cron.
Após a execução manual ser concluída com sucesso, Jordan instala o script e o agenda para um período de inatividade. Como root, edite o crontab do root com o seguinte comando sudo crontab -ee adicione:
15 2 * * * /usr/local/sbin/nextcloud-restic-backup >> /var/log/nextcloud-restic.log 2>&1
Este exemplo começa às 2h15 da manhã, de acordo com o fuso horário do cron do servidor; escolha um horário em que a janela de manutenção seja aceitável. O cron possui um ambiente menor do que um shell interativo, portanto, o script define PATHexplicitamente e usa caminhos absolutos. Crie o arquivo de log com permissões restritivas e configure a rotação de logs ou envie a saída para o serviço de registro padrão do seu sistema. O agendamento do cron apenas inicia a tarefa: ele não confirma se o backup foi concluído ou se uma restauração funcionará.
5. Defina o período de retenção e verifique o resultado.
Após um backup bem-sucedido, Jordan verifica se um instantâneo foi criado:
restic snapshots --tag nextcloud
restic check
restic checkVerifica a estrutura do repositório. Uma verificação periódica restic check --read-datatambém lê dados armazenados e pode consumir bastante tempo de rede e disco, portanto, agende-a de acordo com o tamanho do repositório e as necessidades de recuperação. O guia de retenção de snapshots do Restic explica que o descarte de snapshots e a remoção de dados não referenciados são tarefas separadas e que a remoção de dados não referenciados bloqueia o repositório. Comece com um teste e uma política que atenda aos seus requisitos de retenção:
restic forget --tag nextcloud --keep-daily 7 --keep-weekly 5 \
--keep-monthly 12 --dry-run
Analise os snapshots que o sistema propõe remover. Se estiver satisfeito, remova os snapshots --dry-rune adicione-os --prune; execute a limpeza quando ela não entrar em conflito com o backup noturno. Esses prazos de retenção são apenas um exemplo, não uma política universal. Considere os requisitos legais de retenção, o armazenamento disponível e o período de recuperação necessário.
O teste relevante é um exercício de restauração. Restaure um snapshot recente em um diretório temporário em um sistema separado, não nos caminhos do Nextcloud de produção do Jordan:
restic restore latest --tag nextcloud --target /tmp/nextcloud-restore-check
Confirme se a árvore restaurada contém a configuração, os dados e o dump do banco de dados esperados e inspecione os arquivos representativos. Para um exercício de recuperação completo, siga o manual de restauração do Nextcloud em um ambiente isolado e verifique o login, o acesso aos arquivos e os compartilhamentos esperados antes de utilizar o procedimento. A documentação de restauração do Restic descreve a seleção de snapshots e destinos de restauração.
Como saber quando essa abordagem precisa mudar?
A tarefa cron de Jordan só é adequada se a janela de manutenção coincidir com a duração do backup e se todos os caminhos de dados necessários forem locais e legíveis. Altere o design quando qualquer um destes sinais aparecer:
- O site permanece em modo de manutenção por mais tempo do que os usuários podem tolerar: planeje snapshots coordenados ou outro método consistente com a aplicação.
- Os registros mostram caminhos ausentes, erros de permissão, falha no despejo do banco de dados ou uma saída do Restic diferente de zero: corrija esses problemas antes de considerar o snapshot como concluído.
- Os dados residem em armazenamento externo ou em outro servidor: inclua um backup consistente desse armazenamento no plano de recuperação.
- Um teste de restauração não inclui arquivos, configuração, estado do banco de dados ou o código necessário do aplicativo/tema: atualize as entradas de backup e repita o procedimento.
- A senha do Restic ou as credenciais SSH existem apenas no servidor que está sendo copiado: armazene as credenciais de recuperação separadamente e verifique se apenas um administrador autorizado pode acessá-las.
Para Jordan, o sucesso é visível: o log do cron mostra uma execução concluída, restic snapshotslista um snapshot recente com tags, as verificações do repositório não relatam erros e um teste de restauração recupera uma instância coerente do Nextcloud. Um comando agendado é o início de uma rotina de backup; somente um conjunto completo e restaurável de dados de banco de dados, configuração, aplicativo e usuário fornece um caminho de recuperação viável.
Referências oficiais