Standard runtime services:
app(FastAPI API-only service)worker(RQ worker)scheduler(ingest scheduler loop)db(PostgreSQL)redis(queue backend)
Frontend is deployed as a separate static SPA build from frontend/dist.
See architecture details in docs/architecture.md.
Start local full stack:
docker compose up --build
This runs API, frontend dev server, queue workers, and data services for local development.
Release artifacts are published to GHCR on each main release:
ghcr.io/pexnet/sift-backend:vX.Y.Zand:latestghcr.io/pexnet/sift-frontend:vX.Y.Zand:latest
Deploy using:
export SIFT_VERSION=vX.Y.Z
docker compose -f docker-compose.release.yml pull
docker compose -f docker-compose.release.yml up -ddocker-compose.release.yml runs:
app(runs Alembic migration then starts API)workerschedulerfrontend(Nginx static host +/apireverse proxy toapp)dbredis
Run the devcontainer service topology (without opening VS Code):
docker compose -f .devcontainer/docker-compose.yml up --build
This profile includes the frontend Vite service on http://localhost:5173 for local full-stack development.
From frontend/:
pnpm install --frozen-lockfilepnpm run gen:openapipnpm run build
Deploy frontend/dist to your static host (Nginx, CDN, object storage + CDN, etc.) with SPA history fallback to
index.html.
Recommended integration pattern:
- serve frontend and backend on the same site origin, and proxy
/api/*to the FastAPI service. - if deployed cross-origin, keep CORS and credential settings aligned.
- set
VITE_API_BASE_URLat frontend build time when API is not available on the same origin.
- Run database migrations before or during app startup.
- Keep scheduler and worker running to support recurring ingestion.
- Configure CORS for deployed frontend origins:
SIFT_CORS_ALLOW_ORIGINSSIFT_CORS_ALLOW_CREDENTIALSSIFT_CORS_ALLOW_METHODSSIFT_CORS_ALLOW_HEADERS
- Configure queue/scheduler behavior with:
SIFT_INGEST_QUEUE_NAMESIFT_SCHEDULER_POLL_INTERVAL_SECONDSSIFT_SCHEDULER_BATCH_SIZE