Maybe give clonebundles a shot? Mozilla has been using it to great success, and you can put the majority of the repo data on a CDN so it’s relatively quick to serve. From the (server-only) extension docs:
`hg help clonebundles`:
> clonebundles extension - advertise pre-generated bundles to seed clones
>
> "clonebundles" is a server-side extension used to advertise the existence of
> pre-generated, externally hosted bundle files to clients that are cloning so
> that cloning can be faster, more reliable, and require less resources on the
> server.
[...]
> This extension provides server operators the ability to offload potentially
> expensive clone load to an external service. Here's how it works.
>
> 1. A server operator establishes a mechanism for making bundle files available
> on a hosting service where Mercurial clients can fetch them.
> 2. A manifest file listing available bundle URLs and some optional metadata is
> added to the Mercurial repository on the server.
> 3. A client initiates a clone against a clone bundles aware server.
> 4. The client sees the server is advertising clone bundles and fetches the
> manifest listing available bundles.
> 5. The client filters and sorts the available bundles based on what it
> supports and prefers.
> 6. The client downloads and applies an available bundle from the server-
> specified URL.
> 7. The client reconnects to the original server and performs the equivalent of
> 'hg pull' to retrieve all repository data not in the bundle. (The
> repository could have been updated between when the bundle was created and
> when the client started the clone.)
>
> Instead of the server generating full repository bundles for every clone
> request, it generates full bundles once and they are subsequently reused to
> bootstrap new clones. The server may still transfer data at clone time.
> However, this is only data that has been added/changed since the bundle was
> created. For large, established repositories, this can reduce server load for
> clones to less than 1% of original.