概要
ファイル共有サービスの一つであるNextcloudと連携して,自分のサーバのファイルをバックアップするためのDockerイメージ backup-with-nextcloud を作成しました.
Nextcloud (https://nextcloud.com) は自分のサーバで動作させるファイル共有サービスです. 公式のDockerイメージ (https://hub.docker.com/_/nextcloud) もあります.
Docker (https://www.docker.com) はコンテナ型仮想環境のプラットフォームで,これによりサービスの動作環境の構築が行いやすくなります.
以下では
- backup-with-nextcloud とは何か?
- 何のために backup-with-nextcloud を作ったのか?
- 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で公開しています. 具体的な使い方は以下を参照してください.
- Dockerイメージ:https://hub.docker.com/r/jumpaku/backup-with-nextcloud
- Dockerfile:https://github.com/Jumpaku/backup-with-nextcloud
何のために backup-with-nextcloud を作ったのか?
現在,私は契約しているVPSでいくつかのサービスを動作させており,今後これらを本格的に利用したいと考えています. ここで,これらのサービスを本格的に利用していくためにはデータをバックアップをすることが必須であると考えました.
私のVPSのサービスは全てDockerコンテナとして動作しています. また,サービスのデータはそれぞれのコンテナにマウントされたホストマシンのディレクトリに保存されています. これらのデータのバックアップは,
- バックアップデータ作成機能を持たないサービスについてはマウントされたホストマシンのディレクトリ内のファイル
- バックアップデータ作成機能を持つサービスについてははその機能を利用して作成したファイル
を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.が実現できます.
/backup.sh
はデフォルトでは何もしないシェルスクリプトですが,Nextcloudサーバとファイル同期を行う直前に実行されます.
次の図に示すような構成で,サービスのデータファイルを/backup/
に複製するといったスクリプトを用意し,/backup.sh
としてマウントすれば,前節の2.が実現できます.
/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
以下のコマンドによりbackup
とservice
を起動します.
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で公開されています.