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.
- Ubuntu 22.04 or 24.04. Create a non-root user, enable ufw (22, 80, 443), install Node 22, PostgreSQL, Nginx, and certbot.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.