> 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/reference/environment-variables.md).

# référence des variables d’environnement

Toutes les variables d’environnement lues par MyIP, leur fonction et leur valeur par défaut.

Voici la liste de référence. Chaque variable ci-dessous est lue quelque part dans le code (`process.env.*` sur le serveur, `import.meta.env.*` dans le bundle du navigateur). Tout ce qui n’est pas listé ici est ignoré.

Copiez `.env.example` vers `.env` pour démarrer :

{% code title="shell" %}

```bash
cp .env.example .env
```

{% endcode %}

`dotenv` charge `.env` depuis la racine du dépôt dans `backend-server.js`, `frontend-server.js`, `server/logger.js`, `sentry-instrument.js`, et `vite.config.js`.

## Compilation ou exécution

MyIP possède deux types de variables, et les confondre est l’erreur de déploiement la plus courante.

| Type        | Préfixe       | Lu par                                                                             | Moment de prise d’effet             |
| ----------- | ------------- | ---------------------------------------------------------------------------------- | ----------------------------------- |
| Exécution   | aucun préfixe | Processus Node.js (`backend-server.js`, `frontend-server.js`, gestionnaires d’API) | Au redémarrage du processus         |
| Compilation | `VITE_`       | Vite, pendant `pnpm run build`                                                     | Uniquement après une reconstruction |

`VITE_*` les valeurs sont **intégrées directement dans le bundle JavaScript** par Vite lors de la compilation. Elles ne sont pas lues depuis l’environnement lorsque l’application s’exécute dans le navigateur. Modifier une variable `VITE_*` et redémarrer le serveur ne fait rien — vous devez reconstruire.

{% hint style="warning" %}
**Implication pour Docker.** L’image officielle `jason5ng32/myip:latest` a été exécutée `pnpm run build` lors de la construction de l’image sans `.env` présent (`.env` est listé dans `.dockerignore`). Passer `-e VITE_CURL_IPV4_DOMAIN=...` à cette image n’a **aucun effet sur le bundle frontend**. Pour utiliser des variables de compilation dans Docker, vous devez construire votre propre image avec les valeurs présentes lors de la compilation.
{% endhint %}

## Toutes les variables en un coup d’œil

Cliquez sur le nom d’une variable pour accéder à sa description complète.

| Variable                                                                  | Par défaut     | Portée                  | Requis                      |
| ------------------------------------------------------------------------- | -------------- | ----------------------- | --------------------------- |
| [MAXMIND\_ACCOUNT\_ID](#maxmind-account-id)                               | `""`           | Exécution               | Fonctionnalités MaxMind     |
| [MAXMIND\_LICENSE\_KEY](#maxmind-license-key)                             | `""`           | Exécution               | Fonctionnalités MaxMind     |
| [DATASET\_AUTO\_UPDATE](#dataset-auto-update)                             | `"true"`       | Exécution               | —                           |
| [DATASET\_UPDATE\_CRON](#dataset-update-cron)                             | `"30 4 * * *"` | Exécution               | —                           |
| [BULK\_LOOKUP\_SOURCE](#bulk-lookup-source)                               | `"maxmind"`    | Exécution               | —                           |
| [BACKEND\_PORT](#backend-port)                                            | `11966`        | Exécution               | —                           |
| [FRONTEND\_PORT](#frontend-port)                                          | `18966`        | Exécution               | —                           |
| [ALLOWED\_DOMAINS](#allowed-domains)                                      | `""`           | Exécution               | Déploiements hors localhost |
| [SECURITY\_RATE\_LIMIT](#security-rate-limit)                             | `0`            | Exécution               | —                           |
| [SECURITY\_DELAY\_AFTER](#security-delay-after)                           | `0`            | Exécution               | —                           |
| [SECURITY\_BLACKLIST\_LOG\_FILE\_PATH](#security-blacklist-log-file-path) | `""`           | Exécution               | —                           |
| [LOG\_LEVEL](#log-level)                                                  | `"info"`       | Exécution               | —                           |
| [LOG\_FORMAT](#log-format)                                                | pretty         | Exécution               | —                           |
| [LOG\_HTTP](#log-http)                                                    | `"false"`      | Exécution               | —                           |
| [VITE\_SENTRY\_DSN\_FRONTEND](#vite-sentry-dsn-frontend)                  | `""`           | Compilation + exécution | —                           |
| [SENTRY\_DSN\_BACKEND](#sentry-dsn-backend)                               | `""`           | Exécution               | —                           |
| [SENTRY\_ENVIRONMENT](#sentry-environment)                                | `"production"` | Exécution + compilation | —                           |
| [SENTRY\_ORG](#sentry-org)                                                | `""`           | Compilation             | —                           |
| [SENTRY\_PROJECT\_FRONTEND](#sentry-project-frontend)                     | `""`           | Compilation             | —                           |
| [SENTRY\_AUTH\_TOKEN](#sentry-auth-token)                                 | `""`           | Compilation             | —                           |
| [GOOGLE\_MAP\_API\_KEY](#google-map-api-key)                              | `""`           | Exécution               | —                           |
| [IPINFO\_API\_KEY](#ipinfo-api-key)                                       | `""`           | Exécution               | —                           |
| [IPAPIIS\_API\_KEY](#ipapiis-api-key)                                     | `""`           | Exécution               | —                           |
| [IP2LOCATION\_API\_KEY](#ip2location-api-key)                             | `""`           | Exécution               | —                           |
| [CLOUDFLARE\_API\_KEY](#cloudflare-api-key)                               | `""`           | Exécution               | Partage de rapports         |
| [RIPESTAT\_SOURCE\_APP](#ripestat-source-app)                             | `"myip"`       | Exécution               | —                           |
| [CLOUDFLARE\_ACCOUNT\_ID](#cloudflare-account-id)                         | `""`           | Exécution               | Partage de rapports         |
| [CLOUDFLARE\_KV\_NAMESPACE\_ID](#cloudflare-kv-namespace-id)              | `""`           | Exécution               | Partage de rapports         |
| [VITE\_CURL\_IPV4\_DOMAIN](#vite-curl-ipv4-domain)                        | `""`           | Compilation             | Les trois ou aucun          |
| [VITE\_CURL\_IPV6\_DOMAIN](#vite-curl-ipv6-domain)                        | `""`           | Compilation             | Les trois ou aucun          |
| [VITE\_CURL\_IPV64\_DOMAIN](#vite-curl-ipv64-domain)                      | `""`           | Compilation             | Les trois ou aucun          |
| [VITE\_SITE\_URL](#vite-site-url)                                         | `""`           | Compilation + exécution | —                           |
| [VITE\_DOCS\_URL](#vite-docs-url)                                         | `""`           | Compilation             | —                           |
| [VITE\_PULSE\_BEACON\_URL](#vite-pulse-beacon-url)                        | `""`           | Compilation             | —                           |
| [VITE\_FESTIVAL\_SKINS](#vite-festival-skins)                             | `"false"`      | Compilation             | —                           |
| [VITE\_GOOGLE\_ANALYTICS\_ID](#vite-google-analytics-id)                  | `""`           | Compilation             | —                           |
| [VITE\_INVISIBILITY\_TEST\_KEY](#vite-invisibility-test-key)              | `""`           | Compilation             | —                           |
| [IPCHECKING\_API\_KEY](#ipchecking-api-key)                               | `""`           | Exécution               | —                           |
| [IPCHECKING\_API\_ENDPOINT](#ipchecking-api-endpoint)                     | `""`           | Exécution               | —                           |

## Requis — MaxMind et jeux de données hors ligne

La propre source de géolocalisation IP de MyIP et les badges de pays dans toute l’interface sont fournis à partir de bases de données locales MaxMind GeoLite2. Sans elles, `GET /api/maxmind` répond **503**, tout comme la requête `POST /api/bulk-lookup`. Voir [Configuration de MaxMind](/developer/fr/getting-started/maxmind-setup.md).

#### `MAXMIND_ACCOUNT_ID` <a href="#maxmind-account-id" id="maxmind-account-id"></a>

Par défaut `""` · Exécution · **Requis pour les fonctionnalités MaxMind**

ID de compte MaxMind. Associé à `MAXMIND_LICENSE_KEY` comme identifiants HTTP Basic lors du téléchargement des bases de données GeoLite2.

#### `MAXMIND_LICENSE_KEY` <a href="#maxmind-license-key" id="maxmind-license-key"></a>

Par défaut `""` · Exécution · **Requis pour les fonctionnalités MaxMind**

Clé de licence MaxMind, générée depuis la page « Manage License Keys » de votre compte.

#### `DATASET_AUTO_UPDATE` <a href="#dataset-auto-update" id="dataset-auto-update"></a>

Par défaut `"true"` · Exécution · Facultatif

Active ou désactive l’actualisation quotidienne de chaque jeu de données hors ligne : les bases de données MaxMind GeoLite2 (uniquement avec les identifiants ci-dessus), as2org de CAIDA pour les noms d’organisation ASN, as-rel2 pour le graphe de connectivité ASN et les décomptes de relations, le miroir CAIDA du dump PeeringDB pour l’outil ASN Profile, et les registres IEEE MAC pour MAC Lookup (aucune clé requise). Seule la valeur exacte `"false"` la désactive. Une actualisation télécharge un jeu de données uniquement si la source distante possède une version plus récente. Le jeu de données PeeringDB n’est récupéré — au démarrage ou lors de l’actualisation — que lorsque [`CLOUDFLARE_API_KEY`](#cloudflare-api-key) est défini, car l’outil qu’il alimente est masqué sans cette clé.

#### `DATASET_UPDATE_CRON` <a href="#dataset-update-cron" id="dataset-update-cron"></a>

Par défaut `"30 4 * * *"` · Exécution · Facultatif

Expression cron pour cette actualisation, selon l’heure locale du serveur — 04:30 chaque jour par défaut. Les jeux de données sont actualisés l’un après l’autre, chacun étant interrompu après 30 minutes. Si le serveur était arrêté lorsqu’une exécution devait avoir lieu, les jeux de données qui l’ont manquée sont rattrapés 60 secondes après le prochain démarrage.

{% hint style="info" %}
`DATASET_AUTO_UPDATE` contrôle **uniquement l’actualisation quotidienne**. Au démarrage, un jeu de données absent, illisible ou laissé à moitié écrit par une mise à jour interrompue est téléchargé dans tous les cas (limité à 5 minutes par jeu de données), donc `"false"` ne laisse jamais un nouveau déploiement sans données.
{% endhint %}

Le backend ne refuse jamais de démarrer en raison de bases de données manquantes. Il écoute immédiatement et télécharge en arrière-plan ; jusqu’à ce qu’un téléchargement aboutisse, les routes qui lisent ce jeu de données répondent `503` (voir [Points de terminaison API](/developer/fr/reference/api-endpoints.md#boot-time-readiness)). Un téléchargement qui échoue laisse ces routes dégradées, et le serveur continue de fonctionner.

#### `BULK_LOOKUP_SOURCE` <a href="#bulk-lookup-source" id="bulk-lookup-source"></a>

Par défaut `"maxmind"` · Exécution · Facultatif

La source de données de l’outil Bulk IP Lookup (`POST /api/bulk-lookup`). Seules les données locales sont admissibles — une requête transporte jusqu’à 200 IP, donc l’outil ne consomme jamais le quota d’une source distante facturée — et `maxmind`, les bases de données locales GeoLite2 ci-dessus, est actuellement la seule valeur. La valeur est nettoyée et insensible à la casse. Une valeur inconnue consigne `⚠️ BULK_LOOKUP_SOURCE inconnu « … » — repli sur maxmind` une fois au démarrage, et l’outil continue de fonctionner avec MaxMind. `GET /api/configs` indique la source active comme `bulkLookupSource`, et l’outil la nomme dans sa note.

## Ports

#### `BACKEND_PORT` <a href="#backend-port" id="backend-port"></a>

Par défaut `11966` · Exécution · Facultatif

Port auquel le serveur API Express s’attache. Également utilisé comme cible de proxy par `frontend-server.js` et par le serveur de développement Vite `/api` proxy.

#### `FRONTEND_PORT` <a href="#frontend-port" id="frontend-port"></a>

Par défaut `18966` · Exécution · Facultatif

Port auquel le serveur statique/SPA s’attache en production, et port du serveur de développement Vite en développement.

Les deux sont analysés avec `parseInt(..., 10)`. Le Dockerfile `EXPOSE`s `18966` uniquement ; le port backend reste interne au conteneur.

## Sécurité

Voir [Options de sécurité](/developer/fr/configuration/security-options.md) et [Proxy inverse et domaines](/developer/fr/getting-started/reverse-proxy-and-domains.md).

#### `ALLOWED_DOMAINS` <a href="#allowed-domains" id="allowed-domains"></a>

Par défaut `""` · Exécution · **Effectivement requis pour les déploiements hors localhost**

Liste blanche de noms d’hôte, séparés par des virgules, pour le contrôle global `Referer` sur `/api/*`. `localhost` est toujours autorisé ; tout le reste doit être listé ici, sinon chaque appel API depuis votre domaine reçoit une erreur 403.

#### `SECURITY_RATE_LIMIT` <a href="#security-rate-limit" id="security-rate-limit"></a>

Par défaut `0` (désactivé) · Exécution · Facultatif

Maximum de `/api/*` requêtes par IP cliente par fenêtre de **20 minutes** . Au-delà de la limite → `429 {"message":"Trop de requêtes"}`. `0` ou non défini désactive entièrement le limiteur.

#### `SECURITY_DELAY_AFTER` <a href="#security-delay-after" id="security-delay-after"></a>

Par défaut `0` (désactivé) · Exécution · Facultatif

Après ce nombre de `/api/*` requêtes provenant d’une même IP dans une fenêtre de **60 minutes** , chaque requête supplémentaire est retardée de `occurrences × 400 ms`. `0` ou non défini le désactive.

#### `SECURITY_BLACKLIST_LOG_FILE_PATH` <a href="#security-blacklist-log-file-path" id="security-blacklist-log-file-path"></a>

Par défaut `""` · Exécution · Facultatif

Registre facultatif sur disque des IP limitées en débit, par exemple `"logs/blacklist-ip.log"`, résolu par rapport à la racine du dépôt. Vide signifie qu’aucun fichier n’est écrit ; l’avertissement `IP limitée en débit` est consigné dans les deux cas.

Notes de comportement, directement issues du code :

* **La correspondance Referer est une correspondance exacte de nom d’hôte.** `ALLOWED_DOMAINS=example.com` n’ **autorise** pas `sub.example.com` — listez chaque nom d’hôte que vous servez.
* Une requête sans **aucun** `Referer` en-tête est rejetée avec `403 {"error":"Que faites-vous ?"}`. Une requête avec un `Referer` non autorisé reçoit `403 {"error":"Accès refusé"}`.
* Les deux limiteurs **ignorent** `/api/monitoring`; le tunnel Sentry possède son propre limiteur fixe (600 requêtes par 20 minutes et par IP).
* Le limiteur de débit ne consigne que le passage à l’état limité, et non chaque requête bloquée.
* `app.set('trust proxy', 1)` est défini, placez donc exactement un proxy de confiance devant. L’IP cliente est résolue à partir de `cf-connecting-ip`, puis `x-forwarded-for` (première entrée), puis `cf-connecting-ipv6`, puis l’adresse socket.

## Journalisation

Voir [Journalisation](/developer/fr/configuration/logging.md).

#### `LOG_LEVEL` <a href="#log-level" id="log-level"></a>

Par défaut `"info"` · Exécution · Facultatif

Niveau pino minimal : `debug` / `info` / `warn` / `error`. Les messages de niveau inférieur sont ignorés — y compris leur duplication vers Sentry.

#### `LOG_FORMAT` <a href="#log-format" id="log-format"></a>

pretty par défaut · Exécution · Facultatif

`"json"` émet un événement JSON par ligne pour les expéditeurs de journaux. Toute autre valeur (ou non définie) utilise une sortie `pino-pretty` colorisée.

#### `LOG_HTTP` <a href="#log-http" id="log-http"></a>

Par défaut `"false"` · Exécution · Facultatif

`"true"` monte `pino-http` sur `/api/*`: une ligne par requête avec la méthode, l’URL et le statut. Monté avant le limiteur de débit, les 429 sont donc également consignées.

## Sentry

Tout est facultatif. Sans DSN défini, aucun SDK Sentry n’est chargé et aucun code Sentry n’est livré dans le bundle. Voir [Surveillance des erreurs (Sentry)](/developer/fr/configuration/error-monitoring.md).

#### `VITE_SENTRY_DSN_FRONTEND` <a href="#vite-sentry-dsn-frontend" id="vite-sentry-dsn-frontend"></a>

Par défaut `""` · Compilation **et** exécution · Facultatif

DSN frontend, intégré au bundle lors de la compilation. **Également lu à l’exécution** par `backend-server.js` — `POST /api/monitoring` (le tunnel d’enveloppes propriétaire) n’est monté que lorsque cette variable est définie sur le processus serveur.

#### `SENTRY_DSN_BACKEND` <a href="#sentry-dsn-backend" id="sentry-dsn-backend"></a>

Par défaut `""` · Exécution · Facultatif

DSN backend, lu par `sentry-instrument.js` (chargé via `node --import`) et par `server/logger.js`, qui duplique les lignes `warn+` vers les journaux Sentry et élève les `error+` en problèmes.

#### `SENTRY_ENVIRONMENT` <a href="#sentry-environment" id="sentry-environment"></a>

Par défaut `"production"` · Exécution + compilation · Facultatif

Balise d’environnement sur les événements Sentry backend. Contrôle également l’envoi des cartes source : les envois ne s’exécutent que lorsque cette variable n’est pas définie ou vaut `production`.

#### `SENTRY_ORG` <a href="#sentry-org" id="sentry-org"></a>

Par défaut `""` · Compilation · Facultatif

Slug d’organisation Sentry pour l’envoi de cartes source lors de la compilation.

#### `SENTRY_PROJECT_FRONTEND` <a href="#sentry-project-frontend" id="sentry-project-frontend"></a>

Par défaut `""` · Compilation · Facultatif

Slug de projet Sentry pour l’envoi de cartes source lors de la compilation.

#### `SENTRY_AUTH_TOKEN` <a href="#sentry-auth-token" id="sentry-auth-token"></a>

Par défaut `""` · Compilation · Facultatif

Jeton d’authentification pour l’envoi de cartes source lors de la compilation. S’il n’est pas défini, Vite ne génère aucune carte source, elles ne sont donc jamais servies publiquement depuis `dist/`. Secret de compilation — jamais exposé au navigateur.

{% hint style="warning" %}
Si vous construisez vous-même une image Docker avec `VITE_SENTRY_DSN_FRONTEND` intégré, transmettez également la même valeur au conteneur à l’exécution. Sinon, le bundle envoie les enveloppes vers `/api/monitoring`, une route que le backend n’a jamais montée, et chaque rapport retourne une erreur 404.
{% endhint %}

## Clés API facultatives

Chaque clé déverrouille une source de données IP ou un outil. `GET /api/configs` indique lesquelles sont définies — uniquement comme booléens, jamais les valeurs — et le frontend masque l’interface correspondante lorsqu’une clé est absente. Voir [Clés API facultatives](/developer/fr/configuration/optional-api-keys.md) et [Sources de données IP](/developer/fr/architecture/ip-data-sources.md).

#### `GOOGLE_MAP_API_KEY` <a href="#google-map-api-key" id="google-map-api-key"></a>

Par défaut `""` · Exécution · Facultatif

Clé Google Static Maps, utilisée par `/api/map`. Accepte une liste séparée par des virgules ; une clé est choisie aléatoirement pour chaque requête.

#### `IPINFO_API_KEY` <a href="#ipinfo-api-key" id="ipinfo-api-key"></a>

Par défaut `""` · Exécution · Facultatif

Jeton ipinfo.io pour `/api/ipinfo`. Liste séparée par des virgules prise en charge. Le point de terminaison fonctionne toujours sans clé, au tarif anonyme d’ipinfo.io.

#### `IPAPIIS_API_KEY` <a href="#ipapiis-api-key" id="ipapiis-api-key"></a>

Par défaut `""` · Exécution · Facultatif

Clé api.ipapi.is pour `/api/ipapiis`. Liste séparée par des virgules prise en charge.

#### `IP2LOCATION_API_KEY` <a href="#ip2location-api-key" id="ip2location-api-key"></a>

Par défaut `""` · Exécution · Facultatif

Clé ip2location.io pour `/api/ip2location`. Liste séparée par des virgules prise en charge.

#### `CLOUDFLARE_API_KEY` <a href="#cloudflare-api-key" id="cloudflare-api-key"></a>

Par défaut `""` · Exécution · **Requis pour le partage de rapports**

Jeton API Cloudflare avec deux rôles : jeton Bearer pour Cloudflare Radar (chaque `?view=` de `/api/cfradar` — le résumé ASN, la liste des préfixes annoncés, la carte thermique de l’activité en ligne par pays et le flux de pannes utilisent tous la même autorisation de lecture Radar, donc aucune vue ne nécessite de portée de jeton supplémentaire), et — avec les deux variables dans [Partage de rapports](#report-sharing-cloudflare-kv) — l’identifiant pour stocker des rapports partageables dans Workers KV. Le rôle KV nécessite en plus l’autorisation **Workers KV Storage: Edit** sur le jeton. Le définir affiche également le panneau **Earth Online** dans la barre de navigation — flux de pannes uniquement, sauf si [`VITE_PULSE_BEACON_URL`](#vite-pulse-beacon-url) ajoute la partie sociale — liste l’outil **ASN Profile** parmi les outils avancés et active le téléchargement du jeu de données PeeringDB (voir [`DATASET_AUTO_UPDATE`](#dataset-auto-update)).

#### `RIPESTAT_SOURCE_APP` <a href="#ripestat-source-app" id="ripestat-source-app"></a>

Par défaut `"myip"` · Exécution · Facultatif

Valeur envoyée comme `sourceapp` paramètre de requête, afin que RIPE puisse attribuer le trafic à votre déploiement.

{% hint style="info" %}
`/api/ipapiis` et `/api/ip2location` construisent leur URL amont en appelant `.split(',')` sur la clé sans vérification de nullité. Lorsque la clé n'est pas définie, le gestionnaire lève une exception et renvoie 500. Le frontend ne les appelle jamais dans cet état, car `/api/configs` indique que la source est indisponible et l'interface utilisateur la masque.
{% endhint %}

## Partage de rapports (Cloudflare KV) <a href="#report-sharing-cloudflare-kv" id="report-sharing-cloudflare-kv"></a>

Les rapports de diagnostic partageables sont stockés dans Cloudflare Workers KV via l'API REST. **Les trois** variables — [`CLOUDFLARE_API_KEY`](#cloudflare-api-key) plus les deux ci-dessous — doivent être définies, sinon `POST /api/report` et `GET /api/report/:id` répondent tous deux `503 {"error":"Le partage de rapports n'est pas configuré"}` et `/api/configs` rapports `reportSharing: false`, ce qui masque l'interface de partage.

#### `CLOUDFLARE_ACCOUNT_ID` <a href="#cloudflare-account-id" id="cloudflare-account-id"></a>

Par défaut `""` · Exécution · **Requis pour le partage de rapports**

Identifiant du compte Cloudflare propriétaire de l'espace de noms KV.

#### `CLOUDFLARE_KV_NAMESPACE_ID` <a href="#cloudflare-kv-namespace-id" id="cloudflare-kv-namespace-id"></a>

Par défaut `""` · Exécution · **Requis pour le partage de rapports**

L' **ID hexadécimal** depuis le tableau de bord — pas son nom affiché.

Contraintes des rapports, dans `common/report-schema.js`: la rétention sélectionnable est de 1, 3 ou 7 jours (toute autre valeur est ramenée à 1 jour), et la charge utile stockée est limitée à 256 Ko (`413` au-delà). La limite du corps JSON d'Express est de 500 Ko, volontairement au-dessus de la limite des rapports.

## API cURL

#### `VITE_CURL_IPV4_DOMAIN` <a href="#vite-curl-ipv4-domain" id="vite-curl-ipv4-domain"></a>

Par défaut `""` · Build · Les trois ou aucun

Nom d'hôte IPv4 uniquement affiché dans la boîte de dialogue de l'API en ligne de commande.

#### `VITE_CURL_IPV6_DOMAIN` <a href="#vite-curl-ipv6-domain" id="vite-curl-ipv6-domain"></a>

Par défaut `""` · Build · Les trois ou aucun

Nom d'hôte IPv6 uniquement.

#### `VITE_CURL_IPV64_DOMAIN` <a href="#vite-curl-ipv64-domain" id="vite-curl-ipv64-domain"></a>

Par défaut `""` · Build · Les trois ou aucun

Nom d'hôte double pile.

{% hint style="warning" %}
Le pied de page affiche l'entrée de l'API en ligne de commande uniquement lorsque **les trois** ne sont pas vides — `curlDomainsHadSet` dans `frontend/store.js` les combine avec un ET logique. En définir un ou deux n'affiche rien. Et comme ce sont `VITE_*`, ils doivent être présents au moment de la compilation.
{% endhint %}

Ces variables ne fournissent que les noms d'hôte affichés aux utilisateurs. MyIP ne fournit pas lui-même ces points de terminaison — vous pointez les enregistrements DNS vers le service d'écho d'adresse IP en texte brut que vous exécutez.

## Divers

#### `VITE_SITE_URL` <a href="#vite-site-url" id="vite-site-url"></a>

Par défaut `""` · Compilation **et** exécution · Facultatif

L'origine absolue de votre déploiement. Au moment de la compilation, elle remplit `__SITE_URL__` dans `index.html` (balises canoniques / OG) ; lorsqu'il est vide, tout ce bloc marqué est supprimé. À l'exécution, il devient le dernier segment de l'amont `User-Agent` (`MyIP/v7.2.0/https://example.com`), ainsi les forks s'identifient auprès des API amont au lieu d'usurper ipcheck.ing. Les slashs terminaux sont supprimés.

#### `VITE_DOCS_URL` <a href="#vite-docs-url" id="vite-docs-url"></a>

Par défaut `""` · Compilation · Facultatif

Origine du site de documentation GitBook qui alimente l'assistant de documentation intégré, par ex. `https://docs.ipcheck.ing`. Les slashs terminaux sont supprimés ; le script d'intégration est chargé depuis `<origin>/~gitbook/embed/script.js` lors de la première utilisation, jamais au chargement de la page.

Lorsqu'il est vide, l'assistant n'est pas du tout inclus dans le bundle. Le point d'entrée de navigation nécessite en outre le déploiement canonique — voir [Fonctionnalités liées à IPCheck.ing](/developer/fr/configuration/features-tied-to-ipcheck-ing.md).

#### `VITE_PULSE_BEACON_URL` <a href="#vite-pulse-beacon-url" id="vite-pulse-beacon-url"></a>

Par défaut `""` · Compilation · Facultatif

URL complète du service d'agrégation derrière la partie sociale de **Earth Online**, le panneau des visiteurs en direct dans la barre de navigation. Les slashs terminaux sont supprimés ; le frontend ajoute `/beacon`, `/status` et `/stats` à celle-ci.

Lorsqu'il est vide — la valeur par défaut dans `.env.example` — les parties sociales sont désactivées : pas de composeur de statut, pas de flux Latest, pas de carte des visiteurs, pas de beacon de visite, pas de section sur la page de confidentialité. Le panneau lui-même ne dépend pas de cette variable : son flux global d'incidents repose sur `GET /api/cfradar?view=outages`, donc l'entrée de navigation et le <kbd>p</kbd> raccourci apparaissent toujours sur tout déploiement avec [`CLOUDFLARE_API_KEY`](#cloudflare-api-key). Le service d'agrégation n'est pas open source, donc définir cette valeur autrement que sur votre propre backend compatible ne sert à rien. Voir [Fonctionnalités liées à IPCheck.ing](/developer/fr/configuration/features-tied-to-ipcheck-ing.md).

#### `VITE_FESTIVAL_SKINS` <a href="#vite-festival-skins" id="vite-festival-skins"></a>

Par défaut `"false"` · Compilation · Facultatif

Active le thème de festival. Seul `"true"` (tronqué, insensible à la casse) l'active ; toute autre valeur, ou le fait de le laisser non défini, le maintient désactivé — la valeur par défaut dans `.env.example`. En tant que `VITE_*` variable, le modifier nécessite une recompilation.

Lorsqu'il est activé, le thème suit les statuts de festival temporaires de **Earth Online** (`frontend/data/pulse-statuses.js`) et utilise la même fenêtre globale que le composeur de statut du panneau — depuis le moment où le premier fuseau horaire entre dans le jour du festival jusqu'à ce que le dernier le quitte, soit environ 50 heures pour un festival d'une journée ; lorsque deux fenêtres se chevauchent, la plus récemment ouverte l'emporte. Pendant qu'un festival se trouve dans sa fenêtre, exactement quatre choses changent : le bouton d'entrée Earth Online affiche l'emoji de ce festival à la place du globe tournant, et — pour les festivals qui ont une habillage (actuellement Halloween, Noël, Nouvel An, Nouvel An lunaire, la Saint-Valentin et l'anniversaire du site) — une petite décoration se place sur le logo, une autre pend sous la barre de navigation, et une guirlande sur toute la largeur s'accroche en haut du pied de page. Rien d'autre sur la page ne change, et il n'y a rien à faire par festival : le thème s'active et se désactive tout seul avec la fenêtre. Les décorations respectent la réduction des animations, et leur code est chargé paresseusement, uniquement lorsqu'un festival est actif. Le remplacement par un emoji nécessite d'abord que l'entrée Earth Online soit visible, ce qui prend [`CLOUDFLARE_API_KEY`](#cloudflare-api-key) ou [`VITE_PULSE_BEACON_URL`](#vite-pulse-beacon-url); les décorations du logo, de la navigation et du pied de page ne le font pas.

#### `VITE_GOOGLE_ANALYTICS_ID` <a href="#vite-google-analytics-id" id="vite-google-analytics-id"></a>

Par défaut `""` · Compilation · Facultatif

Identifiant de mesure Google Analytics. Lorsqu'il est vide, `gtag.js` n'est jamais injecté et la page de confidentialité indique que l'analyse est désactivée. Les auto-hébergeurs devraient le laisser vide.

#### `VITE_INVISIBILITY_TEST_KEY` <a href="#vite-invisibility-test-key" id="vite-invisibility-test-key"></a>

Par défaut `""` · Compilation · Facultatif

Clé transmise en tant que `pdKey` au script tiers de détection de proxy utilisé par le test d'invisibilité. N'a de sens que sur les déploiements qui disposent aussi de `IPCHECKING_API_KEY`. Absent de `.env.example`.

#### `IPCHECKING_API_KEY` <a href="#ipchecking-api-key" id="ipchecking-api-key"></a>

Par défaut `""` · Exécution · Facultatif

Clé API pour l'API compagnon privée d'IPCheck.ing. Conditionne `/api/ipchecking`, `/api/getuserinfo`, `PUT /api/updateuserachievement`, `/api/invisibility`, `/api/dnsleaktest/session/:token`, `/api/ipblocklist`, et `POST /api/persona/evaluate` — sans elle, ces routes renvoient `500 {"error":"La clé API est manquante"}`. Elle conditionne également le `réputation` section de `/api/asn-profile`, qui renvoie `désactivé` au lieu de générer une erreur. Également exposé sous `ipChecking` dans `/api/configs`. Pas dans `.env.example`.

#### `IPCHECKING_API_ENDPOINT` <a href="#ipchecking-api-endpoint" id="ipchecking-api-endpoint"></a>

Par défaut `""` · Exécution · Facultatif

URL de base de cette API compagnon, utilisée conjointement avec `IPCHECKING_API_KEY`. Pas dans `.env.example`.

{% hint style="info" %}
`IPCHECKING_API_KEY` / `IPCHECKING_API_ENDPOINT` et `VITE_INVISIBILITY_TEST_KEY` appartiennent à un service compagnon à code source fermé. Les forks auto-hébergés ne peuvent pas les obtenir, et les fonctionnalités qu'ils conditionnent sont masquées sur les déploiements non-`ipcheck.ing` ipcheck.ing de toute façon. Voir [Fonctionnalités liées à IPCheck.ing](/developer/fr/configuration/features-tied-to-ipcheck-ing.md).
{% endhint %}

## Alias hérités

Deux variables ont été renommées. Les anciennes orthographes sont toujours lues comme solutions de secours afin que les déploiements existants ne perdent pas de fonctionnalités lors de la mise à niveau. Préférez les nouveaux noms.

| Ancien nom         | Nom actuel           | Lire où                                                       |
| ------------------ | -------------------- | ------------------------------------------------------------- |
| `IPINFO_API_TOKEN` | `IPINFO_API_KEY`     | `api/ipinfo-io.js`, `api/configs.js`                          |
| `CLOUDFLARE_API`   | `CLOUDFLARE_API_KEY` | `server/cf-radar.js`, `api/share-report.js`, `api/configs.js` |

L'ordre de résolution est `NEW || OLD` — si les deux sont définis, le nouveau nom l'emporte.

`MAXMIND_AUTO_UPDATE` et `CAIDA_AUTO_UPDATE`, les commutateurs par jeu de données qui [`DATASET_AUTO_UPDATE`](#dataset-auto-update) les ont remplacés, sont toujours pris en compte tant que `DATASET_AUTO_UPDATE` n'est pas définie : `"true"` maintient l'actualisation quotidienne de ce jeu de données activée, toute autre valeur la désactive (`CAIDA_AUTO_UPDATE` couvre as2org, as-rel et PeeringDB). `DATASET_AUTO_UPDATE` définie, elle décide pour chaque jeu de données et les deux sont ignorées.

## Configuration minimale fonctionnelle

{% code title=".env" %}

```bash
BACKEND_PORT=11966
FRONTEND_PORT=18966
ALLOWED_DOMAINS="myip.example.com"
MAXMIND_ACCOUNT_ID="your-account-id"
MAXMIND_LICENSE_KEY="your-license-key"
DATASET_AUTO_UPDATE="true"
```

{% endcode %}

Tout le reste est facultatif et n'ajoute que des sources de données ou des outils. Voir [Démarrage rapide](/developer/fr/getting-started/quickstart.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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.ipcheck.ing/developer/fr/reference/environment-variables.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
