「UGREEN」タグアーカイブ

UGREEN NASync クラウドバックアップ

はじめに

QNAPからUGREENに乗り換えてそんなに困ってないというか、結構気に入っているのですが、最大の問題がバックアップの弱さでした。 QNAPではHBS3という強力なツールでNASのデータをAmazon S3などのクラウドストレージにバックアップできたのですが、UGREENにはそういう機能はありません。

という訳で、dockerで実現してみました。 docker最高!

方針

  • 利用するツールはbackrest
  • 保存先はAmzon S3 Standard
  • Amazon S3ではライフサイクルポリシーで7日後にDeepArchiveに移動する

いろいろ検討した結果、resticというツールが良さげです。resticは重複排除や圧縮に対応しているのにOSSという素晴らしさ。resticを使ったdockerコンテナも複数公開されているのですがその中でも、WEBUIで操作できるbackrestを使うことにしました。

インストール

  1. Dockerアプリのプロジェクトから「作成」を選んでプロジェクト名(backupなど)、保存パス(デフォルトでOK)、Compose設定に以下のYAMLファイルを貼り付けて「今すぐデプロイ」
version: "3.8"
services:
  backrest:
    image: garethgeorge/backrest:latest
    container_name: backrest
    hostname: backrest
    ports:
      - "9898:9898"              # 外部アクセス用
    volumes:
      - ./backrest/data:/data
      - ./backrest/config:/config
      - ./backrest/cache:/cache
      # バックアップ対象フォルダ
      - /volume1:/volume1:ro   
      - /volume2:/volume2:ro
    environment:
      - BACKREST_DATA=/data
      - BACKREST_CONFIG=/config/config.json
      - XDG_CACHE_HOME=/cache
      - TMPDIR=/tmp
      - TZ=Asia/Tokyo
    restart: unless-stopped
  1. コンテナが立ち上がってきたら、WEBUIにアクセス(Dockerアプリのコンテナでbackrestを選んで→マークからクイックアクセスが楽)して、初期設定
 Instance ID: なんでもいいですが(dxp2800とか)
 User: なんでもいいけど(hogeadminとか)
 Password: 強いの付けてね
  1. Add Repoでリポジトリ設定(前提として先にAWS上にS3バケットを作っておく必要あり。あと、アクセスキーを発行しておく必要あり)
 Repo Name: S3とか
 Repository URI: s3:s3.us-east-1.amazonaws.com/<バケット名> ※S3 URIではないので注意。私はコストが安いus-east-1を使ってる
 Password: Generateで作ればOK
 Env Vars: 環境変数をいくつか追加
   AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEYは最低必要。
   私はAWS_STORAGE_CLASS=STANDARD_IAも入れてる
その他の設定は変える必要なし
  1. Add Planでバックアップ対象を追加
 Plan Name: nas backupとか
 Reposotory: さっき作ったリポジトリ名 S3とか
 Paths: ここにバックアップしたいパスを足していく
  私は /volume1/@homeとかdockerとか。
 Backup Schedule: 私はCron、Local、Every mounth on 1 at 2:00にしてます。差分取れるので毎日とってもいいけど。

これでOK。作ったプランのBackup Nowで試し取りしておくと良いでしょう。

最後に、docker/backup/のファイルは別途どっかにちゃんと保存しておきましょう。設定したパスワードが分らないとデータ復元できません。。。

以上

### 2025/10/3 追記
デフォルトでRepositoriesポリシーで月1回のPrune(削除)とCehckがスケジュールされているのだが、Checkは実際にS3のデータを読みに行くようで、ライフサイクルポリシーでDeep Archiveに送ってしまうと、失敗する。必ずCheckを実施しないといけないのか?というと、まぁ保険なので実施しないことにしました。削除は、Deep Archiveに送られていても問題なくできるようです。

UGREEN NASync DXP2800省エネチューン

チューンって程のことはないのですが、パフォーマンスが上がる確かめるためにNVMe SSDをキャッシュとして追加してみたのですが、安物のgen3 x2レーンではHDDと大差なかったので、dockerのバックエンドストレージとして分離しようと思います。

【プール分け】

  1. HDD コールドプール(Volume1) – 基本的にはユーザーホームなのでユーザーが使わなければアクセスされない
  2. SSD ホットプール(Volume2) – dockerなど常にアクセスするもののバックエンドとして利用。基本アプリはこちらに入れることにする

インストール済みのアプリや、dockerコンテナを移動するには基本入れ直しが必要です。写真アプリなんかはインデックスが消えそうで嫌だったのと、そもそも写真はHDDに入ってるので移動しませんでした。DockerとHome Assistant以下の通り。それ以外はアンインストールとインストールの繰り返しでOK。

【Dockerの移動】

  1. コンテナを全部止める
  2. docker内のファイルを全て適当な場所にへコピーする
  3. docker-composeの内容をメモっておく(まぁ、同じフォルダをしていると出てきますけど念のため)
  4. dockerアプリ削除(HomeAssistantアプリも同時に削除される)
  5. dockerフォルダーを削除する(これをしないとVolume1に再度作られてしまうようだ)
  6. Volume2を指定してdockerアプリインストール
  7. 退避したdockerディレクトリのファイルを新たに作成されたdockerフォルダ内にコピーする
  8. 管理 – データ移行(コンテナインスタンスは移行されない)
  9. HomeAssitantアプリをVolume2/docker/homeassistantのフォルダを指定してインストールする(これでHomeAssitantは元通りに動くはず)
  10. その他のコンテナもdocker-composeで再生成

余談ですが、dockerは共有フォルダーに出てくるdockerフォルダーと@dockerというシステムが勝手に作るdocker動作に必要なフォルダがあります。dockerをアンインストールすると、@dockerは削除されますが、特にコピーしておく必要はなさそうです。もしかしたらローカルリポジトリに自前のコンテナを置いてる場合はコピーしておいた方がいいかも。

結果

常時28W程度食っていたものがHDDがアイドル停止するようになって12Wまで下がりました。静かだし。 🙂

たった16W削減ですが、1か月に換算すると 11.5kWhも減るんですよね。今、kWhあたり35円程度なので、403円/月の削減ですね(^_^)

実はそれ以外にも、RTX810からRTX1210に変更したのを機に、SWX2200-8Gと2.5GのHUBの電源も普段落としています。私の用途では2.5Gbps必要なことなんて滅多にないので。その結果、常時稼働しているものが48W程度ほどに下がり、全体で25W減、月額にして630円/月の削減となりました。

Home Assistant on UGREEN NASync DXP2800

はじめに

UGREEN NASync DXP2800を購入して、アプリセンターにHome Assistantというものがあって初めて知ったのですが、これ優れものですね!

https://www.home-assistant.io

Home AssistantはOSSでIFTTTのようなことをローカルで実現します。Raspberry Piなんかで実装してる人が多いようです。

Home Assistantはdockerコンテナとしても提供されていて、UGREEN NASync DXP2800ではそれを使ってアプリとして提供しているようです。なので、NASyncではアプリをインストールするだけで使えます。

iPhoneやAndroid用のアプリも出ていてとても使い勝手がいいのですが、ローカルで動いているのでVPNなどで自宅にアクセスする必要があります。(クラウドサービスもあるのですがそれは有償です)

私は前に書いた、TailScaleで自宅に接続して使っています。

私は今まで、主にSwitchBot + Amazon ALEXAでエアコン制御なんかをやってたんですが、HEMSやEcoFlowの電池なんかとの連携はできませんした。それぞれ違う規格で動いているためです。それがHome Assistantを使うことでかなり連携可能になります。

ECHONET Lite Matter IFTTT Alexa GoogleHome CloudEdge Home Assistant
Panasonic AiSEG2 × × × × × 〇*1
Panasonic ホームユニット VL-HB1000-W × × × × × × ×
QCELLS 太陽電池 × × × × × × 〇*1
SwitchBot × ×
EcoFlow Delta2 × × × × × × 〇*1
TP-LINK tapo × ×
RATOC RS-WFIREX3 × × × 〇*1
監視カメラ(COOAU) × × × × × ×

*1 カスタムコンポーネント導入で可能

例えば、HEMS Panasonic AiSEG2から発電、使用電力を取得して余力がある時だけ何をを実行といったオートメーションが組めるようになります。

今回実現したこと

  1. Panasonic AiSEG2(HEMS)から発電量と消費量を取得して発電余力を求める
  2. 余力がある時にEcoFlow delta2を充電する
  3. 夜間充電した電力でサーバを稼働させる
  4. この一連のサイクルをオートメーション化する

はい。できました(笑)

iPhone Home Assistant

iPhoneのHome Assistantアプリからアクセスするとこんな感じです。

実現方法

Home Assistantがあらかじめ対応している機器に関しては何もしなくても認識させられるのですが、残念ながら日本ローカルの AiSEG2は対応していません。そういう時はカスタムコンポーネントというのを作ることによって自由に機能を追加できます。AiSEG2から現在の発電量等を抜いてくるコンポーネントは無かったのでchatGPTさんにお願いして作りました(笑)

https://github.com/realktmr/hass_aiseg2_solpwr

GitHubを使ったのもPyhonでプログラムを書いたのも初めてだったのですが、AI素晴らしいですね。chatGPTとGeminiさんに教えてもらいながら作ってみました。

インストール方法

  1. GitHUBからCode -> Download ZIPでファイルを全部ダウンロードする。
  2. Home Assistantのconfigディレクトリにアサインしたフォルダにcustom_components/aiseg2_solpwrごとフォルダもファイルも置く。
  3. Home Assistantの設定-> … -> Home Assistantを再起動で再起動する
  4. 上がってきたら設定 -> デバイスとサービス から +統合を追加 を選んで、AiSEG2 Solar Powerを探して追加。IP、Username(aiseg固定)、Password(あなたがつけたもの)を入力して追加

これで、「発電量」「消費量」「余力」が出ているはずです。

EcoFlow delta2へのアクセスは Ecoflow-Cloudというカスタムコンポーネントが公開されており、これを使うことで簡単にアクセスできます。

EcoFlowアプリでも手動で設定できる【エネルギー管理】-> 【バックアップ予約】を有効にして、電池を利用するレベルを設定できます。例えばこの設定を20%に設定すると、入力ACプラグを挿していてもバッテリー残量が20%になるまで、電池から出力してくれます。20%を切ると充電を開始します。が20%まで充電するとパススルーでAC入力から出力します。

この機能を利用して、以下のようなオートメーションを組んでいます。

【前提】 DELTA2のエネルギー管理設定で充電限度 90%、放電限度 10%に設定。

【充電開始】 発電余力が 1.0kWhを超えたとき、Delta2のBackup Reserve EnabledがONだったらBackup Reserve EnabledをOFFにする。(これによって90%までAC入力から充電されるようになる)

【放電開始】 18:00になった時、DELTA2のMain Battery Level が80%以上あったら、Backup Reserve EnabledをONにしてDELTA2の Backup Reserve Level を 20%に設定にする(これによって、20%までは電池から放電する。20%を下回ったら20%まで充電する。しかし基本的には20%の時点でパススルー運転になるので次の日の充電開始までパススルー運転を実現している、ちなみに、OFFにしてONにするとデフォルトの50%に戻ってしまうようだ。また、ONにしてからじゃないとReserve Levelの設定ができない)

はい。これで太陽光発電の余力を使って充電し、DELTA2を普段使いするといった使い方が実現できました 🙂

蛇足

本当は、余力が0を切ったら電池から放電って設定にもできるのですが、これをやると頻繁に電池運転に切り替わり、そのたびにリレーがカチカチ切り替わりなんか壊れそうな気がして(笑)

蛇足ですが、DELTA2はUPSではないので電池出力とACパススルーの切り替えに時に数ミリ秒切れてしまうのでPCなんかは電源落ちてしまいます。私はもともと使ってたAPCのRS550というUPSを嚙ましているので問題はないですが、それでも頻繁な切り替えは寿命を著しく縮めると思います。

そんな訳で、ちょっと妥協したオートメーションを組んでいますが、まぁ、十分かと。

他に、NASyncを置いてる部屋の温度計と連携して部屋の温度が32℃を超えたら自動でエアコンを掛けて30℃を下回ったら止めるオートメーションを組んだり。電力余力がなくなったら、29℃以下だったらエアコンを止めるオートメーションを組んだり。いろいろできるかと。

面白い使い方を思いついたらぜひ教えてください。

ポート開放が要らないVPN

背景

自宅回線をMoneyForwd 光に変更した結果、v6Plus接続になりダイナミックDNS等でのVPN接続は難しくなったしまったので、別の方法を探していました。

やりたいこと

  • 自宅のHEMSなどにiPhoneからアクセスしたい
  • UGREEN NASyncのdockerコンテナで実現したい

TailScale

探した結果、TailScaleというサービスがあることを知りました。イメージとしてはクラウド上にあるルーターにVPN接続したい機器がVPNを張りに行ってそこでルーティングしてもらう感じですね。なので、OUT方向が通れば固定IPやポート開放ができなくてもOKです。

TailScaleはPersonalプランという無償プランがあります。 3 Users 100 Devicesまで無料というなんとも太っ腹なサービス! 素晴らしい(笑)

早速やってみる

  1. iPhoneでTailScalアプリをダウンロード
  2. 新規にアカウント作成してVPN接続!
  3. PCからTailScalの管理ページに入りSettings -> Keysで Auth KeysをGenerate Auth keyをポチっとと押してキーを払い出しコピーしておく
  4. UGREEN NASyncでdockerアプリからプロジェクト作成で適当なプロジェクト名(vpnなど)と保存パス(docker様にアサインした共有フォルダがいいでしょう)を指定して、以下の内容をCompose設定に記載して今すぐデプロイ!
version: "3.8"

services:
  tailscale:
    image: tailscale/tailscale:latest
    container_name: tailscale
    hostname: nasync
    network_mode: "host"
    privileged: true
    volumes:
      - /var/lib:/var/lib
      - /dev/net/tun:/dev/net/tun
    environment:
      # Tailscale 管理画面で作成した AuthKey を入れる
      - TS_AUTHKEY=tskey-auth-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      # LAN 全体 (192.168.1.0/24) を iPhone に広告
      - TS_EXTRA_ARGS=--advertise-routes=192.168.1.0/24
    restart: unless-stopped
  1. TailScaleの管理ページからMachinesを見ると、iPhoneとnasyncが繋がってるはず!nasyncの…からEdit route settingsを選んで目的のサブネットにチェックを入れて保存すればそのサブネットに行けるようになります。

Machines Edit Route Settings

超簡単で素晴らしい!(^_^)/

QNAP TS-230 to UGREEN DXP2800 番外編

前回の記事で書いていたHEIC写真とJPGファイルの重複を何とかできないものかとNASyncの重複写真・類似写真検索やPCツールのDupFileEliminatorなどを試した見たのですが、検出されなかったので、chatGPTに相談した結果、何度かやり取りをした結果スクリプトが完成しました(^_^)/

ただし、もっと簡単な方法はUGREENが取ったバックアップからQNAP QuMagieでバックアップしていた日以前のHEICファイルを消してしまうことです。そうすれば、それ以前のデータはJPGで残っているわけですが重複は発生しません。まぁ、これが一番楽だと思います。

今回は、HEICとJPGの同じ写真を同じ写真として区別できるのかをテーマに実験してみました。

Pythonを使ったプログラムなのですが、Windows版Pythonだと HEICの処理がうまくいかなかったのでWSLのUBUNTU 22.04上で実行しました。

一発で目的の物が出てくることは稀ですがうまくいかない場合はエラー内容などをChatGPTに伝えれば対策を教えてくれます。素晴らしい。

方針

  1. 方針 HEICと JPG をハッシュ比較1して同じ写真を検出する
  2. 比較して同じ写真のペアを作る
  3. 確認用にファイルをコピー
  4. 人が確認して2問題なければ削除実施3

脚注

  1. フォーマットが違うのでハッシュ比較するために一旦、どちらの画像もPIL.Imageという形式に変換してハッシュを取っているようです。 ↩︎
  2. 比較用に./compare_outputフォルダにcompare.htmlと対象写真のコピーを作成してくれる仕様なんですが、写真が大きいので大量に読み込むとブラウザが固まってしまって使いもにならなかったので比較はExplorerで特大アイコンモードで見比べました。1つも間違ってませんでした。素晴らしい。 ↩︎
  3. 削除は比較スクリプトが吐き出したmatched_files.txtというリストをもとに削除します。 ↩︎
比較スクリプト
import os
from PIL import Image
import pyheif
import imagehash
from pathlib import Path
import shutil

# === 設定 ===
HEIC_ROOT = Path("<HEICファイルのパス>")
JPG_ROOT = Path("<JPGファイルのパス>")
OUTPUT_DIR = Path("compare_output")
MATCH_LIST_FILE = Path("matched_files.txt")
HASH_FUNC = imagehash.phash

# === 準備 ===
OUTPUT_DIR.mkdir(exist_ok=True)
heic_hashes = dict()
matched_pairs = []
heic_total = 0
jpg_total = 0
heic_errors = 0
jpg_errors = 0

print("🔍 HEICファイルをスキャン中...")
#print(f"📁 HEICルート: {HEIC_ROOT}")
#if not HEIC_ROOT.exists():
#    print("❌ 指定したHEICフォルダが存在しません。パスを確認してください。")
#    exit(1)
#else:
#    print("📂 HEICフォルダ一覧:")
#    for path in HEIC_ROOT.rglob("*"):
#        print("   ", path)

#for heic_file in HEIC_ROOT.rglob("*.heic"):
for ext in ["*.heic", "*.HEIC"]:
    for heic_file in HEIC_ROOT.rglob(ext):
        try:
            heif = pyheif.read(heic_file)
            image = Image.frombytes(heif.mode, heif.size, heif.data, "raw", heif.mode)
            h = str(HASH_FUNC(image))
            heic_hashes[h] = heic_file
            heic_total += 1
        except Exception as e:
            print(f"⚠️ HEICエラー: {heic_file} → {e}")
            heic_errors += 1

print(f"📸 HEIC読み込み成功: {heic_total} 件 / エラー: {heic_errors} 件")

print("📋 JPGファイルと照合中...")
for ext in ["*.jpg", "*.JPG"]:
    for jpg_file in JPG_ROOT.rglob(ext):
        try:
            with Image.open(jpg_file) as image:
                h = str(HASH_FUNC(image))
                if h in heic_hashes:
                    matched_pairs.append((jpg_file, heic_hashes[h]))
                jpg_total += 1
        except Exception as e:
            print(f"⚠️ JPGエラー: {jpg_file} → {e}")
            jpg_errors += 1

print(f"📸 JPG読み込み成功: {jpg_total} 件 / エラー: {jpg_errors} 件")
print(f"🔗 一致したペア数: {len(matched_pairs)}")

# === HTMLと画像出力 ===
html_lines = [
    "<html><head><meta charset='utf-8'>",
    "<style>body{font-family:sans-serif;} img{max-width:300px; margin:5px;} .pair{margin-bottom:40px;}</style>",
    "</head><body><h1>HEIC vs JPG 比較結果</h1>"
]

with open(MATCH_LIST_FILE, "w", encoding="utf-8") as f:
    for i, (jpg_path, heic_path) in enumerate(matched_pairs):
        base = f"pair_{i}"
        jpg_out = OUTPUT_DIR / f"{base}_jpg.jpg"
        heic_out = OUTPUT_DIR / f"{base}_heic.jpg"

        try:
            shutil.copy2(jpg_path, jpg_out)

            heif = pyheif.read(heic_path)
            heic_img = Image.frombytes(heif.mode, heif.size, heif.data, "raw", heif.mode)
            heic_img.save(heic_out, "JPEG")

            html_lines.append(f"<div class='pair'><h3>{base}</h3>")
            html_lines.append(f"<p><b>JPG:</b> {jpg_path}<br><b>HEIC:</b> {heic_path}</p>")
            html_lines.append(f"<img src='{jpg_out.name}' alt='JPG'>")
            html_lines.append(f"<img src='{heic_out.name}' alt='HEIC'>")
            html_lines.append("</div>")

            f.write(str(jpg_path) + "\n")
        except Exception as e:
            print(f"⚠️ 出力失敗: {jpg_path} / {heic_path} → {e}")

html_lines.append("</body></html>")
with open(OUTPUT_DIR / "compare.html", "w", encoding="utf-8") as f:
    f.write("\n".join(html_lines))

print(f"✅ 完了!{len(matched_pairs)} ペアを {OUTPUT_DIR}/ に保存しました。")
print("🖼 `compare_output/compare.html` をブラウザで開いて確認してください。")
print(f"📝 削除対象候補リスト: {MATCH_LIST_FILE}")

削除スクリプト

from pathlib import Path

MATCH_LIST_FILE = Path("matched_files.txt")
deleted = 0

if not MATCH_LIST_FILE.exists():
    print("❌ matched_files.txt が見つかりません。先に比較スクリプトを実行してください。")
    exit(1)

with open(MATCH_LIST_FILE, "r", encoding="utf-8") as f:
    jpg_paths = [Path(line.strip()) for line in f if line.strip()]

print(f"🗑 削除対象 JPG 数: {len(jpg_paths)}")
for jpg_path in jpg_paths:
    if jpg_path.exists():
        try:
            jpg_path.unlink()
            print(f"✅ 削除: {jpg_path}")
            deleted += 1
        except Exception as e:
            print(f"⚠️ 削除失敗: {jpg_path} → {e}")
    else:
        print(f"⚠️ ファイル存在しない: {jpg_path}")

print(f"✅ 削除完了: {deleted} 件")

まとめ

Python書けない私ですがChatGPTを使えば実用的なものができてしまうという素晴らしいですね。ただし、HEICとJPGではアルゴリズムの違いにより復元したRAWデータに差異が出てしまい完全には拾いきれず、結構違う写真として判断されてしまってるものが残ってしまいます。これは中々難しい問題です。まぁ、実用的には撮影情報からその日以前のHEICファイルを消した方が速いと思います(あるいは逆の方法でJPGを)

蛇足

何枚かHEICファイルじゃないってエラーが出たので調べてみたのですが、iPhoneの画像ファイルで.HEICなのにJPGなものがあるようです。iPhoneのBUG?

$ file IMG_xxxx.HEIC: ISO Media, HEIF Image HEVC Main or Main Still Picture Profile

$file IMG_yyyy.HEIC: JPEG image data, JFIF standard 1.01, aspect ratio, density 72×72, segment length 16, Exif Standard: [TIFF image data, big-endian, direntries=12, manufacturer=Apple, model=iPhone 12, xresolution=174, yresolution=182, resolutionunit=2, software=16.6, datetime=2023:09:11 15:33:46, hostcomputer=iPhone 12], baseline, precision 8, 4032×3024, components 3

さらに蛇足ですが、Pythonってループとかの構造を{}で囲ったりせず、インデントで判断するんですね。。。新鮮でした。インデントずれてたらエラーになったのでビビりました。

QNAP TS-230 to UGREEN DXP2800 使い勝手レポート編

まだ、QNAP TS-230から完全な移行はできてないのですが、使ってみた感触をレポートしていきたいと思います。

写真

  • iPhoneで写真のバックアップをすると、HEICのままバックアップされるのだが、サムネイルの作成は問題なし。写真をクリックするとなぜか小さな写真が表示される。「元の画像を見る」ボタンを押すと元の写真が表示される。負荷低減ってことなのかな。
  • 共有写真を作りたい場合、ファイルアプリからフォルダを作ると写真アプリから見えない。写真アプリから共有ギャラリーを作るという仕様のようだ。
  • 人物識別はQuMagieよりは正確だと思う。識別速度もすぐにって訳にはいかないけど、ちょっと待てば反映される感じなのでストレスはない感じ。ただし、識別が間違っている場合、認識したグループとグループを結合することは可能だが、同じグループに分類してしまっているものを分けたり、新たに顔を指定して認識させたりといったことはできない様だ。GooglePhotosの様にこれは同じ人物ですか?とか聞いて精度を上げる仕組みを入れて欲しい。それと、AI認識系の処理にほとんどGPUを使ってない様に見える。認識がバリバリに走ってるときでもGPU使用率が20%程度なので、是非活用して処理速度を上げて欲しい。
  • QuMagieから写真の撮影日付を変えるとファイルのEXIF情報じゃなくてQuMagieのメタファイルに記録するので、他の写真管理ソフトに取り込むと全部消えるのですが、UGREENの写真アプリはちゃんとファイルのEXIF情報を書き換えていた。ただし、複数の写真を選択して一気に日付を変えることはできない。
  • AI認識ジョブがどこまで進んでるかは各ルーザーの写真アプリでしか分からない。管理者アカウントのタスクセンターに出して欲しい。
要望
  • 人物識別の修正をできるようにして欲しい。これは同じ人物ですか?の機能も付けて欲しい。
  • 複数の写真を選択して撮影日を変更できるようにして欲しい→これはできた。右クリックとかではなく、選択中は黒帯のメニューが出ていて、・・・から「撮影日時を編集する」で直せる。→が、大量に選択して日時を変更すると何枚かが変更されずに残る。。。BUG?
  • AI処理にGPUを利用する様にして欲しい(速くなるなら)
  • AI処理の進行状況を管理者のタスクセンターに表示して欲しい
  • HEICとJPGで同じ写真を重複検出できるようにして欲しい(これ、類似写真検出にも引っかからない。。。)
  • 写真お回転させてもその場の表示が回転するだけで保存はされないので写真を回転して保存して欲しい

バージョンマネージャー

  • バージョンマネージャーは同期とバックアップでバージョン保持を有効にする必要があると書いてあるんだけど、有効にしなくてもバージョンマネージャー側の設定でバージョン保留を有効にすれば履歴が見えてる気がする。。。どっちが正しいんだろ?「保持」と「保留」ってのは翻訳の揺れなのかなぁ。。。

あと、これSMBでPCから見てる時にWIndows側から以前のバージョンからは見えないのね。残念。

https://support.ugnas.com/#/detail/eyJpZCI6MjgyLCJ0eXBlIjoidGFnMDAxIiwicGF0aENvZGUiOiJwcm8wMDIsYVR0cjlhLHlVUlRWdSIsImxhbmd1YWdlIjoiemgtQ04iLCJjbGllbnRUeXBlIjoiUEMiLCJhcnRpY2xlVmVyc2lvbiI6IiJ9

要望
  • Windowsの以前のバージョンから履歴が見えるようにして欲しい

同期とバックアップ

QNAPのHBS3はローカルのRsyncなどの他にもS3などへのバックアップが可能になっている。しかしUGREENの同期とバックアップはRsync同期はある様だけどクラウドストレージへのバックアップ機能はない様だ。他に、クラウドドライブというアプリもあるのだけどこちらもS3への同期は不可(現時点でGoogle DriveとOneDriveだけ対応)

要望
  • S3 Deep Archiveなどへのバックアップ機能を作って欲しい。

テキストエディター

  • 複数ファイル開いている時にマウスホイールでスクロールすると全部のタブでスクロールしちゃう?
要望
  • マウスホイールでスクロールはカレントタブだけにして欲しい
  • 置換機能で選択範囲だけの置換ができるようにして欲しい

Docker

  • dockerフォルダーをSMB共有掛けるとDockerコンテナから読めなくなることがある?原因よよくわからない。。。

温度

室温30℃湿度63%の環境でCPU温度が80℃まで上がることがある。FANが高速になりすぐに下がるので問題ないと思うけど、FAN設定をフルスピードにすると75℃くらいまでしか上がらなくなるけど、それなりにうるさい(笑) 消費電力はピークで40Wくらいかな。構成はM.2 SSD Gen3 256GB x2 HDD 12TB 7200rpm x2 です。

もう1つ気になるのがHDD1がHDD2より2,3℃高いことですね。SSDスロットがHDD1の側面にあるのでその影響だと思うのですが、HDD温度が50℃ってのはちょっと高いと思います。

トラブル

  • SMR HDDは使わない方がいい

トラブル編にも書いたけど、SMRのディスクはやめた方がよさそうです。QNAP TS-230では大丈夫だったんですが、高速な分、HDDへの要求も高いみたいです。不安案人は互換リストにあるHDDを利用しましょう。

QNAP TS-230 to UGREEN DXP2800 トラブル編2

前回からの続きです。結局、戻ってこず、諦めました。今は、HDDがRead-Onlyになっちゃってるので抜いて挿しなおしたら復帰しないかとダメ元でやってみたら。。。見事に死亡(笑)よい子の皆さんは消してまねしないですください。

まぁ、ここまで壊れればサクッと諦めて新たに買ったHDDで新規にストレージプールを組むことに(笑)

新しいディスクは昨日お話しした通りSkyHawk AI 12TBという監視カメラとか用に開発されたHDDでそもそもエンタープライズ向けのHDDを整備して払い下げてる?感じなんだと思います。型番がST12000VE007とあんまり見かけない型番でした。まぁ、CMRだし結構早くてエラーも出てないです。ちなみに、再生備品といってもS.M.R.Tを見る限り新品でした。

今回は2本あるので最初からRAID1で組みます。同期には13時間かかると出てました。この状態でも既に利用可能です。ただし同期が遅くなります。試しに200GB弱コピーしてみたら、同期完了予定が16時間21分に伸びてしまった(笑)おとなしく待っているのが良いでしょう。

といいつつ、ついやってしまう。ベンチマーク。裏で同期が走ってるので(といっても優先順位を下げてるのでユーザアクセスがあると同期を後回しにしてくれる)少し影響あるかもしれないけど、結構早かった。SSDキャッシュはまだ入れてません。

買ったディスクも中々速いです。これ、SSD要らなかったんじゃ。。。

うん。やっぱSSDキャッシュ要らないな。。。というか、買った安物のSSDがランダムアクセス遅いんだね。。。でもRND4Kはもう少し早くなってもいい気がするよなぁ。キャッシュアルゴリズム問題?

SSDをストレージプールとしてアクセスした場合

まぁ、なんにしてもこれで晴れてフル装備状態になりました。これから使い倒してみようと思います 🙂

QNAP TS-230 to UGREEN DXP2800 トラブル編

朝見たらDXP2800がエラーを起こしてました。。。アプリが利用できない状態になっており、調べてみるとストレージシステムの状態が「重大」と。。。

エラーが起きてるからリードオンリーになってるよと。

HDD、SSDの状態は正常??

ここで昨日追加したSSDキャッシュがエラってるかと思って、SSDキャッシュの削除を実施しちゃったんですよね。。。これが悪手でした。ずっと、SSDをカリカリ読んでるけど、書き戻しが一向に進まない。。。

ここでサポートに連絡してヘルプを求めたのですが、原因はHDD側でした(;_; とりあえず、手元にあったArchiveHDDっていうSMRのディスクを使ったのですが、こいつが頻繁にエラーを起こしているようで。確かにRsync中に少し固まることが何度かあったんですよね。。。

HDDは互換リストにあるものを利用してくださいと。まぁ、ごもっともで。。。

https://nas.ugreen.jp/pages/compatibility

実はもう互換性にないHDD買っちゃったんですよね。アマプラで(笑)

一応CMRだけとNAS用という訳ではなく、監視カメラとか用のSkyHawkってディスクですね。当然サポートは保証しないやつですね。

こっちも互換リストにはないですがNAS用って明記されてて14TBでそんなに値段変わらないのでこれのがよかったかなぁ。。。まぁ、あんまり変わらないと思うけど。

まぁ、不安な人は互換リストに載ってるHDDを使ってください(笑)

さて、どうしたものか。まぁ、データはまだQNAPにあるので、大丈夫なんですが、コンテナとかも作り直しだしめんどくさいよね(-_-;

実はQNAPの方も1本HDDが怪しくなってきててS.M.A.R.Tで以上セクターが32あるって出てるんですよね。。。

まぁ、このあたりが自宅NASを持つってことですよね。私は趣味なので問題ないですが、これ、一般の人管理できるのかなぁ?とも思いますね。RAIDは間違うとデータ飛ばしますからね。特にRAID5。私は怖いのでRAID1しか組まないですが。今回、SSDキャッシュ一抹の不安はあったんですよねぇ。問題はHDD側でしたが、仮にHDDの問題でも単なるRAID1のディスク不良ならディスク交換すれば再同期して終了なので。やっぱ、シンプルにRAID1だけで組もうかなぁ。。。

明日まで待って復帰しなかったら明日届く、HDDを入れて新規に作り直そう。。。

QNAP TS-230 to UGREEN DXP2800 SSDキャッシュ編

結局SSDも買ってしまいました(笑)。SSDのライトキャッシュを有効にするためには2枚いるそうなのでfanxiangなる中華メーカーの安い250GB SSDを2枚買いました。

DXP2800ってSSDスロットがHDDスロットの側面にあるんですが。想像はしてましたがいやー入れんくいですね。まぁ、慣れれば大丈夫ですが。

まずはSSDの速度測定

SSDキャッシュに組み込む前にまずはRAID1を組んでストレージプールとして使ってみます。はい。シーケンシャルは問題なく、ワイヤーレート付近まで出てんすね。ランダムは遅いですね。安物TLCだからこんなもんか。

SSDキャッシュ設定

HDDのストレージプールにSSDをキャッシュを追加するにはストレージプールの右上の「・・・」をクリックしてSSDキャッシュ管理へ行きます。

あとは、メニューに沿って進めば、SSDキャッシュの設定ができます。もちろん書き込むキャッシュ利用で。こんな感じ。

では早速、測ってみますか。

参考までにSSDキャッシュ入れる前の状態はこんな感じ。

結論

うーん。シーケンシャルは早いですねぇ。でもシーケンシャルはHDDも結構早いので別にSSD入れなくても。。。

なんでランダムリードがこんなに遅いんだ?なんかキャッシュアルゴリズムが悪いのかも。

これ。SSDをキャッシュで使うより、別にSSDのプールを作って速さが必要な用途用に使った方がいいのでは。。。例えば仮想マシンのバックエンド用とか。

QNAP TS-230 to UGREEN DXP2800 コンテナ編

移行編に続き、QNAPでもやっていたMRTGをコンテナで動かしてみようと思います。

Dockerアプリ

DXP2800ではコンテナを動かすためにはDockerアプリをインストールします。コンテナの動かし方はQNAP TS-230とほぼ同じです。ただ、TS-230はARMアーキテクチャなのでsk278/rpi-mrtgを使っていたのですが、今回はfboaventura/dckr-mrtgにしてみました。

ついでに前回は手組でコンテナを作ったのですが、今回はDocker-Composeを使って作ってみました。Docker Hubサイトにdocker-composeの記載があるのでほぼそのまま使えます。

---
services:
  mrtg:
    image: fboaventura/dckr-mrtg:latest
    hostname: mrtg
    restart: always
    ports:
      - "8880:80"
    volumes:
      - "./conf.d:/etc/mrtg/conf.d"
      - "./html:/mrtg/html"
      - "/etc/localtime:/etc/localtime:ro"
      - "/etc/timezone:/etc/timezone:ro"
    environment:
        TZ: "Asia/Tokyo"
        HOSTS: "コミュニティ名:ルーターIP"
        WEBDIR: "/mrtg/html"
        USERID: 1000
        GROUPID: 1000
        REGENERATEHTML: "yes"
        INDEXMAKEROPTIONS: "--section=descr"
        CFGMAKEROPTIONS: ""
        MRTG_COLUMNS: 2
    tmpfs:
      - "/run"

こんな感じで、プロジェクトからcomposeを張り付けて今すぐデプロイ!

これで、http://DXP2800のIP:8880/ でMRTGが立ち上がります。

コンフィグはDockerアプリをインストールすると共有フォルダにdockerフォルダができるのでその中のmrtg/conf.d/にルータIP.cfgができています。これを使うもよし自分でいじったcfgを使うもよし。*.cfgファイルを読んでくれるので、ここに自分で作ったhoge.cfgを置けばOKです。ただし、ルーターIP.cfgはないと勝手に作られちゃうのでダミーでも置いとく必要があります。データはmrtg/htmlに吐き出されます。

はい。動きました。簡単ですね(笑)

こんな感じです。

蛇足

原因がいまいちはっきりしないのですが、どうやっても403 Forbidnになってしまう現象が発生しました。やったことを書くともともと一般ユーザーだったユーザーを管理者に格上げしてそのユーザーでdockerを操作したらなぜか、MRTGのグラフが表示されず、403 Forbidnになってしまいました。ファイルパーミションは実は全部、777で作られるようで、実際の権限管理は別途やってるみたいですね。ただ、ユーザーは確かにUNIX的に別のユーザーなので何等か想定しない操作をしてしまったんだと思います。結局、コンテナを作り直したら戻りました。ファイルは元のコンテナからコピーすればOKでした。