forked from k-space/kube
		
	docs: camtiler & doors
This commit is contained in:
		| @@ -1,5 +1,7 @@ | |||||||
| # ansible doors -m shell -a "ctr image pull harbor.k-space.ee/k-space/mjpg-streamer:latest" | # ansible doors -m shell -a "ctr image pull harbor.k-space.ee/k-space/mjpg-streamer:latest" | ||||||
| # journalctl -u mjpg_streamer@video0.service -f | # journalctl -u mjpg_streamer@video0.service -f | ||||||
|  |  | ||||||
|  | # Referenced and documented by https://wiki.k-space.ee/en/hosting/doors | ||||||
| - name: Setup doors | - name: Setup doors | ||||||
|   hosts: doors |   hosts: doors | ||||||
|   tasks: |   tasks: | ||||||
| @@ -8,7 +10,7 @@ | |||||||
|       name: containerd |       name: containerd | ||||||
|       state: present |       state: present | ||||||
|  |  | ||||||
|   - name: Copy systemd service for Doorboy controller |   - name: Copy systemd service for Doorboy controller # https://git.k-space.ee/k-space/godoor | ||||||
|     copy: |     copy: | ||||||
|       dest: /etc/systemd/system/godoor.service |       dest: /etc/systemd/system/godoor.service | ||||||
|       content: | |       content: | | ||||||
| @@ -34,7 +36,7 @@ | |||||||
|       daemon_reload: yes |       daemon_reload: yes | ||||||
|       name: godoor.service |       name: godoor.service | ||||||
|  |  | ||||||
|   - name: Copy systemd service for mjpg-streamer |   - name: Copy systemd service for mjpg-streamer # https://git.k-space.ee/k-space/mjpg-steramer | ||||||
|     copy: |     copy: | ||||||
|       dest: /etc/systemd/system/mjpg_streamer@.service |       dest: /etc/systemd/system/mjpg_streamer@.service | ||||||
|       content: | |       content: | | ||||||
|   | |||||||
| @@ -1,5 +1,56 @@ | |||||||
| To apply changes: | # Cameras | ||||||
|  | Camtiler is the umbrella name for our homegrown camera surveilance system. | ||||||
|  |  | ||||||
|  | Everything besides [Camera](#camera)s is deployed with Kubernetes. | ||||||
|  |  | ||||||
|  | ## Components | ||||||
|  |  | ||||||
|  | <!-- Manually rendered with https://dreampuf.github.io/GraphvizOnline | ||||||
|  | digraph G { | ||||||
|  |   "camera-operator" -> "camera-motion-detect" [label="deploys"] | ||||||
|  |   "camera-tiler" -> "cam.k-space.ee/tiled" | ||||||
|  |   camera -> "camera-tiler" | ||||||
|  |   camera -> "camera-motion-detect" -> mongo | ||||||
|  |   "camera-motion-detect" -> "Minio S3" | ||||||
|  |  | ||||||
|  |   "cam.k-space.ee" -> mongo [label="queries events", decorate=true] | ||||||
|  |   mongo -> "camtiler-event-broker" [label="transforms object to add (signed) URL to S3", ] | ||||||
|  |   "camtiler-event-broker" -> "cam.k-space.ee" | ||||||
|  |  | ||||||
|  |   "Minio S3" -> "cam.k-space.ee" [label="using signed URL from camtiler-event-broker", decorate=true] | ||||||
|  |  | ||||||
|  |   camera [label="📸 camera"] | ||||||
|  | } | ||||||
|  | --> | ||||||
|  |  | ||||||
|  | ### 📸 Camera | ||||||
|  | Cameras are listed in [application.yml](application.yml) as `kind: Camera`. | ||||||
|  |  | ||||||
|  | Two types of camera hosts: | ||||||
|  | - GL-AR150 with [openwrt-camera-images](https://git.k-space.ee/k-space/openwrt-camera-image). | ||||||
|  | - [Doors](https://wiki.k-space.ee/e/en/hosting/doors) (Raspberry Pi) with mjpg-streamer. | ||||||
|  |  | ||||||
|  | ### camera-tiler (cam.k-space.ee/tiled) | ||||||
|  | Out-of-bound, connects to cameras and streams to web browser. | ||||||
|  |  | ||||||
|  | One instance per every camera | ||||||
|  |  | ||||||
|  | #### camera-operator | ||||||
|  | Functionally the same as a kubernetes deployment for camera-tiler. | ||||||
|  |  | ||||||
|  | Operator/deployer for camera-tiler. | ||||||
|  |  | ||||||
|  | ### camera-motion-detect | ||||||
|  | Connects to cameras, on motion writes events to Mongo and frames to S3. | ||||||
|  |  | ||||||
|  | ### cam.k-space.ee (logmower) | ||||||
|  | Fetches motion-detect events from mongo. Fetches referenced images from S3 (minio). | ||||||
|  |  | ||||||
|  | #### camtiler-event-broker | ||||||
|  | MitM between motion-detect -> mongo. Appends S3 URLs to the response. | ||||||
|  |  | ||||||
|  | ## Kubernetes commands | ||||||
|  | Apply changes: | ||||||
| ``` | ``` | ||||||
| kubectl apply -n camtiler \ | kubectl apply -n camtiler \ | ||||||
|   -f application.yml \ |   -f application.yml \ | ||||||
| @@ -13,14 +64,12 @@ kubectl apply -n camtiler \ | |||||||
|   -f networkpolicy-base.yml |   -f networkpolicy-base.yml | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| To deploy changes: | Deploy changes: | ||||||
|  |  | ||||||
| ``` | ``` | ||||||
| kubectl -n camtiler rollout restart deployment.apps/camtiler | kubectl -n camtiler rollout restart deployment.apps/camtiler | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| To initialize secrets: | Initialize secrets: | ||||||
|  |  | ||||||
| ``` | ``` | ||||||
| kubectl create secret generic -n camtiler mongodb-application-readwrite-password --from-literal="password=$(cat /dev/urandom | base64 | head -c 30)" | kubectl create secret generic -n camtiler mongodb-application-readwrite-password --from-literal="password=$(cat /dev/urandom | base64 | head -c 30)" | ||||||
| kubectl create secret generic -n camtiler mongodb-application-readonly-password --from-literal="password=$(cat /dev/urandom | base64 | head -c 30)" | kubectl create secret generic -n camtiler mongodb-application-readonly-password --from-literal="password=$(cat /dev/urandom | base64 | head -c 30)" | ||||||
| @@ -32,8 +81,7 @@ kubectl -n camtiler create secret generic camera-secrets \ | |||||||
|     --from-literal=password=... |     --from-literal=password=... | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| To restart all deployments: | Restart all deployments: | ||||||
|  |  | ||||||
| ``` | ``` | ||||||
| for j in $(kubectl get deployments -n camtiler -o name); do kubectl rollout restart -n camtiler $j; done | for j in $(kubectl get deployments -n camtiler -o name); do kubectl rollout restart -n camtiler $j; done | ||||||
| ``` | ``` | ||||||
|   | |||||||
| @@ -268,6 +268,7 @@ spec: | |||||||
|           annotations: |           annotations: | ||||||
|             summary: CPU limits are bottleneck |             summary: CPU limits are bottleneck | ||||||
| --- | --- | ||||||
|  | # Referenced by README.md | ||||||
| apiVersion: k-space.ee/v1alpha1 | apiVersion: k-space.ee/v1alpha1 | ||||||
| kind: Camera | kind: Camera | ||||||
| metadata: | metadata: | ||||||
|   | |||||||
							
								
								
									
										131
									
								
								camtiler/cams.graphviz.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								camtiler/cams.graphviz.svg
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,131 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||||||
|  | <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> | ||||||
|  | <!-- Generated by graphviz version 2.40.1 (20161225.0304) | ||||||
|  |  --> | ||||||
|  | <!-- Title: G Pages: 1 --> | ||||||
|  | <svg width="658pt" height="387pt" viewBox="0.00 0.00 658.36 386.80" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> | ||||||
|  | <g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 382.8)"> | ||||||
|  | <title>G</title> | ||||||
|  | <polygon fill="#ffffff" stroke="transparent" points="-4,4 -4,-382.8 654.3562,-382.8 654.3562,4 -4,4"/> | ||||||
|  | <!-- camera-operator --> | ||||||
|  | <g id="node1" class="node"> | ||||||
|  | <title>camera-operator</title> | ||||||
|  | <ellipse fill="none" stroke="#000000" cx="356.22" cy="-360.8" rx="74.095" ry="18"/> | ||||||
|  | <text text-anchor="middle" x="356.22" y="-356.6" font-family="Times,serif" font-size="14.00" fill="#000000">camera-operator</text> | ||||||
|  | </g> | ||||||
|  | <!-- camera-motion-detect --> | ||||||
|  | <g id="node2" class="node"> | ||||||
|  | <title>camera-motion-detect</title> | ||||||
|  | <ellipse fill="none" stroke="#000000" cx="356.22" cy="-272" rx="95.5221" ry="18"/> | ||||||
|  | <text text-anchor="middle" x="356.22" y="-267.8" font-family="Times,serif" font-size="14.00" fill="#000000">camera-motion-detect</text> | ||||||
|  | </g> | ||||||
|  | <!-- camera-operator->camera-motion-detect --> | ||||||
|  | <g id="edge1" class="edge"> | ||||||
|  | <title>camera-operator->camera-motion-detect</title> | ||||||
|  | <path fill="none" stroke="#000000" d="M356.22,-342.4006C356.22,-330.2949 356.22,-314.2076 356.22,-300.4674"/> | ||||||
|  | <polygon fill="#000000" stroke="#000000" points="359.7201,-300.072 356.22,-290.072 352.7201,-300.0721 359.7201,-300.072"/> | ||||||
|  | <text text-anchor="middle" x="377.9949" y="-312.2" font-family="Times,serif" font-size="14.00" fill="#000000">deploys</text> | ||||||
|  | </g> | ||||||
|  | <!-- mongo --> | ||||||
|  | <g id="node6" class="node"> | ||||||
|  | <title>mongo</title> | ||||||
|  | <ellipse fill="none" stroke="#000000" cx="292.22" cy="-199" rx="37.7256" ry="18"/> | ||||||
|  | <text text-anchor="middle" x="292.22" y="-194.8" font-family="Times,serif" font-size="14.00" fill="#000000">mongo</text> | ||||||
|  | </g> | ||||||
|  | <!-- camera-motion-detect->mongo --> | ||||||
|  | <g id="edge5" class="edge"> | ||||||
|  | <title>camera-motion-detect->mongo</title> | ||||||
|  | <path fill="none" stroke="#000000" d="M340.3997,-253.9551C332.3383,-244.76 322.4178,-233.4445 313.6783,-223.476"/> | ||||||
|  | <polygon fill="#000000" stroke="#000000" points="316.2049,-221.0485 306.9807,-215.8365 310.9413,-225.6632 316.2049,-221.0485"/> | ||||||
|  | </g> | ||||||
|  | <!-- Minio S3 --> | ||||||
|  | <g id="node7" class="node"> | ||||||
|  | <title>Minio S3</title> | ||||||
|  | <ellipse fill="none" stroke="#000000" cx="396.22" cy="-145" rx="47.0129" ry="18"/> | ||||||
|  | <text text-anchor="middle" x="396.22" y="-140.8" font-family="Times,serif" font-size="14.00" fill="#000000">Minio S3</text> | ||||||
|  | </g> | ||||||
|  | <!-- camera-motion-detect->Minio S3 --> | ||||||
|  | <g id="edge6" class="edge"> | ||||||
|  | <title>camera-motion-detect->Minio S3</title> | ||||||
|  | <path fill="none" stroke="#000000" d="M361.951,-253.804C368.6045,-232.6791 379.6542,-197.5964 387.4031,-172.9935"/> | ||||||
|  | <polygon fill="#000000" stroke="#000000" points="390.8337,-173.7518 390.4996,-163.1622 384.157,-171.6489 390.8337,-173.7518"/> | ||||||
|  | </g> | ||||||
|  | <!-- camera-tiler --> | ||||||
|  | <g id="node3" class="node"> | ||||||
|  | <title>camera-tiler</title> | ||||||
|  | <ellipse fill="none" stroke="#000000" cx="527.22" cy="-272" rx="57.8558" ry="18"/> | ||||||
|  | <text text-anchor="middle" x="527.22" y="-267.8" font-family="Times,serif" font-size="14.00" fill="#000000">camera-tiler</text> | ||||||
|  | </g> | ||||||
|  | <!-- cam.k-space.ee/tiled --> | ||||||
|  | <g id="node4" class="node"> | ||||||
|  | <title>cam.k-space.ee/tiled</title> | ||||||
|  | <ellipse fill="none" stroke="#000000" cx="527.22" cy="-199" rx="89.7229" ry="18"/> | ||||||
|  | <text text-anchor="middle" x="527.22" y="-194.8" font-family="Times,serif" font-size="14.00" fill="#000000">cam.k-space.ee/tiled</text> | ||||||
|  | </g> | ||||||
|  | <!-- camera-tiler->cam.k-space.ee/tiled --> | ||||||
|  | <g id="edge2" class="edge"> | ||||||
|  | <title>camera-tiler->cam.k-space.ee/tiled</title> | ||||||
|  | <path fill="none" stroke="#000000" d="M527.22,-253.9551C527.22,-245.8828 527.22,-236.1764 527.22,-227.1817"/> | ||||||
|  | <polygon fill="#000000" stroke="#000000" points="530.7201,-227.0903 527.22,-217.0904 523.7201,-227.0904 530.7201,-227.0903"/> | ||||||
|  | </g> | ||||||
|  | <!-- camera --> | ||||||
|  | <g id="node5" class="node"> | ||||||
|  | <title>camera</title> | ||||||
|  | <ellipse fill="none" stroke="#000000" cx="513.22" cy="-360.8" rx="51.565" ry="18"/> | ||||||
|  | <text text-anchor="middle" x="513.22" y="-356.6" font-family="Times,serif" font-size="14.00" fill="#000000">📸 camera</text> | ||||||
|  | </g> | ||||||
|  | <!-- camera->camera-motion-detect --> | ||||||
|  | <g id="edge4" class="edge"> | ||||||
|  | <title>camera->camera-motion-detect</title> | ||||||
|  | <path fill="none" stroke="#000000" d="M485.8726,-345.3322C460.8217,-331.1633 423.4609,-310.0318 395.271,-294.0875"/> | ||||||
|  | <polygon fill="#000000" stroke="#000000" points="396.8952,-290.9851 386.4679,-289.1084 393.449,-297.078 396.8952,-290.9851"/> | ||||||
|  | </g> | ||||||
|  | <!-- camera->camera-tiler --> | ||||||
|  | <g id="edge3" class="edge"> | ||||||
|  | <title>camera->camera-tiler</title> | ||||||
|  | <path fill="none" stroke="#000000" d="M516.1208,-342.4006C518.0482,-330.175 520.6159,-313.8887 522.7961,-300.0599"/> | ||||||
|  | <polygon fill="#000000" stroke="#000000" points="526.2706,-300.4951 524.3708,-290.072 519.356,-299.4049 526.2706,-300.4951"/> | ||||||
|  | </g> | ||||||
|  | <!-- camtiler-event-broker --> | ||||||
|  | <g id="node9" class="node"> | ||||||
|  | <title>camtiler-event-broker</title> | ||||||
|  | <ellipse fill="none" stroke="#000000" cx="95.22" cy="-91" rx="95.4404" ry="18"/> | ||||||
|  | <text text-anchor="middle" x="95.22" y="-86.8" font-family="Times,serif" font-size="14.00" fill="#000000">camtiler-event-broker</text> | ||||||
|  | </g> | ||||||
|  | <!-- mongo->camtiler-event-broker --> | ||||||
|  | <g id="edge8" class="edge"> | ||||||
|  | <title>mongo->camtiler-event-broker</title> | ||||||
|  | <path fill="none" stroke="#000000" d="M254.6316,-196.5601C185.4398,-191.6839 43.6101,-179.7471 28.9976,-163 18.4783,-150.9441 20.8204,-140.7526 28.9976,-127 32.2892,-121.4639 36.7631,-116.7259 41.8428,-112.6837"/> | ||||||
|  | <polygon fill="#000000" stroke="#000000" points="43.9975,-115.4493 50.2411,-106.8896 40.0224,-109.6875 43.9975,-115.4493"/> | ||||||
|  | <text text-anchor="middle" x="153.8312" y="-140.8" font-family="Times,serif" font-size="14.00" fill="#000000">transforms object to add (signed) URL to S3</text> | ||||||
|  | </g> | ||||||
|  | <!-- cam.k-space.ee --> | ||||||
|  | <g id="node8" class="node"> | ||||||
|  | <title>cam.k-space.ee</title> | ||||||
|  | <ellipse fill="none" stroke="#000000" cx="292.22" cy="-18" rx="70.0229" ry="18"/> | ||||||
|  | <text text-anchor="middle" x="292.22" y="-13.8" font-family="Times,serif" font-size="14.00" fill="#000000">cam.k-space.ee</text> | ||||||
|  | </g> | ||||||
|  | <!-- Minio S3->cam.k-space.ee --> | ||||||
|  | <g id="edge10" class="edge"> | ||||||
|  | <title>Minio S3->cam.k-space.ee</title> | ||||||
|  | <path fill="none" stroke="#000000" d="M394.7596,-126.8896C392.7231,-111.3195 387.8537,-88.922 376.22,-73 366.0004,-59.0134 351.0573,-47.5978 336.5978,-38.8647"/> | ||||||
|  | <polygon fill="#000000" stroke="#000000" points="338.1215,-35.7041 327.7038,-33.7748 334.6446,-41.7796 338.1215,-35.7041"/> | ||||||
|  | <text text-anchor="middle" x="521.2881" y="-86.8" font-family="Times,serif" font-size="14.00" fill="#000000">using signed URL from camtiler-event-broker</text> | ||||||
|  | <polyline fill="none" stroke="#000000" points="650.3562,-82.6 392.22,-82.6 392.9753,-115.8309 "/> | ||||||
|  | </g> | ||||||
|  | <!-- cam.k-space.ee->mongo --> | ||||||
|  | <g id="edge7" class="edge"> | ||||||
|  | <title>cam.k-space.ee->mongo</title> | ||||||
|  | <path fill="none" stroke="#000000" d="M292.22,-36.2125C292.22,-67.8476 292.22,-133.1569 292.22,-170.7273"/> | ||||||
|  | <polygon fill="#000000" stroke="#000000" points="288.7201,-170.9833 292.22,-180.9833 295.7201,-170.9833 288.7201,-170.9833"/> | ||||||
|  | <text text-anchor="middle" x="332.0647" y="-86.8" font-family="Times,serif" font-size="14.00" fill="#000000">queries events</text> | ||||||
|  | <polyline fill="none" stroke="#000000" points="371.9094,-82.6 292.22,-82.6 292.22,-91.3492 "/> | ||||||
|  | </g> | ||||||
|  | <!-- camtiler-event-broker->cam.k-space.ee --> | ||||||
|  | <g id="edge9" class="edge"> | ||||||
|  | <title>camtiler-event-broker->cam.k-space.ee</title> | ||||||
|  | <path fill="none" stroke="#000000" d="M138.9406,-74.7989C169.6563,-63.417 210.7924,-48.1737 242.716,-36.3441"/> | ||||||
|  | <polygon fill="#000000" stroke="#000000" points="244.1451,-39.5472 252.3059,-32.7905 241.7128,-32.9833 244.1451,-39.5472"/> | ||||||
|  | </g> | ||||||
|  | </g> | ||||||
|  | </svg> | ||||||
| After Width: | Height: | Size: 7.8 KiB | 
| @@ -1,3 +1,4 @@ | |||||||
|  | # Referenced and documented by https://wiki.k-space.ee/en/hosting/doors | ||||||
| --- | --- | ||||||
| apiVersion: apps/v1 | apiVersion: apps/v1 | ||||||
| kind: Deployment | kind: Deployment | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user