Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
f4668d2
Add release script and helm chart index
mgdevstack Aug 8, 2023
d7873a0
add v1.0.0 chart
mgdevstack Aug 8, 2023
42061b5
Update chart url
mgdevstack Aug 8, 2023
cfadffa
Update chart url
mgdevstack Aug 8, 2023
78e8fab
Merge branch 'main' into gh-pages
mgdevstack Aug 9, 2023
c2c3cf4
Release chart roost v1.0.0
mgdevstack Aug 9, 2023
1a7ec7f
Merge pull request #4 from roost-io/main
mgdevstack Jun 13, 2024
4f3ce2a
update release
mgdevstack Jun 13, 2024
7db3648
Merge pull request #6 from roost-io/main
Garvit-Jethwani Jun 18, 2024
8cb8b0f
update release
Garvit-Jethwani Jun 18, 2024
0a96b19
Fix template
mgdevstack Sep 12, 2025
179a2b7
Explicitly mention external load balancer
mgdevstack Sep 12, 2025
8541717
Update template to handle storage class name from values.yaml
mgdevstack Sep 17, 2025
cba3db0
Add storageClass in values.yaml
mgdevstack Sep 17, 2025
31d9bf9
refactor roostgpt k8s cluster service
mgdevstack Mar 9, 2026
7145bb5
release roostgpt
mgdevstack Mar 9, 2026
0f90749
update mysql for eks
mgdevstack Mar 11, 2026
012dce3
Release artifacts
mgdevstack Mar 11, 2026
e3a1fc7
Add ssl ports
mgdevstack Mar 11, 2026
45a7e4c
Add EAAS_SVC
mgdevstack Mar 11, 2026
56d25a6
Release artifacts
mgdevstack Mar 11, 2026
619546f
fix mount path
mgdevstack Mar 11, 2026
42757b0
Release artifacts
mgdevstack Mar 11, 2026
3a05ff1
Update database pvc with ebs
mgdevstack Mar 12, 2026
85a5a6e
Release artifacts
mgdevstack Mar 12, 2026
3d97ff9
Release artifacts
mgdevstack Mar 12, 2026
e152218
Release artifacts
mgdevstack Mar 12, 2026
e3d37ee
Release artifacts
mgdevstack Mar 12, 2026
96166d4
Fix if logic and Release artifacts
mgdevstack Mar 12, 2026
215f97f
Fix gateway and Release artifacts
mgdevstack Mar 12, 2026
1dfbbac
skip clusterscope resources on ns change and Release artifacts
mgdevstack Mar 12, 2026
ca04843
make drive all writable and Release artifacts
mgdevstack Mar 12, 2026
f9bae64
update efs permission and Release artifacts
mgdevstack Mar 13, 2026
f22e3f0
update efs permission and Release artifacts
mgdevstack Mar 13, 2026
39cdcaf
Add resource permission and Release artifacts
mgdevstack Mar 13, 2026
08d0b21
Add securityContext and Release artifacts
mgdevstack Mar 13, 2026
4d521d5
Remove resource constraints temporarily and Release artifacts
mgdevstack Mar 13, 2026
0d6b64d
Update storageClass guid permission and Release artifacts
mgdevstack Mar 13, 2026
39a9e9b
Update non root user for roost-web and add released artifact
mgdevstack Mar 25, 2026
b4e56c6
Add aiio services
mgdevstack May 13, 2026
3061170
Add aiio services and update release
mgdevstack May 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
values-secret.yaml
45 changes: 40 additions & 5 deletions charts/roost/templates/NOTES.txt
Original file line number Diff line number Diff line change
@@ -1,20 +1,55 @@
# Welcome to the RoostAI Helm Chart!

## Secret Values (values-secret.yaml)

Sensitive credentials (DB passwords, OAuth secrets, license key, ACM ARN, etc.)
must NOT be committed to git. Store them in a separate file:

charts/roost/values-secret.yaml ← listed in .gitignore

Deploy with both files:
helm upgrade --install roost charts/roost \
-f charts/roost/values.yaml \
-f charts/roost/values-secret.yaml \
-n roost --create-namespace

## Accessing RoostAI

{{- if or (eq .Values.cloudConfig.clusterType "gke") (eq .Values.cloudConfig.clusterType "aks") }}
NOTE: It may take a few minutes for the Ingress Address IP to be available.
{{- if .Values.gateway.enabled }}
NOTE: Gateway API mode is enabled. NGINX Gateway Fabric must be installed in the cluster.
Install it with (use --skip-crds if Gateway API CRDs >= v1.5 are already present):
helm install ngf oci://ghcr.io/nginx/charts/nginx-gateway-fabric \
--create-namespace -n nginx-gateway --skip-crds

It may take a few minutes for the Gateway address to become available.
Watch the gateway status:
kubectl get --namespace {{ .Release.Namespace }} gateway roost-gateway -w

Get the RoostAI external address:
export SERVICE_IP=$(kubectl get gateway --namespace {{ .Release.Namespace }} roost-gateway \
-o jsonpath="{.status.addresses[0].value}")
echo "RoostAI URL: http://$SERVICE_IP"

{{- if eq .Values.cloudConfig.clusterType "local" }}
On Docker Desktop the LoadBalancer is exposed on localhost (127.0.0.1).
Since '{{ .Values.enterprise.domainURL }}' resolves to 127.0.0.1 automatically,
you can open your browser at: http://{{ .Values.enterprise.domainURL }}
{{- end }}
{{- else if or (eq .Values.cloudConfig.clusterType "gke") (eq .Values.cloudConfig.clusterType "aks") }}
NOTE: It may take a few minutes for the Ingress address to be available.
You can watch the status by running: 'kubectl get --namespace {{ .Release.Namespace }} ingress -w roost-{{ .Values.cloudConfig.clusterType }}-ingress'
Get the roostai loadbalancer external IP by running these commands:

export SERVICE_IP=$(kubectl get ingress --namespace {{ .Release.Namespace }} roost-{{ .Values.cloudConfig.clusterType }}-ingress -o jsonpath="{.status.loadBalancer.ingress[0].ip}")
export SERVICE_IP=$(kubectl get ingress --namespace {{ .Release.Namespace }} roost-{{ .Values.cloudConfig.clusterType }}-ingress -o jsonpath="{.status.loadBalancer.ingress[0].hostname}")
{{- else }}
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status by running: 'kubectl get --namespace {{ .Release.Namespace }} svc -w roost-nginx-svc'
Get the roostai loadbalancer external IP by running these commands:
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} roost-nginx-svc -o jsonpath="{.status.loadBalancer.ingress[0].ip}")
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} roost-nginx-svc -o jsonpath="{.status.loadBalancer.ingress[0].hostname}")
{{- end }}
{{- if not .Values.gateway.enabled }}
echo "RoostAI LoadBalancer URL: http://$SERVICE_IP"
{{- end }}

## Mapping the RoostAI LoadBalancer IP to Your Domain

Expand All @@ -30,4 +65,4 @@ To map this LoadBalancer IP to your domain, follow these steps:

4. Save the DNS record.

5. It may take some time (DNS propagation) for your domain to point to the RoostAI LoadBalancer IP.
5. It may take some time (DNS propagation) for your domain to point to the RoostAI LoadBalancer IP.
18 changes: 12 additions & 6 deletions charts/roost/templates/_helpers.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -65,22 +65,28 @@ Create the name of the service account to use
Storage Class Name
*/}}
{{- define "cluster.storageClassName" -}}
{{- if eq .Values.cloudConfig.clusterType "aks" }}
storageClassName: roost-sc-azurefile-csi-nfs
{{- if and .Values.storageClass .Values.storageClass }}
storageClassName: {{ .Values.storageClass }}
{{- else if eq .Values.cloudConfig.clusterType "aks" }}
storageClassName: {{ .Values.storageClass }}
{{- else if eq .Values.cloudConfig.clusterType "gke" }}
storageClassName: standard-rwx
{{- else if eq .Values.cloudConfig.clusterType "eks" }}
storageClassName: roost-sc-efs
{{- else }}
# storageClassName: default
storageClassName: {{ .Values.storageClass }}
{{- else if eq .Values.cloudConfig.clusterType "local" }}
storageClassName: {{ .Values.storageClass }}
{{- end }}
{{- end }}

{{/*
Roost Nginx Service Type
When Gateway API is enabled the nginx service is always ClusterIP — the Gateway's
LoadBalancer is the external entry point. Legacy mode preserves cloud-specific types.
*/}}
{{- define "nginxService.type" -}}
{{- if or (eq .Values.cloudConfig.clusterType "gke") (eq .Values.cloudConfig.clusterType "aks") }}
{{- if .Values.gateway.enabled }}
type: ClusterIP
{{- else if or (eq .Values.cloudConfig.clusterType "gke") (eq .Values.cloudConfig.clusterType "aks") }}
type: ClusterIP
{{- else }}
type: LoadBalancer
Expand Down
179 changes: 179 additions & 0 deletions charts/roost/templates/roost-ai-code-analyzer.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: roost-ai-code-analyzer-config
namespace: {{ .Release.Namespace }}
data:
DATABASE_URL: 'postgresql://{{ .Values.aiCodeAnalyzer.db.user }}:{{ .Values.aiCodeAnalyzer.db.password }}@ai-code-analyzer-db-svc.{{ .Release.Namespace }}.svc.{{ .Values.clusterDomain }}:5432/{{ .Values.aiCodeAnalyzer.db.database }}'
POSTGRES_DB: '{{ .Values.aiCodeAnalyzer.db.database }}'
POSTGRES_USER: '{{ .Values.aiCodeAnalyzer.db.user }}'
POSTGRES_PASSWORD: '{{ .Values.aiCodeAnalyzer.db.password }}'

---
apiVersion: v1
kind: Service
metadata:
name: ai-code-analyzer-svc
namespace: {{ .Release.Namespace }}
spec:
selector:
app: ai-code-analyzer
ports:
- protocol: TCP
port: 5060
targetPort: 5060

---
apiVersion: v1
kind: Service
metadata:
name: ai-code-analyzer-db-svc
namespace: {{ .Release.Namespace }}
spec:
selector:
app: ai-code-analyzer-db
ports:
- protocol: TCP
port: 5432
targetPort: 5432

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ai-code-analyzer-pvc-{{ .Release.Namespace }}
namespace: {{ .Release.Namespace }}
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: {{ .Values.aiCodeAnalyzer.storage.size }}
{{- include "cluster.storageClassName" . | indent 2 }}

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ai-code-analyzer-db-pvc-{{ .Release.Namespace }}
namespace: {{ .Release.Namespace }}
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: {{ .Values.aiCodeAnalyzer.db.storage.size }}
{{- include "cluster.storageClassName" . | indent 2 }}

---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-code-analyzer-db
namespace: {{ .Release.Namespace }}
spec:
replicas: 1
selector:
matchLabels:
app: ai-code-analyzer-db
template:
metadata:
labels:
app: ai-code-analyzer-db
spec:
containers:
- name: ai-code-analyzer-db
image: postgres:18-alpine
envFrom:
- configMapRef:
name: roost-ai-code-analyzer-config
env:
- name: PGDATA
value: /var/lib/postgresql/data
ports:
- containerPort: 5432
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: ai-code-analyzer-db-storage
livenessProbe:
exec:
command:
- pg_isready
- -U
- {{ .Values.aiCodeAnalyzer.db.user }}
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
exec:
command:
- pg_isready
- -U
- {{ .Values.aiCodeAnalyzer.db.user }}
initialDelaySeconds: 10
periodSeconds: 5
imagePullPolicy: Always
volumes:
- name: ai-code-analyzer-db-storage
persistentVolumeClaim:
claimName: ai-code-analyzer-db-pvc-{{ .Release.Namespace }}

---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ai-code-analyzer
namespace: {{ .Release.Namespace }}
spec:
replicas: {{ .Values.aiCodeAnalyzer.replicas }}
selector:
matchLabels:
app: ai-code-analyzer
template:
metadata:
labels:
app: ai-code-analyzer
annotations:
checksum/config: {{ toYaml (pick .Values "aiCodeAnalyzer") | sha256sum }}
spec:
securityContext:
runAsNonRoot: true
runAsUser: 10001
runAsGroup: 10001
fsGroup: 10001
initContainers:
- name: wait-for-db
image: postgres:18-alpine
command:
- sh
- -c
- |
until pg_isready -h ai-code-analyzer-db-svc -p 5432 -U {{ .Values.aiCodeAnalyzer.db.user }};
do
echo "Waiting for postgres..."
sleep 2
done
containers:
- name: ai-code-analyzer
image: zbio/ai-io:{{ .Values.aiCodeAnalyzer.imageTag }}
envFrom:
- configMapRef:
name: roost-ai-code-analyzer-config
ports:
- containerPort: 5060
volumeMounts:
- mountPath: /app/chroma_db
subPath: chroma_db
name: ai-code-analyzer-storage
- mountPath: /app/jobs
subPath: jobs
name: ai-code-analyzer-storage
- mountPath: /app/test_artifacts
subPath: test_artifacts
name: ai-code-analyzer-storage
imagePullPolicy: Always
volumes:
- name: ai-code-analyzer-storage
persistentVolumeClaim:
claimName: ai-code-analyzer-pvc-{{ .Release.Namespace }}

---
20 changes: 16 additions & 4 deletions charts/roost/templates/roost-ai-server.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ data:
ROOST_VER: '{{ .Values.roostConfig.roostVersion }}'
DEPLOYED_IN_K8S: 'true'
ROOST_AI_NS: '{{ .Release.Namespace }}'
AI_SERVER_PVC: 'roost-ai-server-pvc'
AI_SERVER_PVC: roost-ai-server-pvc-{{ .Release.Namespace }}

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: roost-ai-server-pvc
name: roost-ai-server-pvc-{{ .Release.Namespace }}
namespace: {{ .Release.Namespace }}
spec:
accessModes:
Expand Down Expand Up @@ -46,14 +46,26 @@ spec:
app: roost-ai-server
svc_group: roost-backend-svc
spec:
securityContext:
runAsNonRoot: true
runAsUser: 10001
runAsGroup: 10001
fsGroup: 10001
containers:
- name: roost-ai-server
image: zbio/roostai-server:{{ .Values.roostConfig.roostVersion }}
# resources:
# requests:
# cpu: "100m"
# memory: "256Mi"
# limits:
# cpu: "500m"
# memory: "512Mi"
envFrom:
- configMapRef:
name: roost-ai-server-config
volumeMounts:
- mountPath: /var/tmp/Roost/RoostGPT
- mountPath: /var/tmp/Roost
name: roost-ai-server-data
ports:
- name: ai-server-port
Expand All @@ -62,7 +74,7 @@ spec:
volumes:
- name: roost-ai-server-data
persistentVolumeClaim:
claimName: roost-ai-server-pvc
claimName: roost-ai-server-pvc-{{ .Release.Namespace }}

---
{{- end }}
Loading