* feat(demo): add DEMO_MODE runtime helpers and /api/demo/info endpoint * feat(demo): enforce simulated and blocked API actions under DEMO_MODE * feat(demo): add deterministic seed dataset and 6-hour auto-reset * feat(demo-ui): add demo banner and custom sonner toasts for simulated/blocked actions * test+docs(demo): add demo mode coverage, behavior matrix, and operator docs * formatting * tests * feat(demo): seed resets from typed baseline defaults * formatting * feat(demo): enrich baseline seed data and demo project catalog * feat(demo): expand seeded applications and chart time ranges * refactor(demo): split demo seed data from generation logic * feat(demo): cap generated application history to 30 days * feat(demo): rebalance generated job status distribution * feat(demo-ui): make demo banner fixed and topmost * minor fixes * formatting * duration revert * durations * feat(demo): share demo info hook, brighten demo toasts, and enforce webhook auth * comment explaning * formatting * comments * deadline builder comment
2.4 KiB
Self-Hosting (Docker Compose)
The easiest way to run JobOps is via Docker Compose. The app is self-configuring and will guide you through the setup on your first visit.
Prereqs
- Docker Desktop or Docker Engine + Compose v2
1) Start the stack
No environment variables are strictly required to start. Simply run:
docker compose up -d
This pulls the pre-built image from GitHub Container Registry (GHCR) and starts the API, UI, and scrapers in a single container. The image is multi-arch (supports amd64 and arm64), making it compatible with Apple Silicon and Raspberry Pi.
If you want to build it yourself, you can run docker compose up -d --build.
2) Access the app and Onboard
Open your browser to:
- Dashboard: http://localhost:3005
On first launch, you will be greeted by an Onboarding Wizard. The app will help you validate and save your configuration:
- LLM Provider: OpenRouter is the default. Add an API key if required (OpenRouter/OpenAI/Gemini), or configure a local base URL (LM Studio/Ollama).
- PDF Export: Add your RxResume credentials (used to export PDFs from v4.rxresu.me).
- Template Resume: Select a base resume from your v4.rxresu.me account.
The app saves these to its persistent database, so you don't need to manage .env files for basic setup. All other settings (like search terms, job sources, and more) can also be configured directly in the UI.
Upgrade note: OPENROUTER_API_KEY is deprecated. Existing OpenRouter keys are automatically migrated/copied to LLM_API_KEY so you don't lose them.
Persistent data
./data is bind-mounted into the container. It stores:
- SQLite DB:
data/jobs.db(contains your API keys and configuration) - Generated PDFs:
data/pdfs/ - Template resume selection: Stored internally after selection.
Public demo deployment (DEMO_MODE=true)
For a public sandbox website, set DEMO_MODE=true on the container.
Behavior in demo mode:
- Works (local demo DB): browsing, filtering, job status updates, timeline edits.
- Simulated (no external side effects): pipeline run, job summarize/process/rescore/pdf/apply, onboarding validations.
- Blocked: settings writes, database clear, backup create/delete, status bulk deletes.
- Auto-reset: seeded demo data is reset every 6 hours.
Updating
git pull
docker compose pull
docker compose up -d