Feature helmchart and ci jan server (#2106)
* Add helm chart for jan server * Add CI for jan server --------- Co-authored-by: Hien To <tominhhien97@gmail.com>
This commit is contained in:
parent
7fbc6cb6c0
commit
49fa6d8df2
40
.github/workflows/jan-server-build-nightly.yml
vendored
Normal file
40
.github/workflows/jan-server-build-nightly.yml
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
name: Jan Build Docker Nightly or Manual
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- feature/helmchart-and-ci-jan-server
|
||||||
|
paths-ignore:
|
||||||
|
- 'README.md'
|
||||||
|
- 'docs/**'
|
||||||
|
schedule:
|
||||||
|
- cron: '0 20 * * 1,2,3' # At 8 PM UTC on Monday, Tuesday, and Wednesday which is 3 AM UTC+7 Tuesday, Wednesday, and Thursday
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# Job create Update app version based on latest release tag with build number and save to output
|
||||||
|
get-update-version:
|
||||||
|
uses: ./.github/workflows/template-get-update-version.yml
|
||||||
|
|
||||||
|
build-cpu:
|
||||||
|
uses: ./.github/workflows/template-build-jan-server.yml
|
||||||
|
permissions:
|
||||||
|
packages: write
|
||||||
|
secrets: inherit
|
||||||
|
needs: [get-update-version]
|
||||||
|
with:
|
||||||
|
dockerfile_path: ./Dockerfile
|
||||||
|
docker_image_tag: "ghcr.io/janhq/jan-server:dev-cpu-latest,ghcr.io/janhq/jan-server:dev-cpu-${{ needs.get-update-version.outputs.new_version }}"
|
||||||
|
|
||||||
|
build-gpu:
|
||||||
|
uses: ./.github/workflows/template-build-jan-server.yml
|
||||||
|
permissions:
|
||||||
|
packages: write
|
||||||
|
secrets: inherit
|
||||||
|
needs: [get-update-version]
|
||||||
|
with:
|
||||||
|
dockerfile_path: ./Dockerfile.gpu
|
||||||
|
docker_image_tag: "ghcr.io/janhq/jan-server:dev-cuda-12.2-latest,ghcr.io/janhq/jan-server:dev-cuda-12.2-${{ needs.get-update-version.outputs.new_version }}"
|
||||||
|
|
||||||
|
|
||||||
30
.github/workflows/jan-server-build.yml
vendored
Normal file
30
.github/workflows/jan-server-build.yml
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
name: Jan Build Docker
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags: ["v[0-9]+.[0-9]+.[0-9]+"]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# Job create Update app version based on latest release tag with build number and save to output
|
||||||
|
get-update-version:
|
||||||
|
uses: ./.github/workflows/template-get-update-version.yml
|
||||||
|
|
||||||
|
build-cpu:
|
||||||
|
permissions:
|
||||||
|
packages: write
|
||||||
|
uses: ./.github/workflows/template-build-jan-server.yml
|
||||||
|
secrets: inherit
|
||||||
|
needs: [get-update-version]
|
||||||
|
with:
|
||||||
|
dockerfile_path: ./Dockerfile
|
||||||
|
docker_image_tag: "ghcr.io/janhq/jan-server:cpu-latest,ghcr.io/janhq/jan-server:cpu-${{ needs.get-update-version.outputs.new_version }}"
|
||||||
|
|
||||||
|
build-gpu:
|
||||||
|
permissions:
|
||||||
|
packages: write
|
||||||
|
uses: ./.github/workflows/template-build-jan-server.yml
|
||||||
|
secrets: inherit
|
||||||
|
needs: [get-update-version]
|
||||||
|
with:
|
||||||
|
dockerfile_path: ./Dockerfile.gpu
|
||||||
|
docker_image_tag: "ghcr.io/janhq/jan-server:cuda-12.2-latest,ghcr.io/janhq/jan-server:cuda-12.2-${{ needs.get-update-version.outputs.new_version }}"
|
||||||
39
.github/workflows/template-build-jan-server.yml
vendored
Normal file
39
.github/workflows/template-build-jan-server.yml
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
name: build-jan-server
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
dockerfile_path:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: './Dockerfile'
|
||||||
|
docker_image_tag:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
default: 'ghcr.io/janhq/jan-server:dev-latest'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
env:
|
||||||
|
REGISTRY: ghcr.io
|
||||||
|
IMAGE_NAME: janhq/jan-server
|
||||||
|
permissions:
|
||||||
|
packages: write
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Log in to the Container registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ${{ env.REGISTRY }}
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Build and push Docker image
|
||||||
|
uses: docker/build-push-action@v3
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: ${{ inputs.dockerfile_path }}
|
||||||
|
push: true
|
||||||
|
tags: ${{ inputs.docker_image_tag }}
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@ -5,6 +5,7 @@
|
|||||||
error.log
|
error.log
|
||||||
node_modules
|
node_modules
|
||||||
*.tgz
|
*.tgz
|
||||||
|
!charts/server/charts/*.tgz
|
||||||
yarn.lock
|
yarn.lock
|
||||||
dist
|
dist
|
||||||
build
|
build
|
||||||
|
|||||||
6
charts/server/Chart.lock
Normal file
6
charts/server/Chart.lock
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
dependencies:
|
||||||
|
- name: common
|
||||||
|
repository: oci://ghcr.io/janhq/charts
|
||||||
|
version: 0.1.2
|
||||||
|
digest: sha256:35e98bde174130787755b0f8ea2359b7b6790d965a7157c2f7cabf1bc8c04471
|
||||||
|
generated: "2024-02-20T16:20:37.6530108+07:00"
|
||||||
10
charts/server/Chart.yaml
Normal file
10
charts/server/Chart.yaml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
apiVersion: v2
|
||||||
|
name: jan-server
|
||||||
|
description: A Helm chart for Kubernetes
|
||||||
|
type: application
|
||||||
|
version: 0.1.0
|
||||||
|
appVersion: '1.0.0'
|
||||||
|
dependencies:
|
||||||
|
- name: common
|
||||||
|
version: 0.1.2 # common-chart-version
|
||||||
|
repository: oci://ghcr.io/janhq/charts
|
||||||
BIN
charts/server/charts/common-0.1.2.tgz
Normal file
BIN
charts/server/charts/common-0.1.2.tgz
Normal file
Binary file not shown.
4
charts/server/config.json
Normal file
4
charts/server/config.json
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"image-list": "server=ghcr.io/janhq/jan-server",
|
||||||
|
"platforms": "linux/amd64"
|
||||||
|
}
|
||||||
256
charts/server/values.yaml
Normal file
256
charts/server/values.yaml
Normal file
@ -0,0 +1,256 @@
|
|||||||
|
common:
|
||||||
|
imageTag: v0.4.6-cpu
|
||||||
|
# DO NOT CHANGE THE LINE ABOVE. MAKE ALL CHANGES BELOW
|
||||||
|
|
||||||
|
# Global pvc for all workload
|
||||||
|
pvc:
|
||||||
|
enabled: false
|
||||||
|
name: 'janroot'
|
||||||
|
accessModes: 'ReadWriteOnce'
|
||||||
|
storageClassName: ''
|
||||||
|
capacity: '50Gi'
|
||||||
|
|
||||||
|
# Global image pull secret
|
||||||
|
imagePullSecrets: []
|
||||||
|
|
||||||
|
externalSecret:
|
||||||
|
create: false
|
||||||
|
name: ''
|
||||||
|
annotations: {}
|
||||||
|
|
||||||
|
nameOverride: 'jan-server'
|
||||||
|
fullnameOverride: 'jan-server'
|
||||||
|
|
||||||
|
serviceAccount:
|
||||||
|
create: true
|
||||||
|
annotations: {}
|
||||||
|
name: 'jan-server-service-account'
|
||||||
|
|
||||||
|
podDisruptionBudget:
|
||||||
|
create: false
|
||||||
|
minAvailable: 1
|
||||||
|
|
||||||
|
workloads:
|
||||||
|
- name: server
|
||||||
|
image:
|
||||||
|
repository: ghcr.io/janhq/jan-server
|
||||||
|
pullPolicy: Always
|
||||||
|
|
||||||
|
command: ['/bin/sh', '-c']
|
||||||
|
args: ['cd server && node build/main.js']
|
||||||
|
|
||||||
|
replicaCount: 1
|
||||||
|
ports:
|
||||||
|
containerPort: 1337
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
canary:
|
||||||
|
steps:
|
||||||
|
- setWeight: 50
|
||||||
|
- pause: { duration: 1m }
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
className: 'nginx'
|
||||||
|
annotations:
|
||||||
|
nginx.ingress.kubernetes.io/proxy-body-size: '100m'
|
||||||
|
nginx.ingress.kubernetes.io/proxy-read-timeout: '1800'
|
||||||
|
nginx.ingress.kubernetes.io/proxy-send-timeout: '1800'
|
||||||
|
# cert-manager.io/cluster-issuer: 'jan-ai-dns01-cluster-issuer'
|
||||||
|
# nginx.ingress.kubernetes.io/force-ssl-redirect: 'true'
|
||||||
|
nginx.ingress.kubernetes.io/backend-protocol: HTTP
|
||||||
|
hosts:
|
||||||
|
- host: server.local
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
tls:
|
||||||
|
[]
|
||||||
|
# - hosts:
|
||||||
|
# - server-dev.jan.ai
|
||||||
|
# secretName: jan-server-prod-tls-v2
|
||||||
|
|
||||||
|
instrumentation:
|
||||||
|
enabled: false
|
||||||
|
podAnnotations: {}
|
||||||
|
|
||||||
|
podSecurityContext: {}
|
||||||
|
|
||||||
|
securityContext: {}
|
||||||
|
|
||||||
|
service:
|
||||||
|
extenalLabel: {}
|
||||||
|
type: ClusterIP
|
||||||
|
port: 1337
|
||||||
|
targetPort: 1337
|
||||||
|
|
||||||
|
# If you want to use GPU, please uncomment the following lines and change imageTag to the one with GPU support
|
||||||
|
resources:
|
||||||
|
# limits:
|
||||||
|
# nvidia.com/gpu: 1
|
||||||
|
requests:
|
||||||
|
cpu: 2000m
|
||||||
|
memory: 8192M
|
||||||
|
|
||||||
|
# If you want to use pv, please uncomment the following lines and enable pvc.enabled
|
||||||
|
volumes:
|
||||||
|
[]
|
||||||
|
# - name: janroot
|
||||||
|
# persistentVolumeClaim:
|
||||||
|
# claimName: janroot
|
||||||
|
|
||||||
|
volumeMounts:
|
||||||
|
[]
|
||||||
|
# - name: janroot
|
||||||
|
# mountPath: /app/server/build/jan
|
||||||
|
|
||||||
|
# AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, S3_BUCKET_NAME, AWS_ENDPOINT, AWS_REGION should mount as a secret env instead of plain text here
|
||||||
|
# Change API_BASE_URL to your server's public domain
|
||||||
|
env:
|
||||||
|
- name: API_BASE_URL
|
||||||
|
value: 'http://server.local'
|
||||||
|
|
||||||
|
lifecycle: {}
|
||||||
|
autoscaling:
|
||||||
|
enabled: false
|
||||||
|
minReplicas: 2
|
||||||
|
maxReplicas: 3
|
||||||
|
targetCPUUtilizationPercentage: 95
|
||||||
|
targetMemoryUtilizationPercentage: 95
|
||||||
|
|
||||||
|
kedaScaling:
|
||||||
|
enabled: false # ignore if autoscaling.enable = true
|
||||||
|
cooldownPeriod: 30
|
||||||
|
pollingInterval: 2
|
||||||
|
minReplicas: 1
|
||||||
|
maxReplicas: 5
|
||||||
|
metricName: celery_queue_length
|
||||||
|
query: celery_queue_length{queue_name="myqueue"} # change queue_name here
|
||||||
|
serverAddress: http://prometheus-prod-kube-prome-prometheus.monitoring.svc:9090
|
||||||
|
threshold: '3'
|
||||||
|
|
||||||
|
nodeSelector: {}
|
||||||
|
|
||||||
|
tolerations: []
|
||||||
|
|
||||||
|
podSecurityGroup:
|
||||||
|
enabled: false
|
||||||
|
securitygroupid: []
|
||||||
|
|
||||||
|
# Reloader Option
|
||||||
|
reloader: 'false'
|
||||||
|
vpa:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
- name: web
|
||||||
|
image:
|
||||||
|
repository: ghcr.io/janhq/jan-server
|
||||||
|
pullPolicy: Always
|
||||||
|
|
||||||
|
command: ['/bin/sh', '-c']
|
||||||
|
args:
|
||||||
|
[
|
||||||
|
'export NODE_ENV=production && yarn workspace jan-web build && cd web && npx serve out',
|
||||||
|
]
|
||||||
|
|
||||||
|
replicaCount: 1
|
||||||
|
ports:
|
||||||
|
containerPort: 3000
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
canary:
|
||||||
|
steps:
|
||||||
|
- setWeight: 50
|
||||||
|
- pause: { duration: 1m }
|
||||||
|
|
||||||
|
ingress:
|
||||||
|
enabled: true
|
||||||
|
className: 'nginx'
|
||||||
|
annotations:
|
||||||
|
nginx.ingress.kubernetes.io/proxy-body-size: '100m'
|
||||||
|
nginx.ingress.kubernetes.io/proxy-read-timeout: '1800'
|
||||||
|
nginx.ingress.kubernetes.io/proxy-send-timeout: '1800'
|
||||||
|
# cert-manager.io/cluster-issuer: 'jan-ai-dns01-cluster-issuer'
|
||||||
|
# nginx.ingress.kubernetes.io/force-ssl-redirect: 'true'
|
||||||
|
nginx.ingress.kubernetes.io/backend-protocol: HTTP
|
||||||
|
hosts:
|
||||||
|
- host: web.local
|
||||||
|
paths:
|
||||||
|
- path: /
|
||||||
|
pathType: Prefix
|
||||||
|
tls:
|
||||||
|
[]
|
||||||
|
# - hosts:
|
||||||
|
# - server-dev.jan.ai
|
||||||
|
# secretName: jan-server-prod-tls-v2
|
||||||
|
|
||||||
|
instrumentation:
|
||||||
|
enabled: false
|
||||||
|
podAnnotations: {}
|
||||||
|
|
||||||
|
podSecurityContext: {}
|
||||||
|
|
||||||
|
securityContext: {}
|
||||||
|
|
||||||
|
service:
|
||||||
|
extenalLabel: {}
|
||||||
|
type: ClusterIP
|
||||||
|
port: 3000
|
||||||
|
targetPort: 3000
|
||||||
|
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpu: 1000m
|
||||||
|
memory: 2048M
|
||||||
|
requests:
|
||||||
|
cpu: 50m
|
||||||
|
memory: 500M
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
[]
|
||||||
|
# - name: janroot
|
||||||
|
# persistentVolumeClaim:
|
||||||
|
# claimName: janroot
|
||||||
|
|
||||||
|
volumeMounts:
|
||||||
|
[]
|
||||||
|
# - name: janroot
|
||||||
|
# mountPath: /app/server/build/jan
|
||||||
|
|
||||||
|
# AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, S3_BUCKET_NAME, AWS_ENDPOINT, AWS_REGION should mount as a secret env instead of plain text here
|
||||||
|
# Change API_BASE_URL to your server's public domain
|
||||||
|
env:
|
||||||
|
- name: API_BASE_URL
|
||||||
|
value: 'http://server.local'
|
||||||
|
|
||||||
|
lifecycle: {}
|
||||||
|
autoscaling:
|
||||||
|
enabled: true
|
||||||
|
minReplicas: 1
|
||||||
|
maxReplicas: 3
|
||||||
|
targetCPUUtilizationPercentage: 95
|
||||||
|
targetMemoryUtilizationPercentage: 95
|
||||||
|
|
||||||
|
kedaScaling:
|
||||||
|
enabled: false # ignore if autoscaling.enable = true
|
||||||
|
cooldownPeriod: 30
|
||||||
|
pollingInterval: 2
|
||||||
|
minReplicas: 1
|
||||||
|
maxReplicas: 5
|
||||||
|
metricName: celery_queue_length
|
||||||
|
query: celery_queue_length{queue_name="myqueue"} # change queue_name here
|
||||||
|
serverAddress: http://prometheus-prod-kube-prome-prometheus.monitoring.svc:9090
|
||||||
|
threshold: '3'
|
||||||
|
|
||||||
|
nodeSelector: {}
|
||||||
|
|
||||||
|
tolerations: []
|
||||||
|
|
||||||
|
podSecurityGroup:
|
||||||
|
enabled: false
|
||||||
|
securitygroupid: []
|
||||||
|
|
||||||
|
# Reloader Option
|
||||||
|
reloader: 'false'
|
||||||
|
vpa:
|
||||||
|
enabled: false
|
||||||
Loading…
x
Reference in New Issue
Block a user