Установка МоиОтчеты Корпоративный Сервер
Продукты: МоиОтчеты Корпоративный Сервер
Минимальная конфигурация корпоративного сервера отчётов состоит из девяти компонентов, описанных ниже.
Перед установкой необходимо определить переменные, например, в файле config.sh. Во избежание конфликтов имён лучше иметь глобальный
файл конфигурации для всех скриптов отчёта. Ниже показан пример инициализации переменных, используемых скриптами установки сервера отчётов:
IMAGE_STORAGE=xn--80akiaokt3b4b.xn--90aia9aifhdb2cxbdg.xn--p1ai/repository/docker-registry
IMAGE_TAG=debian-2025.1.10
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
Сервис Homer
#!/bin/sh
IMAGE="${IMAGE_STORAGE}/moiotchety-corporate-server-homer:${IMAGE_TAG}"
SECRET_VOLUME_NAME=corporate-volume-secret
cat <<EOF | kubectl apply -n $NAMESPACE -f -
apiVersion: v1
kind: Service
metadata:
name: fr-homer
namespace: $NAMESPACE
spec:
type: ClusterIP
ports:
- port: 80
selector:
app: fr-homer
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: fr-homer
namespace: $NAMESPACE
spec:
replicas: 1
selector:
matchLabels:
app: fr-homer
strategy:
type: Recreate
template:
metadata:
namespace: $NAMESPACE
labels:
app: fr-homer
spec:
containers:
- image: $IMAGE
imagePullPolicy: $PULL_POLICY
name: fr-homer
#env:
# # Use secret in real usage
#- name: MYSQL_ROOT_PASSWORD
# value: password
ports:
- containerPort: 80
name: fr-homer
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
Приятной работы!