This is a set of unit files to deploy immich through the podman-quadlet systemd generator
See the documentation This is adapted from immich provided docker-compose file, this will create a podman pod hosting all thc containers.
This setup consist in:
immich.pod
file defining a pod that will host all the containers.immich-server.image
defining the immich version.- several
immich-*.container
files defining the containers, volumes etc.. - Systemd activation socket,
immich-proxy.socket
, this provides a way to access immich from outside the pod. Otherwise all the containers in this setup have no network access.
The .container
files are translated into systemd units that create the containers.
Note how the immich-server.container
have an install target on default.target
which makes it start on boot.
Rename env.example
to immich.env
. Populate the values as needed.
Copy theses files into /etc/containers/systemd
then reload systemd. Copy the .socket file to
/etc/systemd/system
.
It can be a subdirectory. e.g :
sudo cp -r . /etc/containers/systemd/immich
sudo cp immich-proxy.socket /etc/systemd/system
sudo systemctl daemon-reload
Create a user that will run immich containers. The containers will act as this user on the host:
- This user will be used when enforcing file permissions in the mounted volumes.
- When immich creates files in the mounted volumes, they will be owned by this user on the host.
useradd -r -m -d /var/lib/immich immich
The containers and named volumes will be stored in /var/lib/immich
.
Configure subuid
and subgid
for podman to be able to run as this user:
cat >> /etc/subuid <<EOF
immich:2000000:1000000
EOF
cat >> /etc/subgid <<EOF
immich:2000000:1000000
EOF
Copy immich-proxy.socket to ~immich/.config/systemd/user
.
Copy the remaining files into the user's containers/systemd
directory:
sudo -u immich mkdir -p ~immich/.config/containers/systemd/immich
sudo -u immich cp -v *.image *.container *.pod immich.env ~immich/.config/containers/systemd/immich/
sudo -u immich mkdir -p ~immich/.config/systemd/user
sudo -u immich cp -v *.image *.socket ~immich/.config/systemd/user/
Start the user session, make it persistent and start the pod:
systemctl start user@$(id -u immich)
loginctl enable-linger immich
systemctl --user -M immich@.host start immich-pod.service
Watch journalctl
to see if the containers start successfully -
the first start can fail if downloading the images takes more than the default startup timeout:
journalctl -f
The containers should start on the next boot automatically.
The database_backup
folder suggests a way to dump the database regularly. Make sure to add a volume mount to the
database container and bind it to /var/db_backup
As is, the unit will create gziped SQL dumps named with the date of creation: YYYYMMDD
.
To enable it, place the files in /etc/systemd/system
then enable the timer: systemctl enable --now immich-database-backup.timer
.
- write a makefile or a justfile that insert the variables in the unit files maybe ? Right now it requires some copy and pasting.
- Contribute it upstream to immich : no longer a goal, they stated they are not interested.