ミニPCでマルチサーバー構築 [Immichコンテナ]

2024/05/20に公開


ミニPCでマルチサーバー構築シリーズのImmichコンテナ構築の記録メモです。[Immich v1.103.1]

シリーズ

  1. N100搭載ミニPCでマルチサーバーの構想と構築準備
  2. ミニPCでマルチサーバー構築 [OS等インストール]
  3. ミニPCでマルチサーバー構築 [Sambaコンテナ]
  4. ミニPCでマルチサーバー構築 [PostgreSQLコンテナ]
  5. ミニPCでマルチサーバー構築 [Nginxコンテナ]
  6. ミニPCでマルチサーバー構築 [Immichコンテナ] この記事
  7. ミニPCでマルチサーバー構築 [VaultwardenコンテナとTailscale]
  8. ミニPCでマルチサーバー構築 [AdGuard Homeコンテナ]
  9. ミニPCでマルチサーバー構築 [GUI環境整備]

簡単な要件

  • 無料で使用できる
  • バックアップとして機能する
    • 元の写真は編集されずそのまま保管される
  • 実ファイルの場所をある程度制御可能
  • 写真をいい感じに一覧化してくれる
  • PC,スマホ両方から簡単にアクセス可能
  • 認証機能がある
  • 長期間開発が滞っていない

検討事項とコンテナ化

  • たくさんあるソリューションを比較している良いサイトで検討
    • PiwigoとImmichで悩んだが、公式がDockerを推奨しているImmichに決定
  • 公式のdocker-compose.ymlが存在するためそれを使用する
    • compose.yamlは一つに纏めておきたいのでカスタマイズして取り込む
    • ただし今後のバージョンアップ時に変更される可能性が明記されている
      • バージョンアップ時にメンテが必須になるデメリットがある

Docker Compose周り作成

ディレクトリ構成

$ tree .
.
├── compose.yaml
└── immich
    └── var.env

compose.yaml

  • ポート2283はデフォルトのまま
  • 注意点
    • redisコンテナの名前はredisでなければならない
    • postgresqlコンテナの名前はdatabaseでなければならない
    • .envを使用しなくてもDB設定等伝播のためenv_fileは必要
      • 元の.envはcompose.yaml動的変更と上記の両方を担う
compose.yaml
services:
  immich:
    image: ghcr.io/immich-app/immich-server:release
    restart: unless-stopped
    ports:
      - "2283:3001"
    configs:
      - source: common-lctime
        target: /etc/localtime
    env_file:
      - ./immich/var.env
    volumes:
      - /mnt/ssd1/photo:/usr/src/app/upload # UPLOAD_LOCATION
    networks:
      - imcnet
    command: ['start.sh', 'immich']
    depends_on:
      - immich-redis
      - immich-pgsql
  immich-micro:
    image: ghcr.io/immich-app/immich-server:release
    restart: unless-stopped
    configs:
      - source: common-lctime
        target: /etc/localtime
    env_file:
      - ./immich/var.env
    volumes:
      - /mnt/ssd1/photo/:/usr/src/app/upload # UPLOAD_LOCATION
    networks:
      - imcnet
    command: ['start.sh', 'microservices']
    depends_on:
      - immich-redis
      - immich-pgsql
  immich-ml:
    image: ghcr.io/immich-app/immich-machine-learning:release
    restart: unless-stopped
    env_file:
      - ./immich/var.env
    volumes:
      - mlmodel-cache:/cache
    networks:
      - imcnet
  immich-redis:
    container_name: redis
    image: registry.hub.docker.com/library/redis:6.2-alpine@sha256:84882e87b54734154586e5f8abd4dce69fe7311315e2fc6d67c29614c8de2672
    restart: unless-stopped
    networks:
      - imcnet
  immich-pgsql:
    container_name: database
    image: registry.hub.docker.com/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: foobar
      POSTGRES_USER: immich
      POSTGRES_DB: immich
    volumes:
      - /srv/immich/db:/var/lib/postgresql/data
    networks:
      - imcnet

onfigs:
  common-lctime:
    file: /etc/localtime

volumes:
  mlmodel-cache:

networks:
  imcnet:

var.env

# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables

# The location where your uploaded files are stored
UPLOAD_LOCATION=/mnt/ssd1/image/photo
# The location where your database files are stored
DB_DATA_LOCATION=/srv/immich/db

# The Immich version to use. You can pin this to a specific version like "v1.71.0"
IMMICH_VERSION=release

# Connection secret for postgres. You should change it to a random password
DB_PASSWORD=foobar

# The values below this line do not need to be changed
###################################################################################
DB_USERNAME=immich
DB_DATABASE_NAME=immich

設定

  • 公式では.envファイルで設定を指定する方式
    • どうせ自分用に一つに纏めるのでcompose.yamlにハードコードした
    • バージョンアップ時のメンテを自身に強要する意味もある
  • 実ファイルの場所はUPLOAD_LOCATIONで指定可能
    • ボリュームのマウント先を制御しているだけなので手で変更
  • 写真の保存パス指定のことをImmichでは"Storage Template"と呼ぶ
    • デフォルトではYear/Year-Month-Day/Filename.Extension
    • 量的に日付dirで分ける必要はないので以下に変更
      • Year/YMD_Filename
      • 実際の設定値は{{y}}/{{y}}{{MM}}{{dd}}_{{filename}}
      • 設定画面では拡張子がなぜかjpgに固定されていたので{{ext}}は無し
      • 実際の保存は元の拡張子でそのまま保存された
  • 上記設定を適用した際のUPLOAD_LOCATIONは以下のように使用される
    • 元の画像はlibrary/admin以下に保存された
    • encoded-video,thumbs,uploadは自動で作成される
UPLOAD_LOCATION
├── encoded-video
├── library
│   └── admin
│       ~~~~~
│       ├── 2022
│       ├── 2023
│       └── 2024
│           ├── 20240407_IMG_3245.HEIC
│           ~~~~~
├── thumbs
└── upload
  • 別に動画は再エンコードしてほしくないので以下設定を変更
    • Administration -> Settings -> Video Transcoding Settings
      • TRANSCODE POLICY を "Don't transcode ~~" に変更
  • 初回アップロード時に負荷がかかるので以下変更を推奨
    • Administration -> Settings -> Job Settings
      • 少なくとも Thumbnails はCPUコア数にする
      • この処理だけはN100性能高めで良かったと思った

参考文献

Discussion