Self-hosting

Run Sridu yourself

Sridu is a folder of files. You can open it on your own computer, run it for the whole house with Docker, or put it on the internet. Pick the way that suits you below. Each one is explained step by step, no prior knowledge needed.

Just want to play? Then you don’t need any of this. Open play.sridu.com in Chrome or Edge, it is already set up and free.

Already running Sridu? Admin page · Configurator · All settings

Choose your way

Which one is right for me?

  • Just the files One computer with the cameras. Five minutes, no installation apart from a small helper program.
  • Docker at home For every phone, tablet and board in the house or the club room. On a NAS (Synology, Unraid), a Raspberry Pi or a PC. About 15 minutes.
  • Public server Your own Sridu on your own domain, for a club or friends everywhere. Needs Docker, a domain and https in front: a Cloudflare Tunnel at home or a reverse proxy on a rented server. One evening.
  • Web space Cloudflare Pages, Netlify or GitHub Pages. Free and without a server of your own, but without admin page and online leaderboard.
sridu-231.zip Version 231 · 20 MB · the complete app, Docker files included
Download Sridu

Just the files

You play on the computer the cameras are plugged into. The browser needs a small web server for that: opening index.html by double-click does not work, the browser then refuses the cameras.

Windows

  1. Install Python from the Microsoft Store (search for “Python”, take the newest version). It is free and only needed as a small web server.
  2. Download Sridu (sridu-latest.zip) and unzip it: right-click the file, “Extract all”.
  3. Open a terminal in the folder: open the unzipped folder, right-click an empty spot, “Open in Terminal”.
  4. Start the web server with this command and leave the window open:
python -m http.server 8080
  1. Open http://localhost:8080 in Chrome or Edge. Done. To stop, close the terminal window.

macOS

  1. Download Sridu (sridu-latest.zip). Safari unzips it into your Downloads folder by itself.
  2. Open a terminal in the folder: in Finder, right-click the folder, Services, “New Terminal at Folder”.
  3. Start the web server with this command and leave the window open. If macOS offers to install the “command line developer tools”, agree and run the command again afterwards.
python3 -m http.server 8080
  1. Open http://localhost:8080 in Chrome or Edge. Done. To stop, press Ctrl+C in the terminal.

Linux

  1. Open a terminal and download and unzip Sridu:
mkdir -p ~/sridu && cd ~/sridu
wget https://sridu.com/wp-content/themes/sridu/assets/download/sridu-latest.zip
unzip -q sridu-latest.zip && rm sridu-latest.zip
  1. Start the web server and leave the terminal open:
python3 -m http.server 8080
  1. Open http://localhost:8080 in Chrome or Chromium. Done. To stop, press Ctrl+C.

Phones and tablets cannot run Sridu from files, because a browser only hands out the camera and the encryption for online games on https:// or on localhost. They have two easy ways instead. Open play.sridu.com: it is free, installs as an app and keeps working offline once it has loaded. Or let another device in the house host Sridu with Docker, such as a NAS, a Raspberry Pi or a PC, and open it from there.

Docker at home

Docker runs Sridu as a small server. Every device in your network can then open it, phones included, with an admin page, a lobby and a leaderboard. Because it runs on https, each device can also install Sridu as an app. The steps depend on where Docker runs.

For your home network only. In this setup every device shares the players: names, PINs, statistics and every game are kept in /data/players.json on the server, and anyone who can reach this Sridu can read and change that file without logging in. At home that is what you want. Never make this setup reachable from the internet, not with port forwarding, not through a tunnel and not on a rented server. For that, take the Public server tab: it keeps no player data on the server.

Synology

  1. Install Container Manager from the Package Center (DSM 7.2 or newer).
  2. Put Sridu on the NAS: in File Station open the shared folder docker, upload sridu-latest.zip into it, right-click it, “Extract”, “Extract here”. Rename the new folder sridu-… to sridu.
  3. Adjust two settings: open docker-compose.yml with the Text Editor. Put the IP address of your NAS in SRIDU_HOSTS, for example SRIDU_HOSTS: "192.168.1.20". Set PUID: "1026" and PGID: "100". Save.
  4. Create the project: Container Manager, Project, Create. Name sridu, path /volume1/docker/sridu, source “Use existing docker-compose.yml”. Skip the web portal, then Done. The first build takes a few minutes.
  5. Play: on the NAS itself nobody plays, so open https://<NAS IP>:8443 on the board computer and every other device.

Set up the admin page

  1. Open the admin page at http://<NAS IP>:8090/admin/. It only opens from your home network, so use the IP address, not a domain name.
  2. Enter the setup code. It looks like ABCD-EFGH-JKLM. The easiest place to find it: the file SETUP-CODE.txt in the folder server/admin of your Sridu folder. It is also in the log of the container sridu-api: Container Manager, Container, sridu-api, Log.
  3. Choose a password. From now on you log in with it. The setup code is no longer needed. What every tab does is explained in the admin page guide.

Unraid

  1. Install “Docker Compose Manager” from Apps (Community Applications). It brings the docker compose command.
  2. Open the terminal (the >_ icon at the top right) and fetch Sridu into appdata:
mkdir -p /mnt/user/appdata && cd /mnt/user/appdata
wget https://sridu.com/wp-content/themes/sridu/assets/download/sridu-latest.zip
unzip -q sridu-latest.zip -d sridu && rm sridu-latest.zip
cd sridu
  1. Adjust two settings: nano docker-compose.yml. Put the IP address of your server in SRIDU_HOSTS, for example "192.168.1.20". Set PUID: "99" and PGID: "100" (Unraid’s user nobody and group users). Save with Ctrl+O, Enter, Ctrl+X.
  2. Start it. The first build takes a few minutes:
docker compose up -d --build
  1. Play: open https://<server IP>:8443 on the board computer and every other device.

Set up the admin page

  1. Open the admin page at http://<server IP>:8090/admin/. It only opens from your home network, so use the IP address, not a domain name.
  2. Enter the setup code. It looks like ABCD-EFGH-JKLM. The easiest place to find it: the file SETUP-CODE.txt in the folder server/admin of your Sridu folder. It is also in the log of the container sridu-api: in the Docker tab click sridu-api, Logs, or run docker logs sridu-api.
  3. Choose a password. From now on you log in with it. The setup code is no longer needed. What every tab does is explained in the admin page guide.

Linux / Raspberry Pi

  1. Install Docker if it is not there yet, then log out and in again:
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
  1. Fetch Sridu:
mkdir -p ~ && cd ~
wget https://sridu.com/wp-content/themes/sridu/assets/download/sridu-latest.zip
unzip -q sridu-latest.zip -d sridu && rm sridu-latest.zip
cd sridu
  1. Adjust two settings: nano docker-compose.yml. Put the IP address of the machine in SRIDU_HOSTS (hostname -I shows it). Set PUID and PGID to what id shows, usually 1000 and 1000.
  2. Start it:
docker compose up -d --build
  1. Play: http://localhost:8090 on this machine, https://<IP>:8443 on every other device.

Set up the admin page

  1. Open the admin page at http://<IP>:8090/admin/. It only opens from your home network, so use the IP address, not a domain name.
  2. Enter the setup code. It looks like ABCD-EFGH-JKLM. The easiest place to find it: the file SETUP-CODE.txt in the folder server/admin of your Sridu folder. It is also in the log of the container sridu-api: docker logs sridu-api.
  3. Choose a password. From now on you log in with it. The setup code is no longer needed. What every tab does is explained in the admin page guide.

Windows / Mac

  1. Install Docker Desktop from docker.com and start it.
  2. Download Sridu (sridu-latest.zip) and unzip it, for example into Documents.
  3. Adjust one setting: open docker-compose.yml in a text editor and put the IP address of this computer in SRIDU_HOSTS (Windows: ipconfig, Mac: System Settings, Network). PUID and PGID can stay as they are.
  4. Start it: open a terminal in the folder (Windows: right-click, “Open in Terminal”; Mac: Services, “New Terminal at Folder”) and run:
docker compose up -d --build
  1. Play: http://localhost:8090 on this computer, https://<IP>:8443 on every other device.

Set up the admin page

  1. Open the admin page at http://localhost:8090/admin/. It only opens from your home network, so use the IP address, not a domain name.
  2. Enter the setup code. It looks like ABCD-EFGH-JKLM. The easiest place to find it: the file SETUP-CODE.txt in the folder server/admin of your Sridu folder. It is also in the log of the container sridu-api: Docker Desktop, Containers, sridu-api, Logs.
  3. Choose a password. From now on you log in with it. The setup code is no longer needed. What every tab does is explained in the admin page guide.

The browser warns about the certificate the first time you open https://…:8443. That is expected: the certificate comes from your own server, not from an authority. Click “Advanced” and “Proceed”. Once per device is enough.

Public server

Your own Sridu on your own domain, for a club or friends everywhere. It runs in Docker on a machine that is always on, and something in front of it takes care of https. At home that is usually a Cloudflare Tunnel, on a rented server a reverse proxy.

Playersdarts.your-club.com httpstunnel or proxy Your serverSridu, port 8110admin pageonly from here Your computerhome network or SSH

What you need

  • A machine that runs all the time with Docker: your NAS or a mini PC at home, or a rented server (VPS) from any hosting provider.
  • A domain or subdomain you can set DNS records for, for example darts.your-club.com.
  • https in front of Sridu: at home a Cloudflare Tunnel (the free plan is enough, and no port on your router is opened), on a rented server a reverse proxy such as Caddy, nginx or Traefik.

Step by step

  1. Put Sridu on the machine as in the Docker tab (on a rented server as under Linux), but do not start it yet.
  2. Open deploy/public/docker-compose.yml and change these settings: your domain in SRIDU_DOMAIN, SRIDU_LOBBY_GUESTS: "off" (unless you want to be an open lobby for everybody), SRIDU_BUG_INBOX: "off", SRIDU_CF_ANALYTICS: "off" (unless you switch on Cloudflare Web Analytics yourself) and PUID/PGID as for your system.

Then continue for where it runs:

At home: Cloudflare Tunnel

  1. Create the project from the folder deploy/public (Synology: path /volume1/docker/sridu/deploy/public; terminal: cd deploy/public && docker compose up -d --build).
  2. Create the tunnel: move your domain to Cloudflare (the free plan is enough), then in Zero Trust under Networks, Tunnels create a tunnel and run its cloudflared on the NAS, as Cloudflare shows you.
  3. Connect the domain: in the tunnel add a public hostname. Subdomain and domain as in SRIDU_DOMAIN, type HTTP, URL <NAS IP>:8110.
  4. Test it: your domain should now show Sridu.
  5. Open the admin page on a computer in your home network at http://<NAS IP>:8110/admin/, with the IP address of the NAS, not the domain.

Rented server: reverse proxy

  1. Keep the port private: in docker-compose.yml change the port of web from "8110:8080" to "127.0.0.1:8110:8080". Then only the proxy on the same server reaches Sridu, not the internet.
  2. Start it: cd deploy/public && docker compose up -d --build.
  3. Point the domain at the server: an A record (and AAAA for IPv6) with the server’s IP address at your DNS provider.
  4. Set up the proxy. With Caddy two lines in the Caddyfile are enough, and Caddy fetches the certificate by itself: darts.your-club.com and below it reverse_proxy 127.0.0.1:8110. With nginx, Traefik or Nginx Proxy Manager forward to 127.0.0.1:8110 with WebSockets switched on and the headers X-Forwarded-For and X-Forwarded-Proto.
  5. Test it: your domain should now show Sridu.
  6. Open the admin page through an SSH tunnel. On your own computer run ssh -L 8110:127.0.0.1:8110 you@your-server and leave it open, then open http://localhost:8110/admin/ in the browser. For Sridu you are then on the server itself, so the page opens.

Set up the admin page

The admin page never opens through your domain. your-domain/admin shows nothing, on purpose: nobody on the internet should even see the login. Open it as described in your tab above, from your home network or through an SSH tunnel. If you really want it through the domain, set SRIDU_ADMIN_REMOTE: "on" and choose a long password. An access check in front, such as Cloudflare Access, is safer still.

  1. Enter the setup code. It looks like ABCD-EFGH-JKLM. The easiest place to find it: the file SETUP-CODE.txt in the folder deploy/public/data of your Sridu folder. It is also in the log of the container sridu-public-api-1 (Synology: Container Manager, Container, Log; terminal: docker logs sridu-public-api-1).
  2. Choose a password. From now on you log in with it. The setup code is no longer needed. What every tab does is explained in the admin page guide.

Hosting for other people in Germany or the EU? Then you need an imprint and a privacy policy. Enter both on the admin page under “Legal”, the app links to them at the bottom of its start page.

Online matches do not connect in some networks (optional relay)

Mobile data and some routers do not allow direct connections between two boards. A relay (TURN) passes the encrypted traffic on. A Cloudflare Tunnel does not carry it, so it needs open ports: UDP 3478, UDP 31000–31040 and TCP 3478, at home forwarded on your router to the NAS, on a rented server allowed in its firewall. The steps are in the comments of the relay service in docker-compose.yml. Start it with docker compose --profile relay up -d.

Web space

Sridu needs no server of its own, so any web space that serves files will do. It is free and quick. What you do without: the admin page, your own lobby (players meet over public servers instead) and the online leaderboard. Name, colours, game modes and start settings still work, with the configurator.

Cloudflare Pages

  1. Download Sridu (sridu-latest.zip) and keep it zipped.
  2. In the Cloudflare dashboard: Workers & Pages, Create, Pages, “Upload assets”.
  3. Give it a name and drag the ZIP file itself into the upload field. Deploy. The unzipped folder won’t work: with its voice files it holds about 1,000 files, more than the dashboard accepts in one upload.
  4. Done: Sridu runs at <name>.pages.dev. Under Custom domains you can add your own domain.

Netlify

  1. Download and unzip Sridu (sridu-latest.zip).
  2. Open app.netlify.com/drop and drag the unzipped folder onto the page.
  3. Done: Netlify shows the address. Sign up (free) if you want to keep the site.

GitHub Pages

  1. Create a new, empty repository on GitHub.
  2. Put Sridu into it from a terminal. The upload in the browser takes only 100 files at a time, and Sridu has about 1,000: git clone https://github.com/<name>/<repository>.git, then cd <repository>, download sridu-latest.zip into it, unzip -q sridu-latest.zip && rm sridu-latest.zip, git add -A, git commit -m "Sridu", git push.
  3. Switch on Pages: Settings, Pages, source “Deploy from a branch”, branch main, folder / (root).
  4. Done: after a minute Sridu runs at <name>.github.io/<repository>.

Your settings without Docker: the configurator

A copy on web space has no admin page, but it can still carry your club’s name and colours, a welcome, an announcement, a choice of game modes and start settings for new devices. The app reads them from a file called config.json next to index.html. The configurator in the app folder writes that file for you.

  1. Open config.html It comes with Sridu, next to index.html. After uploading, open https://<your address>/config.html. If a config.json is already there, its values are loaded.
  2. Go through the sections General, Look & welcome, Customise the app, Online and Legal. Whatever you leave alone keeps its default. Your changes are kept in this browser until you download them.
  3. Download config.json The button is at the top right. The file is made in your browser, nothing is sent anywhere.
  4. Put it next to index.html Upload the folder again and reload the app. Devices that already know it pick up the change at their next start.
WhereHow the file gets there
Cloudflare PagesUnzip Sridu, put config.json next to index.html, select everything inside the folder and compress it into a new ZIP (the files, not the folder around them). Upload that ZIP in the dashboard with “Create deployment”. With wrangler pages deploy, put it into the folder instead.
Web space (FTP)Upload it with your FTP program into the same folder as index.html.
NAS web stationCopy it into the folder of the web station next to index.html (Synology: the shared folder web, QNAP: Web), with File Station or over the network.
Your own computerNext to index.html in the folder you serve, for example with python3 -m http.server.
  • LogoA file next to index.html, such as logo.png, an https address, or a small image of up to 100 KB that goes straight into config.json.
  • LobbyWithout a server of your own, players meet serverless over public brokers, or in the Sridu online lobby at play.sridu.com.
  • Imprint and privacy policyA link to a page on your website, or the text itself in config.json.
  • No file at allIs fine too. The app then behaves as it always did.

What needs Docker: a shared leaderboard, player data on the server, your own lobby with moderation and your own broker, the usage figures, and the admin page with password, logo upload and backup. For those, take Docker at home or a public server.

Running your server

After the installation

Everything you need later on, for Docker at home and the public server.

I missed the setup code

Open the file SETUP-CODE.txt in the server’s data folder: Docker at home server/admin/, public server deploy/public/data/. It stays there until a password is set. No file there? Then the admin service has not started yet: look at the log of the project for an error, or restart it.

I forgot the admin password

Delete the file admin.json in the server’s data folder and restart the project. A new setup code appears in the log, and you choose a new password. Settings, leaderboard and texts are kept.

Where the folder is: Docker at home server/admin/, public server deploy/public/data/.

Where is my data, and how do I back it up?

Everything lives in plain folders next to docker-compose.yml. Docker at home: data/ (the player data of every browser) and server/ (admin, leaderboard, certificate). Public server: deploy/public/data/. To back up, copy these folders, or add them to your backup tool (Hyper Backup, Unraid appdata backup).

Moving to another server

Stop the project, copy the whole Sridu folder including the data folders to the new machine, adjust the IP address in SRIDU_HOSTS if it changed, and create the project there. Everything is back: players, leaderboard, password.

Changing a setting

Open docker-compose.yml, change the value, save, and restart the project (Synology: Project, Action, Restart; terminal: docker compose up -d). Many settings can also be changed on the admin page, no restart needed.

Updating to a new version

What a new version brings is in the changelog. The easiest way is the Update tab of the admin page: it builds the new version while the old one keeps running, then swaps the containers. Players notice a break of a few seconds at most.

  • Rebuild, always there: download sridu-latest.zip, unzip it over your folder and keep your docker-compose.yml and the data folders. Then press Rebuild on the admin page.
  • Download and update, if you switch it on: in docker-compose.yml, under the service updater, set SRIDU_UPDATE_DOWNLOAD to "on", then run docker compose up -d once. From then on the admin page shows when a new version is out and installs it with one click. Your compose files, settings and data stay as they are, and Back to the previous version restores the old files.
  • Without the updater: unzip as above, then rebuild by hand (Synology: Project, Action, Build; terminal: docker compose up -d --build). An older installation gets the updater the same way once: the Update tab shows the lines to add to docker-compose.yml.

New settings of a release are in the docker-compose.yml inside the ZIP. Copy over the ones you want.

The port is already in use

Another program already uses 8090, 8443 or 8110. In docker-compose.yml under ports, change the number on the left, for example "8091:8080", and use the new number in the address.

Why PUID and PGID?

They decide which user owns the data folders. With your own user you can open, copy and back them up without permission trouble. Synology: 1026 and 100. Unraid: 99 and 100. Other Linux: what id shows. Docker Desktop on Windows and Mac: any value works.

Reference

Every setting

All settings are at the top of docker-compose.yml. Change the value, then restart the project. Many of them can also be set on the admin page, which then takes precedence. The two columns show the default of Docker at home and of the public server.

Server

SettingHomePublicWhat it does
SRIDU_HOSTSemptyemptyIP addresses or names of the machine for the https certificate, comma separated. Set it before the first start.
SRIDU_DOMAINn/ayour domainOnly this name and local addresses are answered.
SRIDU_ADMIN_REMOTEn/aoffon = the admin page also opens through your domain, from anywhere. Only with a long password; an SSH tunnel is safer.
SRIDU_LANGautoautoThe language everyone starts in: auto (the browser’s) or en, de, nl, fr, es, it, pt-BR, pl, hr.
SRIDU_INDEXn/aonon: search engines may list the app.
SRIDU_ADMIN_REMOTEn/aoffon: the admin page also from outside your home network. Not recommended.
SRIDU_CF_ANALYTICSoffoffon: lets the script of Cloudflare Web Analytics load (security policy). Only if you switched on Web Analytics for your domain in Cloudflare; then name it in your privacy policy.
SRIDU_NAMEemptyemptyName of the installation in the browser tab and on the start page, for example DC Bullseye. Empty: Sridu. Logo, welcome text and more are on the admin page under Look & welcome.
SRIDU_ACCENTemptyemptyAccent colour as #rrggbb, for example #e11d48. Empty: the Sridu green.
SRIDU_COUNTERSononUsage figures for the overview of the admin page: app starts, finished matches, darts and game modes per day. Sums only, no cookies, device IDs, names or addresses.
SRIDU_PACKSonoffThe sound-pack library: the apps of this server can share their own sounds and caller voices here and install each other’s. off: nothing is stored on the server and the app shows no library. Who may share and the biggest pack are set on the admin page under Sound packs.
SRIDU_UPDATE_CHECKononEvery six hours, and when you open the admin page, the server asks sridu.com whether a newer version is out, and the admin page then shows it (Update). A plain request without cookies or an ID; nothing is downloaded or installed. off: no check.
PUID / PGID1000 / 10001026 / 100The user and group the data folders belong to.

Lobby

SettingHomePublicWhat it does
SRIDU_LOBBYononThe open chat for finding opponents.
SRIDU_LOBBY_MODElocallocallocal: the lobby of this server. online: the Sridu online lobby at play.sridu.com, together with everybody there (another server via SRIDU_LOBBY_ONLINE_URL). mesh: without a server, over the brokers.
SRIDU_LOBBY_GUESTSn/aonon: apps of other installations may join this lobby. play.sridu.com needs that; on your own server usually off.
SRIDU_LOBBY_ROOMSoneoneone: one room for everybody. lang: one room per app language.
SRIDU_LOBBY_MAXn/a2000At most this many players online at once.
SRIDU_LOBBY_PER_IPn/a30At most this many lobby connections from one IP address. An IPv6 address counts by its /64 block.
SRIDU_CHAT_HISTORYn/a50Chat lines kept in memory for newcomers. Never written to disk.
SRIDU_REPORTSononon: players can report people and messages in the lobby, and you see the reports on the admin page. Not in the file; add the line to switch it off, or use the admin page.

Playing and leaderboard

SettingHomePublicWhat it does
SRIDU_CORRECT_CHALLENGESonoffMay players correct darts in the hourly challenges? Off on a public server: what the cameras saw counts.
SRIDU_CORRECT_MINISonoffThe same for training and warm-up games, everything with records. Party games can always be corrected.
SRIDU_JOIN_APPROVALoffonon: a device from outside the host’s network asks before it joins a session.
SRIDU_BOARDononThe leaderboard of the hourly challenges.
SRIDU_BOARD_STRICToffonon: only darts the cameras saw count, no corrections, nothing typed in.
SRIDU_BOARD_TRAININGononTraining games count on the online leaderboard. off: their records stay on the device.
SRIDU_BOARD_WARMUPononThe same for the warm-up games.
SRIDU_PROGRESSoffonon: player level, badges with notes in the game, daily goals and looks to unlock (Level & badges).
SRIDU_PROGRESS_DAILYononThe three daily goals, only with SRIDU_PROGRESS.
SRIDU_PROGRESS_UNLOCKSononLooks to unlock, only with SRIDU_PROGRESS.
SRIDU_BOARD_DAYS9090Results are deleted after this many days (at least 35).

Problem reports

SettingHomePublicWhat it does
SRIDU_BUG_REPORTSononon: players can send a problem report straight to the Sridu developers (play.sridu.com). off: only by e-mail or saved as a file.
SRIDU_BUG_INBOXoffonReceives the reports of every installation. Only for play.sridu.com; on your own server set it to off.
SRIDU_BUG_DAYSn/a90Received reports are deleted after this many days (7–365).

Online matches

SettingHomePublicWhat it does
SRIDU_BROKERononThe own broker connects devices for online matches.
SRIDU_PUBLIC_BROKERSonoffon: public MQTT servers help as well when your own is not reachable.
SRIDU_STUNempty (Google and Cloudflare)CloudflareWhere a device learns its public address for a direct connection.
SRIDU_TURN_HOSTemptyemptyPublic name of your relay. Empty: no relay.
SRIDU_TURN_PORT34783478Port of the relay.
SRIDU_TURN_URLSemptyemptyA hosted TURN service instead of your own relay.
SRIDU_TURN_USER / _PASSsridu / emptysridu / emptyLogin of the relay. Visible to every visitor, it only keeps strangers’ apps out.

Compare

The four ways side by side

Just the filesDocker at homePublic serverWeb space
Cameras, all game modes, statisticsYesYesYesYes
Phones and tablets in the networkNoYesYesYes
Online matchesOver public serversYesYesOver public servers
Admin pageNoYesYesNo, the configurator instead
Own lobby and leaderboardNoYesYesNo
Reachable from the internetNoNoYesYes
Effort5 minutes15 minutesOne evening10 minutes

Licence: self-hosting is free for you at home and for your club. A pub, a public event or anything commercial needs a word first, see who may do what.