From 43553e2c7d56fb5c9f7a806ae15a5b5081c531f1 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Fri, 14 Nov 2025 11:25:11 +0800 Subject: [PATCH] feat: Add Kubernetes deployment configuration for cluster deployments (#1779) * Initial plan * feat: Add Kubernetes deployment configuration and guide Co-authored-by: RockChinQ <45992437+RockChinQ@users.noreply.github.com> * feat: Add test script and update docker-compose with k8s reference Co-authored-by: RockChinQ <45992437+RockChinQ@users.noreply.github.com> * doc: add k8s deployment doc in README --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: RockChinQ <45992437+RockChinQ@users.noreply.github.com> Co-authored-by: Junyan Qin --- README.md | 4 + README_EN.md | 4 + README_JP.md | 4 + README_TW.md | 4 + docker/README_K8S.md | 629 +++++++++++++++++++++++++++++++++++++ docker/deploy-k8s-test.sh | 74 +++++ docker/docker-compose.yaml | 2 + docker/kubernetes.yaml | 400 +++++++++++++++++++++++ 8 files changed, 1121 insertions(+) create mode 100644 docker/README_K8S.md create mode 100755 docker/deploy-k8s-test.sh create mode 100644 docker/kubernetes.yaml diff --git a/README.md b/README.md index f11f521f..754f6258 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,10 @@ docker compose up -d 直接使用发行版运行,查看文档[手动部署](https://docs.langbot.app/zh/deploy/langbot/manual.html)。 +#### Kubernetes 部署 + +参考 [Kubernetes 部署](./docker/README_K8S.md) 文档。 + ## 😎 保持更新 点击仓库右上角 Star 和 Watch 按钮,获取最新动态。 diff --git a/README_EN.md b/README_EN.md index 64c63876..e020beba 100644 --- a/README_EN.md +++ b/README_EN.md @@ -55,6 +55,10 @@ Community contributed Zeabur template. Directly use the released version to run, see the [Manual Deployment](https://docs.langbot.app/en/deploy/langbot/manual.html) documentation. +#### Kubernetes Deployment + +Refer to the [Kubernetes Deployment](./docker/README_K8S.md) documentation. + ## 😎 Stay Ahead Click the Star and Watch button in the upper right corner of the repository to get the latest updates. diff --git a/README_JP.md b/README_JP.md index 0afb811a..4679e37d 100644 --- a/README_JP.md +++ b/README_JP.md @@ -55,6 +55,10 @@ LangBotはBTPanelにリストされています。BTPanelをインストール リリースバージョンを直接使用して実行します。[手動デプロイ](https://docs.langbot.app/en/deploy/langbot/manual.html)のドキュメントを参照してください。 +#### Kubernetes デプロイ + +[Kubernetes デプロイ](./docker/README_K8S.md) ドキュメントを参照してください。 + ## 😎 最新情報を入手 リポジトリの右上にある Star と Watch ボタンをクリックして、最新の更新を取得してください。 diff --git a/README_TW.md b/README_TW.md index 075b218e..3250568a 100644 --- a/README_TW.md +++ b/README_TW.md @@ -57,6 +57,10 @@ docker compose up -d 直接使用發行版運行,查看文件[手動部署](https://docs.langbot.app/zh/deploy/langbot/manual.html)。 +#### Kubernetes 部署 + +參考 [Kubernetes 部署](./docker/README_K8S.md) 文件。 + ## 😎 保持更新 點擊倉庫右上角 Star 和 Watch 按鈕,獲取最新動態。 diff --git a/docker/README_K8S.md b/docker/README_K8S.md new file mode 100644 index 00000000..6a4889f0 --- /dev/null +++ b/docker/README_K8S.md @@ -0,0 +1,629 @@ +# LangBot Kubernetes 部署指南 / Kubernetes Deployment Guide + +[简体中文](#简体中文) | [English](#english) + +--- + +## 简体中文 + +### 概述 + +本指南提供了在 Kubernetes 集群中部署 LangBot 的完整步骤。Kubernetes 部署配置基于 `docker-compose.yaml`,适用于生产环境的容器化部署。 + +### 前置要求 + +- Kubernetes 集群(版本 1.19+) +- `kubectl` 命令行工具已配置并可访问集群 +- 集群中有可用的存储类(StorageClass)用于持久化存储(可选但推荐) +- 至少 2 vCPU 和 4GB RAM 的可用资源 + +### 架构说明 + +Kubernetes 部署包含以下组件: + +1. **langbot**: 主应用服务 + - 提供 Web UI(端口 5300) + - 处理平台 webhook(端口 2280-2290) + - 数据持久化卷 + +2. **langbot-plugin-runtime**: 插件运行时服务 + - WebSocket 通信(端口 5400) + - 插件数据持久化卷 + +3. **持久化存储**: + - `langbot-data`: LangBot 主数据 + - `langbot-plugins`: 插件文件 + - `langbot-plugin-runtime-data`: 插件运行时数据 + +### 快速开始 + +#### 1. 下载部署文件 + +```bash +# 克隆仓库 +git clone https://github.com/langbot-app/LangBot +cd LangBot/docker + +# 或直接下载 kubernetes.yaml +wget https://raw.githubusercontent.com/langbot-app/LangBot/main/docker/kubernetes.yaml +``` + +#### 2. 部署到 Kubernetes + +```bash +# 应用所有配置 +kubectl apply -f kubernetes.yaml + +# 检查部署状态 +kubectl get all -n langbot + +# 查看 Pod 日志 +kubectl logs -n langbot -l app=langbot -f +``` + +#### 3. 访问 LangBot + +默认情况下,LangBot 服务使用 ClusterIP 类型,只能在集群内部访问。您可以选择以下方式之一来访问: + +**选项 A: 端口转发(推荐用于测试)** + +```bash +kubectl port-forward -n langbot svc/langbot 5300:5300 +``` + +然后访问 http://localhost:5300 + +**选项 B: NodePort(适用于开发环境)** + +编辑 `kubernetes.yaml`,取消注释 NodePort Service 部分,然后: + +```bash +kubectl apply -f kubernetes.yaml +# 获取节点 IP +kubectl get nodes -o wide +# 访问 http://:30300 +``` + +**选项 C: LoadBalancer(适用于云环境)** + +编辑 `kubernetes.yaml`,取消注释 LoadBalancer Service 部分,然后: + +```bash +kubectl apply -f kubernetes.yaml +# 获取外部 IP +kubectl get svc -n langbot langbot-loadbalancer +# 访问 http:// +``` + +**选项 D: Ingress(推荐用于生产环境)** + +确保集群中已安装 Ingress Controller(如 nginx-ingress),然后: + +1. 编辑 `kubernetes.yaml` 中的 Ingress 配置 +2. 修改域名为您的实际域名 +3. 应用配置: + +```bash +kubectl apply -f kubernetes.yaml +# 访问 http://langbot.yourdomain.com +``` + +### 配置说明 + +#### 环境变量 + +在 `ConfigMap` 中配置环境变量: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: langbot-config + namespace: langbot +data: + TZ: "Asia/Shanghai" # 修改为您的时区 +``` + +#### 存储配置 + +默认使用动态存储分配。如果您有特定的 StorageClass,请在 PVC 中指定: + +```yaml +spec: + storageClassName: your-storage-class-name + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi +``` + +#### 资源限制 + +根据您的需求调整资源限制: + +```yaml +resources: + requests: + memory: "1Gi" + cpu: "500m" + limits: + memory: "4Gi" + cpu: "2000m" +``` + +### 常用操作 + +#### 查看日志 + +```bash +# 查看 LangBot 主服务日志 +kubectl logs -n langbot -l app=langbot -f + +# 查看插件运行时日志 +kubectl logs -n langbot -l app=langbot-plugin-runtime -f +``` + +#### 重启服务 + +```bash +# 重启 LangBot +kubectl rollout restart deployment/langbot -n langbot + +# 重启插件运行时 +kubectl rollout restart deployment/langbot-plugin-runtime -n langbot +``` + +#### 更新镜像 + +```bash +# 更新到最新版本 +kubectl set image deployment/langbot -n langbot langbot=rockchin/langbot:latest +kubectl set image deployment/langbot-plugin-runtime -n langbot langbot-plugin-runtime=rockchin/langbot:latest + +# 检查更新状态 +kubectl rollout status deployment/langbot -n langbot +``` + +#### 扩容(不推荐) + +注意:由于 LangBot 使用 ReadWriteOnce 的持久化存储,不支持多副本扩容。如需高可用,请考虑使用 ReadWriteMany 存储或其他架构方案。 + +#### 备份数据 + +```bash +# 备份 PVC 数据 +kubectl exec -n langbot -it -- tar czf /tmp/backup.tar.gz /app/data +kubectl cp langbot/:/tmp/backup.tar.gz ./backup.tar.gz +``` + +### 卸载 + +```bash +# 删除所有资源(保留 PVC) +kubectl delete deployment,service,configmap -n langbot --all + +# 删除 PVC(会删除数据) +kubectl delete pvc -n langbot --all + +# 删除命名空间 +kubectl delete namespace langbot +``` + +### 故障排查 + +#### Pod 无法启动 + +```bash +# 查看 Pod 状态 +kubectl get pods -n langbot + +# 查看详细信息 +kubectl describe pod -n langbot + +# 查看事件 +kubectl get events -n langbot --sort-by='.lastTimestamp' +``` + +#### 存储问题 + +```bash +# 检查 PVC 状态 +kubectl get pvc -n langbot + +# 检查 PV +kubectl get pv +``` + +#### 网络访问问题 + +```bash +# 检查 Service +kubectl get svc -n langbot + +# 检查端口转发 +kubectl port-forward -n langbot svc/langbot 5300:5300 +``` + +### 生产环境建议 + +1. **使用特定版本标签**:避免使用 `latest` 标签,使用具体版本号如 `rockchin/langbot:v1.0.0` +2. **配置资源限制**:根据实际负载调整 CPU 和内存限制 +3. **使用 Ingress + TLS**:配置 HTTPS 访问和证书管理 +4. **配置监控和告警**:集成 Prometheus、Grafana 等监控工具 +5. **定期备份**:配置自动备份策略保护数据 +6. **使用专用 StorageClass**:为生产环境配置高性能存储 +7. **配置亲和性规则**:确保 Pod 调度到合适的节点 + +### 高级配置 + +#### 使用 Secrets 管理敏感信息 + +如果需要配置 API 密钥等敏感信息: + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: langbot-secrets + namespace: langbot +type: Opaque +data: + api_key: +``` + +然后在 Deployment 中引用: + +```yaml +env: +- name: API_KEY + valueFrom: + secretKeyRef: + name: langbot-secrets + key: api_key +``` + +#### 配置水平自动扩缩容(HPA) + +注意:需要确保使用 ReadWriteMany 存储类型 + +```yaml +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: langbot-hpa + namespace: langbot +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: langbot + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 70 +``` + +### 参考资源 + +- [LangBot 官方文档](https://docs.langbot.app) +- [Docker 部署文档](https://docs.langbot.app/zh/deploy/langbot/docker.html) +- [Kubernetes 官方文档](https://kubernetes.io/docs/) + +--- + +## English + +### Overview + +This guide provides complete steps for deploying LangBot in a Kubernetes cluster. The Kubernetes deployment configuration is based on `docker-compose.yaml` and is suitable for production containerized deployments. + +### Prerequisites + +- Kubernetes cluster (version 1.19+) +- `kubectl` command-line tool configured with cluster access +- Available StorageClass in the cluster for persistent storage (optional but recommended) +- At least 2 vCPU and 4GB RAM of available resources + +### Architecture + +The Kubernetes deployment includes the following components: + +1. **langbot**: Main application service + - Provides Web UI (port 5300) + - Handles platform webhooks (ports 2280-2290) + - Data persistence volume + +2. **langbot-plugin-runtime**: Plugin runtime service + - WebSocket communication (port 5400) + - Plugin data persistence volume + +3. **Persistent Storage**: + - `langbot-data`: LangBot main data + - `langbot-plugins`: Plugin files + - `langbot-plugin-runtime-data`: Plugin runtime data + +### Quick Start + +#### 1. Download Deployment Files + +```bash +# Clone repository +git clone https://github.com/langbot-app/LangBot +cd LangBot/docker + +# Or download kubernetes.yaml directly +wget https://raw.githubusercontent.com/langbot-app/LangBot/main/docker/kubernetes.yaml +``` + +#### 2. Deploy to Kubernetes + +```bash +# Apply all configurations +kubectl apply -f kubernetes.yaml + +# Check deployment status +kubectl get all -n langbot + +# View Pod logs +kubectl logs -n langbot -l app=langbot -f +``` + +#### 3. Access LangBot + +By default, LangBot service uses ClusterIP type, accessible only within the cluster. Choose one of the following methods to access: + +**Option A: Port Forwarding (Recommended for testing)** + +```bash +kubectl port-forward -n langbot svc/langbot 5300:5300 +``` + +Then visit http://localhost:5300 + +**Option B: NodePort (Suitable for development)** + +Edit `kubernetes.yaml`, uncomment the NodePort Service section, then: + +```bash +kubectl apply -f kubernetes.yaml +# Get node IP +kubectl get nodes -o wide +# Visit http://:30300 +``` + +**Option C: LoadBalancer (Suitable for cloud environments)** + +Edit `kubernetes.yaml`, uncomment the LoadBalancer Service section, then: + +```bash +kubectl apply -f kubernetes.yaml +# Get external IP +kubectl get svc -n langbot langbot-loadbalancer +# Visit http:// +``` + +**Option D: Ingress (Recommended for production)** + +Ensure an Ingress Controller (e.g., nginx-ingress) is installed in the cluster, then: + +1. Edit the Ingress configuration in `kubernetes.yaml` +2. Change the domain to your actual domain +3. Apply configuration: + +```bash +kubectl apply -f kubernetes.yaml +# Visit http://langbot.yourdomain.com +``` + +### Configuration + +#### Environment Variables + +Configure environment variables in ConfigMap: + +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: langbot-config + namespace: langbot +data: + TZ: "Asia/Shanghai" # Change to your timezone +``` + +#### Storage Configuration + +Uses dynamic storage provisioning by default. If you have a specific StorageClass, specify it in PVC: + +```yaml +spec: + storageClassName: your-storage-class-name + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi +``` + +#### Resource Limits + +Adjust resource limits based on your needs: + +```yaml +resources: + requests: + memory: "1Gi" + cpu: "500m" + limits: + memory: "4Gi" + cpu: "2000m" +``` + +### Common Operations + +#### View Logs + +```bash +# View LangBot main service logs +kubectl logs -n langbot -l app=langbot -f + +# View plugin runtime logs +kubectl logs -n langbot -l app=langbot-plugin-runtime -f +``` + +#### Restart Services + +```bash +# Restart LangBot +kubectl rollout restart deployment/langbot -n langbot + +# Restart plugin runtime +kubectl rollout restart deployment/langbot-plugin-runtime -n langbot +``` + +#### Update Images + +```bash +# Update to latest version +kubectl set image deployment/langbot -n langbot langbot=rockchin/langbot:latest +kubectl set image deployment/langbot-plugin-runtime -n langbot langbot-plugin-runtime=rockchin/langbot:latest + +# Check update status +kubectl rollout status deployment/langbot -n langbot +``` + +#### Scaling (Not Recommended) + +Note: Due to LangBot using ReadWriteOnce persistent storage, multi-replica scaling is not supported. For high availability, consider using ReadWriteMany storage or alternative architectures. + +#### Backup Data + +```bash +# Backup PVC data +kubectl exec -n langbot -it -- tar czf /tmp/backup.tar.gz /app/data +kubectl cp langbot/:/tmp/backup.tar.gz ./backup.tar.gz +``` + +### Uninstall + +```bash +# Delete all resources (keep PVCs) +kubectl delete deployment,service,configmap -n langbot --all + +# Delete PVCs (will delete data) +kubectl delete pvc -n langbot --all + +# Delete namespace +kubectl delete namespace langbot +``` + +### Troubleshooting + +#### Pods Not Starting + +```bash +# Check Pod status +kubectl get pods -n langbot + +# View detailed information +kubectl describe pod -n langbot + +# View events +kubectl get events -n langbot --sort-by='.lastTimestamp' +``` + +#### Storage Issues + +```bash +# Check PVC status +kubectl get pvc -n langbot + +# Check PV +kubectl get pv +``` + +#### Network Access Issues + +```bash +# Check Service +kubectl get svc -n langbot + +# Test port forwarding +kubectl port-forward -n langbot svc/langbot 5300:5300 +``` + +### Production Recommendations + +1. **Use specific version tags**: Avoid using `latest` tag, use specific version like `rockchin/langbot:v1.0.0` +2. **Configure resource limits**: Adjust CPU and memory limits based on actual load +3. **Use Ingress + TLS**: Configure HTTPS access and certificate management +4. **Configure monitoring and alerts**: Integrate monitoring tools like Prometheus, Grafana +5. **Regular backups**: Configure automated backup strategy to protect data +6. **Use dedicated StorageClass**: Configure high-performance storage for production +7. **Configure affinity rules**: Ensure Pods are scheduled to appropriate nodes + +### Advanced Configuration + +#### Using Secrets for Sensitive Information + +If you need to configure sensitive information like API keys: + +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: langbot-secrets + namespace: langbot +type: Opaque +data: + api_key: +``` + +Then reference in Deployment: + +```yaml +env: +- name: API_KEY + valueFrom: + secretKeyRef: + name: langbot-secrets + key: api_key +``` + +#### Configure Horizontal Pod Autoscaling (HPA) + +Note: Requires ReadWriteMany storage type + +```yaml +apiVersion: autoscaling/v2 +kind: HorizontalPodAutoscaler +metadata: + name: langbot-hpa + namespace: langbot +spec: + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: langbot + minReplicas: 1 + maxReplicas: 3 + metrics: + - type: Resource + resource: + name: cpu + target: + type: Utilization + averageUtilization: 70 +``` + +### References + +- [LangBot Official Documentation](https://docs.langbot.app) +- [Docker Deployment Guide](https://docs.langbot.app/zh/deploy/langbot/docker.html) +- [Kubernetes Official Documentation](https://kubernetes.io/docs/) diff --git a/docker/deploy-k8s-test.sh b/docker/deploy-k8s-test.sh new file mode 100755 index 00000000..ff8e56e7 --- /dev/null +++ b/docker/deploy-k8s-test.sh @@ -0,0 +1,74 @@ +#!/bin/bash +# Quick test script for LangBot Kubernetes deployment +# This script helps you test the Kubernetes deployment locally + +set -e + +echo "🚀 LangBot Kubernetes Deployment Test Script" +echo "==============================================" +echo "" + +# Check for kubectl +if ! command -v kubectl &> /dev/null; then + echo "❌ kubectl is not installed. Please install kubectl first." + echo "Visit: https://kubernetes.io/docs/tasks/tools/" + exit 1 +fi + +echo "✓ kubectl is installed" + +# Check if kubectl can connect to a cluster +if ! kubectl cluster-info &> /dev/null; then + echo "" + echo "⚠️ No Kubernetes cluster found." + echo "" + echo "To test locally, you can use:" + echo " - kind: https://kind.sigs.k8s.io/" + echo " - minikube: https://minikube.sigs.k8s.io/" + echo " - k3s: https://k3s.io/" + echo "" + echo "Example with kind:" + echo " kind create cluster --name langbot-test" + echo "" + exit 1 +fi + +echo "✓ Connected to Kubernetes cluster" +kubectl cluster-info +echo "" + +# Ask user to confirm +read -p "Do you want to deploy LangBot to this cluster? (y/N) " -n 1 -r +echo +if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "Deployment cancelled." + exit 0 +fi + +echo "" +echo "📦 Deploying LangBot..." +kubectl apply -f kubernetes.yaml + +echo "" +echo "⏳ Waiting for pods to be ready..." +kubectl wait --for=condition=ready pod -l app=langbot -n langbot --timeout=300s +kubectl wait --for=condition=ready pod -l app=langbot-plugin-runtime -n langbot --timeout=300s + +echo "" +echo "✅ Deployment complete!" +echo "" +echo "📊 Deployment status:" +kubectl get all -n langbot + +echo "" +echo "🌐 To access LangBot Web UI, run:" +echo " kubectl port-forward -n langbot svc/langbot 5300:5300" +echo "" +echo "Then visit: http://localhost:5300" +echo "" +echo "📝 To view logs:" +echo " kubectl logs -n langbot -l app=langbot -f" +echo "" +echo "🗑️ To uninstall:" +echo " kubectl delete namespace langbot" +echo "" diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml index 107a9e26..f9bb6ffa 100644 --- a/docker/docker-compose.yaml +++ b/docker/docker-compose.yaml @@ -1,3 +1,5 @@ +# Docker Compose configuration for LangBot +# For Kubernetes deployment, see kubernetes.yaml and README_K8S.md version: "3" services: diff --git a/docker/kubernetes.yaml b/docker/kubernetes.yaml new file mode 100644 index 00000000..424c18eb --- /dev/null +++ b/docker/kubernetes.yaml @@ -0,0 +1,400 @@ +# Kubernetes Deployment for LangBot +# This file provides Kubernetes deployment manifests for LangBot based on docker-compose.yaml +# +# Usage: +# kubectl apply -f kubernetes.yaml +# +# Prerequisites: +# - A Kubernetes cluster (1.19+) +# - kubectl configured to communicate with your cluster +# - (Optional) A StorageClass for dynamic volume provisioning +# +# Components: +# - Namespace: langbot +# - PersistentVolumeClaims for data persistence +# - Deployments for langbot and langbot_plugin_runtime +# - Services for network access +# - ConfigMap for timezone configuration + +--- +# Namespace +apiVersion: v1 +kind: Namespace +metadata: + name: langbot + labels: + app: langbot + +--- +# PersistentVolumeClaim for LangBot data +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: langbot-data + namespace: langbot +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 10Gi + # Uncomment and modify if you have a specific StorageClass + # storageClassName: your-storage-class + +--- +# PersistentVolumeClaim for LangBot plugins +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: langbot-plugins + namespace: langbot +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 5Gi + # Uncomment and modify if you have a specific StorageClass + # storageClassName: your-storage-class + +--- +# PersistentVolumeClaim for Plugin Runtime data +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: langbot-plugin-runtime-data + namespace: langbot +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 5Gi + # Uncomment and modify if you have a specific StorageClass + # storageClassName: your-storage-class + +--- +# ConfigMap for environment configuration +apiVersion: v1 +kind: ConfigMap +metadata: + name: langbot-config + namespace: langbot +data: + TZ: "Asia/Shanghai" + PLUGIN__RUNTIME_WS_URL: "ws://langbot-plugin-runtime:5400/control/ws" + +--- +# Deployment for LangBot Plugin Runtime +apiVersion: apps/v1 +kind: Deployment +metadata: + name: langbot-plugin-runtime + namespace: langbot + labels: + app: langbot-plugin-runtime +spec: + replicas: 1 + selector: + matchLabels: + app: langbot-plugin-runtime + template: + metadata: + labels: + app: langbot-plugin-runtime + spec: + containers: + - name: langbot-plugin-runtime + image: rockchin/langbot:latest + imagePullPolicy: Always + command: ["uv", "run", "-m", "langbot_plugin.cli.__init__", "rt"] + ports: + - containerPort: 5400 + name: runtime + protocol: TCP + env: + - name: TZ + valueFrom: + configMapKeyRef: + name: langbot-config + key: TZ + volumeMounts: + - name: plugin-data + mountPath: /app/data/plugins + resources: + requests: + memory: "512Mi" + cpu: "250m" + limits: + memory: "2Gi" + cpu: "1000m" + # Liveness probe to restart container if it becomes unresponsive + livenessProbe: + tcpSocket: + port: 5400 + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + # Readiness probe to know when container is ready to accept traffic + readinessProbe: + tcpSocket: + port: 5400 + initialDelaySeconds: 10 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 3 + volumes: + - name: plugin-data + persistentVolumeClaim: + claimName: langbot-plugin-runtime-data + restartPolicy: Always + +--- +# Service for LangBot Plugin Runtime +apiVersion: v1 +kind: Service +metadata: + name: langbot-plugin-runtime + namespace: langbot + labels: + app: langbot-plugin-runtime +spec: + type: ClusterIP + selector: + app: langbot-plugin-runtime + ports: + - port: 5400 + targetPort: 5400 + protocol: TCP + name: runtime + +--- +# Deployment for LangBot +apiVersion: apps/v1 +kind: Deployment +metadata: + name: langbot + namespace: langbot + labels: + app: langbot +spec: + replicas: 1 + selector: + matchLabels: + app: langbot + template: + metadata: + labels: + app: langbot + spec: + containers: + - name: langbot + image: rockchin/langbot:latest + imagePullPolicy: Always + ports: + - containerPort: 5300 + name: web + protocol: TCP + - containerPort: 2280 + name: webhook-start + protocol: TCP + # Note: Kubernetes doesn't support port ranges directly in container ports + # The webhook ports 2280-2290 are available, but we only expose the start of the range + # If you need all ports exposed, consider using a Service with multiple port definitions + env: + - name: TZ + valueFrom: + configMapKeyRef: + name: langbot-config + key: TZ + - name: PLUGIN__RUNTIME_WS_URL + valueFrom: + configMapKeyRef: + name: langbot-config + key: PLUGIN__RUNTIME_WS_URL + volumeMounts: + - name: data + mountPath: /app/data + - name: plugins + mountPath: /app/plugins + resources: + requests: + memory: "1Gi" + cpu: "500m" + limits: + memory: "4Gi" + cpu: "2000m" + # Liveness probe to restart container if it becomes unresponsive + livenessProbe: + httpGet: + path: / + port: 5300 + initialDelaySeconds: 60 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 3 + # Readiness probe to know when container is ready to accept traffic + readinessProbe: + httpGet: + path: / + port: 5300 + initialDelaySeconds: 30 + periodSeconds: 5 + timeoutSeconds: 3 + failureThreshold: 3 + volumes: + - name: data + persistentVolumeClaim: + claimName: langbot-data + - name: plugins + persistentVolumeClaim: + claimName: langbot-plugins + restartPolicy: Always + +--- +# Service for LangBot (ClusterIP for internal access) +apiVersion: v1 +kind: Service +metadata: + name: langbot + namespace: langbot + labels: + app: langbot +spec: + type: ClusterIP + selector: + app: langbot + ports: + - port: 5300 + targetPort: 5300 + protocol: TCP + name: web + - port: 2280 + targetPort: 2280 + protocol: TCP + name: webhook-2280 + - port: 2281 + targetPort: 2281 + protocol: TCP + name: webhook-2281 + - port: 2282 + targetPort: 2282 + protocol: TCP + name: webhook-2282 + - port: 2283 + targetPort: 2283 + protocol: TCP + name: webhook-2283 + - port: 2284 + targetPort: 2284 + protocol: TCP + name: webhook-2284 + - port: 2285 + targetPort: 2285 + protocol: TCP + name: webhook-2285 + - port: 2286 + targetPort: 2286 + protocol: TCP + name: webhook-2286 + - port: 2287 + targetPort: 2287 + protocol: TCP + name: webhook-2287 + - port: 2288 + targetPort: 2288 + protocol: TCP + name: webhook-2288 + - port: 2289 + targetPort: 2289 + protocol: TCP + name: webhook-2289 + - port: 2290 + targetPort: 2290 + protocol: TCP + name: webhook-2290 + +--- +# Ingress for external access (Optional - requires Ingress Controller) +# Uncomment and modify the following section if you want to expose LangBot via Ingress +# apiVersion: networking.k8s.io/v1 +# kind: Ingress +# metadata: +# name: langbot-ingress +# namespace: langbot +# annotations: +# # Uncomment and modify based on your ingress controller +# # nginx.ingress.kubernetes.io/rewrite-target: / +# # cert-manager.io/cluster-issuer: letsencrypt-prod +# spec: +# ingressClassName: nginx # Change based on your ingress controller +# rules: +# - host: langbot.yourdomain.com # Change to your domain +# http: +# paths: +# - path: / +# pathType: Prefix +# backend: +# service: +# name: langbot +# port: +# number: 5300 +# # Uncomment for TLS/HTTPS +# # tls: +# # - hosts: +# # - langbot.yourdomain.com +# # secretName: langbot-tls + +--- +# Service for LangBot with LoadBalancer (Alternative to Ingress) +# Uncomment the following if you want to expose LangBot directly via LoadBalancer +# This is useful in cloud environments (AWS, GCP, Azure, etc.) +# apiVersion: v1 +# kind: Service +# metadata: +# name: langbot-loadbalancer +# namespace: langbot +# labels: +# app: langbot +# spec: +# type: LoadBalancer +# selector: +# app: langbot +# ports: +# - port: 80 +# targetPort: 5300 +# protocol: TCP +# name: web +# - port: 2280 +# targetPort: 2280 +# protocol: TCP +# name: webhook-start +# # Add more webhook ports as needed + +--- +# Service for LangBot with NodePort (Alternative for exposing service) +# Uncomment if you want to expose LangBot via NodePort +# This is useful for testing or when LoadBalancer is not available +# apiVersion: v1 +# kind: Service +# metadata: +# name: langbot-nodeport +# namespace: langbot +# labels: +# app: langbot +# spec: +# type: NodePort +# selector: +# app: langbot +# ports: +# - port: 5300 +# targetPort: 5300 +# nodePort: 30300 # Must be in range 30000-32767 +# protocol: TCP +# name: web +# - port: 2280 +# targetPort: 2280 +# nodePort: 30280 # Must be in range 30000-32767 +# protocol: TCP +# name: webhook