バックアップも大切だけど節電も大切 （ProxmoxBackup編）

こんにちは。
ALJの江口と申します。

ProxmoxVEのバックアップにはProxmoxBackupServerが便利です。我が家でもProxmoxVEをバックアップするProxmoxBackupServerが稼働しています。

ProxmoxVEの仮想環境はファイルサーバーなどのサービスがあるので、常時稼働が便利です。一方、バックアップサーバーはアイドル状態が多く、電気代のことを考えたら、必要な時だけ起動したいと思うのは、私だけではないと思います。

バックアップの頻度については色々考えがあると思いますが、自分の場合は週１でいい気がします。

バックアップ時だけ起動する時に、手動で起動・停止するという運用を行うと、毎週のことなので案外手間だし、起動し忘れてバックアップが取れてないなどの事態が起きかねません。電気代を気にしてバックアップが取れてないというのは本末転倒な気がします。

そこで、バックアップサーバーを自動で起動・停止させる方法を検討し、構築してみました。運用の参考になればと思い、ご紹介します。

# 使用機材
ProxmoxBackupServerに利用しているマシンは、HP  ProLiant MicroServer N54Lです。発売日をググると、2013年8月31日らしいので、10年ちょっと前の機材です。当時、激安サーバーがいろいろ売られていたのでご存じの方も多いのではないかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/dbf049e5-a589-4c7c-bfa7-d6b95975dd29.png)


# 起動、停止方法
### 起動
起動は、Wake-On-Lanで行います。標準で備わっている機能で、遠隔での起動には広く利用されている手法だと思います。
### 停止
停止方法は、リモートで実施できるよう、SSHでshutdownコマンドを呼ぶようにします。

ということで、WOLとSSHなら、別のマシンのcronに入れてしまえば完了で、記事にするまでもない内容になってしまうので、ポイントとして、以下の２点を追加しました。

:::note info
設計のポイント
・停止時はバックアップジョブがないことを確認する
・起動、停止はホームオートメーションから投げ、スケジュールを一元管理する
:::

# どのようにコマンドを投げるか
起動と停止は、自動設定だけではなく、たまに起動してバックアップサーバーのメンテナンスなどもするので、手動実行も楽にできた方がいいと思い、今回はホームオートメーションである**Domoticz**で設定しました。

ホームオートメーションのDomoticzを利用する利点としては、以下のようなものがあります
・Wake-On-Lanに標準で対応している
・スケジュール実行が可能
・臨時で起動、停止する時も、ダッシュボードのボタンを押すだけ

完成すると、以下のようにONボタンとOFFボタンができるイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/156e6680-30d2-41b8-b61e-ec1653e0c113.png)

# Domotizのセットアップ
Domotizのページではdockerによる導入が推奨されているようですが、今回はlxcで構築しようと思い、ビルドされたtarが公開されているのでそれを利用します。

### Domoticzの導入

ProxmoxVEのlxcで以下のインスタンスを準備しました。CPU、メモリ、ディスク容量は、お好みで調整してください。

- Ubuntu24.10
- 2コア
- メモリ512MB
- ディスク32G

apt update 、タイムゾーン設定を済ませたらDomoticzのインストールを開始します。

起動用ユーザを作成します。別のユーザー名で使用する場合は、適宜変更してください。

```bash
adduser domoticz
gpasswd -a domoticz sudo
```

不足するモジュールをインストールします。
```bash
sudo apt-get install git cmake g++ lua5.3 liblua5.3-dev python3-dev libssl-dev libsqlite3-dev build-essential libboost-system-dev libboost-thread-dev libboost-program-options-dev libboost-test-dev curl libcurl4-openssl-dev make gcc libusb-dev zlib1g-dev uthash-dev wget libboost-dev libboost-atomic-dev libboost-regex-dev libboost-chrono-dev
```
Ubuntu 22 以降で起動する場合は、libssl1.1の追加インストールが必要なので、以下を実行します。
```bash
wget http://nz2.archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2.23_amd64.deb
sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2.23_amd64.deb
```

Dowloadページからビルドされたファイルを持ってきます。

```bash
wget https://releases.domoticz.com/release/domoticz_linux_x86_64.tgz
```
tarファイルを展開します。
```bash
mkdir domoticz
cd domoticz/
tar xvf ../domoticz_linux_x86_64.tgz
```

展開できたら、試しにコマンドラインから起動してみます。

```bash
./domoticz
```
SSL関連のエラーが出ますが、http接続予定なので、このまま進みます。
起動できたら、以下にアクセスするとログイン画面が表示されると思います。

```
http://＜IPアドレス＞:8080 
```

ログインIDとパスワードの初期設定は、以下で設定されています。
 admin / domoticz

# サービスに追加
起動確認ができたら、domoticzを起動するサービス «systemd» を作成します。

```shell:/etc/systemd/system/domoticz.service
[Unit]
Description=domoticz_service

[Service]
User=domoticz
Group=domoticz
#EnvironmentFile=/home/pi/domoticz.env
ExecStart=/home/domoticz/domoticz/domoticz -www 8080 -sslwww 443
WorkingDirectory=/home/domoticz
Restart=on-failure
RestartSec=1m

[Install]
WantedBy=multi-user.target
```

サービスに追加します。
```bash
systemctl daemon-reload
systemctl enable domoticz.service
```

### 起動ボタン設定
起動用にWake-On-Lanのボタンを作成します。
[Setup] - [Hardware]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/0efe2c2c-ac51-4a93-93f0-48480b060489.png)

Name　：　任意の名前
Type　：　Wake-On-Lanを選択
Remote Address　： ネットワークアドレス（XXX.XXX.XXX.255）
Port　：　 9 (default WOL port)

Addボタンを押し、追加できたら、デバイスの[setup]を押し、デバイスを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/c889c456-e9ab-44a3-906f-c8ce04fc63f3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/21bb50bf-e0dd-48f4-9cbf-70164f647fa4.png)

Name　：　任意の名前
Mac Address　：　バックアップサーバーのMac Address

追加したら、デバイスの一覧の緑の矢印をクリックし、「Add device」をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/578763d3-726e-4ba7-b884-62b99b668906.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/b5aa5dc0-7a08-4eb8-834f-c2157a747b1e.png)

追加できたら、[Switches]に表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/e0bf5ad0-1386-4f6b-964c-448890587940.png)

ボタンを押して起動してみましょう。
対象のサーバーが起動すれば成功です。

### 停止ボタン設定
停止はsshでシャットダウンコマンドを投げます。まずは公開鍵の設定をします。説明を簡単にするためrootで設定してますが、ユーザーで作業したい場合は必要に応じて変更してください。

```bash
ssh-keygen
ssh-copy-id root@XXX.XXX.XXX.XXX
```

コマンド実行後、パスワードなしでssh接続できればOKです。

シャットダウン用のシェルを作成します。作成場所は、scriptsフォルダです。
シャットダウンする前に、***task list***を見て、実行中のタスクがないことを確認します。
タスクが実行中であればシャットダウンは行わないため、この後設定する時刻設定では、時間を置いて複数回、タイマー設定を行います。

```shell:/home/domoticz/domoticz/scripts/pbs_shutdown.sh
#!/bin/bash

# PBS
PBS_HOST="xxx.xxx.xxx.xxx"
PBS_USER="root"  

# check SSH port(1s)
nc -zvw1 ${PBS_HOST} 22
if [ $? -ne 0 ]; then
    echo "PBS is already down or unreachable. Aborting shutdown."
    exit 1
fi

# tasc check
TASK_COUNT=$(ssh ${PBS_USER}@${PBS_HOST} "proxmox-backup-manager task list | grep -c 'RUNNING'")

# shut down
if [ "$TASK_COUNT" -eq 0 ]; then
    echo "No running tasks on PBS. Shutting down..."
    ssh ${PBS_USER}@${PBS_HOST} "shutdown -h now"
else
    echo "PBS has running tasks. Shutdown aborted."
fi
```

保存したら、実行権限を付けます。
```shell
chmod +x pbs_shutdown.sh
```

シェルを実行し、PBSがシャットダウンされるか確認します。
確認できたら、ボタンを追加します。

[Setup] - [Hardware]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/6a76fe2a-1725-4067-a34d-078bcf2864fa.png)

Name　：　任意の名前
Type　：　Dummy (Does nothing, use for virtual switches only) 

追加できたら、「Create Virtual Sensors」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/7ce2b777-f751-4c7d-b52f-7db8eda244cc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/84e55276-b8e6-4c81-9126-cd4bed0d94e0.png)

Name　：　任意の名前
Sensor Type　：　Switch

追加できたら、[Switches]にボタンが作成されるので、「Edit」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/e1403218-8086-4d87-ae44-095f14c8ed2b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/23d36532-bc43-4c71-84f6-21a04bbd59d7.png)

Switch Type　：　Push Off Button
Off Action　：　script://pbs_shutdown.sh

上記を設定し、Saveを押して保存します。

実際にボタンを押して、PBSがシャットダウンされるか確認してみてください。

# ダッシュボードに追加
各ボタンの★を押すと、ダッシュボードに追加されます

＜追加された様子＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/c401343b-ee34-4bcc-94bb-2174bb17a47a.png)

# タイマー設定
各ボタンにTimersがあるので、タイマー起動できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/e6377592-68d0-492f-bcd6-a7b908e6617f.png)

ホームオートメーションなので、複雑なシナリオも作成できますが、今回はON/OFFするだけなので、ここで時刻設定しました。

タイマー設定は特に難しくないので説明は割愛します。
停止用のシェルは、実行中のタスクがある場合はシャットダウンせず終了するため、タイマーを複数設定し、何度か投げるように設定しました。


# 作ってみた感想
個人的な興味でDomoticzに設定してみましたが、いろいろ苦労したので、動いたときの感動は大きかったです。
今回の内容ではcronで設定する方が全然ラクなので実はその方がおすすめですが、その場合でも停止シェルなどは利用できると思います。
なにかの参考にして頂けたら幸いです。

以上です。