feat: add Dockerfile, K8s manifests, and deployment docs (#303)

This commit is contained in:
Carlos Florêncio
2026-02-27 16:38:53 +00:00
committed by GitHub
parent 50b3543bf1
commit 9e995ba1b8
12 changed files with 781 additions and 1 deletions
+18
View File
@@ -0,0 +1,18 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: kandev-config
labels:
app: kandev
data:
# Database — SQLite on the PV. Set KANDEV_DATABASE_DRIVER=postgres for production.
KANDEV_DATABASE_PATH: /data/kandev.db
# Disable Docker runtime (no Docker-in-Docker in K8s)
KANDEV_DOCKER_ENABLED: "false"
# Worktree storage on the PV
KANDEV_WORKTREE_BASEPATH: /data/worktrees
# Logging — auto-detects K8s and uses JSON format
KANDEV_LOG_LEVEL: info
+62
View File
@@ -0,0 +1,62 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: kandev
labels:
app: kandev
spec:
# SQLite is single-writer — use 1 replica. Switch to Postgres for horizontal scaling.
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: kandev
template:
metadata:
labels:
app: kandev
spec:
containers:
- name: kandev
image: kandev:latest
ports:
- name: backend
containerPort: 8080
protocol: TCP
- name: web
containerPort: 3000
protocol: TCP
envFrom:
- configMapRef:
name: kandev-config
resources:
requests:
cpu: 250m
memory: 512Mi
limits:
cpu: "2"
memory: 2Gi
livenessProbe:
httpGet:
path: /health
port: backend
initialDelaySeconds: 15
periodSeconds: 30
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /health
port: backend
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 3
failureThreshold: 3
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: kandev-data
+50
View File
@@ -0,0 +1,50 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kandev
labels:
app: kandev
annotations:
# Adjust annotations for your ingress controller (nginx, traefik, etc.)
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
# WebSocket support
nginx.ingress.kubernetes.io/proxy-http-version: "1.1"
nginx.ingress.kubernetes.io/configuration-snippet: |
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
spec:
rules:
- host: kandev.example.com
http:
paths:
# Backend API + WebSocket
- path: /api
pathType: Prefix
backend:
service:
name: kandev
port:
name: backend
- path: /ws
pathType: Prefix
backend:
service:
name: kandev
port:
name: backend
- path: /health
pathType: Exact
backend:
service:
name: kandev
port:
name: backend
# Web UI (catch-all)
- path: /
pathType: Prefix
backend:
service:
name: kandev
port:
name: web
+12
View File
@@ -0,0 +1,12 @@
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: kandev-data
labels:
app: kandev
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
+19
View File
@@ -0,0 +1,19 @@
apiVersion: v1
kind: Service
metadata:
name: kandev
labels:
app: kandev
spec:
type: ClusterIP
selector:
app: kandev
ports:
- name: backend
port: 8080
targetPort: backend
protocol: TCP
- name: web
port: 3000
targetPort: web
protocol: TCP