TFRServer Deployment
Deploy TFRServer service instances.
Overview
TFRServer is a namespace-scoped resource deployed in the tenant namespace created by TFRTenant, managing individual TFRobot server instances:
- API Server - Main service process
- Worker - Async task processing
- RobotWorker - Robot task processing
- Confz Config - Maps 1:1 to TFRobotServer TOML config; user-specified values override system-generated values
- Secret / ConfigMap - Third-party API Keys and environment variables
TFRServer depends on the tenant namespace and middleware created by TFRTenant. Ensure TFRTenant status is Available before deployment.
Configuration
Core Fields
| Field | Description | Example |
|---|---|---|
name | TFRServer resource name (i.e. robotId) | friday |
namespace | Tenant namespace (created by TFRTenant) | staging-tenant |
confzData | Confz structured config | See below |
secretData | Sensitive env vars (API Keys, etc.) | See below |
configData | Non-sensitive env vars | See below |
Confz Config
confzData maps 1:1 to TFRobotServer's TOML config. Most fields are dynamically generated by the system (postgresql, redis, celery, cos, grafana, etc.). Typically only the following fields need configuration:
confzData:
admin:
adminSecret: "<admin-secret>"
jwtSecret: "<jwt-signing-secret>"
password: "<argon2-hashed-password>"
robot:
robotId: "friday"
host: "https://staging.turingfocus.cn"
dbSchema: "tfrobot"
sessionSecret: "<session-secret>"
loguru:
level: "INFO"
feature:
uploadFileSizeLimitMb: "50"
postgresql, redis, celery, cos, grafana, otlp configs are auto-generated by the Controller based on TFRTenant middleware status. To override, explicitly specify them in confzData.
Image Configuration (Optional)
apiImage: "docker.cnb.cool/turingfocus/tfrobotv2/tfrobotserver:latest"
workerImage: "docker.cnb.cool/turingfocus/tfrobotv2/tfrobotserver:latest"
robotWorkerImage: "docker.cnb.cool/turingfocus/tfrobotv2/tfrobotserver:latest"
imagePullPolicy: "IfNotPresent"
imagePullSecret: "tfrs-private-registry"
Uses Controller's built-in default images when not specified.
Storage Configuration (Optional)
storage:
storageClass: "cbs"
defaultSize: "10Gi"
Inherits from TFRTenant or TFRCluster config when not specified.
Sample Configs
config/samples/tfrobot_v1_tfrserver_staging.yaml- Staging environment (with full field comments)config/samples/tfrobot_v1_tfrserver.yaml- General template (TODO placeholders)
Kustomize Deployment
Create CR Manifest
# tfrserver-staging.yaml
apiVersion: tfrobot.tfrobotserver.cn/v1
kind: TFRServer
metadata:
name: friday
namespace: "staging-tenant"
spec:
confzData:
admin:
adminSecret: "<admin-secret>"
jwtSecret: "<jwt-signing-secret>"
password: "<argon2-hashed-password>"
robot:
robotId: "friday"
host: "https://staging.turingfocus.cn"
dbSchema: "tfrobot"
sessionSecret: "<session-secret>"
loguru:
level: "INFO"
feature:
uploadFileSizeLimitMb: "50"
imagePullSecret: "tfrs-private-registry"
secretData:
OPENAI_API_KEY: "<your-openai-key>"
ANTHROPIC_API_KEY: "<your-anthropic-key>"
# ... other API Keys
configData:
TFS_PROFILE: "tkeprod"
OPENAI_BASE_URL: "https://api.openai-proxy.org/v1"
ANTHROPIC_BASE_URL: "https://api.openai-proxy.org/anthropic"
TOKENIZERS_PARALLELISM: "false"
Full staging config example: config/samples/tfrobot_v1_tfrserver_staging.yaml
Deploy
kubectl apply -f tfrserver-staging.yaml
# tfrserver.tfrobot.tfrobotserver.cn/friday created
Verify
# Check TFRServer status
kubectl get tfrserver -n staging-tenant
# Wait for deployment to complete (timeout 10 minutes)
kubectl wait tfrserver friday -n staging-tenant --for=condition=Available --timeout=600s
# Check component status
kubectl get tfrserver friday -n staging-tenant -o jsonpath='{.status.components}' | jq
# Check service URL
kubectl get tfrserver friday -n staging-tenant -o jsonpath='{.status.serviceURL}'
Monitor deployment progress in real-time
watch -n 5 'echo "=== TFRServer Status ===" && \
kubectl get tfrserver friday -n staging-tenant -o jsonpath="{.status.conditions[0].message}" && \
echo && echo && \
echo "=== Pods ===" && \
kubectl get pods -n staging-tenant -l app.kubernetes.io/instance=friday'
Check Deployment Completion
TFRServer uses the Available condition in status.conditions to indicate deployment status:
# Check Available condition
kubectl get tfrserver friday -n staging-tenant -o jsonpath='{.status.conditions[?(@.type=="Available")].status}'
# True = deployment complete, False = deploying or failed
# Automation script: wait for deployment (timeout 10 minutes)
kubectl wait tfrserver friday -n staging-tenant --for=condition=Available --timeout=600s
Uninstall
kubectl delete tfrserver friday -n staging-tenant
Helm Deployment
Deploy
Install from OCI registry
helm install tfrserver oci://helm.cnb.cool/turingfocus/tfrs-operator/tfrserver \
--version 0.2.0-alpha1 \
--namespace staging-tenant \
-f values-staging.yaml
Install with values file
helm install tfrserver oci://helm.cnb.cool/turingfocus/tfrs-operator/tfrserver \
--version 0.2.0-alpha1 \
--namespace staging-tenant \
-f values-staging.yaml \
--set confzData.admin.adminSecret="<SECRET>" \
--set confzData.admin.jwtSecret="<SECRET>"
Install from local source
helm install tfrserver ./chart/tfrserver \
--namespace staging-tenant \
-f chart/tfrserver/values-staging.yaml
TFRServer requires --namespace, which must match the namespace field in the values file — the tenant namespace created by TFRTenant.
Verify
# Check TFRServer status
kubectl get tfrserver -n staging-tenant
# Wait for deployment to complete (timeout 10 minutes)
kubectl wait tfrserver friday -n staging-tenant --for=condition=Available --timeout=600s
# Check component status
kubectl get tfrserver friday -n staging-tenant -o jsonpath='{.status.components}' | jq
# Check service URL
kubectl get tfrserver friday -n staging-tenant -o jsonpath='{.status.serviceURL}'
Monitor deployment progress in real-time
while true; do clear; echo "--- $(date +%H:%M:%S) ---"; \
echo "=== Conditions ==="; \
kubectl get tfrserver friday -n staging-tenant -o json 2>/dev/null \
| jq -r '.status.conditions[]? | "\(.type): \(.status) - \(.message)"'; \
echo; echo "=== Components ==="; \
kubectl get tfrserver friday -n staging-tenant -o json 2>/dev/null \
| jq -r '.status.components // {} | to_entries[] | "\(.key): \(.value.state)"'; \
echo; echo "=== Pods ==="; \
kubectl get pods -n staging-tenant -l app.kubernetes.io/instance=friday 2>/dev/null; \
sleep 10; done
Press Ctrl+C to exit.
Check Deployment Completion
TFRServer uses the Available condition in status.conditions to indicate deployment status:
# Check Available condition
kubectl get tfrserver friday -n staging-tenant -o jsonpath='{.status.conditions[?(@.type=="Available")].status}'
# True = deployment complete, False = deploying or failed
# Automation script: wait for deployment (timeout 10 minutes)
kubectl wait tfrserver friday -n staging-tenant --for=condition=Available --timeout=600s
Uninstall
helm uninstall tfrserver -n staging-tenant
Uninstalling TFRServer removes the service instance and its associated Secrets, ConfigMaps, Jobs, etc. Database data is preserved in TFRTenant's PostgreSQL.