netfishing-dedicated-server/README.md
Voyager 0f1d931a7b Merge remote-tracking branch 'origin/main'
# Conflicts:
#	scripts/package-native.sh
#	scripts/stage-build.sh
2026-08-12 11:23:46 -04:00

6.4 KiB

NETfishing Dedicated Server

This repository packages the headless NETfishing server produced by the main game project. Gameplay and networking code remain in the netfishing repository so clients and servers use the same protocol implementation.

Production tags follow the coordinated NETfishing release train. Package a game release with the same vX.Y.Z-alpha tag checked out in this repository. The package manifest records both the exact game commit and the exact dedicated packaging commit; packaging refuses to run when its matching release tag does not point to the current commit.

Stage a build

Export the Linux Dedicated Server preset from the game project, then stage its executable and PCK with the exact game version and source commit:

game_commit="$(git -C ../netfishing rev-parse HEAD)"
./scripts/stage-build.sh \
  ../netfishing/builds/vX.Y.Z-alpha/server-linux-x86_64 \
  X.Y.Z-alpha \
  "${game_commit}"

The staged binaries under dist/ are release inputs and are intentionally not tracked by Git. dist/BUILD_INFO records the version, full game and packaging commits, export preset, platform, and binary hashes. Packaging refuses a version mismatch, packaging-tag mismatch, or failed internal checksum.

Create a deterministic native archive after staging:

./scripts/package-native.sh X.Y.Z-alpha

Install or update natively

The native archive contains its BUILD_INFO and internal checksums. Transfer both the archive and its adjacent .sha256 file, then install it:

sudo ./scripts/install-native-release.sh \
  packages/netfishing-dedicated-server-X.Y.Z-alpha-linux-x86_64.tar.gz \
  packages/netfishing-dedicated-server-X.Y.Z-alpha-linux-x86_64.tar.gz.sha256

Releases are immutable directories under /opt/netfishing-server/releases. The installer verifies the outer archive hash, internal hashes, manifest, and platform before atomically changing /opt/netfishing-server/current. When the sample systemd unit is already active, a failed start automatically restores the prior release. Manually return to the recorded previous release with:

sudo ./scripts/rollback-native.sh

Copy config/server.cfg.example to /etc/netfishing-server.cfg and adjust the room name, UDP port, player limit, and public-listing preference. Forward the configured UDP port through the host firewall and router when accepting Internet players.

The data directory contains the server identity and moderation state. Keep it persistent and back it up; replacing it changes the server fingerprint shown to returning players.

Configuration is applied in this order: config file, environment variables, then command-line overrides. Supported command-line options are --name, --bind, --port, --max-players, --data-dir, --discovery-url, --operators, --public, and --private. Value options use --option=value. Keep the first standalone -- shown above; it separates Godot engine flags from server flags.

Headless operators

Headless moderation is granted by authenticated player identity, never by a display name or shared password. A player can copy their complete 64-character fingerprint from Settings → Data & Identity → Copy Player Fingerprint.

Add trusted fingerprints to /etc/netfishing-server.cfg:

[moderation]
operators=PackedStringArray("0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef")

Alternatively, provide a comma-separated list through NETFISHING_SERVER_OPERATORS or --operators=fingerprint1,fingerprint2. Configuration file values are overridden by the environment, then by the command line. Restart the server after changing the allowlist.

The server grants operator status only after the connecting player proves ownership of that exact identity key. Operators can kick, ban, unban, and clear shared session artwork through the in-game Players page. They cannot grant operator access, revoke another operator, or moderate another operator. Keep the server data directory persistent because it owns the server identity and stored bans.

Public listing requires the discovery URL and a publicly reachable ENet UDP port. Discovery makes a server findable but does not relay gameplay traffic.

For a systemd installation, create a dedicated netfishing system user, install the sample configuration and environment files under /etc, and copy systemd/netfishing-server.service to the system unit directory. The unit runs the atomic current release link and expects /var/lib/netfishing-server to be writable by that user. When migrating an older direct-path installation, stop the service, run the installer once, replace/reload the unit, and then start it. After that one-time migration, future upgrades can be applied while the unit is running.

For a direct foreground run from staged build inputs:

./dist/NETfishingServer.x86_64 \
  -- \
  --config=/etc/netfishing-server.cfg \
  --data-dir=/var/lib/netfishing-server

Run with Docker Compose

./scripts/stage-build.sh \
  ../netfishing/builds/vX.Y.Z-alpha/server-linux-x86_64 \
  X.Y.Z-alpha \
  "$(git -C ../netfishing rev-parse HEAD)"
docker compose build
docker compose up -d

Set values such as NETFISHING_SERVER_NAME, NETFISHING_SERVER_PORT, NETFISHING_SERVER_MAX_PLAYERS, NETFISHING_SERVER_PUBLIC, and the optional comma-separated NETFISHING_SERVER_OPERATORS in a local .env file. The Compose service runs without Linux capabilities, uses a read-only root filesystem, and stores persistent state in a named volume.

Steam distribution

Publish the server as a separate Steam Tool AppID/depot linked to the base game. Replace the placeholders in copies of the files under steam/, then use SteamCMD to upload the staged dist/ directory. Keep the example files free of private Steam credentials.

Licensing

Project-owned source code in this packaging repository and the packaged game server code are licensed under GPL-3.0-or-later. Every binary package includes the license and a corresponding-source record for its exact game commit.

The server PCK contains NETfishing creative assets governed by ASSET-LICENSE.md, along with third-party materials listed in THIRD-PARTY-NOTICES.md. NETfishing and Woofmeow branding is reserved as described in TRADEMARKS.md.

Contributions are accepted under CONTRIBUTING.md and CONTRIBUTOR-TERMS.md.

Copyright © 2026 Alexander Sellite and Rheannon Eisworth.