From 7e8b1e4ad6d87b60626a13e526d88607e0ab75a6 Mon Sep 17 00:00:00 2001 From: thaoduc Date: Wed, 8 Oct 2025 13:57:16 +0700 Subject: [PATCH] abc --- lbl-01/.helmignore | 23 ++ lbl-01/Chart.yaml | 45 +++ lbl-01/DEPLOYMENT.md | 411 ++++++++++++++++++++ lbl-01/README.md | 291 ++++++++++++++ lbl-01/label-studio-1.0.0.tgz | Bin 0 -> 10133 bytes lbl-01/label-studio-1.0.1.tgz | Bin 0 -> 21648 bytes lbl-01/templates/NOTES.txt | 35 ++ lbl-01/templates/_helpers.tpl | 62 +++ lbl-01/templates/deployment.yaml | 122 ++++++ lbl-01/templates/hpa.yaml | 32 ++ lbl-01/templates/httproute.yaml | 38 ++ lbl-01/templates/ingress.yaml | 43 ++ lbl-01/templates/service.yaml | 15 + lbl-01/templates/serviceaccount.yaml | 13 + lbl-01/templates/tests/test-connection.yaml | 15 + lbl-01/values-example.yaml | 206 ++++++++++ lbl-01/values.yaml | 258 ++++++++++++ 17 files changed, 1609 insertions(+) create mode 100644 lbl-01/.helmignore create mode 100644 lbl-01/Chart.yaml create mode 100644 lbl-01/DEPLOYMENT.md create mode 100644 lbl-01/README.md create mode 100644 lbl-01/label-studio-1.0.0.tgz create mode 100644 lbl-01/label-studio-1.0.1.tgz create mode 100644 lbl-01/templates/NOTES.txt create mode 100644 lbl-01/templates/_helpers.tpl create mode 100644 lbl-01/templates/deployment.yaml create mode 100644 lbl-01/templates/hpa.yaml create mode 100644 lbl-01/templates/httproute.yaml create mode 100644 lbl-01/templates/ingress.yaml create mode 100644 lbl-01/templates/service.yaml create mode 100644 lbl-01/templates/serviceaccount.yaml create mode 100644 lbl-01/templates/tests/test-connection.yaml create mode 100644 lbl-01/values-example.yaml create mode 100644 lbl-01/values.yaml diff --git a/lbl-01/.helmignore b/lbl-01/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/lbl-01/.helmignore @@ -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/ diff --git a/lbl-01/Chart.yaml b/lbl-01/Chart.yaml new file mode 100644 index 0000000..9cd90f6 --- /dev/null +++ b/lbl-01/Chart.yaml @@ -0,0 +1,45 @@ +apiVersion: v2 +name: label-studio +description: A Helm chart for Label Studio - Open source data labeling tool for Machine Learning + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 1.0.1 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +# It is recommended to use it with quotes. +appVersion: "develop" + +# Keywords for the chart +keywords: + - label-studio + - machine-learning + - data-labeling + - annotation + - ai + +# Home page URL +home: https://labelstud.io/ + +# Source code URLs +sources: + - https://github.com/heartexlabs/label-studio + +# Maintainers +maintainers: + - name: HeartexLabs + email: hello@heartex.com + url: https://heartex.com/ diff --git a/lbl-01/DEPLOYMENT.md b/lbl-01/DEPLOYMENT.md new file mode 100644 index 0000000..e02a2fd --- /dev/null +++ b/lbl-01/DEPLOYMENT.md @@ -0,0 +1,411 @@ +# Label Studio Helm Chart Deployment Guide + +This guide provides step-by-step instructions for deploying Label Studio using the Helm chart. + +## Prerequisites + +Before deploying Label Studio, ensure you have: + +1. **Kubernetes cluster** (v1.19+) +2. **Helm** (v3.0+) +3. **kubectl** configured to access your cluster +4. **PostgreSQL database** (can be deployed separately or use managed service) +5. **Redis instance** (can be deployed separately or use managed service) +6. **Storage class** available in your cluster + +## Quick Start + +### 1. Clone or Download the Chart + +```bash +# If you have the chart locally +cd /path/to/helm-chart/lbl-01 + +# Or download from repository +helm repo add label-studio https://your-repo-url +helm repo update +``` + +### 2. Create Namespace + +```bash +kubectl create namespace label-studio +``` + +### 3. Deploy Dependencies + +#### PostgreSQL (using Bitnami chart) + +```bash +helm repo add bitnami https://charts.bitnami.com/bitnami +helm repo update + +helm install postgresql bitnami/postgresql \ + --namespace label-studio \ + --set auth.postgresPassword=labelstudio123 \ + --set auth.username=labelstudio \ + --set auth.password=labelstudio123 \ + --set auth.database=labelstudio \ + --set primary.persistence.enabled=true \ + --set primary.persistence.size=20Gi +``` + +#### Redis (using Bitnami chart) + +```bash +helm install redis bitnami/redis \ + --namespace label-studio \ + --set auth.password=redis123 \ + --set master.persistence.enabled=true \ + --set master.persistence.size=8Gi +``` + +### 4. Create Secrets + +```bash +# PostgreSQL secret +kubectl create secret generic postgresql-secret \ + --from-literal=password=labelstudio123 \ + --namespace label-studio + +# Redis secret +kubectl create secret generic redis-secret \ + --from-literal=password=redis123 \ + --namespace label-studio +``` + +### 5. Customize Values + +Copy the example values file and customize it: + +```bash +cp values-example.yaml my-values.yaml +``` + +Edit `my-values.yaml` to match your environment: + +```yaml +# Update these values according to your setup +global: + pgConfig: + host: "postgresql.label-studio.svc.cluster.local" + password: + secretName: "postgresql-secret" + secretKey: "password" + + redisConfig: + host: "redis://redis-master.label-studio.svc.cluster.local:6379/1" + password: + secretName: "redis-secret" + secretKey: "password" + +ingress: + enabled: true + hosts: + - host: label-studio.yourdomain.com # Change this + paths: + - path: / + pathType: ImplementationSpecific + tls: + - secretName: label-studio-tls + hosts: + - label-studio.yourdomain.com # Change this + +env: + LABEL_STUDIO_HOST: "https://label-studio.yourdomain.com" # Change this + LABEL_STUDIO_USERNAME: "admin@yourdomain.com" # Change this + LABEL_STUDIO_PASSWORD: "your-secure-password" # Change this +``` + +### 6. Deploy Label Studio + +```bash +helm install label-studio . \ + --namespace label-studio \ + --values my-values.yaml +``` + +### 7. Verify Deployment + +```bash +# Check pods +kubectl get pods -n label-studio + +# Check services +kubectl get svc -n label-studio + +# Check ingress +kubectl get ingress -n label-studio + +# View logs +kubectl logs -f deployment/label-studio -n label-studio +``` + +## Advanced Deployment Scenarios + +### Production Deployment with External Database + +For production environments, use managed database services: + +```yaml +global: + pgConfig: + host: "your-rds-endpoint.amazonaws.com" + port: 5432 + dbName: "labelstudio" + userName: "labelstudio" + password: + secretName: "external-db-secret" + secretKey: "password" + + redisConfig: + host: "redis://your-elasticache-endpoint:6379/1" + password: + secretName: "external-redis-secret" + secretKey: "password" + +resources: + limits: + cpu: 4000m + memory: 8Gi + requests: + cpu: 2000m + memory: 4Gi + +autoscaling: + enabled: true + minReplicas: 3 + maxReplicas: 20 + targetCPUUtilizationPercentage: 70 +``` + +### High Availability Setup + +```yaml +replicaCount: 3 + +affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 100 + podAffinityTerm: + labelSelector: + matchExpressions: + - key: app.kubernetes.io/name + operator: In + values: + - label-studio + topologyKey: kubernetes.io/hostname + +resources: + limits: + cpu: 2000m + memory: 4Gi + requests: + cpu: 1000m + memory: 2Gi +``` + +### Storage Configuration + +#### S3 Storage + +```yaml +global: + persistence: + enabled: true + type: s3 + config: + s3: + bucket: "your-s3-bucket" + region: "us-west-2" + accessKey: + secretName: "s3-credentials" + secretKey: "access-key" + secretKey: + secretName: "s3-credentials" + secretKey: "secret-key" + +env: + USE_S3: "true" + S3_BUCKET: "your-s3-bucket" + S3_REGION: "us-west-2" +``` + +#### Azure Blob Storage + +```yaml +global: + persistence: + enabled: true + type: azure + config: + azure: + accountName: "yourstorageaccount" + containerName: "labelstudio" + accountKey: + secretName: "azure-storage-secret" + secretKey: "account-key" + +env: + USE_AZURE: "true" + AZURE_ACCOUNT_NAME: "yourstorageaccount" + AZURE_CONTAINER: "labelstudio" +``` + +## Monitoring and Observability + +### Enable Prometheus Metrics + +```yaml +env: + PROMETHEUS_METRICS_ENABLED: "true" + PROMETHEUS_METRICS_PORT: "9090" + +service: + annotations: + prometheus.io/scrape: "true" + prometheus.io/port: "9090" + prometheus.io/path: "/metrics" +``` + +### Logging Configuration + +```yaml +env: + LOG_LEVEL: "INFO" + LOG_FORMAT: "json" + PYTHONUNBUFFERED: "1" +``` + +## Troubleshooting + +### Common Issues + +1. **Pod not starting** + ```bash + kubectl describe pod -n label-studio + kubectl logs -n label-studio + ``` + +2. **Database connection issues** + ```bash + # Test database connectivity + kubectl run -it --rm debug --image=postgres:13 --restart=Never -- psql -h postgresql.label-studio.svc.cluster.local -U labelstudio -d labelstudio + ``` + +3. **Redis connection issues** + ```bash + # Test Redis connectivity + kubectl run -it --rm debug --image=redis:6 --restart=Never -- redis-cli -h redis-master.label-studio.svc.cluster.local -a redis123 + ``` + +4. **Ingress not working** + ```bash + kubectl describe ingress label-studio -n label-studio + kubectl get events -n label-studio + ``` + +### Health Checks + +```bash +# Check application health +kubectl exec -it deployment/label-studio -n label-studio -- curl http://localhost:8080/health + +# Run Helm tests +helm test label-studio -n label-studio +``` + +## Upgrading + +### Upgrade the Chart + +```bash +# Update values if needed +helm upgrade label-studio . \ + --namespace label-studio \ + --values my-values.yaml + +# Check upgrade status +helm status label-studio -n label-studio +``` + +### Rollback + +```bash +# List releases +helm history label-studio -n label-studio + +# Rollback to previous version +helm rollback label-studio 1 -n label-studio +``` + +## Uninstalling + +```bash +# Uninstall Label Studio +helm uninstall label-studio -n label-studio + +# Uninstall dependencies (if installed via Helm) +helm uninstall postgresql -n label-studio +helm uninstall redis -n label-studio + +# Delete namespace +kubectl delete namespace label-studio +``` + +## Security Considerations + +1. **Use strong passwords** for database and Redis +2. **Enable TLS** for ingress +3. **Use secrets** for sensitive data +4. **Configure RBAC** appropriately +5. **Enable pod security policies** +6. **Use non-root containers** +7. **Scan images** for vulnerabilities + +## Performance Tuning + +### Resource Optimization + +```yaml +resources: + limits: + cpu: 2000m + memory: 4Gi + requests: + cpu: 1000m + memory: 2Gi + +# For high-traffic environments +autoscaling: + enabled: true + minReplicas: 5 + maxReplicas: 50 + targetCPUUtilizationPercentage: 60 + targetMemoryUtilizationPercentage: 70 +``` + +### Database Optimization + +```yaml +env: + DJANGO_DB_CONN_MAX_AGE: "600" + DJANGO_DB_OPTIONS: '{"MAX_CONNS": 20}' +``` + +## Support + +For issues and questions: +- Check the [Label Studio documentation](https://labelstud.io/guide/) +- Review the [GitHub issues](https://github.com/heartexlabs/label-studio) +- Join the [Label Studio community](https://slack.labelstud.io/) + +## Contributing + +To contribute to this Helm chart: +1. Fork the repository +2. Create a feature branch +3. Make your changes +4. Test thoroughly +5. Submit a pull request \ No newline at end of file diff --git a/lbl-01/README.md b/lbl-01/README.md new file mode 100644 index 0000000..12615df --- /dev/null +++ b/lbl-01/README.md @@ -0,0 +1,291 @@ +# Label Studio Helm Chart + +Helm chart để triển khai Label Studio - công cụ gán nhãn dữ liệu mã nguồn mở cho Machine Learning trên Kubernetes. + +## Giới thiệu + +Label Studio là một công cụ gán nhãn dữ liệu mã nguồn mở được thiết kế để giúp bạn chuẩn bị dữ liệu huấn luyện cho các mô hình machine learning. Helm chart này giúp bạn triển khai Label Studio một cách dễ dàng trên Kubernetes cluster. + +## Yêu cầu + +- Kubernetes 1.19+ +- Helm 3.2.0+ +- PV provisioner hỗ trợ trong underlying infrastructure (nếu sử dụng persistence) + +## Cài đặt Chart + +### Cài đặt cơ bản + +```bash +helm install my-label-studio ./lbl-01 +``` + +### Cài đặt với custom values + +```bash +helm install my-label-studio ./lbl-01 -f my-values.yaml +``` + +## Gỡ cài đặt Chart + +```bash +helm uninstall my-label-studio +``` + +## Cấu hình + +### Cấu hình cơ bản + +Dưới đây là một số cấu hình cơ bản trong `values.yaml`: + +```yaml +# Cấu hình image +global: + image: + repository: heartexlabs/label-studio + tag: "develop" + pullPolicy: IfNotPresent + +# Cấu hình service +service: + type: ClusterIP + port: 8080 + targetPort: 8080 + +# Cấu hình ingress +ingress: + enabled: true + className: "nginx" + annotations: + nginx.ingress.kubernetes.io/proxy-body-size: "200m" + hosts: + - host: label-studio.local + paths: + - path: / + pathType: ImplementationSpecific +``` + +### Cấu hình Database (PostgreSQL) + +```yaml +global: + pgConfig: + host: "postgresql.default.svc.cluster.local" + port: 5432 + dbName: "labelstudio" + userName: "labelstudio" + password: + secretName: "postgresql-secret" + secretKey: "password" +``` + +### Cấu hình Redis + +```yaml +global: + redisConfig: + host: "redis://redis.default.svc.cluster.local:6379/1" + password: + secretName: "redis-secret" + secretKey: "password" +``` + +### Cấu hình Storage + +#### Local Volume Storage + +```yaml +global: + persistence: + enabled: true + type: volume + config: + volume: + storageClass: "standard" + size: 20Gi + accessModes: + - ReadWriteOnce +``` + +#### AWS S3 Storage + +```yaml +global: + persistence: + enabled: true + type: s3 + config: + s3: + accessKey: "your-access-key" + secretKey: "your-secret-key" + region: "us-west-2" + bucket: "label-studio-data" + folder: "media" +``` + +### Cấu hình Environment Variables + +```yaml +env: + LABEL_STUDIO_HOST: "https://label-studio.yourdomain.com" + LABEL_STUDIO_USERNAME: "admin@example.com" + LABEL_STUDIO_PASSWORD: "your-secure-password" + ENABLE_LOCAL_FILES_ACCESS: "true" + LOCAL_FILES_SERVING_ENABLED: "true" + SSRF_PROTECTION_ENABLED: "true" + +global: + extraEnvironmentVars: + PYTHONUNBUFFERED: "1" + DEBUG: "false" +``` + +## Ví dụ triển khai hoàn chỉnh + +### 1. Tạo namespace + +```bash +kubectl create namespace label-studio +``` + +### 2. Tạo secrets cho database + +```bash +kubectl create secret generic postgresql-secret \ + --from-literal=password=your-db-password \ + -n label-studio +``` + +### 3. Tạo values file + +```yaml +# my-values.yaml +global: + image: + tag: "latest" + + pgConfig: + host: "postgresql.label-studio.svc.cluster.local" + port: 5432 + dbName: "labelstudio" + userName: "labelstudio" + password: + secretName: "postgresql-secret" + secretKey: "password" + + persistence: + enabled: true + type: volume + config: + volume: + storageClass: "gp2" + size: 50Gi + +ingress: + enabled: true + className: "nginx" + annotations: + cert-manager.io/cluster-issuer: "letsencrypt-prod" + nginx.ingress.kubernetes.io/proxy-body-size: "200m" + hosts: + - host: label-studio.yourdomain.com + paths: + - path: / + pathType: ImplementationSpecific + tls: + - secretName: label-studio-tls + hosts: + - label-studio.yourdomain.com + +resources: + limits: + cpu: 2000m + memory: 4Gi + requests: + cpu: 1000m + memory: 2Gi + +env: + LABEL_STUDIO_HOST: "https://label-studio.yourdomain.com" + LABEL_STUDIO_USERNAME: "admin@yourdomain.com" + LABEL_STUDIO_PASSWORD: "your-secure-password" +``` + +### 4. Cài đặt chart + +```bash +helm install label-studio ./lbl-01 \ + -f my-values.yaml \ + -n label-studio +``` + +## Monitoring và Logging + +### Health Checks + +Chart đã được cấu hình với health checks: + +```yaml +livenessProbe: + httpGet: + path: /health + port: http + initialDelaySeconds: 60 + periodSeconds: 30 + +readinessProbe: + httpGet: + path: /health + port: http + initialDelaySeconds: 30 + periodSeconds: 10 +``` + +### Autoscaling + +```yaml +autoscaling: + enabled: true + minReplicas: 2 + maxReplicas: 10 + targetCPUUtilizationPercentage: 80 + targetMemoryUtilizationPercentage: 80 +``` + +## Troubleshooting + +### Kiểm tra pods + +```bash +kubectl get pods -n label-studio +kubectl logs -f deployment/label-studio -n label-studio +``` + +### Kiểm tra services + +```bash +kubectl get svc -n label-studio +kubectl describe svc label-studio -n label-studio +``` + +### Kiểm tra ingress + +```bash +kubectl get ingress -n label-studio +kubectl describe ingress label-studio -n label-studio +``` + +## Tham khảo + +- [Label Studio Documentation](https://labelstud.io/guide/) +- [Label Studio Helm Values](https://labelstud.io/guide/helm_values) +- [Kubernetes Documentation](https://kubernetes.io/docs/) +- [Helm Documentation](https://helm.sh/docs/) + +## Đóng góp + +Nếu bạn muốn đóng góp cho chart này, vui lòng tạo pull request hoặc issue trên repository. + +## License + +Chart này được phân phối dưới giấy phép MIT. Xem file LICENSE để biết thêm chi tiết. \ No newline at end of file diff --git a/lbl-01/label-studio-1.0.0.tgz b/lbl-01/label-studio-1.0.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..246c7dd186c95212117a16e548e0f7cc3fd2af9d GIT binary patch literal 10133 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 D4Pn=; literal 0 HcmV?d00001 diff --git a/lbl-01/label-studio-1.0.1.tgz b/lbl-01/label-studio-1.0.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..72054c2ab42be567cea6e2df57b1d1cafa03f2b3 GIT binary patch literal 21648 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