Skip to content

Commit

Permalink
Merge pull request #963 from arc53/feat/kubes-deployment
Browse files Browse the repository at this point in the history
feat: k8s deployment
  • Loading branch information
dartpain authored May 24, 2024
2 parents 9f1d3b0 + 598a50a commit 2f504a4
Show file tree
Hide file tree
Showing 11 changed files with 405 additions and 0 deletions.
108 changes: 108 additions & 0 deletions docs/pages/Deploying/Kubernetes-Deploying.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# Self-hosting DocsGPT on Kubernetes

This guide will walk you through deploying DocsGPT on Kubernetes.

## Prerequisites

Ensure you have the following installed before proceeding:

- [kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)
- Access to a Kubernetes cluster

## Folder Structure

The `k8s` folder contains the necessary deployment and service configuration files:

- `deployments/`
- `services/`
- `docsgpt-secrets.yaml`

## Deployment Instructions

1. **Clone the Repository**

```sh
git clone https://github.com/arc53/DocsGPT.git
cd docsgpt/k8s
```

2. **Configure Secrets (optional)**

Ensure that you have all the necessary secrets in `docsgpt-secrets.yaml`. Update it with your secrets before applying if you want. By default we will use qdrant as a vectorstore and public docsgpt llm as llm for inference.

3. **Apply Kubernetes Deployments**

Deploy your DocsGPT resources using the following commands:

```sh
kubectl apply -f deployments/
```

4. **Apply Kubernetes Services**

Set up your services using the following commands:

```sh
kubectl apply -f services/
```

5. **Apply Secrets**

Apply the secret configurations:

```sh
kubectl apply -f docsgpt-secrets.yaml
```

6. **Substitute API URL**

After deploying the services, you need to update the environment variable `VITE_API_HOST` in your deployment file `deployments/docsgpt-deploy.yaml` with the actual endpoint URL created by your `docsgpt-api-service`.

You can get the value of the `docsgpt-api-service` by running:

```sh
kubectl get services/docsgpt-api-service | awk 'NR>1 {print $4}'
```

Update the `<your-api-endpoint>` field with your API endpoint URL by running this command and pasting endpoint from previous command:

```sh
read -p "Enter the API endpoint: " api_endpoint && sed -i "s|<your-api-endpoint>|$api_endpoint|g" deployments/docsgpt-deploy.yaml
```

7. **Rerun Deployment**

After making the changes, reapply the deployment configuration to update the environment variables:

```sh
kubectl apply -f deployments/
```

## Verifying the Deployment

To verify if everything is set up correctly, you can run the following:

```sh
kubectl get pods
kubectl get services
```

Ensure that the pods are running and the services are available.

## Accessing DocsGPT

To access DocsGPT, you need to find the external IP address of the frontend service. You can do this by running:

```sh
kubectl get services/docsgpt-frontend-service | awk 'NR>1 {print "http://" $4}'
```

## Troubleshooting

If you encounter any issues, you can check the logs of the pods for more details:

```sh
kubectl logs <pod-name>
```

Replace `<pod-name>` with the actual name of your DocsGPT pod.
4 changes: 4 additions & 0 deletions docs/pages/Deploying/_meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,9 @@
"Railway-Deploying": {
"title": "🚂Deploying on Railway",
"href": "/Deploying/Railway-Deploying"
},
"Kubernetes-Deploying": {
"title": "🚀Deploying on Kubernetes",
"href": "/Deploying/Kubernetes-Deploying"
}
}
98 changes: 98 additions & 0 deletions k8s/deployments/docsgpt-deploy.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: docsgpt-api
spec:
replicas: 1
selector:
matchLabels:
app: docsgpt-api
template:
metadata:
labels:
app: docsgpt-api
spec:
containers:
- name: docsgpt-api
image: arc53/docsgpt
ports:
- containerPort: 7091
resources:
limits:
memory: "4Gi"
cpu: "2"
requests:
memory: "2Gi"
cpu: "1"
envFrom:
- secretRef:
name: docsgpt-secrets
env:
- name: FLASK_APP
value: "application/app.py"
- name: DEPLOYMENT_TYPE
value: "cloud"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: docsgpt-worker
spec:
replicas: 1
selector:
matchLabels:
app: docsgpt-worker
template:
metadata:
labels:
app: docsgpt-worker
spec:
containers:
- name: docsgpt-worker
image: arc53/docsgpt
command: ["celery", "-A", "application.app.celery", "worker", "-l", "INFO", "-n", "worker.%h"]
resources:
limits:
memory: "4Gi"
cpu: "2"
requests:
memory: "2Gi"
cpu: "1"
envFrom:
- secretRef:
name: docsgpt-secrets
env:
- name: API_URL
value: "http://<your-api-endpoint>"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: docsgpt-frontend
spec:
replicas: 1
selector:
matchLabels:
app: docsgpt-frontend
template:
metadata:
labels:
app: docsgpt-frontend
spec:
containers:
- name: docsgpt-frontend
image: arc53/docsgpt-fe
ports:
- containerPort: 5173
resources:
limits:
memory: "1Gi"
cpu: "1"
requests:
memory: "256Mi"
cpu: "100m"
env:
- name: VITE_API_HOST
value: "http://<your-api-endpoint>"
- name: VITE_API_STREAMING
value: "true"
46 changes: 46 additions & 0 deletions k8s/deployments/mongo-deploy.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mongodb-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi # Adjust size as needed

---

apiVersion: apps/v1
kind: Deployment
metadata:
name: mongodb
spec:
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: mongo:latest
ports:
- containerPort: 27017
resources:
limits:
memory: "1Gi"
cpu: "0.5"
requests:
memory: "512Mi"
cpu: "250m"
volumeMounts:
- name: mongodb-data
mountPath: /data/db
volumes:
- name: mongodb-data
persistentVolumeClaim:
claimName: mongodb-pvc
46 changes: 46 additions & 0 deletions k8s/deployments/qdrant-deploy.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: qdrant-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi

---

apiVersion: apps/v1
kind: Deployment
metadata:
name: qdrant
spec:
replicas: 1
selector:
matchLabels:
app: qdrant
template:
metadata:
labels:
app: qdrant
spec:
containers:
- name: qdrant
image: qdrant/qdrant:latest
ports:
- containerPort: 6333
resources:
limits:
memory: "2Gi" # Adjust based on your needs
cpu: "1" # Adjust based on your needs
requests:
memory: "1Gi" # Adjust based on your needs
cpu: "500m" # Adjust based on your needs
volumeMounts:
- name: qdrant-data
mountPath: /qdrant/storage
volumes:
- name: qdrant-data
persistentVolumeClaim:
claimName: qdrant-pvc
26 changes: 26 additions & 0 deletions k8s/deployments/redis-deploy.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:latest
ports:
- containerPort: 6379
resources:
limits:
memory: "1Gi"
cpu: "0.5"
requests:
memory: "512Mi"
cpu: "250m"
16 changes: 16 additions & 0 deletions k8s/docsgpt-secrets.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
apiVersion: v1
kind: Secret
metadata:
name: docsgpt-secrets
type: Opaque
data:
LLM_NAME: ZG9jc2dwdA==
INTERNAL_KEY: aW50ZXJuYWw=
CELERY_BROKER_URL: cmVkaXM6Ly9yZWRpcy1zZXJ2aWNlOjYzNzkvMA==
CELERY_RESULT_BACKEND: cmVkaXM6Ly9yZWRpcy1zZXJ2aWNlOjYzNzkvMA==
QDRANT_URL: cmVkaXM6Ly9yZWRpcy1zZXJ2aWNlOjYzNzkvMA==
QDRANT_PORT: NjM3OQ==
MONGO_URI: bW9uZ29kYjovL21vbmdvZGItc2VydmljZToyNzAxNy9kb2NzZ3B0P3JldHJ5V3JpdGVzPXRydWUmdz1tYWpvcml0eQ==
VECTOR_STORE: cWRyYW50
mongo-user: bW9uZ28tdXNlcg==
mongo-password: bW9uZ28tcGFzc3dvcmQ=
25 changes: 25 additions & 0 deletions k8s/services/docsgpt-service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
apiVersion: v1
kind: Service
metadata:
name: docsgpt-api-service
spec:
selector:
app: docsgpt-api
ports:
- protocol: TCP
port: 80
targetPort: 7091
type: LoadBalancer
---
apiVersion: v1
kind: Service
metadata:
name: docsgpt-frontend-service
spec:
selector:
app: docsgpt-frontend
ports:
- protocol: TCP
port: 80
targetPort: 5173
type: LoadBalancer
Loading

0 comments on commit 2f504a4

Please sign in to comment.