Files
homelab-gitops/apps/copyparty

Komposthaufen file browser

Copyparty replaces arschrock's host Apache directory listing at https://brunner.ninja/komposthaufen/. The maintained community chart from https://github.com/erNail/copyparty-chart owns the Deployment, configuration, Service, ServiceAccount and index PVC. No separate homelab chart repository or image build is needed. bootstrap/copyparty.yaml pins the published chart. The temporary primary-image tag override in values.yaml follows the root policy for a latest chart that trails its application. Remove it when the chart catches up; keep its official image repository unchanged.

Anonymous users receive only r (read/list/download) permission. No account has upload, move, delete or admin permission. The supported HTML-head hook hides upload controls and the upload-shaped local-file hash search panel; normal filename/path search remains available. This CSS is presentation only; permissions and the filesystem mount enforce read-only access. The non-root container also mounts /komposthaufen recursively read-only. Symlinks cannot escape the exported volume. HTML is served as text and embedded directory prologues are disabled. The Traefik-owned route keeps its name but moves from default to copyparty to avoid enabling cross-namespace routing globally. It preserves the URL prefix; Copyparty's rp-loc handles it. Direct downloads, HEAD and HTTP byte ranges retain their normal URL shape.

The writable RBD PVC contains rebuildable SQLite search indexes, thumbnails and session state. Indexing scans on startup and hourly; file contents are not hashed and media tag extraction is not enabled. Search covers path/name, size and date. The authoritative files stay on the existing bcachefs bind mount; nothing is copied, renamed, chowned or deleted. The current backup owner in apps/backup does not cover this host library. The library has an existing backup coverage gap. The disposable index needs no historical backup: recreate it and let Copyparty rescan. Preserve the host data independently; Ceph replication and its existing backup mirrors are not historical backups of this library.

Host storage maintenance

../../scripts/media-storage-{offline,online}.sh are the shared Plex, Jellyfin, Copyparty and Paper maintenance helpers. The existing scripts at ~/kubernetes/media-storage-{offline,online}.sh on arschrock forward to these versioned helpers. ~/unmount.sh --stop uses bcachefs-maintenance.py to cordon, stop filesystem holders, invoke the offline helper and verify mount namespaces before unmounting. ~/mount_binds.sh restores and checks the bind mounts, calls the online helper to recreate consumers and restore the storage-ready labels, and restores scheduling. Copyparty uses the same component selector as Plex and Jellyfin. Never tolerate the unschedulable taint or bypass the ready label.

After changing GitOps, update arschrock's checkout before storage maintenance: git -C ~/kubernetes/homelab-gitops pull --ff-only.

The chart has readiness/liveness hooks but no startup-probe template; liveness has a startup grace period and does not wait for the background index scan. Configuration changes require a Deployment restart because this chart does not hash its ConfigMap into the pod template.

Recovery and legacy Apache

Reconcile the Argo Application and its retained PVC to recover the service. For an index-only failure, stop Copyparty before rebuilding its disposable index; never remove anything under /komposthaufen to repair search. Apache's host unit is httpd.service; it is disabled/stopped after cutover. Its configuration remains intact, but currently has a missing hiredis library required by mod_auth_openidc. An Apache rollback would first require repairing that dependency, then enabling the service and reverting only the komposthaufen route to legacy-apache-service. The youtube.brunner.ninja route is intentionally retained for a separate migration and remains unavailable while Apache is off. No old dedicated source repository exists for this host Apache service; remote repository archival is not applicable.