Documentation for a newer release is available. View Latest
Esta página no está disponible actualmente en Español. Si lo necesita, póngase en contacto con el servicio de asistencia de Icon (correo electrónico)

Configurations overview

Docker-Compose

Docker-compose.yaml
# This contains only infrastructure and payment, query + CSM adapters.
services:

  reachability-service:
    image: csm-reachability-application:2.0.14
    container_name: reachability-service
    ports:
      - "8080:8080"
    user: "${UID:-root}:${GID:-root}"
    environment:
      - IPF_JAVA_ARGS=-Dma.glasnost.orika.writeClassFiles=false -Dma.glasnost.orika.writeSourceFiles=false
    volumes:
      - ./config/reachability-app:/csm-reachability-application/conf
      - ./import:/csm-reachability-application/import
    healthcheck:
      test: [ "CMD", "curl", "-f", "http://localhost:8080/actuator/health" ]
    depends_on:
      - ipf-mongo

  ipf-mongo:
    image: registry.ipf.iconsolutions.com/ipf-docker-mongodb:latest
    container_name: ipf-mongo
    ports:
      - "27017:27017"
    healthcheck:
      test: echo 'db.runCommand("ping").ok' | mongo localhost:27017/test --quiet
application.conf
ipf.mongodb.url = "mongodb://ipf-mongo:27017/ipa"

ipf.csm-reachability {
  debug.enabled = true

  settings-api {
    http.client.host = reachability-service
    connection = direct
    direct.parallelism = 16
    exclusion-list.parallelism = 16
    iban-plus.parallelism = 16
    party-entity.parallelism = 16
    read-query-batch-size {
      iban-plus-processor = 1000
      iban-structure-processor = 1000
      participant-processor = 1000
      participant-post-processor = 1000
      exclusion-list-processor = 1000
      exclusion-list-post-processor = 1000
      party-entity-processor = 1000
      party-entity-post-processor = 1000
    }
  }

  iban-structure {
    enabled = false
    file-ingestion {
      interval = 5s
      files-directory = "/csm-reachability-application/import/ibanstructure"
    }
  }

  iban-plus {
    enabled = false
    file-ingestion {
      interval = 10s
      files-directory = "/csm-reachability-application/import/swift/ibanplus"
    }
  }

  exclusion-list {
    enabled = false
    file-ingestion {
      interval = 10s
      files-directory = "/csm-reachability-application/import/exclusionlist"
    }
  }

  bic-dir-2018 {
    enabled = false
    file-ingestion {
      interval = 10s
      files-directory = "/csm-reachability-application/import/bicdir2018"
    }
  }

  party-entity.swift-bankplus {
    enabled = false
    file-ingestion {
      interval = 10s
      files-directory = "/csm-reachability-application/import/swift/partyentity"
    }
  }

  party-entity.six-bankplus {
    enabled = false
    file-ingestion {
      interval = 10s
      files-directory = "/csm-reachability-application/import/six/partyentity"
    }
  }

  participant {
    tips {
      process-participant.enabled = false
      file-ingestion {
        interval = 10s
        files-directory = "/csm-reachability-application/import/tips"
      }
    }

    rt1 {
      process-participant.enabled = false
      file-ingestion {
        interval = 10s
        files-directory = "/csm-reachability-application/import/rt1"
      }
    }

    step2 {
      process-participant.enabled = false
      file-ingestion {
        interval = 10s
        files-directory = "/csm-reachability-application/import/step2"
      }
    }

    sic {
      process-participant.enabled = false
      http {
        client {
          endpoint-url = "http://mock-server:1080/bankmaster/v2/public"
        }
      }
      load-settings {
        six-bankmaster-version = "3.0"
      }
      scheduler-settings {
        initial-delay = 3s
        interval = 10s
      }
    }
  }

  should-save-history {
    iban-plus-settings = false
    exclusion-list-settings = false
  }

}

file-ingestion.health {
  enabled = true
  process-failed-events = false
}

akka {
  cluster.bootstrap.enabled = false
  cluster.seed-nodes = ["akka://"${actor-system-name}"@0.0.0.0:"${akka.remote.artery.canonical.port}]
  remote.artery {
    canonical.port = 55001
    canonical.hostname = 0.0.0.0
    bind.hostname = 0.0.0.0
    bind.port = 55001
  }
}

event-processor.restart-settings {
  min-backoff = 100 ms
  max-backoff = 100 ms
}

Kubernetes

The TIPS CSM Service operates as an un-clustered, stateless application and so can be easily deployed using the following manifests

Deployment Manifest
apiVersion: apps/v1
kind: Deployment
metadata:
  name: csm-reachability
  annotations:
    prometheus.io/scrape: "true"
    prometheus.io/path: "/"
    prometheus.io/port: "9001"
spec:
  replicas: 1
  selector:
    matchLabels:
      app: csm-reachability
      product: ipfv2
  template:
    metadata:
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/path: "/"
        prometheus.io/port: "9001"
      labels:
        app: csm-reachability
        product: ipfv2
    spec:
      imagePullSecrets:
        - name: "registrysecret"
      containers:
        - name: csm-reachability
          image: registry.ipf.iconsolutions.com/csm-reachability-init-container:2.0.14
          imagePullPolicy: Always
          securityContext:
            runAsUser: 0
            allowPrivilegeEscalation: true
          ports:
            - name: http
              containerPort: 8080
            - name: debug-port
              containerPort: 5005
            - name: akka-artery
              containerPort: 55001
            - name: akka-management
              containerPort: 8558
            - name: akka-metrics
              containerPort: 9001
          livenessProbe:
            failureThreshold: 5
            httpGet:
              path: /health/alive
              port: akka-management
              scheme: HTTP
            initialDelaySeconds: 60
            periodSeconds: 2
            successThreshold: 1
            timeoutSeconds: 1
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /health/ready
              port: akka-management
              scheme: HTTP
            initialDelaySeconds: 60
            periodSeconds: 2
            successThreshold: 10
            timeoutSeconds: 1
          env:
            - name: "POD_NAME"
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: "IPF_JAVA_ARGS"
              value: "-Dma.glasnost.orika.writeClassFiles=false -Dma.glasnost.orika.writeSourceFiles=false"
            - name: "POD_IP"
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: "KUBERNETES_NAMESPACE"
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          resources:
            requests:
              memory: 8Gi
              cpu: 8
          volumeMounts:
            - mountPath: /csm-reachability-application/conf/logback.xml
              name: config-volume
              subPath: logback.xml
            - mountPath: /csm-reachability-application/conf/application.conf
              name: config-volume
              subPath: application.conf
            - name: shared-ingest
              mountPath: /ingest/input
      volumes:
        - name: config-volume
          configMap:
            name: csm-reachability-cm
        - name: keystore
          secret:
            secretName: keystore
        - name: shared-ingest
          emptyDir: {}
Service Manifest
apiVersion: v1
kind: Service
metadata:
  name: csm-reachability
  labels:
    product: ipfv2
spec:
  selector:
    app: csm-reachability
    product: ipfv2
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      name: actuator
    - protocol: TCP
      port: 9001
      targetPort: 9001
      name: akka-metrics
    - protocol: TCP
      port: 55001
      targetPort: 55001
      name: remoting
    - protocol: TCP
      port: 5005
      targetPort: 5005
      name: debug
ConfigMap Manifest
apiVersion: v1
kind: ConfigMap
metadata:
  name: csm-reachability-cm
data:
  application.conf: |-
    ipf.csm-reachability.settings-api.http.client {
      host = csm-reachability.default.svc.cluster.local
      port = 80
    }

    ipf.csm-reachability.should-save-history {
      agent-settings-settings = false
      agent-clearing-settings-settings = false
      agent-settlement-settings-settings = false
      cs-agent-selection-settings-settings = false
      exclusion-list-settings = false
      generic-processing-settings-settings = false
      processing-entity-settings = false
      bicdir2018-settings = false
      party-entity-settings = false
      iban-structure-settings = false
      iban-plus-settings = false
      participant-settings = false
      party-entity-settings = false
    }

    ipf.mongodb.url = "mongodb://mongo:27017/db"
    
    file-ingestion.health {
      enabled = false
    }
    
    ipf.csm-reachability {
      party-entity.swift-bankplus {
        file-ingestion {
          files-directory = "/ingest/input/party-entities/swift"
          initial-delay = 35m
          interval = 12h
        }
      }
      
      party-entity.six-bankmaster {
        file-ingestion {
          files-directory = "/ingest/input/party-entities/six"
          initial-delay = 5m
          interval = 12h
        }
      }
      
      iban-structure {
        file-ingestion {
          files-directory = "/ingest/input/ibanstructure"
          directory-id = "iban-structure"
          initial-delay = 2m
          interval = 12h
        }
      }
      
      iban-plus {
        file-ingestion {
          files-directory = "/ingest/input/ibanplus"
          directory-id = "IBANPLUS"
          initial-delay = 5m
          interval = 12h
        }
      }
      
      participant {
        tips {
          file-ingestion {
            files-directory = "/ingest/input/participant/tips"
            initial-delay = 2m
            interval = 12h
          }
        }
        
        rt1 {
          file-ingestion {
            files-directory = "/ingest/input/participant/rt1"
            initial-delay = 5m
            interval = 12h
          }
        }
        
        step2 {
          file-ingestion {
            files-directory = "/ingest/input/participant/step2"
            initial-delay = 2m
            interval = 12h
          }
        }
        
        sic {
          process-participant.enabled = true
          http {
            client {
              endpoint-url = "http://mock-server:1080/bankmaster/v2/public"
            }
          }
          load-settings {
            six-bankmaster-version = "3.0"
          }
          
          scheduler-settings {
            initial-delay = 5m
            interval = 12h
          }
        }
        
        tips.process-participant.enabled = false
        rt1.process-participant.enabled = false
        step2.process-participant.enabled = false
      }
      
      bic-dir-2018.enabled = false
      iban-plus.enabled = false
      iban-structure.enabled = false
      exclusion-list.enabled = false
      party-entity.six-bankmaster.enabled = false
      party-entity.swift-bankplus.enabled = true
    }

    ipf.behaviour.retries.initial-timeout = 3s

    message.logger.enabled = false

    ipf.csm-reachability.settings-api.connection = "direct"
    ipf.csm-reachability.settings-api.file-handling.connection = "direct"
    ipf.csm-reachability.setting.processing-entity-accounts {
      # optional custom values
      account-type.custom-codes = ["SuspenseAccount", "LedgerAccount"]
      account-subtype.custom-codes = ["ReturnsRejects"]
    }
    
    iconsolutions.akka.persistence.mongodb {
      class = "com.iconsolutions.akka.persistence.mongodb.MongoDBAsyncWriteJournal"
      plugin-dispatcher = "akka.actor.default-dispatcher"
      url = "mongodb://mongo:27017/db"
    }
    akka {
      # Use Kubernetes API to discover the cluster
      discovery {
        kubernetes-api {
          pod-label-selector = "app=%s"
        }
      }
      actor.provider = cluster
      cluster {
        seed-nodes = []
        downing-provider-class = "akka.cluster.sbr.SplitBrainResolverProvider"
        split-brain-resolver {
          active-strategy = keep-majority
          stable-after = 20s
        }
        sharding {
          handoff-timeout = 8s
          least-shard-allocation-strategy.rebalance-absolute-limit = 20
          rebalance-interval = 2s
          number-of-shards = 10
          passivation {
            strategy = "default-strategy"
            default-strategy.active-entity-limit = 20000
          }
        }
      }
      remote.artery.canonical.hostname = ${POD_IP}
      management {
        # available from Akka management >= 1.0.0
        health-checks {
          readiness-path = "health/ready"
          liveness-path = "health/alive"
        }
        # use the Kubernetes API to create the cluster
        cluster.bootstrap {
          contact-point-discovery {
            service-name = "csm-reachability"
            discovery-method = kubernetes-api
            required-contact-point-nr = 1
            required-contact-point-nr = ${?REQUIRED_CONTACT_POINT_NR}
          }
        }
      }
    }
  logback.xml: |-
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <target>System.out</target>
            <encoder>
                <pattern>[%date{ISO8601}] [%level] [%logger] [%marker] [%thread] - %msg%n</pattern>
            </encoder>
        </appender>
        
        <logger name="akka.stream.scaladsl.RestartWithBackoffSource" level="WARN"/>
        <logger name="com.iconsolutions.ipf.core.connector" level="INFO"/>
        <logger name="com.iconsolutions.ipf.core.platform.read.processor" level="INFO"/>
        <logger name="com.iconsolutions.akka.persistence.mongodb" level="INFO"/>
        <logger name="com.iconsolutions.ipf.core.platform.journal.processor.EventProcessorStreamInitialiser" level="OFF"/>
        
        <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
            <queueSize>8192</queueSize>
            <neverBlock>true</neverBlock>
            <appender-ref ref="CONSOLE"/>
        </appender>
        
        <root level="info">
            <appender-ref ref="ASYNC"/>
        </root>

    </configuration>