commit 723f59a024dc8e578646f16eeee3c8dab80f256d Author: rohhie Date: Mon Oct 17 20:03:03 2022 +0900 First version diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..45aa2c8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,4 @@ +FROM custom/backup:0.0.1 +ADD entrypoint.sh / +Add backup.sh / +ENTRYPOINT ["/entrypoint.sh"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..08ebad6 --- /dev/null +++ b/README.md @@ -0,0 +1,93 @@ +# hogedomain backup + +## 概要 + +ホームラボのサーバーで稼働している3システムのボリュームをバックアップする。 +操作ミスでボリュームが削除されないよう、バックアップ用のコンテナを削除しない。 + +ホームラボのサーバーをバックアップすることを目的としており、汎用的にできていない。 +雑なバックアップをする際のテンプレート&やり方メモ。 +(名前のhdは、HOGEDOMAINの略称) + +## 構築方法 + +### ダウンロード + +このリポジトリからダウンロードする。 + +``` +git clone https://gitea.rohhie.net/rohhie/hd-backup.git +cd hd-backup +``` + +### ベースとなるイメージを作成 + +バックアップコンテナのベースとなるイメージを作成する。 +スクリプトの修正等でコンテナを作り直す際に、最低限のダウンロードで済ませるため。 + +``` +sudo baseimage/mkbaseimage.sh +``` + +なお、ベースイメージにはSambaをインストールしている。 +sysvolディレクトリの拡張属性をバックアップするためなので、不要な場合はapk addのところから削除する。 + +### バックアップ対象のボリュームを設定 + +docker-compose.ymlを編集し、バックアップ対象のボリュームを設定する。 + +コンテナ内の/tmp配下にマウントしているが、このディレクトリは存在しなければ作られる。 +ただし、バックアップでsambaの機能(拡張属性の取得)を使うため、/etc/sambaと/var/lib/sambaは所定の場所にマウントしている。 + +バックアップ先は、ホストの/var/backupsにしている。 + +### バックアップスクリプトを修正 + +ホームラボでバックアップしたいボリュームを固める処理を書いている。 +sysvolについては、拡張属性を取り出して、復元用のスクリプトを作成している。 + +バックアップ対象のボリュームにあわせて、バックアップスクリプトを修正する。 + +### バックアップ実行スクリプトを修正 + +バックアップ対象のコンテナを停止し、バックアップを実行し、コンテナを起動する。 +3システム(5コンテナ)を停止・起動しているが、必要に応じて修正する。 + +## 使い方 + +バックアップ実行スクリプトを実行する。 + +``` +sudo ./do-backup.sh +``` + +環境によっては、クーロンに登録しても良いと思われる。 +ホームラボでは、サーバーが常時動いていないので、手動で実行することにしている。 + +## リストア + +リストアする際には、バックアップスクリプトが動作しないように docker-compose.yml を変更する。 + +``` + DO_BACKUP: "false" +``` + +設定変更後、コンテナを起動し、コンテナの中でリストア操作をする。 + +``` +sudo docker compose up -d +sudo docker exec -it backup ash --login +``` + +Samba ad dcについては拡張属性設定スクリプトを用意しているので、復元後に実行しておく。 +var/lib/samba/NTACL + +## その他 + +詳細はメインサイト参照。 +https://rohhie.net/back-up-the-docker-volume/ + +## ライセンス + +MIT + diff --git a/backup.sh b/backup.sh new file mode 100755 index 0000000..211c5d1 --- /dev/null +++ b/backup.sh @@ -0,0 +1,59 @@ +#!/bin/ash +echo "Start backup." + +# Create backup file name. +TMP_TARGET=/mnt/backups/backup-$(hostname)-$(date +'%Y-%m-%d-%H-%M-%S').tar +echo $TMP_TARGET + +# +# Samba +# +echo "Samba" +echo "Create NTACL file." +cd /var/lib/samba +find ./sysvol -exec ash -c 'TMP=$(samba-tool ntacl get "{}" --as-sddl); echo "samba-tool ntacl set \"$TMP\" \"{}\""' \; > NTACL + +echo "Create tarball." +cd / +tar -cf $TMP_TARGET.1 \ + etc/samba etc/bind \ + var/lib/samba/private var/lib/samba/sysvol var/lib/samba/NTACL var/lib/samba/bind-dns \ + var/lib/bind \ + var/lib/ldap-account-manager +rm var/lib/samba/NTACL + +# +# Kopano +# +echo "Kopano" +echo "Create tarball" +cd /tmp +tar -cf $TMP_TARGET.2 \ + kopano/var/lib/kopano/attachments \ + kopano/var/lib/mysql + +# +# Gitea +# +echo "Gitea" +echo "Create tarball" +cd /tmp +tar -cf $TMP_TARGET.3 \ + gitea/data \ + gitea/var/lib/mysql + +# +# merge tarball. +# +echo -n "Merging " +echo -n "."; head -c -$((512*2)) $TMP_TARGET.1 > $TMP_TARGET +echo -n "."; head -c -$((512*2)) $TMP_TARGET.2 >> $TMP_TARGET +echo -n "."; head -c -$((512*2)) $TMP_TARGET.3 >> $TMP_TARGET +rm $TMP_TARGET.1 $TMP_TARGET.2 $TMP_TARGET.3 +echo "Done." + +echo "Archiving." +gzip $TMP_TARGET + +# Finish. +echo "Backup completed." diff --git a/baseimage/Dockerfile b/baseimage/Dockerfile new file mode 100644 index 0000000..7858330 --- /dev/null +++ b/baseimage/Dockerfile @@ -0,0 +1,2 @@ +FROM alpine:latest +RUN apk add samba-dc tzdata diff --git a/baseimage/mkbaseimage.sh b/baseimage/mkbaseimage.sh new file mode 100755 index 0000000..5da0a9d --- /dev/null +++ b/baseimage/mkbaseimage.sh @@ -0,0 +1,3 @@ +#!/bin/bash +cd $(dirname ${0}) +docker build -t custom/backup:0.0.1 -f $PWD/Dockerfile . diff --git a/do-backup.sh b/do-backup.sh new file mode 100755 index 0000000..179436c --- /dev/null +++ b/do-backup.sh @@ -0,0 +1,6 @@ +#!/bin/bash +cd $(dirname ${0}) +docker container stop gitea gitea_db kopano kopano_db samba +docker compose up --build +#docker compose down +docker container start samba kopano_db kopano gitea_db gitea diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..29375ad --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,57 @@ +version: "3.9" +services: + + backup: + build: ./ + image: custom/backup:1.0.0 + container_name: backup + restart: "no" + environment: + TZ: Asia/Tokyo + DO_BACKUP: "true" + hostname: hogedomain + volumes: + # Samba ad dc + - samba_etc:/etc/samba + - samba_lib:/var/lib/samba + - bind_etc:/etc/bind + - bind_lib:/var/lib/bind + - lam:/var/lib/ldap-account-manager + # Kopano + - kopano:/tmp/kopano/var/lib/kopano/attachments + - kopano_db:/tmp/kopano/var/lib/mysql + # Gitea + - gitea:/tmp/gitea/data + - /home/git/.ssh:/tmp/gitea/data/git/.ssh + - gitea_db:/tmp/gitea/var/lib/mysql + # Backup directory + - /var/backups:/mnt/backups + +volumes: + bind_etc: + name: samba_bind_etc + external: true + bind_lib: + name: samba_bind_lib + external: true + lam: + name: samba_lam + external: true + samba_etc: + name: samba_samba_etc + external: true + samba_lib: + name: samba_samba_lib + external: true + kopano: + name: kopano_kopano + external: true + kopano_db: + name: kopano_kopano_db + external: true + gitea: + name: gitea_gitea + external: true + gitea_db: + name: gitea_mysql + external: true diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..b7ec2d5 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,23 @@ +#!/bin/ash + +echo "Start container with parameter : $@" + +trap sig_term SIGTERM + +sig_term() { + echo "CATCH SIGTERM" + wait + exit 0 +} + +# Execute paramater. +exec "$@" + +if [[ $DO_BACKUP == "true" ]]; then + exec /backup.sh + exit 0 +fi + +# Infinity roop. +while : ; do sleep 1 ; done +