[SOLVED] Moving container storage to a different disk (one with ZFS)

used1d

Member
Jun 16, 2025
49
2
8
Hello, I'm a bit over my head on this one.. I tried following a tutorial for installing Immich on my PVE along with Tailscale. However, their tutorial was a bit different than my setup was. They were doing it on a fresh install of Proxmox and with 1 SSD. MY setup is with 1 NVME, 1 SSD, and 3 HDDs. The 3 HDDs are in ZFS zraid1 currently with it's name as "PVE1_bulk" . During the tutorial there was a .yaml file created and a .json file created in path /mnt/PVE1_bulk/appdata/... I thought I could just replace the name of the drive from the tutorial with my PVE1_bulk ZFS name that I have on my server, but I guess that's not how you do it. What it did was put Immich onto my (local) storage where I have my ISO files; I want it on my ZFS drives. During this tutorial it walks you through setting up Immich on a container in PVE terminal rather than in a VM (which I now cannot SEE in the web GUI like I can other CTs and VMs). If you're willing, here is the video of the tutorial https://www.youtube.com/watch?v=guHoZ68N3XM

So, how can I move what I did into my ZFS storage?? Is there a way? Thank you for your help if anyone has the time.

Here is the .yaml file I created, it shows the use of /mnt/PVE1_bulk/... for reference:
Code:
services:
  immich-ts:
    image: tailscale/tailscale:latest
    hostname: immich
    environment:
      - TS_AUTHKEY={MY-KEY}
      - TS_STATE_DIR=/var/lib/tailscale
      - TS_SERVE_CONFIG=/config/immich.json
      - TS_USERSPACE=true
    volumes:
      - /mnt/pve1_bulk/appdata/immich/ts-config:/config
      - /mnt/pve1_bulk/appdata/immich/ts-state:/var/lib/tailscale
    restart: unless-stopped
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:release
    # extends:
    #   file: hwaccel.transcoding.yml
    #   service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
    volumes:
      - /mnt/pve1_bulk/data/photos/upload:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    network_mode: service:immich-ts
    # ports:
    #   - '2283:2283'
    environment:
      DB_HOSTNAME: immich-database
      DB_PASSWORD: ***
      DB_USERNAME: ***
      DB_DATABASE_NAME: immich
      REDIS_HOSTNAME: immich-redis
    depends_on:
      - immich-redis
      - immich-database
  restart: unless-stopped
    healthcheck:
      disable: false

  immich-machine-learning:
    container_name: immich_machine_learning
    # For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
    # Example tag: ${IMMICH_VERSION:-release}-cuda
    image: ghcr.io/immich-app/immich-machine-learning:release
    # extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardwar>
    #   file: hwaccel.ml.yml
    #   service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference
    volumes:
      - model-cache:/cache
    restart: unless-stopped
    healthcheck:
      disable: false

  immich-redis:
    container_name: immich_redis
    image: docker.io/valkey/valkey:8-bookworm@sha256:ff21bc0f8194dc9c105b769aeabf9585fea6a8ed649c0781caeac5cb3c2478>
    healthcheck:
      test: redis-cli ping || exit 1
    restart: unless-stopped

  immich-database:
    container_name: immich_postgres
    image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0-pgvectors0.2.0@sha256:fa4f6e0971f454cd95fec5a9aaed2ed93d>
    environment:
      POSTGRES_PASSWORD: ***
      POSTGRES_USER: ***
      POSTGRES_DB: immich
      POSTGRES_INITDB_ARGS: '--data-checksums'
      # Uncomment the DB_STORAGE_TYPE: 'HDD' var if your database isn't stored on SSDs
      DB_STORAGE_TYPE: 'HDD'  #uncommented
    volumes:
      - /mnt/pve1_bulk/appdata/immich/database:/var/lib/postgresql/data
    restart: unless-stopped

volumes:
  model-cache:
 
Last edited:
I just quickly zipped through the YouTube video. He installs Docker directly on PVE. Please don't do that. It's not a good idea from a security standpoint, and it could destroy your PVE. Docker on PVE is not supported in any way.

Instead, use a virtual machine (KVM, not LXC). Docker works great with that.
 
I just quickly zipped through the YouTube video. He installs Docker directly on PVE. Please don't do that. It's not a good idea from a security standpoint, and it could destroy your PVE. Docker on PVE is not supported in any way.

Instead, use a virtual machine (KVM, not LXC). Docker works great with that.
Sweet. Thanks for the info. How do you remove something like that?
 
Sweet. Thanks for the info. How do you remove something like that?

To do this, you need to know exactly what the script does and then uninstall/delete the items manually. A clean reinstallation of Proxmox VE might be the better and faster option...
 
  • Like
Reactions: Johannes S
Thank you all for the replies. Before I jump into reinstalling a clean slate, please review the following. I compiled an in-order list of all scripts and files I used in order to tailor that tutorial to my needs. If anyone has time, please let me know if I can just undo what I did:

curl -faSL https://tailscale.com/install.sh | sh
tailscale up
tailscale up --ssh
sudo tailscale serve --bg https://+insecure://localhost:8006
curl -fsSL https://get.docker.com | sh
docker run --rm -it hello-world

Next is what I tried to tailor based on my ZFS allocation which I thought was my ZSF pool I named {pve1_bulk}:
mkdir -p /mnt/pve1_bulk/appdata/immich/ts-config
mkdir -p /mnt/pve1_bulk/appdata/immich/ts-state
mkdir -p /mnt/pve1_bulk/data/photos/upload

Next was creating a .json file:
sudo nano /mnt/pve1_bulk/appdata/immich/ts-config/immich.json
The .json file consists of the following:
Code:
{
    "TCP": {
      "443": {
        "HTTPS": true
      }
    },
    "Web": {
      "${TS_CERT_DOMAIN}:443": {
        "Handlers": {
          "/": {
            "Proxy": "http://127.0.0.1:2283"
          }
        }
      }
    },
    "AllowFunnel": {
      "${TS_CERT_DOMAIN}:443": false
    }
  }

Next was creating a .yaml file:
sudo nano /mnt/pve1_bulk/appdata/immich/compose.yaml
The .yaml file consists of the following:
Code:
services:
  immich-ts:
    image: tailscale/tailscale:latest
    hostname: immich
    environment:
      - TS_AUTHKEY={MY-KEY}
      - TS_STATE_DIR=/var/lib/tailscale
      - TS_SERVE_CONFIG=/config/immich.json
      - TS_USERSPACE=true
    volumes:
      - /mnt/pve1_bulk/appdata/immich/ts-config:/config
      - /mnt/pve1_bulk/appdata/immich/ts-state:/var/lib/tailscale
    restart: unless-stopped
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:release
    # extends:
    #   file: hwaccel.transcoding.yml
    #   service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
    volumes:
      - /mnt/pve1_bulk/data/photos/upload:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    network_mode: service:immich-ts
    # ports:
    #   - '2283:2283'
    environment:
      DB_HOSTNAME: immich-database
      DB_PASSWORD: ***
      DB_USERNAME: ***
      DB_DATABASE_NAME: immich
      REDIS_HOSTNAME: immich-redis
    depends_on:
      - immich-redis
      - immich-database
  restart: unless-stopped
    healthcheck:
      disable: false

  immich-machine-learning:
    container_name: immich_machine_learning
    # For hardware acceleration, add one of -[armnn, cuda, rocm, openvino, rknn] to the image tag.
    # Example tag: ${IMMICH_VERSION:-release}-cuda
    image: ghcr.io/immich-app/immich-machine-learning:release
    # extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardwar>
    #   file: hwaccel.ml.yml
    #   service: cpu # set to one of [armnn, cuda, rocm, openvino, openvino-wsl, rknn] for accelerated inference
    volumes:
      - model-cache:/cache
    restart: unless-stopped
    healthcheck:
      disable: false

  immich-redis:
    container_name: immich_redis
    image: docker.io/valkey/valkey:8-bookworm@sha256:ff21bc0f8194dc9c105b769aeabf9585fea6a8ed649c0781caeac5cb3c2478>
    healthcheck:
      test: redis-cli ping || exit 1
    restart: unless-stopped

  immich-database:
    container_name: immich_postgres
    image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0-pgvectors0.2.0@sha256:fa4f6e0971f454cd95fec5a9aaed2ed93d>
    environment:
      POSTGRES_PASSWORD: ***
      POSTGRES_USER: ***
      POSTGRES_DB: immich
      POSTGRES_INITDB_ARGS: '--data-checksums'
      # Uncomment the DB_STORAGE_TYPE: 'HDD' var if your database isn't stored on SSDs
      DB_STORAGE_TYPE: 'HDD'  #uncommented
    volumes:
      - /mnt/pve1_bulk/appdata/immich/database:/var/lib/postgresql/data
    restart: unless-stopped

volumes:
  model-cache:

Next was pulling Docker:
docker compose pull
docker compose up -d


And that was that. It all worked perfectly, except for the fact that it was actually saving to the wrong disk, and the fact that I guess I should not have done this in the first place lol. So ya..any help to undo those things would be helpful if possible! Thanks.