Self-hosted AI NVR/VMS in one container - on-device person/vehicle/face/plate detection, no cloud
2.3K
Privacy-first home & small-business camera recording + on-device AI. Your video never leaves your LAN — nothing is uploaded to any vendor cloud, and AI inference (people / vehicles / faces / license plates / pose / fall) runs entirely on-box, no OpenAI / Gemini / Claude API key required.
A self-hosted alternative to Frigate / Shinobi / ZoneMinder / Scrypted / Agent DVR / iSpy / MotionEye / BlueIris — but pre-bundled into a single container (ZLMediaKit + database + recording + detection + web admin + nginx, supervised by s6-overlay): no Mosquitto / DB / reverse-proxy / model-download wiring to do by hand.
Website: https://yun-kan.com · Changelog: https://yun-kan.com/changelog
This is the CPU build (martin888/yunkan = martin888/yunkan-cpu) — runs on any amd64 host, no special hardware. Intel iGPU? use martin888/yunkan-openvino (3–5× faster). NVIDIA GPU? use martin888/yunkan-cuda. Tags: latest and pinned (e.g. 0.9.9). Only one variant runs at a time (shared ports).
The installer auto-detects your hardware, picks the right variant, randomizes the JWT secret, and sets up the OTA self-update sidecar:
curl -fsSL https://cdn.yun-kan.com/yunkan-install.sh | bash
Then open http://:23406/, run the setup wizard (pick SQLite for the simplest path), create an admin, add cameras.
Save as compose.yml then docker compose up -d:
name: yunkan # fixed project name (kept stable across upgrades)
services:
yunkan:
image: martin888/yunkan-cpu:0.9.9 # or :latest
container_name: yunkan
restart: always
network_mode: host # WebRTC ICE / RTSP / HLS need many ports
volumes:
- ./data:/app/data # DB / logs / cookies / upgrade state
- ./recordings:/app/data/recordings # recordings (point at a big disk / NAS)
- /etc/machine-id:/etc/machine-id:ro # license HW fingerprint
- /sys/class/dmi/id/product_uuid:/sys/class/dmi/id/product_uuid:ro
- /var/run/docker.sock:/var/run/docker.sock # in-app OTA upgrades
environment:
- TZ=Asia/Shanghai
- SKYVIEW_SELF_CONTAINER_NAME=yunkan
License fingerprint: keep the
machine-id/product_uuidread-only mounts — without them the fingerprint drifts on every recreate and the license burns activation slots. In-app upgrades: one click in the web admin pulls the new image and recreates the container (DB backed up first, automatic rollback if the new version fails to start). Drop thedocker.sockmount if you don't want that — the web admin will then only notify of new versions and you upgrade withdocker compose pull && up -d.
| Port | Proto | Purpose |
|---|---|---|
23406 | tcp | Web dashboard / REST API (open this in a browser) |
23880 | tcp | RTSP |
24214 | tcp | HLS + WebRTC (WHEP) signaling + media-server API/hooks |
23515 | udp+tcp | WebRTC ICE media |
Public / WAN: set SKYVIEW_WEBRTC_EXTERN_IPS=<public-ip-or-domain> so WebRTC ICE candidates are reachable.
Keywords: NVR, VMS, CCTV, surveillance, IP camera, RTSP, ONVIF, person detection, vehicle detection, face recognition, license plate recognition, ALPR, fall detection, two-way audio, talkback, 24/7 recording, timeline playback, WebRTC, HLS, Home Assistant, MQTT, AI NVR, on-device AI, edge AI, no cloud, privacy, self-hosted, Frigate alternative, 云瞰, 摄像头, 监控, 本地 AI.
Content type
Image
Digest
sha256:ac6423b21…
Size
975.9 MB
Last updated
17 days ago
docker pull martin888/yunkan