Whatbox Logo
Login for certain variables to be updated with your slot's information

Wiki > Silo

Whatbox has limited support for containers; they may stop working at any time.

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

  1. Connect to your slot via SSH.

  2. Create the folders for Silo and its data:

     mkdir -p ~/silo/config ~/silo/transcode
    
  3. Create the file holding Silo's secret key. Silo encrypts stored passwords and API keys with it, so keep a copy of ~/silo/.env somewhere safe: if it's lost, those can't be recovered.

     echo "SECRET_KEY=$(openssl rand -base64 48)" > ~/silo/.env && chmod 600 ~/silo/.env
    
  4. Create the Compose file:

     nano ~/silo/compose.yaml
    
  5. Paste in the following. Change TZ to 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 + S and exit with Ctrl + X.

    Your ~/files folder appears inside Silo as /mnt/media, read-only. The userns_mode line runs Silo as your own account so it can read your files. 127.0.0.1 keeps Silo reachable only through Managed Links.

  6. Start Silo:

     cd ~/silo && podman-compose up -d
    
  7. 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/ready
    

    If it prints 000 or 503, wait a little and run it again. You can read the startup log with podman logs silo.

  8. On the Manage Links page, click Add a custom app. Name it silo, enter port 18102, and open Advanced options to enable WebSockets.

  9. 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 ~/files folders. 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.
  10. (Optional) For Jellyfin and Emby apps, add a second custom app named silo-jf with port 19051, 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/Movies is /mnt/media/Movies.
  • Jellyfin and Emby apps: add a server with the address https://silo-jf.example.box.ca and 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.

  1. Create a restart script:

     touch ~/silo_restart.cron
     nano -w ~/silo_restart.cron
    
  2. 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
     exit
    

    Save and exit.

  3. Make the script executable:

     chmod +x ~/silo_restart.cron
    
  4. Open your crontab:

     EDITOR=nano crontab -e
    
  5. 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.

  1. 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
    
  2. 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.

  1. 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
    
  2. 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.

  3. Download the new image and start Silo again:

     cd ~/silo
     podman-compose pull
     podman-compose up -d
    
  4. Wait until the curl command from step 7 of Installation prints 200, 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.

  1. Remove the two silo_restart.cron lines from your crontab (EDITOR=nano crontab -e).

  2. 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
    
  3. Delete the silo and silo-jf links from the Manage Links page.

Troubleshooting

  • Silo doesn't start and the log mentions SECRET_KEY: check that ~/silo/.env exists and has a SECRET_KEY= line from step 3 of Installation.
  • Libraries stay empty, or podman logs silo says uid 911 cannot read /mnt/media: check the userns_mode line in compose.yaml matches step 5 exactly, then run podman-compose down and podman-compose up -d from ~/silo. Don't set PUID=0: Silo refuses to start with it.
  • https://silo.example.box.ca doesn't load: check Silo is running (the curl command from step 7 of Installation prints 200) 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 in compose.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-jf link (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 with podman unshare.
  • The restart script starts a second copy, or never starts Silo: check the podman ps line in silo_restart.cron matches the one above exactly, including '^silo$'.
  • Containers won't stop or start: run podman-compose down from ~/silo, then podman-compose up -d.
  • Anything else: read podman logs silo, see the Silo documentation, or ask through the community links on Silo's website.