Sure, I set it up in nixos though this is the short form of that:
spoiler
Install Podman and passt + slirp4netns for networking
Setup subuid and subgid usermod --add-subuids 100000-165535 --add-subgids 100000-165535 johndoe
I’m using quadlet’s so we need to create those:
$HOME/.config/containers/systemd/immich-database.container
[Unit]Description=Immich Database
Requires=immich-redis.service immich-network.service
[Container]AutoUpdate=registry
EnvironmentFile=${immich-config}# add your environment variables file hereImage=registry.hub.docker.com/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0 # hash from the official docker-compose, has to be updated from time to timeLabel=registry
Pull=newer # update to newest image, though this image is specified by hash and will never update to another version unless the hash is changedNetwork=immich.network # attach to the podman networkUserNS=keep-id:uid=999,gid=999# This makes uid 999 and gid 999 map to the user running the service, this is so that you can access the files in the volume without any special handling otherwise root would map to your uid and the uid 999 would map to some very high uid that you can't access without podman - This modifies the image at runtime and may make the systemd service timeout, maybe increase the timeout on low-powered machines Volume=/srv/services/immich/database:/var/lib/postgresql/data # Database persistanceVolume=/etc/localtime:/etc/localtime:ro # timezone infoExec=postgres -c shared_preload_libraries=vectors.so -c 'search_path="$user", public, vectors' -c logging_collector=on -c max_wal_size=2GB -c shared_buffers=512MB -c wal_compression=on# also part of official docker-compose.....last time i checked anyways[Service]Restart=always
[Unit]Description=Immich Server
Requires=immich-redis.service immich-database.service immich-network.service immich-ml.service
[Container]AutoUpdate=registry
EnvironmentFile=${immich-config}#same config as aboveImage=ghcr.io/immich-app/immich-server:release
Label=registry
Pull=newer # auto update on startupNetwork=immich.network
PublishPort=127.0.0.1:2283:2283Volume=/srv/services/immich/upload:/usr/src/app/upload # i think you can put images here to import, though i never used itVolume=/etc/localtime:/etc/localtime:ro # timezone infoVolume=/srv/services/immich/library:/imageLibrary # here the images are stored once imported[Service]Restart=always
[Install]WantedBy=multi-user.target default.target
Still requires docker?
Not on NixOS!
services.immich.enable = true;
Yeah. I’m also waiting for a native Ubuntu package, I don’t want to deal with Docker.
If you’re using Arch, the AUR package works well
I’m fully aware of the joy of containers, but I just don’t want all that extra faff
Extra faff?
The additional software required to run it in a container plus its configuration, on top of Immich’s configuration.
Just install & configure Immich, done.
Thats… Just… Docker compose… You copy, paste, docker-compose up and you’re done…
I’m planning to do it with podman. It’s supposed to be quite easy to convert between the two.
Can confirm, works without problems in rootless podman.
Can you give me some pointers? I’m still new to docker and podman; hoping to get this going without too much learning curve to start with!
Sure, I set it up in nixos though this is the short form of that:
spoiler
usermod --add-subuids 100000-165535 --add-subgids 100000-165535 johndoe
[Unit] Description=Immich Database Requires=immich-redis.service immich-network.service [Container] AutoUpdate=registry EnvironmentFile=${immich-config} # add your environment variables file here Image=registry.hub.docker.com/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0 # hash from the official docker-compose, has to be updated from time to time Label=registry Pull=newer # update to newest image, though this image is specified by hash and will never update to another version unless the hash is changed Network=immich.network # attach to the podman network UserNS=keep-id:uid=999,gid=999 # This makes uid 999 and gid 999 map to the user running the service, this is so that you can access the files in the volume without any special handling otherwise root would map to your uid and the uid 999 would map to some very high uid that you can't access without podman - This modifies the image at runtime and may make the systemd service timeout, maybe increase the timeout on low-powered machines Volume=/srv/services/immich/database:/var/lib/postgresql/data # Database persistance Volume=/etc/localtime:/etc/localtime:ro # timezone info Exec=postgres -c shared_preload_libraries=vectors.so -c 'search_path="$user", public, vectors' -c logging_collector=on -c max_wal_size=2GB -c shared_buffers=512MB -c wal_compression=on # also part of official docker-compose.....last time i checked anyways [Service] Restart=always
$HOME/.config/containers/systemd/immich-ml.container
[Unit] Description=Immich Machine Learning Requires=immich-redis.service immich-database.service immich-network.service [Container] AutoUpdate=registry EnvironmentFile=${immich-config} #same config as above Image=ghcr.io/immich-app/immich-machine-learning:release Label=registry Pull=newer # auto update on startup Network=immich.network Volume=/srv/services/immich/ml-cache:/cache # machine learning cache Volume=/etc/localtime:/etc/localtime:ro [Service] Restart=always
$HOME/.config/containers/systemd/immich.network
[Unit] Description=Immich network [Network] DNS=8.8.8.8 Label=app=immich $HOME/.config/containers/systemd/immich-redis.container [Unit] Description=Immich Redis Requires=immich-network.service [Container] AutoUpdate=registry Image=registry.hub.docker.com/library/redis:6.2-alpine@sha256:eaba718fecd1196d88533de7ba49bf903ad33664a92debb24660a922ecd9cac8 # should probably change this to valkey.... Label=registry Pull=newer # auto update on startup Network=immich.network Timezone=Europe/Berlin [Service] Restart=always
$HOME/.config/containers/systemd/immich-server.container
[Unit] Description=Immich Server Requires=immich-redis.service immich-database.service immich-network.service immich-ml.service [Container] AutoUpdate=registry EnvironmentFile=${immich-config} #same config as above Image=ghcr.io/immich-app/immich-server:release Label=registry Pull=newer # auto update on startup Network=immich.network PublishPort=127.0.0.1:2283:2283 Volume=/srv/services/immich/upload:/usr/src/app/upload # i think you can put images here to import, though i never used it Volume=/etc/localtime:/etc/localtime:ro # timezone info Volume=/srv/services/immich/library:/imageLibrary # here the images are stored once imported [Service] Restart=always [Install] WantedBy=multi-user.target default.target
loginctl enable-linger $USER
Docker to rootful podman is easy. Docker to rootless podman can get annoying due to the file permissions and slightly more limited networking