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!