Skip to content

Quick start

Five commands bring up the whole stack locally: PostgreSQL and Redis in Docker, the FastAPI backend on port 8088, the React frontend on port 8888 and a Celery worker. The account is admin, with the password you set during pnpm db:init.

  • Node.js ≥ 22.13 (pnpm is pinned in package.json and installed by corepack)
  • Python ≥ 3.10 and uv
  • Docker
终端窗口
docker compose -f docker-compose.dev.yml up -d # PostgreSQL 16 + Redis
pnpm install:all # JS workspace, Python deps, git hooks, Playwright Chromium
cp apps/api/backend/.env.example apps/api/backend/.env # defaults already match the containers above
pnpm db:init # tables + seed data + a new admin password (first run only)
pnpm dev # api :8088 · web :8888 · celery worker
# open http://127.0.0.1:8888

Open http://127.0.0.1:8888 and sign in as admin with the password you set during pnpm db:init.

StepCheck
docker compose … up -ddocker ps shows fba_postgres and fba_redis as healthy
pnpm install:allfinishes without errors, and apps/api/.venv exists
pnpm db:initthe last line says the new database was stamped at the migration head; pnpm db:current shows a revision marked (head)
pnpm devthe sign-in page shows a captcha image — the backend serves it, so seeing it means frontend and backend are connected
Sign inyou land on the dashboard, which starts with “you have N things waiting”

Stuck on a step? Search the error text in the FAQ.

Why does the sign-in page ask for a captcha?

Section titled “Why does the sign-in page ask for a captcha?”

The image captcha is on by default. To skip it locally, set LOGIN_CAPTCHA_ENABLED to false under System → Config; it takes effect immediately. To type it instead, take the uuid from the GET /api/v1/auth/captcha response and read the answer from Redis:

终端窗口
docker exec fba_redis redis-cli --raw GET "fba:login:captcha:<uuid>"

How do I use SQL Server, MySQL or S3 instead?

Section titled “How do I use SQL Server, MySQL or S3 instead?”

Everything optional is in the same docker-compose.dev.yml; turn it on and change DATABASE_* in .env.

To useCommandNotes
SQL Serverdocker compose -f docker-compose.dev.yml --profile sqlserver up -d mssqlThe host also needs Microsoft ODBC Driver 18 — the backend connects through aioodbc, so the driver inside the container doesn’t count
MySQLbring your own MySQL 8.xDATABASE_TYPE='mysql', charset utf8mb4
S3-compatible storage (RustFS)docker compose -f docker-compose.dev.yml --profile s3 up -d rustfsSet STORAGE_ENCRYPT_SECRET_KEY in .env (openssl rand -hex 32) before adding a storage under System → Storage

See Databases for how the three databases are supported and tested.

ProcessPortStarted by
FastAPI backend (uvicorn, --reload)8088pnpm dev
React frontend (Vite)8888 (fixed — strictPort)pnpm dev
Celery worker with embedded beat—pnpm dev
PostgreSQL / Redis5432 / 6380docker compose

The frontend port is fixed on purpose: CORS, OAuth2 redirect URIs and the desktop app’s dev URL all point at 8888, so Vite fails instead of drifting to 8889.