Run it on your own server

The same codebase runs here as a preview and on Ubuntu as two processes: the web app and a worker. No Docker. PostgreSQL is the only database. The full checklist is in DEPLOY.md in the repository.

  1. Ubuntu 22.04 or 24.04. Create a non-root user, enable ufw (22, 80, 443), install Node 22, PostgreSQL, Nginx, and certbot.
  2. Create a database and user. Put DATABASE_URL and the rest of the secrets in /etc/au-property-radar.env. Copy .env.example as the list of names. Do not commit that file.
  3. If PostGIS installs, the app enables it on startup. If it does not, radius search uses latitude, longitude, a bounding box, and haversine. Install does not fail.
  4. Build with NITRO_PRESET=node-server. systemd starts node .output/server/index.mjs for the web app and node --import tsx src/worker/index.ts for the worker. Both restart on failure. Logs go to journald.
  5. Nginx proxies to 127.0.0.1:3000 with gzip. certbot issues the certificate. The worker needs DATABASE_URL. It will not share the preview database.
  6. deploy/deploy.sh pulls, installs, builds, migrates, restarts, hits /api/health, and rolls back if health fails. deploy/backup.sh dumps Postgres daily and keeps 14 days.
  7. Add SPF, DKIM and DMARC for the address in SMTP_FROM before you send alerts. Stripe webhooks point at /api/stripe/webhook. Bounce callbacks can post to /api/email/event with the EMAIL_EVENT_TOKEN header.

What stays honest

Connectors that do not have a cleared feed do not pretend to be live. Sample cards are a tour. NSW Valuer General sales, Landgate, PlanningAlerts and G-NAF stay off until you approve the licence.

Passwords are hashed with Better Auth scrypt (N=16384, r=16, p=1). That is the hasher the sign-in server uses. Sessions are secure cookies in production and a bearer token only inside this preview.

Set ADMIN_EMAILS to your address before the first production start. The first account is an operator only on the embedded preview database, not on your VPS.