- Database deployment script (scripts/deploy-database.sh) - Kubernetes manifests for CNPG PostgreSQL cluster (k8s/base/) - Documentation (docs/DEPLOYMENT_GUIDE.md, DATASTORE_SPEC.md, INTEGRATION_SPEC.md) - README with architecture overview and operations guide
149 lines
4.5 KiB
YAML
149 lines
4.5 KiB
YAML
# Copyright 2026 Umbra Tools (umbratools.com)
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
---
|
|
# Job to import existing productions data into PostgreSQL
|
|
# Run once after initial deployment: kubectl apply -f 06-import-job.yaml
|
|
apiVersion: batch/v1
|
|
kind: Job
|
|
metadata:
|
|
name: umbratrans-import-productions
|
|
namespace: umbratrans
|
|
labels:
|
|
app: umbratrans-import
|
|
component: import
|
|
annotations:
|
|
# Allow job to run for a long time
|
|
batch.kubernetes.io/job-tracking: "true"
|
|
spec:
|
|
ttlSecondsAfterFinished: 86400 # Keep job for 24h after completion
|
|
backoffLimit: 3
|
|
activeDeadlineSeconds: 7200 # 2 hours max
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: umbratrans-import
|
|
component: import
|
|
annotations:
|
|
prometheus.io/scrape: "false"
|
|
spec:
|
|
serviceAccountName: umbratrans-worker
|
|
restartPolicy: OnFailure
|
|
securityContext:
|
|
runAsNonRoot: true
|
|
runAsUser: 1000
|
|
runAsGroup: 1000
|
|
fsGroup: 1000
|
|
initContainers:
|
|
- name: wait-for-db
|
|
image: postgres:16-alpine
|
|
command: ["sh", "-c", "until pg_isready -h umbratrans-db-rw -U umbratrans -d umbratrans; do sleep 5; done"]
|
|
env:
|
|
- name: PGPASSWORD
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: umbratrans-db-credentials
|
|
key: password
|
|
containers:
|
|
- name: import
|
|
image: umbratrans-worker:latest
|
|
imagePullPolicy: IfNotPresent
|
|
command: ["python", "-m", "umbratrans_web.cli", "import-productions"]
|
|
args:
|
|
- "--organization"
|
|
- "umbra" # Organization slug
|
|
- "--confirm"
|
|
envFrom:
|
|
- secretRef:
|
|
name: umbratrans-worker-config
|
|
- secretRef:
|
|
name: umbratrans-db-credentials
|
|
- secretRef:
|
|
name: umbratrans-secrets
|
|
volumeMounts:
|
|
- name: productions
|
|
mountPath: /mnt/productions
|
|
readOnly: true
|
|
- name: artifacts
|
|
mountPath: /mnt/artifacts
|
|
resources:
|
|
requests:
|
|
memory: "512Mi"
|
|
cpu: "500m"
|
|
limits:
|
|
memory: "2Gi"
|
|
cpu: "2000m"
|
|
volumes:
|
|
- name: productions
|
|
persistentVolumeClaim:
|
|
claimName: umbratrans-productions
|
|
- name: artifacts
|
|
persistentVolumeClaim:
|
|
claimName: umbratrans-artifacts
|
|
|
|
---
|
|
# CronJob for periodic re-import (optional - for catching new productions)
|
|
apiVersion: batch/v1
|
|
kind: CronJob
|
|
metadata:
|
|
name: umbratrans-import-productions-schedule
|
|
namespace: umbratrans
|
|
labels:
|
|
app: umbratrans-import
|
|
component: import
|
|
spec:
|
|
schedule: "0 3 * * *" # Daily at 3 AM UTC
|
|
concurrencyPolicy: Forbid
|
|
successfulJobsHistoryLimit: 3
|
|
failedJobsHistoryLimit: 3
|
|
jobTemplate:
|
|
spec:
|
|
ttlSecondsAfterFinished: 86400
|
|
backoffLimit: 1
|
|
activeDeadlineSeconds: 7200
|
|
template:
|
|
spec:
|
|
serviceAccountName: umbratrans-worker
|
|
restartPolicy: OnFailure
|
|
securityContext:
|
|
runAsNonRoot: true
|
|
runAsUser: 1000
|
|
runAsGroup: 1000
|
|
fsGroup: 1000
|
|
containers:
|
|
- name: import
|
|
image: umbratrans-worker:latest
|
|
imagePullPolicy: IfNotPresent
|
|
command: ["python", "-m", "umbratrans_web.cli", "import-productions"]
|
|
args:
|
|
- "--organization"
|
|
- "umbra"
|
|
- "--incremental" # Only import new/changed
|
|
envFrom:
|
|
- secretRef:
|
|
name: umbratrans-worker-config
|
|
- secretRef:
|
|
name: umbratrans-db-credentials
|
|
- secretRef:
|
|
name: umbratrans-secrets
|
|
volumeMounts:
|
|
- name: productions
|
|
mountPath: /mnt/productions
|
|
readOnly: true
|
|
- name: artifacts
|
|
mountPath: /mnt/artifacts
|
|
resources:
|
|
requests:
|
|
memory: "512Mi"
|
|
cpu: "500m"
|
|
limits:
|
|
memory: "2Gi"
|
|
cpu: "2000m"
|
|
volumes:
|
|
- name: productions
|
|
persistentVolumeClaim:
|
|
claimName: umbratrans-productions
|
|
- name: artifacts
|
|
persistentVolumeClaim:
|
|
claimName: umbratrans-artifacts
|