{"record":{"id":"50129d90735bf2bd","repo":"actualbudget/actual","slug":"no-sync-server-configured","errorCode":null,"errorMessage":"No sync server configured.","messagePattern":"No sync server configured\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/loot-core/src/server/auth/app.ts","lineNumber":103,"sourceCode":"\n  return {\n    bootstrapped: res.data.bootstrapped,\n    availableLoginMethods: res.data.availableLoginMethods || [\n      { method: 'password', active: true, displayName: 'Password' },\n    ],\n    multiuser: res.data.multiuser || false,\n    hasServer: true,\n  };\n}\n\nasync function bootstrap(loginConfig: {\n  password?: string;\n  openId?: OpenIdConfig;\n}) {\n  try {\n    const serverConfig = getServer();\n    if (!serverConfig) {\n      throw new Error('No sync server configured.');\n    }\n    await post(serverConfig.SIGNUP_SERVER + '/bootstrap', loginConfig);\n  } catch (err) {\n    if (err instanceof PostError) {\n      return {\n        error: err.reason || 'network-failure',\n      };\n    }\n\n    throw err;\n  }\n  return {};\n}\n\nasync function getLoginMethods() {\n  let res: {\n    methods?: Array<{ method: string; displayName: string; active: boolean }>;\n  };","sourceCodeStart":85,"sourceCodeEnd":121,"githubUrl":"https://github.com/actualbudget/actual/blob/d4334cb6e6123f4d3bcea1ad6166608884c7e658/packages/loot-core/src/server/auth/app.ts#L85-L121","documentation":"bootstrap calls getServer() to find the configured sync server; if no server URL is configured (SERVER_URL unset), there is no endpoint to POST /bootstrap to, so it throws immediately.","triggerScenarios":"Calling app.bootstrap() (server bootstrapping of first user/password) in an environment without SERVER_URL set, e.g. a pure local-only deployment.","commonSituations":"Self-hosters running without a sync server who invoke the bootstrap RPC; missing or empty SERVER_URL env var in the sync-server deployment; confusing local budget bootstrapping with remote server bootstrapping.","solutions":["Set the SERVER_URL environment variable to the sync server's base URL before calling bootstrap.","If you do not use a sync server, do not call bootstrap — configure the app in local-only mode.","Verify getServer() configuration loading (dotenv/config file) is actually applied in your process."],"exampleFix":"// before\nyarn workspace @actual-app/sync-server start   # SERVER_URL unset, bootstrap fails\n// after\nSERVER_URL=http://localhost:5006 yarn workspace @actual-app/sync-server start","handlingStrategy":"try-catch","validationCode":"function isSyncConfigured() {\n  return typeof process.env.SERVER_URL === 'string' && process.env.SERVER_URL.length > 0;\n}\nif (!isSyncConfigured()) throw new Error('Set SERVER_URL before bootstrapping a sync server');","typeGuard":null,"tryCatchPattern":"try {\n  await app.bootstrap(loginConfig);\n} catch (e) {\n  if (e.message === 'No sync server configured.') {\n    console.error('SERVER_URL is not set; start the app in local-only mode or configure the sync server.');\n  } else throw e;\n}","preventionTips":["Always export SERVER_URL in deployment env files","Do not call server bootstrap RPCs when running local-only","Add a startup healthcheck that logs when SERVER_URL is missing"],"tags":["sync-server","configuration","missing-env-var"],"backgroundTag":"missing-server-url","analyzedSha":"d4334cb6e6123f4d3bcea1ad6166608884c7e658","analyzedAt":"2026-08-29T01:02:11.213Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}