> 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/ru/getting-started/deploy-with-docker.md).

# Развертывание с Docker

Docker — рекомендуемый способ развернуть MyIP у себя. Один образ содержит обе части приложения: собранный Vue-фронтенд и бэкенд на Express.

## Образы

| Реестр          | Образ                            |
| --------------- | -------------------------------- |
| Docker Hub      | `jason5ng32/myip:latest`         |
| GitHub Packages | `ghcr.io/jason5ng32/myip:latest` |

Оба собираются из одного и того же релиза и публикуются для `linux/amd64` и `linux/arm64`. Каждый релиз также получает тег версии наряду с `:latest` — закрепите за одним, если вам нужны воспроизводимые обновления.

## Запустите его

{% tabs %}
{% tab title="docker run" %}
{% code title="docker run" %}

```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 ALLOWED_DOMAINS="myip.example.com" \
  -e CAIDA_AUTO_UPDATE="true" \
  -e GOOGLE_MAP_API_KEY="your-key" \
  -e IPINFO_API_KEY="your-key" \
  -e SECURITY_RATE_LIMIT="500" \
  -e LOG_LEVEL="info" \
  --name myip \
  --restart always \
  jason5ng32/myip:latest
```

{% endcode %}
{% endtab %}

{% tab title="Docker Compose" %}
{% code title="compose.yaml" %}

```yaml
services:
  myip:
    image: jason5ng32/myip:latest
    container_name: myip
    restart: always
    ports:
      - "18966:18966"
    environment:
      # Обязательно — см. настройку MaxMind
      MAXMIND_ACCOUNT_ID: "your-account-id"
      MAXMIND_LICENSE_KEY: "your-license-key"
      MAXMIND_AUTO_UPDATE: "true"
      # Обязательно после того, как вы начнёте обслуживать MyIP на домене
      ALLOWED_DOMAINS: "myip.example.com"
      # Необязательно
      CAIDA_AUTO_UPDATE: "true"
      GOOGLE_MAP_API_KEY: "your-key"
      IPINFO_API_KEY: "your-key"
      SECURITY_RATE_LIMIT: "500"
      LOG_LEVEL: "info"
```

{% endcode %}

Запустите его с помощью `docker compose up -d`.
{% endtab %}
{% endtabs %}

Только `MAXMIND_ACCOUNT_ID`, `MAXMIND_LICENSE_KEY` и `MAXMIND_AUTO_UPDATE` нужны, чтобы получить рабочий экземпляр. Всё остальное выше необязательно — полный список находится в [Переменные окружения](/developer/ru/reference/environment-variables.md).

{% hint style="info" %}
Предпочитайте env-файл встроенным секретам: поместите переменные в `.env` рядом с файлом compose, и Compose подхватит их, либо передайте `--env-file .env` к `docker run`.
{% endhint %}

## Порты

В контейнере запущены два процесса Node:

| Процесс                                                            | Порт                      | Опубликовано? |
| ------------------------------------------------------------------ | ------------------------- | ------------- |
| Фронтенд — обслуживает собранное SPA и проксирует `/api` к бэкенду | `18966` (`FRONTEND_PORT`) | Да            |
| Бэкенд — API на Express                                            | `11966` (`BACKEND_PORT`)  | Нет           |

Фронтенд проксирует `/api` к `http://localhost:<BACKEND_PORT>` **внутри контейнера**, поэтому вы никогда не публикуете порт бэкенда. Только `18966` открыт образом.

Чтобы обслуживать MyIP на другом хост-порту, измените левую часть сопоставления:

```bash
-p 8080:18966
```

Если вы измените `FRONTEND_PORT`, измените правую часть сопоставления соответственно.

## `VITE_*` переменные не работают в предварительно собранном образе

Переменные, имя которых начинается с `VITE_` считываются Vite во время **сборки** и встраиваются в JavaScript-бандл. Опубликованный образ собирается в CI без `.env` файла, поэтому передача их с помощью `-e` во время выполнения не влияет на фронтенд.

Это относится к `VITE_CURL_IPV4_DOMAIN`, `VITE_CURL_IPV6_DOMAIN`, `VITE_CURL_IPV64_DOMAIN`, `VITE_GOOGLE_ANALYTICS_ID`, `VITE_SITE_URL` и `VITE_SENTRY_DSN_FRONTEND`. Чтобы задать их, нужно собрать свой образ (или использовать [Развертывание с Node.js](/developer/ru/getting-started/deploy-with-nodejs.md)):

```bash
git clone https://github.com/jason5ng32/MyIP.git
cd MyIP
cp .env.example .env   # заполните значения VITE_*
docker build -t myip-custom .
```

{% hint style="info" %}
`VITE_SENTRY_DSN_FRONTEND` является исключением: бэкенд тоже читает его **во время выполнения** чтобы решить, монтировать ли `/api/monitoring` туннель. Если вы встроите его на этапе сборки, передавайте то же значение контейнеру и во время выполнения. См. [Мониторинг ошибок](/developer/ru/configuration/error-monitoring.md).
{% endhint %}

## Где хранятся данные

MyIP загружает несколько наборов данных во время выполнения. Они находятся **внутри контейнера**, в `/app/common/`:

| Путь                      | Содержимое                                                                                  |
| ------------------------- | ------------------------------------------------------------------------------------------- |
| `/app/common/maxmind-db/` | `GeoLite2-City.mmdb`, `GeoLite2-ASN.mmdb`, а также файлы состояния и блокировки обновлятора |
| `/app/common/as-org-db/`  | CAIDA `as-org2info.txt` — названия организаций ASN                                          |
| `/app/common/as-rel-db/`  | CAIDA `as-rel2.txt` — граф связности ASN                                                    |

Ни один из них не встраивается в образ (лицензия GeoLite2 от MaxMind запрещает распространение), и ни один не является ценным — каждый заново загружается при чистом запуске. Воссоздание контейнера просто означает, что MyIP снова загрузит их при первом запуске.

Если вы не хотите загружать их заново при каждом обновлении, смонтируйте тома:

{% code title="compose.yaml (фрагмент)" %}

```yaml
    volumes:
      - myip-maxmind:/app/common/maxmind-db
      - myip-asorg:/app/common/as-org-db
      - myip-asrel:/app/common/as-rel-db

volumes:
  myip-maxmind:
  myip-asorg:
  myip-asrel:
```

{% endcode %}

## Обновление

{% tabs %}
{% tab title="docker run" %}

```bash
docker pull jason5ng32/myip:latest
docker stop myip && docker rm myip
# затем снова выполните вашу исходную команду `docker run`
```

{% endtab %}

{% tab title="Docker Compose" %}

```bash
docker compose pull
docker compose up -d
```

{% endtab %}
{% endtabs %}

После обновления без томов при первом запуске заново скачиваются наборы данных GeoLite2 и CAIDA. Это занимает некоторое время — бэкенд ждёт MaxMind, прежде чем начать прослушивание (ограничение — 5 минут).

## Проверка

```bash
docker logs -f myip
```

Успешный запуск показывает слушатели бэкенда и фронтенда, а также загрузку MaxMind:

```
🚀 Бэкенд-сервер готов на http://localhost:11966
🚀 Сервер статических файлов готов на http://localhost:18966
📦 Базы данных MaxMind загружены (запуск)
```

Если вы видите `❌ API MaxMind будет возвращать 503, пока базы данных не будут успешно загружены`, перейдите к [Настройка MaxMind](/developer/ru/getting-started/maxmind-setup.md#troubleshooting).

## Следующие шаги

* [Настройка MaxMind](/developer/ru/getting-started/maxmind-setup.md) — необходимые учётные данные и как работает автообновлятор
* [Обратный прокси и домены](/developer/ru/getting-started/reverse-proxy-and-domains.md) — TLS, Nginx/Caddy, `ALLOWED_DOMAINS`
* [Параметры безопасности](/developer/ru/configuration/security-options.md) — ограничение частоты запросов и защита от злоупотреблений
* [Логирование](/developer/ru/configuration/logging.md) — уровень логирования, вывод JSON, журналы HTTP-запросов


---

# 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/ru/getting-started/deploy-with-docker.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.
