bitnami / charts

Bitnami Helm Charts
https://bitnami.com
Other
8.85k stars 9.14k forks source link

[bitnami/odoo] Container can't produce any pdf for invoicing. Missing library/program inside container. #29468

Open codefuturist opened 6 days ago

codefuturist commented 6 days ago

Name and Version

bitnami/odoo 26.2.17

What architecture are you using?

amd64

What steps will reproduce the bug?

  1. deploy helm chart bitnami/odoo version 26.2.17 with container 17.0.20240905-debian-12-r0 (is default from helm chart)
  2. install add-on invoice
  3. generate an invoice as a pdf.

Are you using any custom parameters or values?

My helm config. I have redacted certain login fields. This should not be affect the error from being reproduced:

apiVersion: helm.toolkit.fluxcd.io/v2beta2
kind: HelmRelease
metadata:
  name: odoo
  namespace: productivity
spec:
  suspend: false
  maxHistory: 3
  interval: 1m
  timeout: 15m
  chart:
    spec:
      chart: odoo
      version: '26.2.*'
      sourceRef:
        kind: HelmRepository
        name: bitnami
      interval: 5m
  releaseName: odoo
  install:
    remediation:
      retries: 30
  upgrade:
    remediation:
      retries: 30
  test:
    enable: true
  values:
    # Copyright Broadcom, Inc. All Rights Reserved.
    # SPDX-License-Identifier: APACHE-2.0

    ## @section Global parameters
    ## Global Docker image parameters
    ## Please, note that this will override the image parameters, including dependencies, configured to use the global value
    ## Current available global Docker image parameters: imageRegistry, imagePullSecrets and storageClass
    ##

    ## @param global.imageRegistry Global Docker image registry
    ## @param global.imagePullSecrets Global Docker registry secret names as an array
    ## @param global.storageClass Global StorageClass for Persistent Volume(s)
    ##
    global:
      imageRegistry: ""
      ## E.g.
      ## imagePullSecrets:
      ##   - myRegistryKeySecretName
      ##
      imagePullSecrets: [ ]
      storageClass: ""
      ## Compatibility adaptations for Kubernetes platforms
      ##
      compatibility:
        ## Compatibility adaptations for Openshift
        ##
        openshift:
          ## @param global.compatibility.openshift.adaptSecurityContext Adapt the securityContext sections of the deployment to make them compatible with Openshift restricted-v2 SCC: remove runAsUser, runAsGroup and fsGroup and let the platform use their allowed default IDs. Possible values: auto (apply if the detected running cluster is Openshift), force (perform the adaptation always), disabled (do not perform adaptation)
          ##
          adaptSecurityContext: disabled
    ## @section Common parameters
    ##

    ## @param kubeVersion Override Kubernetes version
    ##
    kubeVersion: ""
    ## @param nameOverride String to partially override common.names.fullname
    ##
    nameOverride: ""
    ## @param fullnameOverride String to fully override common.names.fullname
    ##
    fullnameOverride: ""
    ## @param commonLabels Labels to add to all deployed objects
    ##
    commonLabels: { }
    ## @param commonAnnotations Annotations to add to all deployed objects
    ##
    commonAnnotations: { }
    ## @param clusterDomain Default Kubernetes cluster domain
    ##
    clusterDomain: cluster.local
    ## @param extraDeploy Array of extra objects to deploy with the release
    ##
    extraDeploy: [ ]
    ## Enable diagnostic mode in the statefulset
    ##
    diagnosticMode:
      ## @param diagnosticMode.enabled Enable diagnostic mode (all probes will be disabled and the command will be overridden)
      ##
      enabled: false
      ## @param diagnosticMode.command Command to override all containers in the the statefulset
      ##
      command:
        - sleep
      ## @param diagnosticMode.args Args to override all containers in the the statefulset
      ##
      args:
        - infinity
    ## Bitnami Odoo image
    ## ref: https://hub.docker.com/r/bitnami/odoo/tags/
    ## @param image.registry [default: REGISTRY_NAME] Odoo image registry
    ## @param image.repository [default: REPOSITORY_NAME/odoo] Odoo image repository
    ## @skip image.tag Odoo image tag (immutable tags are recommended)
    ## @param image.digest Odoo image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag
    ## @param image.pullPolicy Odoo image pull policy
    ## @param image.pullSecrets Odoo image pull secrets
    ## @param image.debug Enable image debug mode
    ##
    image:
      registry: docker.io
      repository: bitnami/odoo
      # tag:: 17.0.20240705-debian-12-r0
      digest: ""
      ## Specify a imagePullPolicy
      ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
      ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images
      ##
      pullPolicy: IfNotPresent
      ## Optionally specify an array of imagePullSecrets.
      ## Secrets must be manually created in the namespace.
      ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
      ## e.g:
      ## pullSecrets:
      ##   - myRegistryKeySecretName
      ##
      pullSecrets: [ ]
      ## Enable debug mode
      ##
      debug: false
    ## @section Odoo Configuration parameters
    ## Odoo settings based on environment variables
    ## ref: https://github.com/bitnami/containers/tree/main/bitnami/odoo#environment-variables
    ##

    ## @param odooEmail Odoo user email
    ## ref: https://github.com/bitnami/containers/tree/main/bitnami/odoo#configuration
    ##
    odooEmail: "redacted"
    ## @param odooPassword Odoo user password
    ## Defaults to a random 10-character alphanumeric string if not set
    ## ref: https://github.com/bitnami/containers/tree/main/bitnami/odoo#configuration
    ##
    odooPassword: ""
    ## @param odooSkipInstall Skip Odoo installation wizard
    ##
    odooSkipInstall: false
    ## @param odooDatabaseFilter Filter odoo database by using a regex
    ##
    odooDatabaseFilter: .*
    ## @param loadDemoData Whether to load demo data for all modules during initialization
    ## ref: https://github.com/bitnami/containers/tree/main/bitnami/odoo#configuration
    ##
    loadDemoData: false
    ## @param customPostInitScripts Custom post-init.d user scripts
    ## ref: https://github.com/bitnami/containers/tree/main/bitnami/odoo
    ## NOTE: supported formats are `.sh`, `.sql` or `.php`
    ## NOTE: scripts are exclusively executed during the 1st boot of the container
    ## e.g:
    ## customPostInitScripts:
    ##   enable-logs.sh: |
    ##     #!/bin/bash
    ##     sed -i s/;logfile/logfile/ /opt/bitnami/odoo/conf/odoo.conf
    ##     ...
    ##
    customPostInitScripts: { }
    ## SMTP mail delivery configuration
    ## ref: https://github.com/bitnami/containers/tree/main/bitnami/odoo/#smtp-configuration
    ## @param smtpHost SMTP server host
    ## @param smtpPort SMTP server port
    ## @param smtpUser SMTP username
    ## @param smtpPassword SMTP user password
    ## @param smtpProtocol SMTP protocol
    ##
    smtpHost: "smtp.protonmail.ch"
    smtpPort: "587"
    smtpUser: "redacted"
    smtpPassword: ""
    smtpProtocol: "tls"
    ## @param existingSecret Name of existing secret containing Odoo credentials
    ## NOTE: Must contain key `odoo-password`
    ## NOTE: When it's set, the `odooPassword` parameter is ignored
    ##
    existingSecret: "odoo-c"
    ## @param smtpExistingSecret The name of an existing secret with SMTP credentials
    ## NOTE: Must contain key `smtp-password`
    ## NOTE: When it's set, the `smtpPassword` parameter is ignored
    ##
    smtpExistingSecret: "smtp-credentials"
    ## @param allowEmptyPassword Allow the container to be started with blank passwords
    ##
    allowEmptyPassword: false
    ## @param command Override default container command (useful when using custom images)
    ##
    command: [ ]
    ## @param args Override default container args (useful when using custom images)
    ##
    args: [ ]
    ## @param extraEnvVars Array with extra environment variables to add to the Odoo container
    ## e.g:
    ## extraEnvVars:
    ##   - name: FOO
    ##     value: "bar"
    ##
    extraEnvVars:
      - name: MY_ENV_VAR
        value: "my-value"
    ## @param extraEnvVarsCM Name of existing ConfigMap containing extra env vars
    ##
    extraEnvVarsCM: ""
    ## @param extraEnvVarsSecret Name of existing Secret containing extra env vars
    ##
    extraEnvVarsSecret: ""
    ## @section Odoo deployment parameters
    ##

    ## @param replicaCount Number of Odoo replicas to deploy
    ## NOTE: ReadWriteMany PVC(s) are required if replicaCount > 1
    ##
    replicaCount: 1
    ## Odoo container ports
    ## @param containerPorts.http Odoo HTTP container port
    ##
    containerPorts:
      http: 8069
    ## @param extraContainerPorts Optionally specify extra list of additional ports for Odoo container(s)
    ## e.g:
    ## extraContainerPorts:
    ##   - name: myservice
    ##     containerPort: 9090
    ##
    extraContainerPorts: [ ]
    ## Odoo containers' resource requests and limits
    ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/
    ## @param resourcesPreset Set container resources according to one common preset (allowed values: none, nano, micro, small, medium, large, xlarge, 2xlarge). This is ignored if resources is set (resources is recommended for production).
    ## More information: https://github.com/bitnami/charts/blob/main/bitnami/common/templates/_resources.tpl#L15
    ##
    resourcesPreset: "none"
    ## @param resources Set container requests and limits for different resources like CPU or memory (essential for production workloads)
    ## Example:
    ## resources:
    ##   requests:
    ##     cpu: 2
    ##     memory: 512Mi
    ##   limits:
    ##     cpu: 3
    ##     memory: 1024Mi
    ##
    resources:
      requests:
        cpu: "250m"
        memory: "256Mi"
        ephemeral-storage: "50Mi"
    ## Configure Pods Security Context
    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
    ## @param podSecurityContext.enabled Enabled Odoo pods' Security Context
    ## @param podSecurityContext.fsGroupChangePolicy Set filesystem group change policy
    ## @param podSecurityContext.sysctls Set kernel settings using the sysctl interface
    ## @param podSecurityContext.supplementalGroups Set filesystem extra groups
    ## @param podSecurityContext.fsGroup Set Odoo pod's Security Context fsGroup
    ##
    podSecurityContext:
      enabled: true
      fsGroupChangePolicy: Always
      sysctls: [ ]
      supplementalGroups: [ ]
      fsGroup: 0
    ## Configure Container Security Context (only main container)
    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container
    ## @param containerSecurityContext.enabled Enabled containers' Security Context
    ## @param containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container
    ## @param containerSecurityContext.runAsUser Set containers' Security Context runAsUser
    ## @param containerSecurityContext.runAsGroup Set containers' Security Context runAsGroup
    ## @param containerSecurityContext.runAsNonRoot Set container's Security Context runAsNonRoot
    ## @param containerSecurityContext.privileged Set container's Security Context privileged
    ## @param containerSecurityContext.readOnlyRootFilesystem Set container's Security Context readOnlyRootFilesystem
    ## @param containerSecurityContext.allowPrivilegeEscalation Set container's Security Context allowPrivilegeEscalation
    ## @param containerSecurityContext.capabilities.add List of capabilities to be added
    ## @param containerSecurityContext.capabilities.drop List of capabilities to be dropped
    ## @param containerSecurityContext.seccompProfile.type Set container's Security Context seccomp profile
    ##
    containerSecurityContext:
      enabled: true
      seLinuxOptions: { }
      runAsUser: 0
      runAsGroup: 0
      runAsNonRoot: false
      privileged: false
      readOnlyRootFilesystem: false
      allowPrivilegeEscalation: false
      capabilities:
        drop: [ "ALL" ]
        add: [ "CHOWN", "FOWNER", "SYS_CHROOT", "SETGID", "SETUID", "DAC_OVERRIDE" ]
      seccompProfile:
        type: "RuntimeDefault"
    ## Configure extra options for Odoo containers' liveness and readiness probes
    ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes
    ## @param livenessProbe.enabled Enable livenessProbe
    ## @param livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe
    ## @param livenessProbe.periodSeconds Period seconds for livenessProbe
    ## @param livenessProbe.timeoutSeconds Timeout seconds for livenessProbe
    ## @param livenessProbe.failureThreshold Failure threshold for livenessProbe
    ## @param livenessProbe.successThreshold Success threshold for livenessProbe
    ##
    livenessProbe:
      enabled: true
      initialDelaySeconds: 600
      periodSeconds: 30
      timeoutSeconds: 5
      failureThreshold: 6
      successThreshold: 1
    ## @param readinessProbe.enabled Enable readinessProbe
    ## @param readinessProbe.path Path to check for readinessProbe
    ## @param readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe
    ## @param readinessProbe.periodSeconds Period seconds for readinessProbe
    ## @param readinessProbe.timeoutSeconds Timeout seconds for readinessProbe
    ## @param readinessProbe.failureThreshold Failure threshold for readinessProbe
    ## @param readinessProbe.successThreshold Success threshold for readinessProbe
    ##
    readinessProbe:
      enabled: true
      path: /web/health
      initialDelaySeconds: 30
      periodSeconds: 10
      timeoutSeconds: 5
      failureThreshold: 12
      successThreshold: 1
    ## @param startupProbe.enabled Enable startupProbe
    ## @param startupProbe.path Path to check for startupProbe
    ## @param startupProbe.initialDelaySeconds Initial delay seconds for startupProbe
    ## @param startupProbe.periodSeconds Period seconds for startupProbe
    ## @param startupProbe.timeoutSeconds Timeout seconds for startupProbe
    ## @param startupProbe.failureThreshold Failure threshold for startupProbe
    ## @param startupProbe.successThreshold Success threshold for startupProbe
    ##
    startupProbe:
      enabled: false
      path: /web/health
      initialDelaySeconds: 300
      periodSeconds: 10
      timeoutSeconds: 5
      failureThreshold: 6
      successThreshold: 1
    ## @param customLivenessProbe Custom livenessProbe that overrides the default one
    ##
    customLivenessProbe: { }
    ## @param customReadinessProbe Custom readinessProbe that overrides the default one
    #
    customReadinessProbe: { }
    ## @param customStartupProbe Custom startupProbe that overrides the default one
    #
    customStartupProbe: { }
    ## @param lifecycleHooks LifecycleHooks to set additional configuration at startup
    ##
    lifecycleHooks: { }
    ## @param automountServiceAccountToken Mount Service Account token in pod
    ##
    automountServiceAccountToken: false
    ## @param hostAliases Odoo pod host aliases
    ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/
    ##
    hostAliases: [ ]
    ## @param podLabels Extra labels for Odoo pods
    ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
    ##
    podLabels: { }
    ## @param podAnnotations Annotations for Odoo pods
    ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
    ##
    podAnnotations: { }
    ## @param podAffinityPreset Pod affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard`
    ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
    ##
    podAffinityPreset: ""
    ## @param podAntiAffinityPreset Pod anti-affinity preset. Ignored if `affinity` is set. Allowed values: `soft` or `hard`
    ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity
    ##
    podAntiAffinityPreset: soft
    ## Node affinity preset
    ## Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity
    ##
    nodeAffinityPreset:
      ## @param nodeAffinityPreset.type Node affinity preset type. Ignored if `affinity` is set. Allowed values: `soft` or `hard`
      ##
      type: "soft"
      ## @param nodeAffinityPreset.key Node label key to match. Ignored if `affinity` is set
      ##
      key: "kubernetes.io/hostname"
      ## @param nodeAffinityPreset.values Node label values to match. Ignored if `affinity` is set
      ## E.g.
      ## values:
      ##   - e2e-az1
      ##   - e2e-az2
      ##
      values:
        - hp-server-1
    ## @param affinity Affinity for pod assignment
    ## Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
    ## NOTE: podAffinityPreset, podAntiAffinityPreset, and  nodeAffinityPreset will be ignored when it's set
    ##
    affinity: { }
    ## @param nodeSelector Node labels for pod assignment
    ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
    ##
    nodeSelector: { }
    ## @param tolerations Tolerations for pod assignment
    ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
    ##
    tolerations: [ ]
    ## @param topologySpreadConstraints Topology Spread Constraints for pod assignment spread across your cluster among failure-domains. Evaluated as a template
    ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods
    ##
    topologySpreadConstraints: [ ]
    ## @param priorityClassName Odoo pods' Priority Class Name
    ## ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/
    ##
    priorityClassName: ""
    ## @param schedulerName Use an alternate scheduler, e.g. "stork".
    ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/
    ##
    schedulerName: ""
    ## @param terminationGracePeriodSeconds Seconds Odoo pod needs to terminate gracefully
    ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods
    ##
    terminationGracePeriodSeconds: "300"
    ## @param updateStrategy.type Odoo deployment strategy type
    ## @param updateStrategy.rollingUpdate [object,nullable] Odoo deployment rolling update configuration parameters
    ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy
    ## NOTE: Set it to `Recreate` if you use a PV that cannot be mounted on multiple pods
    ## e.g:
    ## updateStrategy:
    ##  type: RollingUpdate
    ##  rollingUpdate:
    ##    maxSurge: 25%
    ##    maxUnavailable: 25%
    ##
    updateStrategy:
      type: RollingUpdate
      rollingUpdate:
        maxUnavailable: 100%
        maxSurge: 100%
    ## @param extraVolumes Optionally specify extra list of additional volumes for Odoo pods
    ##
    extraVolumes: [ ]
    ## @param extraVolumeMounts Optionally specify extra list of additional volumeMounts for Odoo container(s)
    ##
    extraVolumeMounts: [ ]
    ## @param sidecars Add additional sidecar containers to the Odoo pod
    ## e.g:
    ## sidecars:
    ##   - name: your-image-name
    ##     image: your-image
    ##     imagePullPolicy: Always
    ##     ports:
    ##       - name: portname
    ##         containerPort: 1234
    ##
    sidecars: [ ]
    ## @param initContainers Add additional init containers to the Odoo pods
    ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
    ## e.g:
    ## initContainers:
    ##  - name: your-image-name
    ##    image: your-image
    ##    imagePullPolicy: Always
    ##    command: ['sh', '-c', 'copy addons from git and push to /bitnami/odoo/addons. Should work with extraVolumeMounts and extraVolumes']
    ##
    initContainers: [ ]
    ## @section Traffic Exposure Parameters
    ##

    ## Odoo service parameters
    ##
    service:
      ## @param service.type Odoo service type
      ##
      type: ClusterIP
      ## @param service.ports.http Odoo service HTTP port
      ##
      ports:
        http: 80
      ## @param service.nodePorts.http NodePort for the Odoo HTTP endpoint
      ## NOTE: choose port between <30000-32767>
      ##
      nodePorts:
        http: ""
      ## @param service.sessionAffinity Control where client requests go, to the same pod or round-robin
      ## Values: ClientIP or None
      ## ref: https://kubernetes.io/docs/concepts/services-networking/service/
      ##
      sessionAffinity: None
      ## @param service.sessionAffinityConfig Additional settings for the sessionAffinity
      ## sessionAffinityConfig:
      ##   clientIP:
      ##     timeoutSeconds: 300
      ##
      sessionAffinityConfig: { }
      ## @param service.clusterIP Odoo service Cluster IP
      ## e.g.:
      ## clusterIP: None
      ##
      clusterIP: ""
      ## @param service.loadBalancerIP Odoo service Load Balancer IP
      ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer
      ##
      loadBalancerIP: ""
      ## @param service.loadBalancerSourceRanges Odoo service Load Balancer sources
      ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service
      ## e.g:
      ## loadBalancerSourceRanges:
      ##   - 10.10.10.0/24
      ##
      loadBalancerSourceRanges: [ ]
      ## @param service.externalTrafficPolicy Odoo service external traffic policy
      ## ref https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip
      ##
      externalTrafficPolicy: Cluster
      ## @param service.annotations Additional custom annotations for Odoo service
      ##
      annotations: { }
      ## @param service.extraPorts Extra port to expose on Odoo service
      ##
      extraPorts: [ ]
    ## Configure the ingress resource that allows you to access the Odoo installation
    ## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/
    ##
    ingress:
      ## @param ingress.enabled Enable ingress record generation for Odoo
      ##
      enabled: true
      ## @param ingress.ingressClassName IngressClass that will be be used to implement the Ingress (Kubernetes 1.18+)
      ## This is supported in Kubernetes 1.18+ and required if you have more than one IngressClass marked as the default for your cluster .
      ## ref: https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/
      ##
      ingressClassName: ""
      ## @param ingress.pathType Ingress path type
      ##
      pathType: ImplementationSpecific
      ## @param ingress.apiVersion Force Ingress API version (automatically detected if not set)
      ##
      apiVersion: ""
      ## @param ingress.hostname Default host for the ingress record
      ##
      hostname: odoo.pandia.io
      ## @param ingress.path Default path for the ingress record
      ## NOTE: You may need to set this to '/*' in order to use this with ALB ingress controllers
      ##
      path: /
      ## @param ingress.annotations [object] Additional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations.
      ## Use this parameter to set the required annotations for cert-manager, see
      ## ref: https://cert-manager.io/docs/usage/ingress/#supported-annotations
      ## e.g:
      ## annotations:
      ##   kubernetes.io/ingress.class: nginx
      ##   cert-manager.io/cluster-issuer: cluster-issuer-name
      ##
      annotations:
        gethomepage.dev/enabled: "true"
        gethomepage.dev/name: "Odoo"
        gethomepage.dev/description: ""
        gethomepage.dev/group: "Productivity"
        gethomepage.dev/icon: "odoo.png"
      ## @param ingress.tls Enable TLS configuration for the host defined at `ingress.hostname` parameter
      ## TLS certificates will be retrieved from a TLS secret with name: `{{- printf "%s-tls" .Values.ingress.hostname | trunc 63 | trimSuffix "-" }}`
      ## You can:
      ##   - Use the `ingress.secrets` parameter to create this TLS secret
      ##   - Rely on cert-manager to create it by setting the corresponding annotations
      ##   - Rely on Helm to create self-signed certificates by setting `ingress.tls=true` and `ingress.certManager=false`
      ##
      tls: true
      ## @param ingress.selfSigned Create a TLS secret for this ingress record using self-signed certificates generated by Helm
      ##
      selfSigned: false
      ## @param ingress.extraHosts An array with additional hostname(s) to be covered with the ingress record
      ## e.g:
      ## extraHosts:
      ##   - name: odoo.local
      ##     path: /
      ##
      extraHosts: [ ]
      ## @param ingress.extraPaths An array with additional arbitrary paths that may need to be added to the ingress under the main host
      ## e.g:
      ## extraPaths:
      ## - path: /*
      ##   backend:
      ##     serviceName: ssl-redirect
      ##     servicePort: use-annotation
      ##
      extraPaths: [ ]
      ## @param ingress.extraTls TLS configuration for additional hostname(s) to be covered with this ingress record
      ## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#tls
      ## e.g:
      ## extraTls:
      ## - hosts:
      ##     - odoo.local
      ##   secretName: odoo.local-tls
      ##
      extraTls:
        - hosts:
            - odoo.pandia.io
          secretName: pandia.io-tls
      ## @param ingress.secrets Custom TLS certificates as secrets
      ## NOTE: 'key' and 'certificate' are expected in PEM format
      ## NOTE: 'name' should line up with a 'secretName' set further up
      ## If it is not set and you're using cert-manager, this is unneeded, as it will create a secret for you with valid certificates
      ## If it is not set and you're NOT using cert-manager either, self-signed certificates will be created valid for 365 days
      ## It is also possible to create and manage the certificates outside of this helm chart
      ## Please see README.md for more information
      ## e.g:
      ## secrets:
      ##   - name: odoo.local-tls
      ##     key: |-
      ##       -----BEGIN RSA PRIVATE KEY-----
      ##       ...
      ##       -----END RSA PRIVATE KEY-----
      ##     certificate: |-
      ##       -----BEGIN CERTIFICATE-----
      ##       ...
      ##       -----END CERTIFICATE-----
      ##
      secrets: [ ]
      ## @param ingress.extraRules Additional rules to be covered with this ingress record
      ## ref: https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-rules
      ## e.g:
      ## extraRules:
      ## - host: example.local
      ##     http:
      ##       path: /
      ##       backend:
      ##         service:
      ##           name: example-svc
      ##           port:
      ##             name: http
      ##
      extraRules: [ ]
    ## @section Persistence Parameters
    ##

    ## Persistence Parameters
    ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
    ##
    persistence:
      ## @param persistence.enabled Enable persistence using Persistent Volume Claims
      ##
      enabled: true
      ## @param persistence.resourcePolicy Setting it to "keep" to avoid removing PVCs during a helm delete operation. Leaving it empty will delete PVCs after the chart deleted
      ##
      resourcePolicy: ""
      ## @param persistence.storageClass Persistent Volume storage class
      ## If defined, storageClassName: <storageClass>
      ## If set to "-", storageClassName: "", which disables dynamic provisioning
      ## If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner
      ##
      storageClass: ""
      ## @param persistence.accessModes [array] Persistent Volume access modes
      ##
      accessModes:
        - ReadWriteOnce
      ## @param persistence.accessMode Persistent Volume access mode (DEPRECATED: use `persistence.accessModes` instead)
      ##
      accessMode: ReadWriteOnce
      ## @param persistence.size Persistent Volume size
      ##
      size: 1Gi
      ## @param persistence.dataSource Custom PVC data source
      ##
      dataSource: { }
      ## @param persistence.annotations Annotations for the PVC
      ##
      annotations: { }
      ## @param persistence.selector Selector to match an existing Persistent Volume (this value is evaluated as a template)
      ## selector:
      ##   matchLabels:
      ##     app: my-app
      ##
      selector: { }
      ## @param persistence.existingClaim The name of an existing PVC to use for persistence
      ##
      existingClaim: "odoo-pvc"
    ## 'volumePermissions' init container parameters
    ## Changes the owner and group of the persistent volume mount point to runAsUser:fsGroup values
    ##   based on the podSecurityContext/containerSecurityContext parameters
    ##
    volumePermissions:
      ## @param volumePermissions.enabled Enable init container that changes the owner/group of the PV mount point to `runAsUser:fsGroup`
      ##
      enabled: true
      ## Init container's resource requests and limits
      ## ref: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/
      ## @param volumePermissions.resourcesPreset Set container resources according to one common preset (allowed values: none, nano, micro, small, medium, large, xlarge, 2xlarge). This is ignored if volumePermissions.resources is set (volumePermissions.resources is recommended for production).
      ## More information: https://github.com/bitnami/charts/blob/main/bitnami/common/templates/_resources.tpl#L15
      ##
      resourcesPreset: "nano"
      ## @param volumePermissions.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads)
      ## Example:
      ## resources:
      ##   requests:
      ##     cpu: 2
      ##     memory: 512Mi
      ##   limits:
      ##     cpu: 3
      ##     memory: 1024Mi
      ##
      resources:
        requests:
          cpu: "250m"
          memory: "256Mi"
          ephemeral-storage: "50Mi"

      ## Init container Container Security Context
      ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container
      ## @param volumePermissions.containerSecurityContext.enabled Enable init container's Security Context
      ## @param volumePermissions.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in container
      ## @param volumePermissions.containerSecurityContext.runAsUser Set init container's Security Context runAsUser
      ## @param volumePermissions.containerSecurityContext.seccompProfile.type Set container's Security Context seccomp profile
      ##
      containerSecurityContext:
        enabled: true
        seLinuxOptions: { }
        runAsUser: 0
        seccompProfile:
          type: "RuntimeDefault"
    ## @section RBAC Parameters

    ## @param serviceAccount.create Specifies whether a ServiceAccount should be created
    ## @param serviceAccount.name The name of the ServiceAccount to create (name generated using common.names.fullname template otherwise)
    ## @param serviceAccount.automountServiceAccountToken Auto-mount the service account token in the pod
    ## @param serviceAccount.annotations Additional custom annotations for the ServiceAccount
    ##
    serviceAccount:
      create: true
      name: ""
      automountServiceAccountToken: false
      annotations: { }
    ## @section Other Parameters
    ##

    ## Odoo Pod Disruption Budget configuration
    ## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/
    ## @param pdb.create Enable a Pod Disruption Budget creation
    ## @param pdb.minAvailable Minimum number/percentage of pods that should remain scheduled
    ## @param pdb.maxUnavailable Maximum number/percentage of pods that may be made unavailable. Defaults to `1` if both `pdb.minAvailable` and `pdb.maxUnavailable` are empty.
    ##
    pdb:
      create: false
      #  minAvailable: 0%
      maxUnavailable: 100%
    ## Odoo Autoscaling configuration
    ## ref: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
    ## @param autoscaling.enabled Enable Horizontal POD autoscaling for Odoo
    ## @param autoscaling.minReplicas Minimum number of Odoo replicas
    ## @param autoscaling.maxReplicas Maximum number of Odoo replicas
    ## @param autoscaling.targetCPU Target CPU utilization percentage
    ## @param autoscaling.targetMemory Target Memory utilization percentage
    ##
    autoscaling:
      enabled: false
      minReplicas: 1
      maxReplicas: 11
      targetCPU: 50
      targetMemory: 50
    ## @section Database Parameters

    ## PostgreSQL chart configuration
    ## ref: https://github.com/bitnami/charts/blob/main/bitnami/postgresql/values.yaml
    ## @param postgresql.enabled Switch to enable or disable the PostgreSQL helm chart
    ## @param postgresql.auth.username Name for a custom user to create
    ## @param postgresql.auth.password Password for the custom user to create
    ## @param postgresql.auth.database Name for a custom database to create
    ## @param postgresql.auth.existingSecret Name of existing secret to use for PostgreSQL credentials
    ## @param postgresql.architecture PostgreSQL architecture (`standalone` or `replication`)
    ##
    postgresql:
      enabled: false
      auth:
        username: bn_odoo
        password: ""
        database: bitnami_odoo
        existingSecret: ""
      architecture: standalone
    ## External PostgreSQL configuration
    ## All of these values are only used when postgresql.enabled is set to false
    ## @param externalDatabase.host Database host
    ## @param externalDatabase.port Database port number
    ## @param externalDatabase.user Non-root username for Odoo
    ## @param externalDatabase.password Password for the non-root username for Odoo
    ## @param externalDatabase.database Odoo database name
    ## @param externalDatabase.create Enable PostgreSQL user and database creation (when using an external db)
    ## @param externalDatabase.postgresqlPostgresUser External Database admin username
    ## @param externalDatabase.postgresqlPostgresPassword External Database admin password
    ## @param externalDatabase.existingSecret Name of an existing secret resource containing the database credentials
    ## @param externalDatabase.existingSecretPasswordKey Name of an existing secret key containing the non-root credentials
    ## @param externalDatabase.existingSecretPostgresPasswordKey Name of an existing secret key containing the admin credentials
    ##
    externalDatabase:
      host: "postgresql-primary.database.svc.cluster.local"
      port: 5432
      user: odoo
      password: ""
      database: odoo
      create: false
      postgresqlPostgresUser: "postgres"
      postgresqlPostgresPassword: ""
      existingSecret: "odoo-c"
      existingSecretPasswordKey: "db-password"
      existingSecretPostgresPasswordKey: ""
    ## @section NetworkPolicy parameters
    ##

    ## Network Policy configuration
    ## ref: https://kubernetes.io/docs/concepts/services-networking/network-policies/
    ##
    networkPolicy:
      ## @param networkPolicy.enabled Specifies whether a NetworkPolicy should be created
      ##
      enabled: false
      ## @param networkPolicy.allowExternal Don't require server label for connections
      ## The Policy model to apply. When set to false, only pods with the correct
      ## server label will have network access to the ports server is listening
      ## on. When true, server will accept connections from any source
      ## (with the correct destination port).
      ##
      allowExternal: true
      ## @param networkPolicy.allowExternalEgress Allow the pod to access any range of port and all destinations.
      ##
      allowExternalEgress: true
      ## @param networkPolicy.extraIngress [array] Add extra ingress rules to the NetworkPolicy
      ## e.g:
      ## extraIngress:
      ##   - ports:
      ##       - port: 1234
      ##     from:
      ##       - podSelector:
      ##           - matchLabels:
      ##               - role: frontend
      ##       - podSelector:
      ##           - matchExpressions:
      ##               - key: role
      ##                 operator: In
      ##                 values:
      ##                   - frontend
      extraIngress: [ ]
      ## @param networkPolicy.extraEgress [array] Add extra ingress rules to the NetworkPolicy
      ## e.g:
      ## extraEgress:
      ##   - ports:
      ##       - port: 1234
      ##     to:
      ##       - podSelector:
      ##           - matchLabels:
      ##               - role: frontend
      ##       - podSelector:
      ##           - matchExpressions:
      ##               - key: role
      ##                 operator: In
      ##                 values:
      ##                   - frontend
      ##
      extraEgress: [ ]
      ## @param networkPolicy.ingressNSMatchLabels [object] Labels to match to allow traffic from other namespaces
      ## @param networkPolicy.ingressNSPodMatchLabels [object] Pod labels to match to allow traffic from other namespaces
      ##
      ingressNSMatchLabels: { }
      ingressNSPodMatchLabels: { }

What is the expected behavior?

Invoice gets generated as a pdf. (Note that the preview works, just not the actual PDF)

What do you see instead?

image

RPC_ERROR Odoo Server Error Traceback (most recent call last): File "/opt/bitnami/odoo/venv/lib/python3.12/site-packages/reportlab/graphics/renderPM.py", line 43, in _getPMBackend import rlPyCairo as M ModuleNotFoundError: No module named 'rlPyCairo'

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "/opt/bitnami/odoo/venv/lib/python3.12/site-packages/reportlab/graphics/renderPM.py", line 46, in _getPMBackend import _rl_renderPM as M ModuleNotFoundError: No module named '_rl_renderPM'

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/http.py", line 1783, in _serve_db return service_model.retrying(self._serve_ir_http, self.env) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/service/model.py", line 133, in retrying result = func() ^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/http.py", line 1810, in _serve_ir_http response = self.dispatcher.dispatch(rule.endpoint, args) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/http.py", line 2014, in dispatch result = self.request.registry['ir.http']._dispatch(endpoint) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/base/models/ir_http.py", line 222, in _dispatch result = endpoint(request.params) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/http.py", line 759, in route_wrapper result = endpoint(self, *args, *params_ok) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/web/controllers/dataset.py", line 28, in call_button action = self._call_kw(model, method, args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/web/controllers/dataset.py", line 20, in _call_kw return call_kw(request.env[model], method, args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/api.py", line 468, in call_kw result = _call_kw_multi(method, model, args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/api.py", line 453, in _call_kw_multi result = method(recs, args, kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/account/wizard/account_move_send.py", line 732, in action_send_and_print return self._process_send_and_print( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/account/wizard/account_move_send.py", line 666, in _process_send_and_print self._generate_invoice_documents(moves_data, allow_fallback_pdf=allow_fallback_pdf) File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/account/wizard/account_move_send.py", line 592, in _generate_invoice_documents self._prepare_invoice_pdf_report(invoice, invoice_data) File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/account/wizard/account_move_send.py", line 380, in _prepare_invoice_pdf_report content, _report_format = self.env['ir.actions.report'].with_company(invoice.company_id)._render('account.account_invoices', invoice.ids) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/base/models/ir_actions_report.py", line 1011, in _render return render_func(report_ref, res_ids, data=data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/account/models/ir_actions_report.py", line 61, in _render_qweb_pdf return super()._render_qweb_pdf(report_ref, res_ids=res_ids, data=data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/base/models/ir_actions_report.py", line 904, in _render_qweb_pdf collected_streams = self._render_qweb_pdf_prepare_streams(report_ref, data, res_ids=res_ids) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/l10n_ch/models/ir_actions_report.py", line 32, in _render_qweb_pdf_prepare_streams res = super()._render_qweb_pdf_prepare_streams(report_ref, data, res_ids) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/account/models/ir_actions_report.py", line 20, in _render_qweb_pdf_prepare_streams return super()._render_qweb_pdf_prepare_streams(report_ref, data, res_ids=res_ids) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/base/models/ir_actions_report.py", line 754, in _render_qweb_pdf_prepare_streams html = self.with_context(additional_context)._render_qweb_html(report_ref, all_res_ids_wo_stream, data=data)[0] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/base/models/ir_actions_report.py", line 978, in _render_qweb_html data = self._get_rendering_context(report, docids, data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/stock/models/ir_actions_report.py", line 8, in _get_rendering_context data = super()._get_rendering_context(report, docids, data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/account/models/ir_actions_report.py", line 80, in _get_rendering_context data = super()._get_rendering_context(report, docids, data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/base/models/ir_actions_report.py", line 993, in _get_rendering_context data.update(report_model._get_report_values(docids, data=data)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/account/report/account_invoice_report.py", line 179, in _get_report_values rslt = super()._get_report_values(docids, data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/account/report/account_invoice_report.py", line 161, in _get_report_values new_code_url = invoice._generate_qr_code(silent_errors=data['report_type'] == 'html') ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/account/models/account_move.py", line 4507, in _generate_qr_code rslt = self.partner_bank_id.build_qr_code_base64(self.amount_residual, unstruct_ref, self.payment_reference, self.currency_id, self.partner_id, qr_code_method, silent_errors=silent_errors) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/account/models/res_partner_bank.py", line 161, in build_qr_code_base64 return self._get_qr_code_base64(vals) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/account/models/res_partner_bank.py", line 201, in _get_qr_code_base64 barcode = self.env['ir.actions.report'].barcode(**params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/lib/odoo-17.0.post20240905-py3.12.egg/odoo/addons/base/models/ir_actions_report.py", line 627, in barcode return barcode.asString('png') ^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/venv/lib/python3.12/site-packages/reportlab/graphics/shapes.py", line 803, in asString return renderPM.drawToString(self, fmt=format,showBoundary=getattr(self,'showBorder', ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/venv/lib/python3.12/site-packages/reportlab/graphics/renderPM.py", line 721, in drawToString drawToFile(d,s,fmt=fmt, dpi=dpi, bg=bg, configPIL=configPIL,backend=backend) File "/opt/bitnami/odoo/venv/lib/python3.12/site-packages/reportlab/graphics/renderPM.py", line 716, in drawToFile c = drawToPMCanvas(d, dpi=dpi, bg=bg, configPIL=configPIL, showBoundary=showBoundary,backend=backend) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/venv/lib/python3.12/site-packages/reportlab/graphics/renderPM.py", line 701, in drawToPMCanvas c = PMCanvas(d.width, d.height, dpi=dpi, bg=bg, configPIL=configPIL, backend=backend) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/venv/lib/python3.12/site-packages/reportlab/graphics/renderPM.py", line 304, in init self.dict['_gs'] = self._getGState(w,h,bg,backend) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/venv/lib/python3.12/site-packages/reportlab/graphics/renderPM.py", line 317, in _getGState mod = _getPMBackend(backend) ^^^^^^^^^^^^^^^^^^^^^^ File "/opt/bitnami/odoo/venv/lib/python3.12/site-packages/reportlab/graphics/renderPM.py", line 48, in _getPMBackend raise RenderPMError(f"""cannot import desired renderPM backend {backend} reportlab.graphics.utils.RenderPMError: cannot import desired renderPM backend rlPyCairo Seek advice at the users list see https://pairlist2.pair.net/mailman/listinfo/reportlab-users

The above server error caused the following client error: RPC_ERROR: Odoo Server Error RPC_ERROR at makeErrorFromResponse (https://odoo.pandia.io/web/assets/2a9f350/web.assets_web.min.js:2888:163) at XMLHttpRequest. (https://odoo.pandia.io/web/assets/2a9f350/web.assets_web.min.js:2892:13)

Additional information

I was unable to fix the error myself for multiple hours. Seems some library or program is missing inside the container. Tried older containers, did not seem to help. Breaks the usability application pretty hard! Any help appreciated! Thanks for contributing.

migruiz4 commented 3 days ago

Hi @codefuturist,

I'm sorry but the bitnami/odoo image does not include the python module 'rlPyCairo', which is required to use the invoice addon.

We will need to study if it is viable to include it in the image or not.

Meanwhile, you could workaround this issue by building your own image using the following Dockerfile:

FROM bitnami/odoo:17.0.20240905-debian-12-r0
RUN install_packages pkg-config build-essential libcairo2-dev && \
    dpkg -r --force-depends python3.11 && \
    /opt/bitnami/odoo/venv/bin/pip install rlPyCairo

Please give it a try and let us know if after installing the missing module, the invoice addon works. I have created an internal task to add the module to the bitnami/odoo image if possible.

codefuturist commented 2 days ago

Hi @codefuturist,

I'm sorry but the bitnami/odoo image does not include the python module 'rlPyCairo', which is required to use the invoice addon.

We will need to study if it is viable to include it in the image or not.

Meanwhile, you could workaround this issue by building your own image using the following Dockerfile:


FROM bitnami/odoo:17.0.20240905-debian-12-r0

RUN install_packages pkg-config build-essential libcairo2-dev && \

    dpkg -r --force-depends python3.11 && \

    /opt/bitnami/odoo/venv/bin/pip install rlPyCairo

Please give it a try and let us know if after installing the missing module, the invoice addon works.

I have created an internal task to add the module to the bitnami/odoo image if possible.

Hello @migruiz4,

I appreciate your efforts and will test your suggestion as soon as possible.

The strange thing is that it once did work in builds 3 Months ago and now I'm unable to downgrade (container refuses to start with attached volume). Also I tried to manually add rlPyCairo in the virtual env of Python, but it seemed like rlPyCairo has other dependencies that could not be resolved or we're missing in some way. Maybe this is due to the new major version of the library. I'm not a real professional in Python and just trying to provide some context.

Thanks a lot for your expertise!