Backrest로 restic 날로먹기
3..2..1... Backup! #

3-2-1 Backup을 만족하기 위해 NAS의 스토리지를 AWS S3 호환 블록 스토리지인 Storj에 백업하고 있습니다.
NAS OS로 TrueNAS를 사용하다 보니, 네이티브로 지원하는 기능인 TrueCloud를 활용하고 있는데요, 이게 Dataset의 백업에는 상당히 편리하지만, zvol을 백업할 때는 TrueCloud의 백엔드인 restic의 동작 원리상 백업마다 zvol 전체를 스캔하는 아주 골때리는 과정을 거치게 됩니다.

처음에는 NAS에서 모든 백업을 다 하는 게좋지 않을까 하며 꾸역꾸역 zvol을 백업했지만, 매일 백업마다 1~2시간 단위로 HDD에 엄청난 고문을 주는 것은 물론 동시에 L2ARC를 뒤집어놓는걸 보고만 있을 수는 없겠더라고요. Storj의 arvice 버킷 최소 데이터 보존 기간이 지나는 대로 VM에 restic을 설치해 직접 백업하기로 마음먹게 되었습니다.
그리고 때가 되어 VM에 restic을 설치하려 하니..
...?
restic도 골치 아픈데, rclone이 어쩌고 하는 Docs를 보고 있으니 벌써부터 머리가 하얘졌습니다.
Backrest #
garethgeorge/backrest
Backrest is a web UI and orchestrator for restic backup. - garethgeorge/backrest
github.com분명히 취미로 HomeLab하는 사람들도 restic 사용할텐데.. 하며 쉬운 방법을 찾아보던 중 GUI로 restic을 사용할 수 있는 Backrest를 발견하게 되었습니다.
Backrest is a web-accessible backup solution built on top of restic. Backrest provides a WebUI which wraps the restic CLI and makes it easy to create repos, browse snapshots, and restore files. Additionally, Backrest can run in the background and take an opinionated approach to scheduling snapshots and orchestrating repo health operations.
Backrest GitHub README.md 중 일부 [링크]
restic을 wrapping하는 WebUI 뿐만 아니라 restic의 모든 기능은 물론 스케줄링까지도 도와준다고 합니다.
version: "3.8"
services:
backrest:
image: ghcr.io/garethgeorge/backrest:latest
container_name: backrest
hostname: backrest
volumes:
- ./backrest/data:/data
- ./backrest/config:/config
- ./backrest/cache:/cache
- ./backrest/tmp:/tmp
- ./backrest/rclone:/root/.config/rclone # Mount for rclone config (needed when using rclone remotes)
- /path/to/backup/data:/userdata # Mount local paths to backup
- /path/to/local/repos:/repos # Mount local repos (optional for remote storage)
environment:
- BACKREST_DATA=/data
- BACKREST_CONFIG=/config/config.json
- XDG_CACHE_HOME=/cache
- TMPDIR=/tmp
- TZ=Asia/Seoul
ports:
- "9898:9898"
restart: unless-stoppedGitHub 리포의 Compose 예제를 참고해 deploy했습니다.

Backrest에 접속한 후 기본 설정(언어, 패스워드)을 하면 빈 화면이 뜹니다.
"Repositories" 탭에서 백업의 위치를 지정하고, "Plans" 탭에서 백업 타겟이나 주기 등을 정하는 것 같습니다.
Repository 설정 #

"Add Repo" 버튼을 클릭해 추가해 봅시다.
여기서는 AWS S3에 호환되는 Storj를 사용하기 때문에 게이트웨이를 지정해서 s3:https://gateway~ 처럼 입력했습니다.
패스워드는 restic의 암호화에 사용하기 때문에 잃어버리지 않도록 조심하고..

AWS S3를 사용하기 때문에 키를 입력합니다. 테스트를 위해 test 버킷에만 접근할 수 있는 임시 키를 만들었습니다. restic env를 입력할 때 Compose yaml에서 env를 전달하면 그걸 env로 넘길 수 있다는 것 같습니다.


아래로 계속 내려가 보면 Prune과 Check 작업을 설정할 수 있습니다. Prune는 스넵샷이 삭제되어 더 이상 참조되지 않는 데이터를 지우는 작업을, Check는 무결성 검사 작업입니다.
Prune는 월 1회 하도록 그대로 두고 Check는 비활성화해 뒀습니다.

저장하고 나면 이렇게 표시됩니다. 앞에서 설정한 Prune 작업이 scheduled로 걸려있는 모습입니다.
Plan 설정 #

다음으로 Plan입니다. 앞에서 설정한 Repo를 지정해서 그쪽으로 백업을 하는 모양입니다.
Backrest는 /userdata 아래에 백업할 디렉토리를 마운트하도록 권장하고 있어,
VM의 /home/varofla/test_dir을 Backrest의 /userdata/test_dir에 마운트한 뒤 Paths에 입력했습니다.

Plan에서는 백업 스케줄과 스넵샷 보존 정책을 설정할 수 있습니다. 테스트이니 일단 둘 다 꺼줬습니다.

잘 추가된 모습입니다.
백업 및 복원 테스트 #

Backrest의 백업을 테스트해 보기 위해 VM으로 돌아가서 타겟 디렉토리에 100MB짜리 파일을 하나 만들었습니다.

다시 Backrest UI로 돌아가서 Plan에 진입한 후 "Backup Now" 버튼을 클릭,

백업이 완료되면 상태를 보여줍니다.

앞에서 백업했던 100MB 파일을 삭제한 후,

Backrest에서 복원 버튼을 클릭합니다.

복원할 위치를 설정할 수 있네요. 대충 적당히 입력했습니다.

다운로드가 완료된 후,

다시 복원된 것을 확인할 수 있었습니다.
마무리 #

GUI로 restic을 사용할 수 있도록 도와주는 Backrest를 사용해 백업과 복원을 테스트해 봤습니다.
별문제 없이 깔끔하게 백업되고 복원까지 잘 되어서 VM의 Docker 디스크를 기존 TrueCloud zvol 백업에서 VM에서 직접 백업하도록 옮겼습니다. 이것 말고도 보안 카메라용 라즈베리파이가 하나 있는데, 조만간 그쪽도 Backrest로 옮겨둬야겠습니다.

