repo cleanup: retire legacy mule-image stack, lock PhotoPrism UI to loopback

Delete the old Python+React mule-image stack (backend/, frontend/,
docker-compose.yml, mulita.yml, .env*) plus the one-shot migration and
sample dirs (migrate/, photos-sample/, photovault-app-prompt.md). Only
the PhotoPrism + Go sidecar + SvelteKit web stack remains, so drop the
".photoprism." qualifier from the compose+env filenames.

Bind PhotoPrism's port to 127.0.0.1 so the user-facing surface is just
the SvelteKit web/ app; admin reaches PP's UI via SSH tunnel. Flatten
PHOTOPRISM_INDEX_WORKERS' nested default (podman-compose's interpolator
doesn't expand ${A:-${B:-…}}). Rewrite README for the current stack.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-19 23:30:38 +02:00
parent 155e9bb126
commit 9bba097d91
200 changed files with 368 additions and 39840 deletions

34
docker-compose.podman.yml Normal file
View File

@@ -0,0 +1,34 @@
# Podman-rootless overlay for the PhotoPrism stack.
#
# Apply alongside the base compose file:
# podman-compose --env-file .env \
# -f docker-compose.yml \
# -f docker-compose.podman.yml \
# up -d
#
# Adds the podman-specific bits that would break a vanilla docker compose run:
# - userns_mode: keep-id maps container UID to the invoking host UID, so
# PhotoPrism (running as PP_UID:PP_GID inside) can actually read the
# bind-mounted originals volume on the host (which is owned by the host
# user, not by uid 1000-in-the-container-namespace).
# - the explicit security_opt entries on the base file work in podman as-is.
services:
# MariaDB writes to a named volume managed by podman; its in-container
# `mysql` user expects to own that volume. keep-id breaks this by mapping
# in-container UID 999 to a podman-subuid that doesn't own the volume,
# so let mariadb use the default userns mapping (root-in-namespace).
mariadb:
# No userns_mode override — use podman defaults.
init: true
# PhotoPrism does need keep-id, so its container UID maps back to the
# host UID that owns the bind-mounted originals/.
photoprism:
userns_mode: keep-id
# Sidecar mutates the originals tree (rename / folder ops / heap
# convert / .duplicates archive) — same keep-id mapping so its writes
# land as the host user, not as a podman-subuid the host doesn't own.
sidecar:
userns_mode: keep-id