backup-with-nextcloud

概要

ファイル共有サービスの一つであるNextcloudと連携して,自分のサーバのファイルをバックアップするためのDockerイメージ backup-with-nextcloud を作成しました.

Nextcloud (https://nextcloud.com) は自分のサーバで動作させるファイル共有サービスです. 公式のDockerイメージ (https://hub.docker.com/_/nextcloud) もあります.

Docker (https://www.docker.com) はコンテナ型仮想環境のプラットフォームで,これによりサービスの動作環境の構築が行いやすくなります.

以下では

  1. backup-with-nextcloud とは何か?
  2. 何のために backup-with-nextcloud を作ったのか?
  3. backup-with-nextcloud はどんな仕組みで動くのか?

を説明します. また,具体的な動作例も示します.

backup-with-nextcloud とは何か?

backup-with-nextcloud はNextcloudと連携して自分のサーバのファイルをバックアップするためのDockerイメージで,次の機能を持ちます.

  • backup-with-nextcloud はあるサーバのバックアップしたいファイルを別のサーバのNextckoudと同期します.
  • backup-with-nextcloud では指定したスクリプトによってバックアップしたいファイルを生成することができます.
  • backup-with-nextcloud ではこれらの処理がcronによって繰り返し実行されます.

以上により,自分のサーバ上のファイルを別のNextcloudサーバと同期させることが可能となり,サービスのデータのバックアップすることができます.

backup-with-nextcloud のDockerイメージとDockerfileについてはそれぞれDocker Hub,GitHubで公開しています. 具体的な使い方は以下を参照してください.

何のために backup-with-nextcloud を作ったのか?

現在,私は契約しているVPSでいくつかのサービスを動作させており,今後これらを本格的に利用したいと考えています. ここで,これらのサービスを本格的に利用していくためにはデータをバックアップをすることが必須であると考えました.

私のVPSのサービスは全てDockerコンテナとして動作しています. また,サービスのデータはそれぞれのコンテナにマウントされたホストマシンのディレクトリに保存されています. これらのデータのバックアップは,

  1. バックアップデータ作成機能を持たないサービスについてはマウントされたホストマシンのディレクトリ内のファイル
  2. バックアップデータ作成機能を持つサービスについてははその機能を利用して作成したファイル

をNextcloudと同期することで実現できます. そこで,これらを実現するDockerイメージを作成しようと考えました.

backup-with-nextcloud はどんな仕組みで動くのか?

backup-with-nextcloudのDockerfileを以下に示します.

FROM debian:buster-slim

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update && apt-get install -y \
    cron \
    nextcloud-desktop-cmd \
&& rm -rf /var/lib/apt/lists/*

ENV CRON_EXP="0  *  *  *  *"
ENV CRON_USER="root"

RUN mkdir -p /backup/
RUN echo '#!/bin/bash' > /backup.sh && chmod +x /backup.sh

COPY ./sync-exclude.lst /sync-exclude.lst 
COPY ./entrypoint.sh /entrypoint.sh

CMD [ "/entrypoint.sh" ]

backup-with-nextcloudには定期的なバックアップを行うためのcronとNextcloudサーバとファイル同期を行うためのnextcloud-desktop-cmdがインストールされています. cronは,コマンドの定時実行のスケジュール管理を行うプログラムです. nextcloud-desktop-cmdはNextcloudのクライアント側でコマンドラインによる同期を行うプログラムです.

CRON_EXPはバックアップのスケジュールを設定する環境変数で,デフォルトでは1時間ごとにバックアップが実行されます. CRON_USERはバックアップを実行するユーザを設定する環境変数で,デフォルトではrootとなります. backup-with-nextcloudには他にもNextcloudサーバのURLを指定するNC_URL,Nextcloudのユーザを指定するNC_USER,Nextcloudのユーザのパスワードを指定するNC_PASSWORDという環境変数があります.

/backup/はバックアップするべきファイルを配置するためのディレクトリで,このディレクトリ内のファイルがNextcloudサーバと同期されます. 次の図に示すような構成で,サービスにマウントされたホストマシンのディレクトリを/backup/にもマウントすれば,前節の1.が実現できます.

f:id:Jumpaku:20190907044246p:plain

/backup.shはデフォルトでは何もしないシェルスクリプトですが,Nextcloudサーバとファイル同期を行う直前に実行されます. 次の図に示すような構成で,サービスのデータファイルを/backup/に複製するといったスクリプトを用意し,/backup.shとしてマウントすれば,前節の2.が実現できます.

f:id:Jumpaku:20190907201018p:plain

/entorypoint.shは以下のような/etc/crontabを作成し,cron -fを実行します.

$CRON_EXP $CRON_USER /backup.sh && nextcloudcmd --non-interactive --user $NC_USER --password $NC_PASSWORD --exclude /sync-exclude.lst /backup/ $NC_URL

動作例

Nextcloud

以下のコマンドによりnextcloudを起動します.

docker-compose -f nextcloud/docker-compose.yml up --build -d

この時のnextcloud/docker-compose.ymlを以下に示します.

version: '3'

services: 
  nextcloud:
    image: 'nextcloud:16'
    container_name: 'nextcloud'
    environment: 
      - 'SQLITE_DATABASE=nextcloud'
      - 'NEXTCLOUD_ADMIN_USER=nc_admin_user'
      - 'NEXTCLOUD_ADMIN_PASSWORD=nc_admin_password'
      - 'NEXTCLOUD_TRUSTED_DOMAINS=nextcloud'
    networks: 
      - 'nc_network'
    ports:
      - '8080:80'

networks: 
  nc_network:
    external: true

backup-with-nextcloud

以下のコマンドによりbackupserviceを起動します.

docker-compose -f service/docker-compose.yml up --build -d

この時のservice/docker-compose.ymlを以下に示します.

version: '3'

services: 
  service:
    build: './'
    volumes:
      - './data:/data/'
    networks: 
      - 'nc_network'

  backup:
    image: 'jumpaku/backup-with-nextcloud'
    volumes:
      - './data/:/backup/'
    environment: 
      - 'CRON_EXP=* * * * *'
      - 'CRON_USER=root'
      - "NC_URL=http://nextcloud/remote.php/webdav/"
      - 'NC_USER=nc_admin_user'
      - 'NC_PASSWORD=nc_admin_password'
    networks: 
      - 'nc_network'

networks: 
  nc_network:
    external: true

backupはbackup-with-nextcloudのコンテナ,serviceは毎分date >> /data/date.txtを実行するコンテナです. serviceは以下のservice/Dockerfileにより構築されます.

FROM debian:buster-slim

ENV DEBIAN_FRONTEND=noninteractive

RUN apt update -y && apt-get install -y cron
RUN echo '* * * * * root date >> /data/date.txt' > /etc/crontab

CMD ["cron", "-f"]

以下のコマンドにより,serviceで生成されたファイルがnextcloudにバックアップされていることが確認できます.

cat service/data/date.txt
# => Mon Sep 16 06:07:01 UTC 2019
docker-compose -f nextcloud/docker-compose.yml exec nextcloud cat data/nc_admin_user/files/date.txt
# => Mon Sep 16 06:07:01 UTC 2019

まとめ

Nextcloudと連携して自分のサーバのファイルをバックアップするためのDockerイメージ backup-with-nextcloud を作成しました. backup-with-nextcloud はcronとnextcloud-desktop-cmdを利用してマウントされたディレクトリ内のファイルをバックアップします. backup-with-nextcloud はDocker Hub,GitHubで公開されています.