1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# =============================================================================
# Syncable Agent - Kubernetes Deployment
# =============================================================================
# Deploys the AG-UI agent server as a Kubernetes deployment with service.
#
# Prerequisites:
# - Create secret with API keys:
# kubectl create secret generic syncable-api-keys \
# --from-literal=OPENAI_API_KEY=sk-... \
# --from-literal=ANTHROPIC_API_KEY=sk-ant-...
#
# Apply:
# kubectl apply -f agent-deployment.yaml
#
# =============================================================================
apiVersion: v1
kind: Namespace
metadata:
name: syncable
labels:
app.kubernetes.io/name: syncable
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: syncable-agent
namespace: syncable
labels:
app.kubernetes.io/name: syncable-agent
app.kubernetes.io/component: agent
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: syncable-agent
template:
metadata:
labels:
app.kubernetes.io/name: syncable-agent
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000
containers:
- name: agent
image: syncable-agent:latest
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 9090
protocol: TCP
args:
- "--host"
- "0.0.0.0"
- "--port"
- "9090"
- "--provider"
- "auto"
- "/project"
env:
- name: RUST_LOG
value: "info"
- name: OPENAI_API_KEY
valueFrom:
secretKeyRef:
name: syncable-api-keys
key: OPENAI_API_KEY
optional: true
- name: ANTHROPIC_API_KEY
valueFrom:
secretKeyRef:
name: syncable-api-keys
key: ANTHROPIC_API_KEY
optional: true
resources:
requests:
cpu: "100m"
memory: "256Mi"
limits:
cpu: "1000m"
memory: "1Gi"
livenessProbe:
httpGet:
path: /health
port: http
initialDelaySeconds: 10
periodSeconds: 30
timeoutSeconds: 3
readinessProbe:
httpGet:
path: /health
port: http
initialDelaySeconds: 5
periodSeconds: 10
timeoutSeconds: 3
volumeMounts:
- name: project
mountPath: /project
readOnly: true
volumes:
- name: project
emptyDir:
---
apiVersion: v1
kind: Service
metadata:
name: syncable-agent
namespace: syncable
labels:
app.kubernetes.io/name: syncable-agent
spec:
type: ClusterIP
ports:
- name: http
port: 9090
targetPort: http
protocol: TCP
selector:
app.kubernetes.io/name: syncable-agent
---
# Optional: Ingress for external access
# Uncomment and configure for your ingress controller
# apiVersion: networking.k8s.io/v1
# kind: Ingress
# metadata:
# name: syncable-agent
# namespace: syncable
# annotations:
# nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
# nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
# spec:
# ingressClassName: nginx
# rules:
# - host: agent.syncable.example.com
# http:
# paths:
# - path: /
# pathType: Prefix
# backend:
# service:
# name: syncable-agent
# port:
# name: http