From d80623c0d85ae7109471badb0417353b976b708a Mon Sep 17 00:00:00 2001 From: Dilshod Rasulov Date: Sat, 22 Aug 2026 01:53:03 +0500 Subject: [PATCH] docs: release v1.18.0 Turn the accumulated Unreleased notes into the v1.18.0 section and document the multi-address feature in both languages. - CHANGELOG: several IP addresses per instance (model, Network tab card, aliases inside the guest, surviving a reboot, pending/runtime_only states, new endpoints, migration 43), the IPAM discovery fixes and the guest-agent payload fix - README: version badge, IPAM line and a feature bullet about extra addresses - WIKI: the five new guest-address endpoints plus the allocation filters in the API reference, a feature bullet, and a new section in the IPAM chapter covering the card actions, how an address is applied (SSH to the node for LXC, guest-exec for VMs) and the four apply states - VERSION: 1.17.0 -> 1.18.0 --- CHANGELOG.md | 31 ++++++++++++++++++++++++++++++- CHANGELOG.ru.md | 31 ++++++++++++++++++++++++++++++- README.md | 5 +++-- README.ru.md | 5 +++-- VERSION | 2 +- WIKI.md | 44 +++++++++++++++++++++++++++++++++++++++++++- WIKI.ru.md | 44 +++++++++++++++++++++++++++++++++++++++++++- 7 files changed, 153 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c18a2c5..4c5f29b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,36 @@ All notable changes to PVEmanager will be documented in this file. --- -## [Unreleased] +## [v1.18.0] - 2026-08-22 + +### 🌐 Several IP addresses per instance + +- **An instance is no longer limited to one address** — a guest can hold a primary address plus any number of extra ones. Previously every lookup assumed "one guest → one allocation": `find_allocation_by_resource()` returned the first row it saw, `release_ip_by_vmid()` freed a single address (leaving the rest occupied forever after a guest was deleted), and the link tool skipped guests that already had an allocation +- **New "IP addresses" card on the instance Network tab** — lists every address of the guest with its state, and lets you add one (next free in a network/pool or entered by hand), retry applying it, mark it primary or release it. The IP column of the instance list shows the primary address with a **+N** badge for the rest, and the allocations table marks the primary one +- **Extra addresses are applied inside the guest as aliases** — through the existing script engine, so LXC goes over `pct exec` and VMs over the QEMU guest agent. The address is brought up with `ip addr add` and never restarts guest networking, so a running guest keeps its connectivity +- **Addresses survive a guest reboot** — Proxmox regenerates the guest network configuration on every start (pve-container rewrites `/etc/network/interfaces`, `ifcfg` or the NetworkManager keyfile from `netN`), which wiped any alias added to the native stack. A small oneshot systemd unit re-adds the recorded addresses after `network-online.target`; `/etc/systemd` is not touched by Proxmox. The native stacks (ifupdown, netplan, NetworkManager, sysconfig/network-scripts for RHEL-based guests) are still written, so the reported state can be composite, e.g. `nm+systemd` +- **An address is reserved even when it cannot be applied** — a stopped guest, a missing guest agent or no SSH access to the node leaves the allocation in `pending` with the reason shown, and the **Apply** button retries it later. An unrecognised network stack degrades to `runtime_only`, which warns that the address will not survive a reboot +- **New endpoints** — `GET/POST /ipam/api/guests/{server_id}/{vmid}/addresses`, `POST …/{allocation_id}/apply`, `POST …/{allocation_id}/primary`, `DELETE …/{allocation_id}`; the allocations list accepts `proxmox_server_id` / `proxmox_vmid` filters, and the instance list exposes `ips[]` next to the primary `ip` +- **Migration 43** adds `is_primary`, `assignment_kind`, `target_interface` and the `apply_*` columns to `ipam_allocations` and marks existing rows as primary. The first address of a guest is now flagged automatically, no matter which of the six allocation paths issued it +- **Releasing an address removes it from the guest first**, then frees it in IPAM; the primary address stays owned by the NIC config and is not releasable from this card + +### 🔍 IPAM address discovery fixes + +- **LXC containers finally show their IP** — `get_container_interfaces()` looked for `ipconfigN` keys, which exist only on QEMU cloud-init guests. LXC keeps the address inside the `netN` string, so the method never returned anything and the IP column stayed empty for every container. The `netN` parser is used now, with a fallback to `/nodes/{node}/lxc/{vmid}/interfaces` for DHCP guests +- **"Scan & link" registers every address of a guest**, not just the first one, and no longer skips guests that already have an allocation — a changed or added address used to stay unnoticed forever +- **The MAC address is carried over** into the allocation when linking, taken from the interface the address was found on +- **A duplicate address can no longer be stolen from a live guest** — when two guests advertise the same IP (typically a stale `ip=` left in the config of a stopped container), the owner is kept and the conflict is reported instead of silently reassigning the record +- **Allocations are no longer matched by resource name** — two guests named alike on different servers made one guest display the other's address +- **IPAM history no longer fails on datetime values**, which used to abort re-linking with a 500 +- **Guest IP is re-checked at most once every 5 minutes per guest** instead of on every cache sync (every 10 s), removing hundreds of pointless Proxmox calls per minute + +### 🐛 Other fixes + +- **Scripts with non-ASCII text run on VMs again** — Proxmox base64-encodes the guest agent payload in Perl, which dies with `Wide character in subroutine entry` as soon as the script contains non-ASCII (a Cyrillic comment is enough). The payload is now handed over as bytes +- **Next-free-IP search can scan the whole subnet** when a network has no auto-assign pool, skipping node addresses and cached guest addresses so it never hands out an address that is already live + +--- + ### 🖥️ LXC console — failed termproxy tasks and the black screen diff --git a/CHANGELOG.ru.md b/CHANGELOG.ru.md index 9212ff7..47e2364 100644 --- a/CHANGELOG.ru.md +++ b/CHANGELOG.ru.md @@ -4,7 +4,36 @@ --- -## [Unreleased] +## [v1.18.0] - 2026-08-22 + +### 🌐 Несколько IP-адресов на инстанс + +- **Инстанс больше не ограничен одним адресом** — у гостя может быть основной адрес и любое количество дополнительных. Раньше вся логика исходила из «один гость — одна аллокация»: `find_allocation_by_resource()` возвращал первую попавшуюся запись, `release_ip_by_vmid()` освобождал один адрес (остальные после удаления гостя оставались занятыми навсегда), а инструмент связывания пропускал гостей, у которых аллокация уже была +- **На вкладке «Сеть» инстанса появилась карточка «IP-адреса»** — показывает все адреса гостя с их состоянием и позволяет выдать новый (следующий свободный в сети/пуле или введённый вручную), повторить применение, сделать основным или освободить. В колонке IP списка инстансов показывается основной адрес и бейдж **+N** для остальных, а в таблице аллокаций основной помечен +- **Дополнительные адреса навешиваются внутри гостя как alias** — через существующий движок скриптов: для LXC это `pct exec`, для ВМ — QEMU guest agent. Адрес поднимается через `ip addr add`, сеть гостя при этом не перезапускается, поэтому работающий гость не теряет связь +- **Адреса переживают перезагрузку гостя** — Proxmox пересоздаёт сетевую конфигурацию при каждом старте (pve-container переписывает `/etc/network/interfaces`, `ifcfg` или keyfile NetworkManager из `netN`), стирая любой alias, добавленный в родной стек. Небольшой oneshot systemd-юнит заново поднимает записанные адреса после `network-online.target`; каталог `/etc/systemd` Proxmox не трогает. Родные стеки (ifupdown, netplan, NetworkManager, sysconfig/network-scripts для RHEL-подобных гостей) по-прежнему настраиваются, поэтому состояние может быть составным, например `nm+systemd` +- **Адрес резервируется, даже если применить его не удалось** — остановленный гость, отсутствующий guest agent или недоступный SSH к ноде оставляют аллокацию в состоянии `pending` с указанием причины, а кнопка **«Применить»** повторяет попытку позже. Нераспознанный сетевой стек даёт `runtime_only` — предупреждение, что адрес не переживёт перезагрузку +- **Новые эндпоинты** — `GET/POST /ipam/api/guests/{server_id}/{vmid}/addresses`, `POST …/{allocation_id}/apply`, `POST …/{allocation_id}/primary`, `DELETE …/{allocation_id}`; список аллокаций принимает фильтры `proxmox_server_id` / `proxmox_vmid`, а список инстансов отдаёт `ips[]` рядом с основным `ip` +- **Миграция 43** добавляет в `ipam_allocations` колонки `is_primary`, `assignment_kind`, `target_interface` и `apply_*`, помечая существующие записи основными. Первый адрес гостя теперь помечается автоматически, из какого бы из шести мест выдачи он ни пришёл +- **Освобождение адреса сначала снимает его с гостя**, затем освобождает в IPAM; основной адрес задаётся конфигом интерфейса и из этой карточки не освобождается + +### 🔍 Исправления определения адресов в IPAM + +- **LXC-контейнеры наконец показывают свой IP** — `get_container_interfaces()` искал ключи `ipconfigN`, которые бывают только у QEMU-гостей с cloud-init. LXC хранит адрес внутри строки `netN`, поэтому метод не возвращал ничего и колонка IP у всех контейнеров оставалась пустой. Теперь используется парсер `netN`, а для гостей на DHCP — запрос `/nodes/{node}/lxc/{vmid}/interfaces` +- **«Сканировать и связать» регистрирует все адреса гостя**, а не только первый, и больше не пропускает уже связанных гостей — сменившийся или добавленный адрес раньше оставался незамеченным навсегда +- **MAC-адрес переносится в аллокацию** при связывании — берётся с того интерфейса, на котором найден адрес +- **Дублирующийся адрес больше нельзя отобрать у живого гостя** — когда два гостя заявляют один IP (обычно из-за устаревшего `ip=` в конфиге остановленного контейнера), владелец сохраняется, а конфликт возвращается с объяснением вместо тихой перезаписи записи +- **Аллокации больше не сопоставляются по имени ресурса** — из-за этого два одноимённых гостя на разных серверах показывали чужой адрес +- **История IPAM больше не падает на значениях даты/времени** — раньше это обрывало повторное связывание ошибкой 500 +- **IP гостя перепроверяется не чаще раза в 5 минут**, а не при каждом синке кэша (каждые 10 секунд) — это убрало сотни бессмысленных обращений к Proxmox в минуту + +### 🐛 Прочие исправления + +- **Скрипты с не-ASCII текстом снова выполняются на ВМ** — Proxmox кодирует payload для guest agent в base64 силами Perl, а тот падает с `Wide character in subroutine entry`, как только в скрипте встречается не-ASCII (достаточно комментария на кириллице). Теперь payload передаётся байтами +- **Поиск следующего свободного IP умеет сканировать всю подсеть**, когда в сети нет пула с auto-assign, пропуская адреса нод и известные адреса гостей — чтобы не выдать адрес, который уже занят в сети + +--- + ### 🖥️ Консоль LXC — ошибки termproxy и чёрный экран diff --git a/README.md b/README.md index 9623d41..fc2b529 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ **Modern web panel for managing Proxmox servers, virtual machines and LXC containers** -[![Version](https://img.shields.io/badge/version-1.17.0-blue?style=flat-square)](CHANGELOG.md) +[![Version](https://img.shields.io/badge/version-1.18.0-blue?style=flat-square)](CHANGELOG.md) [![License](https://img.shields.io/badge/license-MIT-green?style=flat-square)](LICENSE) [![Docker](https://img.shields.io/badge/docker-ready-2496ED?style=flat-square&logo=docker&logoColor=white)](compose.yml) [![Python](https://img.shields.io/badge/python-3.12-3776AB?style=flat-square&logo=python&logoColor=white)](backend/) @@ -34,6 +34,7 @@ PVEmanager is a self-hosted web panel that provides a unified interface for mana - **SDN support** — manage Software-Defined Networking zones, VNets, and subnets; edit zones and VNets; auto-create IPAM networks for subnets - **Node networking** — manage node-level network interfaces (bridges, bonds, VLANs); apply/revert pending config - **Networks page** — unified UI for SDN and node interface management +- **Several IP addresses per instance** — a guest can hold a primary address plus extra ones, managed from its Network tab; extras are applied inside the guest as aliases (`pct exec` for LXC, guest agent for VMs) and survive a reboot ### App Store - **Self-hosted app catalog** — one-click install of self-hosted apps, each into its own unprivileged LXC running Docker Compose (1 app = 1 LXC); multi-source catalog — `runtipi/runtipi-appstore` (~265 apps) plus optional `getumbrel/umbrel-apps` (~380 apps), selectable via `APPSTORE_SOURCES` @@ -64,7 +65,7 @@ PVEmanager is a self-hosted web panel that provides a unified interface for mana ### Other - **Command palette** — `Ctrl+K` palette with search over a unified navigation registry for keyboard-driven jumps to any page -- **IPAM** — IP Address Management with allocation history and orphan detection +- **IPAM** — IP Address Management with allocation history, orphan detection and several addresses per instance - **Multilingual** — Russian and English interface; language preference is per-user account - **Encrypted credentials** — sensitive fields stored encrypted in the database - **Styled confirmation dialogs** — all destructive actions use a consistent themed modal instead of the native browser `confirm()` diff --git a/README.ru.md b/README.ru.md index 73937fb..f7d1347 100644 --- a/README.ru.md +++ b/README.ru.md @@ -4,7 +4,7 @@ **Современная веб-панель для управления серверами Proxmox, виртуальными машинами и контейнерами LXC** -[![Версия](https://img.shields.io/badge/версия-1.17.0-blue?style=flat-square)](CHANGELOG.md) +[![Версия](https://img.shields.io/badge/версия-1.18.0-blue?style=flat-square)](CHANGELOG.md) [![Лицензия](https://img.shields.io/badge/лицензия-MIT-green?style=flat-square)](LICENSE) [![Docker](https://img.shields.io/badge/docker-готов-2496ED?style=flat-square&logo=docker&logoColor=white)](compose.yml) [![Python](https://img.shields.io/badge/python-3.12-3776AB?style=flat-square&logo=python&logoColor=white)](backend/) @@ -34,6 +34,7 @@ PVEmanager — это самостоятельно размещаемая веб - **Поддержка SDN** — управляйте зонами Software-Defined Networking, VNet и подсетями; редактируйте зоны и VNet; автоматическое создание сетей IPAM для подсетей - **Сетевые интерфейсы узлов** — управляйте сетевыми интерфейсами на уровне узла (мосты, связки, VLAN); применяйте/откатывайте ожидающую конфигурацию - **Страница сетей** — унифицированный интерфейс для управления SDN и сетевыми интерфейсами узлов +- **Несколько IP-адресов на инстанс** — у гостя может быть основной адрес и дополнительные; управление на вкладке «Сеть» инстанса, дополнительные навешиваются внутри гостя как alias (`pct exec` для LXC, guest agent для ВМ) и переживают перезагрузку ### App Store - **Каталог self-hosted приложений** — установка в один клик, каждое приложение — в собственном unprivileged LXC с Docker Compose (1 приложение = 1 LXC); мультиисточниковый каталог — `runtipi/runtipi-appstore` (~265 приложений) плюс опциональный `getumbrel/umbrel-apps` (~380 приложений), выбор через `APPSTORE_SOURCES` @@ -64,7 +65,7 @@ PVEmanager — это самостоятельно размещаемая веб ### Прочее - **Командная палитра** — палитра по `Ctrl+K` с поиском по единому реестру навигации для перехода на любую страницу с клавиатуры -- **IPAM** — управление IP-адресами с историей выделения и обнаружением сиротских адресов +- **IPAM** — управление IP-адресами с историей выделения, обнаружением сиротских адресов и несколькими адресами на инстанс - **Многоязычность** — интерфейс на русском и английском языках; язык задаётся отдельно для каждого аккаунта в профиле - **Зашифрованные учетные данные** — чувствительные поля хранятся зашифрованными в базе данных - **Стилизованные диалоги** — все подтверждения действий используют единое тематическое модальное окно вместо нативного `confirm()` браузера diff --git a/VERSION b/VERSION index 092afa1..84cc529 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.17.0 +1.18.0 diff --git a/WIKI.md b/WIKI.md index 72751f6..8ef3650 100644 --- a/WIKI.md +++ b/WIKI.md @@ -223,9 +223,15 @@ This section summarizes key API endpoints. All require JWT authentication. - `GET /ipam/api/networks` — list networks - `POST /ipam/api/networks` — create network - `DELETE /ipam/api/networks/{id}` — delete network -- `GET /ipam/api/allocations` — list IP allocations +- `GET /ipam/api/allocations` — list IP allocations (filters: `network_id`, `pool_id`, `status`, `proxmox_server_id`, `proxmox_vmid`) - `POST /ipam/api/allocations` — create IP allocation - `DELETE /ipam/api/allocations/{id}` — release IP +- `GET /ipam/api/guests/{server_id}/{vmid}/addresses` — all addresses of an instance +- `POST /ipam/api/guests/{server_id}/{vmid}/addresses` — give the instance an extra address +- `POST /ipam/api/guests/{server_id}/{vmid}/addresses/{id}/apply` — retry applying it to the guest +- `POST /ipam/api/guests/{server_id}/{vmid}/addresses/{id}/primary` — mark it primary +- `DELETE /ipam/api/guests/{server_id}/{vmid}/addresses/{id}` — remove from the guest and release +- `POST /ipam/api/link-allocations` — scan guests and register their addresses ### Notifications @@ -380,6 +386,7 @@ This section summarizes key API endpoints. All require JWT authentication. - Dynamic server and node selectors in network creation forms - Automatic IP allocation - IP reservation and release +- **Several addresses per instance** — a primary address plus extra ones applied inside the guest as aliases - Allocation history ### Notifications @@ -1160,6 +1167,41 @@ Start: 192.168.1.10 End: 192.168.1.50 ``` +### Several addresses per instance + +A guest holds one **primary** address plus any number of extra ones. The primary address is the one written into the guest's NIC configuration (`net0` for LXC, `ipconfig0` for QEMU) — it is what the IP column of the instance list shows. Extra addresses are added **inside** the guest as aliases on an existing interface. + +Manage them on the **Network** tab of an instance, in the **IP addresses** card: + +| Action | What happens | +|--------|--------------| +| Add IP | Allocates an address (next free in a network/pool, or one you type) and applies it to the chosen interface | +| Apply | Retries applying an address that could not be pushed to the guest earlier | +| Make primary | Moves the primary flag; the IP column and the instance cache follow it | +| Release | Removes the address from the guest, then frees it in IPAM | + +The primary address is not releasable from this card — it belongs to the NIC configuration and is changed through the network device instead. + +### How an extra address is applied + +The address is brought up with `ip addr add` and the guest's networking is **never restarted**, so a running guest keeps its connectivity. Delivery reuses the script engine: + +- **LXC** — `pct exec` over SSH to the node (needs the server password or an SSH key for `root@node`) +- **QEMU** — the guest agent, which must allow `guest-exec` (some images ship with it blocked in `/etc/sysconfig/qemu-ga` or `/etc/default/qemu-guest-agent`) + +Proxmox regenerates the guest network configuration on **every start** of a guest, wiping anything written into the native stack. To make an address survive a reboot, PVEmanager installs a small oneshot systemd unit (`pvemanager-aliases.service`) that re-adds the recorded addresses after `network-online.target`; `/etc/systemd` is not touched by Proxmox. The native stack is configured as well when it is recognised — ifupdown, netplan, NetworkManager or sysconfig/network-scripts for RHEL-based guests. + +### Address states + +| State | Meaning | +|-------|---------| +| 🟢 applied | Up in the guest and recorded so it returns after a reboot | +| 🟡 runtime_only | Up in the guest, but no known network stack and no systemd — will be lost on reboot | +| 🟠 pending | Reserved in IPAM, not pushed to the guest yet (guest stopped, no guest agent, no SSH to the node) — press **Apply** later | +| 🔴 failed | The script ran and returned an error; the reason is shown next to the address | + +An address is always reserved in IPAM even when it cannot be applied, so it is never handed out to somebody else in the meantime. + ### IP Status | Status | Description | diff --git a/WIKI.ru.md b/WIKI.ru.md index fdc3df4..6e6f030 100644 --- a/WIKI.ru.md +++ b/WIKI.ru.md @@ -222,9 +222,15 @@ CORS_ORIGINS=* - `GET /ipam/api/networks` — список сетей - `POST /ipam/api/networks` — создать сеть - `DELETE /ipam/api/networks/{id}` — удалить сеть -- `GET /ipam/api/allocations` — список выделенных IP +- `GET /ipam/api/allocations` — список выделенных IP (фильтры: `network_id`, `pool_id`, `status`, `proxmox_server_id`, `proxmox_vmid`) - `POST /ipam/api/allocations` — создать выделение IP - `DELETE /ipam/api/allocations/{id}` — освободить IP +- `GET /ipam/api/guests/{server_id}/{vmid}/addresses` — все адреса инстанса +- `POST /ipam/api/guests/{server_id}/{vmid}/addresses` — выдать инстансу дополнительный адрес +- `POST /ipam/api/guests/{server_id}/{vmid}/addresses/{id}/apply` — повторить применение к гостю +- `POST /ipam/api/guests/{server_id}/{vmid}/addresses/{id}/primary` — сделать основным +- `DELETE /ipam/api/guests/{server_id}/{vmid}/addresses/{id}` — снять с гостя и освободить +- `POST /ipam/api/link-allocations` — просканировать гостей и зарегистрировать их адреса ### Уведомления @@ -379,6 +385,7 @@ CORS_ORIGINS=* - Динамические селекторы сервера и узла в формах создания сети - Автоматическое выделение IP - Резервирование и освобождение IP +- **Несколько адресов на инстанс** — основной адрес и дополнительные, навешиваемые внутри гостя как alias - История выделений ### Уведомления @@ -1159,6 +1166,41 @@ Start: 192.168.1.10 End: 192.168.1.50 ``` +### Несколько адресов на инстанс + +У гостя есть один **основной** адрес и любое количество дополнительных. Основной — это адрес из конфигурации интерфейса гостя (`net0` у LXC, `ipconfig0` у QEMU), именно он показывается в колонке IP списка инстансов. Дополнительные адреса навешиваются **внутри** гостя как alias на существующий интерфейс. + +Управление — на вкладке **«Сеть»** инстанса, карточка **«IP-адреса»**: + +| Действие | Что происходит | +|----------|----------------| +| Добавить IP | Выделяет адрес (следующий свободный в сети/пуле или введённый вручную) и применяет его к выбранному интерфейсу | +| Применить | Повторяет применение адреса, который раньше не удалось передать гостю | +| Сделать основным | Переносит флаг основного адреса; колонка IP и кэш инстанса следуют за ним | +| Освободить | Снимает адрес с гостя, затем освобождает его в IPAM | + +Основной адрес из этой карточки не освобождается — он задаётся конфигурацией сетевого интерфейса и меняется через неё. + +### Как применяется дополнительный адрес + +Адрес поднимается командой `ip addr add`, сеть гостя при этом **не перезапускается**, поэтому работающий гость не теряет связь. Доставка использует тот же движок скриптов, что и раздел Scripts: + +- **LXC** — `pct exec` по SSH к ноде (нужен пароль сервера либо SSH-ключ для `root@node`) +- **QEMU** — guest agent, в котором должен быть разрешён `guest-exec` (в некоторых образах он заблокирован в `/etc/sysconfig/qemu-ga` или `/etc/default/qemu-guest-agent`) + +Proxmox пересоздаёт сетевую конфигурацию гостя при **каждом старте**, стирая всё, что было записано в родной стек. Чтобы адрес пережил перезагрузку, PVEmanager устанавливает небольшой oneshot systemd-юнит (`pvemanager-aliases.service`), который заново поднимает записанные адреса после `network-online.target`; каталог `/etc/systemd` Proxmox не трогает. Родной стек настраивается дополнительно, если он распознан — ifupdown, netplan, NetworkManager или sysconfig/network-scripts для RHEL-подобных гостей. + +### Состояния адреса + +| Состояние | Значение | +|-----------|----------| +| 🟢 applied | Поднят в госте и записан так, что вернётся после перезагрузки | +| 🟡 runtime_only | Поднят в госте, но сетевой стек не распознан и systemd нет — после перезагрузки исчезнет | +| 🟠 pending | Зарезервирован в IPAM, но гостю ещё не передан (гость выключен, нет guest agent, нет SSH к ноде) — нажмите **«Применить»** позже | +| 🔴 failed | Скрипт отработал с ошибкой; причина показана рядом с адресом | + +Адрес резервируется в IPAM в любом случае, даже если применить его не удалось, — чтобы тем временем он не достался кому-то ещё. + ### Статус IP | Статус | Описание |