Table of Contents

Install FastReport Corporate Server

Products: FastReport Corporate Server

The minimum configuration of the corporate report server consists of the nine components described below. Before installation, variables must be defined, for example, in the config.sh file. To avoid name conflicts, it is better to have a global configuration file for all report scripts. The following example shows how to initialize the variables used by the report server installation scripts:

IMAGE_STORAGE=storage.fast-report.com/repository/docker-registry
IMAGE_TAG=debian-2026.2.13
NAMESPACE=fr-corporate-server
SECRET_VOLUME_NAME=corporate-volume-secret
IMAGE_REGISTRY_SECRET_NAME=storage_secret
SECRET_VOLUME_NAME=corporate-volume-secret
PULL_POLICY=Never

Variable description:
IMAGE_STORAGE - address of the report server service images storage, the Corporate Server uses local storage; filling it with images is described in the Prepare images section. IMAGE_TAG - report server version. NAMESPACE - the Kubernetes namespace in which the report server will run. SECRET_VOLUME_NAME - the name of the volume on which the configuration and authorization information will be stored. IMAGE_REGISTRY_SECRET_NAME - the name of the record that stores authorization information on the server, holding service images on the report server. PULL_POLICY - determines how Kubernetes will download service images. Possible values:

  • Always - always download images at service startup;
  • IfNotPresent - download an image only if it is not present locally;
  • Never - use pre-imported images, never download them from an external server.

Note: the described configuration does not download images from external storage (PULL_POLICY=Never), these variables must be set to avoid errors when applying the configuration. Before setting the PULL_POLICY value, please refer to the fr-images section to learn the settings.

Configuring the report server settings is described in Report server configuration. This document features the basic parameters that define the report server operating modes.

Gateway is a service for processing incoming requests

Gateway is a service that handles all connections to the report server. It analyzes requests and distributes them among other services. If the Gateway service does not work or does not work properly, none of the report server components will work. Ingess configuration by default sends all external requests to this service. In case of any problems with the service, start analyzing the problem by looking at the logs of the fr-gateway service.

#!/bin/sh

HTTPS_NODE_PORT=32222
IMAGE="${IMAGE_STORAGE}/fastreport-corporate-server-gateway:${IMAGE_TAG}"

cat <<EOF | kubectl apply -n $NAMESPACE -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: fr-gateway
  namespace: $NAMESPACE
  labels:
    app.kubernetes.io/name: fr-gateway
rules:
  - apiGroups: [""]
    resources:
      - services
      - endpoints
      - pods
    verbs: ["get", "list", "watch"]

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: fr-gateway
  namespace: $NAMESPACE
  labels:
    app.kubernetes.io/name: fr-gateway

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: fr-gateway
  namespace: $NAMESPACE
  labels:
    app.kubernetes.io/name: fr-gateway
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: fr-gateway
subjects:
- kind: ServiceAccount
  name: fr-gateway
  namespace: $NAMESPACE

---
apiVersion: v1
kind: Service
metadata:
  name: fr-gateway
  namespace: $NAMESPACE
spec:
  type: NodePort
  selector:
    app: fr-gateway
  ports:
    - name: http
      protocol: TCP
      port: 80
      nodePort: 32223
    - name: https
      protocol: TCP
      port: 5005
      nodePort: $HTTPS_NODE_PORT

---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: fr-gateway
  namespace: $NAMESPACE
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fr-gateway
  strategy:
    type: Recreate
  template:
    metadata:
      namespace: $NAMESPACE
      labels:
        app: fr-gateway
    spec:
      serviceAccountName: fr-gateway
      containers:
      - image: $IMAGE
        imagePullPolicy: $PULL_POLICY
        name: fr-gateway
        #env:
        #  # Use secret in real usage
        #- name: MYSQL_ROOT_PASSWORD
        #  value: password
        ports:
        - containerPort: 80
          name: fr-gateway
        volumeMounts:
        - name: config-volume
          mountPath: /app/appsettings.Production.json
          subPath: appsettings.Production.json
        - name: secret-volume
          mountPath: /etc/cert
      imagePullSecrets:
        - name: $IMAGE_REGISTRY_SECRET_NAME
      volumes: 
      - name: config-volume
        configMap:
          name: fast-report-config
          items:
          - key: appsettings.Production.json
            path: appsettings.Production.json
      - name: secret-volume
        secret:
          secretName: $SECRET_VOLUME_NAME
EOF

Install the report server scheduler

IMAGE="${IMAGE_STORAGE}/fastreport-corporate-server-scheduler:${IMAGE_TAG}"

cat <<EOF | kubectl apply -n $NAMESPACE -f -
apiVersion: v1
kind: Service
metadata:
  name: fr-scheduler
  namespace: $NAMESPACE
spec:
  type: ClusterIP
  ports:
  - port: 80
  selector:
    app: fr-scheduler
EOF

cat <<EOF | kubectl apply -n $NAMESPACE -f -
apiVersion: apps/v1 
kind: Deployment
metadata:
  name: fr-scheduler
  namespace: $NAMESPACE
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fr-scheduler
  strategy:
    type: Recreate
  template:
    metadata:
      namespace: $NAMESPACE
      labels:
        app: fr-scheduler
    spec:
      containers:
      - image: $IMAGE
        imagePullPolicy: $PULL_POLICY
        name: fr-scheduler
        #env:
        #  # Use secret in real usage
        #- name: MYSQL_ROOT_PASSWORD
        #  value: password
        ports:
        - containerPort: 80
          name: fr-scheduler
        volumeMounts:
        - name: config-volume
          mountPath: /app/appsettings.Production.json
        - name: secret-volume
          mountPath: /etc/cert
      imagePullSecrets:
        - name: $IMAGE_REGISTRY_SECRET_NAME
      volumes:
      - name: config-volume
        configMap:
          name: fast-report-config
      - name: secret-volume
        secret:
          secretName: $SECRET_VOLUME_NAME
EOF

Static Preview is a service for viewing reports

#!/bin/sh

IMAGE="${IMAGE_STORAGE}/fastreport-corporate-server-static-preview:${IMAGE_TAG}"

cat <<EOF | kubectl apply -n $NAMESPACE -f -
apiVersion: v1
kind: Service
metadata:
  name: fr-s-preview
  namespace: $NAMESPACE
spec:
  type: ClusterIP
  ports:
  - port: 80
  selector:
    app: fr-s-preview
---
apiVersion: apps/v1 
kind: Deployment
metadata:
  name: fr-s-preview
  namespace: $NAMESPACE
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fr-s-preview
  strategy:
    type: Recreate
  template:
    metadata:
      namespace: $NAMESPACE
      labels:
        app: fr-s-preview
    spec:
      containers:
      - image: $IMAGE
        resources:
          limits:
            memory: 200Mi
          requests:
            memory: 200Mi
        imagePullPolicy: $PULL_POLICY
        name: fr-s-preview
        #env:
        #  # Use secret in real usage
        #- name: MYSQL_ROOT_PASSWORD
        #  value: password
        ports:
        - containerPort: 80
          name: fr-s-preview
      imagePullSecrets:
        - name: $IMAGE_REGISTRY_SECRET_NAME
EOF

Admin service

#!/bin/sh

IMAGE="${IMAGE_STORAGE}/fastreport-corporate-server-admin:${IMAGE_TAG}"

SECRET_VOLUME_NAME=corporate-volume-secret

cat <<EOF | kubectl apply -n $NAMESPACE -f -
apiVersion: v1
kind: Service
metadata:
  name: fr-admin
  namespace: $NAMESPACE
spec:
  type: ClusterIP
  ports:
  - port: 80
  selector:
    app: fr-admin
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: fr-admin
  namespace: $NAMESPACE
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fr-admin
  strategy:
    type: Recreate
  template:
    metadata:
      namespace: $NAMESPACE
      labels:
        app: fr-admin
    spec:
      containers:
      - image: $IMAGE
        imagePullPolicy: $PULL_POLICY
        name: fr-admin
        #env:
        #  # Use secret in real usage
        #- name: MYSQL_ROOT_PASSWORD
        #  value: password
        ports:
        - containerPort: 80
          name: fr-admin
      imagePullSecrets:
        - name: $IMAGE_REGISTRY_SECRET_NAME
EOF

Backend service

#!/bin/sh


IMAGE="${IMAGE_STORAGE}/fastreport-corporate-server-backend:${IMAGE_TAG}"

cat <<EOF | kubectl apply -n $NAMESPACE -f -
apiVersion: v1
kind: Service
metadata:
  name: fr-backend
  namespace: $NAMESPACE
spec:
  type: ClusterIP
  ports:
  - port: 80
  selector:
    app: fr-backend
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: fr-backend
  namespace: $NAMESPACE
spec:
  replicas: 3
  selector:
    matchLabels:
      app: fr-backend
  strategy:
    type: Recreate
  template:
    metadata:
      namespace: $NAMESPACE
      labels:
        app: fr-backend
    spec:
      containers:
      - image: $IMAGE
        resources:
          limits:
            memory: 400Mi
          requests:
            memory: 400Mi
        imagePullPolicy: $PULL_POLICY
        name: fr-backend
        env:
        - name: Serilog__Using__0
          value: FastReport.Cloud.Base.Mvc
        ports:
        - containerPort: 80
          name: fr-backend
        volumeMounts:
        - name: config-volume
          mountPath: /app/appsettings.Production.json
          subPath: appsettings.Production.json
      imagePullSecrets:
        - name: $IMAGE_REGISTRY_SECRET_NAME
      volumes: 
      - name: config-volume
        configMap:
          name: fast-report-config
          items:
          - key: appsettings.Production.json
            path: appsettings.Production.json
EOF

Service Designer is an online report designer

#!/bin/sh

IMAGE="${IMAGE_STORAGE}/fastreport-corporate-server-designer:${IMAGE_TAG}"

cat <<EOF | kubectl apply -n $NAMESPACE -f -
apiVersion: v1
kind: Service
metadata:
  name: fr-designer
  namespace: $NAMESPACE
spec:
  type: ClusterIP
  ports:
  - port: 80
  selector:
    app: fr-designer
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: fr-designer
  namespace: $NAMESPACE
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fr-designer
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: fr-designer
      namespace: $NAMESPACE
    spec:
      containers:
      - image: $IMAGE
        imagePullPolicy: $PULL_POLICY
        name: fr-designer
        #env:
        #  # Use secret in real usage
        #- name: MYSQL_ROOT_PASSWORD
        #  value: password
        ports:
        - containerPort: 80
          name: fr-designer
        volumeMounts:
        - name: config-volume
          mountPath: /app/appsettings.Production.json
	  subPath: appsettings.Production.json
        - name: secret-volume
          mountPath: /etc/cert
      imagePullSecrets:
        - name: $IMAGE_REGISTRY_SECRET_NAME
      volumes: 
      - name: config-volume
        configMap:
          name: fast-report-config
          items:
          - key: appsettings.Production.json
            path: appsettings.Production.json
      - name: secret-volume
        secret:
          secretName: $SECRET_VOLUME_NAME
EOF

Font service

#!/bin/sh

IMAGE="${IMAGE_STORAGE}/fastreport-corporate-server-fonts:${IMAGE_TAG}"


cat <<EOF | kubectl apply -n $NAMESPACE -f -
apiVersion: v1
kind: Service
metadata:
  name: fr-fonts
  namespace: $NAMESPACE
spec:
  type: ClusterIP
  ports:
  - port: 80
  selector:
    app: fr-fonts
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: fr-fonts
  namespace: $NAMESPACE
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fr-fonts
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: fr-fonts
      namespace: $NAMESPACE
    spec:
      containers:
      - image: $IMAGE
        resources:
          limits:
            memory: 200Mi
          requests:
            memory: 200Mi
        imagePullPolicy: $PULL_POLICY
        name: fr-fonts
        env:
        - name: Serilog__Using__0
          value: FastReport.Cloud.MvcExtentions
        ports:
        - containerPort: 80
          name: fr-fonts
        volumeMounts:
        - name: config-volume
          mountPath: /app/appsettings.Production.json
          subPath: appsettings.Production.json
      imagePullSecrets:
        - name: $IMAGE_REGISTRY_SECRET_NAME
      volumes: 
      - name: config-volume
        configMap:
          name: fast-report-config
          items:
          - key: appsettings.Production.json
            path: appsettings.Production.json
EOF

Cloud application service

#!/bin/sh

IMAGE="${IMAGE_STORAGE}/fastreport-corporate-server-app:${IMAGE_TAG}"

cat <<EOF | kubectl apply -n $NAMESPACE -f -
apiVersion: v1
kind: Service
metadata:
  name: fr-app
  namespace: $NAMESPACE
spec:
  type: ClusterIP
  ports:
  - port: 80
  selector:
    app: fr-app
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: fr-app
  namespace: $NAMESPACE
spec:
  replicas: 1
  selector:
    matchLabels:
      app: fr-app
  strategy:
    type: Recreate
  template:
    metadata:
      namespace: $NAMESPACE
      labels:
        app: fr-app
    spec:
      containers:
      - image: $IMAGE
        imagePullPolicy: $PULL_POLICY
        name: fr-app
        #env:
        #  # Use secret in real usage
        #- name: MYSQL_ROOT_PASSWORD
        #  value: password
        ports:
        - containerPort: 80
          name: fr-app
      imagePullSecrets:
        - name: $IMAGE_REGISTRY_SECRET_NAME
EOF

Reporting service

#!/bin/sh

IMAGE="${IMAGE_STORAGE}/fastreport-corporate-server-workercore:${IMAGE_TAG}"

cat <<EOF | kubectl apply -n $NAMESPACE -f -
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: fr-workercore
  namespace: $NAMESPACE
spec:
  replicas: 4
  selector:
    matchLabels:
      app: fr-workercore
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: fr-workercore
      namespace: $NAMESPACE
    spec:
      containers:
      - image: $IMAGE
        imagePullPolicy: $PULL_POLICY
        name: fr-workercore
        volumeMounts:
        - name: config-volume
          mountPath: /app/appsettings.Production.json
          subPath: appsettings.Production.json
        - name: secret-volume
          mountPath: /etc/cert
      imagePullSecrets:
        - name: $IMAGE_REGISTRY_SECRET_NAME
      volumes: 
      - name: config-volume
        configMap:
          name: fast-report-config
          items:
          - key: appsettings.Production.json
            path: appsettings.Production.json
      - name: secret-volume
        secret:
          secretName: $SECRET_VOLUME_NAME
EOF

After performing all the above scripts, the installation of the report server is complete. To check the success of the installation and start working, log to the report server in a browser, using the domain name specified in the HOST variable when configuring nginx-ingress and in the window that appears enter the following data:

Username: admin@example.com
Password: admin

Have a great job!