tribe-cli
Version:
TRIBE multi-agent development system - Zero to productive with one command
448 lines (437 loc) • 10.5 kB
YAML
# TRIBE Complete Deployment - Bundled with NPM Package
# This file is automatically deployed by 'npx @0zen/tribe-cli'
apiVersion: v1
kind: Namespace
metadata:
name: tribe-system
# ServiceAccount for Bridge
apiVersion: v1
kind: ServiceAccount
metadata:
name: bridge
namespace: tribe-system
# Role for Bridge
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: bridge-role
namespace: tribe-system
rules:
- apiGroups: [""]
resources: ["pods", "services", "pods/exec", "pods/log", "configmaps", "secrets", "namespaces"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["apps"]
resources: ["deployments", "replicasets"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
# RoleBinding for Bridge
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: bridge-rolebinding
namespace: tribe-system
subjects:
- kind: ServiceAccount
name: bridge
namespace: tribe-system
roleRef:
kind: Role
name: bridge-role
apiGroup: rbac.authorization.k8s.io
# PostgreSQL
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
namespace: tribe-system
spec:
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:15
env:
- name: POSTGRES_DB
value: gitea
- name: POSTGRES_USER
value: gitea
- name: POSTGRES_PASSWORD
value: gitea
ports:
- containerPort: 5432
readinessProbe:
exec:
command:
- pg_isready
- -U
- gitea
initialDelaySeconds: 5
periodSeconds: 5
apiVersion: v1
kind: Service
metadata:
name: postgres
namespace: tribe-system
spec:
selector:
app: postgres
ports:
- port: 5432
# Gitea
apiVersion: apps/v1
kind: Deployment
metadata:
name: gitea
namespace: tribe-system
spec:
replicas: 1
selector:
matchLabels:
app: gitea
template:
metadata:
labels:
app: gitea
spec:
initContainers:
- name: wait-for-db
image: busybox:1.35
command: ['sh', '-c', 'until nc -z postgres 5432; do echo waiting for db; sleep 2; done']
- name: init-gitea
image: gitea/gitea:1.20.5
command: ['/bin/bash', '-c']
args:
- |
# Create app.ini
mkdir -p /data/gitea/conf
cat > /data/gitea/conf/app.ini << 'EOF'
APP_NAME = Gitea
RUN_MODE = prod
[database]
DB_TYPE = postgres
HOST = postgres:5432
NAME = gitea
USER = gitea
PASSWD = gitea
[server]
DOMAIN = gitea
ROOT_URL = http://gitea:3000/
HTTP_PORT = 3000
[service]
DISABLE_REGISTRATION = true
[security]
INSTALL_LOCK = true
SECRET_KEY = changeme
EOF
# Run migrations
gitea migrate
# Create admin user
gitea admin user create --admin --username gitea_admin --password admin123 --email admin@example.com || true
env:
- name: GITEA_WORK_DIR
value: /data
- name: GITEA_CUSTOM
value: /data/gitea
volumeMounts:
- name: gitea-data
mountPath: /data
containers:
- name: gitea
image: gitea/gitea:1.20.5
ports:
- containerPort: 3000
env:
- name: GITEA_WORK_DIR
value: /data
- name: GITEA_CUSTOM
value: /data/gitea
volumeMounts:
- name: gitea-data
mountPath: /data
readinessProbe:
httpGet:
path: /
port: 3000
initialDelaySeconds: 30
periodSeconds: 10
volumes:
- name: gitea-data
emptyDir: {}
apiVersion: v1
kind: Service
metadata:
name: gitea
namespace: tribe-system
spec:
selector:
app: gitea
ports:
- port: 3000
# TaskMaster
apiVersion: apps/v1
kind: Deployment
metadata:
name: taskmaster
namespace: tribe-system
spec:
replicas: 1
selector:
matchLabels:
app: taskmaster
template:
metadata:
labels:
app: taskmaster
spec:
initContainers:
- name: wait-for-db
image: busybox:1.35
command: ['sh', '-c', 'until nc -z postgres 5432; do echo waiting for db; sleep 2; done']
containers:
- name: taskmaster
image: taskmaster:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000
env:
- name: FLASK_ENV
value: development
- name: DATABASE_URL
value: postgresql://gitea:gitea@postgres:5432/gitea
- name: GITEA_URL
value: http://gitea:3000
- name: GITEA_TOKEN
value: will-be-set-by-init-job
readinessProbe:
httpGet:
path: /
port: 5000
initialDelaySeconds: 10
periodSeconds: 5
apiVersion: v1
kind: Service
metadata:
name: taskmaster
namespace: tribe-system
spec:
selector:
app: taskmaster
ports:
- port: 5000
# Bridge
apiVersion: apps/v1
kind: Deployment
metadata:
name: bridge
namespace: tribe-system
spec:
replicas: 1
selector:
matchLabels:
app: bridge
template:
metadata:
labels:
app: bridge
spec:
serviceAccountName: bridge
initContainers:
- name: wait-for-services
image: busybox:1.35
command: ['sh', '-c']
args:
- |
echo "Waiting for services..."
until nc -z taskmaster 5000; do echo waiting for taskmaster; sleep 2; done
until nc -z gitea 3000; do echo waiting for gitea; sleep 2; done
echo "All services ready!"
containers:
- name: bridge
image: bridge:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
- containerPort: 3456
env:
- name: TASKMASTER_URL
value: http://taskmaster:5000
- name: GITEA_URL
value: http://gitea:3000
- name: GITEA_ADMIN_USER
value: gitea_admin
- name: GITEA_ADMIN_PASSWORD
value: admin123
- name: NAMESPACE
value: tribe-system
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
apiVersion: v1
kind: Service
metadata:
name: bridge
namespace: tribe-system
spec:
selector:
app: bridge
ports:
- name: http
port: 8080
- name: websocket
port: 3456
# Claude Worker Deployment (starts with 0 replicas)
apiVersion: apps/v1
kind: Deployment
metadata:
name: claude-worker-deployment
namespace: tribe-system
spec:
replicas: 0
selector:
matchLabels:
app: claude-worker
template:
metadata:
labels:
app: claude-worker
spec:
containers:
- name: claude-agent
image: claude-agent:latest
imagePullPolicy: IfNotPresent
env:
- name: ROLE
value: worker
- name: TASKMASTER_URL
value: http://taskmaster:5000
- name: GITEA_URL
value: http://gitea:3000
- name: NAMESPACE
value: tribe-system
- name: ANTHROPIC_API_KEY
valueFrom:
secretKeyRef:
name: claude-api-key
key: api-key
optional: true
volumeMounts:
- name: workspace
mountPath: /workspace
- name: config
mountPath: /app/minimal-config
readinessProbe:
exec:
command:
- /bin/sh
- -c
- test -f /tmp/worker-ready
initialDelaySeconds: 30
periodSeconds: 10
volumes:
- name: workspace
emptyDir: {}
- name: config
configMap:
name: claude-config
optional: true
# NodePort service for easy access
apiVersion: v1
kind: Service
metadata:
name: bridge-nodeport
namespace: tribe-system
spec:
type: NodePort
selector:
app: bridge
ports:
- name: http
port: 8080
nodePort: 30080
- name: websocket
port: 3456
nodePort: 30456
# ConfigMap for Claude agent configuration
apiVersion: v1
kind: ConfigMap
metadata:
name: claude-config
namespace: tribe-system
data:
config.yaml: |
mcp_servers:
filesystem:
command: npx
args: ["-y", "@modelcontextprotocol/server-filesystem", "/workspace"]
git:
command: npx
args: ["-y", "@modelcontextprotocol/server-git"]
env:
PATH: /usr/local/bin:/usr/bin:/bin
# Initialization Job
apiVersion: batch/v1
kind: Job
metadata:
name: tribe-init
namespace: tribe-system
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: init
image: curlimages/curl:8.4.0
command: ['/bin/sh', '-c']
args:
- |
echo "Waiting for Gitea to be ready..."
until curl -s http://gitea:3000 > /dev/null; do
echo "Waiting for Gitea..."
sleep 5
done
echo "Creating Gitea access token..."
TOKEN=$(curl -s -X POST http://gitea:3000/api/v1/users/gitea_admin/tokens \
-u gitea_admin:admin123 \
-H "Content-Type: application/json" \
-d '{"name":"taskmaster-'$(date +%s)'","scopes":["write:repository","write:user","write:issue","write:organization","read:repository"]}' \
| grep -o '"sha1":"[^"]*' | cut -d'"' -f4)
if [ -z "$TOKEN" ]; then
echo "Failed to create token!"
exit 1
fi
echo "Token created successfully"
# Update TaskMaster with the token
echo "Updating TaskMaster configuration..."
curl -X POST http://taskmaster:5000/api/config \
-H "Content-Type: application/json" \
-d "{\"gitea_token\":\"$TOKEN\"}"
echo "Initialization complete!"