+
+
diff --git a/README_FR.md b/README_FR.md
index 40b2eb533..3d28e6a75 100644
--- a/README_FR.md
+++ b/README_FR.md
@@ -92,111 +92,33 @@ Cliquez sur le bouton 'Déployer sur Docker' en haut pour terminer le déploieme
docker run -d -p 18966:18966 --name myip --restart always jason5ng32/myip:latest
```
-## 📚 Variables d'environnement
-
-Les variables marquées **Oui** ci-dessous doivent être définies pour que le backend fonctionne correctement. Les identifiants MaxMind sont particulièrement importants — lisez les notes de configuration ci-dessous avant de remplir le tableau.
-
-### Bases de données MaxMind (requis)
-
-MyIP s'appuie sur les bases **GeoLite2** gratuites de MaxMind (City + ASN) pour la géolocalisation IP, la recherche ASN / organisation, et les badges de code pays qui apparaissent partout dans l'application (cartes IP, candidats ICE WebRTC, etc.). Une configuration MaxMind fonctionnelle est nécessaire pour que le backend offre une expérience complète.
-
-Les fichiers `.mmdb` ne sont **pas inclus dans ce dépôt** car la licence GeoLite2 de MaxMind interdit la redistribution. Vous devez les fournir vous-même. Deux options :
-
-**Option A — Automatique (recommandée, obligatoire pour Docker)**
-
-1. Créez un compte gratuit sur [maxmind.com/en/geolite2/signup](https://www.maxmind.com/en/geolite2/signup).
-2. Générez une clé de licence depuis la page « Manage License Keys » de votre compte.
-3. Définissez ces trois variables d'environnement :
- ```bash
- MAXMIND_ACCOUNT_ID="your-account-id"
- MAXMIND_LICENSE_KEY="your-license-key"
- MAXMIND_AUTO_UPDATE="true"
- ```
-4. Démarrez le backend. Environ 60 secondes après le premier démarrage, l'updater téléchargera les deux bases, puis les rafraîchira automatiquement toutes les 24 heures.
-
-> ⚠️ **Les déploiements Docker doivent utiliser l'option A.** Un conteneur neuf est livré avec un répertoire `common/maxmind-db/` vide — sans les trois variables ci-dessus, le backend démarre mais la source IP basée sur MaxMind et les badges de pays WebRTC ne fonctionneront pas, et vous verrez `MaxMind API will return 503...` dans les journaux à chaque démarrage.
-
-**Option B — Manuelle (environnements isolés ou non-Docker)**
-
-Téléchargez `GeoLite2-City.mmdb` et `GeoLite2-ASN.mmdb` depuis votre compte MaxMind et placez-les dans `common/maxmind-db/` avant de démarrer le backend. Dans ce cas, `MAXMIND_AUTO_UPDATE` peut rester à `"false"`, mais vous devrez rafraîchir les fichiers manuellement à chaque nouvelle version publiée par MaxMind.
-
-### Liste des variables d'environnement
-
-| Nom de la variable | Requis | Valeur par défaut | Description |
-| --- | --- | --- | --- |
-| `MAXMIND_ACCOUNT_ID` | **Oui** | `""` | ID de compte MaxMind, associé à `MAXMIND_LICENSE_KEY` pour télécharger les bases GeoLite2. Voir la section MaxMind ci-dessus. |
-| `MAXMIND_LICENSE_KEY` | **Oui** | `""` | Clé de licence MaxMind, associée à `MAXMIND_ACCOUNT_ID`. Voir la section MaxMind ci-dessus. |
-| `MAXMIND_AUTO_UPDATE` | **Oui** | `"false"` | Définissez sur `"true"` pour télécharger automatiquement les bases GeoLite2 environ 60 s après le démarrage et les rafraîchir toutes les 24 h. **Obligatoire pour Docker.** Peut rester à `"false"` uniquement si vous avez pré-déposé les fichiers `.mmdb` manuellement. |
-| `CAIDA_AUTO_UPDATE` | Non | `"false"` | Définissez sur `"true"` pour rafraîchir quotidiennement les jeux de données CAIDA (as2org pour la résolution du nom d'organisation par ASN, as-rel2 pour le graphe de connectivité ASN). Lorsque `"false"`, les snapshots manquants sont quand même téléchargés au démarrage mais ne sont jamais rafraîchis ensuite. |
-| `VITE_GOOGLE_ANALYTICS_ID` | **Oui** | `""` | Identifiant Google Analytics, utilisé pour l'analyse des utilisateurs |
-| `BACKEND_PORT` | Non | `"11966"` | Le port d'exécution de la partie backend du programme |
-| `FRONTEND_PORT` | Non | `"18966"` | Le port d'exécution de la partie frontend du programme |
-| `SECURITY_RATE_LIMIT` | Non | `"0"` | Contrôle le nombre de requêtes qu'une adresse IP peut faire au serveur backend toutes les 60 minutes (réglé sur 0 pour aucune limite) |
-| `SECURITY_DELAY_AFTER` | Non | `"0"` | Contrôle les premières X requêtes d'une adresse IP toutes les 20 minutes qui ne sont pas soumises à des limites de vitesse, et après X requêtes, le délai augmentera |
-| `SECURITY_BLACKLIST_LOG_FILE_PATH` | Non | `""` | Registre local optionnel des IP limitées (ex. `"logs/blacklist-ip.log"`). Vide = aucun fichier n'est écrit ; l'événement est de toute façon toujours journalisé via le logger partagé |
-| `LOG_LEVEL` | Non | `"info"` | Niveau minimum des journaux (`debug` / `info` / `warn` / `error`). Les messages de niveau inférieur sont supprimés. |
-| `LOG_FORMAT` | Non | pretty | Définir sur `"json"` pour émettre un événement JSON par ligne (agrégateurs de logs / jq). Toute autre valeur (ou non défini) conserve la sortie colorée lisible utilisée en dev et lors du tail des logs pm2. |
-| `LOG_HTTP` | Non | `"false"` | Définir sur `"true"` pour activer la journalisation par requête HTTP sur `/api/*` (méthode, URL, statut, temps de réponse). Désactivé par défaut pour garder les logs pm2 légers. Les erreurs 4xx/5xx côté handler sont toujours loguées, que ce drapeau soit activé ou non. |
-| `VITE_SENTRY_DSN_FRONTEND` | Non | `""` | DSN Sentry du frontend (au moment du build). Si vide, aucun code Sentry n'est inclus dans le bundle. Également lu par le backend à l'exécution comme liste blanche pour `/api/monitoring`, le tunnel first-party qui fait passer les enveloppes Sentry malgré les bloqueurs de publicité. Si vous l'intégrez dans une image Docker auto-construite au moment du build, passez aussi la même valeur au conteneur à l'exécution — sinon la route du tunnel reste désactivée |
-| `SENTRY_DSN_BACKEND` | Non | `""` | DSN Sentry du backend (à l'exécution). Si vide, le SDK Sentry n'est jamais chargé |
-| `SENTRY_ENVIRONMENT` | Non | `"production"` | Étiquette d'environnement des événements Sentry du backend. Définir sur `"development"` sur les machines de développement ; le frontend s'étiquette automatiquement |
-| `SENTRY_ORG` | Non | `""` | Slug de l'organisation Sentry, utilisé avec `SENTRY_PROJECT_FRONTEND` et `SENTRY_AUTH_TOKEN` pour téléverser les source maps au moment du build |
-| `SENTRY_PROJECT_FRONTEND` | Non | `""` | Slug du projet Sentry du frontend, pour le téléversement des source maps au moment du build |
-| `SENTRY_AUTH_TOKEN` | Non | `""` | Jeton Sentry activant le téléversement des source maps au moment du build. Secret de build uniquement — jamais exposé au navigateur |
-| `ALLOWED_DOMAINS` | Non | `""` | Domaines autorisés pour l'accès, séparés par des virgules, utilisés pour empêcher une utilisation abusive de l'API backend |
-| `GOOGLE_MAP_API_KEY` | Non | `""` | Clé API pour Google Maps, utilisée pour afficher l'emplacement de l'adresse IP sur une carte |
-| `IPINFO_API_KEY` | Non | `""` | Jeton API pour IPInfo.io, utilisé pour obtenir des informations de géolocalisation sur l'adresse IP via IPInfo.io |
-| `IPAPIIS_API_KEY` | Non | `""` | Clé API pour IPAPI.is, utilisée pour obtenir des informations de géolocalisation sur l'adresse IP via IPAPI.is |
-| `IP2LOCATION_API_KEY` | Non | `""` | Clé API pour IP2Location.io, utilisée pour obtenir des informations de géolocalisation sur l'adresse IP via IP2Location.io |
-| `CLOUDFLARE_API_KEY` | Non | `""` | Clé API pour Cloudflare, utilisée pour les informations AS ; avec les deux variables KV ci-dessous (et la permission « Workers KV Storage: Edit »), elle alimente aussi le partage de rapports de diagnostic |
-| `CLOUDFLARE_ACCOUNT_ID` | Non | `""` | ID du compte Cloudflare, requis pour stocker les rapports de diagnostic partageables dans Workers KV |
-| `CLOUDFLARE_KV_NAMESPACE_ID` | Non | `""` | ID hexadécimal (pas le nom) de l'espace de noms Workers KV qui stocke les rapports de diagnostic partageables |
-| `RIPESTAT_SOURCE_APP` | Non | `""` | Nom de l'application source pour RIPE.net, utilisé pour obtenir des informations sur l'historique ASN via RIPE.net |
-| `MAC_LOOKUP_API_KEY` | Non | `""` | Clé API pour MAC Lookup, utilisée pour obtenir des informations sur l'adresse MAC via MAC Lookup |
-| `VITE_CURL_IPV4_DOMAIN` | Non | `""` | Fournit aux utilisateurs le domaine IPv4 pour l'API CURL |
-| `VITE_CURL_IPV6_DOMAIN` | Non | `""` | Fournit aux utilisateurs le domaine IPv6 pour l'API CURL |
-| `VITE_CURL_IPV64_DOMAIN` | Non | `""` | Fournit aux utilisateurs le domaine à pile double pour l'API CURL |
-
-Il est à noter que si l'une quelconque des variables d'environnement de la série CURL est manquante, l'API CURL ne sera pas activée.
-
-### Utilisation des variables d'environnement dans un environnement Node
-
-Créez les variables d'environnement :
+## 📖 Documentation
-```bash
-cp .env.example .env
-```
-
-Modifiez le fichier `.env`, et par exemple, ajoutez ce qui suit :
+Les guides complets se trouvent dans le centre de documentation MyIP : **[docs.ipcheck.ing](https://docs.ipcheck.ing)** (sélecteur de langue en haut à droite)
-```bash
-BACKEND_PORT=11966
-FRONTEND_PORT=18966
-MAXMIND_ACCOUNT_ID="YOUR_ACCOUNT_ID"
-MAXMIND_LICENSE_KEY="YOUR_LICENSE_KEY"
-MAXMIND_AUTO_UPDATE="true"
-GOOGLE_MAP_API_KEY="YOUR_KEY_HERE"
-ALLOWED_DOMAINS="example.com,example.org"
-```
+* [Guide du développeur](https://docs.ipcheck.ing/developer) — déploiement, configuration, architecture et contribution
+* [Base de connaissances](https://docs.ipcheck.ing/knowledge-base) — utilisation de chaque outil, diagnostic réseau pas à pas, concepts réseau
-Ensuite, redémarrez le service backend.
+## ⚙️ Configuration
-### Utilisation des variables d'environnement dans Docker
+Deux réglages comptent avant tout :
-Vous pouvez ajouter des variables d'environnement lors de l'exécution de Docker, par exemple :
+* **MaxMind GeoLite2 (requis)** — identifiants gratuits pour la géolocalisation IP et les recherches ASN. Sans eux, la source MaxMind renvoie 503. → [Configuration MaxMind](https://docs.ipcheck.ing/developer/getting-started/maxmind-setup)
+* **`ALLOWED_DOMAINS` (requis sur un vrai domaine)** — liste blanche de noms d'hôte pour l'API backend. Sans elle, toute requête venant d'un domaine autre que localhost reçoit un 403. → [Reverse proxy et domaines](https://docs.ipcheck.ing/developer/getting-started/reverse-proxy-and-domains)
```bash
docker run -d -p 18966:18966 \
-e MAXMIND_ACCOUNT_ID="YOUR_ACCOUNT_ID" \
-e MAXMIND_LICENSE_KEY="YOUR_LICENSE_KEY" \
-e MAXMIND_AUTO_UPDATE="true" \
- -e GOOGLE_MAP_API_KEY="YOUR_KEY_HERE" \
- -e ALLOWED_DOMAINS="example.com,example.org" \
- --name myip \
+ -e ALLOWED_DOMAINS="your-domain.com" \
+ --name myip --restart always \
jason5ng32/myip:latest
-
```
+Tout le reste — clés API optionnelles, sécurité et limitation de débit, journalisation, Sentry, domaines de l'API curl — est documenté dans la [référence des variables d'environnement](https://docs.ipcheck.ing/developer/reference/environment-variables).
+
+
## 👩🏻💻 Utilisation avancée
Si vous utilisez un proxy pour accéder à Internet, envisagez d'ajouter cette règle à votre configuration de proxy (modifiez-la en fonction de votre client). Cette configuration vous permet de vérifier à la fois votre véritable adresse IP et l'adresse IP lorsque vous utilisez le proxy :
@@ -230,4 +152,6 @@ En tant que projet open source, je suis très reconnaissant aux sponsors suivant
+
+
diff --git a/README_RU.md b/README_RU.md
index 5638a7485..460341867 100644
--- a/README_RU.md
+++ b/README_RU.md
@@ -92,111 +92,33 @@ pnpm start
docker run -d -p 18966:18966 --name myip --restart always jason5ng32/myip:latest
```
-## 📚 Переменные окружения
-
-Переменные, отмеченные как **Да**, необходимо задать для корректной работы серверной части. В частности, обязательны учётные данные MaxMind — перед заполнением таблицы прочитайте инструкции в следующем разделе.
-
-### Базы данных MaxMind (обязательно)
-
-MyIP использует бесплатные базы данных **GeoLite2** от MaxMind (City + ASN) для геолокации IP, поиска ASN и организаций, а также отображения значков стран во всём приложении (в карточках IP, кандидатах WebRTC ICE и других местах). Для полноценной работы серверной части требуется настроенный MaxMind.
-
-Файлы `.mmdb` **не включены в репозиторий**, поскольку лицензия MaxMind GeoLite2 запрещает их распространение. Их необходимо получить самостоятельно. Доступны два способа:
-
-**Вариант A — автоматически (рекомендуется, обязателен для Docker)**
-
-1. Создайте бесплатную учётную запись на [maxmind.com/en/geolite2/signup](https://www.maxmind.com/en/geolite2/signup).
-2. Создайте лицензионный ключ на странице «Manage License Keys» своей учётной записи.
-3. Задайте три переменные окружения:
- ```bash
- MAXMIND_ACCOUNT_ID="your-account-id"
- MAXMIND_LICENSE_KEY="your-license-key"
- MAXMIND_AUTO_UPDATE="true"
- ```
-4. Запустите серверную часть. Примерно через 60 секунд после первого запуска модуль обновления загрузит обе базы данных. Затем они будут автоматически обновляться каждые 24 часа.
-
-> ⚠️ **При развёртывании через Docker необходимо использовать вариант A.** Новый контейнер содержит пустой каталог `common/maxmind-db/`. Без трёх указанных переменных сервер запустится, но источник IP-данных MaxMind и значки стран WebRTC работать не будут, а при каждом запуске в журнале будет появляться сообщение `MaxMind API will return 503...`.
-
-**Вариант B — вручную (для изолированных сред и установок без Docker)**
-
-Загрузите `GeoLite2-City.mmdb` и `GeoLite2-ASN.mmdb` из своей учётной записи MaxMind и поместите их в `common/maxmind-db/` до запуска серверной части. При таком способе `MAXMIND_AUTO_UPDATE` может оставаться равной `"false"`, однако новые версии файлов MaxMind придётся загружать вручную.
-
-### Список переменных окружения
-
-| Имя переменной | Обязательно | Значение по умолчанию | Описание |
-| --- | --- | --- | --- |
-| `MAXMIND_ACCOUNT_ID` | **Да** | `""` | Идентификатор учётной записи MaxMind, используемый вместе с `MAXMIND_LICENSE_KEY` для загрузки баз GeoLite2. См. раздел MaxMind выше. |
-| `MAXMIND_LICENSE_KEY` | **Да** | `""` | Лицензионный ключ MaxMind, используемый вместе с `MAXMIND_ACCOUNT_ID`. См. раздел MaxMind выше. |
-| `MAXMIND_AUTO_UPDATE` | **Да** | `"false"` | Установите `"true"`, чтобы автоматически загрузить базы GeoLite2 примерно через 60 секунд после запуска и обновлять их каждые 24 часа. **Обязательно для Docker.** Значение `"false"` допустимо только при ручном предварительном размещении файлов `.mmdb`. |
-| `CAIDA_AUTO_UPDATE` | Нет | `"false"` | Установите `"true"`, чтобы ежедневно обновлять наборы данных CAIDA (as2org для поиска названия организации ASN и as-rel2 для графа связности ASN). При `"false"` отсутствующие снимки всё равно загружаются при запуске, но в дальнейшем не обновляются. |
-| `VITE_GOOGLE_ANALYTICS_ID` | **Да** | `""` | Идентификатор Google Analytics для анализа использования сайта. |
-| `BACKEND_PORT` | Нет | `"11966"` | Порт серверной части приложения. |
-| `FRONTEND_PORT` | Нет | `"18966"` | Порт клиентской части приложения. |
-| `SECURITY_RATE_LIMIT` | Нет | `"0"` | Максимальное количество запросов от одного IP к серверу за 60 минут; `0` отключает ограничение. |
-| `SECURITY_DELAY_AFTER` | Нет | `"0"` | Количество первых запросов от одного IP за 20 минут, для которых не применяется замедление; после превышения задержка увеличивается. |
-| `SECURITY_BLACKLIST_LOG_FILE_PATH` | Нет | `""` | Необязательный файл для записи IP, ограниченных по частоте запросов (например, `"logs/blacklist-ip.log"`). Пустое значение отключает запись в файл; событие в любом случае попадает в общий журнал. |
-| `LOG_LEVEL` | Нет | `"info"` | Минимальный уровень журналирования (`debug` / `info` / `warn` / `error`). Сообщения более низких уровней подавляются. |
-| `LOG_FORMAT` | Нет | pretty | Установите `"json"`, чтобы выводить по одному JSON-событию на строку для систем сбора журналов или jq. Любое другое значение или отсутствие переменной сохраняет цветной формат, используемый при разработке и просмотре журналов pm2. |
-| `LOG_HTTP` | Нет | `"false"` | Установите `"true"`, чтобы включить журналирование HTTP-запросов к `/api/*` (метод, URL, статус и время ответа). По умолчанию отключено, чтобы не перегружать журналы pm2. Ошибки 4xx/5xx обработчиков журналируются независимо от этого параметра. |
-| `VITE_SENTRY_DSN_FRONTEND` | Нет | `""` | DSN Sentry для клиентской части на этапе сборки. При пустом значении код Sentry вообще не включается в пакет. Переменная также используется серверной частью во время выполнения как список разрешённых адресов для `/api/monitoring` — собственного туннеля, передающего пакеты Sentry в обход блокировщиков. Если значение встраивается в самостоятельно собранный Docker-образ, передайте его контейнеру и во время выполнения, иначе маршрут туннеля останется отключённым. |
-| `SENTRY_DSN_BACKEND` | Нет | `""` | DSN Sentry для серверной части во время выполнения. При пустом значении SDK Sentry не загружается. |
-| `SENTRY_ENVIRONMENT` | Нет | `"production"` | Метка окружения в событиях Sentry серверной части. На компьютерах разработчиков используйте `"development"`; клиентская часть определяет окружение автоматически. |
-| `SENTRY_ORG` | Нет | `""` | Slug организации Sentry, используемый вместе с `SENTRY_PROJECT_FRONTEND` и `SENTRY_AUTH_TOKEN` для загрузки карт исходного кода при сборке. |
-| `SENTRY_PROJECT_FRONTEND` | Нет | `""` | Slug проекта клиентской части в Sentry, используемый при загрузке карт исходного кода во время сборки. |
-| `SENTRY_AUTH_TOKEN` | Нет | `""` | Токен Sentry, разрешающий загрузку карт исходного кода во время сборки. Это секрет только для этапа сборки — он никогда не передаётся браузеру. |
-| `ALLOWED_DOMAINS` | Нет | `""` | Разрешённые домены, разделённые запятыми; используются для предотвращения злоупотребления серверным API. |
-| `GOOGLE_MAP_API_KEY` | Нет | `""` | Ключ API Google Maps для отображения местоположения IP на карте. |
-| `IPINFO_API_KEY` | Нет | `""` | Токен API IPInfo.io для получения геолокационных данных IP. |
-| `IPAPIIS_API_KEY` | Нет | `""` | Ключ API IPAPI.is для получения геолокационных данных IP. |
-| `IP2LOCATION_API_KEY` | Нет | `""` | Ключ API IP2Location.io для получения геолокационных данных IP. |
-| `CLOUDFLARE_API_KEY` | Нет | `""` | Ключ API Cloudflare для получения сведений об AS. Вместе с двумя переменными KV ниже и разрешением токена «Workers KV Storage: Edit» он также обеспечивает работу общедоступных диагностических отчётов. |
-| `CLOUDFLARE_ACCOUNT_ID` | Нет | `""` | Идентификатор учётной записи Cloudflare, необходимый для хранения общедоступных диагностических отчётов в Workers KV. |
-| `CLOUDFLARE_KV_NAMESPACE_ID` | Нет | `""` | Шестнадцатеричный идентификатор пространства имён Workers KV (не его название), где хранятся общедоступные диагностические отчёты. |
-| `RIPESTAT_SOURCE_APP` | Нет | `""` | Имя приложения-источника для RIPE.net, используемое для получения истории ASN через RIPE.net. |
-| `MAC_LOOKUP_API_KEY` | Нет | `""` | Ключ API MAC Lookup для получения сведений о MAC-адресах. |
-| `VITE_CURL_IPV4_DOMAIN` | Нет | `""` | Домен IPv4 для CURL API, предоставляемого пользователям. |
-| `VITE_CURL_IPV6_DOMAIN` | Нет | `""` | Домен IPv6 для CURL API, предоставляемого пользователям. |
-| `VITE_CURL_IPV64_DOMAIN` | Нет | `""` | Домен с двойным стеком для CURL API, предоставляемого пользователям. |
-
-Если отсутствует хотя бы одна из переменных окружения серии CURL, соответствующий API не будет включён.
-
-### Использование переменных окружения в Node.js
-
-Создайте файл переменных окружения:
+## 📖 Документация
-```bash
-cp .env.example .env
-```
-
-Измените `.env`, например добавив следующее:
+Полные руководства — в центре документации MyIP: **[docs.ipcheck.ing](https://docs.ipcheck.ing)** (переключатель языка в правом верхнем углу)
-```bash
-BACKEND_PORT=11966
-FRONTEND_PORT=18966
-MAXMIND_ACCOUNT_ID="YOUR_ACCOUNT_ID"
-MAXMIND_LICENSE_KEY="YOUR_LICENSE_KEY"
-MAXMIND_AUTO_UPDATE="true"
-GOOGLE_MAP_API_KEY="YOUR_KEY_HERE"
-ALLOWED_DOMAINS="example.com,example.org"
-```
+* [Руководство разработчика](https://docs.ipcheck.ing/developer) — развёртывание, настройка, архитектура и участие в разработке
+* [База знаний](https://docs.ipcheck.ing/knowledge-base) — как пользоваться каждым инструментом, пошаговая диагностика сети, сетевые концепции
-Затем перезапустите серверную часть.
+## ⚙️ Конфигурация
-### Использование переменных окружения в Docker
+Прежде всего важны две настройки:
-Переменные окружения можно передать при запуске Docker, например:
+* **MaxMind GeoLite2 (обязательно)** — бесплатные учётные данные для геолокации IP и запросов ASN. Без них источник MaxMind возвращает 503. → [Настройка MaxMind](https://docs.ipcheck.ing/developer/getting-started/maxmind-setup)
+* **`ALLOWED_DOMAINS` (обязательно на реальном домене)** — белый список хостов для backend API. Без него любой запрос с домена, отличного от localhost, получает 403. → [Обратный прокси и домены](https://docs.ipcheck.ing/developer/getting-started/reverse-proxy-and-domains)
```bash
docker run -d -p 18966:18966 \
-e MAXMIND_ACCOUNT_ID="YOUR_ACCOUNT_ID" \
-e MAXMIND_LICENSE_KEY="YOUR_LICENSE_KEY" \
-e MAXMIND_AUTO_UPDATE="true" \
- -e GOOGLE_MAP_API_KEY="YOUR_KEY_HERE" \
- -e ALLOWED_DOMAINS="example.com,example.org" \
- --name myip \
+ -e ALLOWED_DOMAINS="your-domain.com" \
+ --name myip --restart always \
jason5ng32/myip:latest
-
```
+Всё остальное — необязательные ключи API, безопасность и ограничение частоты запросов, логирование, Sentry, домены curl API — описано в [справочнике переменных окружения](https://docs.ipcheck.ing/developer/reference/environment-variables).
+
+
## 👩🏻💻 Расширенное использование
Если для доступа в интернет используется прокси, добавьте следующее правило в конфигурацию прокси-клиента, изменив его под своё приложение. Это позволит проверять как настоящий IP-адрес, так и адрес, используемый через прокси:
@@ -230,4 +152,6 @@ DOMAIN,ptest-8.ipcheck.ing,Proxy8
+
+
diff --git a/README_ZH.md b/README_ZH.md
index 3ae698ffc..d9228d0e5 100644
--- a/README_ZH.md
+++ b/README_ZH.md
@@ -92,111 +92,33 @@ pnpm start
docker run -d -p 18966:18966 --name myip --restart always jason5ng32/myip:latest
```
-## 📚 环境变量
-
-下表中标记为 **是** 的变量必须配置,后端才能正常工作。其中 MaxMind 相关的三项尤其重要——填写环境变量之前请先阅读下面的 MaxMind 配置说明。
-
-### MaxMind 数据库(必须配置)
-
-MyIP 依赖 MaxMind 提供的免费 **GeoLite2** 数据库(City + ASN)来进行 IP 地理位置查询、ASN / 组织归属查询,以及全站各处(IP 卡片、WebRTC ICE candidate 等)的国家/地区标识。MaxMind 配置是后端完整运行的前提。
-
-由于 MaxMind GeoLite2 协议不允许再分发,`.mmdb` 文件**没有被包含在本仓库里**,你需要自己准备。有两种做法:
-
-**方案 A —— 自动下载(推荐,Docker 部署必选)**
-
-1. 去 [maxmind.com/en/geolite2/signup](https://www.maxmind.com/en/geolite2/signup) 注册一个免费账号。
-2. 在账号的 "Manage License Keys" 页面生成一个 License Key。
-3. 配置这三个环境变量:
- ```bash
- MAXMIND_ACCOUNT_ID="your-account-id"
- MAXMIND_LICENSE_KEY="your-license-key"
- MAXMIND_AUTO_UPDATE="true"
- ```
-4. 启动后端。首次启动后约 60 秒内,程序会自动下载两个数据库,之后每 24 小时自动检查更新。
-
-> ⚠️ **Docker 部署必须使用方案 A。** 一个全新的容器里 `common/maxmind-db/` 目录是空的——如果不配置这三个变量,后端虽然能起来,但 MaxMind 相关的 IP 查询源和 WebRTC 国家标识将无法工作,并且每次启动日志里都会刷出 `MaxMind API will return 503...` 的报错。
-
-**方案 B —— 手动放置(离线 / 非 Docker 场景)**
-
-从你的 MaxMind 账号下载 `GeoLite2-City.mmdb` 和 `GeoLite2-ASN.mmdb`,在启动后端前手动放入 `common/maxmind-db/` 目录。这种情况下 `MAXMIND_AUTO_UPDATE` 可以保持 `"false"`,但每次 MaxMind 发布新版本时你需要自己手动更新文件。
-
-### 环境变量一览
-
-| 变量名 | 是否必须 | 默认值 | 说明 |
-| --- | --- | --- | --- |
-| `MAXMIND_ACCOUNT_ID` | **是** | `""` | MaxMind 账号 ID,和 `MAXMIND_LICENSE_KEY` 一起用于下载 GeoLite2 数据库。详见上方 MaxMind 配置说明。 |
-| `MAXMIND_LICENSE_KEY` | **是** | `""` | MaxMind License Key,和 `MAXMIND_ACCOUNT_ID` 配合使用。详见上方 MaxMind 配置说明。 |
-| `MAXMIND_AUTO_UPDATE` | **是** | `"false"` | 设置为 `"true"` 时,程序会在启动后 60 秒左右自动下载 GeoLite2 数据库,之后每 24 小时刷新一次。**Docker 部署必须设置为 `"true"`。** 只有当你已经手动放置了 `.mmdb` 文件时,才能保持为 `"false"`。 |
-| `CAIDA_AUTO_UPDATE` | 否 | `"false"` | 设置为 `"true"` 时,每天自动刷新 CAIDA 数据集(as2org 用于 ASN 组织名查询、as-rel2 用于 ASN 连接图)。设置为 `"false"` 时仍会在启动时下载缺失的快照,之后保持不变。 |
-| `VITE_GOOGLE_ANALYTICS_ID` | **是** | `""` | Google Analytics 的 ID,用于统计访问量 |
-| `BACKEND_PORT` | 否 | `"11966"` | 程序后端部分的运行端口 |
-| `FRONTEND_PORT` | 否 | `"18966"` | 程序前端部分的运行端口 |
-| `SECURITY_RATE_LIMIT` | 否 | `"0"` | 控制每 60 分钟一个 IP 可以对后端服务器请求的次数(设置为 0 则为不限制) |
-| `SECURITY_DELAY_AFTER` | 否 | `"0"` | 控制每 20 分钟一个 IP 的前 X 次请求不受速度限制,超过 X 次后会逐次增加延迟 |
-| `SECURITY_BLACKLIST_LOG_FILE_PATH` | 否 | `""` | 可选的本地黑名单文件(如 `"logs/blacklist-ip.log"`),记录触发限流的 IP。留空则不写文件;无论是否设置,事件都会通过共享 logger 记录 |
-| `LOG_LEVEL` | 否 | `"info"` | 日志最低级别(`debug` / `info` / `warn` / `error`),低于该级别的日志会被过滤 |
-| `LOG_FORMAT` | 否 | pretty | 设置为 `"json"` 时每行输出一个 JSON 事件(给日志聚合器 / jq 使用);其它值(或未设置)则使用带颜色的 pretty 格式,适合开发及 pm2 log tail |
-| `LOG_HTTP` | 否 | `"false"` | 设置为 `"true"` 时启用 `/api/*` 的按请求日志(方法、URL、状态码、响应时间)。默认关闭以控制 pm2 日志体积。即使关闭,handler 层的 4xx/5xx 错误日志依然会被记录 |
-| `VITE_SENTRY_DSN_FRONTEND` | 否 | `""` | 前端 Sentry DSN(构建时)。留空则构建产物中完全不包含 Sentry 代码。后端运行时也会读取它,作为 `/api/monitoring`(绕过广告拦截器的第一方转发隧道)的白名单。如果你自建 Docker 镜像并在构建时注入了它,运行容器时也要传入同一个值,否则隧道路由不会启用 |
-| `SENTRY_DSN_BACKEND` | 否 | `""` | 后端 Sentry DSN(运行时)。留空则完全不加载 Sentry SDK |
-| `SENTRY_ENVIRONMENT` | 否 | `"production"` | 后端 Sentry 事件的环境标签。开发机上设为 `"development"`;前端会自动打标签 |
-| `SENTRY_ORG` | 否 | `""` | Sentry 组织 slug,与 `SENTRY_PROJECT_FRONTEND`、`SENTRY_AUTH_TOKEN` 配合,在构建时上传 source map |
-| `SENTRY_PROJECT_FRONTEND` | 否 | `""` | 前端项目的 Sentry 项目 slug,用于构建时上传 source map |
-| `SENTRY_AUTH_TOKEN` | 否 | `""` | 用于构建时上传 source map 的 Sentry 令牌。仅构建时使用的机密,绝不会暴露给浏览器 |
-| `ALLOWED_DOMAINS` | 否 | `""` | 允许访问的域名,用逗号分隔,用于防止后端 API 被滥用 |
-| `GOOGLE_MAP_API_KEY` | 否 | `""` | Google 地图的 API Key,用于展示 IP 所在地的地图 |
-| `IPINFO_API_KEY` | 否 | `""` | IPInfo.io 的 API Token,用于通过 IPInfo.io 获取 IP 归属地信息 |
-| `IPAPIIS_API_KEY` | 否 | `""` | IPAPI.is 的 API Key,用于通过 IPAPI.is 获取 IP 归属地信息 |
-| `IP2LOCATION_API_KEY` | 否 | `""` | IP2Location.io 的 API Key,用于通过 IP2Location.io 获取 IP 归属地信息 |
-| `CLOUDFLARE_API_KEY` | 否 | `""` | Cloudflare 的 API Key,用于获取 AS 系统信息;配合下方两个 KV 变量(token 需追加 "Workers KV Storage: Edit" 权限)还用于诊断报告分享 |
-| `CLOUDFLARE_ACCOUNT_ID` | 否 | `""` | Cloudflare 账号 ID,诊断报告分享(Workers KV 存储)所需 |
-| `CLOUDFLARE_KV_NAMESPACE_ID` | 否 | `""` | 存储诊断分享报告的 Workers KV namespace 的十六进制 ID(不是名字) |
-| `RIPESTAT_SOURCE_APP` | 否 | `""` | RIPE.net 的源应用名称,用于通过 RIPE.net 获取 ASN 的历史信息 |
-| `MAC_LOOKUP_API_KEY` | 否 | `""` | MAC 查询的 API Key,用于通过 MAC Lookup 获取 MAC 地址的归属信息 |
-| `VITE_CURL_IPV4_DOMAIN` | 否 | `""` | 为用户提供 CURL API 的 IPv4 域名 |
-| `VITE_CURL_IPV6_DOMAIN` | 否 | `""` | 为用户提供 CURL API 的 IPv6 域名 |
-| `VITE_CURL_IPV64_DOMAIN` | 否 | `""` | 为用户提供 CURL API 的双网络栈域名 |
-
-需要注意的是,如果 CURL 系列的环境变量任意一个缺失,都不会启用 CURL API。
-
-### 在 Node 环境里使用环境变量
-
-创建环境变量:
+## 📖 官方文档
-```bash
-cp .env.example .env
-```
-
-修改 `.env` 里的内容,比如:
+完整文档在 MyIP 文档中心:**[docs.ipcheck.ing](https://docs.ipcheck.ing)**(右上角可切换中文)
-```bash
-BACKEND_PORT=11966
-FRONTEND_PORT=18966
-MAXMIND_ACCOUNT_ID="YOUR_ACCOUNT_ID"
-MAXMIND_LICENSE_KEY="YOUR_LICENSE_KEY"
-MAXMIND_AUTO_UPDATE="true"
-GOOGLE_MAP_API_KEY="YOUR_KEY_HERE"
-ALLOWED_DOMAINS="example.com,example.org"
-```
+* [开发者指南](https://docs.ipcheck.ing/developer) —— 部署、配置、架构说明与参与贡献
+* [知识库](https://docs.ipcheck.ing/knowledge-base) —— 每个工具的使用说明、网络问题排查指南、网络概念科普
-然后重新启动后端服务。
+## ⚙️ 配置
-### 在 Docker 里使用环境变量
+开始之前,有两项配置最重要:
-你可以在运行 Docker 的时候,添加环境变量,比如:
+* **MaxMind GeoLite2(必须)** —— 免费凭证,为 IP 地理位置与 ASN 查询提供数据。不配置时 MaxMind 数据源会返回 503。→ [MaxMind 配置指南](https://docs.ipcheck.ing/developer/getting-started/maxmind-setup)
+* **`ALLOWED_DOMAINS`(使用真实域名时必须)** —— 后端 API 的域名白名单。不配置时,来自非 localhost 域名的请求都会收到 403。→ [反向代理与域名](https://docs.ipcheck.ing/developer/getting-started/reverse-proxy-and-domains)
```bash
docker run -d -p 18966:18966 \
-e MAXMIND_ACCOUNT_ID="YOUR_ACCOUNT_ID" \
-e MAXMIND_LICENSE_KEY="YOUR_LICENSE_KEY" \
-e MAXMIND_AUTO_UPDATE="true" \
- -e GOOGLE_MAP_API_KEY="YOUR_KEY_HERE" \
- -e ALLOWED_DOMAINS="example.com,example.org" \
- --name myip \
+ -e ALLOWED_DOMAINS="your-domain.com" \
+ --name myip --restart always \
jason5ng32/myip:latest
-
```
+其余全部为可选配置 —— 第三方 API Key、安全与限流、日志、Sentry、CURL API 域名等,详见[环境变量参考](https://docs.ipcheck.ing/developer/reference/environment-variables)。
+
+
## 👩🏻💻 高级用法
如果你在通过代理上网,可以考虑在你的代理配置里,增加下面的规则(请根据你使用的客户端进行修改),这样就可以实现同时查询真实 IP 和代理后的 IP:
@@ -230,4 +152,6 @@ DOMAIN,ptest-8.ipcheck.ing,Proxy8
+
+
diff --git a/api/AGENTS.md b/api/AGENTS.md
index 534ebcd15..2479c8712 100644
--- a/api/AGENTS.md
+++ b/api/AGENTS.md
@@ -14,8 +14,9 @@ services, service-status poller), parts of which the frontend also imports
Roughly one handler file per route: IP-geolocation sources (`ipinfo-io` /
`ipapi-com` / `ipapi-is` / `ip2location-io` / `ip-sb` / `ipcheck-ing` /
`maxmind`), tool backends (`get-whois` / `dns-resolver` / `mac-checker` /
-`cf-radar` / `asn-history` / `asn-connectivity` / `service-status` /
-`google-map` / `github-stars` / `invisibility-test` / `dns-leak-test`), user
+`cf-radar` / `asn-history` / `asn-connectivity` / `ooni-blocking` /
+`globalping-probes` / `service-status` / `google-map` / `github-stars` /
+`invisibility-test` / `dns-leak-test`), user
proxies (`get-user-info` / `update-user-achievement`), platform
(`configs` / `sentry-tunnel` / `share-report`). Each file's header comment
states its route and purpose — read those for specifics.
@@ -27,6 +28,10 @@ states its route and purpose — read those for specifics.
- **Every upstream call uses `fetchUpstream`** from
`common/fetch-with-timeout.js` (8s timeout). Never a bare `fetch()` /
`https.get()` — a hanging provider must time out, not pin the connection.
+ It also injects a default `User-Agent` of `MyIP/v- {{ t('dnsleaktest.EnhancedBanner.Note') }} -
-+ {{ t('globalping.ResultsHint') }} +
+ - -| - # - | -- {{ t('mtrtest.ColHost') }} - | -- {{ t('mtrtest.ColIP') }} - | -- {{ t('mtrtest.ColASN') }} - | -- {{ t('mtrtest.' + col.labelKey) }} - | -
|---|---|---|---|---|
| {{ hop.n }} | -- {{ hop.host }} - {{ t('mtrtest.NoReply') }} - — - | -- {{ hop.ip }} - {{ t('mtrtest.NoReply') }} - — - | -- {{ hop.asn ? 'AS' + hop.asn : '—' }} - | -- {{ formatHopCell(col, hop) }} - | -
| + # + | ++ {{ t('mtrtest.ColHost') }} + | ++ {{ t('mtrtest.ColIP') }} + | ++ {{ t('mtrtest.ColASN') }} + | ++ {{ t('mtrtest.' + col.labelKey) }} + | +
|---|---|---|---|---|
| + {{ hop.n + }} | ++ {{ + hop.host + }} + {{ + t('mtrtest.NoReply') }} + — + | ++ {{ hop.ip }} + {{ + t('mtrtest.NoReply') + }} + — + | ++ {{ hop.asn ? 'AS' + hop.asn : '—' }} + | ++ {{ formatHopCell(col, hop) }} + | +
+ {{ result.rawOutput }}
+
+
+
+ + {{ t('globalping.ResultsHint') }} +
{{ result.rawOutput }}
-
- {{ fullList[currentList].description }}
+
+
+ {{ fullList[currentList].description }}
+
+ {{ note }} +
+