Installation
Docker
Run the Fliks server and its database with Docker Compose, the recommended way to self-host it.
What you get#
The published image is a single container: the NestJS backend, the built Angular web client
served as static assets, and a self-contained FFmpeg build with hardware-acceleration support
baked in. A separate PostgreSQL container holds the database. It runs on linux/amd64 and
linux/arm64.
Prerequisites#
- Docker with the Compose plugin (the
docker composecommand). - A folder with your video files, reachable from wherever Docker runs.
Set it up#
Download the example Compose file and rename it:
curl -LO https://raw.githubusercontent.com/fliks-app/fliks/main/docker-compose.example.yml
mv docker-compose.example.yml docker-compose.ymlOpen docker-compose.yml and set three things:
POSTGRES_PASSWORDandDB_PASSWORD: replacechangemewith the same real password in both places.- The media volume:
/path/to/your/media:/mediason the left of the colon is your folder, the right side (/medias) is what you'll type when adding a library in the UI. - The host port, only if
4848is already taken: change the left side of'4848:4848'underports:(for example'8080:4848'). LeavePORTalone; it's the port inside the container.
Then start it:
docker compose up -dPin a specific release instead of :latest by editing the image tag; see the
package page for available tags.
docker compose up -d after changing it pulls the new image and recreates the container.
Volumes#
| Volume | Contents |
|---|---|
/medias |
Your library root(s). Read-only is enough to browse and play; downloads, deleting media and saving subtitles next to a video need write access. |
/downloads |
Only needed if you install the download plugin; use the same path here and in your download client. |
/app/conf |
The JWT signing key. Lose it and every session is invalidated. |
/app/data |
Artwork, uploaded avatars, database backups, and a regenerable cache/ subfolder. Not disposable: avatars can't be re-fetched. |
/app/transcode |
The HLS segment cache. Regenerable, safe to wipe. Paired with FLIKS_TRANSCODE_DIR; drop both and the cache lands in the container's /tmp. |
Running as a specific user#
Some platforms pin the container to a non-root uid: the TrueNAS catalog uses 568, Unraid uses
99:100, Kubernetes' runAsNonRoot and OpenShift's arbitrary uid policy pick their own. The
image's /app/conf, /app/data and /app/transcode are group-writable by root (g=u), so any
uid works as long as group 0 is in its group list:
services:
fliks:
user: '568:568'
group_add: ['0']Chromecast on a bridge network#
The default bridge network works for casting. The device you cast from (a browser, the phone app, the desktop app) finds the Chromecast itself; the server takes no part in discovery. What the Chromecast does need is to reach the server directly, at the address Fliks hands it: set Public address under Settings > General if that address isn't the one the Chromecast can reach (see Reverse proxy).
Memory on a small box#
Node sizes its heap from the container's cgroup memory limit; with no limit set, it assumes the whole host and reserves around 4 GB, leaving little for the FFmpeg processes a library scan runs alongside. On a small NAS or single-board computer, set a limit:
services:
fliks:
mem_limit: 4gHardware transcoding#
See Hardware acceleration for the devices and environment
variables each vendor needs (Intel QSV/VAAPI, NVIDIA NVENC, AMD through VAAPI). The Intel and
NVIDIA stacks are amd64-only; on arm64 (a Raspberry Pi 5, an ARM NAS) transcodes fall back
to CPU.
First run#
Continue with the Quick start: open http://<host>:4848, log in
with the default account, and add your first library.