Table of Contents

Установка МоиОтчеты Корпоративный Сервер

Продукты: МоиОтчеты Корпоративный Сервер

Минимальная конфигурация корпоративного сервера отчётов состоит из девяти компонентов, описанных ниже. Перед установкой необходимо определить переменные, например, в файле config.sh. Во избежание конфликтов имён лучше иметь глобальный файл конфигурации для всех скриптов отчёта. Ниже показан пример инициализации переменных, используемых скриптами установки сервера отчётов:

IMAGE_STORAGE=xn--80akiaokt3b4b.xn--90aia9aifhdb2cxbdg.xn--p1ai/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

Описание переменных:
IMAGE_STORAGE - адрес хранилища образов сервисов сервера отчётов, Корпоративный Сервер использует локальное хранилище, наполнение образами которого описано в разделе Подготовка образов.
IMAGE_TAG - версия сервера отчётов.
NAMESPACE - пространство имён Kubernetes, в котором будет выполняться сервер отчётов. SECRET_VOLUME_NAME - имя тома, на котором будет храниться конфигурация и информация для авторизации.
IMAGE_REGISTRY_SECRET_NAME - имя записи, сохраняющей информацию для авторизации на сервере, хранящем образы сервисов сервере отчётов. PULL_POLICY - определяет как Kubernetes будет скачивать образы сервисов. Возможные значения:

  • Always - всегда скачивать образы при старте сервиса;
  • IfNotPresent - скачивать образ только если он не присутствует локально;
  • Never - использовать заранее импортированные образы, никогда не скачивать их с внешнего сервера.

Обратите внимание: описанная конфигурация не скачивает образы из внешнего хранилища (PULL_POLICY=Never), эти переменные должны быть заданы во избежание ошибок при применении конфигурации. Перед установкой значения PULL_POLICY обратитесь к секции fr-images для ознакомления с настройками.

Настройка параметров сервера отчётов описана в документе Конфигурация сервера отчётов. В этом документе описаны базовые параметры, определяющие режимы работы сервера отчётов.

Gateway - сервис обработки входящих запросов

Gateway это сервис, обрабатывающий все соединения к серверу отчётов. Он анализирует запросы и распределяет их между другими сервисами. Если сервис Gateway не работает или работает неправильно, то ни один из компонентов сервера отчётов работать не будет. Ingress конфигурация по умолчанию отправляет все внешние запросы именно этому сервису. В случае каких-либо проблем с сервисом начните анализ проблемы с просмотров логов сервиса fr-gateway.

#!/bin/sh

HTTPS_NODE_PORT=32222
IMAGE="${IMAGE_STORAGE}/moiotchety-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

Установка планировщика сервера отчётов

IMAGE="${IMAGE_STORAGE}/moiotchety-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 - сервис просмотра отчётов

#!/bin/sh

IMAGE="${IMAGE_STORAGE}/moiotchety-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

#!/bin/sh

IMAGE="${IMAGE_STORAGE}/moiotchety-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

#!/bin/sh


IMAGE="${IMAGE_STORAGE}/moiotchety-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

Сервис Designer - онлайн дизайнер отчётов

#!/bin/sh

IMAGE="${IMAGE_STORAGE}/moiotchety-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

Сервис шрифтов

#!/bin/sh

IMAGE="${IMAGE_STORAGE}/moiotchety-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

Сервис облачного приложения

#!/bin/sh

IMAGE="${IMAGE_STORAGE}/moiotchety-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

Сервис построения отчётов

#!/bin/sh

IMAGE="${IMAGE_STORAGE}/moiotchety-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

После выполнения всех вышеописанных скриптов установка сервера отчётов закончена. Для того чтобы проверить успешность установки и начать работу, зайдите с помощью браузера на сервер отчётов, используя доменное имя, указанное в переменной HOST при настройке nginx-ingress и в появившемся окне введите следующие данные:

Имя пользователя: admin@example.com
Пароль: admin

Приятной работы!