Fixes https://github.com/webrecorder/browsertrix/issues/1905 - adds a new top-level `/api/subscriptions` endpoint and SubOps handler on the backend. - enable subscriptions API endpoints available only if `billing_enabled` is set in helm chart - new POST /subscriptions/create, /subscriptions/update, /subscriptions/cancel API endpoints - Subscriptions mongo collection storing timestamped /subscription API events - GET /subscriptions/events API to get subscription events, support for filtering and sorting - Subscription data model - Support for setting and handling readOnlyOnCancel on org - /orgs/<id>/billing-portal to lookup portalUrl using external API - subscription in org getter and list views - mark org as readOnly for subscription status `paused_payment_failed`, clears it on status `active` --------- Co-authored-by: Tessa Walsh <tessa@bitarchivist.net>
		
			
				
	
	
		
			279 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			279 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
| ---
 | |
| apiVersion: apps/v1
 | |
| kind: Deployment
 | |
| metadata:
 | |
|   name: {{ .Values.name }}-backend
 | |
|   namespace: {{ .Release.Namespace }}
 | |
| 
 | |
| spec:
 | |
|   selector:
 | |
|     matchLabels:
 | |
|       app: {{ .Values.name }}
 | |
|       role: backend
 | |
| {{- if eq (int .Values.backend_max_replicas) 1 }}
 | |
|   replicas: 1
 | |
| {{- end }}
 | |
|   template:
 | |
|     metadata:
 | |
|       labels:
 | |
|         app: {{ .Values.name }}
 | |
|         role: backend
 | |
| 
 | |
|       annotations:
 | |
|         # force helm to update the deployment each time
 | |
|         {{- if not .Values.frontend_only }}
 | |
|         "helm.update": {{ randAlphaNum 5 | quote }}
 | |
|         {{- end }}
 | |
| 
 | |
|     spec:
 | |
|       {{- if .Values.main_node_type }}
 | |
|       nodeSelector:
 | |
|         nodeType: {{ .Values.main_node_type }}
 | |
|       {{- end }}
 | |
| 
 | |
|       volumes:
 | |
|         - name: config-volume
 | |
|           configMap:
 | |
|             name: shared-job-config
 | |
|             items:
 | |
|               - key: config.yaml
 | |
|                 path: config.yaml
 | |
| 
 | |
|         - name: ops-configs
 | |
|           secret:
 | |
|             secretName: ops-configs
 | |
| 
 | |
|         - name: app-templates
 | |
|           configMap:
 | |
|             name: app-templates
 | |
| 
 | |
|         - name: email-templates
 | |
|           configMap:
 | |
|             name: email-templates
 | |
| 
 | |
|       containers:
 | |
|         - name: api
 | |
|           image: {{ .Values.backend_image }}
 | |
|           imagePullPolicy: {{ .Values.backend_pull_policy }}
 | |
|           command:
 | |
|               - gunicorn
 | |
|               - btrixcloud.main:app_root
 | |
|               - --bind
 | |
|               - "0.0.0.0:8000"
 | |
|               - --access-logfile
 | |
|               - "-"
 | |
|               - --workers
 | |
|               - "{{ .Values.backend_workers | default 1 }}"
 | |
|               - --worker-class
 | |
|               - uvicorn.workers.UvicornWorker
 | |
| 
 | |
|           envFrom:
 | |
|             - configMapRef:
 | |
|                 name: backend-env-config
 | |
|             - secretRef:
 | |
|                 name: backend-auth
 | |
|             - secretRef:
 | |
|                 name: mongo-auth
 | |
| 
 | |
|           env:
 | |
|             - name: MOTOR_MAX_WORKERS
 | |
|               value: "{{ .Values.backend_mongodb_workers | default 1 }}"
 | |
| 
 | |
|             - name: BTRIX_SUBS_APP_API_KEY
 | |
|               valueFrom:
 | |
|                 secretKeyRef:
 | |
|                   name: btrix-subs-app-secret
 | |
|                   key: BTRIX_SUBS_APP_API_KEY
 | |
|                   optional: true
 | |
| 
 | |
|             - name: BTRIX_SUBS_APP_URL
 | |
|               valueFrom:
 | |
|                 secretKeyRef:
 | |
|                   name: btrix-subs-app-secret
 | |
|                   key: BTRIX_SUBS_APP_URL
 | |
|                   optional: true
 | |
| 
 | |
|           volumeMounts:
 | |
|             - name: ops-configs
 | |
|               mountPath: /ops-configs/
 | |
| 
 | |
|             - name: app-templates
 | |
|               mountPath: /app/btrixcloud/templates/
 | |
| 
 | |
|             - name: email-templates
 | |
|               mountPath: /app/btrixcloud/email-templates/
 | |
| 
 | |
|           resources:
 | |
|             limits:
 | |
|               memory: {{ .Values.backend_memory }}
 | |
| 
 | |
|             requests:
 | |
|               cpu: {{ .Values.backend_cpu }}
 | |
|               memory: {{ .Values.backend_memory }}
 | |
| 
 | |
|           startupProbe:
 | |
|             httpGet:
 | |
|               path: /healthzStartup
 | |
|               port: 8000
 | |
|             periodSeconds: 5
 | |
|             failureThreshold: 60
 | |
|             successThreshold: 1
 | |
| 
 | |
|           readinessProbe:
 | |
|             httpGet:
 | |
|               path: /healthz
 | |
|               port: 8000
 | |
|             initialDelaySeconds: 5
 | |
|             periodSeconds: 30
 | |
|             failureThreshold: 5
 | |
|             successThreshold: 1
 | |
| 
 | |
|           livenessProbe:
 | |
|             httpGet:
 | |
|               path: /healthz
 | |
|               port: 8000
 | |
|             initialDelaySeconds: 5
 | |
|             periodSeconds: 30
 | |
|             failureThreshold: 15
 | |
|             successThreshold: 1
 | |
| 
 | |
|         - name: op
 | |
|           image: {{ .Values.backend_image }}
 | |
|           imagePullPolicy: {{ .Values.backend_pull_policy }}
 | |
|           command:
 | |
|               - gunicorn
 | |
|               - btrixcloud.main_op:app_root
 | |
|               - --bind
 | |
|               - "0.0.0.0:{{ .Values.opPort }}"
 | |
|               - --access-logfile
 | |
|               - "-"
 | |
|               - --workers
 | |
|               - "{{ .Values.backend_workers | default 1 }}"
 | |
|               - --worker-class
 | |
|               - uvicorn.workers.UvicornWorker
 | |
| 
 | |
|           envFrom:
 | |
|             - configMapRef:
 | |
|                 name: backend-env-config
 | |
|             - secretRef:
 | |
|                 name: backend-auth
 | |
|             - secretRef:
 | |
|                 name: mongo-auth
 | |
| 
 | |
|           env:
 | |
|             - name: MOTOR_MAX_WORKERS
 | |
|               value: "{{ .Values.backend_mongodb_workers | default 1 }}"
 | |
| 
 | |
|           volumeMounts:
 | |
|             - name: config-volume
 | |
|               mountPath: /config
 | |
| 
 | |
|             - name: ops-configs
 | |
|               mountPath: /ops-configs/
 | |
| 
 | |
|             - name: app-templates
 | |
|               mountPath: /app/btrixcloud/templates/
 | |
| 
 | |
|             - name: email-templates
 | |
|               mountPath: /app/btrixcloud/email-templates/
 | |
| 
 | |
|           resources:
 | |
|             limits:
 | |
|               memory: {{ .Values.backend_memory }}
 | |
| 
 | |
|             requests:
 | |
|               cpu: {{ .Values.backend_cpu }}
 | |
|               memory: {{ .Values.backend_memory }}
 | |
| 
 | |
|           startupProbe:
 | |
|             httpGet:
 | |
|               path: /healthz
 | |
|               port: {{ .Values.opPort }}
 | |
|             initialDelaySeconds: 5
 | |
|             periodSeconds: 5
 | |
|             failureThreshold: 5
 | |
|             successThreshold: 1
 | |
| 
 | |
|           readinessProbe:
 | |
|             httpGet:
 | |
|               path: /healthz
 | |
|               port: {{ .Values.opPort }}
 | |
|             initialDelaySeconds: 5
 | |
|             periodSeconds: 30
 | |
|             failureThreshold: 5
 | |
|             successThreshold: 1
 | |
| 
 | |
|           livenessProbe:
 | |
|             httpGet:
 | |
|               path: /healthz
 | |
|               port: {{ .Values.opPort }}
 | |
|             initialDelaySeconds: 5
 | |
|             periodSeconds: 30
 | |
|             failureThreshold: 15
 | |
|             successThreshold: 1
 | |
| 
 | |
| 
 | |
| 
 | |
| ---
 | |
| 
 | |
| apiVersion: v1
 | |
| kind: Service
 | |
| 
 | |
| metadata:
 | |
|   namespace: {{ .Release.Namespace }}
 | |
|   name: {{ .Values.name }}-backend
 | |
|   labels:
 | |
|     app: {{ .Values.name }}
 | |
|     role: backend
 | |
| 
 | |
| {{- if .Values.service }}
 | |
|   {{- if .Values.service.annotations }}
 | |
|   annotations:
 | |
|   {{- range $key, $val := .Values.service.annotations }}
 | |
|     {{ $key }}: {{ $val | quote }}
 | |
|   {{- end }}
 | |
|   {{- end }}
 | |
| {{- end }}
 | |
| 
 | |
| spec:
 | |
|   selector:
 | |
|     app: {{ .Values.name }}
 | |
|     role: backend
 | |
| 
 | |
|   ports:
 | |
|     - protocol: TCP
 | |
|       port: 8000
 | |
|       name: api
 | |
| 
 | |
|     - protocol: TCP
 | |
|       port: {{ .Values.opPort }}
 | |
|       name: operator
 | |
| 
 | |
| {{- if gt (int .Values.backend_max_replicas) 1 }}
 | |
| ---
 | |
| apiVersion: autoscaling/v2
 | |
| kind: HorizontalPodAutoscaler
 | |
| metadata:
 | |
|   name: backend-autoscaler
 | |
| spec:
 | |
|   scaleTargetRef:
 | |
|     apiVersion: apps/v1
 | |
|     kind: Deployment
 | |
|     name: {{ .Values.name }}-backend
 | |
|   minReplicas: 1
 | |
|   maxReplicas: {{ .Values.backend_max_replicas }}
 | |
|   metrics:
 | |
|   - type: Resource
 | |
|     resource:
 | |
|       name: cpu
 | |
|       target:
 | |
|         type: Utilization
 | |
|         averageUtilization: {{ .Values.backend_avg_cpu_threshold }}
 | |
|   - type: Resource
 | |
|     resource:
 | |
|       name: memory
 | |
|       target:
 | |
|         type: Utilization
 | |
|         averageUtilization: {{ .Values.backend_avg_memory_threshold }}
 | |
| {{- end }}
 |