Add Helm chart, Docs, and Config conversion script
Some checks failed
Build / Code Quality Checks (push) Successful in 15m11s
Build / Build & Push Docker Images (worker) (push) Successful in 13m44s
Build / Build & Push Docker Images (frontend) (push) Successful in 5m8s
Build / Build & Push Docker Images (chat) (push) Failing after 30m7s
Build / Build & Push Docker Images (api) (push) Failing after 21m39s
Some checks failed
Build / Code Quality Checks (push) Successful in 15m11s
Build / Build & Push Docker Images (worker) (push) Successful in 13m44s
Build / Build & Push Docker Images (frontend) (push) Successful in 5m8s
Build / Build & Push Docker Images (chat) (push) Failing after 30m7s
Build / Build & Push Docker Images (api) (push) Failing after 21m39s
This commit is contained in:
511
CONFIGURATION.md
Normal file
511
CONFIGURATION.md
Normal file
@@ -0,0 +1,511 @@
|
||||
# Configuration Guide
|
||||
|
||||
This guide explains how to configure the Datacenter Documentation & Remediation Engine using the various configuration files available.
|
||||
|
||||
## Configuration Files Overview
|
||||
|
||||
The project supports multiple configuration methods to suit different deployment scenarios:
|
||||
|
||||
### 1. `.env` File (Docker Compose)
|
||||
- **Location**: Root of the project
|
||||
- **Format**: Environment variables
|
||||
- **Use case**: Local development, Docker Compose deployments
|
||||
- **Template**: `.env.example`
|
||||
|
||||
### 2. `values.yaml` File (Structured Configuration)
|
||||
- **Location**: Root of the project
|
||||
- **Format**: YAML
|
||||
- **Use case**: General configuration, Helm deployments, configuration management
|
||||
- **Template**: `values.yaml`
|
||||
|
||||
### 3. Helm Chart Values (Kubernetes)
|
||||
- **Location**: `deploy/helm/datacenter-docs/values.yaml`
|
||||
- **Format**: YAML (Helm-specific)
|
||||
- **Use case**: Kubernetes deployments via Helm
|
||||
- **Variants**:
|
||||
- `values.yaml` - Default configuration
|
||||
- `values-development.yaml` - Development settings
|
||||
- `values-production.yaml` - Production example
|
||||
|
||||
## Quick Start
|
||||
|
||||
### For Docker Compose Development
|
||||
|
||||
1. Copy the environment template:
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
2. Edit `.env` with your configuration:
|
||||
```bash
|
||||
nano .env
|
||||
```
|
||||
|
||||
3. Update the following required values:
|
||||
- `MONGO_ROOT_PASSWORD` - MongoDB password
|
||||
- `LLM_API_KEY` - Your LLM provider API key
|
||||
- `LLM_BASE_URL` - LLM provider endpoint
|
||||
- `MCP_API_KEY` - MCP server API key
|
||||
|
||||
4. Start the services:
|
||||
```bash
|
||||
cd deploy/docker
|
||||
docker-compose -f docker-compose.dev.yml up -d
|
||||
```
|
||||
|
||||
### For Kubernetes/Helm Deployment
|
||||
|
||||
1. Copy and customize the values file:
|
||||
```bash
|
||||
cp values.yaml my-values.yaml
|
||||
```
|
||||
|
||||
2. Edit `my-values.yaml` with your configuration
|
||||
|
||||
3. Deploy with Helm:
|
||||
```bash
|
||||
helm install my-release deploy/helm/datacenter-docs -f my-values.yaml
|
||||
```
|
||||
|
||||
## Configuration Mapping
|
||||
|
||||
Here's how the `.env` variables map to `values.yaml`:
|
||||
|
||||
| .env Variable | values.yaml Path | Description |
|
||||
|---------------|------------------|-------------|
|
||||
| `MONGO_ROOT_USER` | `mongodb.auth.rootUsername` | MongoDB root username |
|
||||
| `MONGO_ROOT_PASSWORD` | `mongodb.auth.rootPassword` | MongoDB root password |
|
||||
| `MONGODB_URL` | `mongodb.url` | MongoDB connection URL |
|
||||
| `MONGODB_DATABASE` | `mongodb.auth.database` | Database name |
|
||||
| `REDIS_PASSWORD` | `redis.auth.password` | Redis password |
|
||||
| `REDIS_URL` | `redis.url` | Redis connection URL |
|
||||
| `MCP_SERVER_URL` | `mcp.server.url` | MCP server endpoint |
|
||||
| `MCP_API_KEY` | `mcp.server.apiKey` | MCP API key |
|
||||
| `PROXMOX_HOST` | `proxmox.host` | Proxmox server hostname |
|
||||
| `PROXMOX_USER` | `proxmox.auth.user` | Proxmox username |
|
||||
| `PROXMOX_PASSWORD` | `proxmox.auth.password` | Proxmox password |
|
||||
| `LLM_BASE_URL` | `llm.baseUrl` | LLM API endpoint |
|
||||
| `LLM_API_KEY` | `llm.apiKey` | LLM API key |
|
||||
| `LLM_MODEL` | `llm.model` | LLM model name |
|
||||
| `LLM_TEMPERATURE` | `llm.generation.temperature` | Generation temperature |
|
||||
| `LLM_MAX_TOKENS` | `llm.generation.maxTokens` | Max tokens per request |
|
||||
| `API_HOST` | `api.host` | API server host |
|
||||
| `API_PORT` | `api.port` | API server port |
|
||||
| `WORKERS` | `api.workers` | Number of API workers |
|
||||
| `CORS_ORIGINS` | `cors.origins` | Allowed CORS origins |
|
||||
| `LOG_LEVEL` | `application.logging.level` | Logging level |
|
||||
| `DEBUG` | `application.debug` | Debug mode |
|
||||
| `CELERY_BROKER_URL` | `celery.broker.url` | Celery broker URL |
|
||||
| `CELERY_RESULT_BACKEND` | `celery.result.backend` | Celery result backend |
|
||||
| `VECTOR_STORE_PATH` | `vectorStore.chroma.path` | Vector store path |
|
||||
| `EMBEDDING_MODEL` | `vectorStore.embedding.model` | Embedding model name |
|
||||
|
||||
## Configuration Sections
|
||||
|
||||
### 1. Database Configuration
|
||||
|
||||
#### MongoDB
|
||||
```yaml
|
||||
mongodb:
|
||||
auth:
|
||||
rootUsername: admin
|
||||
rootPassword: "your-secure-password"
|
||||
database: datacenter_docs
|
||||
url: "mongodb://admin:password@mongodb:27017"
|
||||
```
|
||||
|
||||
**Security Note**: Always use strong passwords in production!
|
||||
|
||||
#### Redis
|
||||
```yaml
|
||||
redis:
|
||||
auth:
|
||||
password: "your-redis-password"
|
||||
url: "redis://redis:6379/0"
|
||||
```
|
||||
|
||||
### 2. LLM Provider Configuration
|
||||
|
||||
The system supports multiple LLM providers through OpenAI-compatible APIs:
|
||||
|
||||
#### OpenAI
|
||||
```yaml
|
||||
llm:
|
||||
provider: openai
|
||||
baseUrl: "https://api.openai.com/v1"
|
||||
apiKey: "sk-your-key"
|
||||
model: "gpt-4-turbo-preview"
|
||||
```
|
||||
|
||||
#### Anthropic Claude
|
||||
```yaml
|
||||
llm:
|
||||
provider: anthropic
|
||||
baseUrl: "https://api.anthropic.com/v1"
|
||||
apiKey: "sk-ant-your-key"
|
||||
model: "claude-sonnet-4-20250514"
|
||||
```
|
||||
|
||||
#### Local (Ollama)
|
||||
```yaml
|
||||
llm:
|
||||
provider: ollama
|
||||
baseUrl: "http://localhost:11434/v1"
|
||||
apiKey: "ollama"
|
||||
model: "llama3"
|
||||
```
|
||||
|
||||
### 3. Auto-Remediation Configuration
|
||||
|
||||
Control how the system handles automated problem resolution:
|
||||
|
||||
```yaml
|
||||
autoRemediation:
|
||||
enabled: true
|
||||
minReliabilityScore: 85.0
|
||||
requireApprovalThreshold: 90.0
|
||||
maxActionsPerHour: 100
|
||||
dryRun: false # Set to true for testing
|
||||
```
|
||||
|
||||
**Important**: Start with `dryRun: true` to test without making actual changes!
|
||||
|
||||
### 4. Infrastructure Collectors
|
||||
|
||||
Enable/disable different infrastructure data collectors:
|
||||
|
||||
```yaml
|
||||
collectors:
|
||||
vmware:
|
||||
enabled: true
|
||||
host: "vcenter.example.com"
|
||||
kubernetes:
|
||||
enabled: true
|
||||
proxmox:
|
||||
enabled: true
|
||||
```
|
||||
|
||||
### 5. Security Settings
|
||||
|
||||
```yaml
|
||||
security:
|
||||
authentication:
|
||||
enabled: true
|
||||
method: "jwt"
|
||||
rateLimit:
|
||||
enabled: true
|
||||
requestsPerMinute: 100
|
||||
```
|
||||
|
||||
## Environment-Specific Configuration
|
||||
|
||||
### Development
|
||||
|
||||
For development, use minimal resources and verbose logging:
|
||||
|
||||
```yaml
|
||||
application:
|
||||
logging:
|
||||
level: "DEBUG"
|
||||
debug: true
|
||||
environment: "development"
|
||||
|
||||
autoRemediation:
|
||||
dryRun: true # Never make real changes in dev
|
||||
|
||||
llm:
|
||||
baseUrl: "http://localhost:11434/v1" # Use local Ollama
|
||||
```
|
||||
|
||||
### Production
|
||||
|
||||
For production, use secure settings and proper resource limits:
|
||||
|
||||
```yaml
|
||||
application:
|
||||
logging:
|
||||
level: "INFO"
|
||||
debug: false
|
||||
environment: "production"
|
||||
|
||||
autoRemediation:
|
||||
enabled: true
|
||||
minReliabilityScore: 95.0 # Higher threshold
|
||||
requireApprovalThreshold: 98.0
|
||||
dryRun: false
|
||||
|
||||
security:
|
||||
authentication:
|
||||
enabled: true
|
||||
rateLimit:
|
||||
enabled: true
|
||||
```
|
||||
|
||||
## Configuration Best Practices
|
||||
|
||||
### 1. Secret Management
|
||||
|
||||
**Never commit secrets to version control!**
|
||||
|
||||
For development:
|
||||
- Use `.env` (add to `.gitignore`)
|
||||
- Use default passwords (change in production)
|
||||
|
||||
For production:
|
||||
- Use Kubernetes Secrets
|
||||
- Use external secret managers (Vault, AWS Secrets Manager, etc.)
|
||||
- Rotate secrets regularly
|
||||
|
||||
Example with Kubernetes Secret:
|
||||
```bash
|
||||
kubectl create secret generic datacenter-docs-secrets \
|
||||
--from-literal=mongodb-password="$(openssl rand -base64 32)" \
|
||||
--from-literal=llm-api-key="your-actual-key"
|
||||
```
|
||||
|
||||
### 2. Resource Limits
|
||||
|
||||
Always set appropriate resource limits:
|
||||
|
||||
```yaml
|
||||
resources:
|
||||
api:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "2Gi"
|
||||
cpu: "1000m"
|
||||
```
|
||||
|
||||
### 3. High Availability
|
||||
|
||||
For production deployments:
|
||||
|
||||
```yaml
|
||||
api:
|
||||
replicaCount: 3 # Multiple replicas
|
||||
|
||||
mongodb:
|
||||
persistence:
|
||||
enabled: true
|
||||
size: 50Gi
|
||||
storageClass: "fast-ssd"
|
||||
```
|
||||
|
||||
### 4. Monitoring
|
||||
|
||||
Enable monitoring and observability:
|
||||
|
||||
```yaml
|
||||
monitoring:
|
||||
metrics:
|
||||
enabled: true
|
||||
health:
|
||||
enabled: true
|
||||
tracing:
|
||||
enabled: true
|
||||
provider: "jaeger"
|
||||
```
|
||||
|
||||
### 5. Backup Configuration
|
||||
|
||||
Configure regular backups:
|
||||
|
||||
```yaml
|
||||
backup:
|
||||
enabled: true
|
||||
schedule: "0 2 * * *" # Daily at 2 AM
|
||||
retention:
|
||||
daily: 7
|
||||
weekly: 4
|
||||
monthly: 12
|
||||
```
|
||||
|
||||
## Validation
|
||||
|
||||
### Validate .env File
|
||||
|
||||
```bash
|
||||
# Check for required variables
|
||||
grep -E "^(MONGODB_URL|LLM_API_KEY|MCP_API_KEY)=" .env
|
||||
```
|
||||
|
||||
### Validate values.yaml
|
||||
|
||||
```bash
|
||||
# Install yq (YAML processor)
|
||||
# brew install yq # macOS
|
||||
# sudo apt install yq # Ubuntu
|
||||
|
||||
# Validate YAML syntax
|
||||
yq eval '.' values.yaml > /dev/null && echo "Valid YAML" || echo "Invalid YAML"
|
||||
|
||||
# Check specific values
|
||||
yq eval '.llm.apiKey' values.yaml
|
||||
yq eval '.mongodb.auth.rootPassword' values.yaml
|
||||
```
|
||||
|
||||
### Validate Helm Values
|
||||
|
||||
```bash
|
||||
# Lint the Helm chart
|
||||
helm lint deploy/helm/datacenter-docs -f my-values.yaml
|
||||
|
||||
# Dry-run installation
|
||||
helm install test deploy/helm/datacenter-docs -f my-values.yaml --dry-run --debug
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
#### 1. MongoDB Connection Failed
|
||||
|
||||
Check:
|
||||
- MongoDB URL is correct
|
||||
- Password matches in both MongoDB and application config
|
||||
- MongoDB service is running
|
||||
|
||||
```bash
|
||||
# Test MongoDB connection
|
||||
docker exec -it datacenter-docs-mongodb mongosh \
|
||||
-u admin -p admin123 --authenticationDatabase admin
|
||||
```
|
||||
|
||||
#### 2. LLM API Errors
|
||||
|
||||
Check:
|
||||
- API key is valid
|
||||
- Base URL is correct
|
||||
- Model name is supported by the provider
|
||||
- Network connectivity to LLM provider
|
||||
|
||||
```bash
|
||||
# Test LLM API
|
||||
curl -H "Authorization: Bearer $LLM_API_KEY" \
|
||||
$LLM_BASE_URL/models
|
||||
```
|
||||
|
||||
#### 3. Redis Connection Issues
|
||||
|
||||
Check:
|
||||
- Redis URL is correct
|
||||
- Redis service is running
|
||||
- Password is correct (if enabled)
|
||||
|
||||
```bash
|
||||
# Test Redis connection
|
||||
docker exec -it datacenter-docs-redis redis-cli ping
|
||||
```
|
||||
|
||||
## Converting Between Formats
|
||||
|
||||
### From .env to values.yaml
|
||||
|
||||
We provide a conversion script:
|
||||
|
||||
```bash
|
||||
# TODO: Create conversion script
|
||||
# python scripts/env_to_values.py .env > my-values.yaml
|
||||
```
|
||||
|
||||
Manual conversion example:
|
||||
```bash
|
||||
# .env
|
||||
MONGODB_URL=mongodb://admin:pass@mongodb:27017
|
||||
|
||||
# values.yaml
|
||||
mongodb:
|
||||
url: "mongodb://admin:pass@mongodb:27017"
|
||||
```
|
||||
|
||||
### From values.yaml to .env
|
||||
|
||||
```bash
|
||||
# Extract specific values
|
||||
echo "MONGODB_URL=$(yq eval '.mongodb.url' values.yaml)" >> .env
|
||||
echo "LLM_API_KEY=$(yq eval '.llm.apiKey' values.yaml)" >> .env
|
||||
```
|
||||
|
||||
## Examples
|
||||
|
||||
### Example 1: Local Development with Ollama
|
||||
|
||||
```yaml
|
||||
# values-local.yaml
|
||||
llm:
|
||||
provider: ollama
|
||||
baseUrl: "http://localhost:11434/v1"
|
||||
apiKey: "ollama"
|
||||
model: "llama3"
|
||||
|
||||
application:
|
||||
debug: true
|
||||
logging:
|
||||
level: "DEBUG"
|
||||
|
||||
autoRemediation:
|
||||
dryRun: true
|
||||
```
|
||||
|
||||
### Example 2: Production with OpenAI
|
||||
|
||||
```yaml
|
||||
# values-prod.yaml
|
||||
llm:
|
||||
provider: openai
|
||||
baseUrl: "https://api.openai.com/v1"
|
||||
apiKey: "sk-prod-key-from-secret-manager"
|
||||
model: "gpt-4-turbo-preview"
|
||||
|
||||
application:
|
||||
debug: false
|
||||
logging:
|
||||
level: "INFO"
|
||||
|
||||
autoRemediation:
|
||||
enabled: true
|
||||
minReliabilityScore: 95.0
|
||||
dryRun: false
|
||||
|
||||
security:
|
||||
authentication:
|
||||
enabled: true
|
||||
rateLimit:
|
||||
enabled: true
|
||||
```
|
||||
|
||||
### Example 3: Multi-Environment Setup
|
||||
|
||||
```bash
|
||||
# Development
|
||||
helm install dev deploy/helm/datacenter-docs \
|
||||
-f values.yaml \
|
||||
-f values-development.yaml
|
||||
|
||||
# Staging
|
||||
helm install staging deploy/helm/datacenter-docs \
|
||||
-f values.yaml \
|
||||
-f values-staging.yaml
|
||||
|
||||
# Production
|
||||
helm install prod deploy/helm/datacenter-docs \
|
||||
-f values.yaml \
|
||||
-f values-production.yaml
|
||||
```
|
||||
|
||||
## Related Documentation
|
||||
|
||||
- [Main README](README.md)
|
||||
- [Docker Deployment](deploy/docker/README.md)
|
||||
- [Helm Chart](deploy/helm/README.md)
|
||||
- [Environment Variables](.env.example)
|
||||
- [Project Repository](https://git.commandware.com/it-ops/llm-automation-docs-and-remediation-engine)
|
||||
|
||||
## Support
|
||||
|
||||
For configuration help:
|
||||
- Open an issue: https://git.commandware.com/it-ops/llm-automation-docs-and-remediation-engine/issues
|
||||
- Check the documentation
|
||||
- Review example configurations in `deploy/` directory
|
||||
400
deploy/helm/README.md
Normal file
400
deploy/helm/README.md
Normal file
@@ -0,0 +1,400 @@
|
||||
# Helm Deployment
|
||||
|
||||
This directory contains Helm charts for deploying the Datacenter Docs & Remediation Engine on Kubernetes.
|
||||
|
||||
## Contents
|
||||
|
||||
- `datacenter-docs/` - Main Helm chart for the application
|
||||
- `test-chart.sh` - Automated testing script for chart validation
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Kubernetes cluster (1.19+)
|
||||
- Helm 3.0+
|
||||
- kubectl configured to access your cluster
|
||||
|
||||
### Development/Testing Installation
|
||||
|
||||
```bash
|
||||
# Install with development settings (minimal resources, local testing)
|
||||
helm install dev ./datacenter-docs -f ./datacenter-docs/values-development.yaml
|
||||
|
||||
# Access the application
|
||||
kubectl port-forward svc/dev-datacenter-docs-api 8000:8000
|
||||
kubectl port-forward svc/dev-datacenter-docs-frontend 8080:80
|
||||
|
||||
# View API docs: http://localhost:8000/api/docs
|
||||
# View frontend: http://localhost:8080
|
||||
```
|
||||
|
||||
### Production Installation
|
||||
|
||||
```bash
|
||||
# Copy and customize production values
|
||||
cp datacenter-docs/values-production.yaml my-production-values.yaml
|
||||
|
||||
# Edit my-production-values.yaml:
|
||||
# - Change all secrets (llmApiKey, apiSecretKey, mongodbPassword)
|
||||
# - Update ingress hosts
|
||||
# - Adjust resource limits
|
||||
# - Configure LLM provider
|
||||
# - Review auto-remediation settings
|
||||
|
||||
# Install
|
||||
helm install prod ./datacenter-docs -f my-production-values.yaml
|
||||
|
||||
# Verify deployment
|
||||
helm list
|
||||
kubectl get pods
|
||||
kubectl get ingress
|
||||
```
|
||||
|
||||
## Chart Structure
|
||||
|
||||
```
|
||||
datacenter-docs/
|
||||
├── Chart.yaml # Chart metadata
|
||||
├── values.yaml # Default configuration
|
||||
├── values-development.yaml # Development settings
|
||||
├── values-production.yaml # Production example
|
||||
├── README.md # Detailed chart documentation
|
||||
├── .helmignore # Files to exclude from package
|
||||
└── templates/
|
||||
├── NOTES.txt # Post-install instructions
|
||||
├── _helpers.tpl # Template helpers
|
||||
├── configmap.yaml # Application configuration
|
||||
├── secrets.yaml # Sensitive data
|
||||
├── serviceaccount.yaml # Service account
|
||||
├── mongodb-statefulset.yaml # MongoDB StatefulSet
|
||||
├── mongodb-service.yaml # MongoDB Service
|
||||
├── redis-deployment.yaml # Redis Deployment
|
||||
├── redis-service.yaml # Redis Service
|
||||
├── api-deployment.yaml # API Deployment
|
||||
├── api-service.yaml # API Service
|
||||
├── api-hpa.yaml # API autoscaling
|
||||
├── chat-deployment.yaml # Chat Deployment
|
||||
├── chat-service.yaml # Chat Service
|
||||
├── worker-deployment.yaml # Worker Deployment
|
||||
├── worker-hpa.yaml # Worker autoscaling
|
||||
├── frontend-deployment.yaml # Frontend Deployment
|
||||
├── frontend-service.yaml # Frontend Service
|
||||
└── ingress.yaml # Ingress configuration
|
||||
```
|
||||
|
||||
## Testing the Chart
|
||||
|
||||
Run the automated test script:
|
||||
|
||||
```bash
|
||||
cd deploy/helm
|
||||
./test-chart.sh
|
||||
```
|
||||
|
||||
This will:
|
||||
1. Lint the chart
|
||||
2. Render templates with different value files
|
||||
3. Perform dry-run installation
|
||||
4. Validate Kubernetes manifests
|
||||
5. Package the chart
|
||||
|
||||
## Common Operations
|
||||
|
||||
### Upgrade Release
|
||||
|
||||
```bash
|
||||
# Upgrade with new values
|
||||
helm upgrade prod ./datacenter-docs -f my-production-values.yaml
|
||||
|
||||
# Upgrade with specific parameter changes
|
||||
helm upgrade prod ./datacenter-docs --set api.replicaCount=10 --reuse-values
|
||||
```
|
||||
|
||||
### Check Status
|
||||
|
||||
```bash
|
||||
# List releases
|
||||
helm list
|
||||
|
||||
# Get release status
|
||||
helm status prod
|
||||
|
||||
# Get current values
|
||||
helm get values prod
|
||||
|
||||
# Get all manifests
|
||||
helm get manifest prod
|
||||
```
|
||||
|
||||
### Rollback
|
||||
|
||||
```bash
|
||||
# View revision history
|
||||
helm history prod
|
||||
|
||||
# Rollback to previous version
|
||||
helm rollback prod
|
||||
|
||||
# Rollback to specific revision
|
||||
helm rollback prod 2
|
||||
```
|
||||
|
||||
### Uninstall
|
||||
|
||||
```bash
|
||||
# Uninstall release
|
||||
helm uninstall prod
|
||||
|
||||
# Also delete PVCs (if using persistent storage)
|
||||
kubectl delete pvc -l app.kubernetes.io/instance=prod
|
||||
```
|
||||
|
||||
## Configuration Files
|
||||
|
||||
### values.yaml
|
||||
Default configuration with reasonable settings for development/testing.
|
||||
|
||||
### values-development.yaml
|
||||
Optimized for local development:
|
||||
- Minimal resource requests/limits
|
||||
- Single replicas
|
||||
- Persistence disabled
|
||||
- Dry-run mode for auto-remediation
|
||||
- Debug logging
|
||||
- Ingress disabled (use port-forward)
|
||||
|
||||
### values-production.yaml
|
||||
Example production configuration:
|
||||
- Higher resource limits
|
||||
- Multiple replicas
|
||||
- Autoscaling enabled
|
||||
- Persistence enabled with larger volumes
|
||||
- TLS/SSL enabled
|
||||
- Production-grade security settings
|
||||
- All components enabled
|
||||
|
||||
**Important**: Copy and customize this file for your environment. Never use default secrets!
|
||||
|
||||
## Available Components
|
||||
|
||||
| Component | Purpose | Default Enabled |
|
||||
|-----------|---------|-----------------|
|
||||
| MongoDB | Document database | Yes |
|
||||
| Redis | Cache & task queue | Yes |
|
||||
| API | REST API service | Yes |
|
||||
| Chat | WebSocket server | No (not implemented) |
|
||||
| Worker | Celery background tasks | No (not implemented) |
|
||||
| Frontend | Web UI | Yes |
|
||||
|
||||
Enable/disable components in your values file:
|
||||
|
||||
```yaml
|
||||
mongodb:
|
||||
enabled: true
|
||||
redis:
|
||||
enabled: true
|
||||
api:
|
||||
enabled: true
|
||||
chat:
|
||||
enabled: false # Set to true when implemented
|
||||
worker:
|
||||
enabled: false # Set to true when implemented
|
||||
frontend:
|
||||
enabled: true
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
||||
The chart deploys a complete microservices architecture:
|
||||
|
||||
```
|
||||
┌─────────────┐
|
||||
│ Ingress │
|
||||
└──────┬──────┘
|
||||
│
|
||||
┌─────────────┼─────────────┐
|
||||
│ │ │
|
||||
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
|
||||
│Frontend │ │ API │ │ Chat │
|
||||
└─────────┘ └────┬────┘ └────┬────┘
|
||||
│ │
|
||||
┌─────────────┼────────────┘
|
||||
│ │
|
||||
┌────▼────┐ ┌────▼────┐
|
||||
│ Redis │ │ MongoDB │
|
||||
└─────────┘ └─────────┘
|
||||
▲
|
||||
│
|
||||
┌────┴────┐
|
||||
│ Worker │
|
||||
└─────────┘
|
||||
```
|
||||
|
||||
## LLM Provider Configuration
|
||||
|
||||
The chart supports multiple LLM providers. Configure in your values file:
|
||||
|
||||
### OpenAI
|
||||
|
||||
```yaml
|
||||
config:
|
||||
llm:
|
||||
baseUrl: "https://api.openai.com/v1"
|
||||
model: "gpt-4-turbo-preview"
|
||||
secrets:
|
||||
llmApiKey: "sk-your-openai-key"
|
||||
```
|
||||
|
||||
### Anthropic Claude
|
||||
|
||||
```yaml
|
||||
config:
|
||||
llm:
|
||||
baseUrl: "https://api.anthropic.com/v1"
|
||||
model: "claude-3-opus-20240229"
|
||||
secrets:
|
||||
llmApiKey: "sk-ant-your-anthropic-key"
|
||||
```
|
||||
|
||||
### Local (Ollama)
|
||||
|
||||
```yaml
|
||||
config:
|
||||
llm:
|
||||
baseUrl: "http://ollama-service:11434/v1"
|
||||
model: "llama2"
|
||||
secrets:
|
||||
llmApiKey: "not-needed"
|
||||
```
|
||||
|
||||
### Azure OpenAI
|
||||
|
||||
```yaml
|
||||
config:
|
||||
llm:
|
||||
baseUrl: "https://your-resource.openai.azure.com"
|
||||
model: "gpt-4"
|
||||
secrets:
|
||||
llmApiKey: "your-azure-key"
|
||||
```
|
||||
|
||||
## Security Best Practices
|
||||
|
||||
For production deployments:
|
||||
|
||||
1. **Change all default secrets**
|
||||
```bash
|
||||
helm install prod ./datacenter-docs \
|
||||
--set secrets.llmApiKey="your-actual-key" \
|
||||
--set secrets.apiSecretKey="$(openssl rand -base64 32)" \
|
||||
--set secrets.mongodbPassword="$(openssl rand -base64 32)"
|
||||
```
|
||||
|
||||
2. **Use external secret management**
|
||||
- HashiCorp Vault
|
||||
- AWS Secrets Manager
|
||||
- Azure Key Vault
|
||||
- Kubernetes External Secrets Operator
|
||||
|
||||
3. **Enable TLS/SSL**
|
||||
```yaml
|
||||
ingress:
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
tls:
|
||||
- secretName: datacenter-docs-tls
|
||||
hosts:
|
||||
- datacenter-docs.yourdomain.com
|
||||
```
|
||||
|
||||
4. **Review auto-remediation settings**
|
||||
```yaml
|
||||
config:
|
||||
autoRemediation:
|
||||
enabled: true
|
||||
minReliabilityScore: 95.0 # High threshold for production
|
||||
dryRun: true # Test first, then set to false
|
||||
```
|
||||
|
||||
5. **Implement network policies**
|
||||
6. **Enable resource quotas**
|
||||
7. **Regular security scanning**
|
||||
|
||||
## Monitoring and Observability
|
||||
|
||||
The chart is designed to integrate with:
|
||||
- **Prometheus**: Metrics collection
|
||||
- **Grafana**: Visualization
|
||||
- **Jaeger**: Distributed tracing
|
||||
- **ELK/Loki**: Log aggregation
|
||||
|
||||
Add annotations to enable monitoring:
|
||||
|
||||
```yaml
|
||||
podAnnotations:
|
||||
prometheus.io/scrape: "true"
|
||||
prometheus.io/port: "8000"
|
||||
prometheus.io/path: "/metrics"
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Pods not starting
|
||||
|
||||
```bash
|
||||
# Check pod status
|
||||
kubectl get pods -l app.kubernetes.io/instance=prod
|
||||
|
||||
# Describe pod for events
|
||||
kubectl describe pod <pod-name>
|
||||
|
||||
# View logs
|
||||
kubectl logs <pod-name> -f
|
||||
```
|
||||
|
||||
### Storage issues
|
||||
|
||||
```bash
|
||||
# Check PVC status
|
||||
kubectl get pvc
|
||||
|
||||
# Check storage class
|
||||
kubectl get storageclass
|
||||
|
||||
# Manually create PVC if needed
|
||||
kubectl apply -f - <<EOF
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: mongodb-data
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 10Gi
|
||||
EOF
|
||||
```
|
||||
|
||||
### Ingress not working
|
||||
|
||||
```bash
|
||||
# Check ingress status
|
||||
kubectl get ingress
|
||||
kubectl describe ingress prod-datacenter-docs
|
||||
|
||||
# Check ingress controller logs
|
||||
kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller -f
|
||||
```
|
||||
|
||||
## Support
|
||||
|
||||
For detailed documentation, see:
|
||||
- Chart README: `datacenter-docs/README.md`
|
||||
- Main project: `../../README.md`
|
||||
- Issues: https://git.commandware.com/it-ops/llm-automation-docs-and-remediation-engine/issues
|
||||
|
||||
## License
|
||||
|
||||
See the main repository for license information.
|
||||
32
deploy/helm/datacenter-docs/.helmignore
Normal file
32
deploy/helm/datacenter-docs/.helmignore
Normal file
@@ -0,0 +1,32 @@
|
||||
# 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/
|
||||
# CI/CD
|
||||
.github/
|
||||
.gitlab-ci.yml
|
||||
.gitea/
|
||||
# Documentation
|
||||
README.md
|
||||
NOTES.md
|
||||
# Development files
|
||||
*.log
|
||||
19
deploy/helm/datacenter-docs/Chart.yaml
Normal file
19
deploy/helm/datacenter-docs/Chart.yaml
Normal file
@@ -0,0 +1,19 @@
|
||||
apiVersion: v2
|
||||
name: datacenter-docs
|
||||
description: A Helm chart for LLM Automation - Docs & Remediation Engine
|
||||
type: application
|
||||
version: 0.1.0
|
||||
appVersion: "0.1.0"
|
||||
keywords:
|
||||
- datacenter
|
||||
- documentation
|
||||
- ai
|
||||
- automation
|
||||
- remediation
|
||||
- llm
|
||||
maintainers:
|
||||
- name: Datacenter Docs Team
|
||||
home: https://git.commandware.com/it-ops/llm-automation-docs-and-remediation-engine
|
||||
sources:
|
||||
- https://git.commandware.com/it-ops/llm-automation-docs-and-remediation-engine
|
||||
dependencies: []
|
||||
423
deploy/helm/datacenter-docs/README.md
Normal file
423
deploy/helm/datacenter-docs/README.md
Normal file
@@ -0,0 +1,423 @@
|
||||
# Datacenter Docs & Remediation Engine - Helm Chart
|
||||
|
||||
Helm chart for deploying the LLM Automation - Docs & Remediation Engine on Kubernetes.
|
||||
|
||||
## Overview
|
||||
|
||||
This chart deploys a complete stack including:
|
||||
- **MongoDB**: Document database for storing tickets, documentation, and metadata
|
||||
- **Redis**: Cache and task queue backend
|
||||
- **API Service**: FastAPI REST API with auto-remediation capabilities
|
||||
- **Chat Service**: WebSocket server for real-time documentation queries (optional, not yet implemented)
|
||||
- **Worker Service**: Celery workers for background tasks (optional, not yet implemented)
|
||||
- **Frontend**: React-based web interface
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Kubernetes 1.19+
|
||||
- Helm 3.0+
|
||||
- PersistentVolume provisioner support in the underlying infrastructure (for MongoDB persistence)
|
||||
- Ingress controller (optional, for external access)
|
||||
|
||||
## Installation
|
||||
|
||||
### Quick Start
|
||||
|
||||
```bash
|
||||
# Add the chart repository (if published)
|
||||
helm repo add datacenter-docs https://your-repo-url
|
||||
helm repo update
|
||||
|
||||
# Install with default values
|
||||
helm install my-datacenter-docs datacenter-docs/datacenter-docs
|
||||
|
||||
# Or install from local directory
|
||||
helm install my-datacenter-docs ./datacenter-docs
|
||||
```
|
||||
|
||||
### Production Installation
|
||||
|
||||
For production, create a custom `values.yaml`:
|
||||
|
||||
```bash
|
||||
# Copy and edit the values file
|
||||
cp values.yaml my-values.yaml
|
||||
|
||||
# Edit my-values.yaml with your configuration
|
||||
# At minimum, change:
|
||||
# - secrets.llmApiKey
|
||||
# - secrets.apiSecretKey
|
||||
# - ingress.hosts
|
||||
|
||||
# Install with custom values
|
||||
helm install my-datacenter-docs ./datacenter-docs -f my-values.yaml
|
||||
```
|
||||
|
||||
### Install with Specific Configuration
|
||||
|
||||
```bash
|
||||
helm install my-datacenter-docs ./datacenter-docs \
|
||||
--set secrets.llmApiKey="sk-your-openai-api-key" \
|
||||
--set secrets.apiSecretKey="your-strong-secret-key" \
|
||||
--set ingress.hosts[0].host="datacenter-docs.yourdomain.com" \
|
||||
--set mongodb.persistence.size="50Gi"
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
### Key Configuration Parameters
|
||||
|
||||
#### Global Settings
|
||||
|
||||
| Parameter | Description | Default |
|
||||
|-----------|-------------|---------|
|
||||
| `global.imagePullPolicy` | Image pull policy | `IfNotPresent` |
|
||||
| `global.storageClass` | Storage class for PVCs | `""` |
|
||||
|
||||
#### MongoDB
|
||||
|
||||
| Parameter | Description | Default |
|
||||
|-----------|-------------|---------|
|
||||
| `mongodb.enabled` | Enable MongoDB | `true` |
|
||||
| `mongodb.image.repository` | MongoDB image | `mongo` |
|
||||
| `mongodb.image.tag` | MongoDB version | `7` |
|
||||
| `mongodb.auth.rootUsername` | Root username | `admin` |
|
||||
| `mongodb.auth.rootPassword` | Root password | `admin123` |
|
||||
| `mongodb.persistence.enabled` | Enable persistence | `true` |
|
||||
| `mongodb.persistence.size` | Volume size | `10Gi` |
|
||||
| `mongodb.resources.requests.memory` | Memory request | `512Mi` |
|
||||
| `mongodb.resources.limits.memory` | Memory limit | `2Gi` |
|
||||
|
||||
#### Redis
|
||||
|
||||
| Parameter | Description | Default |
|
||||
|-----------|-------------|---------|
|
||||
| `redis.enabled` | Enable Redis | `true` |
|
||||
| `redis.image.repository` | Redis image | `redis` |
|
||||
| `redis.image.tag` | Redis version | `7-alpine` |
|
||||
| `redis.resources.requests.memory` | Memory request | `128Mi` |
|
||||
| `redis.resources.limits.memory` | Memory limit | `512Mi` |
|
||||
|
||||
#### API Service
|
||||
|
||||
| Parameter | Description | Default |
|
||||
|-----------|-------------|---------|
|
||||
| `api.enabled` | Enable API service | `true` |
|
||||
| `api.replicaCount` | Number of replicas | `2` |
|
||||
| `api.image.repository` | API image repository | `datacenter-docs-api` |
|
||||
| `api.image.tag` | API image tag | `latest` |
|
||||
| `api.service.port` | Service port | `8000` |
|
||||
| `api.autoscaling.enabled` | Enable HPA | `true` |
|
||||
| `api.autoscaling.minReplicas` | Min replicas | `2` |
|
||||
| `api.autoscaling.maxReplicas` | Max replicas | `10` |
|
||||
| `api.resources.requests.memory` | Memory request | `512Mi` |
|
||||
| `api.resources.limits.memory` | Memory limit | `2Gi` |
|
||||
|
||||
#### Worker Service
|
||||
|
||||
| Parameter | Description | Default |
|
||||
|-----------|-------------|---------|
|
||||
| `worker.enabled` | Enable worker service | `false` |
|
||||
| `worker.replicaCount` | Number of replicas | `3` |
|
||||
| `worker.autoscaling.enabled` | Enable HPA | `true` |
|
||||
| `worker.autoscaling.minReplicas` | Min replicas | `1` |
|
||||
| `worker.autoscaling.maxReplicas` | Max replicas | `10` |
|
||||
|
||||
#### Chat Service
|
||||
|
||||
| Parameter | Description | Default |
|
||||
|-----------|-------------|---------|
|
||||
| `chat.enabled` | Enable chat service | `false` |
|
||||
| `chat.replicaCount` | Number of replicas | `1` |
|
||||
| `chat.service.port` | Service port | `8001` |
|
||||
|
||||
#### Frontend
|
||||
|
||||
| Parameter | Description | Default |
|
||||
|-----------|-------------|---------|
|
||||
| `frontend.enabled` | Enable frontend | `true` |
|
||||
| `frontend.replicaCount` | Number of replicas | `2` |
|
||||
| `frontend.service.port` | Service port | `80` |
|
||||
|
||||
#### Ingress
|
||||
|
||||
| Parameter | Description | Default |
|
||||
|-----------|-------------|---------|
|
||||
| `ingress.enabled` | Enable ingress | `true` |
|
||||
| `ingress.className` | Ingress class | `nginx` |
|
||||
| `ingress.hosts[0].host` | Hostname | `datacenter-docs.example.com` |
|
||||
| `ingress.tls[0].secretName` | TLS secret name | `datacenter-docs-tls` |
|
||||
|
||||
#### Application Configuration
|
||||
|
||||
| Parameter | Description | Default |
|
||||
|-----------|-------------|---------|
|
||||
| `config.llm.baseUrl` | LLM provider URL | `https://api.openai.com/v1` |
|
||||
| `config.llm.model` | LLM model | `gpt-4-turbo-preview` |
|
||||
| `config.autoRemediation.enabled` | Enable auto-remediation | `true` |
|
||||
| `config.autoRemediation.minReliabilityScore` | Min reliability score | `85.0` |
|
||||
| `config.autoRemediation.dryRun` | Dry run mode | `false` |
|
||||
| `config.logLevel` | Log level | `INFO` |
|
||||
|
||||
#### Secrets
|
||||
|
||||
| Parameter | Description | Default |
|
||||
|-----------|-------------|---------|
|
||||
| `secrets.llmApiKey` | LLM API key | `sk-your-openai-api-key-here` |
|
||||
| `secrets.apiSecretKey` | API secret key | `your-secret-key-here-change-in-production` |
|
||||
|
||||
**IMPORTANT**: Change these secrets in production!
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Enable All Services (including chat and worker)
|
||||
|
||||
```bash
|
||||
helm install my-datacenter-docs ./datacenter-docs \
|
||||
--set chat.enabled=true \
|
||||
--set worker.enabled=true
|
||||
```
|
||||
|
||||
### Disable Auto-Remediation
|
||||
|
||||
```bash
|
||||
helm install my-datacenter-docs ./datacenter-docs \
|
||||
--set config.autoRemediation.enabled=false
|
||||
```
|
||||
|
||||
### Use Different LLM Provider (e.g., Anthropic Claude)
|
||||
|
||||
```bash
|
||||
helm install my-datacenter-docs ./datacenter-docs \
|
||||
--set config.llm.baseUrl="https://api.anthropic.com/v1" \
|
||||
--set config.llm.model="claude-3-opus-20240229" \
|
||||
--set secrets.llmApiKey="sk-ant-your-anthropic-key"
|
||||
```
|
||||
|
||||
### Use Local LLM (e.g., Ollama)
|
||||
|
||||
```bash
|
||||
helm install my-datacenter-docs ./datacenter-docs \
|
||||
--set config.llm.baseUrl="http://ollama-service:11434/v1" \
|
||||
--set config.llm.model="llama2" \
|
||||
--set secrets.llmApiKey="not-needed"
|
||||
```
|
||||
|
||||
### Scale MongoDB Storage
|
||||
|
||||
```bash
|
||||
helm install my-datacenter-docs ./datacenter-docs \
|
||||
--set mongodb.persistence.size="100Gi"
|
||||
```
|
||||
|
||||
### Disable Ingress (use port-forward instead)
|
||||
|
||||
```bash
|
||||
helm install my-datacenter-docs ./datacenter-docs \
|
||||
--set ingress.enabled=false
|
||||
```
|
||||
|
||||
### Production Configuration with External MongoDB
|
||||
|
||||
```yaml
|
||||
# production-values.yaml
|
||||
mongodb:
|
||||
enabled: false
|
||||
|
||||
config:
|
||||
mongodbUrl: "mongodb://user:pass@external-mongodb:27017/datacenter_docs?authSource=admin"
|
||||
|
||||
api:
|
||||
replicaCount: 5
|
||||
autoscaling:
|
||||
maxReplicas: 20
|
||||
|
||||
secrets:
|
||||
llmApiKey: "sk-your-production-api-key"
|
||||
apiSecretKey: "your-production-secret-key"
|
||||
|
||||
ingress:
|
||||
hosts:
|
||||
- host: "datacenter-docs.prod.yourdomain.com"
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
service: frontend
|
||||
- path: /api
|
||||
pathType: Prefix
|
||||
service: api
|
||||
```
|
||||
|
||||
```bash
|
||||
helm install prod-datacenter-docs ./datacenter-docs -f production-values.yaml
|
||||
```
|
||||
|
||||
## Upgrading
|
||||
|
||||
```bash
|
||||
# Upgrade with new values
|
||||
helm upgrade my-datacenter-docs ./datacenter-docs -f my-values.yaml
|
||||
|
||||
# Upgrade specific parameters
|
||||
helm upgrade my-datacenter-docs ./datacenter-docs \
|
||||
--set api.image.tag="v1.2.0" \
|
||||
--reuse-values
|
||||
```
|
||||
|
||||
## Uninstallation
|
||||
|
||||
```bash
|
||||
helm uninstall my-datacenter-docs
|
||||
```
|
||||
|
||||
**Note**: This will delete all resources except PersistentVolumeClaims (PVCs) for MongoDB. To also delete PVCs:
|
||||
|
||||
```bash
|
||||
kubectl delete pvc -l app.kubernetes.io/instance=my-datacenter-docs
|
||||
```
|
||||
|
||||
## Monitoring and Troubleshooting
|
||||
|
||||
### Check Pod Status
|
||||
|
||||
```bash
|
||||
kubectl get pods -l app.kubernetes.io/instance=my-datacenter-docs
|
||||
```
|
||||
|
||||
### View Logs
|
||||
|
||||
```bash
|
||||
# API logs
|
||||
kubectl logs -l app.kubernetes.io/component=api -f
|
||||
|
||||
# Worker logs
|
||||
kubectl logs -l app.kubernetes.io/component=worker -f
|
||||
|
||||
# MongoDB logs
|
||||
kubectl logs -l app.kubernetes.io/component=database -f
|
||||
```
|
||||
|
||||
### Access Services Locally
|
||||
|
||||
```bash
|
||||
# API
|
||||
kubectl port-forward svc/my-datacenter-docs-api 8000:8000
|
||||
|
||||
# Frontend
|
||||
kubectl port-forward svc/my-datacenter-docs-frontend 8080:80
|
||||
|
||||
# MongoDB (for debugging)
|
||||
kubectl port-forward svc/my-datacenter-docs-mongodb 27017:27017
|
||||
```
|
||||
|
||||
### Common Issues
|
||||
|
||||
#### Pods Stuck in Pending
|
||||
|
||||
Check if PVCs are bound:
|
||||
```bash
|
||||
kubectl get pvc
|
||||
```
|
||||
|
||||
If storage class is missing, set it:
|
||||
```bash
|
||||
helm upgrade my-datacenter-docs ./datacenter-docs \
|
||||
--set mongodb.persistence.storageClass="standard" \
|
||||
--reuse-values
|
||||
```
|
||||
|
||||
#### API Pods Crash Loop
|
||||
|
||||
Check logs:
|
||||
```bash
|
||||
kubectl logs -l app.kubernetes.io/component=api --tail=100
|
||||
```
|
||||
|
||||
Common causes:
|
||||
- MongoDB not ready (wait for init containers)
|
||||
- Invalid LLM API key
|
||||
- Missing environment variables
|
||||
|
||||
#### Cannot Access via Ingress
|
||||
|
||||
Check ingress status:
|
||||
```bash
|
||||
kubectl get ingress
|
||||
kubectl describe ingress my-datacenter-docs
|
||||
```
|
||||
|
||||
Ensure:
|
||||
- Ingress controller is installed
|
||||
- DNS points to ingress IP
|
||||
- TLS certificate is valid (if using HTTPS)
|
||||
|
||||
## Security Considerations
|
||||
|
||||
### Production Checklist
|
||||
|
||||
- [ ] Change `secrets.llmApiKey` to a valid API key
|
||||
- [ ] Change `secrets.apiSecretKey` to a strong random key
|
||||
- [ ] Change MongoDB credentials (`mongodb.auth.rootPassword`)
|
||||
- [ ] Enable TLS/SSL on ingress
|
||||
- [ ] Review RBAC policies
|
||||
- [ ] Use external secret management (e.g., HashiCorp Vault, AWS Secrets Manager)
|
||||
- [ ] Enable network policies
|
||||
- [ ] Set resource limits on all pods
|
||||
- [ ] Enable pod security policies
|
||||
- [ ] Review auto-remediation settings
|
||||
|
||||
### Using External Secrets
|
||||
|
||||
Instead of storing secrets in values.yaml, use Kubernetes secrets:
|
||||
|
||||
```bash
|
||||
# Create secret
|
||||
kubectl create secret generic datacenter-docs-secrets \
|
||||
--from-literal=llm-api-key="sk-your-key" \
|
||||
--from-literal=api-secret-key="your-secret"
|
||||
|
||||
# Modify templates to use existing secret
|
||||
# (requires chart customization)
|
||||
```
|
||||
|
||||
## Development
|
||||
|
||||
### Validating the Chart
|
||||
|
||||
```bash
|
||||
# Lint the chart
|
||||
helm lint ./datacenter-docs
|
||||
|
||||
# Dry run
|
||||
helm install my-test ./datacenter-docs --dry-run --debug
|
||||
|
||||
# Template rendering
|
||||
helm template my-test ./datacenter-docs > rendered.yaml
|
||||
```
|
||||
|
||||
### Testing Locally
|
||||
|
||||
```bash
|
||||
# Create kind cluster
|
||||
kind create cluster
|
||||
|
||||
# Install chart
|
||||
helm install test ./datacenter-docs \
|
||||
--set ingress.enabled=false \
|
||||
--set api.autoscaling.enabled=false \
|
||||
--set mongodb.persistence.enabled=false
|
||||
|
||||
# Test
|
||||
kubectl port-forward svc/test-datacenter-docs-api 8000:8000
|
||||
curl http://localhost:8000/health
|
||||
```
|
||||
|
||||
## Support
|
||||
|
||||
For issues and questions:
|
||||
- Issues: https://git.commandware.com/it-ops/llm-automation-docs-and-remediation-engine/issues
|
||||
- Documentation: https://git.commandware.com/it-ops/llm-automation-docs-and-remediation-engine
|
||||
|
||||
## License
|
||||
|
||||
See the main repository for license information.
|
||||
162
deploy/helm/datacenter-docs/templates/NOTES.txt
Normal file
162
deploy/helm/datacenter-docs/templates/NOTES.txt
Normal file
@@ -0,0 +1,162 @@
|
||||
█████████████████████████████████████████████████████████████████████████████
|
||||
█ █
|
||||
█ Datacenter Docs & Remediation Engine - Successfully Deployed! █
|
||||
█ █
|
||||
█████████████████████████████████████████████████████████████████████████████
|
||||
|
||||
Thank you for installing {{ .Chart.Name }}.
|
||||
|
||||
Your release is named {{ .Release.Name }}.
|
||||
Release namespace: {{ .Release.Namespace }}
|
||||
|
||||
==============================================================================
|
||||
📦 INSTALLED COMPONENTS:
|
||||
==============================================================================
|
||||
|
||||
{{- if .Values.mongodb.enabled }}
|
||||
✓ MongoDB (Database)
|
||||
{{- end }}
|
||||
{{- if .Values.redis.enabled }}
|
||||
✓ Redis (Cache & Task Queue)
|
||||
{{- end }}
|
||||
{{- if .Values.api.enabled }}
|
||||
✓ API Service
|
||||
{{- end }}
|
||||
{{- if .Values.chat.enabled }}
|
||||
✓ Chat Service (WebSocket)
|
||||
{{- end }}
|
||||
{{- if .Values.worker.enabled }}
|
||||
✓ Celery Worker (Background Tasks)
|
||||
{{- end }}
|
||||
{{- if .Values.frontend.enabled }}
|
||||
✓ Frontend (Web UI)
|
||||
{{- end }}
|
||||
|
||||
==============================================================================
|
||||
🔍 CHECK DEPLOYMENT STATUS:
|
||||
==============================================================================
|
||||
|
||||
kubectl get pods -n {{ .Release.Namespace }} -l app.kubernetes.io/instance={{ .Release.Name }}
|
||||
|
||||
kubectl get services -n {{ .Release.Namespace }} -l app.kubernetes.io/instance={{ .Release.Name }}
|
||||
|
||||
==============================================================================
|
||||
🌐 ACCESS YOUR APPLICATION:
|
||||
==============================================================================
|
||||
|
||||
{{- if .Values.ingress.enabled }}
|
||||
{{- range $host := .Values.ingress.hosts }}
|
||||
{{ if $.Values.ingress.tls }}https{{ else }}http{{ end }}://{{ $host.host }}
|
||||
{{- end }}
|
||||
{{- else if .Values.frontend.enabled }}
|
||||
|
||||
To access the frontend, run:
|
||||
|
||||
kubectl port-forward -n {{ .Release.Namespace }} svc/{{ include "datacenter-docs.frontend.fullname" . }} 8080:{{ .Values.frontend.service.port }}
|
||||
|
||||
Then visit: http://localhost:8080
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.api.enabled }}
|
||||
|
||||
To access the API directly, run:
|
||||
|
||||
kubectl port-forward -n {{ .Release.Namespace }} svc/{{ include "datacenter-docs.api.fullname" . }} 8000:{{ .Values.api.service.port }}
|
||||
|
||||
Then visit: http://localhost:8000/api/docs (OpenAPI documentation)
|
||||
{{- end }}
|
||||
|
||||
==============================================================================
|
||||
📊 VIEW LOGS:
|
||||
==============================================================================
|
||||
|
||||
API logs:
|
||||
kubectl logs -n {{ .Release.Namespace }} -l app.kubernetes.io/component=api -f
|
||||
|
||||
{{- if .Values.worker.enabled }}
|
||||
Worker logs:
|
||||
kubectl logs -n {{ .Release.Namespace }} -l app.kubernetes.io/component=worker -f
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.chat.enabled }}
|
||||
Chat logs:
|
||||
kubectl logs -n {{ .Release.Namespace }} -l app.kubernetes.io/component=chat -f
|
||||
{{- end }}
|
||||
|
||||
==============================================================================
|
||||
🔐 SECURITY NOTICE:
|
||||
==============================================================================
|
||||
|
||||
{{ if eq .Values.secrets.llmApiKey "sk-your-openai-api-key-here" }}
|
||||
⚠️ WARNING: You are using the default LLM API key!
|
||||
Update this immediately in production:
|
||||
|
||||
helm upgrade {{ .Release.Name }} datacenter-docs \
|
||||
--set secrets.llmApiKey="your-actual-api-key" \
|
||||
--reuse-values
|
||||
{{ end }}
|
||||
|
||||
{{ if eq .Values.secrets.apiSecretKey "your-secret-key-here-change-in-production" }}
|
||||
⚠️ WARNING: You are using the default API secret key!
|
||||
Update this immediately in production:
|
||||
|
||||
helm upgrade {{ .Release.Name }} datacenter-docs \
|
||||
--set secrets.apiSecretKey="your-actual-secret-key" \
|
||||
--reuse-values
|
||||
{{ end }}
|
||||
|
||||
For production deployments:
|
||||
- Use strong, unique secrets
|
||||
- Enable TLS/SSL for all services
|
||||
- Review security context and RBAC policies
|
||||
- Consider using external secret management (e.g., HashiCorp Vault)
|
||||
|
||||
==============================================================================
|
||||
📖 USEFUL COMMANDS:
|
||||
==============================================================================
|
||||
|
||||
Upgrade release:
|
||||
helm upgrade {{ .Release.Name }} datacenter-docs --values custom-values.yaml
|
||||
|
||||
Get values:
|
||||
helm get values {{ .Release.Name }}
|
||||
|
||||
View all resources:
|
||||
helm get manifest {{ .Release.Name }}
|
||||
|
||||
Uninstall:
|
||||
helm uninstall {{ .Release.Name }}
|
||||
|
||||
==============================================================================
|
||||
🛠️ CONFIGURATION:
|
||||
==============================================================================
|
||||
|
||||
{{- if .Values.config.autoRemediation.enabled }}
|
||||
✓ Auto-remediation: ENABLED
|
||||
- Minimum reliability score: {{ .Values.config.autoRemediation.minReliabilityScore }}%
|
||||
- Approval threshold: {{ .Values.config.autoRemediation.requireApprovalThreshold }}%
|
||||
{{- if .Values.config.autoRemediation.dryRun }}
|
||||
- Mode: DRY RUN (no actual changes will be made)
|
||||
{{- else }}
|
||||
- Mode: ACTIVE (changes will be applied)
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
⚠️ Auto-remediation: DISABLED
|
||||
{{- end }}
|
||||
|
||||
LLM Provider: {{ .Values.config.llm.baseUrl }}
|
||||
Model: {{ .Values.config.llm.model }}
|
||||
|
||||
==============================================================================
|
||||
📚 DOCUMENTATION & SUPPORT:
|
||||
==============================================================================
|
||||
|
||||
For more information, visit:
|
||||
https://git.commandware.com/it-ops/llm-automation-docs-and-remediation-engine
|
||||
|
||||
Report issues:
|
||||
https://git.commandware.com/it-ops/llm-automation-docs-and-remediation-engine/issues
|
||||
|
||||
==============================================================================
|
||||
|
||||
Happy automating! 🚀
|
||||
235
deploy/helm/datacenter-docs/templates/_helpers.tpl
Normal file
235
deploy/helm/datacenter-docs/templates/_helpers.tpl
Normal file
@@ -0,0 +1,235 @@
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "datacenter-docs.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
*/}}
|
||||
{{- define "datacenter-docs.fullname" -}}
|
||||
{{- if .Values.fullnameOverride }}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||
{{- if contains $name .Release.Name }}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "datacenter-docs.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "datacenter-docs.labels" -}}
|
||||
helm.sh/chart: {{ include "datacenter-docs.chart" . }}
|
||||
{{ include "datacenter-docs.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "datacenter-docs.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "datacenter-docs.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "datacenter-docs.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
{{- default (include "datacenter-docs.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else }}
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
MongoDB fullname
|
||||
*/}}
|
||||
{{- define "datacenter-docs.mongodb.fullname" -}}
|
||||
{{- printf "%s-mongodb" (include "datacenter-docs.fullname" .) | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Redis fullname
|
||||
*/}}
|
||||
{{- define "datacenter-docs.redis.fullname" -}}
|
||||
{{- printf "%s-redis" (include "datacenter-docs.fullname" .) | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
API fullname
|
||||
*/}}
|
||||
{{- define "datacenter-docs.api.fullname" -}}
|
||||
{{- printf "%s-api" (include "datacenter-docs.fullname" .) | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Chat fullname
|
||||
*/}}
|
||||
{{- define "datacenter-docs.chat.fullname" -}}
|
||||
{{- printf "%s-chat" (include "datacenter-docs.fullname" .) | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Worker fullname
|
||||
*/}}
|
||||
{{- define "datacenter-docs.worker.fullname" -}}
|
||||
{{- printf "%s-worker" (include "datacenter-docs.fullname" .) | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Frontend fullname
|
||||
*/}}
|
||||
{{- define "datacenter-docs.frontend.fullname" -}}
|
||||
{{- printf "%s-frontend" (include "datacenter-docs.fullname" .) | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Component labels for MongoDB
|
||||
*/}}
|
||||
{{- define "datacenter-docs.mongodb.labels" -}}
|
||||
{{ include "datacenter-docs.labels" . }}
|
||||
app.kubernetes.io/component: database
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Component labels for Redis
|
||||
*/}}
|
||||
{{- define "datacenter-docs.redis.labels" -}}
|
||||
{{ include "datacenter-docs.labels" . }}
|
||||
app.kubernetes.io/component: cache
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Component labels for API
|
||||
*/}}
|
||||
{{- define "datacenter-docs.api.labels" -}}
|
||||
{{ include "datacenter-docs.labels" . }}
|
||||
app.kubernetes.io/component: api
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Component labels for Chat
|
||||
*/}}
|
||||
{{- define "datacenter-docs.chat.labels" -}}
|
||||
{{ include "datacenter-docs.labels" . }}
|
||||
app.kubernetes.io/component: chat
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Component labels for Worker
|
||||
*/}}
|
||||
{{- define "datacenter-docs.worker.labels" -}}
|
||||
{{ include "datacenter-docs.labels" . }}
|
||||
app.kubernetes.io/component: worker
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Component labels for Frontend
|
||||
*/}}
|
||||
{{- define "datacenter-docs.frontend.labels" -}}
|
||||
{{ include "datacenter-docs.labels" . }}
|
||||
app.kubernetes.io/component: frontend
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels for MongoDB
|
||||
*/}}
|
||||
{{- define "datacenter-docs.mongodb.selectorLabels" -}}
|
||||
{{ include "datacenter-docs.selectorLabels" . }}
|
||||
app.kubernetes.io/component: database
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels for Redis
|
||||
*/}}
|
||||
{{- define "datacenter-docs.redis.selectorLabels" -}}
|
||||
{{ include "datacenter-docs.selectorLabels" . }}
|
||||
app.kubernetes.io/component: cache
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels for API
|
||||
*/}}
|
||||
{{- define "datacenter-docs.api.selectorLabels" -}}
|
||||
{{ include "datacenter-docs.selectorLabels" . }}
|
||||
app.kubernetes.io/component: api
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels for Chat
|
||||
*/}}
|
||||
{{- define "datacenter-docs.chat.selectorLabels" -}}
|
||||
{{ include "datacenter-docs.selectorLabels" . }}
|
||||
app.kubernetes.io/component: chat
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels for Worker
|
||||
*/}}
|
||||
{{- define "datacenter-docs.worker.selectorLabels" -}}
|
||||
{{ include "datacenter-docs.selectorLabels" . }}
|
||||
app.kubernetes.io/component: worker
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels for Frontend
|
||||
*/}}
|
||||
{{- define "datacenter-docs.frontend.selectorLabels" -}}
|
||||
{{ include "datacenter-docs.selectorLabels" . }}
|
||||
app.kubernetes.io/component: frontend
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Return the proper image name
|
||||
*/}}
|
||||
{{- define "datacenter-docs.image" -}}
|
||||
{{- $registryName := .registry -}}
|
||||
{{- $repositoryName := .repository -}}
|
||||
{{- $tag := .tag | toString -}}
|
||||
{{- if $registryName }}
|
||||
{{- printf "%s/%s:%s" $registryName $repositoryName $tag -}}
|
||||
{{- else }}
|
||||
{{- printf "%s:%s" $repositoryName $tag -}}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Return the proper Docker Image Registry Secret Names
|
||||
*/}}
|
||||
{{- define "datacenter-docs.imagePullSecrets" -}}
|
||||
{{- if .Values.global.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- range .Values.global.imagePullSecrets }}
|
||||
- name: {{ . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Return the appropriate apiVersion for HPA
|
||||
*/}}
|
||||
{{- define "datacenter-docs.hpa.apiVersion" -}}
|
||||
{{- if semverCompare ">=1.23-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||
{{- print "autoscaling/v2" -}}
|
||||
{{- else -}}
|
||||
{{- print "autoscaling/v2beta2" -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
120
deploy/helm/datacenter-docs/templates/api-deployment.yaml
Normal file
120
deploy/helm/datacenter-docs/templates/api-deployment.yaml
Normal file
@@ -0,0 +1,120 @@
|
||||
{{- if .Values.api.enabled }}
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.api.fullname" . }}
|
||||
labels:
|
||||
{{- include "datacenter-docs.api.labels" . | nindent 4 }}
|
||||
spec:
|
||||
{{- if not .Values.api.autoscaling.enabled }}
|
||||
replicas: {{ .Values.api.replicaCount }}
|
||||
{{- end }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "datacenter-docs.api.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "datacenter-docs.api.selectorLabels" . | nindent 8 }}
|
||||
annotations:
|
||||
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
|
||||
checksum/secret: {{ include (print $.Template.BasePath "/secrets.yaml") . | sha256sum }}
|
||||
{{- with .Values.podAnnotations }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- with .Values.global.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "datacenter-docs.serviceAccountName" . }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||
initContainers:
|
||||
- name: wait-for-mongodb
|
||||
image: busybox:1.36
|
||||
command:
|
||||
- sh
|
||||
- -c
|
||||
- |
|
||||
until nc -z {{ include "datacenter-docs.mongodb.fullname" . }} {{ .Values.mongodb.service.port }}; do
|
||||
echo "Waiting for MongoDB..."
|
||||
sleep 2
|
||||
done
|
||||
- name: wait-for-redis
|
||||
image: busybox:1.36
|
||||
command:
|
||||
- sh
|
||||
- -c
|
||||
- |
|
||||
until nc -z {{ include "datacenter-docs.redis.fullname" . }} {{ .Values.redis.service.port }}; do
|
||||
echo "Waiting for Redis..."
|
||||
sleep 2
|
||||
done
|
||||
containers:
|
||||
- name: api
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||
image: "{{ .Values.api.image.repository }}:{{ .Values.api.image.tag }}"
|
||||
imagePullPolicy: {{ .Values.api.image.pullPolicy }}
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: {{ .Values.api.service.targetPort }}
|
||||
protocol: TCP
|
||||
env:
|
||||
- name: MONGODB_URL
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-config
|
||||
key: mongodb-url
|
||||
- name: REDIS_URL
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-config
|
||||
key: redis-url
|
||||
- name: LLM_BASE_URL
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-config
|
||||
key: llm-base-url
|
||||
- name: LLM_MODEL
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-config
|
||||
key: llm-model
|
||||
- name: LLM_API_KEY
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-secrets
|
||||
key: llm-api-key
|
||||
- name: API_SECRET_KEY
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-secrets
|
||||
key: api-secret-key
|
||||
- name: LOG_LEVEL
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-config
|
||||
key: log-level
|
||||
- name: PYTHONPATH
|
||||
value: "/app/src"
|
||||
livenessProbe:
|
||||
{{- toYaml .Values.api.livenessProbe | nindent 12 }}
|
||||
readinessProbe:
|
||||
{{- toYaml .Values.api.readinessProbe | nindent 12 }}
|
||||
resources:
|
||||
{{- toYaml .Values.api.resources | nindent 12 }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
32
deploy/helm/datacenter-docs/templates/api-hpa.yaml
Normal file
32
deploy/helm/datacenter-docs/templates/api-hpa.yaml
Normal file
@@ -0,0 +1,32 @@
|
||||
{{- if and .Values.api.enabled .Values.api.autoscaling.enabled }}
|
||||
apiVersion: {{ include "datacenter-docs.hpa.apiVersion" . }}
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.api.fullname" . }}
|
||||
labels:
|
||||
{{- include "datacenter-docs.api.labels" . | nindent 4 }}
|
||||
spec:
|
||||
scaleTargetRef:
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
name: {{ include "datacenter-docs.api.fullname" . }}
|
||||
minReplicas: {{ .Values.api.autoscaling.minReplicas }}
|
||||
maxReplicas: {{ .Values.api.autoscaling.maxReplicas }}
|
||||
metrics:
|
||||
{{- if .Values.api.autoscaling.targetCPUUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: cpu
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: {{ .Values.api.autoscaling.targetCPUUtilizationPercentage }}
|
||||
{{- end }}
|
||||
{{- if .Values.api.autoscaling.targetMemoryUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: memory
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: {{ .Values.api.autoscaling.targetMemoryUtilizationPercentage }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
17
deploy/helm/datacenter-docs/templates/api-service.yaml
Normal file
17
deploy/helm/datacenter-docs/templates/api-service.yaml
Normal file
@@ -0,0 +1,17 @@
|
||||
{{- if .Values.api.enabled }}
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.api.fullname" . }}
|
||||
labels:
|
||||
{{- include "datacenter-docs.api.labels" . | nindent 4 }}
|
||||
spec:
|
||||
type: {{ .Values.api.service.type }}
|
||||
ports:
|
||||
- port: {{ .Values.api.service.port }}
|
||||
targetPort: http
|
||||
protocol: TCP
|
||||
name: http
|
||||
selector:
|
||||
{{- include "datacenter-docs.api.selectorLabels" . | nindent 4 }}
|
||||
{{- end }}
|
||||
94
deploy/helm/datacenter-docs/templates/chat-deployment.yaml
Normal file
94
deploy/helm/datacenter-docs/templates/chat-deployment.yaml
Normal file
@@ -0,0 +1,94 @@
|
||||
{{- if .Values.chat.enabled }}
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.chat.fullname" . }}
|
||||
labels:
|
||||
{{- include "datacenter-docs.chat.labels" . | nindent 4 }}
|
||||
spec:
|
||||
replicas: {{ .Values.chat.replicaCount }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "datacenter-docs.chat.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "datacenter-docs.chat.selectorLabels" . | nindent 8 }}
|
||||
annotations:
|
||||
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
|
||||
checksum/secret: {{ include (print $.Template.BasePath "/secrets.yaml") . | sha256sum }}
|
||||
{{- with .Values.podAnnotations }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- with .Values.global.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "datacenter-docs.serviceAccountName" . }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||
initContainers:
|
||||
- name: wait-for-mongodb
|
||||
image: busybox:1.36
|
||||
command:
|
||||
- sh
|
||||
- -c
|
||||
- |
|
||||
until nc -z {{ include "datacenter-docs.mongodb.fullname" . }} {{ .Values.mongodb.service.port }}; do
|
||||
echo "Waiting for MongoDB..."
|
||||
sleep 2
|
||||
done
|
||||
containers:
|
||||
- name: chat
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||
image: "{{ .Values.chat.image.repository }}:{{ .Values.chat.image.tag }}"
|
||||
imagePullPolicy: {{ .Values.chat.image.pullPolicy }}
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: {{ .Values.chat.service.targetPort }}
|
||||
protocol: TCP
|
||||
env:
|
||||
- name: MONGODB_URL
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-config
|
||||
key: mongodb-url
|
||||
- name: LLM_BASE_URL
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-config
|
||||
key: llm-base-url
|
||||
- name: LLM_MODEL
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-config
|
||||
key: llm-model
|
||||
- name: LLM_API_KEY
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-secrets
|
||||
key: llm-api-key
|
||||
- name: LOG_LEVEL
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-config
|
||||
key: log-level
|
||||
- name: PYTHONPATH
|
||||
value: "/app/src"
|
||||
resources:
|
||||
{{- toYaml .Values.chat.resources | nindent 12 }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
17
deploy/helm/datacenter-docs/templates/chat-service.yaml
Normal file
17
deploy/helm/datacenter-docs/templates/chat-service.yaml
Normal file
@@ -0,0 +1,17 @@
|
||||
{{- if .Values.chat.enabled }}
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.chat.fullname" . }}
|
||||
labels:
|
||||
{{- include "datacenter-docs.chat.labels" . | nindent 4 }}
|
||||
spec:
|
||||
type: {{ .Values.chat.service.type }}
|
||||
ports:
|
||||
- port: {{ .Values.chat.service.port }}
|
||||
targetPort: http
|
||||
protocol: TCP
|
||||
name: http
|
||||
selector:
|
||||
{{- include "datacenter-docs.chat.selectorLabels" . | nindent 4 }}
|
||||
{{- end }}
|
||||
37
deploy/helm/datacenter-docs/templates/configmap.yaml
Normal file
37
deploy/helm/datacenter-docs/templates/configmap.yaml
Normal file
@@ -0,0 +1,37 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-config
|
||||
labels:
|
||||
{{- include "datacenter-docs.labels" . | nindent 4 }}
|
||||
data:
|
||||
# MongoDB connection
|
||||
mongodb-url: {{ tpl .Values.config.mongodbUrl . | quote }}
|
||||
|
||||
# Redis connection
|
||||
redis-url: {{ tpl .Values.config.redisUrl . | quote }}
|
||||
|
||||
# LLM configuration
|
||||
llm-base-url: {{ .Values.config.llm.baseUrl | quote }}
|
||||
llm-model: {{ .Values.config.llm.model | quote }}
|
||||
llm-max-tokens: {{ .Values.config.llm.maxTokens | quote }}
|
||||
llm-temperature: {{ .Values.config.llm.temperature | quote }}
|
||||
|
||||
# MCP configuration
|
||||
mcp-base-url: {{ .Values.config.mcp.baseUrl | quote }}
|
||||
mcp-timeout: {{ .Values.config.mcp.timeout | quote }}
|
||||
|
||||
# Auto-remediation configuration
|
||||
auto-remediation-enabled: {{ .Values.config.autoRemediation.enabled | quote }}
|
||||
auto-remediation-min-reliability: {{ .Values.config.autoRemediation.minReliabilityScore | quote }}
|
||||
auto-remediation-approval-threshold: {{ .Values.config.autoRemediation.requireApprovalThreshold | quote }}
|
||||
auto-remediation-max-actions-per-hour: {{ .Values.config.autoRemediation.maxActionsPerHour | quote }}
|
||||
auto-remediation-dry-run: {{ .Values.config.autoRemediation.dryRun | quote }}
|
||||
|
||||
# Security configuration
|
||||
api-key-enabled: {{ .Values.config.apiKeyEnabled | quote }}
|
||||
cors-origins: {{ join "," .Values.config.corsOrigins | quote }}
|
||||
|
||||
# Logging configuration
|
||||
log-level: {{ .Values.config.logLevel | quote }}
|
||||
log-format: {{ .Values.config.logFormat | quote }}
|
||||
@@ -0,0 +1,69 @@
|
||||
{{- if .Values.frontend.enabled }}
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.frontend.fullname" . }}
|
||||
labels:
|
||||
{{- include "datacenter-docs.frontend.labels" . | nindent 4 }}
|
||||
spec:
|
||||
replicas: {{ .Values.frontend.replicaCount }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "datacenter-docs.frontend.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "datacenter-docs.frontend.selectorLabels" . | nindent 8 }}
|
||||
{{- with .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- with .Values.global.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "datacenter-docs.serviceAccountName" . }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||
containers:
|
||||
- name: frontend
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||
image: "{{ .Values.frontend.image.repository }}:{{ .Values.frontend.image.tag }}"
|
||||
imagePullPolicy: {{ .Values.frontend.image.pullPolicy }}
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: {{ .Values.frontend.service.targetPort }}
|
||||
protocol: TCP
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: http
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 10
|
||||
timeoutSeconds: 5
|
||||
failureThreshold: 3
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /
|
||||
port: http
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 5
|
||||
timeoutSeconds: 3
|
||||
failureThreshold: 3
|
||||
resources:
|
||||
{{- toYaml .Values.frontend.resources | nindent 12 }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
17
deploy/helm/datacenter-docs/templates/frontend-service.yaml
Normal file
17
deploy/helm/datacenter-docs/templates/frontend-service.yaml
Normal file
@@ -0,0 +1,17 @@
|
||||
{{- if .Values.frontend.enabled }}
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.frontend.fullname" . }}
|
||||
labels:
|
||||
{{- include "datacenter-docs.frontend.labels" . | nindent 4 }}
|
||||
spec:
|
||||
type: {{ .Values.frontend.service.type }}
|
||||
ports:
|
||||
- port: {{ .Values.frontend.service.port }}
|
||||
targetPort: http
|
||||
protocol: TCP
|
||||
name: http
|
||||
selector:
|
||||
{{- include "datacenter-docs.frontend.selectorLabels" . | nindent 4 }}
|
||||
{{- end }}
|
||||
57
deploy/helm/datacenter-docs/templates/ingress.yaml
Normal file
57
deploy/helm/datacenter-docs/templates/ingress.yaml
Normal file
@@ -0,0 +1,57 @@
|
||||
{{- if .Values.ingress.enabled -}}
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.fullname" . }}
|
||||
labels:
|
||||
{{- include "datacenter-docs.labels" . | nindent 4 }}
|
||||
{{- with .Values.ingress.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if .Values.ingress.className }}
|
||||
ingressClassName: {{ .Values.ingress.className }}
|
||||
{{- end }}
|
||||
{{- if .Values.ingress.tls }}
|
||||
tls:
|
||||
{{- range .Values.ingress.tls }}
|
||||
- hosts:
|
||||
{{- range .hosts }}
|
||||
- {{ . | quote }}
|
||||
{{- end }}
|
||||
secretName: {{ .secretName }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
rules:
|
||||
{{- range .Values.ingress.hosts }}
|
||||
- host: {{ .host | quote }}
|
||||
http:
|
||||
paths:
|
||||
{{- range .paths }}
|
||||
- path: {{ .path }}
|
||||
pathType: {{ .pathType }}
|
||||
backend:
|
||||
service:
|
||||
{{- if eq .service "frontend" }}
|
||||
name: {{ include "datacenter-docs.frontend.fullname" $ }}
|
||||
{{- else if eq .service "api" }}
|
||||
name: {{ include "datacenter-docs.api.fullname" $ }}
|
||||
{{- else if eq .service "chat" }}
|
||||
name: {{ include "datacenter-docs.chat.fullname" $ }}
|
||||
{{- else }}
|
||||
name: {{ .service }}
|
||||
{{- end }}
|
||||
port:
|
||||
{{- if eq .service "frontend" }}
|
||||
number: {{ $.Values.frontend.service.port }}
|
||||
{{- else if eq .service "api" }}
|
||||
number: {{ $.Values.api.service.port }}
|
||||
{{- else if eq .service "chat" }}
|
||||
number: {{ $.Values.chat.service.port }}
|
||||
{{- else }}
|
||||
number: 80
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
17
deploy/helm/datacenter-docs/templates/mongodb-service.yaml
Normal file
17
deploy/helm/datacenter-docs/templates/mongodb-service.yaml
Normal file
@@ -0,0 +1,17 @@
|
||||
{{- if .Values.mongodb.enabled }}
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.mongodb.fullname" . }}
|
||||
labels:
|
||||
{{- include "datacenter-docs.mongodb.labels" . | nindent 4 }}
|
||||
spec:
|
||||
type: {{ .Values.mongodb.service.type }}
|
||||
ports:
|
||||
- port: {{ .Values.mongodb.service.port }}
|
||||
targetPort: mongodb
|
||||
protocol: TCP
|
||||
name: mongodb
|
||||
selector:
|
||||
{{- include "datacenter-docs.mongodb.selectorLabels" . | nindent 4 }}
|
||||
{{- end }}
|
||||
113
deploy/helm/datacenter-docs/templates/mongodb-statefulset.yaml
Normal file
113
deploy/helm/datacenter-docs/templates/mongodb-statefulset.yaml
Normal file
@@ -0,0 +1,113 @@
|
||||
{{- if .Values.mongodb.enabled }}
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.mongodb.fullname" . }}
|
||||
labels:
|
||||
{{- include "datacenter-docs.mongodb.labels" . | nindent 4 }}
|
||||
spec:
|
||||
serviceName: {{ include "datacenter-docs.mongodb.fullname" . }}
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "datacenter-docs.mongodb.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "datacenter-docs.mongodb.selectorLabels" . | nindent 8 }}
|
||||
{{- with .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- with .Values.global.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "datacenter-docs.serviceAccountName" . }}
|
||||
securityContext:
|
||||
fsGroup: 999
|
||||
runAsUser: 999
|
||||
containers:
|
||||
- name: mongodb
|
||||
image: "{{ .Values.mongodb.image.repository }}:{{ .Values.mongodb.image.tag }}"
|
||||
imagePullPolicy: {{ .Values.mongodb.image.pullPolicy }}
|
||||
ports:
|
||||
- name: mongodb
|
||||
containerPort: 27017
|
||||
protocol: TCP
|
||||
env:
|
||||
- name: MONGO_INITDB_ROOT_USERNAME
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-secrets
|
||||
key: mongodb-username
|
||||
- name: MONGO_INITDB_ROOT_PASSWORD
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-secrets
|
||||
key: mongodb-password
|
||||
- name: MONGO_INITDB_DATABASE
|
||||
value: {{ .Values.mongodb.auth.database | quote }}
|
||||
livenessProbe:
|
||||
exec:
|
||||
command:
|
||||
- mongosh
|
||||
- --eval
|
||||
- "db.adminCommand('ping')"
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 10
|
||||
timeoutSeconds: 5
|
||||
failureThreshold: 3
|
||||
readinessProbe:
|
||||
exec:
|
||||
command:
|
||||
- mongosh
|
||||
- --eval
|
||||
- "db.adminCommand('ping')"
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 5
|
||||
timeoutSeconds: 3
|
||||
failureThreshold: 3
|
||||
resources:
|
||||
{{- toYaml .Values.mongodb.resources | nindent 12 }}
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /data/db
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.mongodb.persistence.enabled }}
|
||||
volumeClaimTemplates:
|
||||
- metadata:
|
||||
name: data
|
||||
labels:
|
||||
{{- include "datacenter-docs.mongodb.labels" . | nindent 10 }}
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
{{- if .Values.mongodb.persistence.storageClass }}
|
||||
{{- if (eq "-" .Values.mongodb.persistence.storageClass) }}
|
||||
storageClassName: ""
|
||||
{{- else }}
|
||||
storageClassName: {{ .Values.mongodb.persistence.storageClass | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.mongodb.persistence.size | quote }}
|
||||
{{- else }}
|
||||
volumes:
|
||||
- name: data
|
||||
emptyDir: {}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
70
deploy/helm/datacenter-docs/templates/redis-deployment.yaml
Normal file
70
deploy/helm/datacenter-docs/templates/redis-deployment.yaml
Normal file
@@ -0,0 +1,70 @@
|
||||
{{- if .Values.redis.enabled }}
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.redis.fullname" . }}
|
||||
labels:
|
||||
{{- include "datacenter-docs.redis.labels" . | nindent 4 }}
|
||||
spec:
|
||||
replicas: 1
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "datacenter-docs.redis.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "datacenter-docs.redis.selectorLabels" . | nindent 8 }}
|
||||
{{- with .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- with .Values.global.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "datacenter-docs.serviceAccountName" . }}
|
||||
securityContext:
|
||||
fsGroup: 999
|
||||
runAsUser: 999
|
||||
containers:
|
||||
- name: redis
|
||||
image: "{{ .Values.redis.image.repository }}:{{ .Values.redis.image.tag }}"
|
||||
imagePullPolicy: {{ .Values.redis.image.pullPolicy }}
|
||||
ports:
|
||||
- name: redis
|
||||
containerPort: 6379
|
||||
protocol: TCP
|
||||
livenessProbe:
|
||||
exec:
|
||||
command:
|
||||
- redis-cli
|
||||
- ping
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 10
|
||||
timeoutSeconds: 5
|
||||
failureThreshold: 3
|
||||
readinessProbe:
|
||||
exec:
|
||||
command:
|
||||
- redis-cli
|
||||
- ping
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 5
|
||||
timeoutSeconds: 3
|
||||
failureThreshold: 3
|
||||
resources:
|
||||
{{- toYaml .Values.redis.resources | nindent 12 }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
17
deploy/helm/datacenter-docs/templates/redis-service.yaml
Normal file
17
deploy/helm/datacenter-docs/templates/redis-service.yaml
Normal file
@@ -0,0 +1,17 @@
|
||||
{{- if .Values.redis.enabled }}
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.redis.fullname" . }}
|
||||
labels:
|
||||
{{- include "datacenter-docs.redis.labels" . | nindent 4 }}
|
||||
spec:
|
||||
type: {{ .Values.redis.service.type }}
|
||||
ports:
|
||||
- port: {{ .Values.redis.service.port }}
|
||||
targetPort: redis
|
||||
protocol: TCP
|
||||
name: redis
|
||||
selector:
|
||||
{{- include "datacenter-docs.redis.selectorLabels" . | nindent 4 }}
|
||||
{{- end }}
|
||||
17
deploy/helm/datacenter-docs/templates/secrets.yaml
Normal file
17
deploy/helm/datacenter-docs/templates/secrets.yaml
Normal file
@@ -0,0 +1,17 @@
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-secrets
|
||||
labels:
|
||||
{{- include "datacenter-docs.labels" . | nindent 4 }}
|
||||
type: Opaque
|
||||
stringData:
|
||||
# LLM API Key
|
||||
llm-api-key: {{ .Values.secrets.llmApiKey | quote }}
|
||||
|
||||
# API Secret Key
|
||||
api-secret-key: {{ .Values.secrets.apiSecretKey | quote }}
|
||||
|
||||
# MongoDB credentials
|
||||
mongodb-username: {{ .Values.secrets.mongodbUsername | quote }}
|
||||
mongodb-password: {{ .Values.secrets.mongodbPassword | quote }}
|
||||
13
deploy/helm/datacenter-docs/templates/serviceaccount.yaml
Normal file
13
deploy/helm/datacenter-docs/templates/serviceaccount.yaml
Normal file
@@ -0,0 +1,13 @@
|
||||
{{- if .Values.serviceAccount.create -}}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.serviceAccountName" . }}
|
||||
labels:
|
||||
{{- include "datacenter-docs.labels" . | nindent 4 }}
|
||||
{{- with .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
automountServiceAccountToken: true
|
||||
{{- end }}
|
||||
107
deploy/helm/datacenter-docs/templates/worker-deployment.yaml
Normal file
107
deploy/helm/datacenter-docs/templates/worker-deployment.yaml
Normal file
@@ -0,0 +1,107 @@
|
||||
{{- if .Values.worker.enabled }}
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.worker.fullname" . }}
|
||||
labels:
|
||||
{{- include "datacenter-docs.worker.labels" . | nindent 4 }}
|
||||
spec:
|
||||
{{- if not .Values.worker.autoscaling.enabled }}
|
||||
replicas: {{ .Values.worker.replicaCount }}
|
||||
{{- end }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "datacenter-docs.worker.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "datacenter-docs.worker.selectorLabels" . | nindent 8 }}
|
||||
annotations:
|
||||
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
|
||||
checksum/secret: {{ include (print $.Template.BasePath "/secrets.yaml") . | sha256sum }}
|
||||
{{- with .Values.podAnnotations }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- with .Values.global.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "datacenter-docs.serviceAccountName" . }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||
initContainers:
|
||||
- name: wait-for-mongodb
|
||||
image: busybox:1.36
|
||||
command:
|
||||
- sh
|
||||
- -c
|
||||
- |
|
||||
until nc -z {{ include "datacenter-docs.mongodb.fullname" . }} {{ .Values.mongodb.service.port }}; do
|
||||
echo "Waiting for MongoDB..."
|
||||
sleep 2
|
||||
done
|
||||
- name: wait-for-redis
|
||||
image: busybox:1.36
|
||||
command:
|
||||
- sh
|
||||
- -c
|
||||
- |
|
||||
until nc -z {{ include "datacenter-docs.redis.fullname" . }} {{ .Values.redis.service.port }}; do
|
||||
echo "Waiting for Redis..."
|
||||
sleep 2
|
||||
done
|
||||
containers:
|
||||
- name: worker
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||
image: "{{ .Values.worker.image.repository }}:{{ .Values.worker.image.tag }}"
|
||||
imagePullPolicy: {{ .Values.worker.image.pullPolicy }}
|
||||
env:
|
||||
- name: MONGODB_URL
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-config
|
||||
key: mongodb-url
|
||||
- name: REDIS_URL
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-config
|
||||
key: redis-url
|
||||
- name: LLM_BASE_URL
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-config
|
||||
key: llm-base-url
|
||||
- name: LLM_MODEL
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-config
|
||||
key: llm-model
|
||||
- name: LLM_API_KEY
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-secrets
|
||||
key: llm-api-key
|
||||
- name: LOG_LEVEL
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: {{ include "datacenter-docs.fullname" . }}-config
|
||||
key: log-level
|
||||
- name: PYTHONPATH
|
||||
value: "/app/src"
|
||||
resources:
|
||||
{{- toYaml .Values.worker.resources | nindent 12 }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
24
deploy/helm/datacenter-docs/templates/worker-hpa.yaml
Normal file
24
deploy/helm/datacenter-docs/templates/worker-hpa.yaml
Normal file
@@ -0,0 +1,24 @@
|
||||
{{- if and .Values.worker.enabled .Values.worker.autoscaling.enabled }}
|
||||
apiVersion: {{ include "datacenter-docs.hpa.apiVersion" . }}
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: {{ include "datacenter-docs.worker.fullname" . }}
|
||||
labels:
|
||||
{{- include "datacenter-docs.worker.labels" . | nindent 4 }}
|
||||
spec:
|
||||
scaleTargetRef:
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
name: {{ include "datacenter-docs.worker.fullname" . }}
|
||||
minReplicas: {{ .Values.worker.autoscaling.minReplicas }}
|
||||
maxReplicas: {{ .Values.worker.autoscaling.maxReplicas }}
|
||||
metrics:
|
||||
{{- if .Values.worker.autoscaling.targetCPUUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: cpu
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: {{ .Values.worker.autoscaling.targetCPUUtilizationPercentage }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
181
deploy/helm/datacenter-docs/values-development.yaml
Normal file
181
deploy/helm/datacenter-docs/values-development.yaml
Normal file
@@ -0,0 +1,181 @@
|
||||
# Development values for datacenter-docs
|
||||
# This configuration is optimized for local development and testing
|
||||
# Use with: helm install dev ./datacenter-docs -f values-development.yaml
|
||||
|
||||
global:
|
||||
imagePullPolicy: IfNotPresent
|
||||
storageClass: ""
|
||||
|
||||
# MongoDB - minimal resources for development
|
||||
mongodb:
|
||||
enabled: true
|
||||
image:
|
||||
repository: mongo
|
||||
tag: "7"
|
||||
pullPolicy: IfNotPresent
|
||||
auth:
|
||||
rootUsername: admin
|
||||
rootPassword: admin123
|
||||
database: datacenter_docs
|
||||
persistence:
|
||||
enabled: false # Use emptyDir for faster testing
|
||||
size: 1Gi
|
||||
resources:
|
||||
requests:
|
||||
memory: "256Mi"
|
||||
cpu: "100m"
|
||||
limits:
|
||||
memory: "512Mi"
|
||||
cpu: "500m"
|
||||
|
||||
# Redis - minimal resources
|
||||
redis:
|
||||
enabled: true
|
||||
resources:
|
||||
requests:
|
||||
memory: "64Mi"
|
||||
cpu: "50m"
|
||||
limits:
|
||||
memory: "256Mi"
|
||||
cpu: "200m"
|
||||
|
||||
# API service - single replica for development
|
||||
api:
|
||||
enabled: true
|
||||
replicaCount: 1
|
||||
image:
|
||||
repository: datacenter-docs-api
|
||||
tag: "latest"
|
||||
pullPolicy: IfNotPresent
|
||||
service:
|
||||
type: ClusterIP
|
||||
port: 8000
|
||||
resources:
|
||||
requests:
|
||||
memory: "256Mi"
|
||||
cpu: "100m"
|
||||
limits:
|
||||
memory: "1Gi"
|
||||
cpu: "500m"
|
||||
autoscaling:
|
||||
enabled: false # Disable for development
|
||||
|
||||
# Chat service - disabled by default (not implemented)
|
||||
chat:
|
||||
enabled: false
|
||||
|
||||
# Worker service - disabled by default (not implemented)
|
||||
worker:
|
||||
enabled: false
|
||||
|
||||
# Frontend - single replica
|
||||
frontend:
|
||||
enabled: true
|
||||
replicaCount: 1
|
||||
image:
|
||||
repository: datacenter-docs-frontend
|
||||
tag: "latest"
|
||||
pullPolicy: IfNotPresent
|
||||
resources:
|
||||
requests:
|
||||
memory: "64Mi"
|
||||
cpu: "50m"
|
||||
limits:
|
||||
memory: "128Mi"
|
||||
cpu: "100m"
|
||||
|
||||
# Ingress - disabled for development (use port-forward)
|
||||
ingress:
|
||||
enabled: false
|
||||
|
||||
# Application configuration for development
|
||||
config:
|
||||
mongodbUrl: "mongodb://admin:admin123@{{ include \"datacenter-docs.mongodb.fullname\" . }}:27017/datacenter_docs?authSource=admin"
|
||||
redisUrl: "redis://{{ include \"datacenter-docs.redis.fullname\" . }}:6379/0"
|
||||
|
||||
llm:
|
||||
# Use local LLM for development (no API costs)
|
||||
baseUrl: "http://localhost:11434/v1" # Ollama
|
||||
model: "llama2"
|
||||
|
||||
# Or use OpenAI with a test key
|
||||
# baseUrl: "https://api.openai.com/v1"
|
||||
# model: "gpt-3.5-turbo"
|
||||
|
||||
maxTokens: 2048
|
||||
temperature: 0.7
|
||||
|
||||
mcp:
|
||||
baseUrl: "http://mcp-server:8080"
|
||||
timeout: 30
|
||||
|
||||
# Auto-remediation in dry-run mode for safety
|
||||
autoRemediation:
|
||||
enabled: true
|
||||
minReliabilityScore: 85.0
|
||||
requireApprovalThreshold: 90.0
|
||||
maxActionsPerHour: 100
|
||||
dryRun: true # ALWAYS dry-run in development
|
||||
|
||||
apiKeyEnabled: false # Disable for easier testing
|
||||
corsOrigins:
|
||||
- "http://localhost:3000"
|
||||
- "http://localhost:8080"
|
||||
- "http://localhost:8000"
|
||||
|
||||
logLevel: "DEBUG" # Verbose logging for development
|
||||
logFormat: "text" # Human-readable logs
|
||||
|
||||
# Secrets - safe defaults for development only
|
||||
secrets:
|
||||
llmApiKey: "not-needed-for-local-llm"
|
||||
apiSecretKey: "dev-secret-key-not-for-production"
|
||||
mongodbUsername: "admin"
|
||||
mongodbPassword: "admin123"
|
||||
|
||||
# ServiceAccount
|
||||
serviceAccount:
|
||||
create: true
|
||||
annotations: {}
|
||||
name: ""
|
||||
|
||||
# Relaxed security for development
|
||||
podSecurityContext:
|
||||
fsGroup: 1000
|
||||
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
|
||||
# No node selectors or tolerations
|
||||
nodeSelector: {}
|
||||
tolerations: []
|
||||
affinity: {}
|
||||
|
||||
# No priority class
|
||||
priorityClassName: ""
|
||||
|
||||
# Development tips:
|
||||
#
|
||||
# 1. Port-forward to access services:
|
||||
# kubectl port-forward svc/dev-datacenter-docs-api 8000:8000
|
||||
# kubectl port-forward svc/dev-datacenter-docs-frontend 8080:80
|
||||
#
|
||||
# 2. View logs:
|
||||
# kubectl logs -l app.kubernetes.io/component=api -f
|
||||
#
|
||||
# 3. Access MongoDB directly:
|
||||
# kubectl port-forward svc/dev-datacenter-docs-mongodb 27017:27017
|
||||
# mongosh mongodb://admin:admin123@localhost:27017
|
||||
#
|
||||
# 4. Quick iteration:
|
||||
# # Make code changes
|
||||
# docker build -t datacenter-docs-api:latest -f deploy/docker/Dockerfile.api .
|
||||
# kubectl rollout restart deployment/dev-datacenter-docs-api
|
||||
#
|
||||
# 5. Clean slate:
|
||||
# helm uninstall dev
|
||||
# kubectl delete pvc --all
|
||||
# helm install dev ./datacenter-docs -f values-development.yaml
|
||||
304
deploy/helm/datacenter-docs/values-production.yaml
Normal file
304
deploy/helm/datacenter-docs/values-production.yaml
Normal file
@@ -0,0 +1,304 @@
|
||||
# Production values for datacenter-docs
|
||||
# This is an example configuration for production deployment
|
||||
# Copy this file and customize it for your environment
|
||||
|
||||
global:
|
||||
imagePullPolicy: Always
|
||||
storageClass: "standard" # Use your storage class
|
||||
|
||||
# MongoDB configuration for production
|
||||
mongodb:
|
||||
enabled: true
|
||||
auth:
|
||||
rootUsername: admin
|
||||
rootPassword: "CHANGE-THIS-IN-PRODUCTION" # Use strong password
|
||||
database: datacenter_docs
|
||||
persistence:
|
||||
enabled: true
|
||||
size: 50Gi # Adjust based on expected data volume
|
||||
storageClass: "fast-ssd" # Use SSD storage class for better performance
|
||||
resources:
|
||||
requests:
|
||||
memory: "2Gi"
|
||||
cpu: "1000m"
|
||||
limits:
|
||||
memory: "4Gi"
|
||||
cpu: "2000m"
|
||||
|
||||
# Redis configuration for production
|
||||
redis:
|
||||
enabled: true
|
||||
resources:
|
||||
requests:
|
||||
memory: "256Mi"
|
||||
cpu: "200m"
|
||||
limits:
|
||||
memory: "1Gi"
|
||||
cpu: "1000m"
|
||||
|
||||
# API service - production scale
|
||||
api:
|
||||
enabled: true
|
||||
replicaCount: 5
|
||||
image:
|
||||
repository: your-registry.io/datacenter-docs-api
|
||||
tag: "v1.0.0" # Use specific version, not latest
|
||||
pullPolicy: Always
|
||||
service:
|
||||
type: ClusterIP
|
||||
port: 8000
|
||||
resources:
|
||||
requests:
|
||||
memory: "1Gi"
|
||||
cpu: "500m"
|
||||
limits:
|
||||
memory: "4Gi"
|
||||
cpu: "2000m"
|
||||
autoscaling:
|
||||
enabled: true
|
||||
minReplicas: 5
|
||||
maxReplicas: 20
|
||||
targetCPUUtilizationPercentage: 70
|
||||
targetMemoryUtilizationPercentage: 80
|
||||
|
||||
# Chat service - enable in production
|
||||
chat:
|
||||
enabled: true
|
||||
replicaCount: 3
|
||||
image:
|
||||
repository: your-registry.io/datacenter-docs-chat
|
||||
tag: "v1.0.0"
|
||||
pullPolicy: Always
|
||||
resources:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "2Gi"
|
||||
cpu: "1000m"
|
||||
|
||||
# Worker service - enable in production
|
||||
worker:
|
||||
enabled: true
|
||||
replicaCount: 5
|
||||
image:
|
||||
repository: your-registry.io/datacenter-docs-worker
|
||||
tag: "v1.0.0"
|
||||
pullPolicy: Always
|
||||
resources:
|
||||
requests:
|
||||
memory: "1Gi"
|
||||
cpu: "500m"
|
||||
limits:
|
||||
memory: "4Gi"
|
||||
cpu: "2000m"
|
||||
autoscaling:
|
||||
enabled: true
|
||||
minReplicas: 3
|
||||
maxReplicas: 20
|
||||
targetCPUUtilizationPercentage: 75
|
||||
|
||||
# Frontend - production scale
|
||||
frontend:
|
||||
enabled: true
|
||||
replicaCount: 3
|
||||
image:
|
||||
repository: your-registry.io/datacenter-docs-frontend
|
||||
tag: "v1.0.0"
|
||||
pullPolicy: Always
|
||||
resources:
|
||||
requests:
|
||||
memory: "128Mi"
|
||||
cpu: "100m"
|
||||
limits:
|
||||
memory: "512Mi"
|
||||
cpu: "500m"
|
||||
|
||||
# Ingress - production configuration
|
||||
ingress:
|
||||
enabled: true
|
||||
className: "nginx"
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||||
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
|
||||
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
|
||||
nginx.ingress.kubernetes.io/rate-limit: "100"
|
||||
nginx.ingress.kubernetes.io/limit-rps: "50"
|
||||
hosts:
|
||||
- host: datacenter-docs.yourdomain.com
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
service: frontend
|
||||
- path: /api
|
||||
pathType: Prefix
|
||||
service: api
|
||||
- path: /ws
|
||||
pathType: Prefix
|
||||
service: chat
|
||||
tls:
|
||||
- secretName: datacenter-docs-tls
|
||||
hosts:
|
||||
- datacenter-docs.yourdomain.com
|
||||
|
||||
# Application configuration for production
|
||||
config:
|
||||
# MongoDB connection (if using external MongoDB, change this)
|
||||
mongodbUrl: "mongodb://admin:CHANGE-THIS-IN-PRODUCTION@{{ include \"datacenter-docs.mongodb.fullname\" . }}:27017/datacenter_docs?authSource=admin"
|
||||
|
||||
# Redis connection
|
||||
redisUrl: "redis://{{ include \"datacenter-docs.redis.fullname\" . }}:6379/0"
|
||||
|
||||
# LLM Provider configuration
|
||||
llm:
|
||||
# For OpenAI
|
||||
baseUrl: "https://api.openai.com/v1"
|
||||
model: "gpt-4-turbo-preview"
|
||||
|
||||
# For Anthropic Claude (alternative)
|
||||
# baseUrl: "https://api.anthropic.com/v1"
|
||||
# model: "claude-3-opus-20240229"
|
||||
|
||||
# For Azure OpenAI (alternative)
|
||||
# baseUrl: "https://your-resource.openai.azure.com"
|
||||
# model: "gpt-4"
|
||||
|
||||
maxTokens: 4096
|
||||
temperature: 0.7
|
||||
|
||||
# MCP configuration
|
||||
mcp:
|
||||
baseUrl: "http://mcp-server:8080"
|
||||
timeout: 30
|
||||
|
||||
# Auto-remediation configuration
|
||||
autoRemediation:
|
||||
enabled: true
|
||||
minReliabilityScore: 90.0 # Higher threshold for production
|
||||
requireApprovalThreshold: 95.0
|
||||
maxActionsPerHour: 50 # Conservative limit
|
||||
dryRun: false # Set to true for initial deployment
|
||||
|
||||
# Security
|
||||
apiKeyEnabled: true
|
||||
corsOrigins:
|
||||
- "https://datacenter-docs.yourdomain.com"
|
||||
- "https://admin.yourdomain.com"
|
||||
|
||||
# Logging
|
||||
logLevel: "INFO" # Use "DEBUG" for troubleshooting
|
||||
logFormat: "json"
|
||||
|
||||
# Secrets - MUST BE CHANGED IN PRODUCTION
|
||||
secrets:
|
||||
# LLM API Key
|
||||
llmApiKey: "CHANGE-THIS-TO-YOUR-ACTUAL-API-KEY"
|
||||
|
||||
# API authentication secret key
|
||||
apiSecretKey: "CHANGE-THIS-TO-A-STRONG-RANDOM-KEY"
|
||||
|
||||
# MongoDB credentials
|
||||
mongodbUsername: "admin"
|
||||
mongodbPassword: "CHANGE-THIS-IN-PRODUCTION"
|
||||
|
||||
# ServiceAccount
|
||||
serviceAccount:
|
||||
create: true
|
||||
annotations:
|
||||
# Add cloud provider annotations if needed
|
||||
# eks.amazonaws.com/role-arn: arn:aws:iam::ACCOUNT-ID:role/IAM-ROLE-NAME
|
||||
name: ""
|
||||
|
||||
# Pod security context
|
||||
podSecurityContext:
|
||||
fsGroup: 1000
|
||||
runAsNonRoot: true
|
||||
runAsUser: 1000
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
|
||||
# Container security context
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
readOnlyRootFilesystem: false
|
||||
runAsNonRoot: true
|
||||
runAsUser: 1000
|
||||
|
||||
# Node selector - place workloads on specific nodes
|
||||
nodeSelector:
|
||||
workload-type: "application"
|
||||
# kubernetes.io/arch: amd64
|
||||
|
||||
# Tolerations - allow scheduling on tainted nodes
|
||||
tolerations:
|
||||
- key: "workload-type"
|
||||
operator: "Equal"
|
||||
value: "application"
|
||||
effect: "NoSchedule"
|
||||
|
||||
# Affinity rules - spread pods across zones and nodes
|
||||
affinity:
|
||||
podAntiAffinity:
|
||||
preferredDuringSchedulingIgnoredDuringExecution:
|
||||
- weight: 100
|
||||
podAffinityTerm:
|
||||
labelSelector:
|
||||
matchExpressions:
|
||||
- key: app.kubernetes.io/name
|
||||
operator: In
|
||||
values:
|
||||
- datacenter-docs
|
||||
topologyKey: kubernetes.io/hostname
|
||||
- weight: 100
|
||||
podAffinityTerm:
|
||||
labelSelector:
|
||||
matchExpressions:
|
||||
- key: app.kubernetes.io/component
|
||||
operator: In
|
||||
values:
|
||||
- api
|
||||
topologyKey: topology.kubernetes.io/zone
|
||||
|
||||
# Priority class - ensure critical pods are scheduled first
|
||||
priorityClassName: "high-priority"
|
||||
|
||||
# Additional production recommendations:
|
||||
#
|
||||
# 1. Use external secret management:
|
||||
# - HashiCorp Vault
|
||||
# - AWS Secrets Manager
|
||||
# - Azure Key Vault
|
||||
# - Google Secret Manager
|
||||
#
|
||||
# 2. Enable monitoring:
|
||||
# - Prometheus metrics
|
||||
# - Grafana dashboards
|
||||
# - AlertManager alerts
|
||||
#
|
||||
# 3. Enable logging:
|
||||
# - ELK Stack
|
||||
# - Loki
|
||||
# - CloudWatch
|
||||
#
|
||||
# 4. Enable tracing:
|
||||
# - Jaeger
|
||||
# - OpenTelemetry
|
||||
#
|
||||
# 5. Backup strategy:
|
||||
# - MongoDB backups (Velero, native tools)
|
||||
# - Disaster recovery plan
|
||||
#
|
||||
# 6. Network policies:
|
||||
# - Restrict pod-to-pod communication
|
||||
# - Isolate database access
|
||||
#
|
||||
# 7. Pod disruption budgets:
|
||||
# - Ensure high availability during updates
|
||||
#
|
||||
# 8. Regular security scans:
|
||||
# - Container image scanning
|
||||
# - Dependency vulnerability scanning
|
||||
265
deploy/helm/datacenter-docs/values.yaml
Normal file
265
deploy/helm/datacenter-docs/values.yaml
Normal file
@@ -0,0 +1,265 @@
|
||||
# Default values for datacenter-docs
|
||||
# This is a YAML-formatted file.
|
||||
# Declare variables to be passed into your templates.
|
||||
|
||||
global:
|
||||
imagePullPolicy: IfNotPresent
|
||||
storageClass: ""
|
||||
|
||||
# MongoDB configuration
|
||||
mongodb:
|
||||
enabled: true
|
||||
image:
|
||||
repository: mongo
|
||||
tag: "7"
|
||||
pullPolicy: IfNotPresent
|
||||
service:
|
||||
type: ClusterIP
|
||||
port: 27017
|
||||
auth:
|
||||
enabled: true
|
||||
rootUsername: admin
|
||||
rootPassword: admin123
|
||||
database: datacenter_docs
|
||||
persistence:
|
||||
enabled: true
|
||||
size: 10Gi
|
||||
storageClass: ""
|
||||
resources:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "2Gi"
|
||||
cpu: "1000m"
|
||||
|
||||
# Redis configuration
|
||||
redis:
|
||||
enabled: true
|
||||
image:
|
||||
repository: redis
|
||||
tag: "7-alpine"
|
||||
pullPolicy: IfNotPresent
|
||||
service:
|
||||
type: ClusterIP
|
||||
port: 6379
|
||||
resources:
|
||||
requests:
|
||||
memory: "128Mi"
|
||||
cpu: "100m"
|
||||
limits:
|
||||
memory: "512Mi"
|
||||
cpu: "500m"
|
||||
|
||||
# API service configuration
|
||||
api:
|
||||
enabled: true
|
||||
replicaCount: 2
|
||||
image:
|
||||
repository: datacenter-docs-api
|
||||
tag: "latest"
|
||||
pullPolicy: Always
|
||||
service:
|
||||
type: ClusterIP
|
||||
port: 8000
|
||||
targetPort: 8000
|
||||
resources:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "2Gi"
|
||||
cpu: "1000m"
|
||||
autoscaling:
|
||||
enabled: true
|
||||
minReplicas: 2
|
||||
maxReplicas: 10
|
||||
targetCPUUtilizationPercentage: 80
|
||||
targetMemoryUtilizationPercentage: 80
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /health
|
||||
port: 8000
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 10
|
||||
timeoutSeconds: 5
|
||||
failureThreshold: 3
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /health
|
||||
port: 8000
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 5
|
||||
timeoutSeconds: 3
|
||||
failureThreshold: 3
|
||||
|
||||
# Chat service configuration
|
||||
chat:
|
||||
enabled: false # Not yet implemented
|
||||
replicaCount: 1
|
||||
image:
|
||||
repository: datacenter-docs-chat
|
||||
tag: "latest"
|
||||
pullPolicy: Always
|
||||
service:
|
||||
type: ClusterIP
|
||||
port: 8001
|
||||
targetPort: 8001
|
||||
resources:
|
||||
requests:
|
||||
memory: "256Mi"
|
||||
cpu: "100m"
|
||||
limits:
|
||||
memory: "1Gi"
|
||||
cpu: "500m"
|
||||
|
||||
# Worker service configuration
|
||||
worker:
|
||||
enabled: false # Not yet implemented
|
||||
replicaCount: 3
|
||||
image:
|
||||
repository: datacenter-docs-worker
|
||||
tag: "latest"
|
||||
pullPolicy: Always
|
||||
resources:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "2Gi"
|
||||
cpu: "1000m"
|
||||
autoscaling:
|
||||
enabled: true
|
||||
minReplicas: 1
|
||||
maxReplicas: 10
|
||||
targetCPUUtilizationPercentage: 80
|
||||
|
||||
# Frontend service configuration
|
||||
frontend:
|
||||
enabled: true
|
||||
replicaCount: 2
|
||||
image:
|
||||
repository: datacenter-docs-frontend
|
||||
tag: "latest"
|
||||
pullPolicy: Always
|
||||
service:
|
||||
type: ClusterIP
|
||||
port: 80
|
||||
targetPort: 80
|
||||
resources:
|
||||
requests:
|
||||
memory: "128Mi"
|
||||
cpu: "100m"
|
||||
limits:
|
||||
memory: "256Mi"
|
||||
cpu: "200m"
|
||||
|
||||
# Ingress configuration
|
||||
ingress:
|
||||
enabled: true
|
||||
className: "nginx"
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||||
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
|
||||
hosts:
|
||||
- host: datacenter-docs.example.com
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
service: frontend
|
||||
- path: /api
|
||||
pathType: Prefix
|
||||
service: api
|
||||
- path: /ws
|
||||
pathType: Prefix
|
||||
service: chat
|
||||
tls:
|
||||
- secretName: datacenter-docs-tls
|
||||
hosts:
|
||||
- datacenter-docs.example.com
|
||||
|
||||
# Application configuration
|
||||
config:
|
||||
# MongoDB connection
|
||||
mongodbUrl: "mongodb://admin:admin123@{{ include \"datacenter-docs.mongodb.fullname\" . }}:27017/datacenter_docs?authSource=admin"
|
||||
|
||||
# Redis connection
|
||||
redisUrl: "redis://{{ include \"datacenter-docs.redis.fullname\" . }}:6379/0"
|
||||
|
||||
# LLM Provider configuration
|
||||
llm:
|
||||
baseUrl: "https://api.openai.com/v1"
|
||||
model: "gpt-4-turbo-preview"
|
||||
maxTokens: 4096
|
||||
temperature: 0.7
|
||||
|
||||
# MCP configuration
|
||||
mcp:
|
||||
baseUrl: "http://mcp-server:8080"
|
||||
timeout: 30
|
||||
|
||||
# Auto-remediation configuration
|
||||
autoRemediation:
|
||||
enabled: true
|
||||
minReliabilityScore: 85.0
|
||||
requireApprovalThreshold: 90.0
|
||||
maxActionsPerHour: 100
|
||||
dryRun: false
|
||||
|
||||
# Security
|
||||
apiKeyEnabled: true
|
||||
corsOrigins:
|
||||
- "http://localhost:3000"
|
||||
- "https://datacenter-docs.example.com"
|
||||
|
||||
# Logging
|
||||
logLevel: "INFO"
|
||||
logFormat: "json"
|
||||
|
||||
# Secrets (should be overridden in production)
|
||||
secrets:
|
||||
# LLM API Key
|
||||
llmApiKey: "sk-your-openai-api-key-here"
|
||||
|
||||
# API authentication
|
||||
apiSecretKey: "your-secret-key-here-change-in-production"
|
||||
|
||||
# MongoDB credentials (override mongodb.auth if using external DB)
|
||||
mongodbUsername: "admin"
|
||||
mongodbPassword: "admin123"
|
||||
|
||||
# ServiceAccount configuration
|
||||
serviceAccount:
|
||||
create: true
|
||||
annotations: {}
|
||||
name: ""
|
||||
|
||||
# Pod annotations
|
||||
podAnnotations: {}
|
||||
|
||||
# Pod security context
|
||||
podSecurityContext:
|
||||
fsGroup: 1000
|
||||
runAsNonRoot: true
|
||||
runAsUser: 1000
|
||||
|
||||
# Container security context
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
readOnlyRootFilesystem: false
|
||||
|
||||
# Node selector
|
||||
nodeSelector: {}
|
||||
|
||||
# Tolerations
|
||||
tolerations: []
|
||||
|
||||
# Affinity rules
|
||||
affinity: {}
|
||||
|
||||
# Priority class
|
||||
priorityClassName: ""
|
||||
143
deploy/helm/test-chart.sh
Executable file
143
deploy/helm/test-chart.sh
Executable file
@@ -0,0 +1,143 @@
|
||||
#!/bin/bash
|
||||
# Test script for Helm chart validation
|
||||
# Usage: ./test-chart.sh
|
||||
|
||||
set -e
|
||||
|
||||
CHART_DIR="datacenter-docs"
|
||||
RELEASE_NAME="test-datacenter-docs"
|
||||
|
||||
echo "=========================================="
|
||||
echo "Helm Chart Testing Script"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
|
||||
# Check if helm is installed
|
||||
if ! command -v helm &> /dev/null; then
|
||||
echo "ERROR: helm is not installed. Please install Helm first."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✓ Helm version: $(helm version --short)"
|
||||
echo ""
|
||||
|
||||
# Lint the chart
|
||||
echo "=========================================="
|
||||
echo "Step 1: Linting Chart"
|
||||
echo "=========================================="
|
||||
helm lint ${CHART_DIR}
|
||||
echo "✓ Lint passed"
|
||||
echo ""
|
||||
|
||||
# Template rendering with default values
|
||||
echo "=========================================="
|
||||
echo "Step 2: Template Rendering (default values)"
|
||||
echo "=========================================="
|
||||
helm template ${RELEASE_NAME} ${CHART_DIR} > /tmp/rendered-default.yaml
|
||||
echo "✓ Template rendering successful"
|
||||
echo " Output: /tmp/rendered-default.yaml"
|
||||
echo ""
|
||||
|
||||
# Template rendering with development values
|
||||
echo "=========================================="
|
||||
echo "Step 3: Template Rendering (development values)"
|
||||
echo "=========================================="
|
||||
helm template ${RELEASE_NAME} ${CHART_DIR} -f ${CHART_DIR}/values-development.yaml > /tmp/rendered-dev.yaml
|
||||
echo "✓ Template rendering successful"
|
||||
echo " Output: /tmp/rendered-dev.yaml"
|
||||
echo ""
|
||||
|
||||
# Template rendering with production values
|
||||
echo "=========================================="
|
||||
echo "Step 4: Template Rendering (production values)"
|
||||
echo "=========================================="
|
||||
helm template ${RELEASE_NAME} ${CHART_DIR} -f ${CHART_DIR}/values-production.yaml > /tmp/rendered-prod.yaml
|
||||
echo "✓ Template rendering successful"
|
||||
echo " Output: /tmp/rendered-prod.yaml"
|
||||
echo ""
|
||||
|
||||
# Dry run installation
|
||||
echo "=========================================="
|
||||
echo "Step 5: Dry Run Installation"
|
||||
echo "=========================================="
|
||||
helm install ${RELEASE_NAME} ${CHART_DIR} --dry-run --debug > /tmp/dry-run.log 2>&1
|
||||
echo "✓ Dry run successful"
|
||||
echo " Output: /tmp/dry-run.log"
|
||||
echo ""
|
||||
|
||||
# Test with disabled components
|
||||
echo "=========================================="
|
||||
echo "Step 6: Template with Disabled Components"
|
||||
echo "=========================================="
|
||||
helm template ${RELEASE_NAME} ${CHART_DIR} \
|
||||
--set mongodb.enabled=false \
|
||||
--set redis.enabled=false \
|
||||
--set api.enabled=false \
|
||||
--set frontend.enabled=false \
|
||||
> /tmp/rendered-minimal.yaml
|
||||
echo "✓ Minimal template rendering successful"
|
||||
echo " Output: /tmp/rendered-minimal.yaml"
|
||||
echo ""
|
||||
|
||||
# Test with all components enabled
|
||||
echo "=========================================="
|
||||
echo "Step 7: Template with All Components"
|
||||
echo "=========================================="
|
||||
helm template ${RELEASE_NAME} ${CHART_DIR} \
|
||||
--set chat.enabled=true \
|
||||
--set worker.enabled=true \
|
||||
> /tmp/rendered-full.yaml
|
||||
echo "✓ Full template rendering successful"
|
||||
echo " Output: /tmp/rendered-full.yaml"
|
||||
echo ""
|
||||
|
||||
# Validate Kubernetes manifests (if kubectl is available)
|
||||
if command -v kubectl &> /dev/null; then
|
||||
echo "=========================================="
|
||||
echo "Step 8: Kubernetes Manifest Validation"
|
||||
echo "=========================================="
|
||||
|
||||
if kubectl version --client &> /dev/null; then
|
||||
kubectl apply --dry-run=client -f /tmp/rendered-default.yaml > /dev/null 2>&1
|
||||
echo "✓ Kubernetes manifest validation passed"
|
||||
else
|
||||
echo "⚠ kubectl not connected to cluster, skipping validation"
|
||||
fi
|
||||
echo ""
|
||||
else
|
||||
echo "⚠ kubectl not found, skipping Kubernetes validation"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# Package the chart
|
||||
echo "=========================================="
|
||||
echo "Step 9: Packaging Chart"
|
||||
echo "=========================================="
|
||||
helm package ${CHART_DIR} -d /tmp/
|
||||
echo "✓ Chart packaged successfully"
|
||||
echo " Output: /tmp/datacenter-docs-*.tgz"
|
||||
echo ""
|
||||
|
||||
# Summary
|
||||
echo "=========================================="
|
||||
echo "All Tests Passed! ✓"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "Generated files:"
|
||||
echo " - /tmp/rendered-default.yaml (default values)"
|
||||
echo " - /tmp/rendered-dev.yaml (development values)"
|
||||
echo " - /tmp/rendered-prod.yaml (production values)"
|
||||
echo " - /tmp/rendered-minimal.yaml (minimal components)"
|
||||
echo " - /tmp/rendered-full.yaml (all components)"
|
||||
echo " - /tmp/dry-run.log (dry run output)"
|
||||
echo " - /tmp/datacenter-docs-*.tgz (packaged chart)"
|
||||
echo ""
|
||||
echo "To install the chart locally:"
|
||||
echo " helm install my-release ${CHART_DIR}"
|
||||
echo ""
|
||||
echo "To install with development values:"
|
||||
echo " helm install dev ${CHART_DIR} -f ${CHART_DIR}/values-development.yaml"
|
||||
echo ""
|
||||
echo "To install with production values (customize first!):"
|
||||
echo " helm install prod ${CHART_DIR} -f ${CHART_DIR}/values-production.yaml"
|
||||
echo ""
|
||||
@@ -148,6 +148,118 @@ After running the validation script, you'll find:
|
||||
|
||||
---
|
||||
|
||||
## 🔄 convert_config.py
|
||||
|
||||
**Configuration Format Converter**
|
||||
|
||||
### Description
|
||||
|
||||
Converts between `.env` and `values.yaml` configuration formats, making it easy to switch between Docker Compose and Helm deployments.
|
||||
|
||||
### Usage
|
||||
|
||||
#### Prerequisites
|
||||
|
||||
```bash
|
||||
pip install pyyaml
|
||||
```
|
||||
|
||||
#### Convert .env to values.yaml
|
||||
|
||||
```bash
|
||||
./scripts/convert_config.py env-to-yaml .env values.yaml
|
||||
```
|
||||
|
||||
#### Convert values.yaml to .env
|
||||
|
||||
```bash
|
||||
./scripts/convert_config.py yaml-to-env values.yaml .env
|
||||
```
|
||||
|
||||
### Examples
|
||||
|
||||
**Example 1: Create values.yaml from existing .env**
|
||||
|
||||
```bash
|
||||
# You have an existing .env file from Docker development
|
||||
./scripts/convert_config.py env-to-yaml .env my-values.yaml
|
||||
|
||||
# Use the generated values.yaml with Helm
|
||||
helm install my-release deploy/helm/datacenter-docs -f my-values.yaml
|
||||
```
|
||||
|
||||
**Example 2: Generate .env from values.yaml**
|
||||
|
||||
```bash
|
||||
# You have a values.yaml from Kubernetes deployment
|
||||
./scripts/convert_config.py yaml-to-env values.yaml .env
|
||||
|
||||
# Use the generated .env with Docker Compose
|
||||
cd deploy/docker
|
||||
docker-compose -f docker-compose.dev.yml up -d
|
||||
```
|
||||
|
||||
**Example 3: Environment migration**
|
||||
|
||||
```bash
|
||||
# Convert development .env to staging values.yaml
|
||||
./scripts/convert_config.py env-to-yaml .env.development values-staging.yaml
|
||||
|
||||
# Manually adjust staging-specific settings
|
||||
nano values-staging.yaml
|
||||
|
||||
# Deploy to staging Kubernetes cluster
|
||||
helm install staging deploy/helm/datacenter-docs -f values-staging.yaml
|
||||
```
|
||||
|
||||
### Supported Configuration
|
||||
|
||||
The script converts:
|
||||
|
||||
- **MongoDB**: Connection settings and authentication
|
||||
- **Redis**: Connection and authentication
|
||||
- **MCP Server**: URL and API key
|
||||
- **Proxmox**: Host, authentication, SSL settings
|
||||
- **LLM**: Provider settings (OpenAI, Anthropic, Ollama, etc.)
|
||||
- **API**: Server configuration and workers
|
||||
- **CORS**: Allowed origins
|
||||
- **Application**: Logging and debug settings
|
||||
- **Celery**: Broker and result backend
|
||||
- **Vector Store**: ChromaDB and embedding model
|
||||
|
||||
### Output
|
||||
|
||||
```
|
||||
Reading .env file: .env
|
||||
Converting to values.yaml format...
|
||||
Writing values.yaml: my-values.yaml
|
||||
✓ Conversion completed successfully!
|
||||
|
||||
Output written to: my-values.yaml
|
||||
```
|
||||
|
||||
### Limitations
|
||||
|
||||
- Converts common configuration options only
|
||||
- Complex nested structures may require manual adjustment
|
||||
- Helm-specific values (resource limits, replicas) not included in .env conversion
|
||||
- Always review and test converted configuration
|
||||
|
||||
### Tips
|
||||
|
||||
1. **Review output**: Always check converted files for accuracy
|
||||
2. **Test first**: Validate in development before production
|
||||
3. **Keep secrets secure**: Use proper secret management tools
|
||||
4. **Version control**: Track configuration changes
|
||||
|
||||
### See Also
|
||||
|
||||
- [CONFIGURATION.md](../CONFIGURATION.md) - Complete configuration guide
|
||||
- [.env.example](../.env.example) - Environment variable template
|
||||
- [values.yaml](../values.yaml) - YAML configuration template
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Quick Start
|
||||
|
||||
```bash
|
||||
|
||||
298
scripts/convert_config.py
Executable file
298
scripts/convert_config.py
Executable file
@@ -0,0 +1,298 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Configuration Converter
|
||||
Converts between .env and values.yaml formats
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import argparse
|
||||
from pathlib import Path
|
||||
from typing import Dict, Any
|
||||
import yaml
|
||||
|
||||
|
||||
def parse_env_file(env_file: Path) -> Dict[str, str]:
|
||||
"""Parse .env file and return dictionary of variables."""
|
||||
env_vars = {}
|
||||
|
||||
with open(env_file, 'r') as f:
|
||||
for line in f:
|
||||
line = line.strip()
|
||||
|
||||
# Skip comments and empty lines
|
||||
if not line or line.startswith('#'):
|
||||
continue
|
||||
|
||||
# Parse KEY=VALUE
|
||||
if '=' in line:
|
||||
key, value = line.split('=', 1)
|
||||
env_vars[key.strip()] = value.strip()
|
||||
|
||||
return env_vars
|
||||
|
||||
|
||||
def env_to_values(env_vars: Dict[str, str]) -> Dict[str, Any]:
|
||||
"""Convert environment variables to values.yaml structure."""
|
||||
|
||||
values = {
|
||||
'mongodb': {
|
||||
'auth': {
|
||||
'rootUsername': env_vars.get('MONGO_ROOT_USER', 'admin'),
|
||||
'rootPassword': env_vars.get('MONGO_ROOT_PASSWORD', 'changeme'),
|
||||
'database': env_vars.get('MONGODB_DATABASE', 'datacenter_docs'),
|
||||
},
|
||||
'url': env_vars.get('MONGODB_URL', 'mongodb://admin:changeme@mongodb:27017'),
|
||||
},
|
||||
'redis': {
|
||||
'auth': {
|
||||
'password': env_vars.get('REDIS_PASSWORD', 'changeme'),
|
||||
},
|
||||
'url': env_vars.get('REDIS_URL', 'redis://redis:6379/0'),
|
||||
},
|
||||
'mcp': {
|
||||
'server': {
|
||||
'url': env_vars.get('MCP_SERVER_URL', 'https://mcp.company.local'),
|
||||
'apiKey': env_vars.get('MCP_API_KEY', 'your_mcp_api_key_here'),
|
||||
},
|
||||
},
|
||||
'proxmox': {
|
||||
'host': env_vars.get('PROXMOX_HOST', 'proxmox.example.com'),
|
||||
'port': int(env_vars.get('PROXMOX_PORT', '8006')),
|
||||
'auth': {
|
||||
'user': env_vars.get('PROXMOX_USER', 'root@pam'),
|
||||
'password': env_vars.get('PROXMOX_PASSWORD', 'your-password-here'),
|
||||
},
|
||||
'ssl': {
|
||||
'verify': env_vars.get('PROXMOX_VERIFY_SSL', 'false').lower() == 'true',
|
||||
},
|
||||
'timeout': int(env_vars.get('PROXMOX_TIMEOUT', '30')),
|
||||
},
|
||||
'llm': {
|
||||
'baseUrl': env_vars.get('LLM_BASE_URL', 'https://api.openai.com/v1'),
|
||||
'apiKey': env_vars.get('LLM_API_KEY', 'sk-your-openai-api-key-here'),
|
||||
'model': env_vars.get('LLM_MODEL', 'gpt-4-turbo-preview'),
|
||||
'generation': {
|
||||
'temperature': float(env_vars.get('LLM_TEMPERATURE', '0.3')),
|
||||
'maxTokens': int(env_vars.get('LLM_MAX_TOKENS', '4096')),
|
||||
},
|
||||
},
|
||||
'api': {
|
||||
'host': env_vars.get('API_HOST', '0.0.0.0'),
|
||||
'port': int(env_vars.get('API_PORT', '8000')),
|
||||
'workers': int(env_vars.get('WORKERS', '4')),
|
||||
},
|
||||
'cors': {
|
||||
'origins': env_vars.get('CORS_ORIGINS', 'http://localhost:3000').split(','),
|
||||
},
|
||||
'application': {
|
||||
'logging': {
|
||||
'level': env_vars.get('LOG_LEVEL', 'INFO'),
|
||||
},
|
||||
'debug': env_vars.get('DEBUG', 'false').lower() == 'true',
|
||||
},
|
||||
'celery': {
|
||||
'broker': {
|
||||
'url': env_vars.get('CELERY_BROKER_URL', 'redis://redis:6379/0'),
|
||||
},
|
||||
'result': {
|
||||
'backend': env_vars.get('CELERY_RESULT_BACKEND', 'redis://redis:6379/0'),
|
||||
},
|
||||
},
|
||||
'vectorStore': {
|
||||
'chroma': {
|
||||
'path': env_vars.get('VECTOR_STORE_PATH', './data/chroma_db'),
|
||||
},
|
||||
'embedding': {
|
||||
'model': env_vars.get('EMBEDDING_MODEL', 'sentence-transformers/all-MiniLM-L6-v2'),
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
return values
|
||||
|
||||
|
||||
def values_to_env(values: Dict[str, Any]) -> Dict[str, str]:
|
||||
"""Convert values.yaml structure to environment variables."""
|
||||
|
||||
env_vars = {}
|
||||
|
||||
# MongoDB
|
||||
if 'mongodb' in values:
|
||||
mongo = values['mongodb']
|
||||
if 'auth' in mongo:
|
||||
env_vars['MONGO_ROOT_USER'] = mongo['auth'].get('rootUsername', 'admin')
|
||||
env_vars['MONGO_ROOT_PASSWORD'] = mongo['auth'].get('rootPassword', 'changeme')
|
||||
env_vars['MONGODB_DATABASE'] = mongo['auth'].get('database', 'datacenter_docs')
|
||||
env_vars['MONGODB_URL'] = mongo.get('url', 'mongodb://admin:changeme@mongodb:27017')
|
||||
|
||||
# Redis
|
||||
if 'redis' in values:
|
||||
redis = values['redis']
|
||||
if 'auth' in redis:
|
||||
env_vars['REDIS_PASSWORD'] = redis['auth'].get('password', 'changeme')
|
||||
env_vars['REDIS_URL'] = redis.get('url', 'redis://redis:6379/0')
|
||||
|
||||
# MCP
|
||||
if 'mcp' in values and 'server' in values['mcp']:
|
||||
mcp = values['mcp']['server']
|
||||
env_vars['MCP_SERVER_URL'] = mcp.get('url', 'https://mcp.company.local')
|
||||
env_vars['MCP_API_KEY'] = mcp.get('apiKey', 'your_mcp_api_key_here')
|
||||
|
||||
# Proxmox
|
||||
if 'proxmox' in values:
|
||||
px = values['proxmox']
|
||||
env_vars['PROXMOX_HOST'] = px.get('host', 'proxmox.example.com')
|
||||
env_vars['PROXMOX_PORT'] = str(px.get('port', 8006))
|
||||
if 'auth' in px:
|
||||
env_vars['PROXMOX_USER'] = px['auth'].get('user', 'root@pam')
|
||||
env_vars['PROXMOX_PASSWORD'] = px['auth'].get('password', 'your-password-here')
|
||||
if 'ssl' in px:
|
||||
env_vars['PROXMOX_VERIFY_SSL'] = str(px['ssl'].get('verify', False)).lower()
|
||||
env_vars['PROXMOX_TIMEOUT'] = str(px.get('timeout', 30))
|
||||
|
||||
# LLM
|
||||
if 'llm' in values:
|
||||
llm = values['llm']
|
||||
env_vars['LLM_BASE_URL'] = llm.get('baseUrl', 'https://api.openai.com/v1')
|
||||
env_vars['LLM_API_KEY'] = llm.get('apiKey', 'sk-your-openai-api-key-here')
|
||||
env_vars['LLM_MODEL'] = llm.get('model', 'gpt-4-turbo-preview')
|
||||
if 'generation' in llm:
|
||||
env_vars['LLM_TEMPERATURE'] = str(llm['generation'].get('temperature', 0.3))
|
||||
env_vars['LLM_MAX_TOKENS'] = str(llm['generation'].get('maxTokens', 4096))
|
||||
|
||||
# API
|
||||
if 'api' in values:
|
||||
api = values['api']
|
||||
env_vars['API_HOST'] = api.get('host', '0.0.0.0')
|
||||
env_vars['API_PORT'] = str(api.get('port', 8000))
|
||||
env_vars['WORKERS'] = str(api.get('workers', 4))
|
||||
|
||||
# CORS
|
||||
if 'cors' in values:
|
||||
origins = values['cors'].get('origins', ['http://localhost:3000'])
|
||||
env_vars['CORS_ORIGINS'] = ','.join(origins)
|
||||
|
||||
# Application
|
||||
if 'application' in values:
|
||||
app = values['application']
|
||||
if 'logging' in app:
|
||||
env_vars['LOG_LEVEL'] = app['logging'].get('level', 'INFO')
|
||||
env_vars['DEBUG'] = str(app.get('debug', False)).lower()
|
||||
|
||||
# Celery
|
||||
if 'celery' in values:
|
||||
celery = values['celery']
|
||||
if 'broker' in celery:
|
||||
env_vars['CELERY_BROKER_URL'] = celery['broker'].get('url', 'redis://redis:6379/0')
|
||||
if 'result' in celery:
|
||||
env_vars['CELERY_RESULT_BACKEND'] = celery['result'].get('backend', 'redis://redis:6379/0')
|
||||
|
||||
# Vector Store
|
||||
if 'vectorStore' in values:
|
||||
vs = values['vectorStore']
|
||||
if 'chroma' in vs:
|
||||
env_vars['VECTOR_STORE_PATH'] = vs['chroma'].get('path', './data/chroma_db')
|
||||
if 'embedding' in vs:
|
||||
env_vars['EMBEDDING_MODEL'] = vs['embedding'].get('model', 'sentence-transformers/all-MiniLM-L6-v2')
|
||||
|
||||
return env_vars
|
||||
|
||||
|
||||
def write_env_file(env_vars: Dict[str, str], output_file: Path):
|
||||
"""Write environment variables to .env file."""
|
||||
|
||||
with open(output_file, 'w') as f:
|
||||
f.write("# =============================================================================\n")
|
||||
f.write("# Datacenter Documentation System - Configuration\n")
|
||||
f.write("# Generated from values.yaml\n")
|
||||
f.write("# =============================================================================\n\n")
|
||||
|
||||
# Group by section
|
||||
sections = {
|
||||
'MongoDB': ['MONGO_ROOT_USER', 'MONGO_ROOT_PASSWORD', 'MONGODB_URL', 'MONGODB_DATABASE'],
|
||||
'Redis': ['REDIS_PASSWORD', 'REDIS_URL'],
|
||||
'MCP': ['MCP_SERVER_URL', 'MCP_API_KEY'],
|
||||
'Proxmox': ['PROXMOX_HOST', 'PROXMOX_PORT', 'PROXMOX_USER', 'PROXMOX_PASSWORD',
|
||||
'PROXMOX_VERIFY_SSL', 'PROXMOX_TIMEOUT'],
|
||||
'LLM': ['LLM_BASE_URL', 'LLM_API_KEY', 'LLM_MODEL', 'LLM_TEMPERATURE', 'LLM_MAX_TOKENS'],
|
||||
'API': ['API_HOST', 'API_PORT', 'WORKERS'],
|
||||
'CORS': ['CORS_ORIGINS'],
|
||||
'Application': ['LOG_LEVEL', 'DEBUG'],
|
||||
'Celery': ['CELERY_BROKER_URL', 'CELERY_RESULT_BACKEND'],
|
||||
'Vector Store': ['VECTOR_STORE_PATH', 'EMBEDDING_MODEL'],
|
||||
}
|
||||
|
||||
for section, keys in sections.items():
|
||||
f.write(f"# {section}\n")
|
||||
for key in keys:
|
||||
if key in env_vars:
|
||||
f.write(f"{key}={env_vars[key]}\n")
|
||||
f.write("\n")
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Convert between .env and values.yaml configuration formats'
|
||||
)
|
||||
parser.add_argument(
|
||||
'mode',
|
||||
choices=['env-to-yaml', 'yaml-to-env'],
|
||||
help='Conversion mode'
|
||||
)
|
||||
parser.add_argument(
|
||||
'input',
|
||||
type=Path,
|
||||
help='Input file path'
|
||||
)
|
||||
parser.add_argument(
|
||||
'output',
|
||||
type=Path,
|
||||
help='Output file path'
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Check input file exists
|
||||
if not args.input.exists():
|
||||
print(f"Error: Input file not found: {args.input}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
try:
|
||||
if args.mode == 'env-to-yaml':
|
||||
# Convert .env to values.yaml
|
||||
print(f"Reading .env file: {args.input}")
|
||||
env_vars = parse_env_file(args.input)
|
||||
|
||||
print("Converting to values.yaml format...")
|
||||
values = env_to_values(env_vars)
|
||||
|
||||
print(f"Writing values.yaml: {args.output}")
|
||||
with open(args.output, 'w') as f:
|
||||
yaml.dump(values, f, default_flow_style=False, sort_keys=False, indent=2)
|
||||
|
||||
print("✓ Conversion completed successfully!")
|
||||
|
||||
else: # yaml-to-env
|
||||
# Convert values.yaml to .env
|
||||
print(f"Reading values.yaml file: {args.input}")
|
||||
with open(args.input, 'r') as f:
|
||||
values = yaml.safe_load(f)
|
||||
|
||||
print("Converting to .env format...")
|
||||
env_vars = values_to_env(values)
|
||||
|
||||
print(f"Writing .env file: {args.output}")
|
||||
write_env_file(env_vars, args.output)
|
||||
|
||||
print("✓ Conversion completed successfully!")
|
||||
|
||||
print(f"\nOutput written to: {args.output}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error during conversion: {e}", file=sys.stderr)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
513
values.yaml
Normal file
513
values.yaml
Normal file
@@ -0,0 +1,513 @@
|
||||
# =============================================================================
|
||||
# Datacenter Documentation System - Configuration Values
|
||||
# This file provides a structured YAML configuration based on .env variables
|
||||
# Can be used with Helm or directly for configuration management
|
||||
# =============================================================================
|
||||
|
||||
# =============================================================================
|
||||
# MongoDB Configuration
|
||||
# =============================================================================
|
||||
mongodb:
|
||||
# Authentication
|
||||
auth:
|
||||
enabled: true
|
||||
rootUsername: admin
|
||||
rootPassword: admin123
|
||||
database: datacenter_docs
|
||||
|
||||
# Connection URL (auto-generated in Helm, can be overridden)
|
||||
url: "mongodb://admin:admin123@mongodb:27017"
|
||||
|
||||
# Service configuration
|
||||
service:
|
||||
host: mongodb
|
||||
port: 27017
|
||||
|
||||
# Persistence (for Kubernetes deployments)
|
||||
persistence:
|
||||
enabled: true
|
||||
size: 10Gi
|
||||
storageClass: "longhorn"
|
||||
|
||||
# =============================================================================
|
||||
# Redis Configuration
|
||||
# =============================================================================
|
||||
redis:
|
||||
# Authentication
|
||||
auth:
|
||||
enabled: false
|
||||
password: admin
|
||||
|
||||
# Connection URL
|
||||
url: "redis://redis:6379/0"
|
||||
|
||||
# Service configuration
|
||||
service:
|
||||
host: redis
|
||||
port: 6379
|
||||
|
||||
# Database number
|
||||
database: 0
|
||||
|
||||
# =============================================================================
|
||||
# MCP Server Configuration
|
||||
# =============================================================================
|
||||
mcp:
|
||||
# MCP server connection
|
||||
server:
|
||||
url: "https://mcp.company.local"
|
||||
apiKey: "7DKfHC8i79iPp43tFKNyiHEXQRSec4dH"
|
||||
timeout: 30
|
||||
|
||||
# Enable MCP integration
|
||||
enabled: true
|
||||
|
||||
# =============================================================================
|
||||
# Proxmox VE Configuration
|
||||
# =============================================================================
|
||||
proxmox:
|
||||
# Proxmox server
|
||||
host: "proxmox.apps.home.arpa.viti"
|
||||
port: 443
|
||||
|
||||
# Authentication Method 1: Username + Password (less secure)
|
||||
auth:
|
||||
user: "monitoring@pve"
|
||||
name: "docs-llm-token"
|
||||
password: "4d97d058-cc96-4189-936d-fe6a6583fcbd"
|
||||
|
||||
# Authentication Method 2: API Token (RECOMMENDED)
|
||||
# To create: Datacenter → Permissions → API Tokens
|
||||
# Format: user@realm!tokenname
|
||||
# token:
|
||||
# user: "automation@pam"
|
||||
# name: "docs-collector"
|
||||
# value: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
||||
|
||||
# SSL Configuration
|
||||
ssl:
|
||||
verify: false # Set to true in production with valid certificates
|
||||
|
||||
# Connection settings
|
||||
timeout: 30
|
||||
|
||||
# Enable Proxmox collector
|
||||
enabled: true
|
||||
|
||||
# =============================================================================
|
||||
# LLM Configuration (OpenAI-compatible API)
|
||||
# =============================================================================
|
||||
llm:
|
||||
# Provider selection - uncomment the one you want to use
|
||||
|
||||
# --- OpenAI (Default) ---
|
||||
provider: openai
|
||||
baseUrl: "https://llm-studio.apps.home.arpa.viti/v1"
|
||||
apiKey: ""
|
||||
model: "llama-3.2-3b-instruct"
|
||||
# Alternative models: gpt-4, gpt-3.5-turbo, gpt-4o
|
||||
|
||||
# --- Anthropic Claude ---
|
||||
# provider: anthropic
|
||||
# baseUrl: "https://api.anthropic.com/v1"
|
||||
# apiKey: "sk-ant-your-anthropic-key-here"
|
||||
# model: "claude-sonnet-4-20250514"
|
||||
# Alternative models: claude-3-opus-20240229, claude-3-sonnet-20240229
|
||||
|
||||
# --- LLMStudio (Local) ---
|
||||
# provider: llmstudio
|
||||
# baseUrl: "http://localhost:1234/v1"
|
||||
# apiKey: "not-needed"
|
||||
# model: "your-local-model-name"
|
||||
|
||||
# --- Open-WebUI (Local) ---
|
||||
# provider: openwebui
|
||||
# baseUrl: "http://localhost:8080/v1"
|
||||
# apiKey: "your-open-webui-key"
|
||||
# model: "llama3"
|
||||
# Alternative models: mistral, mixtral, codellama
|
||||
|
||||
# --- Ollama (Local) ---
|
||||
# provider: ollama
|
||||
# baseUrl: "http://localhost:11434/v1"
|
||||
# apiKey: "ollama"
|
||||
# model: "llama3"
|
||||
# Alternative models: mistral, mixtral, codellama, phi3
|
||||
|
||||
# Generation Settings
|
||||
generation:
|
||||
temperature: 0.3
|
||||
maxTokens: 4096
|
||||
topP: 1.0
|
||||
frequencyPenalty: 0.0
|
||||
presencePenalty: 0.0
|
||||
|
||||
# =============================================================================
|
||||
# API Configuration
|
||||
# =============================================================================
|
||||
api:
|
||||
# Server settings
|
||||
host: "0.0.0.0"
|
||||
port: 8000
|
||||
workers: 4
|
||||
|
||||
# Service configuration (for Kubernetes)
|
||||
service:
|
||||
type: ClusterIP
|
||||
port: 8000
|
||||
targetPort: 8000
|
||||
|
||||
# Application settings
|
||||
debug: false
|
||||
reloadOnChange: false
|
||||
|
||||
# Security
|
||||
secretKey: "your-secret-key-change-in-production"
|
||||
apiKeyEnabled: true
|
||||
|
||||
# =============================================================================
|
||||
# CORS Configuration
|
||||
# =============================================================================
|
||||
cors:
|
||||
enabled: true
|
||||
origins:
|
||||
- "http://localhost:3000"
|
||||
- "https://docs.company.local"
|
||||
allowCredentials: true
|
||||
allowMethods:
|
||||
- "GET"
|
||||
- "POST"
|
||||
- "PUT"
|
||||
- "DELETE"
|
||||
- "PATCH"
|
||||
- "OPTIONS"
|
||||
allowHeaders:
|
||||
- "*"
|
||||
|
||||
# =============================================================================
|
||||
# Application Settings
|
||||
# =============================================================================
|
||||
application:
|
||||
# Logging
|
||||
logging:
|
||||
level: "INFO" # DEBUG, INFO, WARNING, ERROR, CRITICAL
|
||||
format: "json" # json or text
|
||||
|
||||
# Debug mode
|
||||
debug: false
|
||||
|
||||
# Environment
|
||||
environment: "production" # development, staging, production
|
||||
|
||||
# =============================================================================
|
||||
# Auto-Remediation Configuration
|
||||
# =============================================================================
|
||||
autoRemediation:
|
||||
# Enable/disable auto-remediation
|
||||
enabled: true
|
||||
|
||||
# Reliability thresholds
|
||||
minReliabilityScore: 85.0
|
||||
requireApprovalThreshold: 90.0
|
||||
|
||||
# Rate limiting
|
||||
maxActionsPerHour: 100
|
||||
maxActionsPerDay: 500
|
||||
|
||||
# Safety settings
|
||||
dryRun: false # Set to true for testing
|
||||
requireHumanApproval: false
|
||||
|
||||
# Notification settings
|
||||
notifications:
|
||||
enabled: true
|
||||
channels:
|
||||
- email
|
||||
- slack
|
||||
|
||||
# =============================================================================
|
||||
# Celery Configuration (Background Tasks)
|
||||
# =============================================================================
|
||||
celery:
|
||||
# Broker configuration
|
||||
broker:
|
||||
url: "redis://redis:6379/0"
|
||||
transport: "redis"
|
||||
|
||||
# Result backend
|
||||
result:
|
||||
backend: "redis://redis:6379/0"
|
||||
expires: 3600
|
||||
|
||||
# Worker configuration
|
||||
worker:
|
||||
concurrency: 4
|
||||
maxTasksPerChild: 1000
|
||||
prefetchMultiplier: 4
|
||||
|
||||
# Task configuration
|
||||
task:
|
||||
acks_late: true
|
||||
reject_on_worker_lost: true
|
||||
time_limit: 3600
|
||||
soft_time_limit: 3000
|
||||
|
||||
# Queue configuration
|
||||
queues:
|
||||
default:
|
||||
name: "default"
|
||||
priority: 5
|
||||
high_priority:
|
||||
name: "high_priority"
|
||||
priority: 10
|
||||
low_priority:
|
||||
name: "low_priority"
|
||||
priority: 1
|
||||
|
||||
# =============================================================================
|
||||
# Vector Store Configuration
|
||||
# =============================================================================
|
||||
vectorStore:
|
||||
# Storage type
|
||||
type: "chroma" # chroma, pinecone, weaviate
|
||||
|
||||
# ChromaDB configuration
|
||||
chroma:
|
||||
path: "./data/chroma_db"
|
||||
persistDirectory: "/data/vector_store"
|
||||
|
||||
# Embedding configuration
|
||||
embedding:
|
||||
model: "sentence-transformers/all-MiniLM-L6-v2"
|
||||
dimensions: 384
|
||||
|
||||
# Alternative models:
|
||||
# - "sentence-transformers/all-mpnet-base-v2" (768 dims, better quality)
|
||||
# - "BAAI/bge-small-en-v1.5" (384 dims, good performance)
|
||||
# - "thenlper/gte-small" (384 dims, multilingual)
|
||||
|
||||
# Search configuration
|
||||
search:
|
||||
topK: 5
|
||||
scoreThreshold: 0.7
|
||||
|
||||
# =============================================================================
|
||||
# Documentation Generation Settings
|
||||
# =============================================================================
|
||||
documentation:
|
||||
# Generation settings
|
||||
generation:
|
||||
enabled: true
|
||||
autoUpdate: true
|
||||
updateInterval: 3600 # seconds
|
||||
|
||||
# Output configuration
|
||||
output:
|
||||
format: "markdown" # markdown, html, pdf
|
||||
directory: "./docs/generated"
|
||||
templateDirectory: "./templates/docs"
|
||||
|
||||
# Content settings
|
||||
content:
|
||||
includeTimestamps: true
|
||||
includeMetadata: true
|
||||
includeDiagrams: true
|
||||
includeExamples: true
|
||||
|
||||
# =============================================================================
|
||||
# Ticket Management Settings
|
||||
# =============================================================================
|
||||
tickets:
|
||||
# Auto-categorization
|
||||
autoCategorization:
|
||||
enabled: true
|
||||
confidenceThreshold: 0.8
|
||||
|
||||
# Priority assignment
|
||||
autoPriority:
|
||||
enabled: true
|
||||
|
||||
# SLA settings
|
||||
sla:
|
||||
critical: 1 # hours
|
||||
high: 4
|
||||
medium: 24
|
||||
low: 72
|
||||
|
||||
# Notification settings
|
||||
notifications:
|
||||
enabled: true
|
||||
onCreation: true
|
||||
onStatusChange: true
|
||||
onResolution: true
|
||||
|
||||
# =============================================================================
|
||||
# Collectors Configuration
|
||||
# =============================================================================
|
||||
collectors:
|
||||
# VMware vCenter
|
||||
vmware:
|
||||
enabled: false
|
||||
host: "vcenter.example.com"
|
||||
username: "administrator@vsphere.local"
|
||||
password: "your-password"
|
||||
verifySsl: false
|
||||
collectInterval: 3600
|
||||
|
||||
# Kubernetes
|
||||
kubernetes:
|
||||
enabled: false
|
||||
configPath: "~/.kube/config"
|
||||
context: "default"
|
||||
collectInterval: 1800
|
||||
|
||||
# Network devices
|
||||
network:
|
||||
enabled: false
|
||||
devices: []
|
||||
# - host: "switch1.example.com"
|
||||
# type: "cisco"
|
||||
# username: "admin"
|
||||
# password: "password"
|
||||
collectInterval: 7200
|
||||
|
||||
# Storage
|
||||
storage:
|
||||
enabled: false
|
||||
systems: []
|
||||
collectInterval: 3600
|
||||
|
||||
# =============================================================================
|
||||
# Monitoring & Observability
|
||||
# =============================================================================
|
||||
monitoring:
|
||||
# Metrics
|
||||
metrics:
|
||||
enabled: true
|
||||
port: 9090
|
||||
path: "/metrics"
|
||||
|
||||
# Health checks
|
||||
health:
|
||||
enabled: true
|
||||
path: "/health"
|
||||
interval: 30
|
||||
|
||||
# Tracing
|
||||
tracing:
|
||||
enabled: false
|
||||
provider: "jaeger" # jaeger, zipkin, otlp
|
||||
endpoint: "http://jaeger:14268/api/traces"
|
||||
|
||||
# Logging exporters
|
||||
logging:
|
||||
exporters:
|
||||
- type: "stdout"
|
||||
# - type: "elasticsearch"
|
||||
# endpoint: "http://elasticsearch:9200"
|
||||
# - type: "loki"
|
||||
# endpoint: "http://loki:3100"
|
||||
|
||||
# =============================================================================
|
||||
# Security Settings
|
||||
# =============================================================================
|
||||
security:
|
||||
# Authentication
|
||||
authentication:
|
||||
enabled: true
|
||||
method: "jwt" # jwt, oauth2, ldap
|
||||
tokenExpiration: 3600
|
||||
|
||||
# Authorization
|
||||
authorization:
|
||||
enabled: true
|
||||
rbacEnabled: true
|
||||
|
||||
# Encryption
|
||||
encryption:
|
||||
enabled: true
|
||||
algorithm: "AES-256-GCM"
|
||||
|
||||
# Rate limiting
|
||||
rateLimit:
|
||||
enabled: true
|
||||
requestsPerMinute: 100
|
||||
requestsPerHour: 1000
|
||||
|
||||
# =============================================================================
|
||||
# Backup & Recovery
|
||||
# =============================================================================
|
||||
backup:
|
||||
# Enable backup
|
||||
enabled: true
|
||||
|
||||
# Backup schedule (cron format)
|
||||
schedule: "0 2 * * *" # Daily at 2 AM
|
||||
|
||||
# Retention policy
|
||||
retention:
|
||||
daily: 7
|
||||
weekly: 4
|
||||
monthly: 12
|
||||
|
||||
# Backup destination
|
||||
destination:
|
||||
type: "s3" # s3, gcs, azure, local
|
||||
# s3:
|
||||
# bucket: "datacenter-docs-backups"
|
||||
# region: "us-east-1"
|
||||
# accessKeyId: "your-access-key"
|
||||
# secretAccessKey: "your-secret-key"
|
||||
|
||||
# =============================================================================
|
||||
# Feature Flags
|
||||
# =============================================================================
|
||||
features:
|
||||
# Enable/disable specific features
|
||||
autoRemediation: true
|
||||
aiDocGeneration: true
|
||||
vectorSearch: true
|
||||
chatInterface: true
|
||||
ticketManagement: true
|
||||
multiTenancy: false
|
||||
auditLogging: true
|
||||
realTimeUpdates: true
|
||||
|
||||
# =============================================================================
|
||||
# Resource Limits (for Kubernetes deployments)
|
||||
# =============================================================================
|
||||
resources:
|
||||
# API service
|
||||
api:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "2Gi"
|
||||
cpu: "1000m"
|
||||
|
||||
# Worker service
|
||||
worker:
|
||||
requests:
|
||||
memory: "512Mi"
|
||||
cpu: "250m"
|
||||
limits:
|
||||
memory: "2Gi"
|
||||
cpu: "1000m"
|
||||
|
||||
# Chat service
|
||||
chat:
|
||||
requests:
|
||||
memory: "256Mi"
|
||||
cpu: "100m"
|
||||
limits:
|
||||
memory: "1Gi"
|
||||
cpu: "500m"
|
||||
# =============================================================================
|
||||
# Notes
|
||||
# =============================================================================
|
||||
# - Copy this file to customize your deployment
|
||||
# - For Helm deployments, use: helm install -f values.yaml
|
||||
# - For environment variables, use the .env file
|
||||
# - Sensitive values should be stored in Kubernetes Secrets or external secret managers
|
||||
# - See documentation at: https://git.commandware.com/it-ops/llm-automation-docs-and-remediation-engine
|
||||
Reference in New Issue
Block a user