146 lines
6.9 KiB
Markdown
146 lines
6.9 KiB
Markdown
# MobilityOps Unraid deployment evidence
|
|
|
|
## Outcome
|
|
|
|
- Deployment: **PASS**
|
|
- Gitea publication: **PASS**
|
|
- Gitea URL: `https://gitea.itworx.tech/Jens/MobilityOps`
|
|
- Visibility: private (verified in the Gitea web UI)
|
|
- Branch: `master`
|
|
- Verified baseline commit: `4bf9afbeff44088864e0844769d4dd0e4089d85b`
|
|
- Deployment implementation commit: `1e13943cffb2da8a328b5b1ea5e9b1fe73fdd774`
|
|
- Server: `192.168.10.150`
|
|
- Server directory: `/mnt/user/appdata/mobilityops`
|
|
- Compose project: `mobilityops`
|
|
- Application URL: `http://192.168.10.150:1236`
|
|
- Port mapping: LAN `0.0.0.0:1236` / `[::]:1236` to `web:80`
|
|
|
|
## Services and health
|
|
|
|
| Service | Runtime state | Health | Host exposure |
|
|
|---|---|---|---|
|
|
| `db` | running, 0 restarts | healthy | none (`5432/tcp` internal) |
|
|
| `api` | running, 0 restarts | healthy | none (`8000/tcp` internal) |
|
|
| `web` | running, 0 restarts | healthy | `1236:80` on LAN |
|
|
| shared host `n8n` | running | healthy | `5678:5678` on LAN; outside MobilityOps Compose |
|
|
|
|
The final review topology reuses the n8n container that was already running on the host.
|
|
Its empty public-host/editor URL settings were corrected in the persistent Unraid template
|
|
so workflow execution URLs are valid. The temporary Compose-owned n8n container was
|
|
removed without deleting its retained volume. Port `1236` was confirmed unused before the
|
|
original deployment; the application directory was created specifically for MobilityOps.
|
|
|
|
## Deployment commands
|
|
|
|
The existing SSH aliases resolve to the requested hosts and keys (`gitea.itworx.tech`
|
|
for Gitea SSH and `unraid` for root access). No key was created, copied, or replaced.
|
|
The committed source was transferred from the workstation; Unraid has no Gitea key.
|
|
|
|
Repository publication used the SSH clone URL supplied by Gitea:
|
|
|
|
```bash
|
|
git remote add origin ssh://git@192.168.10.150:222/Jens/MobilityOps.git
|
|
git push -u origin master
|
|
git push origin --tags
|
|
```
|
|
|
|
Git and the Gitea web UI both verified `master` as the default branch, the full commit
|
|
history, baseline commit `4bf9afbeff44088864e0844769d4dd0e4089d85b`, and zero tags.
|
|
The remote tree contains no `.env`, local database, `node_modules`, virtual environment,
|
|
test cache, build cache, Playwright output, or browser binaries.
|
|
|
|
```bash
|
|
git archive --format=tar.gz --output=<temporary-archive> <commit>
|
|
scp <temporary-archive> unraid:/mnt/user/appdata/mobilityops/.deploy/source.tar.gz
|
|
ssh unraid
|
|
cd /mnt/user/appdata/mobilityops
|
|
tar -xzf .deploy/source.tar.gz
|
|
./deploy/unraid/configure-env.sh http://192.168.10.150:1236
|
|
docker compose -p mobilityops -f compose.yaml -f compose.unraid.yaml up --build -d db api web
|
|
docker compose -p mobilityops -f compose.yaml -f compose.unraid.yaml exec -T api \
|
|
python -m app.cli seed --reset
|
|
./deploy/unraid/setup-existing-n8n.sh \
|
|
n8n \
|
|
http://192.168.10.150:1236/api/v1/integrations/n8n/return-callback
|
|
docker compose -p mobilityops -f compose.yaml -f compose.unraid.yaml up -d db api web
|
|
```
|
|
|
|
The server `.env` was created from `.env.example`, is mode `0600`, and contains generated
|
|
runtime secrets. Secret values and n8n owner credentials remain server-only and are not
|
|
included here or in Git.
|
|
|
|
## Validation evidence
|
|
|
|
- Migration: `e7b08389f47f (head)`.
|
|
- Deterministic seed: users 2, customers 180, vehicles 50, bookings 246, inspections 75,
|
|
maintenance 40, data-quality issues 26, workflow runs 20.
|
|
- HTTP: `GET /` returned 200; `GET /health` returned
|
|
`{"status":"ok","service":"mobilityops-api"}` through the web proxy.
|
|
- Backend gates in an isolated local Compose project: 66 tests passed, Ruff clean, mypy
|
|
clean across 44 files.
|
|
- Frontend: `npm ci && npm run build` completed (`tsc -b && vite build`).
|
|
- Logs: no traceback, fatal, uncaught, or unresolved startup error in the deployment log
|
|
scan. Browser console had no warnings or errors during the smoke test.
|
|
- Browser smoke test in Chrome: Operations Manager demo login, Dashboard, Vehicles,
|
|
Bookings, Data Quality, Knowledge, Automation, and Audit all loaded from the LAN URL.
|
|
- Dashboard showed persisted seed metrics (21 available, 11 rented, 6 cleaning,
|
|
5 maintenance, 7 blocked, 22 open issues, 1 pending/failed workflow).
|
|
- Return workflow: `BK-DEMO-RETURN` accepted 54,700 km, created `INSP-0076` and
|
|
`DQ-RET-0076`, preserved the 54,820 km canonical odometer, and changed the booking to
|
|
returned.
|
|
- Shared-n8n round trip: final post-deploy event `98eb06dc-0bcc-4e3d-96ec-c23b2d266293`
|
|
reached `succeeded` on attempt 1 with no last error; the deterministic reset afterwards
|
|
restored `BK-DEMO-RETURN` to `active`.
|
|
- Data quality: `DQ-RET-0076` displayed the persisted regression evidence and related
|
|
booking/inspection references.
|
|
- Knowledge: UI truthfully showed `Provider: demo · available · 10 procedures indexed`;
|
|
the damage question returned grounded excerpts and citations from the local procedures.
|
|
|
|
## Integration status
|
|
|
|
- RAGcore: disabled for this deployment; `KNOWLEDGE_PROVIDER=demo`. No claim of a live
|
|
RAGcore connection is shown. Operational functionality is unaffected.
|
|
- ITWorx MCP Hub: registration disabled with `MCP_HUB_REGISTRATION_ENABLED=false`; the
|
|
independently authenticated provider endpoints remain available internally to the web
|
|
proxy/API boundary, but no live Hub connection is claimed.
|
|
- n8n: the existing server instance at `http://192.168.10.150:5678` is healthy; the
|
|
MobilityOps workflow is imported/published there and a real return delivery succeeded.
|
|
The bundled MobilityOps service is disabled by default in the Unraid overlay.
|
|
|
|
## Known limitations
|
|
|
|
- RAGcore and ITWorx MCP Hub are intentionally not connected yet.
|
|
- Demo authentication remains the accepted HMAC-cookie PoC mechanism.
|
|
- The dependency advisories already documented in final acceptance remain unchanged.
|
|
|
|
## Redeploy
|
|
|
|
From the workstation, create an archive of the desired committed revision and transfer it
|
|
to `.deploy/source.tar.gz`. On Unraid, preserve `.env` and the named volumes, then run:
|
|
|
|
```bash
|
|
cd /mnt/user/appdata/mobilityops
|
|
tar -xzf .deploy/source.tar.gz
|
|
docker compose -p mobilityops -f compose.yaml -f compose.unraid.yaml up --build -d db api web
|
|
docker compose -p mobilityops -f compose.yaml -f compose.unraid.yaml exec -T api alembic current
|
|
curl -fsS http://127.0.0.1:1236/health
|
|
```
|
|
|
|
## Logs
|
|
|
|
```bash
|
|
cd /mnt/user/appdata/mobilityops
|
|
docker compose -p mobilityops -f compose.yaml -f compose.unraid.yaml ps
|
|
docker compose -p mobilityops -f compose.yaml -f compose.unraid.yaml logs --tail=200
|
|
docker compose -p mobilityops -f compose.yaml -f compose.unraid.yaml logs -f api web
|
|
docker logs -f n8n
|
|
```
|
|
|
|
## Safe rollback
|
|
|
|
Choose a known-good commit on the workstation, archive and transfer it as above, then on
|
|
Unraid extract it over the identifiable MobilityOps source directory and run the same
|
|
`up --build -d` command. Preserve `.env` and both named volumes; do not use `down -v`,
|
|
remove volumes, prune Docker, or modify unrelated containers. Check the target commit's
|
|
Alembic compatibility before rolling application code behind the current database schema.
|