Programação Por Equipe DevBras

Capa do artigo: Fotos no servidor de casa com Immich: backup fora de casa antes do primeiro álbum

Fotos no servidor de casa com Immich: backup fora de casa antes do primeiro álbum

Um servidor de fotos em casa só é seguro com cópia em outro lugar. Monte o backup do banco e das fotos com restic, fixe a versão e teste a restauração.

São 38 mil fotos de 12 anos de família num servidor caseiro com Immich, num único HD de 4 TB ao lado do roteador. Numa tempestade, a fonte queima e leva o disco junto. O celular já tinha liberado espaço porque "está tudo no servidor". A resposta curta: sair da nuvem alheia troca o risco de dono, não o elimina. Um servidor de fotos em casa precisa de pelo menos uma cópia em outro lugar físico, com histórico de versões, incluindo o banco de dados, e de um teste de restauração feito antes que você precise dele.

O exemplo deste guia é um mini PC com Debian e Docker, Immich instalado pelo Docker Compose em /srv/immich, fotos em /srv/immich/library, um HD externo USB e um segundo computador na casa da mãe, acessível por SSH.

Por que um disco na sala não é backup

Backup é uma cópia que sobrevive ao que destrói o original. Um disco único na sala sobrevive a quase nada: falha mecânica, surto de energia, roubo, incêndio, uma exclusão por engano no aplicativo. RAID também não resolve isso. Ele protege contra a morte de um disco, mas apaga as fotos dos dois discos ao mesmo tempo quando alguém exclui um álbum, e ambos estão na mesma casa.

A regra prática conhecida como 3-2-1 resume o que é preciso: três cópias dos dados, em pelo menos dois meios diferentes, com uma delas fora do local. No exemplo, as três cópias são o disco do servidor, o HD externo e o computador na casa da mãe.

Sincronizar não é fazer backup

Uma cópia que espelha o original, apagando o que foi apagado lá, propaga o erro. Se um ransomware cifra as fotos ou alguém apaga uma pasta, a sincronização da madrugada replica o estrago. Backup de verdade guarda versões: você consegue voltar à foto como ela era há uma semana ou há três meses.

O que precisa entrar na cópia

O Immich guarda duas coisas que não se reconstroem uma sem a outra:

  • Os arquivos originais, na pasta configurada em UPLOAD_LOCATION no arquivo .env.
  • O banco PostgreSQL, com álbuns, pessoas reconhecidas, descrições, quem compartilhou o quê.

Miniaturas e vídeos convertidos podem ser regerados a partir das originais, então dá para deixá-los fora da cópia remota e economizar espaço. As originais e o banco, não. Versões recentes do Immich geram dumps automáticos do banco dentro da pasta de upload; confira na documentação de backup da sua versão onde eles ficam e com que frequência são feitos. Mesmo assim, um dump feito pelo seu script, logo antes da cópia, deixa o backup coerente com as fotos daquele momento.

Como montar o backup passo a passo

  1. Fixe a versão do Immich. No .env, troque IMMICH_VERSION=release pelo número da versão que você está usando, tirado da página de releases. Atualize de propósito, lendo as notas, nunca por acidente num docker compose pull. O porquê está em a tag latest mente.
  2. Coloque as fotos num volume separado do sistema. Reinstalar o sistema não pode levar o álbum junto.
  3. Escolha a ferramenta. O exemplo usa restic, que faz cópias com versões, deduplicação e criptografia, e grava tanto em disco local quanto via SFTP.
  4. Crie dois repositórios: um no HD externo e outro no computador da casa da mãe.
  5. Agende o script para a madrugada.
  6. Defina a retenção: quantas versões diárias, semanais e mensais guardar.
  7. Teste a restauração logo após o primeiro backup e depois a cada poucos meses.

Criando os repositórios

apt install restic
openssl rand -base64 32 > /root/.restic-senha
chmod 600 /root/.restic-senha

restic -r /mnt/hd-externo/restic-fotos --password-file /root/.restic-senha init
restic -r sftp:backup@casa-da-mae:/srv/restic/fotos --password-file /root/.restic-senha init

Guarde uma cópia dessa senha fora do servidor, num gerenciador de senhas. Sem ela, os repositórios são irrecuperáveis, inclusive para você.

O script diário

#!/bin/sh
set -eu
SENHA=/root/.restic-senha
DUMP=/srv/immich/dump-banco.sql.gz

docker exec immich_postgres pg_dumpall --clean --if-exists --username=postgres | gzip > "$DUMP"

for REPO in /mnt/hd-externo/restic-fotos sftp:backup@casa-da-mae:/srv/restic/fotos; do
  restic -r "$REPO" --password-file "$SENHA" backup /srv/immich/library "$DUMP" --exclude /srv/immich/library/thumbs --exclude /srv/immich/library/encoded-video
  restic -r "$REPO" --password-file "$SENHA" forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune
done

O nome do container e o usuário do banco são os padrões do arquivo Compose oficial; se você mudou DB_USERNAME no .env, ajuste o --username. Confira também os nomes das subpastas de miniaturas e vídeos convertidos na sua instalação antes de excluí-las. Agende com o crontab -e do root:

30 3 * * * /usr/local/bin/backup-fotos.sh >> /var/log/backup-fotos.log 2>&1

Como testar a restauração

O teste que importa é o de desligar o disco principal e ver se as fotos ainda existem. Faça uma versão segura disso:

restic -r sftp:backup@casa-da-mae:/srv/restic/fotos --password-file /root/.restic-senha snapshots
restic -r sftp:backup@casa-da-mae:/srv/restic/fotos --password-file /root/.restic-senha check
restic -r sftp:backup@casa-da-mae:/srv/restic/fotos --password-file /root/.restic-senha restore latest --target /tmp/teste-restauracao

Abra algumas fotos restauradas de anos diferentes, veja se o dump do banco descompacta e, uma vez por ano, suba um Immich de teste com o banco e as fotos restauradas. Meça quanto tempo levou para trazer tudo da casa da mãe: esse é o seu tempo real de recuperação.

Acesso de fora de casa sem abrir a porta

Abrir a porta do Immich no roteador para ver as fotos na rua expõe o álbum de família a qualquer varredura da internet. Prefira uma VPN (WireGuard ou um serviço baseado nele) e acesse como se estivesse em casa. Se for publicar, use HTTPS num proxy reverso, senha forte e atualizações em dia. Se o nome não abrir de fora, o diagnóstico está em ERR_ADDRESS_UNREACHABLE. E lembre que fotos de celular carregam localização; antes de compartilhar álbuns, veja foto do celular pode trazer o endereço da casa.

Erros comuns

  • Disco único como "backup". Uma falha, um raio ou um roubo levam o álbum inteiro de uma vez.
  • Copiar as fotos e esquecer o banco. Você recupera 38 mil arquivos soltos, sem álbuns, pessoas nem descrições.
  • Sincronização espelhada no lugar de backup com versões. Exclusão ou ransomware se propagam para a cópia na madrugada seguinte.
  • Imagem sem versão fixa. Uma atualização com mudança no banco entra sem você ler as notas e quebra o serviço.
  • Perder a senha do repositório. As cópias criptografadas existem, mas ninguém consegue abri-las.
  • Porta aberta na internet sem autenticação forte. O álbum de família vira alvo de qualquer robô que varre endereços.

Checklist

  • Existe pelo menos uma cópia fora de casa.
  • O backup guarda versões, não só espelha.
  • O banco entra na cópia junto com as originais.
  • A versão do Immich está fixada no .env.
  • A senha do repositório está guardada fora do servidor.
  • Uma restauração foi testada e o tempo foi medido.
  • O acesso de fora passa por VPN ou HTTPS com autenticação.

Se o disco do servidor parasse agora, de onde viriam as fotos, e quanto tempo você aceita esperar para recuperar um ano de álbum?

Avalie este artigo

Referência: https://docs.immich.app/install/docker-compose