Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
23 changes: 23 additions & 0 deletions charts/nexusgate/.helmignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*.orig
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/
9 changes: 9 additions & 0 deletions charts/nexusgate/Chart.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
dependencies:
- name: postgresql
repository: https://charts.bitnami.com/bitnami
version: 16.4.1
- name: redis
repository: https://charts.bitnami.com/bitnami
version: 20.6.2
digest: sha256:cfe1430ac1c4e64797d80879173085fea117691b9bd52f82e3825520b65b3441
generated: "2026-01-17T21:07:26.76951+08:00"
34 changes: 34 additions & 0 deletions charts/nexusgate/Chart.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
apiVersion: v2
name: nexusgate
description: A Helm chart for NexusGate - OpenAI-compatible API Gateway for LLM providers
type: application
version: 0.1.0
appVersion: "1.0.0"

home: https://github.com/EM-GeekLab/NexusGate
sources:
- https://github.com/EM-GeekLab/NexusGate

maintainers:
- name: EM-GeekLab
url: https://github.com/EM-GeekLab

keywords:
- ai
- llm
- openai
- api-gateway
- kubernetes

dependencies:
# PostgreSQL for persistent storage
- name: postgresql
version: "16.4.1"
repository: "https://charts.bitnami.com/bitnami"
condition: postgresql.enabled

# Redis for rate limiting and caching
- name: redis
version: "20.6.2"
repository: "https://charts.bitnami.com/bitnami"
condition: redis.enabled
Binary file added charts/nexusgate/charts/postgresql-16.4.1.tgz
Binary file not shown.
Binary file added charts/nexusgate/charts/redis-20.6.2.tgz
Binary file not shown.
93 changes: 93 additions & 0 deletions charts/nexusgate/templates/NOTES.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@

╔═══════════════════════════════════════════════════════════════════╗
║ NexusGate has been installed! ║
╚═══════════════════════════════════════════════════════════════════╝

Thank you for installing {{ .Chart.Name }}.

Your release is named: {{ .Release.Name }}
Namespace: {{ .Release.Namespace }}

=== Getting Started ===

1. Get the application URL:
{{- if .Values.ingress.enabled }}
{{- range $host := .Values.ingress.hosts }}
{{- range .paths }}
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
{{- end }}
{{- end }}
{{- else if contains "NodePort" .Values.service.type }}
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "nexusgate.fullname" . }})
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
echo "NexusGate URL: http://$NODE_IP:$NODE_PORT"
{{- else if contains "LoadBalancer" .Values.service.type }}
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 {{ include "nexusgate.fullname" . }}

export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "nexusgate.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
echo "NexusGate URL: http://$SERVICE_IP:{{ .Values.service.port }}"
{{- else if contains "ClusterIP" .Values.service.type }}
# Port-forward to access NexusGate locally:
kubectl port-forward --namespace {{ .Release.Namespace }} svc/{{ include "nexusgate.fullname" . }} 3000:{{ .Values.service.port }}

# Then access at: http://localhost:3000
{{- end }}

2. Get the admin API key:
{{- if .Values.nexusgate.existingSecret }}
kubectl get secret --namespace {{ .Release.Namespace }} {{ .Values.nexusgate.existingSecret }} -o jsonpath="{.data.{{ .Values.nexusgate.existingSecretKey | default "admin-key" }}}" | base64 -d
{{- else }}
kubectl get secret --namespace {{ .Release.Namespace }} {{ include "nexusgate.fullname" . }}-admin -o jsonpath="{.data.admin-key}" | base64 -d
{{- end }}

=== Kubernetes DNS (In-Cluster Access) ===

Other pods in the cluster can access NexusGate using:

- Short form: http://{{ include "nexusgate.fullname" . }}.{{ .Release.Namespace }}.svc:{{ .Values.service.port }}
- Full form: http://{{ include "nexusgate.fullname" . }}.{{ .Release.Namespace }}.svc.cluster.local:{{ .Values.service.port }}

For OpenAI-compatible API calls, use:
OPENAI_API_BASE=http://{{ include "nexusgate.fullname" . }}.{{ .Release.Namespace }}.svc:{{ .Values.service.port }}/v1

=== Quick Test ===

# Test the health endpoint
curl http://localhost:3000/health

# Test chat completions (replace YOUR_API_KEY)
curl -X POST http://localhost:3000/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "Hello!"}]
}'

{{- if .Values.operator.enabled }}

=== NexusGate Operator ===

The NexusGate Operator is enabled. You can now create NexusGateApp resources
to automatically provision API keys:

apiVersion: gateway.nexusgate.io/v1alpha1
kind: NexusGateApp
metadata:
name: my-app
spec:
appName: "my-app"
secretRef:
name: my-app-api-key
key: OPENAI_API_KEY

{{- end }}

=== Documentation ===

For more information, visit:
https://github.com/EM-GeekLab/NexusGate

Happy proxying! 🚀
Loading
Loading