@@ -21,6 +21,7 @@ CLUSTER_NAME="${CLUSTER_NAME:-inferadb-local}"
2121NAMESPACE=" ${NAMESPACE:- inferadb} "
2222SERVER_IMAGE=" ${SERVER_IMAGE:- inferadb-engine: local} "
2323CONTROL_IMAGE=" ${CONTROL_IMAGE:- inferadb-control: local} "
24+ DASHBOARD_IMAGE=" ${DASHBOARD_IMAGE:- inferadb-dashboard: local} "
2425
2526log_info () {
2627 echo -e " ${GREEN} [INFO]${NC} $1 "
@@ -82,15 +83,15 @@ nodes:
8283 - containerPort: 30080
8384 hostPort: 8080
8485 protocol: TCP
85- - containerPort: 30081
86- hostPort: 3000
87- protocol: TCP
8886 - containerPort: 30090
8987 hostPort: 9090
9088 protocol: TCP
9189 - containerPort: 30091
9290 hostPort: 9091
9391 protocol: TCP
92+ - containerPort: 30030
93+ hostPort: 3030
94+ protocol: TCP
9495- role: worker
9596- role: worker
9697EOF
@@ -122,6 +123,13 @@ build_images() {
122123 exit 1
123124 }
124125
126+ # Build dashboard
127+ log_info " Building dashboard image..."
128+ docker build -t " ${DASHBOARD_IMAGE} " " ${repo_root} /dashboard/" || {
129+ log_error " Failed to build dashboard image"
130+ exit 1
131+ }
132+
125133 log_info " Images built ✓"
126134}
127135
@@ -130,6 +138,7 @@ load_images() {
130138
131139 kind load docker-image " ${SERVER_IMAGE} " --name " ${CLUSTER_NAME} "
132140 kind load docker-image " ${CONTROL_IMAGE} " --name " ${CLUSTER_NAME} "
141+ kind load docker-image " ${DASHBOARD_IMAGE} " --name " ${CLUSTER_NAME} "
133142
134143 log_info " Images loaded ✓"
135144}
653662 log_info " Engine deployed ✓"
654663}
655664
665+ deploy_dashboard () {
666+ log_info " Deploying Dashboard..."
667+
668+ kubectl apply -f - << EOF
669+ apiVersion: apps/v1
670+ kind: Deployment
671+ metadata:
672+ name: inferadb-dashboard
673+ namespace: ${NAMESPACE}
674+ spec:
675+ replicas: 1
676+ selector:
677+ matchLabels:
678+ app: inferadb-dashboard
679+ template:
680+ metadata:
681+ labels:
682+ app: inferadb-dashboard
683+ spec:
684+ containers:
685+ - name: dashboard
686+ image: ${DASHBOARD_IMAGE}
687+ imagePullPolicy: Never
688+ ports:
689+ - containerPort: 3000
690+ name: http
691+ env:
692+ - name: NODE_ENV
693+ value: "production"
694+ - name: HOST
695+ value: "0.0.0.0"
696+ - name: PORT
697+ value: "3000"
698+ # Control API URL - within the K8s cluster
699+ - name: CONTROL_API_URL
700+ value: "http://inferadb-control:9090"
701+ livenessProbe:
702+ httpGet:
703+ path: /
704+ port: 3000
705+ initialDelaySeconds: 10
706+ periodSeconds: 10
707+ timeoutSeconds: 5
708+ failureThreshold: 3
709+ readinessProbe:
710+ httpGet:
711+ path: /
712+ port: 3000
713+ initialDelaySeconds: 5
714+ periodSeconds: 5
715+ timeoutSeconds: 3
716+ failureThreshold: 3
717+ ---
718+ apiVersion: v1
719+ kind: Service
720+ metadata:
721+ name: inferadb-dashboard
722+ namespace: ${NAMESPACE}
723+ spec:
724+ selector:
725+ app: inferadb-dashboard
726+ ports:
727+ - name: http
728+ port: 3000
729+ targetPort: 3000
730+ nodePort: 30030
731+ type: NodePort
732+ EOF
733+
734+ log_info " Waiting for Dashboard to be ready..."
735+ kubectl wait --for=condition=available deployment/inferadb-dashboard -n " ${NAMESPACE} " --timeout=120s
736+
737+ log_info " Dashboard deployed ✓"
738+ }
739+
656740show_status () {
657741 log_info " Deployment Status:"
658742 echo " "
@@ -662,9 +746,10 @@ show_status() {
662746 echo " "
663747
664748 log_info " Access URLs:"
665- echo " Engine: http://localhost:8080"
666- echo " Control: http://localhost:9090"
667- echo " Mailpit: http://localhost:30025 (email web UI)"
749+ echo " Dashboard: http://localhost:3030"
750+ echo " Engine: http://localhost:8080"
751+ echo " Control: http://localhost:9090"
752+ echo " Mailpit: http://localhost:30025 (email web UI)"
668753 echo " "
669754
670755 log_info " Useful Commands:"
@@ -701,6 +786,7 @@ main() {
701786 deploy_mailpit
702787 deploy_control
703788 deploy_engine
789+ deploy_dashboard
704790
705791 log_info " Setup complete! 🎉"
706792 echo " "
0 commit comments