TrueNAS Scale Configuration を自動バックアップする

TrueNAS Scale の設定を自動でバックアップし WORM 設定した S3 に自動バックアップする

Summary

TrueNAS Scale には System Settings / General で設定ファイルをダウンロードできる機能があるが TrueNAS Core にはあるらしい自動バックアップの機能がない。
また、バックアップができたとして TrueNAS 上に保存しても取り出せなかった場合無駄なので方法を考える

System Settings / General

仕様を決める

バックアップが必要なファイルは下記になる

  • System Settings / General のファイル
  • Pool / Datasets の Key か Passphrase
    • これは構築時に保管しているはずなのでわざわざ毎回保管するものではない
    • 同一保管はリスクがあるので避けるべき

この2つがあれば OS Disk が壊れても復帰できるはずなのでこれを下記の仕組みで保護してみる

  • cron で5分毎に Shell Script を実行
    • 変更があった場合に新しいバックアップを作成して Datasets に保管
  • 定期実行している Cloud Sync Tasks で暗号化してクラウドに転送
    • S3 に WORM(Write Once Read Many) をしてあるので最新は 30日保持
      • 古いバージョンは 14日で削除する

ユーザーを作成

Script 配置と保存先用のユーザーを作成しておきます

  • Identification
    • Full Name / Username: tnasautobackup
    • Disable Password: ■
  • User ID and Groups
    • Create New Primary Group: ■
  • Directories and Permissions
    • Home Directory: /nonexistent 後で変える
    • Create Home Directory: □
  • Authentication
    • Shell: nologin
    • Samba Authentication: □

Create user

Datasets を作成

Topic
Dataset は NFSv4 権限管理下だとうまく設定できないため Share Type: Generic 配下に作成する
  • Parent Path: DataVol1/Apps
  • Name: TrueNASScaleBackup
  • Share Type: Generic

Add Datasets

Permissions を変更する

  • Owner: tnasautobackup
  • Apply User: ■
  • Group: tnasautobackup
  • Apply Group: ■
  • Access Mode:
    • User: ■ ■ ■
    • Group: ■ ■ ■
    • Other: ■ □ ■

Edit Permissions 完了後

tnasautobackup の Home directory を変更

  • Home Directory: /mnt/DataVol1/Apps/TrueNASScaleBackup
  • Home Directory Permissions:
    • User: ■ ■ ■
    • Group: ■ ■ ■
    • Other: □ □ □

Home directory と Permissions 変更

Datasets に戻って Permissions が指定どおりであること Unix 権限になっていることを確認しておく

Datasets

これがあってはダメ

Click an item to view NFSv4 permissions

image

API Key を作る

API Key を入手します

Warning
これはユーザー単位ではなくシステム単位なので取り扱いには気おつけましょう。

右上のユーザーマークから API Keys を選択

API Key 名を入力 Copy して控える

Shell Script

下記は環境に合わせて修正が必要

  • TRUENAS_HOST
  • TRUENAS_APIKEY
  • TRUENAS_BACKUP_DIR
  • バックアップの保持期間は14日間でそれを超える場合は削除
  • /tmp/_backup_hash に sumsha256 を保管して変更があった場合のみ TRUENAS_BACKUP_DIR に転送
truenas-scale-api-backup.sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env bash
set -eu

TRUENAS_HOST="127.0.0.1"
TRUENAS_APIKEY="<CHANGE MORE API KEY>"

TRUENAS_HOSTNAME=$(uname --nodename)
TRUENAS_VERSION=$(cat /etc/version)
FILETIMESTAMP=$(date '+%Y-%m-%dT%H%M%S%Z')
TRUENAS_BACKUP_DATASET="/mnt/DataVol1/Apps/TrueNASScaleBackup"
TRUENAS_BACKUP_DIR="${TRUENAS_BACKUP_DATASET}/${TRUENAS_HOSTNAME}/${FILETIMESTAMP:0:10}"
FILENAME="${TRUENAS_HOSTNAME}-TrueNAS-SCALE-${TRUENAS_VERSION}-${FILETIMESTAMP}.tar"

#- -----------------------------------------------------------------------------
#- - Initialize
#- -----------------------------------------------------------------------------
ERR=0
if [ "${TRUENAS_APIKEY}" == "<CHANGE MORE API KEY>" ]; then
  echo "ERROR: $(basename "${0}") Please change \"TRUENAS_APIKEY\"." 1>&2
  ERR=1
fi

if ! [ -e "${TRUENAS_BACKUP_DATASET}" ]; then
  echo "ERROR: $(basename "${0}") Unable to access Dataset path  \"${TRUENAS_BACKUP_DATASET}\"." 1>&2
  ERR=1
fi

if [ ${ERR} == 1 ]; then
  echo "ERROR: $(basename "${0}") exiting script" 1>&2
  exit 1
fi

#- -----------------------------------------------------------------------------
#- - Backup function
#- -----------------------------------------------------------------------------
curl -sSLk -X 'POST' \
  "https://${TRUENAS_HOST}/api/v2.0/config/save" \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer ${TRUENAS_APIKEY}" \
  -d '{"secretseed":true,"root_authorized_keys":true}' -o "/tmp/${FILENAME}"

if ! [ -e "/tmp/_backup_hash" ]; then
  touch "/tmp/_backup_hash"
fi

BACKUP_HASH=$(cat "/tmp/_backup_hash")
DOWNLOAD_HASH=$(sha256sum "/tmp/${FILENAME}" | awk '{print $1}')

if [ "${BACKUP_HASH}" != "${DOWNLOAD_HASH}" ]; then
  if ! [ -e "${TRUENAS_BACKUP_DIR}" ]; then
    mkdir --verbose --parents "${TRUENAS_BACKUP_DIR}"
  fi

  cp -a "/tmp/${FILENAME}" "${TRUENAS_BACKUP_DIR}/${FILENAME}"
fi
rm -rf "/tmp/${FILENAME}"

find "${TRUENAS_BACKUP_DIR}" -type f -name "${TRUENAS_HOSTNAME}"-TrueNAS-SCALE-\*.tar -mtime +14 -delete 2>&1

# save backup hash
echo "${DOWNLOAD_HASH}" > "/tmp/_backup_hash"

System Settings / Shell で設置する

1
2
3
4
5
6
sudo su -

cd /mnt/DataVol1/Apps/TrueNASScaleBackup
nano truenas-scale-api-backup.sh
chmod +x truenas-scale-api-backup.sh
chown tnasautobackup:tnasautobackup truenas-scale-api-backup.sh

System Settings > Advanced > Cron Jobs で設定

  • Description: TrueNAS Scale automatic config backup
  • Command: /mnt/DataVol1/Apps/TrueNASScaleBackup/truenas-scale-api-backup.sh
  • Run As User: tnasautobackup
  • Schedule: Custom (*/15 * * * *) Every 15 minutes
  • Hide Standard Output: ■
  • Hide Standard Error: □
  • Enabled: ■

System Settings > Advanced > Cron Jobs 設定後

最後に

これで自動でバックアップされる。また Cloud Sync Tasks が適切に設定されていれば、クラウドにも同期されているため OS Disk が死んでも復旧が容易になった。

Built with Hugo
テーマ StackJimmy によって設計されています。