Быстрый старт Guide Обновлено 6 Windows, macOS, Linux, Android, iOS

Обновление подписки sing-box: как сохранить ручные настройки

Узнайте, как обновлять профиль подписки sing-box, не теряя ручных настроек, с помощью include-файлов и скриптов слияния.

sing-boxsubscriptionupdateprofileconfiguration
Содержание
КороткоЧтобы обновить подписку sing-box и не потерять ручные настройки, вынесите их в отдельный JSON-файл и подключите через include. Альтернатива — автоматическое слияние jq или скриптом после загрузки.

Подписка (subscription) sing-box — это готовый конфигурационный файл, который предоставляет VPN-провайдер или ваш собственный сервер. Обычно он содержит настройки outbounds, route, а иногда и DNS. При обновлении профиля вы просто загружаете новый файл конфигурации, и всё, что вы меняли вручную (например, правила маршрутизации или параметры TUN), исчезает. Эта статья объяснит, как правильно организовать профиль, чтобы обновления не затирали ваши настройки.

Как устроен профиль sing-box: ключевые поля

Прежде чем говорить о сохранении настроек, важно понимать структуру конфигурации sing-box. Основные секции:

  • outbounds — исходящие подключения: VLESS, Trojan, Shadowsocks и другие.
  • inbounds — входящие, включая TUN, SOCKS, HTTP.
  • route — правила маршрутизации, какие домены/IP через какой outbound идут.
  • dns — настройки DNS-серверов и параметры.
  • tun — виртуальный сетевой интерфейс (обычно часть inbounds).
  • transport — параметры транспорта (ws, grpc, etc.) для VLESS и других.

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

Почему обновление перезаписывает ручные настройки

sing-box не имеет встроенной функции подписки — это ядро, которое читает один JSON (или YAML) файл. Клиенты (GUI) сами скачивают новый конфиг и перезаписывают файл на диске. При этом вы теряете локальные правки. Есть два основных способа решить проблему:

  1. Использовать include для подключения дополнительных файлов с вашими настройками.
  2. Автоматизировать слияние через скрипт (например, с помощью jq).

Решение 1: include для отдельных файлов

sing-box поддерживает поле include на верхнем уровне конфигурации. Оно принимает массив путей к другим JSON-файлам. При загрузке sing-box читает все файлы в порядке, указанном в массиве, и объединяет их (более поздние файлы имеют приоритет). Это идеально для разделения настроек.

Шаг 1: Создайте базовый профиль из подписки

Скачайте подписной профиль и сохраните его как base.json. Не редактируйте его — он будет перезаписываться при обновлении.

Шаг 2: Создайте файл с ручными настройками

Создайте custom.json и укажите в нём только те поля, которые хотите переопределить. Например:

// custom.json
{
  "dns": {
    "servers": [
      {
        "tag": "custom-dns",
        "address": "10.0.0.1",
        "detour": "proxy"
      }
    ],
    "rules": [
      {
        "domain_suffix": [".example.com"],
        "server": "custom-dns"
      }
    ]
  },
  "route": {
    "rules": [
      {
        "domain_suffix": [".netflix.com"],
        "outbound": "direct"
      }
    ]
  },
  "tun": {
    "enable": true,
    "stack": "system",
    "auto_route": true,
    "strict_route": true
  }
}

Шаг 3: Подключите include в главный файл

В файле config.json (или как у вас называется главный конфиг) укажите include:

{
  "include": ["base.json", "custom.json"]
}

Важно: base.json должен содержать все обязательные поля (log, outbounds и т.д.). Если ваша подписка приходит в виде полного конфига, просто переименуйте её в base.json и не редактируйте. При обновлении вы скачиваете новый файл и заменяете только base.jsoncustom.json остаётся нетронутым.

Решение 2: скрипт автоматического слияния

Некоторые пользователи предпочитают один результирующий файл. Вы можете написать простой bash-скрипт, который скачивает профиль, сливает его с вашими настройками с помощью jq и кладёт результат в рабочий конфиг.

#!/bin/bash
# Обновление подписки
curl -fsSL "https://your-subscription-url" -o base.json
# Сливаем с custom.json (jq -s работает как merge, но нужен deep merge)
jq -s '.[0] * .[1]' base.json custom.json > config.json
# Перезапуск sing-box
systemctl restart sing-box

Обратите внимание: jq -s выполняет поверхностное слияние. Для глубокого слияния (например, для route.rules) лучше использовать специальные функции. Например, так:

jq -s 'def deepmerge(a;b): # ...' base.json custom.json > config.json

Готовую функцию можно найти в интернете или написать самостоятельно. Такой подход даёт полный контроль и не зависит от клиента.

Практический пример: настройка маршрутизации и DNS

Предположим, вы хотите, чтобы все запросы к example.com шли напрямую, а для остального использовался прокси. В custom.json добавьте:

{
  "route": {
    "rules": [
      {
        "domain_suffix": ["example.com"],
        "outbound": "direct"
      }
    ]
  },
  "dns": {
    "servers": [
      {
        "tag": "local-dns",
        "address": "198.18.0.1",
        "detour": "direct"
      }
    ]
  }
}

Аналогично можно переопределить параметры TUN, если вам нужно изменить стек или включить строгую маршрутизацию.

Типичные ошибки и как их избежать

  • Забыли include — если вы редактируете только base.json, ручные изменения всё равно потеряются.
  • Неправильный порядок include — файлы объединяются слева направо, и более поздние имеют приоритет. Поэтому custom.json должен идти последним.
  • Несоответствие схеме — если в custom.json опечатка в поле, sing-box может не загрузиться. Проверяйте конфиг командой sing-box check.
  • Использование поверхностного merge — если вы используете скрипт с jq, убедитесь, что слияние глубокое, иначе массивы будут заменены, а не объединены.
  • Не учитываете логику клиента — некоторые GUI-клиенты могут перезаписывать config.json целиком, игнорируя include. В этом случае настройте отдельный скрипт, который запускается после обновления подписки.

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

Что делать, если мой клиент не поддерживает include?

Такое редкость, но можно использовать скрипт, собирающий конечный config.json после загрузки профиля. Также можно мигрировать на более гибкий клиент (например, GUI на базе sing-box с поддержкой include).

Можно ли использовать YAML вместо JSON?

Да, sing-box поддерживает YAML. В этом случае include также работает, надо только указывать .yaml файлы.

Как обновить профиль вручную без скриптов?

Просто скачайте новый base.json и поместите его в каталог, где уже есть custom.json и config.json с include. После перезапуска sing-box подхватит изменения.

Потеряются ли мои настройки при обновлении самого sing-box?

Нет, если вы используете include и не редактируете base.json. Обновление ядра не влияет на файлы конфигурации.

Заключение

Правильная организация профиля sing-box позволяет сохранять ручные настройки при любых обновлениях подписки. Используйте include, чтобы разделить базовый конфиг и собственные модификации. Если нужен полный контроль, автоматизируйте слияние с помощью jq или других инструментов. Главное — тестируйте конфиг после изменений, чтобы не остаться без соединения.

Проверено на практике

  • Дата проверки: 2025-05-07
  • Среда: Review of official documentation
  • Версии:

Мини-чеклист

  • Проверьте, что ваша версия sing-box поддерживает include (1.0+ — точно).
  • Скачайте подписной профиль как отдельный файл (например, base.json).
  • Не редактируйте base.json напрямую — вынесите изменения в custom.json.
  • Укажите include в главном конфиге: ["base.json", "custom.json"].
  • Проверяйте корректность слияния командой sing-box check.
  • При использовании скрипта слияния используйте глубокое объединение (deep merge).
  • Помните о приоритете файлов: более поздние в include имеют преимущество.

Частые ошибки

  • Редактирование base.json напрямую, что приводит к потере изменений при обновлении.
  • Неправильный порядок файлов в include (custom.json раньше base.json).
  • Забывают указать include в главном конфиге.
  • Используют поверхностное слияние в jq, заменяя целые массивы.
  • Не проверяют конфиг после слияния — получают ошибку при запуске.

Источники и документация

FAQ

Что такое include в конфигурации sing-box?

Поле include позволяет подключить несколько JSON-файлов в один общий конфиг. Они объединяются в указанном порядке, при этом более поздние файлы переопределяют значения более ранних.

Можно ли сохранить ручные настройки, если я обновляю подписку через GUI-клиент?

Да, если клиент поддерживает include. В противном случае используйте внешний скрипт, который после загрузки профиля сливает его с вашим custom.json и создаёт итоговый конфиг.

Что делать, если после слияния возникают конфликты между base.json и custom.json?

Убедитесь, что в custom.json указаны только те поля, которые вы хотите переопределить. Если конфликты продолжаются, проверьте документацию на предмет совместимости версий и структуры.

Какие инструменты можно использовать для автоматического слияния JSON?

Самый популярный — jq. Для глубокого слияния можно использовать функции из репозиториев GitHub, например, deep merging в jq. Также можно использовать Python или Node.js скрипты.

Хотите перейти сразу к рабочему доступу?

Если сценарий уже ясен и не хочется проходить все шаги вручную, оформите доступ и проверьте подключение на своем устройстве.

Получить доступ

Дальше по теме

Связанные статьи