This release focuses on making the Frappe Operator fully compatible with OpenShift’s strict security model and improving general pod security across all Kubernetes environments.
The operator now applies secure defaults that align with OpenShift’s restricted-v2 Security Context Constraint (SCC). All managed pods (Gunicorn, NGINX, Redis, Workers) now run with:
runAsUser: 1001 (OpenShift standard arbitrary UID)runAsGroup: 0 (root group for OpenShift compatibility)fsGroup: 0 (root group for filesystem permissions)allowPrivilegeEscalation: falseseccompProfile: { type: RuntimeDefault }capabilities: { drop: ["ALL"] }The operator provides three levels of UID/GID configuration:
spec.security in FrappeBench/FrappeSite (highest priority)FRAPPE_DEFAULT_UID, FRAPPE_DEFAULT_GID, FRAPPE_DEFAULT_FSGROUPThis flexible approach allows different UIDs for different benches in the same cluster, organization-wide defaults, or OpenShift-compatible out-of-the-box behavior.
Added a security field of type SecurityConfig:
apiVersion: vyogo.tech/v1alpha1
kind: FrappeBench
metadata:
name: my-bench
spec:
# Option 1: Use OpenShift defaults (no configuration needed)
# Automatically uses UID 1001, GID 0, FSGroup 0
# Option 2: Override for specific bench
security:
podSecurityContext:
runAsUser: 2000 # Custom UID for this bench
runAsGroup: 2000 # Custom GID
fsGroup: 2000 # Custom FSGroup
securityContext:
runAsUser: 2000
runAsGroup: 2000
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
Configure cluster-wide defaults by setting environment variables in the operator deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: frappe-operator-controller-manager
spec:
template:
spec:
containers:
- name: manager
env:
- name: FRAPPE_DEFAULT_UID
value: "2000" # All benches default to this UID
- name: FRAPPE_DEFAULT_GID
value: "2000"
- name: FRAPPE_DEFAULT_FSGROUP
value: "2000"
No configuration needed - works out of the box:
apiVersion: vyogo.tech/v1alpha1
kind: FrappeBench
metadata:
name: production-bench
spec:
# Automatically uses UID 1001, GID 0 for OpenShift compatibility
apps:
- name: erpnext
# Production bench: Uses OpenShift defaults (1001/0/0)
apiVersion: vyogo.tech/v1alpha1
kind: FrappeBench
metadata:
name: production-bench
spec:
apps:
- name: erpnext
---
# Compliance bench: Custom UID required
apiVersion: vyogo.tech/v1alpha1
kind: FrappeBench
metadata:
name: compliance-bench
spec:
security:
podSecurityContext:
runAsUser: 5000 # Override for compliance requirements
runAsGroup: 5000
fsGroup: 5000
apps:
- name: erpnext
FRAPPE_DEFAULT_UID, FRAPPE_DEFAULT_GID, FRAPPE_DEFAULT_FSGROUP environment variables in the operator deployment to change cluster-wide defaultsspec.security is provided in a FrappeBench or FrappeSite, it takes precedence over environment variables and hardcoded defaultsspec.security → Environment Variables → Hardcoded Defaults (1001/0/0)OpenShift Security Model:
Frappe Container Compatibility:
USER 1001 and GID 0kubectl set image deployment/frappe-operator-controller-manager \
-n frappe-operator-system \
manager=vyogo.tech/frappe-operator:v2.5.0
Existing resources will be updated automatically on the next reconciliation with the new security defaults (UID 1001, GID 0)
OpenShift users: No additional configuration needed - the operator now uses OpenShift-compatible defaults
spec.security field in your FrappeBench/FrappeSite resources# Check operator version
kubectl get deployment frappe-operator-controller-manager \
-n frappe-operator-system \
-o jsonpath='{.spec.template.spec.containers[0].image}'
# Verify security context on running pods
kubectl get pod -l app=your-bench-gunicorn \
-o jsonpath='{.items[0].spec.securityContext}'
None. This release is fully backward compatible:
spec.security continue to work unchangedFor complete documentation on security context configuration, see: