AS4 Microservices Kubernetes Deployment Dokumentation

Das AS4 System kann über Docker Images und Helm Charts in Kubernetes Clustern betrieben werden. Wir empfehlen für den produktiven Einsatz den Betrieb in einem Kubernetes Cluster.

Es folgt die Template-Struktur eines unserer Kubernetes Entwicklungssysteme für eigene Deployments.

AS4-Services

Anmerkungen

Die AS4-Services erfordern Zugriff auf RabbitMQ. Hierfür werden von Bitnami/RabbitMQ ebenfalls Docker Images und Helm-Charts bereitgestellt.

Zur Absicherung der REST-APIs per OAuth2 kann Keycloak genutzt werden.

AS4-Services im Kubernetes

Das folgende Helm-Chart yaml Datei beinhaltet die AS4 Services für ein Deployment aller AS4 Microservices im Kubernetes Cluster. Als kann als Beispiel/Template für eigene Installationen genutzt werden.

values.yaml Konfigurationsdatei

as4-address-service-helm:
  enabled: true
  replicaCount: 1
  autoscaling:
    enabled: false
  resources:
    limits:
      cpu: 400m
      memory: 800Mi
    requests:
      cpu: 400m
      memory: 800Mi
  env:
    TZ: "Europe/Berlin"
    RABBITMQ_HOST: 'rabbitmq-cluster.as4-dev.svc.cluster.local'
    RABBITMQ_PORT: '5672'
    RABBITMQ_USERNAME: 'rabbitmq-admin'
    RABBITMQ_PASSWORD: '***'
    DATASOURCE_URL: 'jdbc:postgresql://as4-postgres.as4-dev.svc.cluster.local:5432/as4?currentSchema=as4_address'
    DATASOURCE_USERNAME: 'as4'
    DATASOURCE_PASSWORD: '***'
    DATASOURCE_TYPE: "postgres"
    FSS_SERVER_API_URL: 'http://fss.as4-dev.svc.cluster.local:3331/fss/api/v1'
    AUTOCONFIRMRELATION: 'true'
  probes:
    liveness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /aep-as4-address-service/actuator/health
          port: 8080
    readiness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /aep-as4-address-service/actuator/health
          port: 8080
    startup:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /aep-as4-address-service/actuator/health
          port: 8080
        failureThreshold: 120
        periodSeconds: 5

as4-crypto-operations-helm:
  enabled: true
  replicaCount: 1
  autoscaling:
    enabled: false
  resources:
    limits:
      cpu: 400m
      memory: 800Mi
    requests:
      cpu: 400m
      memory: 800Mi
  env:
    TZ: 'Europe/Berlin'
    FSS_SERVER_API_URL: 'http://fss.as4-dev.svc.cluster.local:3331/fss/api/v1'
    SERVER_PORT: '8080'
    SPRING_RABBITMQ_HOST: 'rabbitmq-cluster.as4-dev.svc.cluster.local'
    SPRING_RABBITMQ_PORT: '5672'
    SPRING_RABBITMQ_USERNAME: 'rabbitmq-admin'
    SPRING_RABBITMQ_PASSWORD: '***'
    SPRING_PROFILES_ACTIVE: 'scaling'
  probes:
    liveness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /actuator/health
          port: 8080
    readiness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /actuator/health
          port: 8080
    startup:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /actuator/health
          port: 8080
        failureThreshold: 120
        periodSeconds: 5

as4-cryptography-csr-helm:
  enabled: true
  replicaCount: 1
  autoscaling:
    enabled: false
  resources:
    limits:
      cpu: 250m
      memory: 500Mi
    requests:
      cpu: 250m
      memory: 500Mi
  probes:
    liveness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /as4-crypto-csr/api/v1/actuator/health
          port: 3333
    readiness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /as4-crypto-csr/api/v1/actuator/health
          port: 3333
    startup:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /as4-crypto-csr/api/v1/actuator/health
          port: 3333
        failureThreshold: 900
        periodSeconds: 5
  env:
    TZ: 'Europe/Berlin'
    DATASOURCE_URL: 'jdbc:postgresql://as4-postgres.as4-dev.svc.cluster.local:5432/as4?currentSchema=as4_csr'
    DATASOURCE_USERNAME: 'as4'
    DATASOURCE_PASSWORD: '***'
    FSS_SERVER_API_URL: 'http://fss.as4-dev.svc.cluster.local:3331/fss/api/v1'
    USER_HOME: '/opt/out'
    JDK_JAVA_OPTIONS: "-Djdk.tls.namedGroups=brainpoolP384r1,brainpoolP256r1,secp384r1,secp256r1"

as4-inbound-endpoint-helm:
  enabled: true
  replicaCount: 1
  autoscaling:
    enabled: false
  resources:
    limits:
      cpu: 400m
      memory: 800Mi
    requests:
      cpu: 400m
      memory: 800Mi
  ingress:
    enabled: true
    ingressClassName: "nginx"
    annotations:
      nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
      nginx.ingress.kubernetes.io/ssl-passthrough: 'true'
      nginx.ingress.kubernetes.io/ssl-redirect: 'true'
    hosts:
      - host: 9900000000008.level-365.com
        paths:
          - path: /
            pathType: Prefix
      - host: 9900000000009.level-365.com
        paths:
          - path: /
            pathType: Prefix
  env:
    TZ: 'Europe/Berlin'
    RABBITMQ_HOST: 'rabbitmq-cluster.as4-dev.svc.cluster.local'
    RABBITMQ_PORT: '5672'
    RABBITMQ_USERNAME: 'rabbitmq-admin'
    RABBITMQ_PASSWORD: '***'
    FSS_SERVER_API_URL: 'http://fss.as4-dev.svc.cluster.local:3331/fss/api/v1'
    ADDRESSSERVICEURL: 'http://as4-dev-as4-address-service.as4-dev:8080/aep-as4-address-service'
    SERVER_SERVLET_CONTEXTPATH: '/aep-as4-inbound-endpoint'
    SPRING_PROFILES_ACTIVE: 'scaling'
    STARTUPSSLCHECK: 'true'
  probes:
    liveness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /aep-as4-inbound-endpoint/actuator/health
          port: 8080
    readiness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /aep-as4-inbound-endpoint/actuator/health
          port: 8080
    startup:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /aep-as4-inbound-endpoint/actuator/health
          port: 8080
        failureThreshold: 120
        periodSeconds: 5
  service:
    enabled: true
    type: ClusterIP
    port:
      port: 8443
      name: http
      protocol: TCP

as4-message-service-helm:
  enabled: true
  replicaCount: 1
  autoscaling:
    enabled: false
  resources:
    limits:
      cpu: 500m
      memory: 1000Mi
    requests:
      cpu: 500m
      memory: 1000Mi
  env:
    TZ: 'Europe/Berlin'
    DATASOURCE_URL: 'jdbc:postgresql://as4-postgres.as4-dev.svc.cluster.local:5432/as4?currentSchema=as4_messages'
    DATASOURCE_USERNAME: 'as4'
    DATASOURCE_PASSWORD: '***'
    DATASOURCE_TYPE: 'postgres'
    RABBITMQ_HOST: 'rabbitmq-cluster.as4-dev.svc.cluster.local'
    RABBITMQ_PORT: '5672'
    RABBITMQ_USERNAME: 'rabbitmq-admin'
    RABBITMQ_PASSWORD: '***'
    DELETION_OLDERTHAN: 'P0Y3M'
    DATASOURCE_DRIVER: 'org.postgresql.Driver'
    DATASOURCE_DRIVERDELEGATECLASS: 'org.quartz.impl.jdbcjobstore.PostgreSQLDelegate'
    DELETION_CRON: '0 45 * * * ?'
  probes:
    liveness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /aep-as4-message-service/actuator/health
          port: http
    readiness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /aep-as4-message-service/actuator/health
          port: http
    startup:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /aep-as4-message-service/actuator/health
          port: http
        failureThreshold: 900
        periodSeconds: 5

as4-outbound-market-message-service-helm:
  enabled: true
  replicaCount: 1
  autoscaling:
    enabled: false
  resources:
    limits:
      cpu: 400m
      memory: 800Mi
    requests:
      cpu: 400m
      memory: 800Mi
  env:
    TZ: 'Europe/Berlin'
    RABBITMQ_HOST: 'rabbitmq-cluster.as4-dev.svc.cluster.local'
    RABBITMQ_PORT: '5672'
    RABBITMQ_USERNAME: 'rabbitmq-admin'
    RABBITMQ_PASSWORD: '***'
    ADDRESSSERVERURL: 'http://as4-dev-as4-address-service.as4-dev.svc.cluster.local:8080/aep-as4-address-service/as4-address'
    SPRING_CLOUD_STREAM_RABBIT_BINDINGS_CONSUMEOUTBOUNDREQUESTEVENTIN0_CONSUMER_BINDINGROUTINGKEY: 'https://www.bdew.de/as4/communication/services/FP,default,https://www.bdew.de/as4/communication/services/MP'
    SPRING_CLOUD_STREAM_RABBIT_BINDINGS_CONSUMEOUTBOUNDREQUESTEVENTIN0_CONSUMER_BINDINGROUTINGKEYDELIMITER: ','
  probes:
    liveness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: aep-as4-outbound-market-message-service/actuator/health
          port: 8080
    readiness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: aep-as4-outbound-market-message-service/actuator/health
          port: 8080
    startup:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: aep-as4-outbound-market-message-service/actuator/health
          port: 8080
        failureThreshold: 120
        periodSeconds: 5

as4-outbound-sender-helm:
  enabled: true
  replicaCount: 1
  autoscaling:
    enabled: false
  resources:
    limits:
      cpu: 400m
      memory: 800Mi
    requests:
      cpu: 400m
      memory: 800Mi
  env:
    RABBITMQ_HOST: 'rabbitmq-cluster.as4-dev.svc.cluster.local'
    RABBITMQ_PORT: '5672'
    RABBITMQ_USERNAME: 'rabbitmq-admin'
    RABBITMQ_PASSWORD: '***'
    FSS_SERVER_API_URL: 'http://fss.as4-dev.svc.cluster.local:3331/fss/api/v1'
    ADDRESSSERVICEURL: 'http://as4-dev-as4-address-service.as4-dev:8080/aep-as4-address-service'
    JDK_JAVA_OPTIONS: "-Djdk.tls.cipherSuites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_BRAINPOOLP384R1,TLS_ECDHE_ECDSA_WITH_BRAINPOOLP256R1,TLS_ECDHE_ECDSA_WITH_SECP384R1,TLS_ECDHE_ECDSA_WITH_SECP256R1 -Djdk.tls.namedGroups=brainpoolP384r1,brainpoolP256r1,secp384r1,secp256r1 -Dhttps.protocols=TLSv1.2 -Djdk.tls.client.protocols=TLSv1.2"
    RECEIPTCRYPTOEXCHANGENAME: 'as4.verify'
  probes:
    liveness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /actuator/health
          port: 8080
    readiness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /actuator/health
          port: 8080
    startup:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /actuator/health
          port: 8080
        failureThreshold: 120
        periodSeconds: 5

as4-receipt-service-helm:
  enabled: true
  replicaCount: 1
  autoscaling:
    enabled: false
  resources:
    limits:
      cpu: 400m
      memory: 800Mi
    requests:
      cpu: 400m
      memory: 800Mi
  env:
    TZ: 'Europe/Berlin'
    RABBITMQ_HOST: 'rabbitmq-cluster.as4-dev.svc.cluster.local'
    RABBITMQ_PORT: '5672'
    RABBITMQ_USERNAME: 'rabbitmq-admin'
    RABBITMQ_PASSWORD: '***'
  probes:
    liveness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /aep-as4-receipt-service/actuator/health
          port: 8080
    readiness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /aep-as4-receipt-service/actuator/health
          port: 8080
    startup:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /aep-as4-receipt-service/actuator/health
          port: 8080
        failureThreshold: 120
        periodSeconds: 5

crl-downloader-helm:
  enabled: true
  replicaCount: 1
  autoscaling:
    enabled: false
  resources:
    limits:
      cpu: 400m
      memory: 800Mi
    requests:
      cpu: 400m
      memory: 800Mi
  env:
    FSS_SERVER_API_URL: 'http://fss.as4-dev.svc.cluster.local:3331/fss/api/v1'
    
rabbitmq-cluster-operator:
  enabled: true
  rabbitmqImage:
    repository: bitnamilegacy/rabbitmq
  clusterOperator:
    image:
      repository: bitnamilegacy/rabbitmq-cluster-operator
    metrics:
      service:
        enabled: true
    replicaCount: 1
    resources:
      limits:
        cpu: 200m
        memory: 200Mi
      requests:
        cpu: 100m
        memory: 100Mi
  msgTopologyOperator:
    image:
      repository: bitnamilegacy/rmq-messaging-topology-operator
    replicaCount: 1
    resources:
      limits:
        cpu: 200m
        memory: 200Mi
      requests:
        cpu: 100m
        memory: 100Mi
  extraDeploy:
    - apiVersion: rabbitmq.com/v1beta1
      kind: RabbitmqCluster
      metadata:
        name: rabbitmq-cluster
      spec:
        persistence:
          storage: 128G
          storageClassName: "rabbitmq-node-storage"
        replicas: 3
        rabbitmq:
          additionalPlugins:
            - rabbitmq_shovel
            - rabbitmq_shovel_management
            - rabbitmq_top
          additionalConfig: |
            raft.wal_max_size_bytes = 16000000
            cluster_formation.target_cluster_size_hint = 3
            vm_memory_high_watermark.relative = 0.7
            max_message_size = 33554432
          envConfig: |
            RABBITMQ_DEFAULT_USER=rabbitmq-admin
            RABBITMQ_DEFAULT_PASS=***
        resources:
          limits:
            cpu: '1'
            memory: 1800Mi
          requests:
            cpu: '500m'
            memory: 1800Mi

certificate-manager-helm:
  enabled: true
  replicaCount: 1
  autoscaling:
    enabled: false
  resources:
    limits:
      cpu: 400m
      memory: 800Mi
    requests:
      cpu: 400m
      memory: 800Mi
  probes:
    liveness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /aep-certificate-manager/actuator/health
          port: http
    readiness:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /aep-certificate-manager/actuator/health
          port: http
    startup:
      enabled: true
      custom: true
      spec:
        httpGet:
          path: /aep-certificate-manager/actuator/health
          port: http
        failureThreshold: 900
        periodSeconds: 5
  env:
    TZ: 'Europe/Berlin'
    SPRING_RABBITMQ_HOST: 'rabbitmq-cluster.as4-dev.svc.cluster.local'
    SPRING_RABBITMQ_PORT: '5672'
    SPRING_RABBITMQ_USERNAME: 'rabbitmq-admin'
    SPRING_RABBITMQ_PASSWORD: '***'
    AS4ADDRESSSERVICEURL: 'http://as4-dev-as4-address-service.as4-dev:8080/aep-as4-address-service'
    FSS_SERVER_API_URL: 'http://fss.as4-dev.svc.cluster.local:3331/fss/api/v1'
    LDAPS_ENABLED: 'true'
    CERTMANAGER_SUBCAURL_0_: 'ldaps://ldap.sm-pki.atos.net'
    CERTMANAGER_SUBCAURL_1_: 'ldaps://ldap.energyca.telesec.de'
    CERTMANAGER_SUBCAURL_2_: 'ldaps://ldap.cc-gwa.de'
    CERTMANAGER_SUBCAURL_3_: 'ldaps://ldap.sub-ca.da-rz.net'
    CERTMANAGER_SUBCAURL_4_: 'ldaps://ldap.smpki.schleupen.cloud'
    CERTMANAGER_SUBCAURL_5_: 'ldaps://ldap.gwadriga.de'
    CERTMANAGER_SUBCAURL_6_: 'ldaps://ldaps.smartserviceca.sm-pki.smartservice.de'
    DOWNLOADPARTNERCERTIFICATESCHEDULER: '0 0 17 * * *'

fss-helm:
  enabled: true
  replicaCount: 1
  autoscaling:
    enabled: false
  type: statefulset
  resources:
    limits:
      cpu: 800m
      memory: 1600Mi
    requests:
      cpu: 800m
      memory: 1600Mi
  service:
    enabled: true
    type: ClusterIP
    port:
      port: 3331
      name: http
      protocol: HTTP
  forcePodRecreationOnHelmUpdate: false
  env:
    TZ: 'Europe/Berlin'
    SPRING_PROFILES_ACTIVE: 'nosecure'
    DB_DRIVER: 'org.postgresql.Driver'
    DB_URL: 'jdbc:postgresql://as4-postgres.as4-dev.svc.cluster.local:5432/as4?currentSchema=fss'
    DB_USERNAME: 'as4'
    DB_PASSWORD: '***'
    DB_DIALECT: 'org.hibernate.dialect.PostgreSQLDialect'
    NO_DEFAULT_CERT_PURPOSE: 'true'
    SERVER_PORT: '3331'
    CLUSTER_USE_CLUSTERNODE_HOSTNAME: 'true'
    JAVA_OPTS: "-Dcluster.service.period=30 -Dverify.filter.mapping=/opt/securityserver/conf/verifyFilterMapping.properties -Drevision.info.server.url=http://changeme -Djavax.net.ssl.trustStoreType=JKS -Dhsm.slot.connection.inactivity.timeout=3 -DHSM_MIN_EVICTABLE_IDLE_MILLIS=180000 -DHSM_MIN_IDLE_CONNECTIONS_PER_SLOT=1 -DHSM_MAX_IDLE_CONNECTIONS_PER_SLOT=3 -DHSM_POOL_EVICTION_PERIOD=60000 -DHSM_MAX_POOLED_CONNECTIONS=3000 -Xmx2048m -Xms512m"

hsm-simulator-helm:
  enabled: true
  replicaCount: 1
  autoscaling:
    enabled: false
  resources:
    limits:
      cpu: 400m
      memory: 800Mi
    requests:
      cpu: 400m
      memory: 800Mi
  podSecurityContext:
    fsGroup: 5000         # Ensures mounted volume is writable by this group

Chart.yaml Konfigurationsdatei

Die Versionen der Helm-Charts und Docker-Images sind in der Chart.yaml Datei angegeben, wie zum Beispiel hier:

apiVersion: v2
name: deployment
type: application
version: 2025-12-02
appVersion: "1.0.0"

dependencies:
  - name: as4-address-service-helm
    version: 2025-10-14
    condition: as4-address-service-helm.enabled
    repository: "oci://docker-nob-erp.next-level-apps.com/as4"
  - name: as4-crypto-operations-helm
    version: 2025-10-14
    condition: as4-crypto-operations-helm.enabled
    repository: "oci://docker-nob-erp.next-level-apps.com/as4"
  - name: as4-cryptography-csr-helm
    version: 2025-11-19-02
    condition: as4-cryptography-csr-helm.enabled
    repository: "oci://docker-nob-erp.next-level-apps.com/as4"
  - name: as4-inbound-endpoint-helm
    version: 2025-10-22
    condition: as4-inbound-endpoint-helm.enabled
    repository: "oci://docker-nob-erp.next-level-apps.com/as4"
  - name: as4-message-service-helm
    version: 2025-10-14
    condition: as4-message-service-helm.enabled
    repository: "oci://docker-nob-erp.next-level-apps.com/as4"
  - name: as4-outbound-market-message-service-helm
    version: 2025-10-14
    condition: as4-outbound-market-message-service-helm.enabled
    repository: "oci://docker-nob-erp.next-level-apps.com/as4"
  - name: as4-outbound-sender-helm
    version: 2025-10-14
    condition: as4-outbound-sender-helm.enabled
    repository: "oci://docker-nob-erp.next-level-apps.com/as4"
  - name: as4-receipt-service-helm
    version: 2025-10-16
    condition: as4-receipt-service-helm.enabled
    repository: "oci://docker-nob-erp.next-level-apps.com/as4"
  - name: crl-downloader-helm
    version: 2025-10-22
    condition: crl-downloader-helm.enabled
    repository: "oci://docker-nob-erp.next-level-apps.com/crypto"
  - name: certificate-manager-helm
    version: 2025-11-21
    condition: certificate-manager-helm.enabled
    repository: "oci://docker-nob-erp.next-level-apps.com/crypto"
  - name: rabbitmq-cluster-operator
    version: 4.4.34
    condition: rabbitmq-cluster-operator.enabled
    repository: https://raw.githubusercontent.com/bitnami/charts/index/bitnami
  - name: fss-helm
    version: 2025-10-31
    condition: fss-helm.enabled
    repository: "oci://docker-nob-erp.next-level-apps.com/b2b"
  - name: hsm-simulator-helm
    version: 2024-06-26
    condition: hsm-simulator-helm.enabled
    repository: "oci://docker-nob-erp.next-level-apps.com/crypto"

UIs

Die Installation der B2B/AS4 UIs im Kubernetes Cluster finden Sie hier.

Einbindung des Datenbank-Treibers

Wenn als Remote AS4-Datenbank eine Oracle eingesetzt wird und die entsprechenden Datenbank-Treiber aus Lizenzgründen nicht durch uns ausgeliefert werden dürfen, sind diese durch den Kunden in die Docker Images nach /app/lib/ zu kopieren. Das ist auf verschiedenen Wegen möglich, z.B. per InitContainer, oder durch manuelle Erweiterung des Docker Images.

Das Dockerfile kann so aussehen:

FROM docker-nob-erp.next-level-apps.com/as4/as4-address-service:2025-10-14
COPY ojdbc17.jar /app/lib/
EOF

und kann dann per docker build als neues Image gebaut werden. Wird dabei das gleiche Image Tag verwendet, sind keine weiteren Anpassungen am Deployment notwendig. Wenn zur besseren Unterscheidbarkeit z.B. docker build -t docker-nob-erp.next-level-apps.com/as4/as4-address-service:2025-10-14-oracle verwendet wird, muss im Deployment jeweils der Image Tag ebenfalls angepasst werden:

as4-address-service-helm:
  image:
    tag: 2025-10-14-oracle

Weiterhin sind bei den betroffenen Services die Umgebungsvariablen entsprechend anzupassen:

as4-address-service-helm:
  env:
    DATASOURCE_TYPE: 'oracle'

as4-cryptography-csr-helm:
  env:
    DATASOURCE_TYPE: 'oracle'

as4-message-service-helm:
  env:
    DATASOURCE_TYPE: 'oracle'
    DATASOURCE_DRIVER: 'oracle.jdbc.driver.OracleDriver'
    DATASOURCE_DRIVERDELEGATECLASS: 'org.quartz.impl.jdbcjobstore.oracle.OracleDelegate'

fss-helm:
  env:
    DB_DRIVER: 'oracle.jdbc.driver.OracleDriver'
    DB_DIALECT: 'com.nextlevel.security.persistence.dialect.Oracle10gSecServerDialect'

Als Bezugsquelle für die JDBC-Treiber kann die entsprechende Download-Seite von Oracle verwendet werden.

View Me   Edit Me