restic 是一個(gè) Go 語(yǔ)言編寫(xiě)的備份工具,特點(diǎn)是快速、高效而且安全。
下載最新版本:release page
目前最新版本是 0.0.4,你可以下載回來(lái)解壓構(gòu)建使用。但是,我習(xí)慣使用 Docker,畢竟我懶得裝 Golang 到服務(wù)器編譯,所以我還是用 Docker 運(yùn)行吧。
上面 release 有已經(jīng)編譯好的版本,我寫(xiě)完全文才發(fā)現(xiàn),打臉。
( ̄ε(# ̄)☆╰╮( ̄▽ ̄///)
官方給了一份 Dockerfile,官方的鏡像自然是比較全面的,但我基本用不上那些功能,所以還是自己寫(xiě)一份吧:
FROM alpine:edge
ENV RESTIC_VERSION=0.4.0
RUN apk add --no-cache go git musl-dev openssl ca-certificates && \
wget https://github.com/restic/restic/releases/download/v${RESTIC_VERSION}/restic-${RESTIC_VERSION}.tar.gz && \
tar -xzvf restic-${RESTIC_VERSION}.tar.gz && \
cd restic-${RESTIC_VERSION} && \
go build build.go && \
./build && \
mv restic /bin/restic && \
cd ../ && \
rm -rf restic-* && \
apk del -q go git musl-dev openssl && \
rm -rf /var/cache/apk/*
上面從源代碼構(gòu)建整個(gè)程序,和官方那目測(cè)幾百 MB 的鏡像體積,我這個(gè) Dockerfile 僅有 14 MB。
如果你需要的話可以使用
docker pull zuolan/restic拉取鏡像,只有 6MB 的傳輸體積。
先運(yùn)行看一下說(shuō)明,順便測(cè)試一下鏡像運(yùn)行時(shí)是否正常:
docker run --rm -it zuolan/restic restic --help
一般來(lái)說(shuō)沒(méi)什么問(wèn)題,畢竟都構(gòu)建成功了。
這個(gè)備份工具有點(diǎn)類似于 Git 這種版本控制工具,有著倉(cāng)庫(kù)(repository)的概念,所以我們先初始化倉(cāng)庫(kù):
$ docker run --rm -it -v ~/backup:/tmp/backup zuolan/restic restic init --repo /tmp/backup
enter password for new backend:
enter password again:
created restic backend 085b3c76b9 at /tmp/backup
Please note that knowledge of your password is required to access the repository.
Losing your password means that your data is irrecoverably lost.
記住密碼,不然你數(shù)據(jù)就無(wú)法恢復(fù)了。
然后創(chuàng)建一個(gè)快照:
$ docker run --rm -it \
-v ~/backup:/tmp/backup \
-v ~/nginx:/tmp/nginx \
zuolan/restic \
restic -r /tmp/backup backup /tmp/nginx
enter password for repository:
scan [/tmp/work]
scanned 764 directories, 1816 files in 0:00
[0:29] 100.00% 54.732 MiB/s 1.582 GiB / 1.582 GiB 2580 / 2580 items 0 errors ETA 0:00
duration: 0:29, 54.47MiB/s
snapshot 40dc1520 saved
這里面第一次索引可能會(huì)比較耗時(shí)間,但實(shí)際上也是挺快的,幾GB的數(shù)據(jù)也是喝一杯水的功夫就搞定了。
查看一下倉(cāng)庫(kù)的快照:
$ docker run --rm -it \
-v ~/backup:/tmp/backup \
zuolan/restic \
restic -r /tmp/backup snapshots
enter password for repository:
ID Date Host Tags Directory
----------------------------------------------------------------------
9236eead 2017-02-09 14:51:10 e1c6f61cb5e0 /tmp/nginx
注意的是,倉(cāng)庫(kù)和快照不是一對(duì)一的,你可以在一個(gè)倉(cāng)庫(kù)中存放不同目錄的多個(gè)快照,所以一般只用一個(gè)備份倉(cāng)庫(kù)就可以了,除非你數(shù)據(jù)很多很復(fù)雜。
例如給其他目錄也備份:
$ docker run --rm -it \
-v ~/backup:/tmp/backup \
-v ~/apache:/tmp/apache \
zuolan/restic \
restic -r /tmp/backup backup /tmp/apache
注意 -v 參數(shù)中原來(lái)的 nginx 改為了 apache,這樣在數(shù)據(jù)卷中也要相應(yīng)修改名稱,避免程序認(rèn)為是同一個(gè)目錄的變動(dòng)而修改了原有的快照。
排除文件/夾自然也是老辦法:--exclude 或者 --exclude-file 之類的參數(shù)。
恢復(fù)快照:
$ docker run --rm -it \
-v ~/backup:/tmp/backup \
-v ~/nginx:/tmp/nginx \
zuolan/restic \
restic -r /tmp/backup restore 9236eead --target /tmp/nginx
restoring <Snapshot 9236eead of [/tmp/nginx] at 2017-02-09 14:51:10.376787233 +0000 UTC by @e1c6f61cb5e0> to /tmp/nginx
完美恢復(fù)!~
官方教程地址:
https://restic.readthedocs.io/en/stable/Manual/
詳細(xì)的我還要再看看,我才剛接觸這個(gè)軟件兩個(gè)小時(shí),有什么問(wèn)題可以留言,笑。
寫(xiě)在最后,為了使用愉快,你最好用 alias 把整個(gè) Docker 命令丟到 .bashrc 中:
alias restic="docker run --rm -v ~/data:/tmp/data zuolan/restic restic"
~/data 是你備份數(shù)據(jù)的地方,因?yàn)槲沂恰叭f(wàn)物皆容器”的原則,所以服務(wù)器全部數(shù)據(jù)都統(tǒng)一放置在一個(gè)文件中,管理備份很輕松。
這樣你使用 restic 命令時(shí)實(shí)際上就是調(diào)用這個(gè)鏡像運(yùn)行容器了??傊褂梅绞诫S機(jī)應(yīng)變。