> ## Documentation Index
> Fetch the complete documentation index at: https://docs.coreweave.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Points de terminaison publics

> Attribuez une adresse publique à un service exécuté dans une sandbox, avec terminaison TLS par la plateforme ou TLS passthrough.

<Note>
  Les exemples qui omettent `Sandbox.run(auth=...)` utilisent un jeton d’accès à l’API CoreWeave provenant de `CWSANDBOX_API_KEY`. Pour l’authentification par clé API Forge, suivez [Premiers pas](/fr/products/sandboxes/get-started#forge-api-key) et transmettez les `AuthHeaders` obtenus à l’opération.
</Note>

Cette page explique le fonctionnement des points de terminaison publics, comment en déclarer un lors de la création d’une sandbox et comment s’y connecter.

Un point de terminaison public attribue à un service exécuté dans une sandbox une adresse accessible aux clients depuis Internet. Vous le demandez lors de la création de la sandbox, et la plateforme provisionne l’acheminement, le DNS et l’accès réseau nécessaires. L’adresse reste attribuée à la sandbox pendant toute la durée de son exécution.

Il existe deux types de points de terminaison, qui se distinguent par l’endroit où s’effectue la terminaison TLS :

* **HTTPS** : la plateforme assure la terminaison TLS en périphérie avec un certificat qu’elle provisionne et renouvelle, puis transmet la requête à votre port en HTTP non chiffré.
* **TLS passthrough** : la plateforme achemine la connexion vers votre port au moyen de [Server Name Indication (SNI)](https://en.wikipedia.org/wiki/Server_Name_Indication), sans la déchiffrer. Votre charge de travail assure elle-même la terminaison TLS et gère ses propres certificats.

Choisissez TLS passthrough lorsque la charge de travail doit détenir elle-même la clé privée : TLS mutuel, client qui épingle un certificat ou protocole autre que HTTP.

<h2 id="compare-the-two-kinds">
  Comparer les deux types
</h2>

| | HTTPS | TLS passthrough |
| - | - | - |
| Terminaison TLS | Périphérie de la plateforme | Votre charge de travail |
| Gestion des certificats | Plateforme | Vous |
| Protocoles transportés | HTTP, WebSockets via HTTP Upgrade et Server-Sent Events | Tout protocole sur TLS |
| `endpoint.kind` | `HTTPS` | `TLS_PASSTHROUGH` |
| `endpoint.auth` | `OPEN` (requis) | À omettre |
| Adresse à lire dans | `service_urls` | `service_addresses` |

<Warning>
  Les deux types sont exposés sur Internet. La plateforme n’authentifie pas les appelants ; il incombe donc au service situé derrière le point de terminaison de gérer son propre contrôle d’accès.
</Warning>

<h2 id="declare-an-endpoint">
  Déclarer un point de terminaison
</h2>

Déclarez les points de terminaison dans la liste `services` lors de la création de la sandbox. Les ports restent fixes pendant toute la durée de vie de la sandbox, et aucun appel ne permet d'exposer un port sur une sandbox déjà en cours d'exécution.

Pour attribuer un point de terminaison à un service, définissez sur celui-ci `visibility=PUBLIC` ainsi qu'une valeur `endpoint`. Un service sans valeur `endpoint` écoute sur son port à l'intérieur de la sandbox, mais n'obtient aucune adresse publique.

Pour un point de terminaison HTTPS, définissez `kind=EndpointKind.HTTPS` et `auth=EndpointAuth.OPEN` :

```python theme={"system"}
from cwsandbox import (
    Endpoint,
    EndpointAuth,
    EndpointKind,
    Sandbox,
    Service,
    ServiceVisibility,
)

sandbox = Sandbox.run(
    "python3", "-m", "http.server", "8080",
    container_image="python:3.11",
    services=[
        Service(
            port=8080,
            name="web",
            visibility=ServiceVisibility.PUBLIC,
            endpoint=Endpoint(kind=EndpointKind.HTTPS, auth=EndpointAuth.OPEN),
        ),
    ],
)
```

Pour un point de terminaison en mode TLS passthrough, définissez `kind=EndpointKind.TLS_PASSTHROUGH` et laissez `auth` non défini. La commande que vous exécutez doit assurer elle-même la terminaison TLS sur le port, car la plateforme transfère la connexion sans la déchiffrer :

```python theme={"system"}
from cwsandbox import (
    Endpoint,
    EndpointKind,
    Sandbox,
    Service,
    ServiceVisibility,
)

sandbox = Sandbox.run(
    "python3", "/srv/serve_tls.py",
    container_image="python:3.11",
    services=[
        Service(
            port=8443,
            name="tls",
            visibility=ServiceVisibility.PUBLIC,
            endpoint=Endpoint(kind=EndpointKind.TLS_PASSTHROUGH),
        ),
    ],
)
```

Une même sandbox peut combiner les deux types. Les règles suivantes s’appliquent à chaque entrée `services` :

* **Les ports doivent être uniques**, tout comme les noms que vous définissez. Les noms correspondent aux noms de ports de conteneur Kubernetes, qui doivent être uniques.
* **`visibility` doit valoir `PUBLIC`** lorsque `endpoint` est défini, et ne doit pas être défini dans le cas contraire. La visibilité seule ne crée ni point de terminaison ni adresse.
* **`protocol` doit valoir `TCP` ou ne pas être défini.** La plateforme rejette les points de terminaison `UDP` et `SCTP`.
* **Omettez `auth` et `request_timeout_seconds` en mode TLS passthrough.** Passez `None` plutôt que `0` : une valeur `0` est considérée comme définie, et la plateforme rejette alors l’appel de création.
* **Le nombre de services qu’une sandbox peut déclarer est plafonné par une limite de la plateforme.** Ce plafond est défini par les opérateurs et généralement fixé à cinq dans les déploiements.

<h2 id="read-the-assigned-address">
  Lire l’adresse attribuée
</h2>

La plateforme attribue l’adresse. Vous ne pouvez pas choisir le nom d’hôte ni fournir votre propre domaine. Récupérez-la depuis la sandbox plutôt que de la construire vous-même, car la zone DNS varie d’un cluster à l’autre et ne fait pas partie du contrat d’API.

Les adresses en TLS passthrough sont fournies dans `service_addresses` au format `host:port`, et les URL HTTPS dans `service_urls`. Les deux listes restent distinctes : un point de terminaison TLS n’apparaît jamais dans `service_urls`.

```python theme={"system"}
for endpoint in sandbox.service_addresses:
    print(endpoint.port, endpoint.name, endpoint.address)
```

Vous devriez obtenir une sortie semblable à celle-ci :

```text theme={"system"}
8443 tls 8443-2f8d41b6-9c3e-4a17-b5d2-7e0a13c64f89.a1b2c3d4.ep2.cwsandbox.com:443
```

Le port annoncé est le port d'écoute TLS de la plateforme, et non le port auquel votre processus se lie dans la sandbox. Dans cet exemple, la charge de travail écoute sur `8443` et les clients se connectent à `443`.

Les deux types d'adresses deviennent lisibles à des moments différents du démarrage de la sandbox :

* **Une adresse TLS passthrough est attribuée dès la création de la sandbox** : elle figure donc dans la réponse de création et reste disponible tant que la sandbox est en cours de création ou d'exécution.
* **Une URL HTTPS reste vide tant que la sandbox n'a pas atteint l'état `RUNNING`** et que sa route n'a pas de nom d'hôte. Appelez `get_status()` en boucle jusqu'à ce que l'URL apparaisse ou que votre propre délai expire.
* **Dans les deux cas, cela ne signifie pas que l'application est prête à servir.** La plateforme n'attend pas que votre processus se lie au port pour signaler que la sandbox est en cours d'exécution : prévoyez donc une nouvelle tentative pour votre première connexion.

La plateforme signale les points de terminaison tant qu'une sandbox est en cours de création ou d'exécution, et les efface dans tous les autres états. Une sandbox en pause ou terminée n'a aucun point de terminaison joignable.

<h2 id="connect-to-a-tls-passthrough-endpoint">
  Se connecter à un point de terminaison TLS passthrough
</h2>

Comme la plateforme ne déchiffre pas la connexion, le certificat reçu par un client est celui que présente votre charge de travail. Cela a deux conséquences pour le client :

* **Envoyez l'hôte du point de terminaison comme nom de serveur SNI.** La plateforme achemine le trafic uniquement en fonction du SNI : une connexion qui l'omet, ou qui transmet un autre nom, n'atteint pas votre sandbox.
* **Faites confiance au certificat de la charge de travail.** Le nom d'hôte du point de terminaison est attribué par la plateforme ; un certificat que vous émettez vous-même ne lui correspond donc pas, sauf si vous l'émettez pour ce nom d'hôte. Configurez le client pour qu'il fasse confiance à votre propre autorité de certification, ou épinglez le certificat.

Le client suivant envoie l'hôte du point de terminaison comme SNI tout en se connectant à l'adresse annoncée. Remplacez `[ENDPOINT-ADDRESS]` par l'adresse lue dans `service_addresses`, et `[PATH-TO-CA-CERT]` par le chemin d'accès à l'autorité de certification qui a signé le certificat de votre charge de travail :

```python theme={"system"}
import socket
import ssl

address = "[ENDPOINT-ADDRESS]"  # host:port provenant de service_addresses
host, port = address.rsplit(":", 1)

context = ssl.create_default_context(cafile="[PATH-TO-CA-CERT]")

with socket.create_connection((host, int(port))) as sock:
    with context.wrap_socket(sock, server_hostname=host) as tls:
        print(tls.version(), tls.getpeercert()["subject"])
```

<h2 id="endpoint-lifetime">
  Durée de vie du point de terminaison
</h2>

Un point de terminaison existe aussi longtemps que la sandbox à laquelle il appartient :

* **Il est lié à la sandbox, et non à un Pod.** Si le Pod sous-jacent redémarre, l’adresse ne change pas.
* **La suppression de la sandbox entraîne celle du point de terminaison.** L’adresse n’est pas transférée vers une autre sandbox, et toute nouvelle sandbox reçoit une nouvelle adresse.
* **Rien n’est réservé d’une sandbox à l’autre.** Vous ne pouvez pas conserver un nom d’hôte pour le réutiliser.

<h2 id="troubleshoot-create-failures">
  Résoudre les échecs de création
</h2>

Si aucun exécuteur de votre flotte ne prend en charge le type de point de terminaison demandé, l’appel de création échoue plutôt que de démarrer une sandbox en abandonnant silencieusement le point de terminaison.

| Motif | Signification |
| - | - |
| `CWSANDBOX_TLS_PASSTHROUGH_ENDPOINTS_NOT_SUPPORTED` | Aucun exécuteur auquel vous avez accès n’est configuré pour le TLS passthrough. Demandez à votre administrateur de l’activer sur un exécuteur. |
| `CWSANDBOX_NO_SUITABLE_RUNNER` | La sandbox déclare les deux types de point de terminaison, mais aucun exécuteur ne prend en charge les deux. Les métadonnées `unsupported_endpoint_kinds` de la réponse indiquent les types manquants. |
| `CWSANDBOX_INVALID_REQUEST` | Une entrée `services` enfreint l’une des règles décrites dans [Déclarer un point de terminaison](#declare-an-endpoint), par exemple un port en double ou un `auth` défini sur un point de terminaison TLS passthrough. |
| `CWSANDBOX_NOT_IMPLEMENTED` | La requête utilise une fonctionnalité non implémentée, comme `auth=TOKEN`. |

<h2 id="related-pages">
  Pages connexes
</h2>

* [Configuration du bac à sable](/fr/products/sandboxes/client/guides/sandbox-configuration) : ressources, ports, secrets et délais d’expiration.

* [Architecture des sandboxes](/fr/products/sandboxes/architecture) : interactions entre les exécuteurs, les profils et le plan de contrôle.

* [Cycle de vie d’une sandbox](/fr/products/sandboxes/client/guides/sandbox-lifecycle) : les différents états par lesquels passe une sandbox.
