63 63
64| Hôte | Port | Quand requis |64| Hôte | Port | Quand requis |
65| :- | :- | :- |65| :- | :- | :- |
66| `api.github.com` | 443 | Avec ou sans `--use-anthropic-git-proxy`, quand l'image du runner inclut la [GitHub CLI](#github-api-access-with-the-github-cli) et que vous fournissez aux sessions des identifiants github.com, tels qu'un `GH_TOKEN` |
66| `downloads.claude.ai` | 443 | Au moment de l'installation, quand vous installez ou mettez à jour Claude Code sur l'hôte avec l'installateur natif ; le script `install.sh` lui-même est servi depuis `claude.ai`. Au moment de l'exécution de la session, uniquement quand les sessions installent des plugins depuis la place de marché officielle Anthropic. |67| `downloads.claude.ai` | 443 | Au moment de l'installation, quand vous installez ou mettez à jour Claude Code sur l'hôte avec l'installateur natif ; le script `install.sh` lui-même est servi depuis `claude.ai`. Au moment de l'exécution de la session, uniquement quand les sessions installent des plugins depuis la place de marché officielle Anthropic. |
67| `storage.googleapis.com` | 443 | Au moment de l'exécution de la session, pour les comptages d'installation de plugins et les métadonnées affichées dans `/plugin`. |68| `storage.googleapis.com` | 443 | Au moment de l'exécution de la session, pour les comptages d'installation de plugins et les métadonnées affichées dans `/plugin`. |
68| `code.claude.com` et `claude.com` | 443 | Recherches de documentation par l'agent claude-code-guide intégré et demandes WebFetch pré-approuvées pendant les sessions. Bloquer ces hôtes affecte uniquement les recherches de documentation. |69| `code.claude.com` et `claude.com` | 443 | Recherches de documentation par l'agent claude-code-guide intégré et demandes WebFetch pré-approuvées pendant les sessions. Bloquer ces hôtes affecte uniquement les recherches de documentation. |
167 168
168* Le runner définit `GIT_TERMINAL_PROMPT=0`, donc git ne demande pas de nom d'utilisateur ou de mot de passe.169* Le runner définit `GIT_TERMINAL_PROMPT=0`, donc git ne demande pas de nom d'utilisateur ou de mot de passe.
169* Le runner exécute SSH avec `BatchMode=yes`, ajouté à votre `GIT_SSH_COMMAND` si vous en définissez un, donc SSH ne demande pas de phrase de passe ou de confirmation d'hôte.170* Le runner exécute SSH avec `BatchMode=yes`, ajouté à votre `GIT_SSH_COMMAND` si vous en définissez un, donc SSH ne demande pas de phrase de passe ou de confirmation d'hôte.
170* Le runner définit `GCM_INTERACTIVE=never`, donc Git Credential Manager n'ouvre pas de dialogue de connexion.171* Le runner définit `GCM_INTERACTIVE=never`, donc Git Credential Manager n'ouvre pas de dialogue de connexion. Avant la v2.1.229, la préparation du dépôt pouvait rester bloquée sur une invite de Git Credential Manager.
171* Le runner efface `core.askPass`, donc si vous utilisez un helper askpass, définissez-le via la variable d'environnement `GIT_ASKPASS` à la place.172* Le runner efface `core.askPass`, donc si vous utilisez un helper askpass, définissez-le via la variable d'environnement `GIT_ASKPASS` à la place.
172 173
173Si votre hôte git rejette l'identifiant, ou que vous n'en avez pas configuré un, le runner réessaie quelques fois puis échoue la préparation du référentiel quand le référentiel est celui vers lequel la session pousse les résultats. Pour un référentiel que la session lit uniquement, [Troubleshooting](#troubleshooting) couvre quand le runner le saute à la place. Le runner ne transmet pas ces paramètres dans l'environnement de la session.174Si votre hôte git rejette l'identifiant, ou que vous n'en avez pas configuré un, le runner réessaie quelques fois puis échoue la préparation du référentiel quand le référentiel est celui vers lequel la session pousse les résultats. Pour un référentiel que la session lit uniquement, [Troubleshooting](#troubleshooting) couvre quand le runner le saute à la place. Le runner ne transmet pas ces paramètres dans l'environnement de la session.
287* **`jq`** : installez `jq` dans l'image si vous voulez que `--jq` fonctionne288* **`jq`** : installez `jq` dans l'image si vous voulez que `--jq` fonctionne
288* **[`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/fr/env-vars)** : si l'environnement de la session la définit, Claude Code ne fournit pas le `gh` intégré, et la session n'a pas de `gh`289* **[`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`](https://code.claude.com/docs/fr/env-vars)** : si l'environnement de la session la définit, Claude Code ne fournit pas le `gh` intégré, et la session n'a pas de `gh`
289 290
290Lorsque l'image inclut la GitHub CLI, les sessions l'utilisent.291#### Accès à l'API GitHub avec la GitHub CLI
292
293Si l'image de votre runner inclut la GitHub CLI pour que les sessions l'utilisent, faites en sorte que votre [script wrapper](https://code.claude.com/docs/fr/self-hosted-environments-configuration.md#provision-credentials-scoped-to-the-session-creator) crée, pour chaque session, un `GH_TOKEN` de courte durée et à portée minimale pour le créateur de la session. Lorsque `gh` se trouve dans le `PATH` avec lequel Claude Code démarre, la session dispose de ce `gh` et d'aucun [`gh` intégré](#github-api-access-without-the-github-cli). Avec le jeton, ce `gh` atteint GitHub avec l'accès que le jeton accorde, en dehors de git géré par Anthropic ; autorisez donc [`api.github.com`](#network-requirements).
294
295Avec git géré par Anthropic, n'incluez pas la GitHub CLI dans l'image afin d'utiliser le `gh` intégré à la place.
291 296
292#### Faire confiance à une autorité de certification privée avec git géré par Anthropic297#### Faire confiance à une autorité de certification privée avec git géré par Anthropic
293 298
343 348
344La réécriture d'hôte s'exécute en premier, donc listez le nom d'hôte interne dans `--git-ssh-rewrite` si vous avez besoin des deux. Pour un contrôle complet du checkout, utilisez un [hook de cycle de vie `checkout`](https://code.claude.com/docs/fr/self-hosted-environments-configuration#checkout).349La réécriture d'hôte s'exécute en premier, donc listez le nom d'hôte interne dans `--git-ssh-rewrite` si vous avez besoin des deux. Pour un contrôle complet du checkout, utilisez un [hook de cycle de vie `checkout`](https://code.claude.com/docs/fr/self-hosted-environments-configuration#checkout).
345 350
351### Démarrer une session sur un dépôt hors de GitHub
352
353Pour exécuter une session sur un dépôt provenant d'un hôte git autre que GitHub, démarrez la session depuis votre terminal, dans un checkout de ce dépôt. Vérifiez d'abord les identifiants git du runner, le réseau et le proxy git, l'adresse du dépôt et votre branche :
354
355* **Identifiants git et réseau** : [fournissez des identifiants](#ship-git-config-in-your-image) qui [fonctionnent sans invite](#git-must-work-without-a-prompt) pour `https://<host>/<owner>/<name>`, l'adresse que le runner clone, et permettez au runner d'atteindre votre hôte git, comme l'indique [Exigences réseau](#network-requirements). Pour un hôte git qui n'accepte que SSH, consultez [`--git-ssh-rewrite`](#rewrite-git-urls-for-private-networks).
356* **Proxy git** : si les runners de l'environnement utilisent le proxy git Anthropic, [désactivez-le](#turn-the-anthropic-git-proxy-off).
357* **Adresse du dépôt** : vérifiez le remote `origin` du checkout. Son hôte doit être un nom de domaine comme `git.example.com`, et son chemin doit avoir la forme `<owner>/<name>`. Un chemin imbriqué comme `group/subgroup/name` n'est pas accepté.
358* **Branche** : poussez la branche sur laquelle vous vous trouvez vers votre hôte git, car le runner clone cette branche.
359
360Dans le checkout, en étant connecté à claude.ai comme le décrit [S'authentifier depuis la CI](https://code.claude.com/docs/fr/self-hosted-environments-testing.md#authenticate-from-ci), exécutez `claude -p` avec [`--environment`](https://code.claude.com/docs/fr/self-hosted-environments-testing#run-the-test-loop) et l'identifiant `ccpool_...` de votre environnement :
361
362```bash theme={null}
363claude -p "Fix the login bug" --environment ccpool_abc123 --output-format json
364```
365
366Lorsque la session est créée, la commande affiche une ligne de JSON qui commence par `{"ok":true`. Si le remote `origin` ne convient pas, la commande échoue avec `requires a git source, but no GitHub remote was detected`.
367
368Examinez et fusionnez sur votre hôte git les branches que les sessions [poussent](https://code.claude.com/docs/fr/self-hosted-environments-configuration.md#prompt-sessions-to-push-their-work).
369
346## Construire l'image du runner370## Construire l'image du runner
347 371
348Anthropic ne publie pas d'image runner pré-construite. Construisez la vôtre autour du binaire `claude`, en superposant la chaîne d'outils que vos référentiels ont besoin : runtimes de langage, compilateurs, gestionnaires de paquets, et sidecars [MCP](https://code.claude.com/docs/fr/mcp.md).372Anthropic ne publie pas d'image runner pré-construite. Construisez la vôtre autour du binaire `claude`, en superposant la chaîne d'outils que vos référentiels ont besoin : runtimes de langage, compilateurs, gestionnaires de paquets, et sidecars [MCP](https://code.claude.com/docs/fr/mcp.md).
617 641
618### Laisser les tours en cours se terminer avant un redémarrage642### Laisser les tours en cours se terminer avant un redémarrage
619 643
620Pour laisser les tours en cours se terminer avant un redémarrage progressif, définissez `--drain-wait-sec` et augmentez votre délai d'arrêt à au moins cette attente plus 80 secondes. Avec l'attente par défaut de `0`, un redémarrage interrompt tout tour encore en cours, et la session reprend sur un autre runner sans son [travail non poussé](#additional-limitations).644Pour laisser les tours en cours se terminer avant un redémarrage progressif, définissez `--drain-wait-sec` et augmentez votre délai d'arrêt à au moins cette attente plus 80 secondes. Avec l'attente par défaut de `0`, un redémarrage interrompt tout tour encore en cours, et la session reprend sur un autre runner sans son [travail non poussé](#resumed-sessions-lose-unpushed-work).
621 645
622* **`--drain-wait-sec`** : à peu près la durée des tours et des tâches en arrière-plan que vous voulez laisser se terminer. Il s'agit d'un maximum : l'attente prend fin plus tôt s'ils se terminent avant.646* **`--drain-wait-sec`** : à peu près la durée des tours et des tâches en arrière-plan que vous voulez laisser se terminer. Il s'agit d'un maximum : l'attente prend fin plus tôt s'ils se terminent avant.
623* **Votre délai d'arrêt** : `terminationGracePeriodSeconds` dans Kubernetes, `stop_grace_period` dans Docker Compose. Par exemple, avec `--drain-wait-sec 120`, remplacez le `90` dans la recette [Kubernetes](#kubernetes) ou [Docker Compose](#docker-compose) par `200`.647* **Votre délai d'arrêt** : `terminationGracePeriodSeconds` dans Kubernetes, `stop_grace_period` dans Docker Compose. Par exemple, avec `--drain-wait-sec 120`, remplacez le `90` dans la recette [Kubernetes](#kubernetes) ou [Docker Compose](#docker-compose) par `200`.
735 759
736Pour libérer les sessions inactives, démarrez chaque runner avec [`--release-idle-session-min`](https://code.claude.com/docs/fr/self-hosted-environments-reference#runner-cli-flags) suivi de cette durée en minutes, par exemple `--release-idle-session-min 30`. Le runner libère alors toute session qui reste inactive aussi longtemps, qu'elle ait été démarrée par une tâche planifiée ou par une personne, sauf si vous la [retenez pour les processus qu'elle a laissés en cours d'exécution](#keep-an-idle-session-while-its-processes-run).760Pour libérer les sessions inactives, démarrez chaque runner avec [`--release-idle-session-min`](https://code.claude.com/docs/fr/self-hosted-environments-reference#runner-cli-flags) suivi de cette durée en minutes, par exemple `--release-idle-session-min 30`. Le runner libère alors toute session qui reste inactive aussi longtemps, qu'elle ait été démarrée par une tâche planifiée ou par une personne, sauf si vous la [retenez pour les processus qu'elle a laissés en cours d'exécution](#keep-an-idle-session-while-its-processes-run).
737 761
738* **Travail non poussé** : une session libérée reprend à son prochain message, sans le travail qu'elle n'avait pas poussé. Pour conserver ses commits, consultez [Les sessions reprises perdent le travail non poussé](#additional-limitations).762* **Travail non poussé** : une session libérée reprend à son prochain message, sans le travail qu'elle n'avait pas poussé. Pour conserver ses commits, consultez [Les sessions reprises perdent le travail non poussé](#resumed-sessions-lose-unpushed-work).
739* **Arrêt du runner** : un runner qui libère sa dernière session entame un [arrêt normal](#when-the-runner-exits). Faites-le redémarrer par votre superviseur sur un système de fichiers vierge, comme le décrit [Renforcer votre déploiement](#harden-your-deployment).763* **Arrêt du runner** : un runner qui libère sa dernière session entame un [arrêt normal](#when-the-runner-exits). Faites-le redémarrer par votre superviseur sur un système de fichiers vierge, comme le décrit [Renforcer votre déploiement](#harden-your-deployment).
740* **Sessions qui ne deviennent jamais inactives** : définissez également [`--kill-session-after-min`](https://code.claude.com/docs/fr/self-hosted-environments-reference#runner-cli-flags), car [certaines sessions ne comptent pas comme inactives](#some-sessions-don’t-count-as-idle)764* **Sessions qui ne deviennent jamais inactives** : définissez également [`--kill-session-after-min`](https://code.claude.com/docs/fr/self-hosted-environments-reference#runner-cli-flags), car [certaines sessions ne comptent pas comme inactives](#some-sessions-don’t-count-as-idle)
741 765
811* Si un tour est toujours en cours d'exécution, le runner attend que le tour se termine, ou que la session attende ensuite son utilisateur, puis la libère.835* Si un tour est toujours en cours d'exécution, le runner attend que le tour se termine, ou que la session attende ensuite son utilisateur, puis la libère.
812* Si la session est toujours sur le runner quand la fenêtre de grâce se termine, le runner la termine, et tout travail du tour en cours d'exécution est perdu. Un tour attendant une approbation demandée de l'intérieur d'un appel d'outil en cours d'exécution est une façon pour une session de dépasser la fenêtre.836* Si la session est toujours sur le runner quand la fenêtre de grâce se termine, le runner la termine, et tout travail du tour en cours d'exécution est perdu. Un tour attendant une approbation demandée de l'intérieur d'un appel d'outil en cours d'exécution est une façon pour une session de dépasser la fenêtre.
813 837
814Une session libérée reprend à partir d'un clone frais, donc le travail qu'elle n'avait pas poussé est parti de toute façon ; consultez [Les sessions reprises perdent le travail non poussé](#additional-limitations). Avant v2.1.260, le runner terminait chaque session à la limite, après avoir attendu au maximum la fenêtre de grâce pour qu'un tour en cours d'exécution se termine.838Une session libérée reprend à partir d'un clone frais, donc le travail qu'elle n'avait pas poussé est parti de toute façon ; consultez [Les sessions reprises perdent le travail non poussé](#resumed-sessions-lose-unpushed-work). Avant v2.1.260, le runner terminait chaque session à la limite, après avoir attendu au maximum la fenêtre de grâce pour qu'un tour en cours d'exécution se termine.
815 839
816Définissez le drapeau au-dessus de votre session la plus longue attendue, comme `--kill-session-after-min 480` pour 8 heures. Pour libérer les emplacements des conversations qui deviennent inactives, utilisez `--release-idle-session-min` à la place.840Définissez le drapeau au-dessus de votre session la plus longue attendue, comme `--kill-session-after-min 480` pour 8 heures. Pour libérer les emplacements des conversations qui deviennent inactives, utilisez `--release-idle-session-min` à la place.
817 841
842### Les sessions reprises perdent le travail non poussé
843
844Une session qui reprend sur un nouveau runner perd le travail qu'elle n'avait pas poussé, car ce runner clone à nouveau le dépôt à partir de sa branche de démarrage.
845
846Pour conserver le travail commité, définissez [`--push-outcome-on-release`](https://code.claude.com/docs/fr/self-hosted-environments-reference#runner-cli-flags) sur chaque runner de l'environnement. Un runner avec ce flag effectue, dans la mesure du possible, un push des branches de résultat de la session avant de la libérer, et la session reprise démarre à partir de ces commits. Un runner sans ce flag reprend la session à partir de sa branche de démarrage. Le push utilise les propres identifiants git de l'hôte runner, y compris sur un runner qui utilise [git géré par Anthropic](#use-the-anthropic-git-proxy).
847
848> [!WARNING]
849>
850> Avant de définir le flag, limitez qui peut pousser vers les refs `claude/*` sur le dépôt distant source. À la reprise, le runner récupère la branche précédemment poussée sans vérifier qui l'a poussée.
851
852Même avec le flag défini, sauvegardez ce travail d'une autre manière :
853
854* **Modifications non commitées** : elles sont toujours perdues. Consultez [Demander aux sessions de pousser leur travail](https://code.claude.com/docs/fr/self-hosted-environments-configuration.md#prompt-sessions-to-push-their-work).
855* **Dépôts extraits via un [hook de cycle de vie `checkout`](https://code.claude.com/docs/fr/self-hosted-environments-configuration#checkout)** : ils ne font pas l'objet d'un push. Créez un instantané de ces dépôts à partir du [hook `post-session`](https://code.claude.com/docs/fr/self-hosted-environments-configuration#post-session).
856* **Commits dans une session que quelqu'un archive ou supprime, ou dont le runner est libéré depuis le menu de la session** : ne comptez pas sur le push du flag. Pour les sauvegarder, poussez `HEAD` vers une branche de secours à partir d'un [hook `post-session`](https://code.claude.com/docs/fr/self-hosted-environments-configuration#post-session). L'exemple qui s'y trouve ne pousse qu'après un commit d'instantané, donc faites en sorte que le vôtre pousse même lorsqu'il n'y a aucune modification non commitée.
857
818### Limitations supplémentaires858### Limitations supplémentaires
819 859
820* **Les sessions reprises perdent le travail non poussé** : un nouveau runner clone à nouveau le dépôt à partir de sa branche de démarrage, donc le travail que la session n'avait pas poussé est perdu.
821 * **Pour conserver le travail commité** : définissez [`--push-outcome-on-release`](https://code.claude.com/docs/fr/self-hosted-environments-reference#runner-cli-flags) sur chaque runner de l'environnement, car un runner sans ce flag reprend la session à partir de sa branche de démarrage. Un runner avec ce flag effectue, dans la mesure du possible, un push des branches de résultat de la session avant de la libérer, et la session reprise démarre à partir de ces commits. Le push utilise les propres identifiants git de l'hôte runner, y compris sur un runner qui utilise [git géré par Anthropic](#use-the-anthropic-git-proxy).
822 * **Avec un hook `checkout`** : les dépôts extraits via un [hook de cycle de vie `checkout`](https://code.claude.com/docs/fr/self-hosted-environments-configuration#checkout) ne font pas l'objet d'un push. Créez plutôt un instantané de ces dépôts à partir du [hook `post-session`](https://code.claude.com/docs/fr/self-hosted-environments-configuration#post-session).
823 * **Avant d'activer le flag** : limitez qui peut pousser vers les refs `claude/*` sur le dépôt distant source. À la reprise, le runner récupère la branche précédemment poussée sans vérifier qui l'a poussée.
824 * **Les modifications non commitées sont toujours perdues** : pour demander à Claude de créer un commit et de pousser lorsqu'il a fini de répondre, consultez [Demander aux sessions de pousser leur travail](https://code.claude.com/docs/fr/self-hosted-environments-configuration.md#prompt-sessions-to-push-their-work)
825* **Une commande interrompue par la perte d'un runner peut s'exécuter à nouveau** : lorsque la session reprend sur un autre runner, Claude voit l'appel d'outil interrompu avec un résultat indiquant que son issue est inconnue.860* **Une commande interrompue par la perte d'un runner peut s'exécuter à nouveau** : lorsque la session reprend sur un autre runner, Claude voit l'appel d'outil interrompu avec un résultat indiquant que son issue est inconnue.
826* **Le clonage d'un dépôt ajouté en milieu de session peut échouer** : Claude le clone avec `git clone` via HTTPS. Sur un runner sans [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), le clonage échoue avec une erreur d'authentification git si rien sur l'hôte ne peut lire le dépôt. Dans la mesure du possible, sélectionnez chaque dépôt dont la session a besoin quand vous la créez.861* **Le clonage d'un dépôt ajouté en milieu de session peut échouer** : Claude le clone avec `git clone` via HTTPS. Sur un runner sans [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), le clonage échoue avec une erreur d'authentification git si rien sur l'hôte ne peut lire le dépôt. Dans la mesure du possible, sélectionnez chaque dépôt dont la session a besoin quand vous la créez.
827 * **Lorsque la session reprend** : un [hook `checkout`](https://code.claude.com/docs/fr/self-hosted-environments-configuration#checkout) s'exécute également pour le dépôt ajouté, avec [`CLAUDE_RUNNER_REPO_REF`](https://code.claude.com/docs/fr/self-hosted-environments-configuration#checkout) vide, donc faites en sorte que votre hook gère ce cas.862 * **Lorsque la session reprend** : un [hook `checkout`](https://code.claude.com/docs/fr/self-hosted-environments-configuration#checkout) s'exécute également pour le dépôt ajouté, avec [`CLAUDE_RUNNER_REPO_REF`](https://code.claude.com/docs/fr/self-hosted-environments-configuration#checkout) vide, donc faites en sorte que votre hook gère ce cas.
828* **Certains connecteurs n'apparaissent pas dans les sessions auto-hébergées** : un connecteur que vous n'avez pas encore connecté dans les paramètres claude.ai n'est pas listé dans une session auto-hébergée, et la session ne vous invitera pas à le connecter. Connectez-le d'abord dans les paramètres, puis démarrez une session fraîche. Ajouter un connecteur à une session déjà en cours d'exécution ne rend pas non plus ses outils disponibles à Claude ; démarrez une session fraîche pour récupérer un connecteur nouvellement ajouté.863* **Certains connecteurs n'apparaissent pas dans les sessions auto-hébergées** : un connecteur que vous n'avez pas encore connecté dans les paramètres claude.ai n'est pas listé dans une session auto-hébergée, et la session ne vous invitera pas à le connecter. Connectez-le d'abord dans les paramètres, puis démarrez une session fraîche. Ajouter un connecteur à une session déjà en cours d'exécution ne rend pas non plus ses outils disponibles à Claude ; démarrez une session fraîche pour récupérer un connecteur nouvellement ajouté.
829* **Quand quelqu'un archive ou supprime une session, ou libère son runner depuis le menu de la session** : ne comptez pas sur le push de [`--push-outcome-on-release`](https://code.claude.com/docs/fr/self-hosted-environments-reference#runner-cli-flags). Pour sauvegarder les commits dans ces cas, poussez `HEAD` vers une branche de secours à partir d'un [hook `post-session`](https://code.claude.com/docs/fr/self-hosted-environments-configuration#post-session). Si vous partez de l'exemple qui s'y trouve, faites-le pousser même lorsqu'il n'y a aucune modification non commitée, car il ne pousse qu'après un commit d'instantané.
830 864
831### Signaler un problème865### Signaler un problème
832 866