АйТи Фреш
Главная / Статьи / DevOps и автоматизация
DevOps и автоматизация

Zabbix 7.4 не удаляет потерянные ресурсы LLD: разбираю причины и показываю, как чинить

Автор: Семёнов Евгений Сергеевич, директор ООО «АйТи-Фреш» · · ~24 мин чтения
Zabbix 7.4 не удаляет потерянные ресурсы LLD: разбираю причины и показываю, как чинить
Иллюстрация к статье «Zabbix 7.4 не удаляет потерянные ресурсы LLD: разбираю причины и показываю, как чинить».

Знакомая картина: правило обнаружения давно не видит половину интерфейсов, срок Delete lost resources истёк неделю назад, а объекты как висели, так и висят — серые, отключённые, с восклицательным знаком «no longer discovered». Ниже разбираю, почему Zabbix 7.4 в этой ситуации ведёт себя ровно так, как задумано, где вы теряете время на ложных гипотезах, какими запросами это диагностируется за десять минут и как я выставляю сроки жизни обнаруженных ресурсов, чтобы не собирать мусор и не терять историю при разборе аварий.

Что на самом деле означает «потерянный ресурс»

Начну с механики, потому что почти все ложные гипотезы растут из неверного представления о ней. Низкоуровневое обнаружение (LLD) не работает как таймер и не удаляет ничего «по расписанию». Каждый раз, когда правило обнаружения отрабатывает успешно, сервер проходит по полученному JSON и для каждого найденного объекта обновляет отметку последней проверки. Всё, что в этом JSON не встретилось, считается потерянным — и для него сервер вычисляет два будущих момента: когда объект отключить и когда его удалить. Оба считаются не от «сейчас», а от последней успешной проверки.

В базе это очень наглядно. Для обнаруженных элементов данных служебные отметки живут в таблице item_discovery, для обнаруженных хостов — в host_discovery, для триггеров и графиков — в отдельных trigger_discovery и graph_discovery. В схеме Zabbix 7.4 у item_discovery, host_discovery и trigger_discovery одинаковый набор полей жизненного цикла: lastcheck (когда объект последний раз видели), ts_disable (когда его надо погасить), ts_delete (когда его надо снести) и disable_source — вот это ключевое поле, к нему вернёмся в следующем разделе. У графиков отключать нечего, поэтому в graph_discovery есть только lastcheck, ts_delete и status. В item_discovery вдобавок лежат ссылки parent_itemid на прототип и lldruleid на само правило обнаружения.

Из этого следует практический вывод, который экономит кучу нервов: удаление произойдёт только тогда, когда правило LLD в очередной раз отработает. Если правило перешло в состояние Not supported, если хост стоит в обслуживании без сбора данных (собранное в этот период в базу не сохраняется), если у правила интервал 1d, а вы ждёте результата через три часа после истечения срока — ничего не удалится, и это не баг. Сервер просто ещё не приходил в эту точку конфигурации.

Отдельно про историю, потому что именно она страдает при неудачных настройках. Отключённый элемент данных сохраняет свой itemid и всю накопленную историю: если объект снова появится в выдаче LLD, он включится обратно и графики продолжатся с того же места. Удалённый элемент исчезает вместе с идентификатором, а при повторном обнаружении Zabbix создаёт новый элемент с новым itemid и пустой историей. Старые графики к нему не привязываются — связь потеряна навсегда. Поэтому для ресурсов, которые пропадают временно (съёмный диск, выключенная на ночь касса, порт роутера без линка), важен не срок удаления сам по себе, а то, чтобы отключение наступало раньше удаления с большим запасом.

Срок Delete lost resources — это не будильник. Это условие, которое проверяется в момент очередной отработки правила обнаружения. Не отработало правило — не будет ни отключения, ни удаления, сколько ни жди.
Памятка: Что на самом деле означает «потерянный ресурс» — схема
Памятка: Что на самом деле означает «потерянный ресурс». Открыть схему в полном размере

Причина номер один: объект отключили руками

Если правило исправно отрабатывает, сроки выставлены, а часть объектов упорно не исчезает — почти наверняка их когда-то погасили вручную. Документация Zabbix 7.4 формулирует это прямым текстом в разделе про низкоуровневое обнаружение: автоматически отключённые ресурсы снова включатся, если LLD их опять обнаружит, а вручную отключённые сами не включатся; и отдельно — вручную отключённые ресурсы низкоуровневым обнаружением не удаляются. То есть это не сбой, а сознательное правило: Zabbix не отменяет решение администратора.

Технически различие как раз и хранится в поле disable_source. В коде фронтенда за него отвечают две константы: ZBX_DISABLE_DEFAULT со значением 0 и ZBX_DISABLE_SOURCE_LLD со значением 1. Когда объект гасит сам механизм обнаружения, в disable_source попадает 1 — такой объект в дальнейшем находится под управлением LLD и будет удалён по истечении срока. Когда галку снял человек, там остаётся 0 — и LLD к этому объекту больше не притрагивается: ни включит обратно, ни удалит.

Отсюда типовой сценарий, который я вижу у клиентов из раза в раз. Интерфейс на коммутаторе перевели в down, триггер начал сыпать оповещениями, дежурный зашёл в веб-интерфейс и погасил элемент данных руками — «чтобы не мешал». Через месяц порт физически вывели из конфигурации, LLD перестал его обнаруживать, но объект уже помечен как отключённый человеком. Срок Delete lost resources для него не значит ничего. И так по чуть-чуть за пару лет накапливается несколько сотен мёртвых элементов, которые никто не чистит, потому что «оно же само должно».

Правильная реакция на шумный, но ещё существующий объект — не гасить его руками, а исключить из обнаружения: поправить фильтр правила или условия переопределения (overrides) так, чтобы объект перестал попадать в выборку либо создавался сразу отключённым. Тогда жизненный цикл остаётся в руках LLD и работает предсказуемо.

Ручное отключение обнаруженного объекта — необратимое (в смысле автоматики) решение. Пока вы не включите объект обратно, ни автоматическое включение при повторном обнаружении, ни автоматическое удаление к нему не применяются.
Zabbix 7.4 не удаляет потерянные ресурсы LLD: разбираю причины и показываю, как чинить — схема
Схема к статье. Открыть схему в полном размере

Разбор со стенда: аптека на 11 рабочих мест

Клиент — аптека «АптекаГрад»: 11 рабочих мест, один сервер (учётная база, общие папки, резервные копии на съёмный USB-диск), кассовый компьютер и роутер. В мониторинге 14 хостов плюс сам Zabbix 7.4 на небольшой виртуалке с PostgreSQL 16. Обратились с двумя жалобами сразу: «в списке висит почти сорок отключённых объектов, которых давно нет» и «пропал график заполнения диска с бэкапами за прошлый месяц — хотели посмотреть, когда он переполнился, а истории нет». За три месяца до этого предыдущий администратор заменил роутер и перенастроил на нём VLAN для кассы и гостевого Wi-Fi.

Начал с правила обнаружения интерфейсов на роутере: Disable lost resources = After 1d, Delete lost resources = After 7d, интервал самого правила — 1h. По логике всё мёртвое должно было вычиститься ещё весной. Первым делом проверяю, что правило вообще живо — состояние Normal, ошибок нет, lastcheck у актуальных интерфейсов свежий. Значит, дело не в том, что LLD не отрабатывает. Дальше иду в базу — это быстрее, чем щёлкать фильтрами в вебе.

SELECT i.itemid, i.name, i.status,
       to_timestamp(id.lastcheck)   AS last_seen,
       to_timestamp(id.ts_disable)  AS planned_disable,
       to_timestamp(id.ts_delete)   AS planned_delete,
       id.disable_source
FROM   items i
JOIN   item_discovery id ON id.itemid = i.itemid
JOIN   hosts h           ON h.hostid  = i.hostid
WHERE  h.host = 'router-01'
  AND  id.lastcheck < extract(epoch from now())::int - 86400
ORDER  BY id.lastcheck;

Запрос разложил всё по полочкам за пару минут. Из 23 «зависших» элементов данных по интерфейсам у 19 в disable_source стоял 0 — их погасили руками, почти все в один день, сразу после замены роутера: старые порты сыпали оповещениями, и их просто выключили. Оставшиеся 4 оказались отдельной историей: у них ts_delete был равен 0, потому что на кассовом компьютере правило обнаружения сетевых интерфейсов приехало из локально доработанного шаблона, где lifetime_type стоял в значении 1 — «не удалять». Кто-то когда-то поставил Delete lost resources = Never, и об этом забыли.

С пропавшим графиком бэкап-диска причина была обратной. В правиле обнаружения файловых систем на сервере стояло Delete lost resources = Immediately. USB-диск подключают только на время еженедельного копирования, остальные шесть дней LLD его не видит — и каждый раз элементы данных по диску удалялись вместе с историей, а при следующем подключении создавались заново с новыми itemid. Формально Zabbix сделал ровно то, что написано в документации про Immediately: удалил объект со всей исторической записью. Вернуть эту историю нельзя — только перестать её терять.

Что сделали. Список из 19 itemid удалили одним вызовом API item.delete — при таком объёме пачки не нужны. В шаблоне кассы вернули Disable lost resources = After 2d, Delete lost resources = After 14d и поправили фильтр, чтобы служебные интерфейсы (loopback, виртуальные адаптеры) вообще не попадали в обнаружение. Для файловых систем сервера поставили Disable lost resources = Immediately и Delete lost resources = After 30d: диск теперь гаснет, пока отключён, и включается обратно с сохранённой историей при следующем копировании. Хаускипер вычистил около 180 тысяч строк из history и history_uint, база стала меньше на несколько десятков мегабайт. Вся работа вместе с проверками заняла около сорока минут.

Отдельно отмечу вывод, который клиенту было проще всего принять на примере диска: ни одна из проблем не была багом Zabbix. Система вела себя по документации. Проблемой был процесс — объекты гасили руками вместо правки фильтра, настройку Immediately поставили «чтобы не копился мусор», и никто не смотрел на список необнаруживаемых сущностей.

Прежде чем искать баг в Zabbix, выполните один SQL-запрос к item_discovery. Даже на инсталляции в полтора десятка хостов он за пару минут показывает, что система работает штатно, а проблема в настройках или ручных действиях.
Цифры и версии: Разбор со стенда: аптека на 11 рабочих мест — схема
Цифры и версии: Разбор со стенда: аптека на 11 рабочих мест. Открыть схему в полном размере

Ещё пять причин, по которым очистка не срабатывает

Ручное отключение — самая частая, но не единственная причина. Дальше по убыванию частоты идёт настройка «не удалять никогда». В API правила обнаружения за сценарий удаления отвечает свойство lifetime_type: 0 — удалять по истечении срока (значение по умолчанию), 1 — не удалять, 2 — удалять немедленно. Само пороговое значение лежит в lifetime, по умолчанию 7d. За отключение отвечает пара enabled_lifetime_type (0 — отключать по сроку, 1 — не отключать, 2 — отключать немедленно, это значение по умолчанию) и enabled_lifetime. Эти четыре свойства появились в Zabbix 7.0: до него был один параметр Keep lost resources period, в 7.0 его переименовали в Delete lost resources и добавили независимый Disable lost resources. Если правило приехало из шаблона, смотреть надо именно на шаблон — правка на хосте вам ничего не даст.

Третья причина — неверное соотношение сроков. Документация прямо требует, чтобы значение Delete lost resources в режиме After было больше значения Disable lost resources, а задержку отключения рекомендует делать больше интервала обновления самого правила обнаружения. Веб-интерфейс это контролирует, но конфигурацию нередко заливают импортом YAML или через API, где несогласованные значения проскакивают легче. Отдельный подвох — макросы: если в поле стоит {$LLD.LIFETIME}, а макрос переопределён на уровне хоста или шаблона другим значением, реальные сроки будут не те, что вы видите в карточке правила.

Четвёртая — объект на самом деле продолжает обнаруживаться. Такое бывает, когда правил обнаружения на хосте несколько и они пересекаются по ключам, или когда после правки фильтра объект всё ещё проходит по условию. Смотреть надо не на глаз, а на lastcheck: если он обновляется каждый цикл, объект живой с точки зрения LLD, и никакие сроки к нему не применяются. Пятая — сущность вообще не является обнаруженной: элемент создали руками, а рядом стоит похожий обнаруженный. У ручного объекта записи в item_discovery нет, LLD про него не знает и удалять его не будет.

Шестая, специфичная для 7.4: в этой версии появилось вложенное обнаружение — прототипы правил обнаружения внутри правил обнаружения, с неограниченной глубиной, и поддержка прототипов хостов на обнаруженных хостах. Жизненный цикл там наследуется по цепочке, и «зависшая» дочерняя сущность может держаться потому, что родительский обнаруженный объект живее всех живых или, наоборот, попал под ручное отключение. При разборе такой конструкции идите от корня вниз, а не от симптома вверх.

Правило, приехавшее из шаблона, редактируется только в шаблоне. Массовая правка на хостах или, тем более, через отвязку от шаблона — самый быстрый способ получить дубли обнаруженных сущностей и потерять историю.

Как я выставляю сроки жизни обнаруженных ресурсов

Общее правило простое: Delete больше Disable, Disable больше двух-трёх интервалов правила обнаружения. Запас на интервалы нужен, чтобы одиночный сбой сбора — таймаут SNMP, перегруженный агент, короткое обслуживание — не приводил к каскаду отключений и лишним оповещениям о том, что «объекты перестали обнаруживаться». Один пропущенный цикл не должен ничего гасить.

Отдельно про вариант Immediately в поле Delete lost resources. Документация не рекомендует его использовать, и формулировка там жёсткая: достаточно ошибочно поправить фильтр — и объект будет удалён вместе со всей исторической записью. Я согласен с этим на сто процентов и в боевых конфигурациях ставлю Immediately на удаление только там, где история заведомо бесполезна, например для короткоживущих контейнеров. Во всех остальных случаях запас в несколько дней стоит дешевле, чем потерянные графики за момент аварии, которую вы будете разбирать через неделю.

Мои рабочие дефолты по типам сущностей — не догма, а точка отсчёта, от которой удобно двигаться. Логика у них одна: чем чаще ресурс пропадает временно и чем ценнее его история, тем раньше он должен гаснуть и тем позже удаляться. Сетевой порт без линка или выключенный на ночь кассовый компьютер — это не потерянный ресурс, а нормальное состояние, и разумный Disable after спасает от ложных оповещений. Съёмный диск, который подключают раз в неделю, лучше гасить сразу, но удалять только через месяц: так история копирования переживает любые паузы. Контейнеры, наоборот, живут минуты и часы, и их историю хранить незачем.

Про временную недоступность отдельно. Если агент на сервере не ответил или SNMP-опрос роутера упал по таймауту, правило обнаружения получает ошибку и уходит в состояние Not supported — список ресурсов при этом не обнуляется, и объекты не считаются потерянными. Опасен другой случай: правило отработало успешно, но вернуло неполный список, потому что диск в этот момент не смонтирован или интерфейс не поднялся после перезагрузки. Для LLD это полноценная потеря ресурса, и дальше всё решают сроки: при Disable after с запасом объект переждёт, при Delete immediately — пропадёт вместе с историей.

И последнее по срокам, но не по важности: прототипы хостов. Удаление обнаруженного хоста уносит с собой все его элементы, триггеры и историю целиком, поэтому для прототипов хостов я почти всегда ставлю Delete lost resources = Never и чищу список руками раз в квартал по отчёту. Автоматика тут экономит десять минут в квартал и способна стоить вам всей истории по виртуалке, которую временно выключили на время миграции.

Delete lost resources = Immediately — единственная настройка в этой области, которая способна необратимо уничтожить данные из-за опечатки в фильтре. Ставьте её осознанно и только там, где история не нужна.

Диагностика за десять минут: порядок действий

Работаю всегда сверху вниз, от правила к объекту. Сначала проверяю, живо ли само правило обнаружения и какие у него реальные пороги — удобнее всего одним вызовом API, потому что тут сразу видно и состояние, и текст ошибки, и все четыре свойства жизненного цикла без беготни по вкладкам:

curl -s -X POST https://zabbix.example.com/api_jsonrpc.php \
  -H 'Content-Type: application/json-rpc' \
  -H 'Authorization: Bearer <API_TOKEN>' \
  -d '{
    "jsonrpc": "2.0",
    "method": "discoveryrule.get",
    "params": {
      "host": "router-01",
      "output": ["name", "key_", "delay", "state", "error",
                 "lifetime_type", "lifetime",
                 "enabled_lifetime_type", "enabled_lifetime"]
    },
    "id": 1
  }' | jq .

Что смотрю в ответе: state должно быть 0 (Normal) — если 1, читаю error, там будет причина, по которой правило не отрабатывает, и до её устранения жизненный цикл стоит. lifetime_type = 1 означает «не удалять никогда» и объясняет проблему сразу. Если в lifetime или enabled_lifetime стоит имя макроса, дальше иду смотреть его фактическое значение на хосте и шаблонах — резолвится он не всегда так, как ожидается.

Второй шаг — SQL по item_discovery из раздела с разбором стенда. Он отвечает на три вопроса разом: когда объект видели в последний раз, на когда запланировано удаление и кто его погасил. Если lastcheck свежий — объект обнаруживается, вопрос закрыт. Если disable_source = 0 — гасили руками, автоматика к нему неприменима. Если ts_delete = 0 при том, что объект давно не виден, — либо правило не отрабатывало с момента потери, либо стоит режим «не удалять».

Третий шаг нужен редко: посмотреть, что сервер вообще делает с этим правилом. Полезно повысить детальность логов на время разбора и вернуть обратно — без перезапуска службы, через runtime control. Затрагивать стоит оба типа процессов: lld manager распределяет задачи обнаружения, а lld worker их обрабатывает. Держать сервер в DebugLevel=4 постоянно не надо, лог растёт очень быстро.

zabbix_server -R log_level_increase="lld manager"
zabbix_server -R log_level_increase="lld worker"
tail -f /var/log/zabbix/zabbix_server.log
zabbix_server -R log_level_decrease="lld worker"
zabbix_server -R log_level_decrease="lld manager"
Если после первых двух шагов картина не сложилась — почти всегда виноват шаблон, а не сервер. Проверяйте значения на уровне шаблона и фактические значения макросов, а не то, что нарисовано в карточке хоста.
Порядок действий: Диагностика за десять минут: порядок действий — схема
Порядок действий: Диагностика за десять минут: порядок действий. Открыть схему в полном размере

Как расчистить накопившееся и не сломать историю

Самая распространённая ошибка на этом этапе — пойти чистить прямо в базу запросом вида DELETE FROM items WHERE .... Не делайте так. Zabbix держит конфигурацию в кэше сервера, связи между элементами, триггерами, графиками, зависимостями и веб-сценариями раскиданы по десятку таблиц, и ручное удаление оставляет осиротевшие записи, которые потом вылезают в самых неожиданных местах — от неработающих карт до падающих проверок при обновлении версии. Единственный поддерживаемый путь — веб-интерфейс или API.

Практически удобнее API. Собираю список itemid тем же SQL-запросом, выгружаю в файл и удаляю пачками по 500–1000 штук за вызов item.delete. Разом отправлять десять тысяч идентификаторов не стоит: транзакция тяжёлая, фронтенд может отвалиться по таймауту, а на PostgreSQL это ещё и заметный скачок нагрузки. Обнаруженные хосты сносятся аналогично методом host.delete — но помните, что вместе с хостом уходит вся его история, поэтому по хостам я всегда сначала выгружаю список и согласовываю с клиентом.

Отдельный вопрос — что делать с объектами, которые погасили руками, но которые ещё существуют физически и должны обнаруживаться дальше. По моим наблюдениям на 7.4 достаточно включить такой объект обратно: дальше он снова живёт по правилам LLD и при следующей потере отработает штатно. В документации этот сценарий явно не описан, поэтому перед массовой операцией проверьте поведение на двух-трёх объектах на своём стенде — я в подобных случаях всегда сначала беру контрольную выборку, а уже потом трогаю сотни записей.

И про историю. Удаление элемента данных не освобождает место мгновенно: за вычистку history_* и trends_* отвечает хаускипер, и на объёмных инсталляциях он может разгребать хвост несколько суток. На небольшой инсталляции вроде аптечной это минуты, на базе в сотни гигабайт — сутки. На PostgreSQL с TimescaleDB история чистится по партициям, так что реальное место вернётся по мере ухода целых чанков за горизонт хранения. Планируйте массовую чистку на период, когда сервер не занят чем-то ещё, и не пугайтесь, если размер базы первые сутки не изменится.

Ну и организационная часть, без которой всё вышеописанное повторится через год. Заведите себе привычку раз в квартал прогонять один SQL-запрос по всем хостам и смотреть на объекты, которых не видели больше месяца. Пять минут работы. Разбор захламлённого мониторинга через два года — уже несколько часов, и почти всегда с сюрпризами вроде забытого Never в шаблоне, который тихо разошёлся на полсотни хостов.

Ещё контекст по версиям: Zabbix 7.4 вышел 1 июля 2025 года и это стандартный, не LTS-релиз — его ограниченная поддержка заканчивается в четвёртом квартале 2026 года, а 8.0 LTS запланирован на третий квартал 2026-го. Если вы только строите мониторинг, планируйте переход на 8.0 LTS сразу, а не через год.

Частые вопросы

Почему объект помечен как «no longer discovered», но не удаляется даже спустя месяц после истечения срока?

Три основных варианта. Первый и самый частый: объект был отключён вручную — в таблице item_discovery у него disable_source = 0, и низкоуровневое обнаружение такие объекты не удаляет по документации. Второй: в правиле обнаружения (или в шаблоне, откуда оно приехало) стоит Delete lost resources = Never, то есть lifetime_type = 1. Третий: само правило LLD не отрабатывает — оно в состоянии Not supported, хост в обслуживании без сбора данных или интервал правила больше, чем прошедшее время.

Как отличить объект, отключённый механизмом LLD, от отключённого вручную?

По полю disable_source в таблицах item_discovery, host_discovery и trigger_discovery. Значение 1 (константа ZBX_DISABLE_SOURCE_LLD) означает, что объект погасило низкоуровневое обнаружение — он останется под управлением автоматики: включится при повторном обнаружении и удалится по истечении срока. Значение 0 означает ручное отключение — такой объект автоматика не тронет ни при каких сроках.

Какие значения Disable и Delete lost resources ставить, чтобы не было сюрпризов?

Задержку отключения делайте больше двух-трёх интервалов правила обнаружения, чтобы одиночный сбой сбора не гасил объекты пачками. Задержку удаления — заведомо больше задержки отключения и больше окна, в течение которого вам может понадобиться история для разбора аварии. Мои рабочие дефолты: сетевые интерфейсы 2d/14–30d, файловые системы 6h/14d, съёмные диски Immediately/30d, контейнеры Docker и Podman Immediately/3d, прототипы хостов — Delete never с ручной ревизией раз в квартал.

Можно ли ставить Delete lost resources = Immediately?

Документация Zabbix прямо не рекомендует этот вариант: достаточно ошибочно поправить фильтр правила — и объект будет удалён вместе со всей исторической записью, причём безвозвратно. Я использую Immediately только для заведомо короткоживущих сущностей вроде контейнеров, где история не нужна. Для всего остального запас в несколько дней стоит дешевле, чем потерянные графики за момент аварии.

Сохранится ли история, если диск или интерфейс пропал на пару дней, а потом вернулся?

Да, если к моменту возвращения объект был только отключён. Автоматически отключённый ресурс при повторном обнаружении включается обратно с тем же itemid и всей историей. Если же успел наступить срок удаления или стоит Delete lost resources = Immediately, элемент удаляется вместе с историей, а вернувшийся ресурс получит новый элемент с пустыми графиками. Поэтому для периодически пропадающих ресурсов ставьте удаление с большим запасом.

Можно ли удалить накопившиеся мёртвые элементы данных запросом прямо в базе?

Нет. Zabbix держит конфигурацию в кэше сервера, а связи элементов с триггерами, графиками, зависимостями и веб-сценариями раскиданы по десятку таблиц. Прямое удаление оставляет осиротевшие записи, которые проявляются позже — вплоть до проблем при обновлении версии. Используйте веб-интерфейс или API: item.delete пачками по 500–1000 идентификаторов, host.delete — только после согласования, потому что вместе с хостом уходит вся его история.

Что изменилось в жизненном цикле обнаруженных ресурсов в Zabbix 7.4?

Сама логика Disable/Delete lost resources осталась той же, что и в 7.0, где параметр Keep lost resources period переименовали в Delete lost resources (с вариантами Never, Immediately и After) и добавили независимый Disable lost resources с теми же тремя вариантами. Новое в 7.4 — вложенное обнаружение: внутри правила LLD теперь можно создавать прототипы правил обнаружения с неограниченной глубиной, а прототипы хостов поддерживаются на обнаруженных хостах. При разборе «зависших» сущностей в такой конструкции идите по цепочке от корневого правила вниз.

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 💬 MAX: +7 903 729-62-41 ✈ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Источники

© ООО «АйТи-Фреш» · Москва · Все статьи