Skip to main content

Install & Run

Prismedia runs as a single container. You provide two mounts:

  • /data for the database, generated assets, cache, plugin state, and the encryption secret.
  • /media for the media folders you want Prismedia to scan.

For an overview of the server, native apps, and optional services, read Before You Install.

Requirements​

  • Docker or Docker Compose.
  • A host folder (or named volume) for persistent /data.
  • One or more readable media folders.
  • Port 8008 available on the host.

Docker run​

docker run -d \
--name prismedia \
-p 8008:8008 \
-v prismedia-data:/data \
-v /path/to/your/media:/media \
ghcr.io/pauljoda/prismedia:latest

Open http://localhost:8008 on the computer running Docker. From another device, use that computer's reachable network address and port instead, such as http://media-server.local:8008. Complete the first-run wizard to create your administrator account.

Docker Compose​

Save the following as compose.yaml. Replace /path/to/your/media with an existing folder on the computer running Docker, then run the command from the directory containing that file. Keep this file for future restarts and updates.

services:
prismedia:
image: ghcr.io/pauljoda/prismedia:latest
ports:
- "8008:8008"
volumes:
- prismedia-data:/data
- /path/to/your/media:/media
restart: unless-stopped

volumes:
prismedia-data:
docker compose up -d

Writable vs read-only media​

Mount /media read-only when Prismedia should only scan and play your files:

volumes:
- /path/to/your/media:/media:ro

Mount the media destination read-write for acquisition imports and for Files operations such as uploads, folder creation, renames, moves, and deletes.

Environment variables​

Most installs need no environment variables. The container generates everything it needs on first boot. Set these only for the cases noted.

VariableDefaultUse
PRISMEDIA_SECRETAuto-generated, persisted to /data/.prismedia-secretEncryption key for plugin credentials (e.g. provider API keys) stored at rest. The container creates and persists one automatically, so it survives container recreation as long as /data persists. Set it explicitly only if you manage the key yourself. Keep the value stable; changing it makes previously encrypted credentials unreadable. See Authentication & User Accounts.
PRISMEDIA_RECOVERY_PASSWORDUnsetLocked out? Set to reset (or create) an enabled administrator's password on boot, sign back in, then unset. See Password recovery.
PRISMEDIA_RECOVERY_USERNAMEadminThe account PRISMEDIA_RECOVERY_PASSWORD resets or creates.
ASPNETCORE_URLShttp://0.0.0.0:8008Override the in-container listen address/port.
PRISMEDIA_HLS_TRANSCODERautoForce a transcoder profile (auto, software, hardware encoders). See HLS Streaming.
PRISMEDIA_VAAPI_DEVICE/dev/dri/renderD128VAAPI render node for hardware transcoding.
note

There is no PUBLIC_ORIGIN variable. When Prismedia runs behind a reverse proxy you configure the proxy, not Prismedia — see Reverse Proxy.

DATABASE_URL, PRISMEDIA_DATA_DIR, and PRISMEDIA_CACHE_DIR are managed by the unified image's entrypoint and point at the embedded PostgreSQL and the /data volume. You only set these when running the API/worker outside the unified image (see Contributing).

User accounts​

The first visit to http://host:8008 shows a setup wizard that creates your administrator account and signs you in — complete it promptly after starting the container. After that, the web app and protected /api/* calls require a per-user session; OPDS readers authenticate with the same account credentials. Add household members and control their library access and NSFW visibility in Settings → Users. See Authentication & User Accounts.

Image tags​

TagMeaning
latestCurrent promoted release. Recommended for normal installs.
release / release-X.Y.ZRelease channel and version-pinned release image.
beta / beta-X.Y.ZManual beta channel image.
alpha / alpha-X.Y.ZManual alpha channel image.
devNewest main build after CI. Expect churn.
sha-<short-sha> / X.Y.Z-<short-sha>Exact dev image for rollback or bisection.

See Upgrading & Rollback for channel and migration details.

What boots inside the container​

ProcessPurpose
PostgreSQL 16Application data and durable job state (local-only, on /data/postgres).
.NET API/api/*, the static Svelte app, native playback and file streaming, HLS assets, migrations.
.NET workerScans, probes, thumbnails, sprites, waveforms, HLS, subtitles, identify, imports. The entrypoint supervises and auto-restarts it.
ffmpegMedia probing, thumbnailing, HLS, subtitle extraction (bundled jellyfin-ffmpeg).

The frontend is prebuilt into static assets and served by the .NET API. Normal installs do not run a separate web development server.

Next steps​

  1. Open Your First Library & Scan.
  2. Add a watched library root under /media.
  3. Run a scan.
  4. Identify & enrich the results.