- Visão geral
- Estrutura do projeto
- Componentes e funcionamento
- Instalação e uso
- Restauração de backup
- Logs e rotação de arquivos
- Comandos úteis de manutenção
- Segurança e recomendações
- Observações importantes
Este projeto cria um serviço de backup automatizado usando:
- Borg Backup como mecanismo de snapshot e deduplicação
- Borgmatic para orquestrar backups e verificações
- Rclone para sincronizar o repositório Borg local com um remoto Google Drive
- Docker para empacotar a aplicação em um container
- Supercronic para executar backups diários automaticamente
O objetivo é fazer backup do volume vaultwarden-data para um repositório Borg presente em um volume Docker local e, em seguida, sincronizar esse repositório para o remoto gcp-storage:BACKUP-VOLUMES.
Arquivos e diretórios principais:
.
├── Dockerfile
├── borg-keys
│ ├── repository-paper.txt
│ ├── repository-qr.html
│ └── repository.key
├── compose.yml
├── config
│ ├── logrotate.conf
│ └── supercronic.conf
├── config.yaml
├── example.env
├── rclone_config
│ └── rclone.conf
├── readme.md
└── scripts
├── backup.sh
├── bootstrap.sh
└── logrotate.shcompose.yml: definição do serviço Docker ComposeDockerfile: imagem personalizada que instala Borg Backup, borgmatic, rclone e dependências.env: variáveis de ambiente sensíveisconfig.yaml: configuração do borgmaticconfig/logrotate.conf: configuração de rotação de logsscripts/bootstrap.sh: inicialização do container, criação do repositório e arranque do supercronicscripts/backup.sh: comando de backup Borgmatic executado pelo supercronicconfig/: agendamento supercronic para backup e logrotaterclone_config/rclone.conf: configuração do rclone para o remoto Google Driveborg-keys/: local onde as chaves de repositório Borg são exportadas
O serviço borg-backup é construído a partir do Dockerfile deste repositório. Ele monta:
vaultwarden-datacomo fonte de backup em modo somente leiturabackup-local-borgcomo repositório Borg local./borg-keyspara armazenar chaves e material de recuperação./rclone_configcomo configuração do rclone./config.yamlcomo configuração do borgmatic./scriptspara o código de bootstrap e backup
O entrypoint do container é scripts/bootstrap.sh, que inicializa o repositório Borg se necessário e inicia o cron em primeiro plano.
A imagem base usa debian:bookworm-slim e instala:
- dependências de sistema necessárias para compilação e execução de Borg Backup
rclone- Python 3,
uv, e pacotes Python de desenvolvimento
Depois, cria um ambiente virtual em /app/borg-env e instala:
- BorgBackup a partir do código fonte
borgmaticapprise
O container resultante expõe o comando borg --version por padrão, mas na execução do Compose o entrypoint subscreve esse comportamento.
Configuração do borgmatic:
source_directories:/volumes/vaultwarden-datarepositories:/volumes/backup-local-borg/keep_daily,keep_weekly,keep_monthlypara retenção de snapshotschecksde integridade do repositório e dos arquivosapprisepara enviar notificações por e-mail em caso de falha e conclusãocommandspara rodarrclone syncapós verificações derepository
A sincronização final faz:
rclone sync /volumes/backup-local-borg/ gcp-storage:BACKUP-VOLUMES --config /root/.config/rclone/rclone.conf
Isso garante que o repositório local Borg seja espelhado no remoto Google Drive.
-
Política de retenção:
keep_daily: 7— mantém os snapshots diários mais recentes (tipicamente 7 dias).keep_weekly: 4— mantém as últimas 4 snapshots semanais (tipicamente 4 semanas).keep_monthly: 6— mantém as últimas 6 snapshots mensais (tipicamente 6 meses).
-
Formato de nome de archive:
archive_name_format: "{hostname}-{now:%Y-%m-%dT%H:%M:%S}"— inclui timestamp com precisão de segundos para evitar colisões e facilitar rastreio.
-
Checks e frequência:
checkscontémrepositoryearchives(comfrequency: 2 weeks). Essas verificações ajudam a detectar corrupção, mas podem ser custosas em I/O/CPU para repositórios grandes.
-
Notificações (Apprise):
send_logs: truefaz com que os logs sejam enviados nas notificações.- A URL configurada usa
mailtos://${SMTP_USER}:${SMTP_PASS}@smtp.gmail.com:${SMTP_PORT}?to=${SMTP_TO}&name=Borgmatic&starttls=yes || exit 1— observe que o|| exit 1está dentro da string. Verifique se Apprise/ borgmatic aceitam a URL literal; caso cause erro, remova|| exit 1.
-
Comandos pós-check:
- O bloco
commandsexecutarclone sync /volumes/backup-local-borg/ gcp-storage:BACKUP-VOLUMES --config /root/.config/rclone/rclone.confapós orepositorycheck quando o estado forfinish.
- O bloco
-
Efeitos práticos / exemplos:
- Com backups diários, os valores atuais mantêm ~7 snapshots recentes, agrupam versões semanais e mensais conforme as políticas acima.
- Se houver múltiplos backups por dia, o pruning considera os intervalos (diário/semana/mês) ao escolher quais arquivos manter.
-
Recomendações:
- Testar
rclone syncmanualmente antes de confiar na sincronização automática. - Agendar verificações de integridade em janelas com baixa atividade I/O.
- Implementar restaurações periódicas de teste para garantir que chaves e arquivos funcionem.
- Testar
-
Comandos úteis:
- Listar archives:
docker compose exec borg-backup borg list -r /volumes/backup-local-borg - Simular prune/listar retenção aplicada:
docker compose exec borg-backup /bin/sh -c 'borgmatic prune --list --verbosity 2'
- Testar
rclone:docker compose run --rm debian_container rclone lsd gcp-storage: --config /root/.config/rclone/rclone.conf
- Listar archives:
Variáveis de ambiente carregadas pelo Compose:
SMTP_USERSMTP_PASSSMTP_PORTSMTP_TOBORG_PASSPHRASE
A configuração atual do borgmatic utiliza Gmail como servidor SMTP fixo (smtp.gmail.com).
Segurança: nunca versionar
.envem repositórios públicos. ProtejaBORG_PASSPHRASEe as credenciais SMTP.
Fluxo de inicialização:
- Carrega variáveis de
/etc/cron.envse existir - Exporta o
PATHpara usar o ambiente virtual Borg - Verifica se o repositório Borg existe
- Se não existir, cria o repositório e exporta as chaves para
borg-keys/ - Executa
supercronic /etc/cron.d/supercronic.confpara manter o container ativo
O job executa borgmatic create e grava o status do backup no log.
Edite .env com as credenciais SMTP e a senha do repositório Borg:
SMTP_USER=<seu_usuario>
SMTP_PASS=<sua_senha>
SMTP_PORT=587
SMTP_TO=<destinatario>
BORG_PASSPHRASE=<senha_forte>Use uma senha forte para BORG_PASSPHRASE.
O arquivo rclone_config/rclone.conf deve conter o remote gcp-storage configurado para acesso ao Google Drive.
Atenção: Recomendo que instale o Rclone no host e faça autenticação. Posteriormente copie o arquivo rclone.conf para /rclone_config. Caso faça isso basta pular para Teste o acesso e Iniciar o serviço
docker compose run --rm debian_container rclone config reconnect gcp-storage: --config /root/.config/rclone/rclone.confrclone config reconnect gcp-storage: --config .\rclone_config\rclone.confdocker compose run --rm debian_container rclone lsd gcp-storage: --config /root/.config/rclone/rclone.confdocker compose up -d --buildNo primeiro start, o script bootstrap.sh:
- cria o repositório Borg se necessário
- exporta as chaves e arquivos de recuperação para
borg-keys - inicia o supercronic
Para disparar manualmente o backup dentro do container:
(logs serão gerados automáticamente)
docker compose exec borg-backup /bin/sh -c '/scripts/backup.sh'Os logs do backup são armazenados em /var/log/borg/borg-backup.log dentro do container:
docker compose exec borg-backup tail -n 50 /var/log/borg/borg-backup.logOs logs dos backups são centralizados em:
- Container:
/var/log/borg/borg-backup.log - Host: Volume do container (acessível via
docker compose exec)
O projeto inclui configuração automática de logrotate para:
- Política: Rotação mensal
- Retenção: Últimos 12 meses (comprimidos)
- Compressão: gzip (
.gz) - Arquivo original: Truncado (
copytruncate)
Arquivo de configuração: logrotate/logrotate.conf
# Define o usuário para evitar erros de permissão de pasta
su root root
# Configurações padrão seguras
compress
missingok
notifempty
# Regras específicas para os logs do Borg
/var/log/borg/*.log {
monthly
rotate 12
copytruncate
}
Logrotate é executado automaticamente:
- Horário: 17:05 (5 minutos após o backup)
- Frequência: Diária
- Cron job:
05 17 * * * /usr/sbin/logrotate -s /var/log/logrotate.status /etc/logrotate.conf
Listar logs comprimidos:
docker compose exec borg-backup ls -lh /var/log/borg/Extrair e visualizar um log antigo:
docker compose exec borg-backup sh -c 'gunzip -c /var/log/borg/<NOME DO ARQUIVO> | tail -n 50'Ver logs em tempo real:
docker compose exec borg-backup tail -f /var/log/borg/borg-backup.logA restauração envolve recuperar o repositório do remoto e extrair os arquivos desejados.
docker compose exec borg-backup rclone sync gcp-storage:BACKUP-VOLUMES /tmp/backup-local-borg --config /root/.config/rclone/rclone.confdocker compose exec borg-backup borg repo-list -r /tmp/backup-local-borgSe tiver executando os comandos via compose é necessário adicionar o comando para entrar no repositório antes de fazer a extração, se não irá para o diretório WORKDIR setado no Dockerfile.
docker compose exec borg-backup sh -c "cd / && borg extract -r /tmp/backup-local-borg::<NOME_DO_ARQUIVO> /destino/de/restauração"No caso como nosso volumes de dados do vaultwarden fica em volumes, o comando ficaria assim:
docker compose exec borg-backup sh -c "cd / && borg extract -r /tmp/backup-local-borg <NOME_DO_ARQUIVO> /volumes/vaultwarden-data"Para extrair apenas um arquivo ou diretório específicos:
docker compose exec borg-backup borg extract -r /tmp/backup-local-borg::<NOME_DO_ARQUIVO> path/do/arquivoAo interagir com o seu container de backup, a escolha do comando altera o contexto de execução:
docker compose exec borg-backup <comando>: Use esta opção quando estiver no diretório raiz do projeto. Ele é mais seguro pois utiliza o nome do serviço definido no seucompose.yml, abstraindo o nome real do container (backup-solution-borg-backup-1) e garantindo que você está dentro do contexto do projeto.docker exec -it <nome_do_container> <comando>: Use esta opção se estiver em outro diretório ou se precisar rodar um comando rápido sem depender da estrutura do projeto. É a forma mais direta de acessar qualquer container pelo nome que ele recebeu no Docker Engine.
Exemplo Prático (Verificação de Integridade):
Se estiver dentro da pasta do projeto:
docker compose exec borg-backup borg check --repo /volumes/backup-local-borg/ --verify-data -v
Se estiver em qualquer outro lugar (acessando pelo nome específico do container):
docker exec -it debian_container borg check --repo /volumes/backup-local-borg/ --verify-data -v
docker compose run --rm debian_container rclone lsd gcp-storage: --config /root/.config/rclone/rclone.confdocker compose exec borg-backup borg diff -r /volumes/backup-local-borg <ARCHIVE1> <ARCHIVE2>Exemplo:
docker compose exec borg-backup borg diff -r /volumes/backup-local-borg <arquivo1> <arquivo2>docker compose exec borg-backup borg extract --stdout -r /volumes/backup-local-borg <arquivo2> volumes/vaultwarden-data/config.json > /tmp/v2.txt- Proteja
.env,borg-keys/erclone_config/rclone.conf - Faça backup seguro das chaves exportadas em
borg-keys/repository.key,repository-paper.txterepository-qr.html - Não compartilhe
BORG_PASSPHRASE - Valide o acesso SMTP antes de depender de notificações por e-mail
- O backup local é armazenado no volume Docker
backup-local-borg - O repositório Borg é sincronizado automaticamente para o remoto Google Drive após cada execução de backup
- Se desejar alterar o remoto ou a pasta de destino no Drive, modifique o comando
rclone syncemconfig.yaml - O serviço atual assume
/volumes/vaultwarden-datacomo fonte de backup. Ajusteconfig.yamlpara incluir outras pastas ou volumes.