JoinGG

Serving custom content properly with FastDL

Four ways it goes wrong and all of them are silent. The directory layout, the compression, and the two places files have to live.

SweetMask · 3 min read

A Source server with custom maps, sounds or models has to get that content onto the client before the player can join. The built-in mechanism sends it through the game connection, slowly, one file at a time, while the player watches a progress bar and decides whether to wait.

FastDL is the alternative: a plain HTTP server holding the same files, which the client fetches at whatever speed the connection allows. It is straightforward and it has four ways to go wrong, all of them silent.

The directory layout has to match exactly

The client requests files at the same paths the server uses. A map at maps/de_dust2_v2.bsp on the server is requested at maps/de_dust2_v2.bsp under your download URL.

Get the structure wrong and the client requests a URL that 404s, falls back to the slow in-game transfer, and the player experiences the thing FastDL was meant to prevent. Nothing in the server console mentions this.

The check is direct: take a file the server has, construct the URL a client would request, and open it in a browser. If it downloads, the layout is right.

Compression is the point, and it is optional

Source clients accept bzip2-compressed files, requested with a .bz2 extension appended. A 40MB map compresses substantially, and on a server with a large content set this is the difference between a two-minute wait and a twenty-second one.

Serving uncompressed works and wastes most of the benefit. Compress everything, keep both if you like, and let the client ask for what it wants.

sv_allowdownload and sv_allowupload are not the same setting

Download controls whether clients may fetch content from the server. Upload controls whether clients may send files to the server — sprays, mostly.

Turning both on because a guide said so is how servers end up accepting arbitrary uploads from strangers. Upload is off by default on most modern configurations and should stay that way, which belongs in the same pass as the rest of the security basics.

The files have to be on both

This is the one that catches people. The server needs the content to run the map. The FastDL host needs the content to serve it to clients.

Two locations, kept in sync manually, which means they drift. A map added to the server and not to the download host produces a server running a map nobody can download — everyone who joins is disconnected with a missing-content error, and the console says nothing useful.

Automate the copy, or accept that you will do it by hand every time and occasionally forget.

Bandwidth is yours now

The point of FastDL is that content transfer leaves the game server. It does not leave your bill.

A popular server with a large content set moves real volume, and on a metered plan that is a line item people meet by surprise. Object storage or a small separate host is the usual answer, and it is worth knowing the number before it arrives rather than after: the same arithmetic as everything else the month costs.

The cheap version: compress everything, prune what nobody plays, and the volume halves twice.

What FastDL does not cover

Workshop content, on games that use it. If your content comes from the workshop, that pipeline is separate and FastDL duplicating it is wasted bandwidth: the platform handles the transfer and the server only has to tell the client which items to fetch.

Running both for the same content is a common arrangement that costs money and achieves nothing.

The size problem, which is the real limit

None of this fixes a content set that is simply too large. A new player facing an eight-hundred-megabyte download will frequently close the game, and no amount of compression changes that decision.

That is a content decision rather than a configuration one. Servers that keep new players run smaller content sets than the ones that have been adding maps for three years, and the pruning is uncomfortable for exactly the reasons that make a map rotation grow without limit.

The five-minute check

Pick a file. Build the URL. Open it. Then join your own server from a clean install and watch what actually downloads.

That second half is the one nobody does, and it is the only way to see the experience a stranger gets: the same reason testing from outside is the first step for anything that looks fine from the console.

Tags
source enginefastdlconfiguration
Share

SweetMask

Published · 3 min read

All articles

Keep reading