업데이트된 새로운 방법

최근 위키 작성을 열심히 하기 위해 다시금 마음을 다잡고 문서를 열심히 쓰고 있는데, 따로 문서를 백업한 적이 없어서 백업 정책에 대해 간단히 적어 본다.

이 위키는 다음 환경에서 동작한다.

도쿠위키는 따로 데이터베이스를 쓰지 않고 파일 기반으로 동작하는데, 따라서 DB 덤프 등의 귀찮은 작업이 있지는 않다. 적당히 파일을 압축해서 어딘가로 보내면 되는 것. 이는 다음의 스크립트를 통해 dropbox로 백업하는 것으로 해결하였다.

$ cat backup_to_dropbox.sh
#!/bin/sh

TODAY_YEAR=$(date '+%Y')
TODAY_MONTH=$(date '+%m')
TODAY_DAY=$(date '+%d')
TODAY_HMS=$(date '+%H:%M:%S')
TIME_SEPARATOR="T"
TODAY=$TODAY_YEAR-$TODAY_MONTH-$TODAY_DAY$TIME_SEPARATOR$TODAY_HMS
NAME="w.cublr.com"
VOLUME_NAME="$NAME-volume"
BACKUP_CONTAINER="arm32v6/alpine"
DOCKER="$(which docker)"
BACKUP_CONTAINER_DIR="/volume"
TMP_CONTAINER_DIR="/backup"
WORKING_CONTAINER_DIR="$BACKUP_CONTAINER_DIR/data"
BACKUP_DIR="pages"
BACKUP_NAME="$TODAY-$NAME.tar.gz"
BACKUP_DESTINATION="/docs/$TODAY_YEAR/$TODAY_MONTH/$TODAY_DAY"

DROPBOX_UPLOADER="dropbox_uploader.sh"

$DOCKER run --rm -v $VOLUME_NAME:$BACKUP_CONTAINER_DIR -v /tmp:$TMP_CONTAINER_DIR -w $WORKING_CONTAINER_DIR $BACKUP_CONTAINER tar -zcvf $TMP_CONTAINER_DIR/$BACKUP_NAME $BACKUP_DIR && \
$DROPBOX_UPLOADER upload /tmp/$BACKUP_NAME $BACKUP_DESTINATION/$BACKUP_NAME

컨테이너는 도쿠위키의 문서를 따로 저장하기 위해 docker volume을 사용하는데, 이 도커 볼륨을 마운트하는 새로운 컨테이너를 만들고 마운트 된 파일시스템을 tar로 압축하는 방식으로 동작한다. 뭔가 굉장히 복잡한 것 같지만 도커 볼륨을 백업하는 별다른 방법이 없다. 스크립트 내에서는 적당히 현재 시간을 가져와 백업 파일의 이름으로 사용한다.

드롭박스로의 업로드는 dropbox_uploader.sh를 사용한다. 간단한 쉘 스크립트로 드롭박스로의 업로드/다운로드의 기능을 사용할 수 있다. 사전에 드롭박스 앱에 대한 access key를 준비해야 하는데, 실행하면 친절하게 가이드를 주므로 크게 어려운 것은 아니다.

적당히 테스트가 문제 없으면 이를 자동으로 실행하도록 해야 하는데, crontab을 쓰면 간단히 반복시킬 수 있다. 다음과 같이 crontab 파일을 수정하였다.

$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

...

# m h dom mon dow user	command
...
0 * * * *	root	backup_to_dropbox.sh

이제 매 시각마다 백업된 압축 파일이 드롭박스로 업로드될 것이다. 다음과 같이 확인할 수 있다.

$ tree
.
└── cublr-wiki
    └── docs
        └── 2018
            └── 11
                ├── 10
                │   ├── 2018-11-10T00:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T01:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T02:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T03:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T04:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T05:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T06:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T07:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T08:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T09:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T10:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T11:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T12:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T13:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T14:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T15:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T16:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T17:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T18:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T19:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T20:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T21:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-10T22:00:01-w.cublr.com.tar.gz
                │   └── 2018-11-10T23:00:01-w.cublr.com.tar.gz
                ├── 11
                │   ├── 2018-11-11T00:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T01:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T02:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T03:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T04:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T05:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T06:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T07:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T08:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T09:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T10:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T11:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T12:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T13:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T14:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T15:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T16:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T17:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T18:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T19:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T20:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T21:00:01-w.cublr.com.tar.gz
                │   ├── 2018-11-11T22:00:01-w.cublr.com.tar.gz
                │   └── 2018-11-11T23:00:01-w.cublr.com.tar.gz
                ...