siyuan-note/siyuan · error

unknown cloud provider [%d]

Error message

unknown cloud provider [%d]

What it means

newRepository() builds the cloud-backed dejavu repo client from a switch on Conf.Sync.Provider. Valid values are 0 (official SiYuan cloud), 2 (S3), 3 (WebDAV), 4 (local directory); anything else hits the default branch and returns fmt.Errorf("unknown cloud provider [%d]", ...). This indicates a corrupted or out-of-range provider value in conf.json.

Source

Thrown at kernel/model/repository.go:2711

		cloudRepo = cloud.NewSiYuan(&cloud.BaseCloud{Conf: cloudConf})
	case conf.ProviderS3:
		// 显式注入 SiYuan UA,覆盖 aws SDK 默认 UA(含架构、Go 版本、SDK 版本等冗余信息),便于 S3 服务端按 SiYuan/ 前缀识别加白名单
		s3HTTPClient := httpclient.NewUserAgentClient(httpclient.NewTransport(cloudConf.S3.SkipTlsVerify))
		s3HTTPClient.Timeout = time.Duration(cloudConf.S3.Timeout) * time.Second
		cloudRepo = cloud.NewS3(&cloud.BaseCloud{Conf: cloudConf}, s3HTTPClient)
	case conf.ProviderWebDAV:
		webdavClient := gowebdav.NewClient(cloudConf.WebDAV.Endpoint, cloudConf.WebDAV.Username, cloudConf.WebDAV.Password)
		a := cloudConf.WebDAV.Username + ":" + cloudConf.WebDAV.Password
		auth := "Basic " + base64.StdEncoding.EncodeToString([]byte(a))
		webdavClient.SetHeader("Authorization", auth)
		webdavClient.SetHeader("User-Agent", util.UserAgent)
		webdavClient.SetTimeout(time.Duration(cloudConf.WebDAV.Timeout) * time.Second)
		webdavClient.SetTransport(httpclient.NewTransport(cloudConf.WebDAV.SkipTlsVerify))
		cloudRepo = cloud.NewWebDAV(&cloud.BaseCloud{Conf: cloudConf}, webdavClient)
	case conf.ProviderLocal:
		cloudRepo = cloud.NewLocal(&cloud.BaseCloud{Conf: cloudConf})
	default:
		err = fmt.Errorf("unknown cloud provider [%d]", Conf.Sync.Provider)
		return
	}

	ignoreLines := getSyncIgnoreLines()
	ignoreLines = append(ignoreLines, "/.siyuan/conf.json") // 忽略旧版同步配置
	ret, err = dejavu.NewRepo(util.DataDir, util.RepoDir, util.HistoryDir, util.TempDir, Conf.System.ID, Conf.System.Name, Conf.System.OS, Conf.Repo.Key, ignoreLines, cloudRepo)
	if err != nil {
		logging.LogErrorf("init data repo failed: %s", err)
		return
	}
	return
}

func init() {
	subscribeRepoEvents()
}

func subscribeRepoEvents() {

View on GitHub (pinned to afa823b6b4)

Solutions

  1. Open Settings - Account & Sync and re-select a valid cloud provider (SiYuan/S3/WebDAV/Local), which rewrites conf.sync.provider
  2. Or edit workspace/conf.json and set sync.provider to 0, 2, 3, or 4, then restart the kernel
  3. Avoid third-party tools that write sync config; after restoring backups, re-validate provider settings in the UI

Example fix

// before: conf.json has "provider": 7 inside "sync"

// after
{
  "sync": {
    "provider": 4,
    "local": { "endpoint": "D:/siyuan-sync" }
  }
}
Defensive patterns

Strategy: validation

Validate before calling

validProviders := map[int]bool{conf.ProviderSiYuan: true, conf.ProviderS3: true, conf.ProviderWebDAV: true, conf.ProviderLocal: true}
if !validProviders[model.Conf.Sync.Provider] {
    return errors.New("sync.provider in conf.json is invalid; re-select the provider in Settings")
}
repo, err := model.NewRepository()

Type guard

func isValidSyncProvider(p int) bool {
    return p == 0 || p == 2 || p == 3 || p == 4
}

Prevention

When it happens

Trigger: Conf.Sync.Provider holds a value not in {0,2,3,4} when newRepository() runs — e.g. hand-edited workspace conf.json, a config written by a different SiYuan version or fork, or value 1 (a removed legacy provider id) carried over from an old config (kernel/model/repository.go:2711).

Common situations: Manual conf.json edits; syncing a workspace between versions whose provider enum changed; third-party tools writing sync settings; restored config from an incompatible backup.

Related errors


AI-assisted analysis of siyuan-note/siyuan@afa823b6b4 (2026-08-18). Data as JSON: /api/errors/ed2ca83b20c85685. Report an issue: GitHub.