Skip to content

Instantly share code, notes, and snippets.

@everaldo
Last active February 9, 2026 04:25
Show Gist options
  • Select an option

  • Save everaldo/8067beae0310e2eeea465e0a8d5d7678 to your computer and use it in GitHub Desktop.

Select an option

Save everaldo/8067beae0310e2eeea465e0a8d5d7678 to your computer and use it in GitHub Desktop.
Backup em rede local com container Docker
# se o cliente for Mac, garanta que rsync está atualizado, o que vem por padrão no Mac é antigo
brew install rsync
# <CHAVE_PRIVADA> - por padrão é ~/.ssh/id_ed25519
# <PORT> - por padrão é 22, mas no outro arquivo estamos usando 2222
# --info=progress2 - só existe na versão nova do rsync, não na padrão do mac, atualize com brew (veja acima)
# <IP_MAQUINA> - IP da máquina que está rodando o servidor de SSH
# <DESTINO_DIR> - diretório onde vai salvar
# Note que a IA sugeriu adicionar esses diretórios --exclude, para evitar arquivos de cache, como node_modules, __pycache__
# se quiser copiar tudo, sem exceção, remova essas linhas
rsync -avh --info=progress2 \
--partial --append-verify \
--exclude node_modules \
--exclude .venv \
--exclude __pycache__ \
--exclude .pytest_cache \
--exclude dist \
--exclude build \
--exclude .mypy_cache \
--exclude .bundle \
--exclude vendor/bundle \
--exclude tmp \
--exclude log \
--exclude .DS_Store \
-e "ssh -i <CHAVE_PRIVADA> -o IdentitiesOnly=yes -p <PORT>" \
backup@<IP_MAQUINA>:/data/ \
~/<DESTINO_DIR>/
# Everaldo Gomes 09/02/2026
# Esta imagem é baseada em Alpine Linux, mas não vem com rsync instalado
# Construa a imagem com este comando: docker build -t openssh-rsync .
# openssh-rsync - o nome da imagem, é apenas um thin wrapper sobre openssh-server, instalando rsync lá dentro
FROM linuxserver/openssh-server:latest
RUN apk add --no-cache rsync
# --rm - remove o container após terminar
# -d - detached - roda em background - não trava o shell esperando o fim
# wsl_ssh_push - o nome do container
# Porta 2222 para não conflitar, caso exista servidor ssh na porta 22
# <dir_path> o diretório que você quer montar
# <pub_key_file> o caminho para sua chave pública
# backup - o nome do usuário do container
# PUBLIC_KEY_FILE - acho que não funciona sozinha, melhor montar em /config/.ssh/authorized_keys, por padrão - COMENTADO
# PUID e PGID - geralmente, o primeiro usuário de uma máquina tem id 1000, mas pode conferir em /etc/passwd, o seu ID e GID
# openssh-rsync - o nome da imagem que você construiu com o Dockerfile acima
docker run --rm -d --name wsl_ssh_push \
-p 2222:2222 -v <dir_path>:/data \
-v <pub_key_file>:/config/.ssh/authorized_keys:ro \
-e USER_NAME=backup \
-e PASSWORD_ACCESS=false \
# -e PUBLIC_KEY_FILE=/config/authorized_keys:ro \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=America/Sao_Paulo\
openssh-rsync
# Este comando é bem útil, foi usado no wsl_ssh_push original, mas pode ser usado em
# qualquer container, para descobrir qual o Sistema Operacional
# É uma cascata de comandos || true garante executar o próximo comando
# No nosso caso, descobrimos que a imagem base é construída sobre Alpine Linux, então usamos apk para instalar pacotes
docker exec -it wsl_ssh_push sh -lc 'cat /etc/os-release || true ; command -v apk || true; command -v apt-get || true ; command -v dnf || true ; command -v yum || true'
# Se quiser gerar uma chave SSH nova para esta operação, garantindo a segurança na transmissão e no acesso
ssh-keygen -t ed25519 -C "seuemail@exemplo.com"
# Gera um par de chaves, cuidado pra não sobreescrever as existentes. Lembre-se a chave privada você nunca compartilha com terceiros, neste
# caso você compartilha ela com o PC que vai acessar o backup
# ssh com -vvv faz um super debug, para encontrar erros. IdentitiesOnly é para logar somente com chaves privadas -p é a porta
ssh -vvv -i .ssh/id_ed25519 -o IdentitiesOnly=yes -p 2222 backup@<IP_DA_MAQUINA>
# ver os logs do container, que foi nomeado como wsl_ssh_push
docker logs --tail=200 wsl_ssh_push
# cada vez que você cria o container, muda a assinatura do host, então eu prefiro deletar o arquivo inteiro known_hosts se eu
# me conectei nele
rm ~/.ssh/known_hosts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment