715 lines
16 KiB
Markdown
715 lines
16 KiB
Markdown
# Clawith Helm Deployment Quick Start Guide
|
|
|
|
## 📋 Directory Structure
|
|
|
|
```
|
|
helm/
|
|
├── clawith/ # Helm Chart Main Directory
|
|
│ ├── Chart.yaml # Chart Metadata
|
|
│ ├── values.yaml # Configuration File
|
|
│ ├── README.md # Detailed Documentation
|
|
│ └── templates/ # Kubernetes Resource Templates
|
|
│ ├── _helpers.tpl # Template Helper Functions
|
|
│ ├── namespace.yaml # Namespace
|
|
│ ├── secrets.yaml # Secrets
|
|
│ ├── backend.yaml # Backend Service
|
|
│ ├── frontend.yaml # Frontend Service
|
|
│ ├── ingress.yaml # Ingress Configuration
|
|
│ ├── postgresql.yaml # PostgreSQL Database
|
|
│ ├── redis.yaml # Redis Cache
|
|
│ └── storageclass.yaml # Storage Class (Optional)
|
|
└── QUICKSTART.md # This Document
|
|
```
|
|
|
|
## ⚠️ Important Notice
|
|
|
|
**K8s Deployment Limitations:**
|
|
- ✅ Current Helm Chart **only supports Native Agent deployment mode**
|
|
- ❌ **Does NOT support OpenClaw Agent hosting mode**
|
|
- If you need to use OpenClaw Agent hosting, please use Docker Compose or other deployment methods
|
|
|
|
Native Agent is the built-in proxy mode of Clawith, suitable for Kubernetes environments. OpenClaw Agent hosting mode is currently only supported in Docker Compose environments.
|
|
|
|
## 🚀 Quick Start
|
|
|
|
### 1. Edit Configuration File
|
|
|
|
Edit `helm/clawith/values.yaml` and modify it according to your environment:
|
|
|
|
```bash
|
|
vi helm/clawith/values.yaml
|
|
```
|
|
|
|
**Required Configuration Items:**
|
|
|
|
```yaml
|
|
# 1. Configure Image Registry
|
|
global:
|
|
imageRegistry: docker.io/yourusername # Change to your image registry
|
|
|
|
# 2. Configure Image Tags
|
|
backend:
|
|
image:
|
|
tag: latest # Recommended to use specific version, e.g., v1.0.0
|
|
|
|
frontend:
|
|
image:
|
|
tag: latest # Recommended to use specific version, e.g., v1.0.0
|
|
|
|
# 3. Configure Storage
|
|
backend:
|
|
persistence:
|
|
existingClaim: "" # If using existing PVC, enter PVC name
|
|
storageClass: "" # If creating new, change to your StorageClass name
|
|
size: 10Gi
|
|
|
|
postgresql:
|
|
image:
|
|
registry: docker.io/bitnami # Change to your image registry
|
|
auth:
|
|
password: "clawith123456" # Strongly recommended to change to a strong password!
|
|
primary:
|
|
persistence:
|
|
existingClaim: "" # If using existing PVC, enter PVC name
|
|
storageClass: "" # If creating new, change to your StorageClass name
|
|
size: 8Gi
|
|
|
|
redis:
|
|
image:
|
|
registry: docker.io # Change to your image registry
|
|
persistence:
|
|
existingClaim: "" # If using existing PVC, enter PVC name
|
|
storageClass: "" # If creating new, change to your StorageClass name
|
|
size: 2Gi
|
|
|
|
# 4. Configure Domain
|
|
frontend:
|
|
ingress:
|
|
host: "clawith.example.com" # Change to your domain
|
|
|
|
# 5. Modify Application Secrets (Important!)
|
|
backend:
|
|
secrets:
|
|
secretKey: "your-secret-key-at-least-50-characters-long"
|
|
jwtSecretKey: "your-jwt-secret-key-at-least-32-characters"
|
|
|
|
# 6. Enable hostCerts if private certificate signing support is needed
|
|
backend:
|
|
hostCerts:
|
|
enabled: false # Set to true if needed
|
|
```
|
|
|
|
### 2. Install
|
|
|
|
```bash
|
|
helm install clawith ./helm/clawith -n clawith --create-namespace
|
|
```
|
|
|
|
### 3. Verify Deployment
|
|
|
|
```bash
|
|
# Check Pod status
|
|
kubectl get pods -n clawith
|
|
|
|
# Expected output:
|
|
# NAME READY STATUS RESTARTS AGE
|
|
# clawith-backend-xxx 1/1 Running 0 2m
|
|
# clawith-frontend-xxx 1/1 Running 0 2m
|
|
# clawith-postgresql-0 1/1 Running 0 2m
|
|
# clawith-redis-xxx 1/1 Running 0 2m
|
|
|
|
# Check Services and Ingress
|
|
kubectl get svc,ingress -n clawith
|
|
```
|
|
|
|
## 🔧 Common Configuration Scenarios
|
|
|
|
### Scenario 1: Using Existing PVC (Existing Storage)
|
|
|
|
```yaml
|
|
backend:
|
|
persistence:
|
|
enabled: true
|
|
existingClaim: "clawith-agent-data-pvc" # Your PVC name
|
|
# No need to specify storageClass and size
|
|
|
|
postgresql:
|
|
primary:
|
|
persistence:
|
|
enabled: true
|
|
existingClaim: "clawith-postgresql-data" # Your PVC name
|
|
|
|
redis:
|
|
persistence:
|
|
enabled: true
|
|
existingClaim: "redisdata" # Your PVC name
|
|
```
|
|
|
|
### Scenario 2: Creating New PVC (Dynamic Storage)
|
|
|
|
```yaml
|
|
backend:
|
|
persistence:
|
|
enabled: true
|
|
existingClaim: "" # Leave empty
|
|
storageClass: "nfs-client" # Your StorageClass name
|
|
size: 10Gi
|
|
|
|
postgresql:
|
|
primary:
|
|
persistence:
|
|
enabled: true
|
|
existingClaim: ""
|
|
storageClass: "nfs-client"
|
|
size: 8Gi
|
|
|
|
redis:
|
|
persistence:
|
|
enabled: true
|
|
existingClaim: ""
|
|
storageClass: "nfs-client"
|
|
size: 2Gi
|
|
```
|
|
|
|
### Scenario 3: Configure Image Registry
|
|
|
|
If using private image registry or different image sources:
|
|
|
|
```yaml
|
|
global:
|
|
imageRegistry: registry.example.com/myproject # Private registry
|
|
|
|
backend:
|
|
image:
|
|
repository: clawith-backend
|
|
tag: v1.0.0 # Use specific version
|
|
|
|
frontend:
|
|
image:
|
|
repository: clawith-frontend
|
|
tag: v1.0.0
|
|
|
|
postgresql:
|
|
image:
|
|
registry: registry.example.com/bitnami
|
|
repository: bitnami/postgresql
|
|
tag: 15.3.0-debian-11-r7
|
|
|
|
redis:
|
|
image:
|
|
registry: registry.example.com
|
|
repository: redis
|
|
tag: 7-alpine
|
|
```
|
|
|
|
### Scenario 4: Enable Private Certificate Support
|
|
|
|
If your environment requires custom CA certificates (e.g., corporate intranet):
|
|
|
|
```yaml
|
|
backend:
|
|
hostCerts:
|
|
enabled: true
|
|
paths:
|
|
certs: /etc/ssl/certs
|
|
shareCA: /usr/local/share/ca-certificates
|
|
containerPaths:
|
|
sslCertFile: /app/cacert.pem
|
|
requestsCaBundle: /app/cacert.pem
|
|
curlCaBundle: /app/cacert.pem
|
|
```
|
|
|
|
### Scenario 5: Using External Database
|
|
|
|
If you have independent PostgreSQL and Redis services:
|
|
|
|
```yaml
|
|
postgresql:
|
|
enabled: false
|
|
external:
|
|
host: "postgresql.example.com"
|
|
port: 5432
|
|
database: clawith
|
|
username: postgres
|
|
password: "your-password"
|
|
|
|
redis:
|
|
enabled: false
|
|
external:
|
|
host: "redis.example.com"
|
|
port: 6379
|
|
database: 0
|
|
password: "" # If password is required
|
|
```
|
|
|
|
### Scenario 6: Production Environment Configuration
|
|
|
|
```yaml
|
|
global:
|
|
imageRegistry: registry.yourcompany.com/clawith
|
|
|
|
backend:
|
|
replicaCount: 2 # Multiple replicas
|
|
image:
|
|
tag: v1.0.0 # Use fixed version
|
|
resources:
|
|
limits:
|
|
cpu: 2000m
|
|
memory: 4Gi
|
|
requests:
|
|
cpu: 500m
|
|
memory: 1Gi
|
|
persistence:
|
|
storageClass: "ssd-storage" # High-performance storage
|
|
size: 50Gi
|
|
|
|
frontend:
|
|
replicaCount: 2
|
|
image:
|
|
tag: v1.0.0
|
|
ingress:
|
|
enabled: true
|
|
annotations:
|
|
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
|
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
|
host: "clawith.yourcompany.com"
|
|
tls:
|
|
enabled: true
|
|
secretName: clawith-tls-secret
|
|
|
|
postgresql:
|
|
auth:
|
|
password: "STRONG_PASSWORD_HERE" # Must use strong password
|
|
primary:
|
|
persistence:
|
|
storageClass: "ssd-storage"
|
|
size: 20Gi
|
|
resources:
|
|
limits:
|
|
cpu: 2000m
|
|
memory: 2Gi
|
|
requests:
|
|
cpu: 500m
|
|
memory: 512Mi
|
|
|
|
redis:
|
|
persistence:
|
|
storageClass: "ssd-storage"
|
|
size: 5Gi
|
|
resources:
|
|
limits:
|
|
cpu: 1000m
|
|
memory: 1Gi
|
|
requests:
|
|
cpu: 250m
|
|
memory: 256Mi
|
|
```
|
|
|
|
## 📝 Common Commands
|
|
|
|
### Check Status
|
|
|
|
```bash
|
|
# View all resources
|
|
kubectl get all -n clawith
|
|
|
|
# Check Pod status
|
|
kubectl get pods -n clawith
|
|
|
|
# Check PVCs
|
|
kubectl get pvc -n clawith
|
|
|
|
# Check Helm release status
|
|
helm status clawith -n clawith
|
|
|
|
# Check Helm deployment values
|
|
helm get values clawith -n clawith
|
|
```
|
|
|
|
### View Logs
|
|
|
|
```bash
|
|
# Backend logs
|
|
kubectl logs -n clawith -l app.kubernetes.io/component=backend -f
|
|
|
|
# Frontend logs
|
|
kubectl logs -n clawith -l app.kubernetes.io/component=frontend -f
|
|
|
|
# PostgreSQL logs
|
|
kubectl logs -n clawith -l app.kubernetes.io/component=postgresql -f
|
|
|
|
# Redis logs
|
|
kubectl logs -n clawith -l app.kubernetes.io/component=redis -f
|
|
```
|
|
|
|
### Upgrade
|
|
|
|
```bash
|
|
# Upgrade after modifying values.yaml
|
|
helm upgrade clawith ./helm/clawith -n clawith
|
|
|
|
# Or use --set to override specific values
|
|
helm upgrade clawith ./helm/clawith -n clawith \
|
|
--set backend.image.tag=v1.0.1 \
|
|
--set frontend.image.tag=v1.0.1
|
|
|
|
# Upgrade image registry
|
|
helm upgrade clawith ./helm/clawith -n clawith \
|
|
--set global.imageRegistry=registry.example.com/newproject
|
|
```
|
|
|
|
### Rollback
|
|
|
|
```bash
|
|
# View revision history
|
|
helm history clawith -n clawith
|
|
|
|
# Rollback to previous revision
|
|
helm rollback clawith -n clawith
|
|
|
|
# Rollback to specific revision
|
|
helm rollback clawith 1 -n clawith
|
|
```
|
|
|
|
### Uninstall
|
|
|
|
```bash
|
|
# Uninstall application (keep PVCs)
|
|
helm uninstall clawith -n clawith
|
|
|
|
# If you need to delete PVCs
|
|
kubectl delete pvc -n clawith --all
|
|
|
|
# Delete namespace
|
|
kubectl delete namespace clawith
|
|
```
|
|
|
|
## 🔍 Access Application
|
|
|
|
### Access via Ingress (Recommended)
|
|
|
|
If Ingress is configured, access directly via domain:
|
|
```
|
|
http://clawith.example.com # Or your configured domain
|
|
```
|
|
|
|
### Access via Port Forward
|
|
|
|
If Ingress is not configured, use port forwarding:
|
|
|
|
```bash
|
|
# Forward frontend service
|
|
kubectl port-forward -n clawith svc/clawith-frontend 8080:80
|
|
|
|
# Then access http://localhost:8080
|
|
```
|
|
|
|
```bash
|
|
# Forward backend service (for API debugging)
|
|
kubectl port-forward -n clawith svc/clawith-backend 8000:8000
|
|
|
|
# Then access http://localhost:8000
|
|
```
|
|
|
|
## 🛠️ Troubleshooting
|
|
|
|
### Pod Cannot Start
|
|
|
|
```bash
|
|
# Check Pod details
|
|
kubectl describe pod <pod-name> -n clawith
|
|
|
|
# Check logs
|
|
kubectl logs <pod-name> -n clawith
|
|
|
|
# Check events
|
|
kubectl get events -n clawith --sort-by='.lastTimestamp'
|
|
```
|
|
|
|
### PVC Binding Failure
|
|
|
|
```bash
|
|
# Check PVC status
|
|
kubectl get pvc -n clawith
|
|
kubectl describe pvc <pvc-name> -n clawith
|
|
|
|
# Check StorageClass
|
|
kubectl get storageclass
|
|
|
|
# Check PV
|
|
kubectl get pv
|
|
```
|
|
|
|
### Image Pull Failure
|
|
|
|
```bash
|
|
# Check image configuration
|
|
helm get values clawith -n clawith | grep -A 3 image
|
|
|
|
# Check Pod events
|
|
kubectl describe pod <pod-name> -n clawith | grep -A 10 Events
|
|
|
|
# Manually test image pull
|
|
docker pull your-registry/clawith-backend:latest
|
|
```
|
|
|
|
### Database Connection Issues
|
|
|
|
```bash
|
|
# Check PostgreSQL service
|
|
kubectl get svc -n clawith | grep postgresql
|
|
|
|
# Check database password
|
|
kubectl get secret -n clawith -o yaml | grep postgres-password
|
|
|
|
# Enter backend Pod to test connection
|
|
kubectl exec -it -n clawith deployment/clawith-backend -- /bin/bash
|
|
# Test inside Pod
|
|
nc -zv clawith-postgresql 5432
|
|
```
|
|
|
|
## 🔐 Security Recommendations
|
|
|
|
### 1. Change Default Passwords
|
|
|
|
⚠️ **Important**: Must change all default passwords before deployment!
|
|
|
|
```yaml
|
|
backend:
|
|
secrets:
|
|
secretKey: "Generate a random string of at least 50 characters"
|
|
jwtSecretKey: "Generate a random string of at least 32 characters"
|
|
|
|
postgresql:
|
|
auth:
|
|
password: "Generate a strong password" # Do not use default clawith123456
|
|
```
|
|
|
|
Methods to generate random passwords:
|
|
```bash
|
|
# Generate 50-character random string
|
|
openssl rand -base64 36
|
|
|
|
# Or use Python
|
|
python3 -c "import secrets; print(secrets.token_urlsafe(50))"
|
|
|
|
# Generate 32-character random string
|
|
openssl rand -base64 24
|
|
```
|
|
|
|
### 2. Use External Secrets
|
|
|
|
In production environments, external Secret management is recommended:
|
|
|
|
```bash
|
|
# Create Secret
|
|
kubectl create secret generic clawith-secrets \
|
|
--from-literal=secret-key='your-secret-key' \
|
|
--from-literal=jwt-secret-key='your-jwt-secret' \
|
|
-n clawith
|
|
|
|
# Configure in values.yaml
|
|
secrets:
|
|
create: false
|
|
existingSecret: "clawith-secrets"
|
|
```
|
|
|
|
### 3. Enable HTTPS
|
|
|
|
```yaml
|
|
frontend:
|
|
ingress:
|
|
enabled: true
|
|
annotations:
|
|
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
|
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
|
host: "clawith.yourcompany.com"
|
|
tls:
|
|
enabled: true
|
|
secretName: clawith-tls-secret
|
|
```
|
|
|
|
### 4. Configure Resource Limits
|
|
|
|
```yaml
|
|
backend:
|
|
resources:
|
|
limits:
|
|
cpu: 2000m
|
|
memory: 4Gi
|
|
requests:
|
|
cpu: 500m
|
|
memory: 1Gi
|
|
```
|
|
|
|
### 5. Use Private Image Registry
|
|
|
|
```yaml
|
|
global:
|
|
imageRegistry: registry.yourcompany.com/clawith
|
|
|
|
# If authentication is required, create imagePullSecret
|
|
# kubectl create secret docker-registry regcred \
|
|
# --docker-server=registry.yourcompany.com \
|
|
# --docker-username=user \
|
|
# --docker-password=password \
|
|
# -n clawith
|
|
```
|
|
|
|
## 💡 Practical Tips
|
|
|
|
### Preview Deployment Content
|
|
|
|
Before actual deployment, preview the generated YAML:
|
|
|
|
```bash
|
|
# Render template without installing
|
|
helm template clawith ./helm/clawith -n clawith > preview.yaml
|
|
|
|
# Or use --dry-run
|
|
helm install clawith ./helm/clawith -n clawith --dry-run --debug
|
|
```
|
|
|
|
### Compare Configuration Differences
|
|
|
|
Install helm-diff plugin to compare configuration changes:
|
|
|
|
```bash
|
|
# Install plugin
|
|
helm plugin install https://github.com/databus23/helm-diff
|
|
|
|
# View upgrade differences
|
|
helm diff upgrade clawith ./helm/clawith -n clawith
|
|
```
|
|
|
|
### Export Current Configuration
|
|
|
|
```bash
|
|
# Export currently used values
|
|
helm get values clawith -n clawith > current-values.yaml
|
|
|
|
# Export complete manifest
|
|
helm get manifest clawith -n clawith > current-manifest.yaml
|
|
```
|
|
|
|
### Update Specific Components Only
|
|
|
|
```bash
|
|
# Update backend image version only
|
|
helm upgrade clawith ./helm/clawith -n clawith \
|
|
--set backend.image.tag=v1.0.1 \
|
|
--reuse-values
|
|
|
|
# Update frontend configuration only
|
|
helm upgrade clawith ./helm/clawith -n clawith \
|
|
--set frontend.ingress.host=new.example.com \
|
|
--reuse-values
|
|
|
|
# Update image registry
|
|
helm upgrade clawith ./helm/clawith -n clawith \
|
|
--set global.imageRegistry=new-registry.com/project \
|
|
--reuse-values
|
|
```
|
|
|
|
## 📊 Monitoring and Maintenance
|
|
|
|
### Check Resource Usage
|
|
|
|
```bash
|
|
# Check Pod resource usage
|
|
kubectl top pods -n clawith
|
|
|
|
# Check Node resource usage
|
|
kubectl top nodes
|
|
|
|
# Check PVC usage
|
|
kubectl get pvc -n clawith
|
|
```
|
|
|
|
### Regular Backups
|
|
|
|
**Backup PostgreSQL Data:**
|
|
|
|
```bash
|
|
# Export database
|
|
kubectl exec -n clawith clawith-postgresql-0 -- \
|
|
pg_dump -U postgres clawith > backup-$(date +%Y%m%d).sql
|
|
|
|
# Restore database
|
|
kubectl exec -i -n clawith clawith-postgresql-0 -- \
|
|
psql -U postgres clawith < backup-20260402.sql
|
|
```
|
|
|
|
**Backup Helm Configuration:**
|
|
|
|
```bash
|
|
# Backup current configuration
|
|
helm get values clawith -n clawith > backup-values-$(date +%Y%m%d).yaml
|
|
```
|
|
|
|
## 🎯 Comparison with Original K8s Deployment
|
|
|
|
| Feature | Original K8s YAML | Helm Chart |
|
|
|---------|-------------------|------------|
|
|
| Configuration Management | Scattered in multiple files | Centralized in values.yaml |
|
|
| Version Control | Manual management | Automatically tracked by Helm |
|
|
| Upgrade | Apply one by one | `helm upgrade` single command |
|
|
| Rollback | Difficult | `helm rollback` single command |
|
|
| Parameterization | Manual replacement | Automatic template rendering |
|
|
| Environment Management | Copy multiple YAML files | One template + values.yaml |
|
|
| Dependency Management | Manual sequence | Automatically handled by Helm |
|
|
| Maintainability | Low | High |
|
|
|
|
## 📚 More Information
|
|
|
|
- **Detailed Configuration**: `helm/clawith/README.md`
|
|
- **Helm Official Documentation**: https://helm.sh/docs/
|
|
- **Kubernetes Documentation**: https://kubernetes.io/docs/
|
|
|
|
## ❓ FAQ
|
|
|
|
**Q: How to check current configuration?**
|
|
```bash
|
|
helm get values clawith -n clawith
|
|
```
|
|
|
|
**Q: How to update only one configuration item without affecting others?**
|
|
```bash
|
|
helm upgrade clawith ./helm/clawith -n clawith --reuse-values --set backend.image.tag=v1.0.1
|
|
```
|
|
|
|
**Q: How to preserve data after uninstallation?**
|
|
```bash
|
|
# Helm uninstall does not delete PVCs by default, data is preserved
|
|
helm uninstall clawith -n clawith
|
|
# PVC still exists and can be reused during next installation
|
|
```
|
|
|
|
**Q: How to check why deployment failed?**
|
|
```bash
|
|
kubectl get events -n clawith --sort-by='.lastTimestamp'
|
|
kubectl logs -n clawith <pod-name>
|
|
helm status clawith -n clawith
|
|
```
|
|
|
|
**Q: How to change image registry?**
|
|
```bash
|
|
# Method 1: Modify global.imageRegistry in values.yaml
|
|
# Method 2: Use --set parameter
|
|
helm upgrade clawith ./helm/clawith -n clawith \
|
|
--set global.imageRegistry=new-registry.com/project
|
|
```
|
|
|
|
**Q: How to verify if StorageClass is available?**
|
|
```bash
|
|
# Check available StorageClasses
|
|
kubectl get storageclass
|
|
|
|
# Check StorageClass details
|
|
kubectl describe storageclass nfs-client
|
|
```
|
|
|
|
---
|
|
|
|
**Happy deploying!** 🎉
|