415 lines
11 KiB
YAML
415 lines
11 KiB
YAML
apiVersion: v1
|
|
kind: Namespace
|
|
metadata:
|
|
name: platform-infra
|
|
labels:
|
|
app.kubernetes.io/name: platform-infra
|
|
app.kubernetes.io/managed-by: unidesk
|
|
unidesk.ai/runtime-node: G14
|
|
---
|
|
apiVersion: v1
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: sub2api-config
|
|
namespace: platform-infra
|
|
labels:
|
|
app.kubernetes.io/name: sub2api
|
|
app.kubernetes.io/part-of: platform-infra
|
|
app.kubernetes.io/managed-by: unidesk
|
|
data:
|
|
AUTO_SETUP: "true"
|
|
SERVER_HOST: "0.0.0.0"
|
|
SERVER_PORT: "8080"
|
|
SERVER_MODE: "release"
|
|
RUN_MODE: "standard"
|
|
DATABASE_HOST: "sub2api-postgres"
|
|
DATABASE_PORT: "5432"
|
|
DATABASE_USER: "sub2api"
|
|
DATABASE_DBNAME: "sub2api"
|
|
DATABASE_SSLMODE: "disable"
|
|
DATABASE_MAX_OPEN_CONNS: "10"
|
|
DATABASE_MAX_IDLE_CONNS: "2"
|
|
DATABASE_CONN_MAX_LIFETIME_MINUTES: "30"
|
|
DATABASE_CONN_MAX_IDLE_TIME_MINUTES: "5"
|
|
REDIS_HOST: "sub2api-redis"
|
|
REDIS_PORT: "6379"
|
|
REDIS_PASSWORD: ""
|
|
REDIS_DB: "0"
|
|
REDIS_POOL_SIZE: "32"
|
|
REDIS_MIN_IDLE_CONNS: "2"
|
|
REDIS_ENABLE_TLS: "false"
|
|
ADMIN_EMAIL: "admin@sub2api.platform-infra.local"
|
|
JWT_EXPIRE_HOUR: "24"
|
|
TZ: "Asia/Shanghai"
|
|
SECURITY_URL_ALLOWLIST_ENABLED: "__SUB2API_SECURITY_URL_ALLOWLIST_ENABLED__"
|
|
SECURITY_URL_ALLOWLIST_ALLOW_INSECURE_HTTP: "__SUB2API_SECURITY_URL_ALLOWLIST_ALLOW_INSECURE_HTTP__"
|
|
SECURITY_URL_ALLOWLIST_ALLOW_PRIVATE_HOSTS: "__SUB2API_SECURITY_URL_ALLOWLIST_ALLOW_PRIVATE_HOSTS__"
|
|
SECURITY_URL_ALLOWLIST_UPSTREAM_HOSTS: "__SUB2API_SECURITY_URL_ALLOWLIST_UPSTREAM_HOSTS__"
|
|
UPDATE_PROXY_URL: ""
|
|
GATEWAY_OPENAI_RESPONSE_HEADER_TIMEOUT: "0"
|
|
GATEWAY_OPENAI_HTTP2_ENABLED: "true"
|
|
GATEWAY_OPENAI_HTTP2_ALLOW_PROXY_FALLBACK_TO_HTTP1: "true"
|
|
GATEWAY_OPENAI_HTTP2_FALLBACK_ERROR_THRESHOLD: "2"
|
|
GATEWAY_OPENAI_HTTP2_FALLBACK_WINDOW_SECONDS: "60"
|
|
GATEWAY_OPENAI_HTTP2_FALLBACK_TTL_SECONDS: "600"
|
|
GATEWAY_IMAGE_STREAM_DATA_INTERVAL_TIMEOUT: "900"
|
|
GATEWAY_IMAGE_STREAM_KEEPALIVE_INTERVAL: "10"
|
|
GATEWAY_IMAGE_CONCURRENCY_ENABLED: "false"
|
|
GATEWAY_IMAGE_CONCURRENCY_MAX_CONCURRENT_REQUESTS: "0"
|
|
GATEWAY_IMAGE_CONCURRENCY_OVERFLOW_MODE: "reject"
|
|
GATEWAY_IMAGE_CONCURRENCY_WAIT_TIMEOUT_SECONDS: "30"
|
|
GATEWAY_IMAGE_CONCURRENCY_MAX_WAITING_REQUESTS: "100"
|
|
---
|
|
apiVersion: v1
|
|
kind: PersistentVolumeClaim
|
|
metadata:
|
|
name: sub2api-data
|
|
namespace: platform-infra
|
|
labels:
|
|
app.kubernetes.io/name: sub2api
|
|
app.kubernetes.io/component: app
|
|
app.kubernetes.io/part-of: platform-infra
|
|
app.kubernetes.io/managed-by: unidesk
|
|
spec:
|
|
accessModes:
|
|
- ReadWriteOnce
|
|
storageClassName: local-path
|
|
resources:
|
|
requests:
|
|
storage: 2Gi
|
|
---
|
|
apiVersion: v1
|
|
kind: PersistentVolumeClaim
|
|
metadata:
|
|
name: sub2api-redis-data
|
|
namespace: platform-infra
|
|
labels:
|
|
app.kubernetes.io/name: sub2api-redis
|
|
app.kubernetes.io/component: redis
|
|
app.kubernetes.io/part-of: platform-infra
|
|
app.kubernetes.io/managed-by: unidesk
|
|
spec:
|
|
accessModes:
|
|
- ReadWriteOnce
|
|
storageClassName: local-path
|
|
resources:
|
|
requests:
|
|
storage: 2Gi
|
|
---
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: sub2api-postgres
|
|
namespace: platform-infra
|
|
labels:
|
|
app.kubernetes.io/name: sub2api-postgres
|
|
app.kubernetes.io/component: postgres
|
|
app.kubernetes.io/part-of: platform-infra
|
|
app.kubernetes.io/managed-by: unidesk
|
|
spec:
|
|
selector:
|
|
app.kubernetes.io/name: sub2api-postgres
|
|
app.kubernetes.io/component: postgres
|
|
ports:
|
|
- name: postgres
|
|
port: 5432
|
|
targetPort: postgres
|
|
---
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: sub2api-redis
|
|
namespace: platform-infra
|
|
labels:
|
|
app.kubernetes.io/name: sub2api-redis
|
|
app.kubernetes.io/component: redis
|
|
app.kubernetes.io/part-of: platform-infra
|
|
app.kubernetes.io/managed-by: unidesk
|
|
spec:
|
|
selector:
|
|
app.kubernetes.io/name: sub2api-redis
|
|
app.kubernetes.io/component: redis
|
|
ports:
|
|
- name: redis
|
|
port: 6379
|
|
targetPort: redis
|
|
---
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: sub2api
|
|
namespace: platform-infra
|
|
labels:
|
|
app.kubernetes.io/name: sub2api
|
|
app.kubernetes.io/component: app
|
|
app.kubernetes.io/part-of: platform-infra
|
|
app.kubernetes.io/managed-by: unidesk
|
|
spec:
|
|
selector:
|
|
app.kubernetes.io/name: sub2api
|
|
app.kubernetes.io/component: app
|
|
ports:
|
|
- name: http
|
|
port: 8080
|
|
targetPort: http
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: StatefulSet
|
|
metadata:
|
|
name: sub2api-postgres
|
|
namespace: platform-infra
|
|
labels:
|
|
app.kubernetes.io/name: sub2api-postgres
|
|
app.kubernetes.io/component: postgres
|
|
app.kubernetes.io/part-of: platform-infra
|
|
app.kubernetes.io/managed-by: unidesk
|
|
spec:
|
|
serviceName: sub2api-postgres
|
|
replicas: 1
|
|
selector:
|
|
matchLabels:
|
|
app.kubernetes.io/name: sub2api-postgres
|
|
app.kubernetes.io/component: postgres
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app.kubernetes.io/name: sub2api-postgres
|
|
app.kubernetes.io/component: postgres
|
|
app.kubernetes.io/part-of: platform-infra
|
|
spec:
|
|
securityContext:
|
|
fsGroup: 70
|
|
containers:
|
|
- name: postgres
|
|
image: postgres:18-alpine
|
|
imagePullPolicy: IfNotPresent
|
|
ports:
|
|
- name: postgres
|
|
containerPort: 5432
|
|
env:
|
|
- name: POSTGRES_USER
|
|
value: sub2api
|
|
- name: POSTGRES_PASSWORD
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: sub2api-secrets
|
|
key: POSTGRES_PASSWORD
|
|
- name: POSTGRES_DB
|
|
value: sub2api
|
|
- name: PGDATA
|
|
value: /var/lib/postgresql/data
|
|
- name: TZ
|
|
value: Asia/Shanghai
|
|
readinessProbe:
|
|
exec:
|
|
command:
|
|
- sh
|
|
- -c
|
|
- pg_isready -U sub2api -d sub2api -h 127.0.0.1
|
|
initialDelaySeconds: 5
|
|
periodSeconds: 10
|
|
timeoutSeconds: 5
|
|
failureThreshold: 6
|
|
livenessProbe:
|
|
exec:
|
|
command:
|
|
- sh
|
|
- -c
|
|
- pg_isready -U sub2api -d sub2api -h 127.0.0.1
|
|
initialDelaySeconds: 30
|
|
periodSeconds: 20
|
|
timeoutSeconds: 5
|
|
failureThreshold: 6
|
|
volumeMounts:
|
|
- name: postgres-data
|
|
mountPath: /var/lib/postgresql/data
|
|
volumeClaimTemplates:
|
|
- metadata:
|
|
name: postgres-data
|
|
labels:
|
|
app.kubernetes.io/name: sub2api-postgres
|
|
app.kubernetes.io/component: postgres
|
|
app.kubernetes.io/part-of: platform-infra
|
|
app.kubernetes.io/managed-by: unidesk
|
|
spec:
|
|
accessModes:
|
|
- ReadWriteOnce
|
|
storageClassName: local-path
|
|
resources:
|
|
requests:
|
|
storage: 10Gi
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: sub2api-redis
|
|
namespace: platform-infra
|
|
labels:
|
|
app.kubernetes.io/name: sub2api-redis
|
|
app.kubernetes.io/component: redis
|
|
app.kubernetes.io/part-of: platform-infra
|
|
app.kubernetes.io/managed-by: unidesk
|
|
spec:
|
|
replicas: 1
|
|
strategy:
|
|
type: Recreate
|
|
selector:
|
|
matchLabels:
|
|
app.kubernetes.io/name: sub2api-redis
|
|
app.kubernetes.io/component: redis
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app.kubernetes.io/name: sub2api-redis
|
|
app.kubernetes.io/component: redis
|
|
app.kubernetes.io/part-of: platform-infra
|
|
spec:
|
|
securityContext:
|
|
fsGroup: 999
|
|
containers:
|
|
- name: redis
|
|
image: redis:8-alpine
|
|
imagePullPolicy: IfNotPresent
|
|
command:
|
|
- sh
|
|
- -c
|
|
args:
|
|
- redis-server --save 60 1 --appendonly yes --appendfsync everysec
|
|
ports:
|
|
- name: redis
|
|
containerPort: 6379
|
|
env:
|
|
- name: TZ
|
|
value: Asia/Shanghai
|
|
readinessProbe:
|
|
exec:
|
|
command:
|
|
- redis-cli
|
|
- ping
|
|
initialDelaySeconds: 5
|
|
periodSeconds: 10
|
|
timeoutSeconds: 5
|
|
failureThreshold: 6
|
|
livenessProbe:
|
|
exec:
|
|
command:
|
|
- redis-cli
|
|
- ping
|
|
initialDelaySeconds: 30
|
|
periodSeconds: 20
|
|
timeoutSeconds: 5
|
|
failureThreshold: 6
|
|
volumeMounts:
|
|
- name: redis-data
|
|
mountPath: /data
|
|
volumes:
|
|
- name: redis-data
|
|
persistentVolumeClaim:
|
|
claimName: sub2api-redis-data
|
|
---
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: sub2api
|
|
namespace: platform-infra
|
|
labels:
|
|
app.kubernetes.io/name: sub2api
|
|
app.kubernetes.io/component: app
|
|
app.kubernetes.io/part-of: platform-infra
|
|
app.kubernetes.io/managed-by: unidesk
|
|
spec:
|
|
replicas: 1
|
|
strategy:
|
|
type: Recreate
|
|
selector:
|
|
matchLabels:
|
|
app.kubernetes.io/name: sub2api
|
|
app.kubernetes.io/component: app
|
|
template:
|
|
metadata:
|
|
annotations:
|
|
unidesk.ai/sub2api-config-hash: "__SUB2API_CONFIG_HASH__"
|
|
labels:
|
|
app.kubernetes.io/name: sub2api
|
|
app.kubernetes.io/component: app
|
|
app.kubernetes.io/part-of: platform-infra
|
|
spec:
|
|
securityContext:
|
|
fsGroup: 1000
|
|
initContainers:
|
|
- name: wait-postgres
|
|
image: postgres:18-alpine
|
|
imagePullPolicy: IfNotPresent
|
|
command:
|
|
- sh
|
|
- -c
|
|
- until pg_isready -h sub2api-postgres -U sub2api -d sub2api; do sleep 2; done
|
|
- name: wait-redis
|
|
image: redis:8-alpine
|
|
imagePullPolicy: IfNotPresent
|
|
command:
|
|
- sh
|
|
- -c
|
|
- until redis-cli -h sub2api-redis ping | grep -q PONG; do sleep 2; done
|
|
containers:
|
|
- name: sub2api
|
|
image: __SUB2API_IMAGE__
|
|
imagePullPolicy: __SUB2API_IMAGE_PULL_POLICY__
|
|
ports:
|
|
- name: http
|
|
containerPort: 8080
|
|
envFrom:
|
|
- configMapRef:
|
|
name: sub2api-config
|
|
env:
|
|
- name: DATABASE_PASSWORD
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: sub2api-secrets
|
|
key: POSTGRES_PASSWORD
|
|
- name: ADMIN_PASSWORD
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: sub2api-secrets
|
|
key: ADMIN_PASSWORD
|
|
- name: JWT_SECRET
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: sub2api-secrets
|
|
key: JWT_SECRET
|
|
- name: TOTP_ENCRYPTION_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: sub2api-secrets
|
|
key: TOTP_ENCRYPTION_KEY
|
|
readinessProbe:
|
|
httpGet:
|
|
path: /health
|
|
port: http
|
|
initialDelaySeconds: 10
|
|
periodSeconds: 10
|
|
timeoutSeconds: 5
|
|
failureThreshold: 6
|
|
livenessProbe:
|
|
httpGet:
|
|
path: /health
|
|
port: http
|
|
initialDelaySeconds: 30
|
|
periodSeconds: 20
|
|
timeoutSeconds: 5
|
|
failureThreshold: 6
|
|
startupProbe:
|
|
httpGet:
|
|
path: /health
|
|
port: http
|
|
periodSeconds: 10
|
|
timeoutSeconds: 5
|
|
failureThreshold: 30
|
|
volumeMounts:
|
|
- name: sub2api-data
|
|
mountPath: /app/data
|
|
volumes:
|
|
- name: sub2api-data
|
|
persistentVolumeClaim:
|
|
claimName: sub2api-data
|