---
title: "BAIC — Client Knowledge"
aliases: [baic-dashboard, baic-deploy]
tags: [client-knowledge, baic, deploy, rsync, azure-ad]
created: 2026-05-06
updated: 2026-05-10
---

# BAIC

BAIC is a Chinese automotive brand. Oliver Agency maintains the BAIC Dashboard — an internal analytics/reporting tool hosted on the main Oliver web server (`baic` SSH alias).

## Key Facts

- **SSH alias**: `baic` → `vadym.samoilenko@10.220.72.13` (same server as many Oliver projects — see [[wiki/infrastructure/server-baic]])
- **URL**: `https://baic.oliver.solutions/dashboard/`
- **Auth**: Azure AD / Microsoft SSO via MSAL
- **Stack**: React + Vite (frontend) + FastAPI (backend)

## Deploy Process

> [!important] No git on server — deploy via rsync only

```bash
# 1. Build locally
npm run build

# 2. Sync dist/ to server (no git pull on server)
rsync -avz --delete dist/ baic:/var/vhosts/baic.oliver.solutions/htdocs/dashboard/
```

- Remote path: `/var/vhosts/baic.oliver.solutions/htdocs/dashboard/`
- Backend systemd service: `baic_dashboard.service` (underscore, not hyphen)

```bash
# Restart backend after Python changes
ssh baic "sudo systemctl restart baic_dashboard.service"

# Check status
ssh baic "sudo systemctl status baic_dashboard.service"
```

## Deploy Gotchas

| Issue | Detail |
|-------|--------|
| No `.env` file needed | Backend reads env vars with OS defaults directly in `app.py` — do not create `.env` on server |
| rsync "failed to set times" warning | `rsync` warns about directory timestamp permission — **benign**; content copies correctly |
| `deploy.sh` is initial setup only | Script in repo targets first-time setup (wrong service name, interactive prompts) — never use for updates |
| Old Vite hashes accumulate | `assets/` on the server grows with each deploy (old content-hash files never cleaned); manually prune if needed |

## Known Gotchas

| Gotcha | Detail | Article |
|--------|--------|---------|
| FastAPI `root_path` route stripping | Routes must be registered WITHOUT `/dashboard` prefix | [[wiki/concepts/fastapi-root-path-route-stripping]] |
| SSE needs `?token=` | `EventSource` can't set custom headers | [[wiki/concepts/sse-jwt-query-param]] |
| SPA index.html must be no-cache | Old hashes cause blank screen after rebuild | [[wiki/concepts/spa-index-html-cache-control]] |
| MS SSO IDs are not UUIDs | `ms-4n0T2x-...` format breaks UUID validators | [[wiki/concepts/microsoft-sso-non-uuid-ids]] |

## Features

| Feature | Detail | Added |
|---------|--------|-------|
| Per-User Report tab | CSV export for Michael (client stakeholder) — replaces manual Python script previously run ad-hoc | 2026-05-06 |

## Pending

- [ ] Set up git deploy: deploy key → Bitbucket → clone to `/opt/baic_dashboard` → `update.sh` (eliminates rsync manual step)

## Related

- [[wiki/infrastructure/server-baic]] — server overview (hosts 40+ domains, not just BAIC)
- [[wiki/tech-patterns/azure-ad-msal-auth]] — MSAL SSO pattern
- [[wiki/tech-patterns/react-vite-typescript]] — frontend stack
