From 85d4c4eda7d5d6806bf091b873de27e6a168f83c Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Tue, 30 Sep 2025 18:12:51 +0530 Subject: [PATCH 01/18] Reverse proxy changes for ibvs --- .../image-based-video-search/compose.yml | 59 ++++--- .../src/nginx/Dockerfile | 20 +++ .../src/nginx/generate_certs.sh | 17 ++ .../src/nginx/nginx.conf | 155 ++++++++++++++++++ 4 files changed, 231 insertions(+), 20 deletions(-) create mode 100644 metro-ai-suite/image-based-video-search/src/nginx/Dockerfile create mode 100644 metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh create mode 100644 metro-ai-suite/image-based-video-search/src/nginx/nginx.conf diff --git a/metro-ai-suite/image-based-video-search/compose.yml b/metro-ai-suite/image-based-video-search/compose.yml index b3de9218e6..6c30c95a36 100644 --- a/metro-ai-suite/image-based-video-search/compose.yml +++ b/metro-ai-suite/image-based-video-search/compose.yml @@ -19,9 +19,9 @@ services: - milvus-data:/var/lib/milvus - ./src/milvus-db/embedEtcd.yaml:/milvus/configs/embedEtcd.yaml - ./src/milvus-db/user.yaml:/milvus/configs/user.yaml - ports: - - "19530:19530" - - "9091:9091" + expose: + - "19530" + - "9091" # This port conflicts with etcd when exposed, so it is commented out: # - "2379:2379" healthcheck: @@ -43,8 +43,8 @@ services: - http_proxy= - https_proxy= - no_proxy= - ports: - - "8000:3000" + expose: + - "3000" restart: on-failure:5 depends_on: milvus-db: @@ -52,8 +52,8 @@ services: feature-matching: image: ${DOCKER_REGISTRY}intel/feature-matching:v1.0.2-pre-RC1 - ports: - - "9000:8000" + expose: + - "8000" container_name: ibvs-featurematching build: context: src/feature-matching @@ -123,21 +123,19 @@ services: - http_proxy= - https_proxy= - no_proxy= - ports: - - "8554:8554" - - "1935:1935" - - "8888:8888" - - "8889:8889" - - "8890:8890/udp" - - "8189:8189/udp" + expose: + - "8554" + - "1935" + - "8888" + - "8889" restart: on-failure:5 broker: image: docker.io/library/eclipse-mosquitto:2.0.20 container_name: ibvs-broker volumes: - ./src/broker:/mosquitto/config - ports: - - "1883:1883" + expose: + - "1883" restart: unless-stopped healthcheck: test: ["CMD", "mosquitto_sub", "-t", "$$SYS/#", "-C", "1", "-i", "healthcheck", "-W", "3"] @@ -154,8 +152,8 @@ services: privileged: false tty: true entrypoint: ["./run.sh"] - ports: - - '8080:8080' + expose: + - '8080' # - '8554:8554' environment: - ENABLE_RTSP=true @@ -219,11 +217,13 @@ services: app: image: ${DOCKER_REGISTRY}intel/image-based-video-search:v1.0.2-pre-RC1 container_name: ibvs-app - ports: - - "3000:3000" build: context: src/app dockerfile: Dockerfile + expose: + - "3000" + environment: + - CHOKIDAR_USEPOLLING=true depends_on: streaming-pipeline: condition: service_healthy @@ -238,6 +238,25 @@ services: retries: 3 start_period: 20s restart: on-failure:5 + nginx: + image: nginx:1.27-alpine + container_name: ibvs-reverse-proxy + ports: + - "80:80" + - "443:443" + build: + context: src/nginx + dockerfile: Dockerfile + volumes: + - "./src/nginx/nginx.conf:/etc/nginx/nginx.conf:ro" + depends_on: + - app + environment: + - http_proxy= + - https_proxy= + - no_proxy= + - NO_PROXY= + restart: on-failure:5 volumes: milvus-data: diff --git a/metro-ai-suite/image-based-video-search/src/nginx/Dockerfile b/metro-ai-suite/image-based-video-search/src/nginx/Dockerfile new file mode 100644 index 0000000000..9a61ba9576 --- /dev/null +++ b/metro-ai-suite/image-based-video-search/src/nginx/Dockerfile @@ -0,0 +1,20 @@ +FROM nginx:1.27-alpine + +# Install OpenSSL +RUN apk add --no-cache openssl bash + +# Copy nginx config +COPY nginx.conf /etc/nginx/nginx.conf + +# Copy cert generation script +COPY generate_certs.sh /usr/local/bin/generate_certs.sh +RUN chmod +x /usr/local/bin/generate_certs.sh + +# Create SSL directory +RUN mkdir -p /etc/nginx/ssl + +# Expose ports +EXPOSE 80 443 + +# Run script (which starts nginx) +ENTRYPOINT ["/usr/local/bin/generate_certs.sh"] diff --git a/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh b/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh new file mode 100644 index 0000000000..55bb6004b1 --- /dev/null +++ b/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh @@ -0,0 +1,17 @@ +#!/bin/sh +set -e + +SSL_DIR="/etc/nginx/ssl" + +# Generate self-signed cert if not present +if [ ! -f "$SSL_DIR/server.crt" ] || [ ! -f "$SSL_DIR/server.key" ]; then + echo "🔐 Generating self-signed SSL certificate..." + openssl req -x509 -nodes -days 365 \ + -newkey rsa:2048 \ + -keyout "$SSL_DIR/server.key" \ + -out "$SSL_DIR/server.crt" \ + -subj "/C=IN/ST=KA/L=Bangalore/O=MyCompany/OU=Dev/CN=localhost" +fi + +# Start nginx +nginx -g "daemon off;" \ No newline at end of file diff --git a/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf b/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf new file mode 100644 index 0000000000..fe5d12bdae --- /dev/null +++ b/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf @@ -0,0 +1,155 @@ +user nginx; +worker_processes auto; +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; + +events { + worker_connections 1024; +} + +http { + + # Upstream blocks + upstream ibvs_app { + server ibvs-app:3000; + } + upstream milvus_ui { + server ibvs-milvusui:3000; + } + upstream feature_matching { + server ibvs-featurematching:8000; + } + upstream dlstreamer { + server ibvs-dlstreamer-pipeline-server:8080; + } + upstream milvus_db { + server ibvs-milvusdb:19530; + } + upstream milvus_db_http { + server ibvs-milvusdb:9091; + } + + # Redirect all HTTP -> HTTPS + server { + listen 80; + return 301 https://$host$request_uri; + } + + # HTTPS server block + server { + listen 443 ssl; + server_name localhost; + client_max_body_size 500M; + + # SSL configuration + ssl_certificate /etc/nginx/ssl/server.crt; + ssl_certificate_key /etc/nginx/ssl/server.key; + + # SSL security settings + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + + # Security headers + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + add_header X-Content-Type-Options nosniff; + add_header X-Frame-Options SAMEORIGIN; + add_header X-XSS-Protection "1; mode=block"; + + # Milvus App + location / { + proxy_pass http://ibvs_app/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + # Milvus UI + location /ibvs-milvus-ui/ { + proxy_pass http://milvus_ui/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + # Milvus UI connection api + location /ibvs-milvus-ui/api/ { + proxy_pass http://milvus_ui/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + # Feature Matching API + location /ibvs-feature-matching/ { + proxy_pass http://feature_matching/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + # DLStreamer Pipeline Server + location /ibvs-dlstreamer/ { + proxy_pass http://dlstreamer/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + # Milvus DB API + location /ibvs-milvus-db/ { + proxy_pass http://milvus_db; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + # Milvus DB HTTP + location /ibvs-milvus-db-http/ { + proxy_pass http://milvus_db_http/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + # HLS video streaming proxy + location /hls/ { + proxy_pass http://ibvs-mediamtx:8888/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + } + + # Additional TCP/UDP streams (RTSP, MQTT, etc.) + # For RTSP, MQTT, and other non-HTTP protocols, use stream block below +} \ No newline at end of file From 896033979fb0ea4ce64476c40ac46db0992058c9 Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Wed, 1 Oct 2025 18:22:41 +0530 Subject: [PATCH 02/18] Create ibvs app with static web pages --- .../src/app/Dockerfile | 9 ++- .../src/app/src/components/MapView.vue | 4 +- .../src/app/src/vite-env.d.ts | 6 ++ .../src/nginx/nginx.conf | 73 +++++++++++++++++-- 4 files changed, 80 insertions(+), 12 deletions(-) diff --git a/metro-ai-suite/image-based-video-search/src/app/Dockerfile b/metro-ai-suite/image-based-video-search/src/app/Dockerfile index b59f9648c1..8f2015f9c0 100644 --- a/metro-ai-suite/image-based-video-search/src/app/Dockerfile +++ b/metro-ai-suite/image-based-video-search/src/app/Dockerfile @@ -15,7 +15,10 @@ RUN npm install COPY . . # Build the Vue.js application -# RUN npm run build +RUN npm run build + +# Install serve globally *before* switching user +RUN npm install -g serve # Expose the port the app runs on EXPOSE 3000 @@ -28,5 +31,5 @@ RUN useradd -ms /bin/bash ${USER} -o -u $UID && \ RUN mkdir -p /home/${USER}/ && chown -R ${USER}:${USER} /home/${USER} USER ${USER} -# Start the application -CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0", "--port", "3000"] \ No newline at end of file +# Serve built static files +CMD ["serve", "-s", "dist", "-l", "3000"] \ No newline at end of file diff --git a/metro-ai-suite/image-based-video-search/src/app/src/components/MapView.vue b/metro-ai-suite/image-based-video-search/src/app/src/components/MapView.vue index 79bc36d12e..3eea618ae0 100644 --- a/metro-ai-suite/image-based-video-search/src/app/src/components/MapView.vue +++ b/metro-ai-suite/image-based-video-search/src/app/src/components/MapView.vue @@ -36,11 +36,11 @@ export default defineComponent({ L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap contributors' - }).addTo(this.map); + }).addTo(this.map as L.Map); L.marker( [33.4484, -112.0740] - ).addTo(this.map) + ).addTo(this.map as L.Map) .bindPopup('11 N Central Ave #4, Phoenix, AZ') .openPopup(); diff --git a/metro-ai-suite/image-based-video-search/src/app/src/vite-env.d.ts b/metro-ai-suite/image-based-video-search/src/app/src/vite-env.d.ts index 11f02fe2a0..969d97fb93 100644 --- a/metro-ai-suite/image-based-video-search/src/app/src/vite-env.d.ts +++ b/metro-ai-suite/image-based-video-search/src/app/src/vite-env.d.ts @@ -1 +1,7 @@ /// + +declare module '*.vue' { + import { DefineComponent } from 'vue'; + const component: DefineComponent<{}, {}, any>; + export default component; +} \ No newline at end of file diff --git a/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf b/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf index fe5d12bdae..ed6789ee1c 100644 --- a/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf +++ b/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf @@ -56,19 +56,36 @@ http { add_header X-Frame-Options SAMEORIGIN; add_header X-XSS-Protection "1; mode=block"; - # Milvus App + # Milvus App (Vue SPA) location / { proxy_pass http://ibvs_app/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; + } + # Socket.IO connections should bypass SPA rewrite + location /socket.io/ { + proxy_pass http://ibvs_app/socket.io/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; } - + + # Serve static assets directly + location /assets/ { + proxy_pass http://ibvs_app/assets/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + # Milvus UI location /ibvs-milvus-ui/ { proxy_pass http://milvus_ui/; @@ -81,8 +98,8 @@ http { proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } - - # Milvus UI connection api + + # Milvus UI API location /ibvs-milvus-ui/api/ { proxy_pass http://milvus_ui/; proxy_set_header Host $host; @@ -103,6 +120,21 @@ http { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } + location /search/ { + proxy_pass http://feature_matching/search/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + location /clear/ { + proxy_pass http://feature_matching/clear/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + # DLStreamer Pipeline Server location /ibvs-dlstreamer/ { proxy_pass http://dlstreamer/; @@ -115,6 +147,16 @@ http { proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } + + # Proxy /pipelines/ to dlstreamer backend + location /pipelines/ { + proxy_pass http://dlstreamer/pipelines/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + # Milvus DB API location /ibvs-milvus-db/ { proxy_pass http://milvus_db; @@ -127,6 +169,7 @@ http { proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } + # Milvus DB HTTP location /ibvs-milvus-db-http/ { proxy_pass http://milvus_db_http/; @@ -148,8 +191,24 @@ http { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } - } - # Additional TCP/UDP streams (RTSP, MQTT, etc.) - # For RTSP, MQTT, and other non-HTTP protocols, use stream block below + # Stream video + location /stream/ { + proxy_pass http://ibvs-mediamtx:8554/stream/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + + # Static images + location /static/ { + proxy_pass http://feature_matching/static/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + } } \ No newline at end of file From e4af35a17064d5e6effc266d241d201cb339c937 Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Wed, 1 Oct 2025 18:54:14 +0530 Subject: [PATCH 03/18] Fix rtsp stream --- .../image-based-video-search/src/nginx/nginx.conf | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf b/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf index ed6789ee1c..a5dcc1f4f2 100644 --- a/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf +++ b/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf @@ -182,26 +182,16 @@ http { proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } - - # HLS video streaming proxy - location /hls/ { - proxy_pass http://ibvs-mediamtx:8888/; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } # Stream video location /stream/ { - proxy_pass http://ibvs-mediamtx:8554/stream/; + proxy_pass http://ibvs-mediamtx:8888/stream/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } - # Static images location /static/ { proxy_pass http://feature_matching/static/; From 7fda14d0e77a20714943cb3088de738fee019840 Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Sun, 5 Oct 2025 22:58:05 +0530 Subject: [PATCH 04/18] Helm changes for reverse proxy --- .../chart/templates/app/deployment.yaml | 2 -- .../chart/templates/nginx/deployement.yaml | 32 +++++++++++++++++++ .../chart/templates/nginx/service.yaml | 17 ++++++++++ .../chart/values.yaml | 12 +++++++ 4 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 metro-ai-suite/image-based-video-search/chart/templates/nginx/deployement.yaml create mode 100644 metro-ai-suite/image-based-video-search/chart/templates/nginx/service.yaml diff --git a/metro-ai-suite/image-based-video-search/chart/templates/app/deployment.yaml b/metro-ai-suite/image-based-video-search/chart/templates/app/deployment.yaml index b637e332c0..708b6e8112 100644 --- a/metro-ai-suite/image-based-video-search/chart/templates/app/deployment.yaml +++ b/metro-ai-suite/image-based-video-search/chart/templates/app/deployment.yaml @@ -25,8 +25,6 @@ spec: - image: '{{ tpl .Values.app.repository.image $ }}:{{ tpl .Values.app.repository.tag $ | default "latest" }}' imagePullPolicy: {{ .Values.app.imagePullPolicy }} name: app - command: ["npm", "run", "dev"] - args: ["--", "--host", "0.0.0.0", "--port", "3000"] {{- if .Values.app.resources }} resources: {{ .Values.app.resources | toYaml | nindent 10 }} diff --git a/metro-ai-suite/image-based-video-search/chart/templates/nginx/deployement.yaml b/metro-ai-suite/image-based-video-search/chart/templates/nginx/deployement.yaml new file mode 100644 index 0000000000..9ef2e42ea9 --- /dev/null +++ b/metro-ai-suite/image-based-video-search/chart/templates/nginx/deployement.yaml @@ -0,0 +1,32 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "image_based_video_search.fullname" . }}-nginx + labels: + {{- include "image_based_video_search.labels" . | nindent 4 }} + katenary.v3/component: nginx +spec: + replicas: {{ .Values.nginx.replicas }} + selector: + matchLabels: + app: {{ include "image_based_video_search.fullname" . }}-nginx + template: + metadata: + labels: + app: {{ include "image_based_video_search.fullname" . }}-nginx + spec: + containers: + - name: nginx + image: "{{ .Values.nginx.image.repository }}:{{ .Values.nginx.image.tag }}" + imagePullPolicy: {{ .Values.nginx.image.pullPolicy }} + ports: + - containerPort: 80 + - containerPort: 443 + volumeMounts: + - name: ssl-certs + mountPath: /etc/nginx/ssl + resources: + {{- toYaml .Values.nginx.resources | nindent 12 }} + volumes: + - name: ssl-certs + emptyDir: {} diff --git a/metro-ai-suite/image-based-video-search/chart/templates/nginx/service.yaml b/metro-ai-suite/image-based-video-search/chart/templates/nginx/service.yaml new file mode 100644 index 0000000000..da516300e9 --- /dev/null +++ b/metro-ai-suite/image-based-video-search/chart/templates/nginx/service.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "image_based_video_search.fullname" . }}-nginx + labels: + {{- include "image_based_video_search.labels" . | nindent 4 }} +spec: + type: {{ .Values.nginx.service.type }} + selector: + app: {{ include "image_based_video_search.fullname" . }}-nginx + ports: + - name: http + port: {{ .Values.nginx.service.portHttp }} + targetPort: 80 + - name: https + port: {{ .Values.nginx.service.portHttps }} + targetPort: 443 diff --git a/metro-ai-suite/image-based-video-search/chart/values.yaml b/metro-ai-suite/image-based-video-search/chart/values.yaml index ce8adabdb8..8c7def9668 100644 --- a/metro-ai-suite/image-based-video-search/chart/values.yaml +++ b/metro-ai-suite/image-based-video-search/chart/values.yaml @@ -402,6 +402,18 @@ featurematching: # key: milvusui.serviceAccount serviceAccount: "" +nginx: + enabled: true + replicas: 1 + image: + repository: docker.io/library/nginx # change this + tag: 1.27-alpine + pullPolicy: IfNotPresent + service: + type: ClusterIP + portHttp: 80 + portHttps: 443 + resources: {} # imagePullSecrets allows you to specify a name of an image pull secret. # You must provide a list of object with the name field set to the name of the From 218254a3bcc8f756d2ad976bb5181f94c98de3f8 Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Mon, 6 Oct 2025 13:31:01 +0530 Subject: [PATCH 05/18] Fix proxy requests for milvus ui --- .../src/nginx/nginx.conf | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf b/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf index a5dcc1f4f2..5dd6f3a042 100644 --- a/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf +++ b/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf @@ -65,18 +65,6 @@ http { proxy_set_header X-Forwarded-Proto $scheme; } - # Socket.IO connections should bypass SPA rewrite - location /socket.io/ { - proxy_pass http://ibvs_app/socket.io/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - # Serve static assets directly location /assets/ { proxy_pass http://ibvs_app/assets/; @@ -99,9 +87,22 @@ http { proxy_set_header Connection "upgrade"; } - # Milvus UI API - location /ibvs-milvus-ui/api/ { - proxy_pass http://milvus_ui/; + # Milvus UI api requests + location /api/ { + proxy_pass http://milvus_ui/api/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + # Milvus UI socket.IO requests + location /socket.io/ { + proxy_pass http://milvus_ui/socket.io/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; @@ -112,7 +113,7 @@ http { proxy_set_header Connection "upgrade"; } - # Feature Matching API + # Feature Matching location /ibvs-feature-matching/ { proxy_pass http://feature_matching/; proxy_set_header Host $host; @@ -120,6 +121,8 @@ http { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } + + # Feature Matching search requests location /search/ { proxy_pass http://feature_matching/search/; proxy_set_header Host $host; @@ -127,6 +130,8 @@ http { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } + + # Feature Matching clear requests location /clear/ { proxy_pass http://feature_matching/clear/; proxy_set_header Host $host; @@ -148,7 +153,7 @@ http { proxy_set_header Connection "upgrade"; } - # Proxy /pipelines/ to dlstreamer backend + # # DLStreamer Pipeline Server pipelines requests location /pipelines/ { proxy_pass http://dlstreamer/pipelines/; proxy_set_header Host $host; @@ -192,7 +197,7 @@ http { proxy_set_header X-Forwarded-Proto $scheme; } - # Static images + # IBVS app static images for search results location /static/ { proxy_pass http://feature_matching/static/; proxy_set_header Host $host; From 4d34cd6fcbe997043088c4bb00673b305a061d76 Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Mon, 6 Oct 2025 15:15:47 +0530 Subject: [PATCH 06/18] Fix swagger documentaion for featurematching --- .../src/nginx/nginx.conf | 53 +++++++++++++------ 1 file changed, 36 insertions(+), 17 deletions(-) diff --git a/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf b/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf index 5dd6f3a042..08c85273e5 100644 --- a/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf +++ b/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf @@ -94,10 +94,6 @@ http { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; } # Milvus UI socket.IO requests @@ -107,10 +103,6 @@ http { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; } # Feature Matching @@ -131,6 +123,15 @@ http { proxy_set_header X-Forwarded-Proto $scheme; } + # Get static images for search results + location /static/ { + proxy_pass http://feature_matching/static/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + # Feature Matching clear requests location /clear/ { proxy_pass http://feature_matching/clear/; @@ -140,6 +141,33 @@ http { proxy_set_header X-Forwarded-Proto $scheme; } + # Featurematching healthz requests + location /healthz { + proxy_pass http://feature_matching; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Feature Matching Swagger docs requests + location /docs { + proxy_pass http://feature_matching; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Feature Matching swagger docs openapi.json requests + location /openapi.json { + proxy_pass http://feature_matching/openapi.json; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + # DLStreamer Pipeline Server location /ibvs-dlstreamer/ { proxy_pass http://dlstreamer/; @@ -196,14 +224,5 @@ http { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } - - # IBVS app static images for search results - location /static/ { - proxy_pass http://feature_matching/static/; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } } } \ No newline at end of file From bf1fdeceb7e3811e4523cb691410ab58875c6234 Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Tue, 7 Oct 2025 10:02:19 +0530 Subject: [PATCH 07/18] RTSP stream enable with reverse proxy --- metro-ai-suite/image-based-video-search/compose.yml | 5 +++++ .../image-based-video-search/src/nginx/nginx.conf | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/metro-ai-suite/image-based-video-search/compose.yml b/metro-ai-suite/image-based-video-search/compose.yml index 6c30c95a36..07fca288e1 100644 --- a/metro-ai-suite/image-based-video-search/compose.yml +++ b/metro-ai-suite/image-based-video-search/compose.yml @@ -58,6 +58,9 @@ services: build: context: src/feature-matching dockerfile: Dockerfile + read_only: true + tmpfs: + - /usr/src/app/static environment: MILVUS_ENDPOINT: http://milvus-db:19530 COLLECTION_NAME: my_image_collection @@ -222,6 +225,7 @@ services: dockerfile: Dockerfile expose: - "3000" + read_only: true environment: - CHOKIDAR_USEPOLLING=true depends_on: @@ -244,6 +248,7 @@ services: ports: - "80:80" - "443:443" + - "8554:8554" build: context: src/nginx dockerfile: Dockerfile diff --git a/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf b/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf index 08c85273e5..7197ee5342 100644 --- a/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf +++ b/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf @@ -7,6 +7,17 @@ events { worker_connections 1024; } +stream { + upstream rtsp_upstream { + server ibvs-mediamtx:8554; # RTSP server inside Docker network + } + + server { + listen 8554; # Nginx listens for RTSP on 8554 + proxy_pass rtsp_upstream; + } +} + http { # Upstream blocks From 9ce133c4b9ca6f81324e14d6b9c6d4f5aef356f9 Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Tue, 7 Oct 2025 10:11:41 +0530 Subject: [PATCH 08/18] Undo helm changes --- .../chart/templates/app/deployment.yaml | 2 ++ .../chart/templates/nginx/deployement.yaml | 32 ------------------- .../chart/templates/nginx/service.yaml | 17 ---------- .../chart/values.yaml | 12 ------- 4 files changed, 2 insertions(+), 61 deletions(-) delete mode 100644 metro-ai-suite/image-based-video-search/chart/templates/nginx/deployement.yaml delete mode 100644 metro-ai-suite/image-based-video-search/chart/templates/nginx/service.yaml diff --git a/metro-ai-suite/image-based-video-search/chart/templates/app/deployment.yaml b/metro-ai-suite/image-based-video-search/chart/templates/app/deployment.yaml index 708b6e8112..b637e332c0 100644 --- a/metro-ai-suite/image-based-video-search/chart/templates/app/deployment.yaml +++ b/metro-ai-suite/image-based-video-search/chart/templates/app/deployment.yaml @@ -25,6 +25,8 @@ spec: - image: '{{ tpl .Values.app.repository.image $ }}:{{ tpl .Values.app.repository.tag $ | default "latest" }}' imagePullPolicy: {{ .Values.app.imagePullPolicy }} name: app + command: ["npm", "run", "dev"] + args: ["--", "--host", "0.0.0.0", "--port", "3000"] {{- if .Values.app.resources }} resources: {{ .Values.app.resources | toYaml | nindent 10 }} diff --git a/metro-ai-suite/image-based-video-search/chart/templates/nginx/deployement.yaml b/metro-ai-suite/image-based-video-search/chart/templates/nginx/deployement.yaml deleted file mode 100644 index 9ef2e42ea9..0000000000 --- a/metro-ai-suite/image-based-video-search/chart/templates/nginx/deployement.yaml +++ /dev/null @@ -1,32 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "image_based_video_search.fullname" . }}-nginx - labels: - {{- include "image_based_video_search.labels" . | nindent 4 }} - katenary.v3/component: nginx -spec: - replicas: {{ .Values.nginx.replicas }} - selector: - matchLabels: - app: {{ include "image_based_video_search.fullname" . }}-nginx - template: - metadata: - labels: - app: {{ include "image_based_video_search.fullname" . }}-nginx - spec: - containers: - - name: nginx - image: "{{ .Values.nginx.image.repository }}:{{ .Values.nginx.image.tag }}" - imagePullPolicy: {{ .Values.nginx.image.pullPolicy }} - ports: - - containerPort: 80 - - containerPort: 443 - volumeMounts: - - name: ssl-certs - mountPath: /etc/nginx/ssl - resources: - {{- toYaml .Values.nginx.resources | nindent 12 }} - volumes: - - name: ssl-certs - emptyDir: {} diff --git a/metro-ai-suite/image-based-video-search/chart/templates/nginx/service.yaml b/metro-ai-suite/image-based-video-search/chart/templates/nginx/service.yaml deleted file mode 100644 index da516300e9..0000000000 --- a/metro-ai-suite/image-based-video-search/chart/templates/nginx/service.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: {{ include "image_based_video_search.fullname" . }}-nginx - labels: - {{- include "image_based_video_search.labels" . | nindent 4 }} -spec: - type: {{ .Values.nginx.service.type }} - selector: - app: {{ include "image_based_video_search.fullname" . }}-nginx - ports: - - name: http - port: {{ .Values.nginx.service.portHttp }} - targetPort: 80 - - name: https - port: {{ .Values.nginx.service.portHttps }} - targetPort: 443 diff --git a/metro-ai-suite/image-based-video-search/chart/values.yaml b/metro-ai-suite/image-based-video-search/chart/values.yaml index 8c7def9668..ce8adabdb8 100644 --- a/metro-ai-suite/image-based-video-search/chart/values.yaml +++ b/metro-ai-suite/image-based-video-search/chart/values.yaml @@ -402,18 +402,6 @@ featurematching: # key: milvusui.serviceAccount serviceAccount: "" -nginx: - enabled: true - replicas: 1 - image: - repository: docker.io/library/nginx # change this - tag: 1.27-alpine - pullPolicy: IfNotPresent - service: - type: ClusterIP - portHttp: 80 - portHttps: 443 - resources: {} # imagePullSecrets allows you to specify a name of an image pull secret. # You must provide a list of object with the name field set to the name of the From adcb0293feef9681643ab54c0018b534f80db78b Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Tue, 7 Oct 2025 10:21:50 +0530 Subject: [PATCH 09/18] Minor changes --- metro-ai-suite/image-based-video-search/compose.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/metro-ai-suite/image-based-video-search/compose.yml b/metro-ai-suite/image-based-video-search/compose.yml index 07fca288e1..4718bf499f 100644 --- a/metro-ai-suite/image-based-video-search/compose.yml +++ b/metro-ai-suite/image-based-video-search/compose.yml @@ -225,9 +225,7 @@ services: dockerfile: Dockerfile expose: - "3000" - read_only: true - environment: - - CHOKIDAR_USEPOLLING=true + read_only: true depends_on: streaming-pipeline: condition: service_healthy From e57b306cf1e052b455a9b6f2cb2cdb00897303a4 Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Tue, 7 Oct 2025 11:15:09 +0530 Subject: [PATCH 10/18] Document changes --- .../docs/user-guide/get-started.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/metro-ai-suite/image-based-video-search/docs/user-guide/get-started.md b/metro-ai-suite/image-based-video-search/docs/user-guide/get-started.md index 32d6bf64bb..58aa3f5bdd 100644 --- a/metro-ai-suite/image-based-video-search/docs/user-guide/get-started.md +++ b/metro-ai-suite/image-based-video-search/docs/user-guide/get-started.md @@ -130,11 +130,11 @@ a pre-step to prepare models may be needed 6. **Access the Application**: - Open a browser and go to the following endpoints to access the application: - - App UI: `http://localhost:3000` - - Search UI: `http://localhost:9000/docs` - - MilvusDB UI: `http://localhost:8000/` - - Stream UI: `http://localhost:8889/stream`. To access this stream remotely, open this url `rtsp://:8554/stream`. Replace `` with your system IP address - > Note: To access `App UI`, `Search UI` and `MilvusDB UI` urls remotely, replace the `localhost` with your system IP address. + - App UI: `https:///` + - Search UI: `https:///docs` + - MilvusDB UI: `https:///ibvs-milvus-ui` + - Stream UI: You can access https stream at `https:///stream` and RTSP stream at `rtsp://:8554/stream`. + > Note: Replace `` with your host IP address 7. **Run the Application**: From b221402685a29398e6ef1f4821c808e77791e32b Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Wed, 8 Oct 2025 10:26:19 +0530 Subject: [PATCH 11/18] Cleaning up compose.yml file --- .../image-based-video-search/compose.yml | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/metro-ai-suite/image-based-video-search/compose.yml b/metro-ai-suite/image-based-video-search/compose.yml index 4718bf499f..582b67b3dd 100644 --- a/metro-ai-suite/image-based-video-search/compose.yml +++ b/metro-ai-suite/image-based-video-search/compose.yml @@ -19,9 +19,6 @@ services: - milvus-data:/var/lib/milvus - ./src/milvus-db/embedEtcd.yaml:/milvus/configs/embedEtcd.yaml - ./src/milvus-db/user.yaml:/milvus/configs/user.yaml - expose: - - "19530" - - "9091" # This port conflicts with etcd when exposed, so it is commented out: # - "2379:2379" healthcheck: @@ -43,8 +40,6 @@ services: - http_proxy= - https_proxy= - no_proxy= - expose: - - "3000" restart: on-failure:5 depends_on: milvus-db: @@ -52,8 +47,6 @@ services: feature-matching: image: ${DOCKER_REGISTRY}intel/feature-matching:v1.0.2-pre-RC1 - expose: - - "8000" container_name: ibvs-featurematching build: context: src/feature-matching @@ -126,19 +119,12 @@ services: - http_proxy= - https_proxy= - no_proxy= - expose: - - "8554" - - "1935" - - "8888" - - "8889" restart: on-failure:5 broker: image: docker.io/library/eclipse-mosquitto:2.0.20 container_name: ibvs-broker volumes: - ./src/broker:/mosquitto/config - expose: - - "1883" restart: unless-stopped healthcheck: test: ["CMD", "mosquitto_sub", "-t", "$$SYS/#", "-C", "1", "-i", "healthcheck", "-W", "3"] @@ -155,8 +141,6 @@ services: privileged: false tty: true entrypoint: ["./run.sh"] - expose: - - '8080' # - '8554:8554' environment: - ENABLE_RTSP=true @@ -223,8 +207,6 @@ services: build: context: src/app dockerfile: Dockerfile - expose: - - "3000" read_only: true depends_on: streaming-pipeline: From a51eb006a83a254d301c27ead532d78f7044c30a Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Wed, 8 Oct 2025 11:16:40 +0530 Subject: [PATCH 12/18] Remove dockerfile for nginx --- .../image-based-video-search/compose.yml | 13 ++++++++---- .../src/nginx/Dockerfile | 20 ------------------- .../src/nginx/generate_certs.sh | 0 .../src/nginx/nginx.conf | 6 ++++++ 4 files changed, 15 insertions(+), 24 deletions(-) delete mode 100644 metro-ai-suite/image-based-video-search/src/nginx/Dockerfile mode change 100644 => 100755 metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh diff --git a/metro-ai-suite/image-based-video-search/compose.yml b/metro-ai-suite/image-based-video-search/compose.yml index 582b67b3dd..9328f10ba5 100644 --- a/metro-ai-suite/image-based-video-search/compose.yml +++ b/metro-ai-suite/image-based-video-search/compose.yml @@ -229,11 +229,10 @@ services: - "80:80" - "443:443" - "8554:8554" - build: - context: src/nginx - dockerfile: Dockerfile volumes: - - "./src/nginx/nginx.conf:/etc/nginx/nginx.conf:ro" + - ./src/nginx/nginx.conf:/etc/nginx/nginx.conf:ro + - ./src/nginx/generate_certs.sh:/usr/local/bin/generate_certs.sh:ro + entrypoint: ["/usr/local/bin/generate_certs.sh"] depends_on: - app environment: @@ -242,6 +241,12 @@ services: - no_proxy= - NO_PROXY= restart: on-failure:5 + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost/nginx_healthz"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s volumes: milvus-data: diff --git a/metro-ai-suite/image-based-video-search/src/nginx/Dockerfile b/metro-ai-suite/image-based-video-search/src/nginx/Dockerfile deleted file mode 100644 index 9a61ba9576..0000000000 --- a/metro-ai-suite/image-based-video-search/src/nginx/Dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -FROM nginx:1.27-alpine - -# Install OpenSSL -RUN apk add --no-cache openssl bash - -# Copy nginx config -COPY nginx.conf /etc/nginx/nginx.conf - -# Copy cert generation script -COPY generate_certs.sh /usr/local/bin/generate_certs.sh -RUN chmod +x /usr/local/bin/generate_certs.sh - -# Create SSL directory -RUN mkdir -p /etc/nginx/ssl - -# Expose ports -EXPOSE 80 443 - -# Run script (which starts nginx) -ENTRYPOINT ["/usr/local/bin/generate_certs.sh"] diff --git a/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh b/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh old mode 100644 new mode 100755 diff --git a/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf b/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf index 7197ee5342..576d555a84 100644 --- a/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf +++ b/metro-ai-suite/image-based-video-search/src/nginx/nginx.conf @@ -235,5 +235,11 @@ http { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } + + # Health check + location /nginx_healthz { + return 200 "ok\n"; + add_header Content-Type text/plain; + } } } \ No newline at end of file From 6f61ef868cbbc05b7442f61cf01629ec30cdddde Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Tue, 14 Oct 2025 10:51:08 +0530 Subject: [PATCH 13/18] Changes to certificate generation script --- .../image-based-video-search/src/nginx/generate_certs.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh b/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh index 55bb6004b1..4a0dbdafa5 100755 --- a/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh +++ b/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh @@ -2,6 +2,13 @@ set -e SSL_DIR="/etc/nginx/ssl" +mkdir -p "$SSL_DIR" + +# Install openssl if missing +if ! command -v openssl >/dev/null 2>&1; then + echo "Installing openssl..." + apk add --no-cache openssl +fi # Generate self-signed cert if not present if [ ! -f "$SSL_DIR/server.crt" ] || [ ! -f "$SSL_DIR/server.key" ]; then From 76b9211522db1bf37f89a97a300d9ee2247e3c47 Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Fri, 17 Oct 2025 11:57:25 +0530 Subject: [PATCH 14/18] Added reverse proxy for helm chart --- .../chart/templates/nginx/configmap.yaml | 276 ++++++++++++++++++ .../chart/templates/nginx/deployment.yaml | 54 ++++ .../chart/templates/nginx/service.yaml | 27 ++ .../chart/values.yaml | 30 ++ 4 files changed, 387 insertions(+) create mode 100644 metro-ai-suite/image-based-video-search/chart/templates/nginx/configmap.yaml create mode 100644 metro-ai-suite/image-based-video-search/chart/templates/nginx/deployment.yaml create mode 100644 metro-ai-suite/image-based-video-search/chart/templates/nginx/service.yaml diff --git a/metro-ai-suite/image-based-video-search/chart/templates/nginx/configmap.yaml b/metro-ai-suite/image-based-video-search/chart/templates/nginx/configmap.yaml new file mode 100644 index 0000000000..23b559d0a1 --- /dev/null +++ b/metro-ai-suite/image-based-video-search/chart/templates/nginx/configmap.yaml @@ -0,0 +1,276 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: nginx-conf + namespace: {{ .Values.namespace }} +data: + nginx.conf: | + user nginx; + worker_processes auto; + error_log /var/log/nginx/error.log warn; + pid /var/run/nginx.pid; + + events { + worker_connections 1024; + } + + stream { + upstream rtsp_upstream { + server ibvs-mediamtx:8554; # RTSP server inside Docker network + } + + server { + listen 8554; # Nginx listens for RTSP on 8554 + proxy_pass rtsp_upstream; + } + } + + http { + # Upstream blocks + upstream ibvs_app { + server ibvs-app:3000; + } + upstream milvus_ui { + server ibvs-milvusui:3000; + } + upstream feature_matching { + server ibvs-featurematching:8000; + } + upstream dlstreamer { + server ibvs-dlstreamer-pipeline-server:8080; + } + upstream milvus_db { + server ibvs-milvusdb:19530; + } + upstream milvus_db_http { + server ibvs-milvusdb:9091; + } + + # Redirect all HTTP -> HTTPS + server { + listen 80; + return 301 https://$host$request_uri; + } + + # HTTPS server block + server { + listen 443 ssl; + server_name localhost; + client_max_body_size 500M; + + # SSL configuration + ssl_certificate /etc/nginx/ssl/server.crt; + ssl_certificate_key /etc/nginx/ssl/server.key; + + # SSL security settings + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + + # Security headers + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; + add_header X-Content-Type-Options nosniff; + add_header X-Frame-Options SAMEORIGIN; + add_header X-XSS-Protection "1; mode=block"; + + # Milvus App (Vue SPA) + location / { + proxy_pass http://ibvs_app/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Serve static assets directly + location /assets/ { + proxy_pass http://ibvs_app/assets/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Milvus UI + location /ibvs-milvus-ui/ { + proxy_pass http://milvus_ui/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + # Milvus UI api requests + location /api/ { + proxy_pass http://milvus_ui/api/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Milvus UI socket.IO requests + location /socket.io/ { + proxy_pass http://milvus_ui/socket.io/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Feature Matching + location /ibvs-feature-matching/ { + proxy_pass http://feature_matching/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Feature Matching search requests + location /search/ { + proxy_pass http://feature_matching/search/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Get static images for search results + location /static/ { + proxy_pass http://feature_matching/static/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Feature Matching clear requests + location /clear/ { + proxy_pass http://feature_matching/clear/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Featurematching healthz requests + location /healthz { + proxy_pass http://feature_matching; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Feature Matching Swagger docs requests + location /docs { + proxy_pass http://feature_matching; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Feature Matching swagger docs openapi.json requests + location /openapi.json { + proxy_pass http://feature_matching/openapi.json; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # DLStreamer Pipeline Server + location /ibvs-dlstreamer/ { + proxy_pass http://dlstreamer/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + # # DLStreamer Pipeline Server pipelines requests + location /pipelines/ { + proxy_pass http://dlstreamer/pipelines/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Milvus DB API + location /ibvs-milvus-db/ { + proxy_pass http://milvus_db; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + # Milvus DB HTTP + location /ibvs-milvus-db-http/ { + proxy_pass http://milvus_db_http/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + # Stream video + location /stream/ { + proxy_pass http://ibvs-mediamtx:8888/stream/; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # Health check + location /nginx_healthz { + return 200 "ok\n"; + add_header Content-Type text/plain; + } + } + } +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: generate-certs-script +data: + generate_certs.sh: | + #!/bin/sh + set -e + SSL_DIR="/etc/nginx/ssl" + mkdir -p "$SSL_DIR" + + if ! command -v openssl >/dev/null 2>&1; then + echo "Installing openssl..." + apk add --no-cache openssl + fi + + if [ ! -f "$SSL_DIR/server.crt" ] || [ ! -f "$SSL_DIR/server.key" ]; then + echo "🔐 Generating self-signed SSL certificate..." + openssl req -x509 -nodes -days 365 \ + -newkey rsa:2048 \ + -keyout "$SSL_DIR/server.key" \ + -out "$SSL_DIR/server.crt" \ + -subj "/C=US/ST=CA/L=San Francisco/O=Intel/OU=Edge AI/CN=localhost" + fi \ No newline at end of file diff --git a/metro-ai-suite/image-based-video-search/chart/templates/nginx/deployment.yaml b/metro-ai-suite/image-based-video-search/chart/templates/nginx/deployment.yaml new file mode 100644 index 0000000000..a556ce538b --- /dev/null +++ b/metro-ai-suite/image-based-video-search/chart/templates/nginx/deployment.yaml @@ -0,0 +1,54 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: '{{ include "image_based_video_search.fullname" . }}-nginx-reverse-proxy' + labels: + {{- include "image_based_video_search.labels" . | nindent 4 }} + katenary.v3/component: nginx-reverse-proxy +spec: + replicas: 1 + selector: + matchLabels: + {{- include "image_based_video_search.selectorLabels" . | nindent 6 }} + katenary.v3/component: nginx-reverse-proxy + template: + metadata: + labels: + {{- include "image_based_video_search.selectorLabels" . | nindent 8 }} + katenary.v3/component: nginx-reverse-proxy + spec: + initContainers: + - name: generate-certs + image: alpine/openssl:3.5.4 + command: + - /bin/sh + - -c + - /scripts/generate_certs.sh + volumeMounts: + - name: generate-certs-script + mountPath: /scripts + - name: nginx-ssl + mountPath: /etc/nginx/ssl + containers: + - name: nginx-reverse-proxy + image: nginx:1.27-alpine + imagePullPolicy: IfNotPresent + ports: + - containerPort: 80 + - containerPort: 443 + volumeMounts: + - name: nginx-conf + mountPath: /etc/nginx/nginx.conf + subPath: nginx.conf + - name: nginx-ssl + mountPath: /etc/nginx/ssl + volumes: + - name: nginx-conf + configMap: + name: nginx-conf + - name: nginx-ssl + emptyDir: {} + - name: generate-certs-script + configMap: + name: generate-certs-script + defaultMode: 0755 \ No newline at end of file diff --git a/metro-ai-suite/image-based-video-search/chart/templates/nginx/service.yaml b/metro-ai-suite/image-based-video-search/chart/templates/nginx/service.yaml new file mode 100644 index 0000000000..695f067da3 --- /dev/null +++ b/metro-ai-suite/image-based-video-search/chart/templates/nginx/service.yaml @@ -0,0 +1,27 @@ +apiVersion: v1 +kind: Service +metadata: + name: '{{ include "image_based_video_search.fullname" . }}-nginx-reverse-proxy' + labels: + {{- include "image_based_video_search.labels" . | nindent 4 }} + katenary.v3/component: nginx-reverse-proxy +spec: + type: NodePort + ports: + - name: nginx-reverse-proxy-80 + port: 80 + protocol: TCP + targetPort: 80 + nodePort: 30080 + - name: nginx-reverse-proxy-443 + port: 443 + protocol: TCP + targetPort: 443 + nodePort: 30443 + - name: nginx-reverse-proxy-8554 + port: 8554 + targetPort: 8554 + nodePort: 30554 # external port for 8554 + selector: + {{- include "image_based_video_search.selectorLabels" . | nindent 4 }} + katenary.v3/component: nginx-reverse-proxy \ No newline at end of file diff --git a/metro-ai-suite/image-based-video-search/chart/values.yaml b/metro-ai-suite/image-based-video-search/chart/values.yaml index ce8adabdb8..ee7dea75ee 100644 --- a/metro-ai-suite/image-based-video-search/chart/values.yaml +++ b/metro-ai-suite/image-based-video-search/chart/values.yaml @@ -402,6 +402,36 @@ featurematching: # key: milvusui.serviceAccount serviceAccount: "" +# nginx reverse proxy configuration +nginx: + repository: + image: nginx + tag: 1.27-alpine + replicas: 1 + nodeSelector: {} + resources: {} + imagePullPolicy: IfNotPresent + serviceAccount: "" + healthcheck: + enabled: true + livenessProbe: + httpGet: + path: /nginx_healthz + port: 80 + initialDelaySeconds: 10 + periodSeconds: 30 + timeoutSeconds: 10 + failureThreshold: 3 + successThreshold: 1 + readinessProbe: + httpGet: + path: /nginx_healthz + port: 80 + initialDelaySeconds: 10 + periodSeconds: 30 + timeoutSeconds: 10 + failureThreshold: 3 + successThreshold: 1 # imagePullSecrets allows you to specify a name of an image pull secret. # You must provide a list of object with the name field set to the name of the From 43f1b3440a6f38c8f6bc57a80748203403de39f2 Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Wed, 22 Oct 2025 21:02:25 +0530 Subject: [PATCH 15/18] Minor changes --- .../image-based-video-search/src/nginx/generate_certs.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh b/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh index 4a0dbdafa5..1dc0b5ecad 100755 --- a/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh +++ b/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh @@ -17,8 +17,5 @@ if [ ! -f "$SSL_DIR/server.crt" ] || [ ! -f "$SSL_DIR/server.key" ]; then -newkey rsa:2048 \ -keyout "$SSL_DIR/server.key" \ -out "$SSL_DIR/server.crt" \ - -subj "/C=IN/ST=KA/L=Bangalore/O=MyCompany/OU=Dev/CN=localhost" -fi - -# Start nginx -nginx -g "daemon off;" \ No newline at end of file + -subj "/C=US/ST=CA/L=San Francisco/O=Intel/OU=Edge AI/CN=localhost" +fi \ No newline at end of file From f2071f076080a1b37c4b5436c4ec14a450dd207d Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Wed, 22 Oct 2025 21:28:48 +0530 Subject: [PATCH 16/18] Document changes for helm --- .../docs/user-guide/how-to-deploy-helm.md | 16 ++-------------- .../src/nginx/generate_certs.sh | 5 ++++- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/metro-ai-suite/image-based-video-search/docs/user-guide/how-to-deploy-helm.md b/metro-ai-suite/image-based-video-search/docs/user-guide/how-to-deploy-helm.md index 55e419335f..6b645acb9f 100644 --- a/metro-ai-suite/image-based-video-search/docs/user-guide/how-to-deploy-helm.md +++ b/metro-ai-suite/image-based-video-search/docs/user-guide/how-to-deploy-helm.md @@ -60,21 +60,9 @@ helm install ibvs . --create-namespace -n ibvs \ --set noProxy="localhost\,127.0.0.1" ``` -To get the port where the application is serving, run the following command: -```bash -kubectl -n ibvs get svc/ibvs-app -``` - -This is an example output of the previous command: - -```text -NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE -ibvs-app NodePort 10.109.118.49 3000:31998/TCP 14m -``` - -Now frontend should be accessible at http://localhost:31998/. -> Note: To access the above url remotely, replace the `localhost` with your system IP address. +Now frontend should be accessible at https://:30443/. +> Note: To access the above url remotely, replace the `` with your system IP address. Finally, the app can be uninstalled using the following command: diff --git a/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh b/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh index 1dc0b5ecad..5232a7346b 100755 --- a/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh +++ b/metro-ai-suite/image-based-video-search/src/nginx/generate_certs.sh @@ -18,4 +18,7 @@ if [ ! -f "$SSL_DIR/server.crt" ] || [ ! -f "$SSL_DIR/server.key" ]; then -keyout "$SSL_DIR/server.key" \ -out "$SSL_DIR/server.crt" \ -subj "/C=US/ST=CA/L=San Francisco/O=Intel/OU=Edge AI/CN=localhost" -fi \ No newline at end of file +fi + +# Start nginx +nginx -g "daemon off;" \ No newline at end of file From 65f051c5ec8260786d1a52976656f96ab766b3f3 Mon Sep 17 00:00:00 2001 From: "Katakol, Rohit" Date: Thu, 23 Oct 2025 13:50:05 +0530 Subject: [PATCH 17/18] Document changes for nginx architecture --- .../image-based-video-search/README.md | 5 +++-- .../docs/user-guide/Overview.md | 5 +++-- .../docs/user-guide/_images/architecture.png | Bin 51546 -> 71575 bytes .../docs/user-guide/index.rst | 2 +- .../docs/user-guide/overview-architecture.md | 5 +++++ 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/metro-ai-suite/image-based-video-search/README.md b/metro-ai-suite/image-based-video-search/README.md index 15703d28eb..e11c75bc4f 100644 --- a/metro-ai-suite/image-based-video-search/README.md +++ b/metro-ai-suite/image-based-video-search/README.md @@ -1,4 +1,4 @@ -# Image-Based Video Search Sample Application +# Image-Based Video Search (IBVS) Sample Application Performs near real-time analysis and image-based search to detect and retrieve objects of interest in large video datasets. @@ -12,7 +12,7 @@ You can use this foundation to build solutions for diverse use cases, including ## How it Works The application workflow has three stages: inputs, processing, and outputs. -![Diagram illustrating the components and interactions within the Image-Based Video Search system, including inputs, processing, and outputs.](docs/user-guide/_images/architecture_simplified.png) +![Diagram illustrating the components and interactions within the Image-Based Video Search system, including inputs, processing, and outputs.](docs/user-guide/_images/architecture.png) ### Inputs @@ -23,6 +23,7 @@ The application includes a demonstration video for testing. The video loops cont ### Processing +- **Nginx reverse proxy server**: All interactions with user happens via Nginx server. It protects IBVS app by handling SSL/TLS encryption, filtering and validating requests and making the app directly inaccessible from external access. - **Video analysis with Deep Learning Streamer Pipeline Server and MediaMTX**: Select **Analyze Stream** to start the DL Streamer Pipeline Server pipeline. The Pipeline Server processes video through **MediaMTX**, which simulates remote video cameras and publishes live streams. The Pipeline Server extracts frames and detects objects in each frame, publishing predictions through **MQTT**. - **Feature extraction with Feature Matching**: DL Streamer Pipeline Server sends metadata and images through MQTT to the Feature Matching microservice. Feature Matching generates feature vectors. If predictions exceed the threshold, the system stores vector embeddings in MilvusDB and saves frames in the Docker file system. - **Storage and retrieval in MilvusDB**: MilvusDB stores feature vectors. You can review them in MilvusUI. diff --git a/metro-ai-suite/image-based-video-search/docs/user-guide/Overview.md b/metro-ai-suite/image-based-video-search/docs/user-guide/Overview.md index b72a48ebea..e8358cb8c4 100644 --- a/metro-ai-suite/image-based-video-search/docs/user-guide/Overview.md +++ b/metro-ai-suite/image-based-video-search/docs/user-guide/Overview.md @@ -1,4 +1,4 @@ -# Image-Based Video Search Sample Application +# Image-Based Video Search (IBVS) Sample Application @@ -23,7 +23,7 @@ quickly locate objects of interest across large video datasets. The application workflow has three stages: inputs, processing, and outputs. -![Diagram illustrating the components and interactions within the Image-Based Video Search system, including inputs, processing, and outputs.](_images/architecture_simplified.png) +![Diagram illustrating the components and interactions within the Image-Based Video Search system, including inputs, processing, and outputs.](_images/architecture.png) ### Inputs @@ -35,6 +35,7 @@ continuously and appears in the UI as soon as the application starts. ### Processing +- **Nginx reverse proxy server**: All interactions with user happens via Nginx server. It protects IBVS app by handling SSL/TLS encryption, filtering and validating requests and making the app directly inaccessible from external access. - **Video analysis with Deep Learning Streamer Pipeline Server and MediaMTX**: Select **Analyze Stream** to start the DL Streamer Pipeline Server pipeline. The Pipeline Server processes video through **MediaMTX**, which simulates diff --git a/metro-ai-suite/image-based-video-search/docs/user-guide/_images/architecture.png b/metro-ai-suite/image-based-video-search/docs/user-guide/_images/architecture.png index 6b8a5d6f3ecb56ce3d1b0197743a19f8dcdbce8c..2e0f38acaed2d6ee19af8aff69a374a1830398ee 100644 GIT binary patch literal 71575 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 literal 51546 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