2023/10/10 新規作成
2023/10/11 cronの設定画像を差し替え

概要

Symbolノードのトラブルが発生し、サーバーへのログインも難しいという話を目にしました。

Symbol、dHealthのノードにおいて、preset.ymlとharvesters.datさえあれば復旧(移設)は可能です。
※Symbolにおいては、preset.ymlさえあればfast-syncを使用しないことでharvesters.datは復活するようです。

preset.ymlはノード構築時に必要になりますが、harvesters.datは(委任状態によって)動的に変更される可能性があります。そのため、定期的に保存しておかないと取りこぼしの可能性があるようです。

ということで、泥臭い方法かもしれませんが、harvesters.datを定期的にバックアップすることにしました。

その備忘録として、方法を残しておきます。

一言でいえば、ノードにrcloneをインストールして、harvesters.datをOneDriveに転送するシェルをcronで定期的に呼び出します。

実行環境

  • Ubuntu 22.04(サーバー)
  • rclone
  • OneDrive(バックアップ先)
  • Windows10 (クライアント)

1. OneDriveの共有設定(バックアップ先)

僕はWindowsを普段使用しており、Microsoftアカウントを持っています。

そのOneDriveに直接アップロードしてしまってもいいのですが、何かあった際に他のドキュメントが見えてしまう可能性があります。

harvesters.datがオープンになるとまずいファイルかは不明です。しかし、安全のために別途、アカウントを取得することとします。
これにより、ノードに何かあってもメインアカウントのファイルの内容までは見られることはありません。

※マイクロソフトアカウントの取得方法は割愛します。

これ以降、このアカウントはバックアップアカウントと呼びます。そして普段使用しているアカウントをメインアカウントと呼びます。

ブラウザでOneDriveに入り、バックアップ用のディレクトリを作ります。

画面上部の新規ボタンをクリックします。

フォルダーの作成で「backup」と入力し、作成します。

「backup」フォルダが作成されました。共有カラムのプライベートをクリックします。

アクセスの管理と表示されます。「共有を開始」をクリックします。

リンクの送信画面が表示されるので、「リンクを知っていれば誰でも編集できます」をクリックします。

共有の設定が表示されるので、「特定のユーザー」にチェックを入れ、適用をクリックします。

リンクの送信画面に戻るので、メインアカウントのメールアドレスを入力します。設定を終えたら送信をクリックします。

「backup」フォルダの共有がプライベートから共有になりました。

これでメインアカウントから、バックアップアカウントのbackupフォルダが見えるようになりました。

「backup」フォルダの中に「symbol」「harvesters」と同様にフォルダを作成します。

現在はバックアップ対象のファイルはharvesters.datのみですが、他の可能性もあるかなー? とかまぁ色々。この構成は好きにしてください。

2. rcloneのセットアップ

rcloneは簡単に言えばクラウドストレージと同期をとってくれるソフトらしいです。

今回はOneDriveでやりますが、他のストレージでもいろいろできるらしいですね。

公式サイトはこちら。

サーバーにログインし、rootでインストールを実行する。

サーバーにログインし、rootとなってください。(別にsudoできればいいかも)

インストールのため、下記のコマンドを実行します。

curl https://rclone.org/install.sh | sudo bash

問題なければ、インストール成功のメッセージが表示されます。

rclone v1.64.0 has successfully installed.
Now run "rclone config" for setup. Check https://rclone.org/docs/ for more details.

rcloneのインストール(クライアント)

クライアントでrcloneをインストールします。

これはサーバーがコンソールのみであるためです。マイクロソフトアカウントの認証にはブラウザが必要です。

また、メインアカウントと紐づかないよう、ここでは既定のブラウザではマイクロソフトアカウントからサインアウトしておいてください

rcloneのダウンロードページに行き、該当するものをダウンロードしてください。

なお、僕のクライアント環境はWindows 64bitのため、一番左上をダウンロードしました。

ダウンロードファイルはzipのため、展開してください。

展開すると下記のような感じになります。

コマンドプロンプト(またはPowerShell)にて展開先のフォルダに移動してください。

ここで下記コマンドを実行します。

rclone.exe authorize "onedrive"

ブラウザが勝手に立ち上がり、マイクロソフトアカウントのサインインが求められます。

サインインを完了するとアクセス許可が求められるので、許可してください。

次にSuccess! と画面が表示されます。成功です。

この画面については閉じてください。

次に先ほどのコマンドプロンプトに

Paste the following into your remote machine --->
~~~~~~~
<---End paste

といった文字列が表示されます。

これの{から}までをコピーして保持しておいてください
これはOneDriveに接続するためのアクセストークンです。これを使用してサーバーからOneDriveに接続するようにします。

なお、認証期限は実行から1時間のようなので、ここからサーバー側の連携設定まで1時間で終える必要があります。

サーバー側rcloneセットアップ

サーバー側の設定に戻ります。

下記のコマンドを実行し、設定を行います。

rclone config

ここからひとつづつ、質問がされます。

# 新しい設定ファイルを作るか?
2023/10/10 14:52:09 NOTICE: Config file "/root/.config/rclone/rclone.conf" not found - using defaults
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
# 新しい設定ファイルのためn。
n/s/q> n

# リモートの名前を付ける。好きに。
Enter name for new remote.
name> backupOneDrive

# どのストレージを使用するのか聞かれている。
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
 1 / 1Fichier
   \ (fichier)
 2 / Akamai NetStorage
   \ (netstorage)
 3 / Alias for an existing remote
   \ (alias)
 4 / Amazon Drive
   \ (amazon cloud drive)
# ~~~ 中略 ~~~
30 / Microsoft Azure Blob Storage
   \ (azureblob)
# 目的のOneDrive。数字でもいいし、"onedrive"の名前指定でもいい。
31 / Microsoft OneDrive
   \ (onedrive)
32 / OpenDrive
   \ (opendrive)
# ~~~ 中略 ~~~
51 / Zoho
   \ (zoho)
52 / premiumize.me
   \ (premiumizeme)
53 / seafile
   \ (seafile)
# 使用するドライブの選択。onedrive。
Storage> onedrive

# client_idは空欄。
Option client_id.
OAuth Client Id.
Leave blank normally.
Enter a value. Press Enter to leave empty.
client_id>

# client_secretも空欄でよい。
Option client_secret.
OAuth Client Secret.
Leave blank normally.
Enter a value. Press Enter to leave empty.
client_secret>

# リージョンを聞かれているが、アメリカ、ドイツ、チャイナでもないため、default(空欄)。
Option region.
Choose national cloud region for OneDrive.
Choose a number from below, or type in your own string value.
Press Enter for the default (global).
 1 / Microsoft Cloud Global
   \ (global)
 2 / Microsoft Cloud for US Government
   \ (us)
 3 / Microsoft Cloud Germany
   \ (de)
 4 / Azure and Office 365 operated by Vnet Group in China
   \ (cn)
region>

# advanced configもないため空欄(default)。
Edit advanced config?
y) Yes
n) No (default)
y/n>

# ウェブブラウザを利用して認証するか?
Use web browser to automatically authenticate rclone with remote?
 * Say Y if the machine running rclone has a web browser you can use
 * Say N if running rclone on a (remote) machine without web browser access
If not sure try Y. If Y failed, try N.

y) Yes (default)
n) No
# nを入力する。ウェブブラウザを使用しない。
# このために、先ほどクライアントでアクセストークンを取得した。
y/n> n

# アクセストークンを指定する。
Option config_token.
For this to work, you will need rclone available on a machine that has
a web browser available.
For more help and alternate methods see: https://rclone.org/remote_setup/
Execute the following on the machine with the web browser (same rclone
version recommended):
        rclone authorize "onedrive"
Then paste the result.
Enter a value.
# 先ほど指定したアクセストークンを入力する。
config_token> {"access_token":"~~~ 略 ~~~","expiry":"2023-10-10T22:42:11.5575294+09:00"}

# 設定タイプを指定する。
Option config_type.
Type of connection
Choose a number from below, or type in an existing string value.
Press Enter for the default (onedrive).
 1 / OneDrive Personal or Business
   \ (onedrive)
 2 / Root Sharepoint site
   \ (sharepoint)
   / Sharepoint site name or URL
 3 | E.g. mysite or https://contoso.sharepoint.com/sites/mysite
   \ (url)
 4 / Search for a Sharepoint site
   \ (search)
 5 / Type in driveID (advanced)
   \ (driveid)
 6 / Type in SiteID (advanced)
   \ (siteid)
   / Sharepoint server-relative path (advanced)
 7 | E.g. /teams/hr
   \ (path)
# OneDriveのみの使用のため、1を指定する。
config_type> 1

# drive_idを求められるが一つのため、空欄(default)。
Option config_driveid.
Select drive you want to use
Choose a number from below, or type in your own string value.
Press Enter for the default (~~~).
 1 /  (personal)
   \ (~~~)
config_driveid>

Drive OK?

# ドライブが見つかっただのなんだの。空欄(default)。
Found drive "root" of type "personal"
URL: https://onedrive.live.com/?cid=ce23e6dbf4b9af42

y) Yes (default)
n) No
y/n>

# 設定内容の最終確認が表示される。
Configuration complete.
Options:
- type: onedrive
- token: {"access_token":"~~~ 略 ~~~","expiry":"2023-10-10T22:42:11.5575294+09:00"}
- drive_id: ~~~
- drive_type: personal
Keep this "backupOneDrive" remote?
# 問題なければ空欄(default)。
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d>

# 設定後の内容。backupOneDriveが追加されている。
Current remotes:

Name                 Type
====                 ====
backupOneDrive       onedrive

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
# 設定は終わりのため、qを入力。
e/n/d/r/c/s/q> q

以上でrcloneの設定は終わりです。

一応、転送可能であることを確認します。

hogehoge.txtを作りました。

転送先をbackup/symbol/harvesters/と定め、転送します。

サーバーにて下記のコマンドを実行します。

hogehoge.txtをbackupOneDriveの指定ディレクトリにコピーするコマンドです。

rclone copy hogehoge.txt backupOneDrive:/backup/symbol/harvesters

実行後、OneDriveに配置されていることが確認できました。

rcloneのセットアップは以上です。

3. harvesters.datのバックアップシェル作成

harvesters.datをコピーし、OneDriveへ転送する一連の流れをsh化します。

ここらからはもう、自力でノードを立てている方からすると蛇足かもしれません。

サーバー側で「backup_work」という任意のディレクトリを作ります。
ここでバックアップ作業を行います。ここをバックアップ用ディレクトリと名付けます。

ここに下記のファイル(backup_harvesters.sh)を作成します。

# backup harvesters.dat

script_dir=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd)
cd $script_dir

# harvesters.datの指定。
base_harv_file='~~~harvesters.datのあるDIRパスを指定する~~~/harvesters.dat'


# バックアップ用ディレクトリ
backup_dir='バックアップディレクトリを指定する。'

# バックアップファイル名は年月日時分秒harvesters.dat
dt=`date +'%Y%m%d%H%M%S'`
base_file_name='harvesters.dat'

backup_dest="$backup_dir$dt$base_file_name"

cp $base_harv_file $backup_dest

rclone copy $backup_dest backupOneDrive:/backup/symbol/harvesters/

rm -f $backup_dest

なお、パスはすべて絶対パスで指定しています。

backup_harvesters.shを作成後、確認のため、実行してください。

こんな感じでOneDriveに存在することが確認できます。

4. cronの設定

最後にcronの設定を行い、定期実行させます。

下記コマンドを実行し、cronの編集をします。

crontab -e

こんな感じで、僕は12時間に1度かな、取得するようにしました。
(頻度は一日1回でも十分そうですが。。。。)

以上です。お疲れさまでした。

投稿者 和泉