Skip to content

RU Storage Policy

SlimRG edited this page Aug 23, 2026 · 1 revision

Политика хранения

Release directory считается неизменяемой. Финальный пользовательский пакет содержит только Shadowsocks.exe; настройки, кэши, плагины, логи и скачиваемые компоненты не должны появляться рядом с EXE.

Обычный режим

Основной root:

%LOCALAPPDATA%\Shadowsocks

Типовая структура:

settings.json
settings.backup.json
Cache\PAC\...
Cache\GeoSite\...
Data\PAC\...
Plugins\<plugin-id>\...
Components\DNSCryptProxy\...
Logs\shadowsocks.log
Runtime\WinDivert\...
Runtime\DNSCryptProxy\...
Startup\Shadowsocks.exe
Temp\NetworkService\...
Temp\Updates\DNSCryptProxy\...
Temp\StartupLogs\...
Temp\Working\...

settings.json хранится через ISettingsStore / JsonFileSettingsStore. Запись выполняется через temporary file + atomic replacement; settings.backup.json содержит предыдущий устойчивый snapshot. Удалённые schema fields очищаются при канонической миграции typed Configuration.

Local PAC / GeoSite

Local PAC и GeoSite cache находятся под активным storage root. user-rule.txt — поддерживаемый локальный override для managed C# FilterEngine. Исполняемый abp.txt больше не поддерживается.

Плагины SIP003

Управляемые пакеты находятся в:

Plugins\<plugin-id>\

Built-in catalog package хранит .plugin.json с trusted repository, release tag, выбранным asset, настройкой automatic updates и временем последней успешной проверки. Manual ZIP/TAR.GZ import не включается в background update. Staging/rollback используют временные .plugin-stage-* / .plugin-backup-* каталоги под тем же active storage root; orphaned backup после прерванного directory swap восстанавливается при следующем чтении plugin storage, а устаревшие transient-каталоги очищаются best-effort. Сервер хранит managed plugin id/options/arguments. Runtime разрешает executable через PluginManager, а не через произвольный абсолютный путь, PATH или свободно заданный repository.

DNSCrypt

Постоянный компонент:

Components\DNSCryptProxy\...

Runtime/staging размещается в Runtime\DNSCryptProxy и Temp\Updates\DNSCryptProxy. Бинарь не встраивается в Shadowsocks.exe; он скачивается и проверяется при явном использовании функции. Подписанный resolver-каталог хранится как аутентифицированная пара Runtime\DNSCryptProxy\public-resolvers.md + .minisig. Приложение обновляет эту пару через Cloudflare DoH по Shadowsocks с резервным Google DoH и проверяет закреплённый Minisign-ключ DNSCrypt до замены файлов; сгенерированный catalog-профиль dnscrypt-proxy содержит urls = [] и читает только локальный кэш. В Clean Mode та же структура размещается внутри session root.

WinDivert / NetworkService

WinDivert runtime материализуется только для Admin Mode под Runtime\WinDivert.

Встроенный Shadowsocks.NetworkService извлекается во временный уникальный каталог:

Temp\NetworkService\<version>\<hash>\<pid-guid>\

Извлечение синхронизируется и проверяется по hash.

Clean Mode

Portable/Clean Mode определяется suffix p в имени EXE, например:

Shadowsocksp.exe
Shadowsocks-5.2p.exe

Каждый запуск получает уникальный root:

%TEMP%\Shadowsocks\Clean\<timestamp>-<pid>-<guid>\

Clean Mode:

  • не читает normal %LOCALAPPDATA%\Shadowsocks;
  • не мигрирует старые sidecars;
  • отключает Start with Windows;
  • размещает plugins/DNSCrypt/cache/logs внутри Temp session;
  • при Quit удаляет session best-effort;
  • позже очищает abandoned sessions.

Start with Windows

Обычный режим поддерживает стабильную проверенную SHA-256 копию:

%LOCALAPPDATA%\Shadowsocks\Startup\Shadowsocks.exe

HKCU Run указывает на неё с --start-hidden и внутренним startup-origin для основного EXE. Это позволяет self-updater обновлять настоящий product EXE, даже если текущий процесс запущен из старой startup-copy.

Self-update

Application self-update намеренно находится вне StorageRoot:

%TEMP%\Shadowsocks\Updates\<transaction>\
  Shadowsocks-win-x64.zip
  Shadowsocks-win-x64.zip.sha256
  Shadowsocks.Update.exe

Staging должен пережить остановку приложения и очистку Clean Mode session. Updater повторно проверяет SHA-256 собственного staged image, ждёт старый PID, сохраняет rollback copy, заменяет target EXE, запускает новую копию и только затем transaction удаляется.

Registry boundary

Registry используется только там, где этого требует Windows integration:

  • Start with Windows;
  • ss:// protocol association;
  • WinINet/system proxy;
  • read-only discovery лаунчеров/игр.

Настройки продукта в Registry не хранятся.

Инвариант релиза

Ни один product code path не должен создавать mutable sidecar рядом с Shadowsocks.exe. Release validator проверяет one-file distribution и запрещает retired executable-side config/runtime artifacts.

Clone this wiki locally