> For the complete documentation index, see [llms.txt](https://docs.ipcheck.ing/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ipcheck.ing/developer/fr/getting-started/reverse-proxy-and-domains.md).

# Proxy inverse et domaines

MyIP sert du HTTP simple sur le port `18966` et ne termine pas TLS. Pour tout déploiement public, placez un proxy inverse devant lui.

## Proxy vers MyIP

Il n'y a rien d'inhabituel à configurer. Pointez votre proxy vers le port `18966` et c'est tout :

* **Aucune gestion de la mise à niveau WebSocket n'est nécessaire.** Le backend de MyIP est en HTTP simple.
* **Aucun `try_files` ou des règles de réécriture SPA.** Le serveur frontend se rabat déjà sur `index.html` pour des routes client comme `/tools/whois`.
* **Aucun `/api` sans cas particulier.** Le même serveur fait le proxy de `/api` vers le backend en interne.
* **N'ajoutez pas de cache au niveau du proxy.** MyIP définit ses propres `Cache-Control` par classe de ressources — les ressources hachées sont immuables pendant un an, `index.html` est revalidé, `/api/*` par défaut `no-store`. Le remplacer servira des pages obsolètes après un déploiement.

{% tabs %}
{% tab title="Nginx" %}
{% code title="/etc/nginx/sites-available/myip" %}

```nginx
server {
    listen 443 ssl http2;
    server_name myip.example.com;

    ssl_certificate     /etc/letsencrypt/live/myip.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/myip.example.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:18966;
        proxy_http_version 1.1;

        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="Caddy" %}
{% code title="Caddyfile" %}

```
myip.example.com {
    reverse_proxy 127.0.0.1:18966
}
```

{% endcode %}

Caddy gère les certificats TLS et définit les `X-Forwarded-*` en-têtes pour vous.
{% endtab %}
{% endtabs %}

### En-têtes importants

Le backend fonctionne avec le `trust proxy` défini sur un saut, et résout l'adresse IP du client dans cet ordre :

1. `CF-Connecting-IP` (Cloudflare)
2. la première entrée de `X-Forwarded-For`
3. `CF-Connecting-IPv6`
4. l'adresse de socket

C'est cette adresse que la limitation de débit et le journal des IP bloquées enregistrent. Si votre proxy ne transmet pas `X-Forwarded-For`, chaque visiteur ressemble à un seul client et les limites de débit s'appliquent à tous ensemble. Voir [Options de sécurité](/developer/fr/configuration/security-options.md).

{% hint style="info" %}
**Taille du corps de la requête.** Les rapports de diagnostic partagés envoient jusqu'à 500 Ko à `/api/report`, et si vous activez le tunnel frontend de Sentry, `/api/monitoring` accepte des enveloppes jusqu'à 10 Mo. Si vous réduisez `client_max_body_size` (la valeur par défaut de Nginx est 1 Mo), gardez-le au-dessus de ces limites.
{% endhint %}

## `ALLOWED_DOMAINS` — requis sur un vrai domaine

Chaque `/api/*` route est derrière une `Referer` vérification. La requête est rejetée avec **403** sauf si le `Referer` nom d'hôte de l'en-tête est `localhost` ou figure dans `ALLOWED_DOMAINS`.

C'est ce qui empêche d'autres sites d'intégrer votre instance et d'utiliser vos clés API et vos limites de débit. C'est aussi l'erreur d'auto-hébergement la plus courante : l'application se charge, puis chaque outil échoue.

{% hint style="danger" %}
Si vous servez MyIP à `https://myip.example.com` et laissez `ALLOWED_DOMAINS` vide, **toute l'API renvoie 403**. La page s'affiche, et rien dessus ne fonctionne.
{% endhint %}

```bash
ALLOWED_DOMAINS="myip.example.com,www.myip.example.com"
```

Comportement exact, pour que vous le fassiez correctement du premier coup :

| Règle               | Détail                                                                                                                      |
| ------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| Séparateur          | Virgule. **Pas d'espaces** — les entrées sont comparées littéralement, et `" b.com"` ne correspond jamais à rien.           |
| Correspondance      | Nom d'hôte exact. `example.com` fait **défiler** autorise `sub.example.com`, et vice versa.                                 |
| `www`               | Un nom d'hôte distinct. Indiquez les deux si les deux sont joignables.                                                      |
| Port et chemin      | Ignorés. `example.com` couvre `https://example.com:8443/anything`.                                                          |
| `localhost`         | Toujours autorisé, quelle que soit votre configuration.                                                                     |
| Adresse IP seule    | Traitée comme un nom d'hôte. Pour accéder à l'application à `http://192.168.1.10:18966`, ajoutez `192.168.1.10` à la liste. |
| Manquant `Referer`  | Rejeté avec `{"error":"Que faites-vous ?"}`.                                                                                |
| Nom d'hôte interdit | Rejeté avec `{"error":"Accès refusé"}`.                                                                                     |

{% hint style="info" %}
Un élément manquant `Referer` entraîne toujours un rejet, c'est pourquoi `curl https://myip.example.com/api/...` renvoie 403 par conception. L'API est destinée au frontend de l'application, pas à un script direct.
{% endhint %}

## Points de terminaison IP compatibles avec curl

MyIP dispose d'un panneau "Command Line API" qui montre aux visiteurs un `curl` one-liner pour vérifier leur IP depuis un terminal. Le `/geo` chemin facultatif ajoute la géolocalisation à la réponse :

```bash
curl 4.example.com
curl 4.example.com/geo
```

Trois variables contrôlent quels noms d'hôte le panneau affiche :

| Variable                 | Entrée du panneau                                    |
| ------------------------ | ---------------------------------------------------- |
| `VITE_CURL_IPV4_DOMAIN`  | Obtenir l'adresse IPv4 de la machine                 |
| `VITE_CURL_IPV6_DOMAIN`  | Obtenir l'adresse IPv6 de la machine                 |
| `VITE_CURL_IPV64_DOMAIN` | Obtenir l'IP de sortie réseau préférée de la machine |

Pointez-les vers des noms d'hôte qui se résolvent en conséquence — uniquement A, uniquement AAAA et double pile.

{% hint style="warning" %}
**Les trois sont requis.** Le frontend n'affiche le panneau curl que lorsque chacun d'eux est défini ; si l'un est vide, la fonctionnalité reste masquée et la boîte de dialogue indique qu'elle n'est pas disponible.
{% endhint %}

{% hint style="warning" %}
**Ce sont des variables de compilation.** Comme toute `VITE_*` variable, elles sont intégrées au bundle JavaScript par Vite. Les transmettre à l'image Docker précompilée au moment de l'exécution ne sert à rien — définissez-les dans `.env` avant `pnpm run build`, ou avant `docker build` sur votre propre image. Voir [Déployer avec Node.js](/developer/fr/getting-started/deploy-with-nodejs.md).
{% endhint %}

{% hint style="info" %}
**MyIP n'implémente pas le `/geo` point de terminaison.** Ces variables indiquent seulement au frontend quels noms d'hôte afficher dans le panneau curl. Le service qui répond à `4.example.com/geo` est quelque chose que vous exécutez séparément. Laissez les variables vides et la fonctionnalité restera simplement désactivée — voir [Fonctionnalités liées à IPCheck.ing](/developer/fr/configuration/features-tied-to-ipcheck-ing.md).
{% endhint %}

## Dépannage

<details>

<summary>La page se charge mais chaque outil affiche une erreur</summary>

Presque toujours `ALLOWED_DOMAINS`. Ouvrez l'onglet réseau de votre navigateur et cherchez des réponses 403 sur `/api/*`. Le corps de la réponse vous indique dans quel cas vous êtes tombé :

* `{"error":"Accès refusé"}` — le nom d'hôte n'est pas dans la liste. Ajoutez le nom d'hôte exact que vous saisissez dans la barre d'adresse.
* `{"error":"Que faites-vous ?"}` — aucun `Referer` n'est parvenu au backend. Vérifiez que votre proxy ou une extension de confidentialité ne le supprime pas.

Redémarrez le backend après avoir modifié `ALLOWED_DOMAINS`.

</details>

<details>

<summary>Les limites de débit se déclenchent pour tout le monde en même temps</summary>

Votre proxy ne transmet pas la véritable IP du client, donc tout le trafic se rabat sur une seule adresse. Ajoutez `X-Forwarded-For` (voir l'exemple Nginx ci-dessus) et redémarrez.

</details>

<details>

<summary>Contenu obsolète après une mise à niveau</summary>

Vérifiez qu'aucun cache n'a été ajouté au niveau du proxy ou du CDN. MyIP définit déjà les `Cache-Control` en-têtes appropriés ; si votre proxy met en cache `index.html` plus longtemps, les visiteurs continuent de charger une version dont les fichiers de ressources n'existent plus.

</details>

## Étapes suivantes

* [Options de sécurité](/developer/fr/configuration/security-options.md) — limitation de débit, ralentissement, journalisation des IP bloquées
* [Variables d'environnement](/developer/fr/reference/environment-variables.md)
* [Points de terminaison de l'API](/developer/fr/reference/api-endpoints.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.ipcheck.ing/developer/fr/getting-started/reverse-proxy-and-domains.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
