Skip to content

Enterprise Deployments

Remote Deployment stands the server up for other people: a service unit, a container, a reverse proxy, a certificate, and a first pass at several instances. This section is what changes when “other people” is hundreds of them.

Everything here is HTTP mode. Read HTTP Server Mode first if the pool, the instance allow-list and the authentication modes are not already familiar.

What is different about this server at scale

Section titled “What is different about this server at scale”

It holds no credential of its own. Every request carries the caller’s token, as PRIVATE-TOKEN or Authorization: Bearer, so there is no server token to protect, /health needs no authentication, and per-user identity, tiering and rate limiting survive as long as the credential does. Every design decision in this section follows from that: affinity, gateways and the rate limiter are all questions about the credential’s path to the process.

One MCP server is built per configuration shape, not per credential. A credential is a GitLab client and its bookkeeping, and the registered catalog is shared by everyone whose configuration matches, which is what makes a large population cheap to hold and a busy one expensive to serve. The design and its invariants are recorded in ADR-0020.

Nothing here needs a reverse proxy to be correct. The binary answers its own CORS preflights, its own 404s and its own security headers, terminates TLS, and listens on a unix socket. A proxy is for what a proxy is good at: many clients, one certificate, one address.

Frequently asked questions

Do I still need token affinity across instances?

For ordinary calls it is an optimisation rather than a requirement: an instance a caller moves to already has the catalog built, so the move costs a credential probe, a licensing lookup and a client. Affinity still keeps one rate-limit bucket and one identity probe per caller instead of one per instance. It is mandatory for two things: legacy stateful sessions, which live in the process that minted the session id, and resource subscriptions, whose watchers are held by one process.

What is the one setting people forget behind a proxy?

--trusted-proxy-header together with --trusted-proxies. Without them every caller's authentication failures are charged to the balancer's address, and ten bad tokens a minute from anywhere in the population answers 429 to the entire deployment for a minute. Each flag is refused without the other.

Why does HAProxy mark every instance DOWN?

option httpchk sends no Host header unless one is configured, and a server bound to a specific host used to refuse such a request with 403. Version 2.8.0 serves it, because a request naming no host is not the DNS-rebinding attack that check exists for. On an older server, add hdr Host your.host.name to the http-check send line, which is good practice either way.

For the complete technical reference in one page, see docs/guides/enterprise-deployment.md in the repository.