Hosting your own co-op server¶
Bells and summons go through a shadNet server. shadPS4's public one (srv.shadps4.net) no longer
accepts bbport builds, and the public pools for bbport are Seamless Hunt (the default) and The
Hunter's Dream's, through bbbridge (the launcher's Multiplayer → Online tab; README). A group of friends
can also run their own server:
shadnet-p2p by Wozzardman, the shadNet server with
that UDP port working and a summon service of its own.
With your own shadNet server, messages, bloodstains and ghosts come from the Game server field of the Online tab: The Hunter's Dream by default, or BBSC's game server (below). Windows players of Supermedo's port can join the same server.
Tested with two players, one on this Linux port and one on Supermedo's Windows port, over Tailscale, with the server below on a home server (Ubuntu 26.04): summons, a boss fight together and summoning again after the helper died.
How it fits together¶
- One always-on computer runs the server: a VPS, a home server, or one of the players' PCs (then it has to be on while you play).
- Everyone joins one Tailscale network (a tailnet): the server and
every player. Tailscale gives each computer an address starting with
100.and encrypts the traffic between them. This matters: shadNet's login on TCP 31313 is not encrypted, so it should not be open to the Internet. And the games then reach each other over Tailscale too, so nobody has to open ports on their router.
| Protocol | Port | Used for |
|---|---|---|
| TCP | 31313 | Login and matchmaking |
| UDP | 31314 | Each player's address, for the other player of a summon |
| TCP | 31315 | WebAPI and the summon service |
1. Tailscale¶
On the server and on every player's computer, install Tailscale
(download; on Linux curl -fsSL https://tailscale.com/install.sh | sh)
and sign in:
sudo tailscale up
The server's owner invites the players from the admin console (Users → Invite external users), and each player accepts the invitation and signs in on the computer they play on. Then, on the server:
tailscale ip -4 # the server's address, 100.x.y.z: the players need it
tailscale status # every player's computer should be listed
2. The server¶
With Docker (any Linux)¶
This repository has a Docker image for it: tools/shadnet-server. It builds shadnet-p2p on Debian 13, because shadnet-p2p needs Qt 6.8 or newer and some distributions are older (Ubuntu 24.04 has Qt 6.4). It runs on any Linux with Docker, Ubuntu 24.04 included.
mkdir shadnet-server && cd shadnet-server
for f in Dockerfile entrypoint.sh; do
curl -fsSLO "https://raw.githubusercontent.com/ayozetr/bloodborne_linux/main/tools/shadnet-server/$f"
done
docker build -t bbport-shadnet .
Then start it, with the server's Tailscale address and a signup code of your own (letters,
digits, - and _; the players never need it, only you, to create their accounts):
docker run -d --name shadnet --restart unless-stopped --network host \
-v shadnet-data:/data \
-e SHADNET_HOST=100.x.y.z \
-e SHADNET_REGISTRATION_KEY=a-long-code-of-your-own \
bbport-shadnet
docker logs shadnet
The log should end with the three listeners on the Tailscale address:
Unsecured TCP listener on: 100.x.y.z:31313. No encryption, use it only on trusted networks
STUN UDP listener on: 100.x.y.z:31314
WebApiServer listening on: 100.x.y.z:31315
SHADNET_HOST keeps the server off the computer's other networks. After a reboot, it waits until
Tailscale is up. The configuration (shadnet.cfg) and the accounts (db/shadnet.db) live in the
shadnet-data volume. To stop or update the server:
docker stop shadnet && docker rm shadnet # the volume, with the accounts, stays
docker build -t bbport-shadnet . # after downloading a newer Dockerfile
Then run the same docker run again.
Without Docker¶
Follow shadnet-p2p's README. It needs Qt 6.8
or newer: Arch Linux and its derivatives, Debian 13, Ubuntu 26.04, Fedora 41 or newer. On Debian
and Ubuntu, install qt6-websockets-dev along with the packages it lists, or CMake does not find
Qt's HTTP server module (checked on Debian 13 and Ubuntu 26.04). In build/shadnet.cfg, set Host to the server's Tailscale address (or
0.0.0.0), Matching2Enabled=true and RegistrationSecretKey to your signup code.
A firewall on the server¶
With ufw, let the tailnet in:
sudo ufw allow in on tailscale0
3. Accounts¶
One account per player, created on the server with the signup code. The name is 3 to 16
letters, digits, - or _:
docker exec shadnet shadnet-sample 127.0.0.1 31313 register <name> <password> <email> <signup code>
127.0.0.1 works only when the server listens on every address (SHADNET_HOST unset or
0.0.0.0). With SHADNET_HOST set, use that address instead. The tool answers
Account created successfully., or FAILED: Unauthorized when the code is wrong. Give each player
their own name and password.
To back up the accounts, stop the server and copy the volume's db/shadnet.db.
4. Each player's launcher¶
In Multiplayer → Online:
| Setting | Value |
|---|---|
| Play online | On |
| shadNet server | Your own server |
| Server address | 100.x.y.z (the port, 31313, is added) |
| WebAPI address | Empty (the server's port 31315) |
| Online ID / Password | The player's own account |
| UPnP | Off (Tailscale needs no router ports) |
Then press Test in the Status row. Every line should get a check mark, the shadNet server's UDP among them: it
shows the address the server sees for you, a 100. one through Tailscale. An error mark on the UDP line
means summons cannot connect: check that the server is running and that its log lists the UDP listener.
Summons go through the server's own summon service: the log of a game says
Co-op: summon signs through http://100.x.y.z:31315.
Windows players set the same server, WebAPI and account in the Windows port's launcher.
Seamless co-op (BBSC)¶
For BBSC with everything on (summons across areas, 5 hunters),
the group also runs BBSC's game server next to shadNet. It is in this repository,
bbsc/server/gameserver/bbsc_gameserver.py (Python 3, nothing to install), and it takes the
place of The Hunter's Dream for messages, bloodstains and the server list.
- Turn on shadNet's seamless mode: run the shadNet container again with
-e SHADNET_BLOODBORNE_SEAMLESS_COOP=1(it is kept in itsshadnet.cfg). - Build and start the game server on the same computer, with the same Tailscale address:
mkdir bbsc-server && cd bbsc-server
for f in Dockerfile entrypoint.sh; do
curl -fsSLO "https://raw.githubusercontent.com/ayozetr/bloodborne_linux/main/tools/bbsc-server/$f"
done
docker build -t bbport-bbsc-server .
docker run -d --name bbsc-server --restart unless-stopped --network host \
-v bbsc-data:/data -e BBSC_HOST=100.x.y.z bbport-bbsc-server
docker logs bbsc-server
BBSC_SHADNET is the shadNet server's address when it is on another computer. Messages,
bloodstains and its logs live in the bbsc-data volume. Without Docker:
python3 bbsc/server/gameserver/bbsc_gameserver.py --shadnet 100.x.y.z --host 100.x.y.z.
| Port | Protocol | What |
|---|---|---|
| 20443 | TCP | The game server (messages, bloodstains, ghosts) |
| 20444 | TCP | BBSC's relay (warps, world sync, scaling) |
| 18671 | TCP | Its bbhost-compatible service (BBSC_BBHOST=0, --no-bbhost, turns it off) |
| 3478 | UDP | The relay BBSC players fall back to when they cannot reach each other directly |
Each player then sets Game server to http://100.x.y.z:20443 in the launcher's
Multiplayer → Online tab, keeps the same shadNet server and account, and turns on BBSC in the Seamless co-op (BBSC) group.
BBSC finds its relay at the game server's address (or BBSC_RELAY, the relay address in BBSC's
settings).
Troubleshooting¶
- The log shows
127.0.0.1or another address in the listeners: checkSHADNET_HOST, orHostin theshadnet.cfgbeside the server's executable. Waiting for 100.x.y.zin the log: Tailscale is not up on the server, or the address is wrong (tailscale ip -4).- The game says it is not signed in to PlayStation Network: a wrong name or password (code 8 in the log), or two players using one account.
- The test passes but summons fail: every player's computer must be in the tailnet, not only
the server;
tailscale ping <player>from each side. Everyone needs the game at version 1.09 and the same co-op mode.
See also Online play and co-op for the bells, passwords and log lines of a summon.