Prerequisites
- A checkout of the same Quivr revision your installation runs, Python 3.12+ (
python3 --version), and the builtquivrbinary (quivr --version). - For Compose, the running
make devStack from this checkout and Docker Compose (docker compose version). Use its project name from.scratch/. Standalone Compose layouts and externally managed API processes are unsupported. - For Railway, the checked-in deployment layout, Railway CLI with
railway apiandrailway ssh, and an account/workspaceRAILWAY_API_TOKENwith operator access to every environment. Unset project-scopedRAILWAY_TOKEN; it cannot prove project-wide volume isolation. Every service must use one stable, redeployable artifact; stop deployment automation during maintenance. - Four data volumes dedicated to this installation: PostgreSQL, Temporal, Weaviate and SeaweedFS. The object store must contain only the engine’s
quivr-contentbucket. Source archives belong in a separate store. QUIVR_API_URLandQUIVR_API_KEYfor one organization, withcorpora:read,corpora:write,corpora:rename,connectors:readandconnectors:write. Install the required connector providers; credential deposits need the installation’s credential encryption key.- If you declare plugins,
QUIVR_OPERATOR_KEYwithplugins:admin. Run the plugin hosts before applying; this command registers and activates them through the public API.
Steps
1. Prepare private declarations
Copy the neutral sources example outside your checkout. Replace the feed URL, source bucket and prefixes. The example lists an RSS feed and an object-storage archive; its placeholders do not point at working sources. Corpora use stableidempotency_key values and name. A connector’s corpus references one of those keys. Each connector declares its own key, source_namespace, kind, nonsecret config, work_queue (live by default, or bulk) and schedule.interval_seconds. An omitted interval uses the installed kind’s default.
Put credential environment variable names in credential_env; load their values into your shell privately. Alternatively, set credential_file to a private 0600 JSON object matching the kind’s credential schema. Existing credentials are not overwritten: the public replacement API has no conditional version fence. Use an explicit public rotation procedure, or reload after reset. Relative paths resolve beside the declaration. Never put secret values in the declaration, URLs or plugin configuration.
A Corpus may select an existing retrieval_profile by name at creation. Apply refuses later profile changes; use the plugin upgrade procedure for those changes.
Optional plugins entries contain idempotency_key, endpoint, manifest_file, and nonsecret configuration. They accept fixture_files (fixture name to local path), routes, kinds and spaces from the public registration API. Manifests and fixtures resolve beside the declaration. Conflicting declared plugin roles are refused before writes; a changed registration needs a new key. Plugin host secrets stay in the host environment.
Copy either the Compose installation example or the Railway example. Set your deployment name and selectors. dedicated: true asserts exclusive use of all four selected data volumes. Compose verifies project/service volume labels and refuses additional container attachments. Railway also verifies that no other environment attaches them; it refuses incomplete or unreadable ownership checks. Declare every Railway service with a supported role, including autoscaler when present.
2. Preview and reset
The following commands are examples requiring your private declarations and deployment access. Preview reads deployment state without stopping services:3. Preview and apply sources
Use the same API address and organization key on every replay. The private journal binds to both and stores resource IDs, creation intents and keyed credential digests. It contains no credential values. Back up this journal with your private declaration. These commands are examples requiring your API access and source credentials:No changes. and makes no remote writes.
Check it worked
Reset checks that replacement blob and vector stores are empty before returning. Railway also checks the migrated database has no Corpora. After apply, list your Corpora and connectors through the public API; source import continues on their declared schedules. An unchanged confirmed apply must printNo changes..