Wiki > Silo
Silo is a media server for films, series, music, audiobooks, ebooks, podcasts and manga. Besides its own web app, it speaks the Jellyfin API, so Jellyfin and Emby client apps such as Findroid, Infuse and VidHub can connect to it.
This article runs the official container image with rootless Podman. The container includes its own PostgreSQL database and FFmpeg. Silo is pre-release software: its settings and database may change between builds.
18102 and 19051 were randomly generated for this article; you may use any 5-digit port between 10000 and 32767. 18102 is the web app, 19051 is for Jellyfin-compatible apps.
Create your admin account in step 9 as soon as you've added the Managed Link. Until an admin exists, anyone who can reach Silo can finish the setup and take it over.
Installation
-
Connect to your slot via SSH.
-
Create the folders for Silo and its data:
mkdir -p ~/silo/config ~/silo/transcode -
Create the file holding Silo's secret key. Silo encrypts stored passwords and API keys with it, so keep a copy of
~/silo/.envsomewhere safe: if it's lost, those can't be recovered.echo "SECRET_KEY=$(openssl rand -base64 48)" > ~/silo/.env && chmod 600 ~/silo/.env -
Create the Compose file:
nano ~/silo/compose.yaml -
Paste in the following. Change
TZto your time zone:services: silo: image: ghcr.io/silo-server/silo-server:latest container_name: silo restart: unless-stopped env_file: - .env ports: - "127.0.0.1:18102:8080" - "127.0.0.1:19051:8096" volumes: - /home/user/silo/config:/config - /home/user/silo/transcode:/tmp/silo-transcode - /home/user/files:/mnt/media:ro shm_size: 1g environment: - TZ=America/Toronto userns_mode: "keep-id:uid=911,gid=911"Save with
Ctrl + Sand exit withCtrl + X.Your
~/filesfolder appears inside Silo as/mnt/media, read-only. Theuserns_modeline runs Silo as your own account so it can read your files.127.0.0.1keeps Silo reachable only through Managed Links. -
Start Silo:
cd ~/silo && podman-compose up -d -
The first start downloads the image and sets up the database, which takes a minute or two. Silo is ready when this prints
200:curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:18102/api/v1/readyIf it prints
000or503, wait a little and run it again. You can read the startup log withpodman logs silo. -
On the Manage Links page, click Add a custom app. Name it
silo, enter port18102, and open Advanced options to enable WebSockets. -
Immediately visit https://silo.example.box.ca and complete the setup: anyone who opens the link before you can create the admin account and take over Silo.
- Account: create the admin account with a unique password (do not reuse your Whatbox password).
- Server: set Public URL to
https://silo.example.box.ca. Leave Trusted proxies blank. - Playback: turn off Allow 4K transcoding.
- Storage: keep Automatic.
- Libraries: add your first library from a folder under
/mnt/media. Browse lists your~/filesfolders. Each folder can only belong to one library. - Connect apps: if you'll use Jellyfin or Emby apps, set the address to
https://silo-jf.example.box.ca(step 10). - Done: click Start using Silo to finish.
-
(Optional) For Jellyfin and Emby apps, add a second custom app named
silo-jfwith port19051, also with WebSockets enabled.
Configuration
Configure Silo from its web interface; libraries, users and metadata providers are all set there. See the Silo documentation for each page.
- Libraries: your media is under
/mnt/media, so~/files/Moviesis/mnt/media/Movies. - Jellyfin and Emby apps: add a server with the address
https://silo-jf.example.box.caand your Silo username and password. - Transcoding: hardware transcoding isn't available on Whatbox. Direct play where your apps allow it, and keep in mind every stream counts toward your slot's traffic.
- Other users: add accounts in the admin settings.
Files in the config folder
Silo's database, cache and metadata are kept in ~/silo/config. The database folders belong to the container's own users, so your account can't read, change or delete them directly. Prefix commands with podman unshare to work with them, for example:
podman unshare du -sh ~/silo/config
Automatically Restart (optional)
Rootless containers don't start again by themselves after the server reboots. This script starts Silo if it isn't running.
-
Create a restart script:
touch ~/silo_restart.cron nano -w ~/silo_restart.cron -
Paste in the following:
#!/bin/bash if [ -n "$(podman ps -q --filter name='^silo$' --filter status=running)" ] then echo "Silo is running." else echo "Silo is not running, starting Silo" podman start silo fi exitSave and exit.
-
Make the script executable:
chmod +x ~/silo_restart.cron -
Open your crontab:
EDITOR=nano crontab -e -
Add these lines, then save and exit:
@reboot /home/user/silo_restart.cron >/dev/null 2>&1 */5 * * * * /home/user/silo_restart.cron >/dev/null 2>&1
Direct Access without HTTPS (optional)
Silo can also be reached over plain HTTP, without Managed Links. Only do this after your admin account exists.
-
Open the ports and recreate the container:
sed -i 's|"127.0.0.1:18102:8080"|"18102:8080"|; s|"127.0.0.1:19051:8096"|"19051:8096"|' ~/silo/compose.yaml cd ~/silo && podman-compose down && podman-compose up -d -
Visit http://server.whatbox.ca:18102. Jellyfin and Emby apps use
http://server.whatbox.ca:19051.
To make Silo reachable only through Managed Links again:
sed -i 's|"18102:8080"|"127.0.0.1:18102:8080"|; s|"19051:8096"|"127.0.0.1:19051:8096"|' ~/silo/compose.yaml
cd ~/silo && podman-compose down && podman-compose up -d
Updating
Silo upgrades its database automatically the first time a new build starts, and older builds can't open an upgraded database. Don't stop Silo while it's doing this.
-
Make a copy of your data while Silo is stopped:
cd ~/silo && podman-compose down podman unshare tar czf ~/silo-backup.tar.gz -C ~/silo config .env -
If you set up the restart script, comment out its two lines in your crontab (
EDITOR=nano crontab -e) so it doesn't start Silo mid-update. -
Download the new image and start Silo again:
cd ~/silo podman-compose pull podman-compose up -d -
Wait until the
curlcommand from step 7 of Installation prints200, then uncomment the crontab lines. Once everything works, you can delete~/silo-backup.tar.gz.
Uninstalling
This deletes your libraries, users and watch history. Your media in ~/files isn't touched.
-
Remove the two
silo_restart.cronlines from your crontab (EDITOR=nano crontab -e). -
Stop and remove the container, then delete Silo's files:
cd ~/silo && podman-compose down && cd ~ podman unshare rm -rf ~/silo rm -f ~/silo_restart.cron podman rmi ghcr.io/silo-server/silo-server:latest -
Delete the
siloandsilo-jflinks from the Manage Links page.
Troubleshooting
- Silo doesn't start and the log mentions
SECRET_KEY: check that~/silo/.envexists and has aSECRET_KEY=line from step 3 of Installation. - Libraries stay empty, or
podman logs silosaysuid 911 cannot read /mnt/media: check theuserns_modeline incompose.yamlmatches step 5 exactly, then runpodman-compose downandpodman-compose up -dfrom~/silo. Don't setPUID=0: Silo refuses to start with it. - https://silo.example.box.ca doesn't load: check Silo is running (the
curlcommand from step 7 of Installation prints200) and the Managed Link uses port 18102 with WebSockets enabled. - The page doesn't load at http://server.whatbox.ca:18102: check the
ports:lines incompose.yaml. They must start with"18102:for direct access;"127.0.0.1:18102:only allows Managed Links. - Jellyfin apps can't connect: use the
silo-jflink (or the 19051 address), not the web app's. - "Permission denied" when reading or deleting files in
~/silo/config: the database folders belong to the container's users. Prefix the command withpodman unshare. - The restart script starts a second copy, or never starts Silo: check the
podman psline insilo_restart.cronmatches the one above exactly, including'^silo$'. - Containers won't stop or start: run
podman-compose downfrom~/silo, thenpodman-compose up -d. - Anything else: read
podman logs silo, see the Silo documentation, or ask through the community links on Silo's website.