Skip to content

Install Silo Server

Silo is in active development before 1.0. These guides are updated frequently.

Set up a new server, add a small movie or series library, and play your first item in the browser. This walkthrough uses Docker Compose on Linux.

  • A Linux x86-64 or arm64 host with permission to run Docker containers.
  • A folder of media files the host can read. Start with a few familiar files.
  • Persistent disk space for the database, artwork, and temporary transcodes.
  • A browser on the same network.
  • Internet access on the host. Silo downloads its default metadata plugins on first start, and scans use them to find posters and descriptions.

You do not need a GPU to start, but converting video can put heavy load on the CPU. For hardware and storage choices, see Requirements and installation options.

Install Docker Engine and the Compose plugin. Use Compose 2.24 or newer; docker compose version shows yours. Silo’s image includes FFmpeg, PostgreSQL, and Redis, so the whole server runs in one container.

Run these commands in a directory where silo does not already exist:

Terminal window
mkdir silo && cd silo
touch .env && chmod 600 .env

Create docker-compose.yml in the new directory with this content:

services:
silo:
image: ${SILO_OMNIBUS_IMAGE:-ghcr.io/silo-server/silo-server:latest}
restart: unless-stopped
stop_grace_period: 2m
cap_add: [NET_ADMIN]
env_file: .env
environment:
PORT: "8080"
JF_PORT: "8096"
ABS_PORT: "13378"
ENABLE_REDIS: ${ENABLE_REDIS:-true}
ports:
- "${PORT:-8090}:8080"
- "${JF_PORT:-8096}:8096"
- "${ABS_PORT:-13378}:13378"
volumes:
- ${SILO_DATA_ROOT:-/opt/silo}/config:/config
- ${MEDIA_ROOT:?Set MEDIA_ROOT in .env}:${MEDIA_CONTAINER_ROOT:-/mnt/media}:ro
- ${SILO_DATA_ROOT:-/opt/silo}/transcode:/tmp/silo-transcode
- ${SILO_DATA_ROOT:-/opt/silo}/download-artifacts:/tmp/silo-download-artifacts
# Intel or AMD GPU: remove the "# " from the two lines below.
# devices:
# - /dev/dri:/dev/dri

The PORT, JF_PORT, and ABS_PORT lines keep Silo’s ports inside the container fixed, so a value in .env changes only the port on the host. If ls /dev/dri on the host lists a render device, such as renderD128, you can uncomment the devices lines now and turn on acceleration later, as in Set up transcoding. If you use an NVIDIA GPU, add the NVIDIA lines from Give the container access to your GPU instead, after installing the NVIDIA Container Toolkit. The server repository’s docker-compose.yml is the same file with more options, commented out, for GPUs and transcode nodes. You can download it instead. The Docker reference explains each line.

Generate a secret key:

Terminal window
openssl rand -base64 48

Open .env in a text editor and add these lines, with the key in place of the example:

SECRET_KEY=replace-with-the-generated-key
MEDIA_ROOT=/srv/media
SILO_DATA_ROOT=/opt/silo
PUID=1000
PGID=1000
TZ=Etc/UTC
  • SECRET_KEY encrypts what Silo stores in its database, such as API keys for other services, storage keys, and the key that keeps people signed in.
  • MEDIA_ROOT is the host directory containing your media. Silo sees it at /mnt/media, so /srv/media/movies on the host becomes /mnt/media/movies in Silo. The mount is read-only, so Silo cannot alter your media through it.
  • SILO_DATA_ROOT holds the database, artwork, and temporary transcodes. Use /opt/silo only if it is not already used by another installation, and choose a disk with space for all three in addition to your media.
  • PUID and PGID are the account Silo runs as. Use an account that can read your media; id -u and id -g print your own.

From the new silo directory:

Terminal window
docker compose config --quiet
docker compose up -d
docker compose ps

The first command should finish without an error. docker compose ps lists silo with a health status. It shows starting until Silo’s web server answers, then healthy. The first start creates the database, which can take a while, and Silo can show unhealthy until it finishes. Run docker compose logs -f silo to watch progress, and don’t restart it while it works. If the log says uid 1000 cannot read /mnt/media/..., set PUID and PGID to an account that can, then run docker compose up -d again.

When Silo is healthy, check that it is ready:

Terminal window
curl --fail http://localhost:8090/api/v1/ready

A ready server returns {"status":"ok"}. For any other answer, see Check server health.

On each start, Silo installs the official TMDB, TVDB, and TheIntroDB plugins from the plugin catalog if they are missing. If the host had no internet access, restart Silo once it does.

Open http://localhost:8090 on the server, or http://SERVER-IP:8090 from another computer on your network. Replace SERVER-IP with the Docker host’s LAN address.

  1. Create the admin account with your username, email, and password. Create your first profile if asked.
  2. Give the server a name. Leave playback settings at their defaults for the first test.
  3. At Storage, leave Automatic selected for a single-host install. With no S3 bucket, it uses local disk. If you want S3, set it up now: after the first scan, changing storage means a storage transition.
  4. At Libraries, enter a name, choose Movies or Series, and add the container path. For example, use /mnt/media/movies. Select Add library, then continue.
  5. Skip subtitle services, app integrations, and other optional features you do not need yet. Finish the wizard.

Open Admin > Libraries to check the scan. If it has not started, use that library’s Scan action. For missing posters or descriptions, check the library’s metadata providers using Add and manage libraries.

Open your library in the web app, choose an item, and select Play. Check that sound works, seek forward, stop, and resume it.

Then connect your usual device using the same server address and repeat the playback check. Use your own account; invite other people with their own accounts later.

Set up backups, check that your copy of SECRET_KEY matches the one in .env, and note your data paths and any external storage. Give each person their own account: your admin password controls the server, not just what you can watch.

Your first setup is complete when playback works. Choose only what you need next:

Your next taskGuide
Invite someoneAccounts and invitations
Add another libraryLibraries
Correct a title or posterMetadata and artwork
Pick up new files on a network shareAutoscan
Reduce CPU load during playbackTranscoding
Use Silo away from homeSecure external access
Investigate a failureServer health

Notifications, AI providers, and remote workers can wait until you need them.

The container includes PostgreSQL with pgvector and tunes it automatically, so you don’t need a postgresql.conf. Search uses PostgreSQL by default; turn on the bundled Meilisearch only if you want a separate search service.