First version

main 1.0
rohhie 2022-10-17 20:03:03 +09:00
commit 723f59a024
8 changed files with 247 additions and 0 deletions

4
Dockerfile Normal file
View File

@ -0,0 +1,4 @@
FROM custom/backup:0.0.1
ADD entrypoint.sh /
Add backup.sh /
ENTRYPOINT ["/entrypoint.sh"]

93
README.md Normal file
View File

@ -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

59
backup.sh Executable file
View File

@ -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."

2
baseimage/Dockerfile Normal file
View File

@ -0,0 +1,2 @@
FROM alpine:latest
RUN apk add samba-dc tzdata

3
baseimage/mkbaseimage.sh Executable file
View File

@ -0,0 +1,3 @@
#!/bin/bash
cd $(dirname ${0})
docker build -t custom/backup:0.0.1 -f $PWD/Dockerfile .

6
do-backup.sh Executable file
View File

@ -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

57
docker-compose.yml Normal file
View File

@ -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

23
entrypoint.sh Executable file
View File

@ -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