QNAP NASへのimmichインストール手順

# はじめに
Googleフォトが有料化になって早n年
有料化に伴いQNAPのNASを購入し、写真や動画はすべてNASに保存するようにしていました。
QNAPにも写真閲覧アプリのQueMagieが存在しますが、Googleフォトの比べると劣っている感は否めません。

https://www.qnap.com/ja-jp/software/qumagie

先日Qiitaの記事を読んでいたらimmichというセルフホストで実行するOSSの、Googleフォト代替ツールがあることを知りました。

https://qiita.com/katori_m/items/8c7555339b59f14c6d73


せっかくNASがあるのでNASで構築しようとしましたが、immichに関する日本語の情報、特にQNAPで構築している情報がなかったので四苦八苦しながらなんとかインストールに成功しました。

# 参考・公式サイト

https://immich.app/docs/install/docker-compose/

https://github.com/immich-app

https://note.com/nagomimakuri/n/n7581657dda12

他reddit（Qiita投稿不可でした）

# QNAPNASへのimmichインストール
Synologyの場合QNAPのアプリケーションでいうアプリケーションで起動できるらしい
QNAPでも同様の機能はあるが、YAMLファイル単体で指定する必要があるため修正が必要となる。
[Container Station](https://www.qnap.com/ja-jp/how-to/tutorial/article/container-station-3-%E3%81%AE%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95)  

## 前提
- QNAP NASを利用
- QNAP TS-253D4G（メモリ20GB&SSD読取キャッシュ）
- `⁠Multimedia/FamilyPhotos` 配下に写真を保存している。

## 準備
QNAP NAS（以下NAS）のIPとユーザでログインする
`immich-app`フォルダと、配下に`library`と`postgres` のフォルダを作成する。
QNAPの場合、`/share/CACHEDEV1_DATA/`が普段GUIからアクセスしている場所になりますが、シンボリックリンクが張られているので以下で作成できます。
```
mkdir /share/docker/immich-app/{library,postgres}
```

## ファイルダウンロード
/share/docker/immich-app/ に配置してください。
#### docker-compose.yml
> https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml

#### example.env
example.env は .env　にファイル名を変更する
> https://github.com/immich-app/immich/releases/latest/download/example.env

#### hwaccel.transcoding.yml
> https://github.com/immich-app/immich/releases/latest/download/hwaccel.transcoding.yml

## example.env修正
viなどで修正してください。
### タイムゾーン変更

日本に変更します

```
TZ=Asia/Tokyo
```

### DBパスワード変更

任意のパスワードに変更。外部からログインするパスワードではないため変更しなくても大丈夫です。

```
DB_PASSWORD= [任意のパスワード]
```

## ⁠docker-compose.yml修正

### 外部ライブラリの追加

`⁠services` の`volumes`で写真を格納しているディレクトリを指定

> [https://immich.app/docs/guides/external-library](https://immich.app/docs/guides/external-library)  


```shell
      - /share/CACHEDEV1_DATA/Multimedia/FamilyPhotos:/mnt/photos:ro
```

### QSV利用

QSVを利用する場合は`⁠services` の`extends`をコメントアウトし、`quicksync`とする

```
    extends:
      file: hwaccel.transcoding.yml
      service: quicksync # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
```

#### サンプル

私の場合は以下になりました。

```
services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    extends:
      file: hwaccel.transcoding.yml
      service: quicksync # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
    volumes:
      # Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
+     - /share/CACHEDEV1_DATA/Multimedia/FamilyPhotos:/mnt/photos:ro        # <--ここに追加
～省略～
```
## コンテナ起動
バックグラウンドで起動します。

```
cd /share/docker/immich-app
docker compose up -d
```
すると準備が始まり、以下のメッセージとともにプロンプトが返ってきたら完了です。
```
[+] Running 6/6mmich_machine_learning  Started                                                    9.8s
 ✔ Network immich_default             Created                                                    4.7s                                                                                                                                        ✔ Container immich_redis             Started                                                   10.1s
 ✔ Volume "immich_model-cache"        Created                                                    0.1s                                                                                                                                        ✔ Container immich_postgres          Started                                                    9.8s
 ✔ Container immich_machine_learning  Started                                                    9.8s                                                                                                                                        ⠇ Container immich_server            Starting                                                  10.3s
 ✔ Container immich_redis             Started                                                   10.1s                                                                                                                                       
 ✔ Container immich_postgres          Started                                                    9.8s                                                                                                                                       
 ✔ Container immich_server            Started                                                   10.4s

```

正常に起動したらContainerStarionのコンテナ一覧を確認します。するとimmichの５つが実行中となっているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/719613/94ca131c-841a-05bc-f44b-414af1ae1161.png)


## “can't set healthcheck.start\_interval as feature require Docker Engine v25 or later”エラーが出た場合

は`⁠docker-compose.yml` の`⁠start_interval: 30s`の値をコメントアウトします。

> Health check start interval
> 
> If you get an error `can't set healthcheck.start_interval as feature require Docker Engine v25 or later`, it helps to comment out the line for `start_interval` in the `database` section of the `docker-compose.yml` file.

## アクセス

2283ポートにアクセスするとユーザ登録画面がimmichが起動すると思います

ユーザ登録は画面の案内にしたがって進めていきます

```
http://[NAS-IP]:2283/
```


## 外部ライブラリの追加
管理＞外部ライブラリ＞ライブラリを作成＞インポートパスを編集＞パスを追加
⁠docker-compose.ymlで定義したパスを追加し、その後Scanを実行します。
```
/mnt/photos
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/719613/d1db7905-79ec-b935-6975-62dd6b4c8e7c.png)


## immichをアップデートするとき

```terminal
cd /share/docker/immich-app
docker compose pull && docker compose up -d
```

# まとめ
https://widedeep.hatenablog.jp/entry/qnap-immich-install

ContainerStationでubuntuを起動してその上でimmichを動かそうとしたりいろいろ試行錯誤していましたが、意外とシンプルな方法でできました。
今回は試していませんが、Portainerというもので動かすのも簡単とコメントしている方もしました。
今後は表示する写真のアクセス制限などの方法も調べてみたいと思います。