1
0
mirror of https://github.com/ONLYOFFICE/DocSpace.git synced 2025-04-18 20:24:12 +03:00

Merge branch 'develop' into feature/rtl-interface-direction

# Conflicts:
#	.gitignore
#	packages/common/store/SettingsStore.js
#	packages/components/file-input/styled-file-input.js
#	packages/components/modal-dialog/styled-modal-dialog.js
#	yarn.lock
This commit is contained in:
Aleksandr Lushkin 2023-07-25 14:01:29 +02:00
commit 28b8bc346e
923 changed files with 115481 additions and 7033 deletions

View File

@ -0,0 +1,137 @@
name: build docker runtime images
on:
push:
branches:
- 'hotfix/v**'
- 'release/v**'
- 'feature/docker-dev'
paths:
- '/build/install/docker/Dockerfile.runtime'
- '.github/workflows/build-runtime-images.yml'
- 'config/*'
- '/build/install/docker/config/nginx/**'
env:
REPOSITORY_NAME: "onlyoffice"
TAG: "v1.0.0"
DOTNET_RUNTIME_IMAGE: "4testing-docspace-dotnet-runtime"
NODEJS_RUNTIME_IMAGE: "4testing-docspace-nodejs-runtime"
PROXY_RUNTIME_IMAGE: "4testing-docspace-proxy-runtime"
DOCKERFILE_BUILD: "build/install/docker/Dockerfile.runtime"
jobs:
build:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
platform:
- linux/amd64
- linux/arm64
steps:
-
name: Checkout
uses: actions/checkout@v2
-
name: Set up QEMU
uses: docker/setup-qemu-action@v2
-
name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1
-
name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Build ${{ env.REPOSITORY_NAME }}/${{ env.DOTNET_RUNTIME_IMAGE }}
uses: docker/build-push-action@v4
id: build-dotnetrun
with:
context: .
file: ${{ env.DOCKERFILE_BUILD }}
platforms: ${{ matrix.platform}}
target: dotnetrun
outputs: type=image,name=${{ env.REPOSITORY_NAME }}/${{ env.DOTNET_RUNTIME_IMAGE }},push-by-digest=true,name-canonical=true,push=true
-
name: Build ${{ env.REPOSITORY_NAME }}/${{ env.NODEJS_RUNTIME_IMAGE }}
uses: docker/build-push-action@v4
id: build-noderun
with:
context: .
file: ${{ env.DOCKERFILE_BUILD }}
platforms: ${{ matrix.platform}}
target: noderun
outputs: type=image,name=${{ env.REPOSITORY_NAME }}/${{ env.NODEJS_RUNTIME_IMAGE }},push-by-digest=true,name-canonical=true,push=true
-
name: Build ${{ env.REPOSITORY_NAME }}/${{ env.PROXY_RUNTIME_IMAGE }}
uses: docker/build-push-action@v4
id: build-proxy
with:
context: .
file: ${{ env.DOCKERFILE_BUILD }}
platforms: ${{ matrix.platform}}
target: proxy
outputs: type=image,name=${{ env.REPOSITORY_NAME }}/${{ env.PROXY_RUNTIME_IMAGE }},push-by-digest=true,name-canonical=true,push=true
-
name: Export digest
run: |
mkdir -p /tmp/digests/${{ env.DOTNET_RUNTIME_IMAGE }}
digest="${{ steps.build-dotnetrun.outputs.digest }}"
touch "/tmp/digests/${{ env.DOTNET_RUNTIME_IMAGE }}/${digest#sha256:}"
mkdir -p /tmp/digests/${{ env.NODEJS_RUNTIME_IMAGE }}
digest="${{ steps.build-noderun.outputs.digest }}"
touch "/tmp/digests/${{ env.NODEJS_RUNTIME_IMAGE }}/${digest#sha256:}"
mkdir -p /tmp/digests/${{ env.PROXY_RUNTIME_IMAGE }}
digest="${{ steps.build-proxy.outputs.digest }}"
touch "/tmp/digests/${{ env.PROXY_RUNTIME_IMAGE }}/${digest#sha256:}"
-
name: Upload digest
uses: actions/upload-artifact@v3
with:
name: digests
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1
merge:
runs-on: ubuntu-latest
needs:
- build
steps:
-
name: Download digests
uses: actions/download-artifact@v3
with:
name: digests
path: /tmp/digests
-
name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
-
name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
-
name: Create ${{ env.DOTNET_RUNTIME_IMAGE }} list and push
working-directory: /tmp/digests/${{ env.DOTNET_RUNTIME_IMAGE }}
run: |
docker buildx imagetools create -t ${{ env.REPOSITORY_NAME }}/${{ env.DOTNET_RUNTIME_IMAGE }}:${{ env.TAG }} \
$(printf '${{ env.REPOSITORY_NAME }}/${{ env.DOTNET_RUNTIME_IMAGE }}@sha256:%s ' *)
-
name: Create ${{ env.NODEJS_RUNTIME_IMAGE }} list and push
working-directory: /tmp/digests/${{ env.NODEJS_RUNTIME_IMAGE }}
run: |
docker buildx imagetools create -t ${{ env.REPOSITORY_NAME }}/${{ env.NODEJS_RUNTIME_IMAGE }}:${{ env.TAG }} \
$(printf '${{ env.REPOSITORY_NAME }}/${{ env.NODEJS_RUNTIME_IMAGE }}@sha256:%s ' *)
-
name: Create ${{ env.PROXY_RUNTIME_IMAGE }} list and push
working-directory: /tmp/digests/${{ env.PROXY_RUNTIME_IMAGE }}
run: |
docker buildx imagetools create -t ${{ env.REPOSITORY_NAME }}/${{ env.PROXY_RUNTIME_IMAGE }}:${{ env.TAG }} \
$(printf '${{ env.REPOSITORY_NAME }}/${{ env.PROXY_RUNTIME_IMAGE }}@sha256:%s ' *)

162
.github/workflows/build_packages.yml vendored Normal file
View File

@ -0,0 +1,162 @@
name: Build packages
on:
push:
branches:
- release/*
- develop
- hotfix/*
paths:
- build/install/deb**
- build/install/rpm**
- build/install/common**
workflow_dispatch:
env:
BRANCH_NAME: $(echo ${GITHUB_REF#refs/heads/})
PRODUCT_LOW: $(echo "${{ github.event.repository.name }}" | tr '[:upper:]' '[:lower:]' )
PRODUCT: "${{ github.event.repository.name }}"
BUILD_NUMBER: "${{ github.run_number }}"
jobs:
build_deb:
name: DEB packages
runs-on: ubuntu-20.04
permissions:
contents: write
steps:
- name: Import GPG
uses: crazy-max/ghaction-import-gpg@v5
id: gpg_step
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PRIVATE_KEY_PASS }}
- name: Get files from repository
uses: actions/checkout@v3
with:
submodules: 'recursive'
- name: Prepare build
id: get_vars
run: |
wget -O - https://dl.yarnpkg.com/debian/pubkey.gpg | \
sudo gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/yarnkey.gpg --import
sudo chmod 644 /usr/share/keyrings/yarnkey.gpg
echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian/ stable main" | \
sudo tee /etc/apt/sources.list.d/yarn.list
wget https://packages.microsoft.com/config/$(lsb_release -is | \
tr [:upper:] [:lower:])/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
wget -O - https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y dotnet-sdk-7.0 yarn nodejs dh-make rename dpkg-sig lintian
sudo npm install -g json
echo "BRANCH_NAME=$(echo ${GITHUB_REF#refs/heads/})" >> $GITHUB_OUTPUT
echo "VERSION=$(echo "${{ github.ref }}" | grep -oP '\d+\.\d+\.\d+' || echo "1.1.0")" >> $GITHUB_OUTPUT
- name: Build
shell: bash
run: |
cd build/install/deb/
rename -f -v "s/product([^\/]*)$/${{ env.PRODUCT_LOW }}\$1/g" debian/* ../common/* ../common/logrotate/*
find ../ -type f -exec sed -i "s/{{product}}/${{ env.PRODUCT_LOW }}/g" {} ';'
sed -i "s/{{package_header_tag_version}}/${{ steps.get_vars.outputs.VERSION }}.$BUILD_NUMBER/g" \
debian/changelog debian/control
dpkg-buildpackage -uc -k${{ steps.gpg_step.outputs.fingerprint }}
- name: Upload to Nexus
run: |
for file in /home/runner/work/${{ env.PRODUCT }}/${{ env.PRODUCT }}/build/install/*.deb; do
echo $file
curl --verbose --user ${{ secrets.REPO_LOGIN }}:${{ secrets.REPO_PASS }} -H "Content-Type: multipart/form-data" \
--data-binary "@$file" ${{ secrets.REPO_URL_4TESTING_DEB }}
done
- name: Lint
run: |
lintian --suppress-tags=mismatched-override --profile debian /home/runner/work/${{ env.PRODUCT }}/${{ env.PRODUCT }}/build/install/*.deb \
| tee -a file
if grep -qE '^(W:|E:)' file; then echo \
"::warning Noticedeb=lintian::$(cat file | awk '/^W:/ { ws += 1 } /^E:/ { es += 1 } END { print "Warnings:", ws, "Errors:", es }')"; fi
build_rpm:
name: RPM packages
runs-on: ubuntu-20.04
permissions:
contents: write
steps:
- name: Import GPG
uses: crazy-max/ghaction-import-gpg@v5
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PRIVATE_KEY_PASS }}
- name: Get files from repository
uses: actions/checkout@v3
with:
submodules: 'recursive'
- name: Prepare build
id: get_vars
run: |
wget -O - https://dl.yarnpkg.com/debian/pubkey.gpg | sudo gpg --no-default-keyring --keyring \
gnupg-ring:/usr/share/keyrings/yarnkey.gpg --import
sudo chmod 644 /usr/share/keyrings/yarnkey.gpg
echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian/ stable main" | \
sudo tee /etc/apt/sources.list.d/yarn.list
wget https://packages.microsoft.com/config/$(lsb_release -is | \
tr [:upper:] [:lower:])/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
wget -O - https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt install -y dotnet-sdk-7.0 yarn nodejs dh-make rename python3-pip python3-rpm
sudo npm install -g json
sudo pip install rpmlint
echo "BRANCH_NAME=$(echo ${GITHUB_REF#refs/heads/})" >> $GITHUB_OUTPUT
echo "VERSION=$(echo "${ GITHUB_REF##*/ }" | grep -oP '\d+\.\d+\.\d+' || echo "1.1.0")" >> $GITHUB_OUTPUT
- name: Build
run: |
cd build/install/rpm/SPECS
mv ./SOURCES/product.rpmlintrc ./SOURCES/${{ env.PRODUCT_LOW }}.rpmlintrc
wget https://github.com/ONLYOFFICE/${{ env.PRODUCT }}/archive/${{ env.BRANCH_NAME }}.tar.gz \
-O ./SOURCES/${{ env.PRODUCT }}-$(echo ${{ env.BRANCH_NAME }} | tr '/' '-').tar.gz
wget https://github.com/ONLYOFFICE/document-templates/archive/main/community-server.tar.gz \
-O ./SOURCES/document-templates-main-community-server.tar.gz
wget https://github.com/ONLYOFFICE/dictionaries/archive/master.tar.gz \
-O ./SOURCES/dictionaries-master.tar.gz
sed -i -e '/BuildRequires/d' product.spec
rpmbuild -D "packager Ascensio System SIA <support@onlyoffice.com>" -D "GIT_BRANCH $(echo ${{ env.BRANCH_NAME }} \
| tr '/' '-')" -D "_topdir $(pwd)" -D "version ${{ steps.get_vars.outputs.VERSION }}" \
-D "release ${{ env.BUILD_NUMBER }}" -ba product.spec
- name: Sign
run: |
cat << EOF >> $HOME/.rpmmacros
%_signature gpg
%_gpg_name ${{ secrets.GPG_KEY_NAME }}
%_gpg_path $HOME/.gnupg
%__gpg /usr/bin/gpg
EOF
gpg --export --armor --output onlyoffice-gpgkey.pub
rpm --import onlyoffice-gpgkey.pub
rpm --addsign /home/runner/work/${{ env.PRODUCT }}/${{ env.PRODUCT }}/build/install/rpm/SPECS/RPMS/noarch/*.rpm
- name: Upload
run: |
for file in /home/runner/work/${{ env.PRODUCT }}/${{ env.PRODUCT }}/build/install/rpm/SPECS/RPMS/noarch/*.rpm; do
curl --verbose --user ${{ secrets.REPO_LOGIN }}:${{ secrets.REPO_PASS }} \
--upload-file "$file" ${{ secrets.REPO_URL_4TESTING_RPM }}
done
- name: Rpmlint
run: |
for package in /home/runner/work/${{ env.PRODUCT }}/${{ env.PRODUCT }}/build/install/rpm/SPECS/RPMS/noarch/*.rpm
do rpmlint --ignore-unused-rpmlintrc --rpmlintrc \
/home/runner/work/${{ env.PRODUCT }}/${{ env.PRODUCT }}/build/install/rpm/SPECS/SOURCES/${{ env.PRODUCT_LOW }}.rpmlintrc $package \
| tee -a file2
done
if grep -qE '^(W:|E:)' file2; then echo \
"::warning NoticeRpm=rpmLint::$(cat file2 | awk '/W:/ { ws += 1 } /E:/ { es += 1 } END { print "Warnings:", ws, "Errors:", es }')" ; fi

1
.gitignore vendored
View File

@ -51,5 +51,6 @@ TestsResults/
**/.yarn/cache
**/.yarn/install-state.gz
licenses.csv
publish/
.idea

View File

@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.2.32616.157
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Migrations.MySql", "migrations\mysql\ASC.Migrations.MySql.csproj", "{78FD997A-8A30-4B8B-B81E-46E6EE05390D}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Data.Backup.Core", "common\ASC.Data.Backup.Core\ASC.Data.Backup.Core.csproj", "{93D91A49-A397-40FC-90DE-85D8ED774803}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Data.Storage", "common\ASC.Data.Storage\ASC.Data.Storage.csproj", "{582AF3E8-ACA4-49B8-809D-36A586C4307E}"
@ -17,8 +15,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Webhooks.Core", "common
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Feed", "common\ASC.Feed\ASC.Feed.csproj", "{71A964E2-0075-46A3-AE58-9F2A78F6A5BB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Migrations.PostgreSql", "migrations\postgre\ASC.Migrations.PostgreSql.csproj", "{B06C5E36-BB67-4B4B-9E23-0326245BFCBB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Core.Common", "common\ASC.Core.Common\ASC.Core.Common.csproj", "{A51D0454-4AFA-46DE-89D4-B03D37E1816C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Migration.Creator", "common\Tools\ASC.Migration.Creator\ASC.Migration.Creator.csproj", "{4BECDA03-E5E7-4273-B2D5-65AD3B1D0AF6}"
@ -33,16 +29,20 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Migration.PersonalToDoc
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Common", "common\ASC.Common\ASC.Common.csproj", "{1C5691B2-4AB1-4D3C-931C-AF7AD9CE8241}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Migrations.MySql.SaaS", "migrations\mysql\SaaS\ASC.Migrations.MySql.SaaS.csproj", "{57A7DD9D-373D-4270-9FF0-986F62B594EF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Migrations.MySql.Standalone", "migrations\mysql\Standalone\ASC.Migrations.MySql.Standalone.csproj", "{2608185A-415E-4D21-B5F8-A7F9C95DA918}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Migrations.PostgreSql.SaaS", "migrations\postgre\SaaS\ASC.Migrations.PostgreSql.SaaS.csproj", "{50A3CFE6-F7A3-49FB-B801-70E793BC8B5A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Migrations.PostgreSql.Standalone", "migrations\postgre\Standalone\ASC.Migrations.PostgreSql.Standalone.csproj", "{46AF60C1-EEA6-4C0F-8C02-1B74A8C9720F}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{78FD997A-8A30-4B8B-B81E-46E6EE05390D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{78FD997A-8A30-4B8B-B81E-46E6EE05390D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{78FD997A-8A30-4B8B-B81E-46E6EE05390D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{78FD997A-8A30-4B8B-B81E-46E6EE05390D}.Release|Any CPU.Build.0 = Release|Any CPU
{93D91A49-A397-40FC-90DE-85D8ED774803}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{93D91A49-A397-40FC-90DE-85D8ED774803}.Debug|Any CPU.Build.0 = Debug|Any CPU
{93D91A49-A397-40FC-90DE-85D8ED774803}.Release|Any CPU.ActiveCfg = Release|Any CPU
@ -67,10 +67,6 @@ Global
{71A964E2-0075-46A3-AE58-9F2A78F6A5BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{71A964E2-0075-46A3-AE58-9F2A78F6A5BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{71A964E2-0075-46A3-AE58-9F2A78F6A5BB}.Release|Any CPU.Build.0 = Release|Any CPU
{B06C5E36-BB67-4B4B-9E23-0326245BFCBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B06C5E36-BB67-4B4B-9E23-0326245BFCBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B06C5E36-BB67-4B4B-9E23-0326245BFCBB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B06C5E36-BB67-4B4B-9E23-0326245BFCBB}.Release|Any CPU.Build.0 = Release|Any CPU
{A51D0454-4AFA-46DE-89D4-B03D37E1816C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A51D0454-4AFA-46DE-89D4-B03D37E1816C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A51D0454-4AFA-46DE-89D4-B03D37E1816C}.Release|Any CPU.ActiveCfg = Release|Any CPU
@ -99,6 +95,22 @@ Global
{1C5691B2-4AB1-4D3C-931C-AF7AD9CE8241}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1C5691B2-4AB1-4D3C-931C-AF7AD9CE8241}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1C5691B2-4AB1-4D3C-931C-AF7AD9CE8241}.Release|Any CPU.Build.0 = Release|Any CPU
{57A7DD9D-373D-4270-9FF0-986F62B594EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{57A7DD9D-373D-4270-9FF0-986F62B594EF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{57A7DD9D-373D-4270-9FF0-986F62B594EF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{57A7DD9D-373D-4270-9FF0-986F62B594EF}.Release|Any CPU.Build.0 = Release|Any CPU
{2608185A-415E-4D21-B5F8-A7F9C95DA918}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2608185A-415E-4D21-B5F8-A7F9C95DA918}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2608185A-415E-4D21-B5F8-A7F9C95DA918}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2608185A-415E-4D21-B5F8-A7F9C95DA918}.Release|Any CPU.Build.0 = Release|Any CPU
{50A3CFE6-F7A3-49FB-B801-70E793BC8B5A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{50A3CFE6-F7A3-49FB-B801-70E793BC8B5A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{50A3CFE6-F7A3-49FB-B801-70E793BC8B5A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{50A3CFE6-F7A3-49FB-B801-70E793BC8B5A}.Release|Any CPU.Build.0 = Release|Any CPU
{46AF60C1-EEA6-4C0F-8C02-1B74A8C9720F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{46AF60C1-EEA6-4C0F-8C02-1B74A8C9720F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{46AF60C1-EEA6-4C0F-8C02-1B74A8C9720F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{46AF60C1-EEA6-4C0F-8C02-1B74A8C9720F}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -6,76 +6,58 @@ if ($PSversionMajor -lt 7 -or $PSversionMinor -lt 2) {
exit
}
$Branch = git branch --show-current
$BranchExistRemote = git ls-remote --heads origin $Branch
if (-not $BranchExistRemote) {
Write-Error "The current branch does not exist in the remote repository. Please push changes."
exit
}
$RootDir = Split-Path -Parent $PSScriptRoot
$DockerDir = ($RootDir + "\build\install\docker")
$BuildDate = Get-Date -Format "yyyy-MM-dd"
$DockerDir = "$RootDir\build\install\docker"
$LocalIp = (Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration | Where-Object { $_.DHCPEnabled -ne $null -and $_.DefaultIPGateway -ne $null }).IPAddress | Select-Object -First 1
$Doceditor = ($LocalIp + ":5013")
$Login = ($LocalIp + ":5011")
$Client = ($LocalIp + ":5001")
$PortalUrl = ("http://" + $LocalIp + ":8092")
$DockerFile = "Dockerfile.dev"
$EnvExtension = "dev"
$CoreBaseDomain = "localhost"
# Stop all backend services"
& "$PSScriptRoot\start\stop.backend.docker.ps1"
$Env:COMPOSE_IGNORE_ORPHANS = "True"
$Containers = docker ps -a -f "name=^onlyoffice" --format="{{.ID}} {{.Names}}" | Select-String -Pattern ("mysql|rabbitmq|redis|elasticsearch|documentserver") -NotMatch | ConvertFrom-String | ForEach-Object P1
$Images = docker images onlyoffice/docspace* -q
if ($Containers) {
Write-Host "Remove all backend containers" -ForegroundColor Blue
docker rm -f $Containers
}
if ($Images) {
Write-Host "Remove all docker images except 'mysql, rabbitmq, redis, elasticsearch, documentserver'" -ForegroundColor Blue
docker rmi -f $Images
}
Write-Host "Run MySQL" -ForegroundColor Green
docker compose -f ($DockerDir + "\db.yml") up -d
docker compose -f "$DockerDir\db.yml" up -d
Write-Host "Run environments (redis, rabbitmq)" -ForegroundColor Green
$Env:DOCKERFILE = $DockerFile
docker compose -f ($DockerDir + "\redis.yml") -f ($DockerDir + "\rabbitmq.yml") up -d
Write-Host "Build backend services (to `publish/` folder)" -ForegroundColor Green
& "$PSScriptRoot\install\common\build-services.ps1"
if ($args[0] -eq "--no_ds") {
Write-Host "SKIP Document server" -ForegroundColor Blue
}
else {
Write-Host "Run Document server" -ForegroundColor Green
$Env:DOCUMENT_SERVER_IMAGE_NAME = "onlyoffice/documentserver-de:latest"
$Env:ROOT_DIR = $RootDir
docker compose -f ($DockerDir + "\ds.dev.yml") up -d
$Env:DOCUMENT_SERVER_IMAGE_NAME = "onlyoffice/documentserver-de:latest"
$Env:INSTALLATION_TYPE = "ENTERPRISE"
if ($args[0] -eq "--community" ) {
$Env:DOCUMENT_SERVER_IMAGE_NAME = "onlyoffice/documentserver:latest"
$Env:INSTALLATION_TYPE = "COMMUNITY"
}
Write-Host "Build all backend services" -ForegroundColor Blue
$Env:DOCKERFILE = $DockerFile
$Env:RELEASE_DATE = $BuildDate
$Env:GIT_BRANCH = $Branch
$Env:SERVICE_DOCEDITOR = $Doceditor
$Env:SERVICE_LOGIN = $Login
$Env:SERVICE_CLIENT = $Client
$Env:APP_CORE_BASE_DOMAIN = $CoreBaseDomain
$Env:ENV_EXTENSION = $EnvExtension
docker compose -f ($DockerDir + "\build.dev.yml") build --build-arg GIT_BRANCH=$Branch --build-arg RELEASE_DATE=$BuildDate
Set-Location -Path $DockerDir
Write-Host "Run DB migration" -ForegroundColor Green
$Env:DOCKERFILE = $DockerFile
docker compose -f ($DockerDir + "\migration-runner.yml") up -d
Write-Host "Run migration and services" -ForegroundColor Green
$Env:ENV_EXTENSION="dev"
$Env:Baseimage_Dotnet_Run="onlyoffice/4testing-docspace-dotnet-runtime:v1.0.0"
$Env:Baseimage_Nodejs_Run="onlyoffice/4testing-docspace-nodejs-runtime:v1.0.0"
$Env:Baseimage_Proxy_Run="onlyoffice/4testing-docspace-proxy-runtime:v1.0.0"
$Env:SERVICE_DOCEDITOR=$Doceditor
$Env:SERVICE_LOGIN=$Login
$Env:SERVICE_CLIENT=$Client
$Env:ROOT_DIR=$RootDir
$Env:BUILD_PATH="/var/www"
$Env:SRC_PATH="$RootDir\publish\services"
$Env:DATA_DIR="$RootDir\Data"
$Env:APP_URL_PORTAL=$PortalUrl
docker compose -f docspace.profiles.yml -f docspace.overcome.yml --profile migration-runner --profile backend-local up -d
# Start all backend services"
& "$PSScriptRoot\start\start.backend.docker.ps1"
Write-Host "== Build params ==" -ForegroundColor Green
Write-Host "APP_URL_PORTAL: $PortalUrl" -ForegroundColor Blue
Write-Host "LOCAL IP: $LocalIp" -ForegroundColor Blue
Write-Host "SERVICE_DOCEDITOR: $Env:SERVICE_DOCEDITOR" -ForegroundColor Blue
Write-Host "SERVICE_LOGIN: $Env:SERVICE_LOGIN" -ForegroundColor Blue
Write-Host "SERVICE_CLIENT: $Env:SERVICE_CLIENT" -ForegroundColor Blue
Write-Host "INSTALLATION_TYPE: $Env:INSTALLATION_TYPE" -ForegroundColor Blue
Set-Location -Path $PSScriptRoot

View File

@ -4,34 +4,10 @@ rd="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
echo "Run script directory:" $dir
dir=$(builtin cd $rd/../; pwd)
dockerDir="$dir/build/install/docker"
echo "Root directory:" $dir
cd $dir
branch=$(git branch --show-current)
echo "GIT_BRANCH:" $branch
branch_exist_remote=$(git ls-remote --heads origin $branch)
if [ -z "$branch_exist_remote" ]; then
echo "The current branch does not exist in the remote repository. Please push changes."
exit 1
fi
cd $dir/build/install/docker/
docker_dir="$( pwd )"
echo "Docker directory:" $docker_dir
docker_file=Dockerfile.dev
core_base_domain="localhost"
build_date=$(date +%Y-%m-%d)
env_extension="dev"
echo "BUILD DATE: $build_date"
echo "Docker files root directory:" $dockerDir
local_ip=$(ipconfig getifaddr en0)
@ -40,63 +16,67 @@ echo "LOCAL IP: $local_ip"
doceditor=${local_ip}:5013
login=${local_ip}:5011
client=${local_ip}:5001
portal_url="http://$local_ip:8092"
echo "SERVICE_DOCEDITOR: $doceditor"
echo "SERVICE_LOGIN: $login"
echo "SERVICE_CLIENT: $client"
echo "APP_URL_PORTAL: $portal_url"
# Stop all backend services"
$dir/build/start/stop.backend.docker.sh
echo "Remove all backend containers"
docker rm -f $(docker ps -a | egrep "onlyoffice" | egrep -v "mysql|rabbitmq|redis|elasticsearch|documentserver" | awk 'NR>0 {print $1}')
echo "Remove all docker images except 'mysql, rabbitmq, redis, elasticsearch, documentserver'"
docker rmi -f $(docker images -a | egrep "onlyoffice" | egrep -v "mysql|rabbitmq|redis|elasticsearch|documentserver" | awk 'NR>0 {print $3}')
echo "Run MySQL"
arch_name="$(uname -m)"
if [ "${arch_name}" = "x86_64" ]; then
echo "CPU Type: x86_64 -> run db.yml"
docker compose -f db.yml up -d
docker compose -f $dockerDir/db.yml up -d
elif [ "${arch_name}" = "arm64" ]; then
echo "CPU Type: arm64 -> run db.yml with arm64v8 image"
MYSQL_IMAGE=arm64v8/mysql:8.0.32-oracle \
docker compose -f db.yml up -d
docker compose -f $dockerDir/db.yml up -d
else
echo "Error: Unknown CPU Type: ${arch_name}."
exit 1
fi
echo "Run environments (redis, rabbitmq)"
DOCKERFILE=$docker_file \
docker compose -f redis.yml -f rabbitmq.yml up -d
echo "Clear publish folder"
rm -rf $dir/publish
if [ "$1" = "--no_ds" ]; then
echo "SKIP Document server"
else
echo "Run Document server"
DOCUMENT_SERVER_IMAGE_NAME=onlyoffice/documentserver-de:latest \
ROOT_DIR=$dir \
docker compose -f ds.dev.yml up -d
echo "Build backend services (to "publish/" folder)"
bash $dir/build/install/common/build-services.sh -pb backend-publish -pc Debug -de "$dockerDir/docker-entrypoint.py"
DOCUMENT_SERVER_IMAGE_NAME=onlyoffice/documentserver-de:latest
INSTALLATION_TYPE=ENTERPRISE
if [ "$1" = "--community" ]; then
DOCUMENT_SERVER_IMAGE_NAME=onlyoffice/documentserver:latest
INSTALLATION_TYPE=COMMUNITY
fi
echo "Build all backend services"
DOCKERFILE=$docker_file \
RELEASE_DATE=$build_date \
GIT_BRANCH=$branch \
echo "Run migration and services INSTALLATION_TYPE=$INSTALLATION_TYPE"
ENV_EXTENSION="dev" \
INSTALLATION_TYPE=$INSTALLATION_TYPE \
Baseimage_Dotnet_Run="onlyoffice/4testing-docspace-dotnet-runtime:v1.0.0" \
Baseimage_Nodejs_Run="onlyoffice/4testing-docspace-nodejs-runtime:v1.0.0" \
Baseimage_Proxy_Run="onlyoffice/4testing-docspace-proxy-runtime:v1.0.0" \
DOCUMENT_SERVER_IMAGE_NAME=$DOCUMENT_SERVER_IMAGE_NAME \
SERVICE_DOCEDITOR=$doceditor \
SERVICE_LOGIN=$login \
SERVICE_CLIENT=$client \
APP_CORE_BASE_DOMAIN=$core_base_domain \
ENV_EXTENSION=$env_extension \
docker compose -f build.dev.yml build --build-arg GIT_BRANCH=$branch --build-arg RELEASE_DATE=$build_date
ROOT_DIR=$dir \
BUILD_PATH="/var/www" \
SRC_PATH="$dir/publish/services" \
DATA_DIR="$dir/Data" \
APP_URL_PORTAL=$portal_url \
docker-compose -f $dockerDir/docspace.profiles.yml -f $dockerDir/docspace.overcome.yml --profile migration-runner --profile backend-local up -d
echo "Run DB migration"
DOCKERFILE=$docker_file \
docker compose -f migration-runner.yml up -d
# Start all backend services"
$dir/build/start/start.backend.docker.sh
echo ""
echo "APP_URL_PORTAL: $portal_url"
echo "LOCAL IP: $local_ip"
echo "SERVICE_DOCEDITOR: $doceditor"
echo "SERVICE_LOGIN: $login"
echo "SERVICE_CLIENT: $client"
echo "INSTALLATION_TYPE=$INSTALLATION_TYPE"

View File

@ -1,21 +1,33 @@
$Containers = docker ps -aqf "name=^onlyoffice"
$Images = docker images onlyoffice/docspace* -q
$RootDir = Split-Path -Parent $PSScriptRoot
$DockerDir = ($RootDir + "\build\install\docker")
Write-Host "Clean up containers, volumes or networks" -ForegroundColor Green
if ($Containers) {
Write-Host "Stop all backend containers" -ForegroundColor Blue
docker stop $Containers
Write-Host "Remove all backend containers" -ForegroundColor Blue
docker rm -f $Containers
$Env:DOCUMENT_SERVER_IMAGE_NAME="onlyoffice/documentserver-de:latest"
$Env:Baseimage_Dotnet_Run="onlyoffice/4testing-docspace-dotnet-runtime:v1.0.0"
$Env:Baseimage_Nodejs_Run="onlyoffice/4testing-docspace-nodejs-runtime:v1.0.0"
$Env:Baseimage_Proxy_Run="onlyoffice/4testing-docspace-proxy-runtime:v1.0.0"
$Env:SERVICE_CLIENT="localhost:5001"
$Env:BUILD_PATH="/var/www"
$Env:SRC_PATH="$RootDir\publish\services"
$Env:ROOT_DIR=$RootDir
$Env:DATA_DIR="$RootDir\Data"
docker compose -f "$DockerDir\docspace.profiles.yml" -f "$DockerDir\docspace.overcome.yml" --profile "migration-runner" --profile "backend-local" down --volumes
Write-Host "Remove docker contatiners 'mysql'" -ForegroundColor Blue
docker compose -f "$DockerDir\db.yml" down --volumes
Write-Host "Remove docker volumes" -ForegroundColor Blue
docker volume prune -f -a
Write-Host "Remove docker networks" -ForegroundColor Blue
docker network prune -f
}
if ($Images) {
Write-Host "Remove all docker images except 'mysql, rabbitmq, redis, elasticsearch, documentserver'" -ForegroundColor Blue
docker rmi -f $Images
}
Write-Host "Remove unused volumes." -ForegroundColor Blue
docker volume prune -f
Write-Host "Remove unused networks." -ForegroundColor Blue
docker network prune -f
else {
Write-Host "No containers, images, volumes or networks to clean up" -ForegroundColor Green
}

View File

@ -1,12 +1,35 @@
#!/bin/bash
echo "Stop all onlyoffice containers."
docker stop $(docker ps -a | egrep "onlyoffice" | awk 'NR>0 {print $1}')
echo "Remove all onlyoffice containers."
docker rm -f $(docker ps -a | egrep "onlyoffice" | awk 'NR>0 {print $1}')
echo "Remove all onlyoffice images."
docker rmi -f $(docker images -a | egrep "onlyoffice" | awk 'NR>0 {print $3}')
echo "Remove unused volumes."
docker volume prune -f
echo "Remove unused networks."
docker network prune -f
Containers=$(docker ps -a | egrep "onlyoffice" | awk 'NR>0 {print $1}')
RunDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
RootDir=$(builtin cd $RunDir/../; pwd)
DockerDir="${RootDir}/build/install/docker"
echo "Clean up containers, volumes or networks"
if [[ $Containers != "" ]]
then
echo "Remove all backend containers"
DOCUMENT_SERVER_IMAGE_NAME=onlyoffice/documentserver-de:latest \
Baseimage_Dotnet_Run="onlyoffice/4testing-docspace-dotnet-runtime:v1.0.0" \
Baseimage_Nodejs_Run="onlyoffice/4testing-docspace-nodejs-runtime:v1.0.0" \
Baseimage_Proxy_Run="onlyoffice/4testing-docspace-proxy-runtime:v1.0.0" \
SERVICE_CLIENT="localhost:5001" \
BUILD_PATH="/var/www" \
SRC_PATH="${RootDir}/publish/services" \
ROOT_DIR=$RootDir \
DATA_DIR="${RootDir}/Data" \
docker-compose -f "${DockerDir}/docspace.profiles.yml" -f "${DockerDir}/docspace.overcome.yml" --profile migration-runner --profile backend-local down --volumes
echo "Remove docker contatiners 'mysql'"
docker compose -f "${DockerDir}/db.yml" down --volumes
echo "Remove docker volumes"
docker volume prune -f -a
echo "Remove unused networks."
docker network prune -f
else
echo "No containers, images, volumes or networks to clean up"
fi

View File

@ -28,6 +28,8 @@ if [ "$UPDATE" = "true" ] && [ "$DOCUMENT_SERVER_INSTALLED" = "true" ]; then
apt-get remove -yq ${ds_pkg_installed_name}
apt-get install -yq ${ds_pkg_name}
RECONFIGURE_PRODUCT="true"
else
apt-get install -y --only-upgrade ${ds_pkg_name};
fi
@ -74,7 +76,13 @@ if [ "$PRODUCT_INSTALLED" = "false" ]; then
apt-get install -y ${product} || true #Fix error 'Failed to fetch'
apt-get install -y ${product}
elif [ "$UPDATE" = "true" ] && [ "$PRODUCT_INSTALLED" = "true" ]; then
apt-get install -o DPkg::options::="--force-confnew" -y --only-upgrade ${product} elasticsearch=${ELASTIC_VERSION}
CURRENT_VERSION=$(dpkg-query -W -f='${Version}' ${product} 2>/dev/null)
AVAILABLE_VERSIONS=$(apt show ${product} 2>/dev/null | grep -E '^Version:' | awk '{print $2}')
if [[ "$AVAILABLE_VERSIONS" != *"$CURRENT_VERSION"* ]]; then
apt-get install -o DPkg::options::="--force-confnew" -y --only-upgrade ${product} elasticsearch=${ELASTIC_VERSION}
elif [ $RECONFIGURE_PRODUCT = "true" ]; then
DEBIAN_FRONTEND=noninteractive dpkg-reconfigure ${product}
fi
fi
echo ""

View File

@ -49,9 +49,13 @@ curl -sL https://deb.nodesource.com/setup_16.x | bash -
#add dotnet repo
if [ "$DIST" = "debian" ] && [ "$DISTRIB_CODENAME" = "stretch" ]; then
curl https://packages.microsoft.com/config/$DIST/10/packages-microsoft-prod.deb -O
elif [ "$DISTRIB_CODENAME" = "bookworm" ]; then
#Temporary fix for missing dotnet repository for debian bookworm
curl https://packages.microsoft.com/config/$DIST/11/packages-microsoft-prod.deb -O
else
curl https://packages.microsoft.com/config/$DIST/$REV/packages-microsoft-prod.deb -O
fi
echo -e "Package: *\nPin: origin \"packages.microsoft.com\"\nPin-Priority: 1002" | tee /etc/apt/preferences.d/99microsoft-prod.pref
dpkg -i packages-microsoft-prod.deb && rm packages-microsoft-prod.deb
MYSQL_REPO_VERSION="$(curl https://repo.mysql.com | grep -oP 'mysql-apt-config_\K.*' | grep -o '^[^_]*' | sort --version-sort --field-separator=. | tail -n1)"
@ -71,6 +75,9 @@ if ! dpkg -l | grep -q "mysql-server"; then
DEBIAN_FRONTEND=noninteractive dpkg -i ${MYSQL_PACKAGE_NAME}
rm -f ${MYSQL_PACKAGE_NAME}
#Temporary fix for missing mysql repository for debian bookworm
[ "$DISTRIB_CODENAME" = "bookworm" ] && sed -i "s/$DIST/ubuntu/g; s/$DISTRIB_CODENAME/jammy/g" /etc/apt/sources.list.d/mysql.list
echo mysql-community-server mysql-community-server/root-pass password ${MYSQL_SERVER_PASS} | debconf-set-selections
echo mysql-community-server mysql-community-server/re-root-pass password ${MYSQL_SERVER_PASS} | debconf-set-selections
echo mysql-community-server mysql-server/default-auth-override select "Use Strong Password Encryption (RECOMMENDED)" | debconf-set-selections
@ -100,13 +107,14 @@ fi
curl -s http://nginx.org/keys/nginx_signing.key | gpg --no-default-keyring --keyring gnupg-ring:/usr/share/keyrings/nginx.gpg --import
echo "deb [signed-by=/usr/share/keyrings/nginx.gpg] http://nginx.org/packages/$DIST/ $DISTRIB_CODENAME nginx" | tee /etc/apt/sources.list.d/nginx.list
chmod 644 /usr/share/keyrings/nginx.gpg
#Temporary fix for missing nginx repository for debian bookworm
[ "$DISTRIB_CODENAME" = "bookworm" ] && sed -i "s/$DISTRIB_CODENAME/buster/g" /etc/apt/sources.list.d/nginx.list
# setup msttcorefonts
echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections
# install
apt-get install -o DPkg::options::="--force-confnew" -yq \
python3-pip \
expect \
nano \
nodejs \
@ -121,10 +129,6 @@ apt-get install -o DPkg::options::="--force-confnew" -yq \
nginx-extras \
ffmpeg
if [ ! -e /usr/bin/json ]; then
npm i json -g >/dev/null 2>&1
fi
if ! dpkg -l | grep -q "elasticsearch"; then
apt-get install -yq elasticsearch=${ELASTIC_VERSION}
fi

View File

@ -41,7 +41,7 @@ INSTALLATION_TYPE="ENTERPRISE"
IMAGE_NAME="${PACKAGE_SYSNAME}/${PRODUCT}-api"
CONTAINER_NAME="${PACKAGE_SYSNAME}-api"
NETWORK=${PACKAGE_SYSNAME}
NETWORK_NAME=${PACKAGE_SYSNAME}
DISK_REQUIREMENTS=40960;
MEMORY_REQUIREMENTS=5500;
@ -220,7 +220,7 @@ while [ "$1" != "" ]; do
-dsh | --docspacehost )
if [ "$2" != "" ]; then
APP_CORE_BASE_DOMAIN=$2
APP_URL_PORTAL=$2
shift
fi
;;
@ -445,7 +445,7 @@ get_os_info () {
CONTAINS=$(cat /etc/redhat-release | { grep -sw release || true; });
if [[ -n ${CONTAINS} ]]; then
DIST=`cat /etc/redhat-release |sed s/\ release.*//`
REV=`cat /etc/redhat-release | sed s/.*release\ // | sed s/\ .*//`
REV=`cat /etc/redhat-release | grep -oP '(?<=release )\d+'`
else
DIST=`cat /etc/os-release | grep -sw 'ID' | awk -F= '{ print $2 }' | sed -e 's/^"//' -e 's/"$//'`
REV=`cat /etc/os-release | grep -sw 'VERSION_ID' | awk -F= '{ print $2 }' | sed -e 's/^"//' -e 's/"$//'`
@ -548,43 +548,12 @@ install_service () {
}
install_docker_compose () {
if ! command_exists python3; then
install_service python3
fi
if command_exists apt-get; then
apt-get -y update -qq
apt-get -y -q install python3-pip
elif command_exists yum; then
curl -O https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py || true
rm get-pip.py
fi
python3 -m pip install --upgrade pip
python3 -m pip install docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
if ! command_exists docker-compose; then
echo "command docker-compose not found"
exit 1;
fi
}
install_jq () {
curl -s -o jq http://stedolan.github.io/jq/download/linux64/jq
chmod +x jq
cp jq /usr/bin
rm jq
if ! command_exists jq; then
echo "command jq not found"
exit 1;
fi
curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
}
check_ports () {
RESERVED_PORTS=(3306 8092);
RESERVED_PORTS=(3306);
ARRAY_PORTS=();
USED_PORTS="";
@ -729,11 +698,54 @@ docker_login () {
fi
}
create_network () {
EXIST=$(docker network ls | awk '{print $2;}' | { grep -x ${NETWORK} || true; });
read_continue_installation () {
read -p "Continue installation [Y/N]? " CHOICE_INSTALLATION
case "$CHOICE_INSTALLATION" in
y|Y )
return 0
;;
if [[ -z ${EXIST} ]]; then
docker network create --driver bridge ${NETWORK}
n|N )
exit 0;
;;
* )
echo "Please, enter Y or N";
read_continue_installation
;;
esac
}
domain_check () {
DOMAINS=$(dig +short -x $(curl -s ifconfig.me) | sed 's/\.$//')
if [[ -n "$DOMAINS" ]]; then
while IFS= read -r DOMAIN; do
IP_ADDRESS=$(dig +short "$DOMAIN")
if [[ -n "$IP_ADDRESS" || "$IP_ADDRESS" =~ ^127\. ]]; then
LOCAL_RESOLVED_DOMAINS+="$DOMAIN"
elif [[ -n "$IP_ADDRESS" ]]; then
APP_URL_PORTAL=${APP_URL_PORTAL-:"http://${DOMAIN}:${EXTERNAL_PORT}"}
fi
done <<< "$DOMAINS"
fi
if [[ -n "$LOCAL_RESOLVED_DOMAINS" ]] || [[ $(ip route get 8.8.8.8 | awk '{print $7}') != $(curl -s ifconfig.me) ]]; then
DOCKER_DAEMON_FILE="/etc/docker/daemon.json"
APP_URL_PORTAL=${APP_URL_PORTAL:-${LOCAL_RESOLVED_DOMAINS[0]}}
if ! grep -q '"dns"' "$DOCKER_DAEMON_FILE" 2>/dev/null; then
echo "A problem was detected for ${LOCAL_RESOLVED_DOMAINS[@]} domains when using a loopback IP address or when using NAT."
echo "Select 'Y' to continue installing with configuring the use of external IP in Docker via Google Public DNS."
echo "Select 'N' to cancel ${PACKAGE_SYSNAME^^} ${PRODUCT^^} installation."
if read_continue_installation; then
if [[ -f "$DOCKER_DAEMON_FILE" ]]; then
sed -i '/{/a\ "dns": ["8.8.8.8", "8.8.4.4"],' "$DOCKER_DAEMON_FILE"
else
echo "{\"dns\": [\"8.8.8.8\", \"8.8.4.4\"]}" | tee "$DOCKER_DAEMON_FILE" >/dev/null
fi
systemctl restart docker
fi
fi
fi
}
@ -776,10 +788,6 @@ get_available_version () {
install_curl;
fi
if ! command_exists jq ; then
install_jq
fi
CREDENTIALS="";
AUTH_HEADER="";
TAGS_RESP="";
@ -821,13 +829,13 @@ get_available_version () {
TAGS_RESP=$(echo $TAGS_RESP | jq -r '.results[].name')
fi
VERSION_REGEX_1="[0-9]+\.[0-9]+\.[0-9]+"
VERSION_REGEX_2="[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"
VERSION_REGEX="[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?$"
TAG_LIST=""
for item in $TAGS_RESP
do
if [[ $item =~ $VERSION_REGEX_1 ]] || [[ $item =~ $VERSION_REGEX_2 ]]; then
if [[ $item =~ $VERSION_REGEX ]]; then
TAG_LIST="$item,$TAG_LIST"
fi
done
@ -930,10 +938,12 @@ set_mysql_params () {
}
set_docspace_params() {
ENV_EXTENSION=$(get_container_env_parameter "${CONTAINER_NAME}" "ENV_EXTENSION");
DOCUMENT_SERVER_HOST=$(get_container_env_parameter "${CONTAINER_NAME}" "DOCUMENT_SERVER_HOST");
ELK_HOST=$(get_container_env_parameter "${CONTAINER_NAME}" "ELK_HOST");
APP_CORE_BASE_DOMAIN=$(get_container_env_parameter "${CONTAINER_NAME}" "APP_CORE_BASE_DOMAIN");
ENV_EXTENSION=${ENV_EXTENSION:-$(get_container_env_parameter "${CONTAINER_NAME}" "ENV_EXTENSION")};
DOCUMENT_SERVER_HOST=${DOCUMENT_SERVER_HOST:-$(get_container_env_parameter "${CONTAINER_NAME}" "DOCUMENT_SERVER_HOST")};
ELK_HOST=${ELK_HOST:-$(get_container_env_parameter "${CONTAINER_NAME}" "ELK_HOST")};
APP_CORE_BASE_DOMAIN=${APP_CORE_BASE_DOMAIN:-$(get_container_env_parameter "${CONTAINER_NAME}" "APP_CORE_BASE_DOMAIN")};
APP_URL_PORTAL=${APP_URL_PORTAL:-$(get_container_env_parameter "${CONTAINER_NAME}" "APP_URL_PORTAL")};
[ -f ${BASE_DIR}/${PRODUCT}.yml ] && EXTERNAL_PORT=$(grep -oP '(?<=- ).*?(?=:8092)' ${BASE_DIR}/${PRODUCT}.yml)
}
@ -950,9 +960,22 @@ download_files () {
install_service svn subversion
fi
if ! command_exists jq ; then
if command_exists yum; then
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-$REV.noarch.rpm
fi
install_service jq
fi
if ! command_exists docker-compose; then
install_docker_compose
fi
svn export --force https://github.com/${PACKAGE_SYSNAME}/${PRODUCT}/branches/${GIT_BRANCH}/build/install/docker/ ${BASE_DIR}
reconfigure STATUS ${STATUS}
reconfigure INSTALLATION_TYPE ${INSTALLATION_TYPE}
reconfigure NETWORK_NAME ${NETWORK_NAME}
reconfigure MYSQL_DATABASE ${MYSQL_DATABASE}
reconfigure MYSQL_USER ${MYSQL_USER}
@ -961,8 +984,8 @@ download_files () {
}
reconfigure () {
local VARIABLE_NAME=$1
local VARIABLE_VALUE=$2
local VARIABLE_NAME="$1"
local VARIABLE_VALUE="$2"
if [[ -n ${VARIABLE_VALUE} ]]; then
sed -i "s~${VARIABLE_NAME}=.*~${VARIABLE_NAME}=${VARIABLE_VALUE}~g" $BASE_DIR/.env
@ -970,10 +993,6 @@ reconfigure () {
}
install_mysql_server () {
if ! command_exists docker-compose; then
install_docker_compose
fi
reconfigure MYSQL_VERSION ${MYSQL_VERSION}
reconfigure DATABASE_MIGRATION ${DATABASE_MIGRATION}
@ -981,10 +1000,6 @@ install_mysql_server () {
}
install_document_server () {
if ! command_exists docker-compose; then
install_docker_compose
fi
reconfigure DOCUMENT_SERVER_IMAGE_NAME "${DOCUMENT_SERVER_IMAGE_NAME}:${DOCUMENT_SERVER_VERSION:-$(get_available_version "$DOCUMENT_SERVER_IMAGE_NAME")}"
reconfigure DOCUMENT_SERVER_JWT_HEADER ${DOCUMENT_SERVER_JWT_HEADER}
reconfigure DOCUMENT_SERVER_JWT_SECRET ${DOCUMENT_SERVER_JWT_SECRET}
@ -993,26 +1008,14 @@ install_document_server () {
}
install_rabbitmq () {
if ! command_exists docker-compose; then
install_docker_compose
fi
docker-compose -f $BASE_DIR/rabbitmq.yml up -d
}
install_redis () {
if ! command_exists docker-compose; then
install_docker_compose
fi
docker-compose -f $BASE_DIR/redis.yml up -d
}
install_product () {
if ! command_exists docker-compose; then
install_docker_compose
fi
DOCKER_TAG="${DOCKER_TAG:-$(get_available_version ${IMAGE_NAME})}"
[ "${UPDATE}" = "true" ] && LOCAL_CONTAINER_TAG="$(docker inspect --format='{{index .Config.Image}}' ${CONTAINER_NAME} | awk -F':' '{print $2}')"
@ -1029,9 +1032,16 @@ install_product () {
reconfigure MYSQL_HOST ${MYSQL_HOST}
reconfigure APP_CORE_MACHINEKEY ${APP_CORE_MACHINEKEY}
reconfigure APP_CORE_BASE_DOMAIN ${APP_CORE_BASE_DOMAIN}
reconfigure APP_URL_PORTAL "${APP_URL_PORTAL:-"http://${PACKAGE_SYSNAME}-proxy:${EXTERNAL_PORT}"}"
reconfigure DOCKER_TAG ${DOCKER_TAG}
[[ -n $EXTERNAL_PORT ]] && sed -i "s/8092:8092/${EXTERNAL_PORT}:8092/g" $BASE_DIR/${PRODUCT}.yml
if [ $(free -m | grep -oP '\d+' | head -n 1) -gt "12228" ]; then #RAM ~12Gb
sed -i 's/Xms[0-9]g/Xms4g/g; s/Xmx[0-9]g/Xmx4g/g' $BASE_DIR/${PRODUCT}.yml
else
sed -i 's/Xms[0-9]g/Xms1g/g; s/Xmx[0-9]g/Xmx1g/g' $BASE_DIR/${PRODUCT}.yml
fi
docker-compose -f $BASE_DIR/migration-runner.yml up -d
docker-compose -f $BASE_DIR/${PRODUCT}.yml up -d
@ -1065,15 +1075,17 @@ start_installation () {
docker_login
set_docspace_params
domain_check
if [ "$UPDATE" = "true" ]; then
set_docspace_params
fi
set_jwt_secret
set_jwt_header
set_core_machinekey
create_network
set_mysql_params
download_files

View File

@ -34,6 +34,7 @@ if [ "$UPDATE" = "true" ] && [ "$DOCUMENT_SERVER_INSTALLED" = "true" ]; then
${package_manager} -y remove ${ds_pkg_installed_name}
DOCUMENT_SERVER_INSTALLED="false"
RECONFIGURE_PRODUCT="true"
else
${package_manager} -y update ${ds_pkg_name}
fi
@ -64,8 +65,11 @@ if [ "${MYSQL_FIRST_TIME_INSTALL}" = "true" ]; then
MYSQL_ROOT_PASS=$(echo $MYSQL_TEMPORARY_ROOT_PASS | sed -e 's/;/%/g' -e 's/=/%/g');
fi
$MYSQL -e "ALTER USER '${MYSQL_SERVER_USER}'@'localhost' IDENTIFIED WITH mysql_native_password BY '${MYSQL_ROOT_PASS}'" >/dev/null 2>&1 \
|| $MYSQL -e "UPDATE user SET plugin='mysql_native_password', authentication_string=PASSWORD('${MYSQL_ROOT_PASS}') WHERE user='${MYSQL_SERVER_USER}' and host='localhost';"
MYSQL_AUTHENTICATION_PLUGIN=$($MYSQL -e "SHOW VARIABLES LIKE 'default_authentication_plugin';" -s | awk '{print $2}')
MYSQL_AUTHENTICATION_PLUGIN=${MYSQL_AUTHENTICATION_PLUGIN:-caching_sha2_password}
$MYSQL -e "ALTER USER '${MYSQL_SERVER_USER}'@'localhost' IDENTIFIED WITH ${MYSQL_AUTHENTICATION_PLUGIN} BY '${MYSQL_ROOT_PASS}'" >/dev/null 2>&1 \
|| $MYSQL -e "UPDATE user SET plugin='${MYSQL_AUTHENTICATION_PLUGIN}', authentication_string=PASSWORD('${MYSQL_ROOT_PASS}') WHERE user='${MYSQL_SERVER_USER}' and host='localhost';"
systemctl restart mysqld
fi
@ -151,7 +155,7 @@ if [ "$PRODUCT_INSTALLED" = "false" ]; then
-mysqld ${MYSQL_SERVER_DB_NAME} \
-mysqlu ${MYSQL_SERVER_USER} \
-mysqlp ${MYSQL_ROOT_PASS}
elif [[ $PRODUCT_CHECK_UPDATE -eq $UPDATE_AVAILABLE_CODE ]]; then
elif [[ $PRODUCT_CHECK_UPDATE -eq $UPDATE_AVAILABLE_CODE || $RECONFIGURE_PRODUCT = "true" ]]; then
ENVIRONMENT=$(grep -oP 'ENVIRONMENT=\K.*' /lib/systemd/system/${product}-api.service)
CONNECTION_STRING=$(json -f /etc/${package_sysname}/${product}/appsettings.$ENVIRONMENT.json ConnectionStrings.default.connectionString)
${package_manager} -y update ${product}

View File

@ -47,17 +47,16 @@ rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-$REV.noarch.r
rpm -ivh https://rpms.remirepo.net/enterprise/remi-release-$REV.rpm || true
yum localinstall -y --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-$REV.noarch.rpm
MONOREV=$REV
if [ "$REV" = "9" ]; then
MONOREV="8"
TESTING_REPO="--enablerepo=crb"
[ $DIST != "redhat" ] && TESTING_REPO="--enablerepo=crb" || /usr/bin/crb enable
update-crypto-policies --set DEFAULT:SHA1
elif [ "$REV" = "8" ]; then
POWERTOOLS_REPO="--enablerepo=powertools"
[ $DIST != "redhat" ] && POWERTOOLS_REPO="--enablerepo=powertools" || /usr/bin/crb enable
fi
#add rabbitmq & erlang repo
curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | os=centos dist=$MONOREV bash
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | os=centos dist=$MONOREV bash
curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | os=centos dist=$REV bash
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | os=centos dist=$REV bash
#add nodejs repo
curl -sL https://rpm.nodesource.com/setup_16.x | sed 's/centos|/'$DIST'|/g' | sudo bash - || true
@ -66,8 +65,6 @@ rpm --import http://rpm.nodesource.com/pub/el/NODESOURCE-GPG-SIGNING-KEY-EL
#add dotnet repo
if [ $REV = "7" ] || [[ $DIST != "redhat" && $REV = "8" ]]; then
rpm -Uvh https://packages.microsoft.com/config/centos/$REV/packages-microsoft-prod.rpm || true
elif rpm -q packages-microsoft-prod; then
yum remove -y packages-microsoft-prod dotnet*
fi
#add mysql repo
@ -119,15 +116,6 @@ ${package_manager} -y install epel-release \
SDL2 $POWERTOOLS_REPO \
expect \
ffmpeg $TESTING_REPO
py3_version=$(python3 -c 'import sys; print(sys.version_info.minor)')
if [[ $py3_version -lt 6 ]]; then
curl -O https://bootstrap.pypa.io/pip/3.$py3_version/get-pip.py
else
curl -O https://bootstrap.pypa.io/get-pip.py
fi
python3 get-pip.py || true
rm get-pip.py
if [[ $PSQLExitCode -eq $UPDATE_AVAILABLE_CODE ]]; then
yum -y install postgresql-upgrade
@ -137,9 +125,4 @@ postgresql-setup initdb || true
semanage permissive -a httpd_t
if [ ! -e /usr/bin/json ]; then
npm i json -g >/dev/null 2>&1
fi
systemctl daemon-reload
package_services="rabbitmq-server postgresql redis nginx mysqld"

View File

@ -0,0 +1,57 @@
$SRC_PATH=(get-item $PSScriptRoot ).parent.parent.parent.FullName
$BUILD_PATH="$SRC_PATH\publish"
$BACKEND_NODEJS_SERVICES="ASC.Socket.IO","ASC.SsoAuth"
$BACKEND_DOTNETCORE_SERVICES="ASC.Files", "ASC.People", "ASC.Data.Backup", "ASC.Files.Service", "ASC.Notify", "ASC.Studio.Notify", "ASC.Web.Api", "ASC.Web.Studio", "ASC.Data.Backup.BackgroundTasks", "ASC.ClearEvents", "ASC.ApiSystem", "ASC.Web.HealthChecks.UI"
$SELF_CONTAINED="false"
$PUBLISH_CNF="Debug"
$FRONTEND_BUILD_ARGS="build"
$FRONTEND_DEPLOY_ARGS="deploy"
$DEBUG_INFO_CHECK=""
$MIGRATION_CHECK="true"
$DOCKER_ENTRYPOINT="$SRC_PATH\build\install\docker\docker-entrypoint.py"
if(Test-Path -Path "$BUILD_PATH\services" ){
Write-Host "== Clean up services ==" -ForegroundColor Green
Remove-Item "$BUILD_PATH\services" -Recurse
}
Write-Host "== Build ASC.Web.slnf ==" -ForegroundColor Green
dotnet build "$SRC_PATH\ASC.Web.slnf"
Write-Host "== Build ASC.Migrations.sln ==" -ForegroundColor Green
dotnet build "$SRC_PATH\ASC.Migrations.sln" -o "$BUILD_PATH\services\ASC.Migration.Runner\service\"
Write-Host "== Add docker-migration-entrypoint.sh to ASC.Migration.Runner ==" -ForegroundColor Green
$FilePath = "$BUILD_PATH\services\ASC.Migration.Runner\service\docker-migration-entrypoint.sh"
Get-Content "$SRC_PATH\build\install\docker\docker-migration-entrypoint.sh" -raw | % {$_ -replace "`r", ""} | Set-Content -NoNewline $FilePath
foreach ($SERVICE in $BACKEND_NODEJS_SERVICES)
{
Write-Host "== Build $SERVICE project ==" -ForegroundColor Green
yarn install --cwd "$SRC_PATH\common\$SERVICE" --frozen-lockfile
$DST = "$BUILD_PATH\services\$SERVICE\service\"
if(!(Test-Path -Path $DST )){
New-Item -ItemType "directory" -Path $DST
}
Write-Host "== Copy service data to `publish\services\${SERVICE}\service` ==" -ForegroundColor Green
Copy-Item -Path "$SRC_PATH\common\$SERVICE\*" -Destination $DST -Recurse
Write-Host "== Add docker-entrypoint.py to $SERVICE ==" -ForegroundColor Green
Copy-Item $DOCKER_ENTRYPOINT -Destination $DST
}
Write-Host "== Publish ASC.Web.slnf ==" -ForegroundColor Green
dotnet publish "$SRC_PATH\ASC.Web.slnf" -p "PublishProfile=FolderProfile"
Set-Location -Path $PSScriptRoot
foreach ($SERVICE in $BACKEND_DOTNETCORE_SERVICES)
{
Write-Host "== Add docker-entrypoint.py to $SERVICE ==" -ForegroundColor Green
$DST = "$BUILD_PATH\services\$SERVICE\service\"
Copy-Item $DOCKER_ENTRYPOINT -Destination $DST
}

View File

@ -0,0 +1,253 @@
#!/bin/bash
set -xe
PROJECT_REPOSITORY_NAME=${PROJECT_REPOSITORY_NAME:-"DocSpace"}
SRC_PATH=${SRC_PATH:-$(pwd | sed "s/${PROJECT_REPOSITORY_NAME}.*/${PROJECT_REPOSITORY_NAME}/g")}
BUILD_PATH=${BUILD_PATH:-${SRC_PATH}/publish}
BUILD_DOTNET_CORE_ARGS=${BUILD_DOTNET_CORE_ARGS:-"false"}
PROPERTY_BUILD=${PROPERTY_BUILD:-"all"}
BACKEND_NODEJS_SERVICES=${BACKEND_NODEJS_SERVICES:-"ASC.Socket.IO, ASC.SsoAuth"}
BACKEND_DOTNETCORE_SERVICES=${BACKEND_DOTNETCORE_SERVICES:-"ASC.Files, ASC.People, ASC.Data.Backup, ASC.Files.Service, ASC.Notify, \
ASC.Studio.Notify, ASC.Web.Api, ASC.Web.Studio, ASC.Data.Backup.BackgroundTasks, ASC.ClearEvents, ASC.ApiSystem, ASC.Web.HealthChecks.UI"}
SELF_CONTAINED=${SELF_CONTAINED:-"false"}
PUBLISH_BACKEND_ARGS=${PUBLISH_BACKEND_ARGS:-"false"}
PUBLISH_CNF=${PUBLISH_CNF:-"Release"}
FRONTEND_BUILD_ARGS=${FRONTEND_BUILD_ARGS:-"build"}
FRONTEND_DEPLOY_ARGS=${FRONTEND_DEPLOY_ARGS:-"deploy"}
DEBUG_INFO_CHECK=${DEBUG_INFO_CHECK:-""}
MIGRATION_CHECK=${MIGRATION_CHECK:-"true"}
DOCKER_ENTRYPOINT=${DOCKER_ENTRYPOINT:-"false"}
ARRAY_NAME_SERVICES=()
while [ "$1" != "" ]; do
case $1 in
-sp | --srcpath )
if [[ "$2" != "" && ! "$2" =~ ^- ]]; then
SRC_PATH=$2
BUILD_PATH=${SRC_PATH}/publish
shift
fi
;;
-bp | --buildpath )
if [[ "$2" != "" && ! "$2" =~ ^- ]]; then
BUILD_PATH=$2
shift
fi
;;
-pb | --property-build )
if [[ "$2" != "" && ! "$2" =~ ^- ]]; then
PROPERTY_BUILD=$2
shift
fi
;;
-sc | --self-contained )
if [[ "$2" != "" && ! "$2" =~ ^- ]]; then
SELF_CONTAINED=$2
shift
fi
;;
-pc | --publish-configuration )
if [[ "$2" != "" && ! "$2" =~ ^- ]]; then
PUBLISH_CNF=$2
shift
fi
;;
-yb | --frontend-build-args )
if [[ "$2" != "" && ! "$2" =~ ^- ]]; then
FRONTEND_BUILD_ARGS=$2
shift
fi
;;
-yd | --frontend-deploy-args )
if [[ "$2" != "" && ! "$2" =~ ^- ]]; then
FRONTEND_DEPLOY_ARGS=$2
shift
fi
;;
-dc | --debug-check )
if [[ "$2" != "" && ! "$2" =~ ^- ]]; then
DEBUG_INFO_CHECK=$2
shift
fi
;;
-mc | --migration-check )
if [[ "$2" != "" && ! "$2" =~ ^- ]]; then
MIGRATION_CHECK=$2
shift
fi
;;
-de | --docker-entrypoint )
if [[ "$2" != "" && ! "$2" =~ ^- ]]; then
DOCKER_ENTRYPOINT=$2
shift
fi
;;
-? | -h | --help )
echo " Usage: bash build-services.sh [PARAMETER] [[PARAMETER], ...]"
echo " Parameters:"
echo -e " -sp, --srcpath \t path to project root directory"
echo -e " -bp, --buildpath \t path where generated output is placed (by default={SRC_PATH}/publish)"
echo -e " -st, --status \t build status Ex. all/frontend-build/backend-publish/backend-dotnet-publish/backend-nodejs-publish/backend-build"
echo -e " -sc, --self-contained \t publish the .NET runtime with your application (by default=false)"
echo -e " -pc, --publish-configuration \t dotnet publish configuration Ex. Release/Debug"
echo -e " -yb, --frontend-build-args \t arguments for yarn building"
echo -e " -yd, --frontend-deploy-args \t arguments for yarn deploy"
echo -e " -dc, --debug-check \t arguments for yarn debug info configure"
echo -e " -mc, --migration-check \t check migration build (by default=true)"
echo " -?, -h, --help this help"
echo " Examples"
echo " bash build-services.sh -sp /app/DocSpace"
exit 0
;;
* )
echo "Unknown parameter $1" 1>&2
exit 1
;;
esac
shift
done
cd ${SRC_PATH}
function get_services_name {
if [[ $# -gt 0 ]]
then
ARRAY_NAME_SERVICES=($(echo $1 | tr "," " "))
fi
}
# Builds a project dotnetcore dependencies
function build_dotnetcore_backend {
if [[ ${BUILD_DOTNET_CORE_ARGS} == "false" ]]
then
echo "== Build ASC.Web.slnf =="
dotnet build ASC.Web.slnf
else
echo "== Build ASC.Web.slnf ${BUILD_DOTNET_CORE_ARGS} =="
dotnet build ASC.Web.slnf ${BUILD_DOTNET_CORE_ARGS}
fi
if [[ $# -gt 0 ]]
then
local migration_check=$(echo $1 | tr '[:upper:]' '[:lower:]' | tr -d ' ')
if [[ ${migration_check} == "true" ]]
then
echo "== Build ASC.Migrations.sln =="
dotnet build ASC.Migrations.sln -o ${BUILD_PATH}/services/ASC.Migration.Runner/service/
fi
if [[ ${DOCKER_ENTRYPOINT} != "false" ]]
then
echo "== ADD ${SRC_PATH}/build/install/docker/docker-migration-entrypoint.sh to ASC.Migration.Runner =="
cp ${SRC_PATH}/build/install/docker/docker-migration-entrypoint.sh ${BUILD_PATH}/services/ASC.Migration.Runner/service/
fi
fi
}
# Publish BACKEND dotnetcore services
function backend-dotnet-publish {
# List of names for nodejs backend projects
get_services_name "${BACKEND_DOTNETCORE_SERVICES}"
echo "== Publish ASC.Web.slnf =="
if [[ ${PUBLISH_BACKEND_ARGS} == "false" ]]
then
dotnet publish $SRC_PATH/ASC.Web.slnf -p "PublishProfile=FolderProfile"
else
dotnet publish $SRC_PATH/ASC.Web.slnf ${PUBLISH_BACKEND_ARGS} -p "PublishProfile=FolderProfile"
fi
if [[ ${DOCKER_ENTRYPOINT} != "false" ]]
then
for i in ${!ARRAY_NAME_SERVICES[@]}; do
echo "== ADD ${DOCKER_ENTRYPOINT} to ${ARRAY_NAME_SERVICES[$i]} =="
cp ${DOCKER_ENTRYPOINT} ${BUILD_PATH}/services/${ARRAY_NAME_SERVICES[$i]}/service/
done
fi
ARRAY_NAME_SERVICES=()
}
# Install BACKEND dependencies for nodjs's projects
function backend-nodejs-publish {
# List of names for nodejs backend projects
get_services_name "${BACKEND_NODEJS_SERVICES}"
for i in ${!ARRAY_NAME_SERVICES[@]}; do
echo "== Build ${ARRAY_NAME_SERVICES[$i]} project =="
yarn install --cwd ${SRC_PATH}/common/${ARRAY_NAME_SERVICES[$i]} --frozen-lockfile && \
mkdir -p ${BUILD_PATH}/services/${ARRAY_NAME_SERVICES[$i]}/service/ && \
cp -rfv ${SRC_PATH}/common/${ARRAY_NAME_SERVICES[$i]}/* ${BUILD_PATH}/services/${ARRAY_NAME_SERVICES[$i]}/service/
if [[ ${DOCKER_ENTRYPOINT} != "false" ]]
then
echo "== ADD ${DOCKER_ENTRYPOINT} to ${ARRAY_NAME_SERVICES[$i]} =="
cp ${DOCKER_ENTRYPOINT} ${BUILD_PATH}/services/${ARRAY_NAME_SERVICES[$i]}/service/
fi
done
ARRAY_NAME_SERVICES=()
}
# Install FRONTEND dependencies for nodjs's projects
function build_nodejs_frontend {
echo "== yarn install =="
yarn install
# Install debug config mode
if [[ $# -gt 0 ]]
then
local debug_info_check=$(echo $1 | tr '[:upper:]' '[:lower:]' | tr -d ' ')
if [[ ${debug_info_check} == "true" ]]
then
echo "== yarn debug-info =="
yarn debug-info
fi
fi
echo "== yarn ${FRONTEND_BUILD_ARGS} =="
yarn ${FRONTEND_BUILD_ARGS}
echo "== yarn ${FRONTEND_DEPLOY_ARGS} =="
yarn ${FRONTEND_DEPLOY_ARGS}
if [[ ${DOCKER_ENTRYPOINT} != "false" ]]
then
echo "== ADD ${DOCKER_ENTRYPOINT} to ASC.Login =="
cp ${DOCKER_ENTRYPOINT} ${SRC_PATH}/build/deploy/login/
echo "== ADD ${DOCKER_ENTRYPOINT} toASC.Editors =="
cp ${DOCKER_ENTRYPOINT} ${SRC_PATH}/build/deploy/editor/
fi
}
function run {
case $1 in
all )
build_dotnetcore_backend "${MIGRATION_CHECK}"
backend-nodejs-publish
build_nodejs_frontend "${DEBUG_INFO_CHECK}"
backend-dotnet-publish
;;
frontend-build )
build_nodejs_frontend "${DEBUG_INFO_CHECK}"
;;
backend-publish )
build_dotnetcore_backend "${MIGRATION_CHECK}"
backend-nodejs-publish
backend-dotnet-publish
;;
backend-dotnet-publish )
build_dotnetcore_backend "${MIGRATION_CHECK}"
backend-dotnet-publish
;;
backend-nodejs-publish )
backend-nodejs-publish
;;
backend-build )
build_dotnetcore_backend "${MIGRATION_CHECK}"
;;
* )
echo "Unknown - \"$1\", Ex. all/frontend-build/backend-publish/backend-dotnet-publish/backend-nodejs-publish/backend-build" 1>&2
exit 1
;;
esac
}
run "${PROPERTY_BUILD}"

View File

@ -219,27 +219,25 @@ set_core_machinekey () {
if [ "$DIST" = "RedHat" ]; then
echo $CORE_MACHINEKEY > $APP_DIR/.private/machinekey
chmod o-rwx $APP_DIR/.private/machinekey
elif [ "$DIST" = "Debian" ]; then
db_set ${PRODUCT}/machinekey $CORE_MACHINEKEY || true
echo ${PRODUCT} ${PRODUCT}/machinekey select $CORE_MACHINEKEY | debconf-set-selections || true
fi
fi
$JSON_USERCONF "this.core={'base-domain': \"$APP_HOST\", 'machinekey': \"$CORE_MACHINEKEY\" }" >/dev/null 2>&1
$JSON $APP_DIR/apisystem.$ENVIRONMENT.json -e "this.core={'base-domain': \"$APP_HOST\", 'machinekey': \"$CORE_MACHINEKEY\" }" >/dev/null 2>&1
$JSON_USERCONF "this.core={'base-domain': \"$APP_HOST\", 'machinekey': \"$CORE_MACHINEKEY\", 'notify': { 'postman': \"services\" }}" >/dev/null 2>&1
$JSON $APP_DIR/apisystem.$ENVIRONMENT.json -e "this.core={'base-domain': \"$APP_HOST\", 'machinekey': \"$CORE_MACHINEKEY\", 'notify': { 'postman': \"services\" }}" >/dev/null 2>&1
sed "s^\(machine_key\)\s*=.*^\1 = ${CORE_MACHINEKEY}^g" -i $APP_DIR/radicale.config
}
install_json() {
if [ ! -e /usr/bin/json ]; then
if ! command -v json; then
echo -n "Install json package... "
npm i json -g >/dev/null 2>&1
curl -L https://github.com/trentm/json/raw/master/lib/json.js > /usr/bin/json
chmod 755 /usr/bin/json
echo "OK"
fi
}
restart_services() {
chown -R ${PACKAGE_SYSNAME}:${PACKAGE_SYSNAME} $APP_DIR $PRODUCT_DIR $LOG_DIR
chown -R ${PACKAGE_SYSNAME}:${PACKAGE_SYSNAME} $APP_DIR $PRODUCT_DIR $LOG_DIR /var/www/$PACKAGE_SYSNAME/Data
sed "s_\(ENVIRONMENT=\).*_\1${ENVIRONMENT}_i" -i /lib/systemd/system/${PRODUCT}*.service >/dev/null 2>&1
systemctl daemon-reload
@ -313,7 +311,7 @@ Character Set=utf8; AutoEnlist=false; SSL Mode=none;AllowPublicKeyRetrieval=true
$JSON_USERCONF "this.ConnectionStrings={'default': {'connectionString': \"$CONNECTION_STRING\"}}" >/dev/null 2>&1
$JSON $APP_DIR/apisystem.$ENVIRONMENT.json -e "this.ConnectionStrings={'default': {'connectionString': \"$CONNECTION_STRING\"}}" >/dev/null 2>&1
sed "s_\(\"ConnectionString\":\).*_\1 \"${CONNECTION_STRING//&/\\&}\"_" -i $PRODUCT_DIR/services/ASC.Migration.Runner/appsettings.runner.json
sed "s_\(\"ConnectionString\":\).*_\1 \"${CONNECTION_STRING//_/\\_}\"_" -i $PRODUCT_DIR/services/ASC.Migration.Runner/appsettings.runner.json
change_mysql_config
#Enable database migration
@ -400,10 +398,13 @@ change_mysql_config(){
sed "s/collation_server.*/collation_server = utf8_general_ci/" -i ${CNF_PATH} || true # ignore errors
fi
MYSQL_AUTHENTICATION_PLUGIN=$($MYSQL -e "SHOW VARIABLES LIKE 'default_authentication_plugin';" -s | awk '{print $2}')
MYSQL_AUTHENTICATION_PLUGIN=${MYSQL_AUTHENTICATION_PLUGIN:-caching_sha2_password}
if ! grep -q "^default-authentication-plugin" ${CNF_PATH}; then
sed '/\[mysqld\]/a default-authentication-plugin = mysql_native_password' -i ${CNF_PATH}
sed "/\[mysqld\]/a default-authentication-plugin = ${MYSQL_AUTHENTICATION_PLUGIN}" -i ${CNF_PATH}
else
sed "s/default-authentication-plugin.*/default-authentication-plugin = mysql_native_password/" -i ${CNF_PATH} || true # ignore errors
sed "s/default-authentication-plugin.*/default-authentication-plugin = ${MYSQL_AUTHENTICATION_PLUGIN}/" -i ${CNF_PATH} || true # ignore errors
fi
if [ -e ${CNF_SERVICE_PATH} ]; then
@ -431,7 +432,7 @@ setup_nginx(){
echo -n "Configuring nginx... "
# Remove default nginx website
rm -f $NGINX_CONF/default.conf >/dev/null 2>&1 || rm -f $NGINX_DIR/sites-enabled/default >/dev/null 2>&1
rm -f $NGINX_CONF/default.conf $NGINX_DIR/sites-enabled/default
sed -i "s_\(listen\).*;_\1 $APP_PORT;_" $NGINX_CONF/${PACKAGE_SYSNAME}.conf
sed "s!\(^worker_processes\).*;!\1 ${NGINX_WORKER_PROCESSES:-$(grep processor /proc/cpuinfo | wc -l)};!" -i ${NGINX_DIR}/nginx.conf
@ -522,11 +523,16 @@ setup_docs() {
#Save Docs address and JWT in .json
$JSON_USERCONF "this.files={'docservice': {\
'secret': {'value': \"$DOCUMENT_SERVER_JWT_SECRET\",'header': \"$DOCUMENT_SERVER_JWT_HEADER\"}, \
'url': {'public': \"http://${DOCUMENT_SERVER_HOST}:${DOCUMENT_SERVER_PORT}\", 'internal': \"\",'portal': \"http://$APP_HOST:$APP_PORT\"}}}" >/dev/null 2>&1
'url': {'public': \"/ds-vpath/\", 'internal': \"http://${DOCUMENT_SERVER_HOST}:${DOCUMENT_SERVER_PORT}\",'portal': \"http://$APP_HOST:$APP_PORT\"}}}" >/dev/null 2>&1
echo "OK"
}
setup_enterprise() {
[ ! -d /var/www/$PACKAGE_SYSNAME/Data/ ] && mkdir -p /var/www/$PACKAGE_SYSNAME/Data/
$JSON $APP_DIR/appsettings.json -e "this.license.file={'path': \"/var/www/$PACKAGE_SYSNAME/Data/license.lic\"}" >/dev/null 2>&1
}
change_elasticsearch_config(){
systemctl stop elasticsearch
@ -652,7 +658,7 @@ if command -v yum >/dev/null 2>&1; then
REDIS_PACKAGE="redis"
elif command -v apt >/dev/null 2>&1; then
DIST="Debian"
PACKAGE_MANAGER="dpkg -l"
PACKAGE_MANAGER="dpkg -s"
MYSQL_PACKAGE="mysql"
REDIS_PACKAGE="redis-server"
fi
@ -667,9 +673,12 @@ fi
if $PACKAGE_MANAGER ${PACKAGE_SYSNAME}-documentserver >/dev/null 2>&1 || $PACKAGE_MANAGER ${PACKAGE_SYSNAME}-documentserver-de >/dev/null 2>&1 || $PACKAGE_MANAGER ${PACKAGE_SYSNAME}-documentserver-ee >/dev/null 2>&1; then
setup_docs
if $PACKAGE_MANAGER ${PACKAGE_SYSNAME}-documentserver-ee >/dev/null 2>&1; then
setup_enterprise
fi
fi
if $PACKAGE_MANAGER nginx >/dev/null 2>&1; then
if $PACKAGE_MANAGER nginx >/dev/null 2>&1 || $PACKAGE_MANAGER nginx-extras >/dev/null 2>&1; then
setup_nginx
fi

View File

@ -161,7 +161,7 @@ reassign_values (){
elif [[ "${SERVICE_NAME}" = "migration-runner" ]]; then
SERVICE_TYPE="simple"
RESTART="no"
EXEC_START="${DOTNET_RUN} ${WORK_DIR}${EXEC_FILE}"
EXEC_START="${DOTNET_RUN} ${WORK_DIR}${EXEC_FILE} standalone=true"
else
SERVICE_TYPE="notify"
RESTART="always"

View File

@ -5,10 +5,12 @@ Maintainer: Ascensio System SIA <support@onlyoffice.com>
Build-Depends: debhelper (>= 10), po-debconf, nodejs (>=18), dotnet-sdk-7.0, yarn
Standards-Version: {{package_header_tag_version}}
Homepage: https://www.onlyoffice.com/
Architecture: any
Architecture: all
Multi-Arch: foreign
Package: {{product}}
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: debconf,
${misc:Depends}, ${shlibs:Depends},
{{product}}-api (= {{package_header_tag_version}}),
@ -36,127 +38,174 @@ Description: {{product}}
predefined permissions. Dependency package.
Package: {{product}}-common
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: adduser, logrotate, ${misc:Depends}, ${shlibs:Depends}
Recommends: default-mysql-client
Description: {{product}}-common
{{product}}-common
A package containing configs and scripts
Package: {{product}}-backup
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), dotnet-sdk-7.0, ${misc:Depends}, ${shlibs:Depends}
Description: {{product}}-backup
{{product}}-backup
The service which handles API requests related to backup
Package: {{product}}-files
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), dotnet-sdk-7.0, ${misc:Depends}, ${shlibs:Depends}
Recommends: elasticsearch (= 7.10.0)
Description: {{product}}-files
{{product}}-files
The service which handles API requests related to
documents and launches the OFormService service
Package: {{product}}-files-services
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), dotnet-sdk-7.0, ${misc:Depends}, ${shlibs:Depends}
Recommends: ffmpeg, elasticsearch (= 7.10.0)
Description: {{product}}-files-services
{{product}}-files-services
The service which launches additional services related to file management:
- ElasticSearchIndexService - indexes documents using elasticsearch;
- FeedAggregatorService - aggregates notifications;
- FeedCleanerService - removes notifications;
- FileConverterService - converts documents;
- ThumbnailBuilderService - generates thumbnails for documents;
- Launcher - removes outdated files from Trash;
Package: {{product}}-notify
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), dotnet-sdk-7.0, ${misc:Depends}, ${shlibs:Depends}
Recommends: ffmpeg, elasticsearch (= 7.10.0)
Description: {{product}}-notify
{{product}}-notify
The service which launches additional services
related to notifications about DocSpace events:
NotifySenderService which sends messages from the base,
and NotifyCleanerService which removes messages
Package: {{product}}-people-server
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), dotnet-sdk-7.0, ${misc:Depends}, ${shlibs:Depends}
Description: {{product}}-people-server
{{product}}-people-server
The service which handles API requests related to the People module
Package: {{product}}-socket
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), nodejs (>= 16), ${misc:Depends}, ${shlibs:Depends}
Recommends: redis-server
Description: {{product}}-socket
{{product}}-socket
The service which provides two-way communication between a client and a server
Package: {{product}}-studio-notify
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), dotnet-sdk-7.0, ${misc:Depends}, ${shlibs:Depends}
Description: {{product}}-studio-notify
{{product}}-studio-notify
The service responsible for creating notifications and
sending them to other services, for example, TelegramService and NotifyService
Package: {{product}}-api
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), dotnet-sdk-7.0, ${misc:Depends}, ${shlibs:Depends}
Recommends: rabbitmq-server, apache-activemq, redis-server
Description: {{product}}-api
{{product}}-api
The service which is used for working with a certain portal. This service
handles API requests not related to backup, documents, and the People
module, for example, requests related to settings, audit, authentication, etc.
Package: {{product}}-api-system
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), dotnet-sdk-7.0, ${misc:Depends}, ${shlibs:Depends}
Description: {{product}}-api-system
{{product}}-api-system
The service which is used for working with portals (creating, removing, etc.)
Package: {{product}}-studio
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), dotnet-sdk-7.0, ${misc:Depends}, ${shlibs:Depends}
Description: {{product}}-studio
{{product}}-studio
The service which processes storage handlers and authorization pages
Package: {{product}}-proxy
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), nginx-extras (>= 1.9.5), ${misc:Depends}, ${shlibs:Depends}
Description: {{product}}-proxy
{{product}}-proxy
The service which is used as a web server and reverse proxy,
it receives and handles requests, transmits them to other services,
receives a response from them and returns it to the client
Package: {{product}}-ssoauth
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), nodejs (>= 16), ${misc:Depends}, ${shlibs:Depends}
Description: {{product}}-ssoauth
{{product}}-ssoauth
The service responsible for enabling and configuring
SAML-based single sign-on (SSO) authentication to provide a more quick,
easy and secure way to access DocSpace for users
Package: {{product}}-backup-background
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), dotnet-sdk-7.0, ${misc:Depends}, ${shlibs:Depends}
Description: {{product}}-backup-background
{{product}}-backup-background
The service which launches additional services related to backup creation:
- BackupWorkerService - launches WorkerService which runs backup/restore, etc;
- BackupListenerService - waits for a signal to delete backups;
- BackupCleanerTempFileService - removes temporary backup files;
- BackupCleanerService - removes outdated backup files;
- BackupSchedulerService - runs backup according to a schedule;
Package: {{product}}-clear-events
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), dotnet-sdk-7.0, ${misc:Depends}, ${shlibs:Depends}
Description: {{product}}-clear-events
{{product}}-clear-events
The service responsible for clearing the login_events and audit_events tables
by LoginHistoryLifeTime and AuditTrailLifeTime to log out users after a timeout
Package: {{product}}-migration-runner
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), dotnet-sdk-7.0, ${misc:Depends}, ${shlibs:Depends}
Description: {{product}}-migration-runner
{{product}}-migration-runner
The service responsible for the database creation.
A database connection is transferred to the service and
the service creates tables and populates them with values
Package: {{product}}-radicale
Architecture: any
Depends: {{product}}-common (= {{package_header_tag_version}}), python3-pip, ${misc:Depends}, ${shlibs:Depends}
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), python3-pip, python3-requests, python3-setuptools, ${misc:Depends}, ${shlibs:Depends}
Description: {{product}}-radicale
{{product}}-radicale
Radicale is a server designed to support the CalDav and CardDav protocols.
It operates either as a standalone package using its own internal http server
or can be integrated with an existing webserver
Package: {{product}}-doceditor
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), nodejs (>= 16), ${misc:Depends}, ${shlibs:Depends}
Description: {{product}}-doceditor
{{product}}-doceditor
The service which allows interaction with documentserver
Package: {{product}}-login
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), nodejs (>= 16), ${misc:Depends}, ${shlibs:Depends}
Description: {{product}}-login
{{product}}-login
The service which is used for logging users and displaying the wizard
Package: {{product}}-healthchecks
Architecture: any
Architecture: all
Multi-Arch: foreign
Depends: {{product}}-common (= {{package_header_tag_version}}), dotnet-sdk-7.0, ${misc:Depends}, ${shlibs:Depends}
Description: {{product}}-healthchecks
{{product}}-healthchecks
The service which displays launched services

View File

@ -16,7 +16,9 @@ case "$1" in
CORE_MACHINEKEY="$RET"
args+=(-e "$ENVIRONMENT" -ash "$APP_HOST" -asp "$APP_PORT" );
[ -n "$CORE_MACHINEKEY" ] && args+=(-mk "$CORE_MACHINEKEY" );
[ -z "$CORE_MACHINEKEY" ] && CORE_MACHINEKEY=$(cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 12) && db_set {{product}}/machinekey $CORE_MACHINEKEY
args+=(-mk "$CORE_MACHINEKEY" )
db_get {{product}}/db-host || true
DB_HOST="$RET"
@ -30,6 +32,19 @@ case "$1" in
args+=(-mysqlh "$DB_HOST" -mysqld "$DB_NAME" -mysqlu "$DB_USER" );
[ -n "$DB_PWD" ] && args+=(-mysqlp "$DB_PWD" );
command -v mysql >/dev/null 2>&1 || { echo "MySQL client not found"; exit 1; }
MYSQL="mysql -h$DB_HOST -u$DB_USER"
if [ -n "$DB_PWD" ]; then
MYSQL="$MYSQL -p$DB_PWD"
fi
$MYSQL -e ";" >/dev/null 2>&1
ERRCODE=$?
if [ $ERRCODE -ne 0 ]; then
systemctl mysql start >/dev/null 2>&1
$MYSQL -e ";" >/dev/null 2>&1 || { echo "Trying to establish MySQL connection... FAILURE"; exit 1; }
fi
db_get {{product}}/redis-host || true
REDIS_HOST="$RET"
db_get {{product}}/redis-port || true
@ -57,9 +72,9 @@ case "$1" in
args+=(-ess "$ELK_SHEME" -esh "$ELK_HOST" -esp "$ELK_PORT" );
db_get onlyoffice/db-host || true
db_get {{product}}/ds-host || true
DOCUMENT_SERVER_HOST="$RET"
db_get onlyoffice/ds-port || true
db_get {{product}}/ds-port || true
DOCUMENT_SERVER_PORT="$RET"
args+=(-dsh "$DOCUMENT_SERVER_HOST" -dsp "$DOCUMENT_SERVER_PORT" );

View File

@ -1,2 +1,3 @@
/var/log/onlyoffice/{{product}}
/etc/onlyoffice/{{product}}/.private
/var/www/onlyoffice/Data

View File

@ -9,10 +9,7 @@ DIR="/var/www/{{product}}"
[ -f /usr/lib/python3.$(python3 -c 'import sys; print(sys.version_info.minor)')/EXTERNALLY-MANAGED ] && \
rm /usr/lib/python3.$(python3 -c 'import sys; print(sys.version_info.minor)')/EXTERNALLY-MANAGED
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade requests
python3 -m pip install --upgrade setuptools
python3 -m pip install --upgrade radicale==3.0.5
python3 -m pip install --upgrade radicale
python3 -m pip install --upgrade ${DIR}/Tools/radicale/plugins/app_auth_plugin/.
python3 -m pip install --upgrade ${DIR}/Tools/radicale/plugins/app_store_plugin/.
python3 -m pip install --upgrade ${DIR}/Tools/radicale/plugins/app_rights_plugin/.

View File

@ -32,6 +32,16 @@ Type: string
Default: onlyoffice
Description: Database name:
Template: {{product}}/ds-host
Type: string
Default: localhost
Description: ONLYOFFICE Docs host:
Template: {{product}}/ds-port
Type: string
Default: 8083
Description: ONLYOFFICE Docs port:
Template: {{product}}/elasticsearch-sheme
Type: select
Choices: http, https

View File

@ -32,19 +32,20 @@ override_dh_auto_build:
cd ${SRC_PATH}/${SCRIPT_PATH}; \
bash build-frontend.sh -sp ${SRC_PATH}; \
bash build-backend.sh -sp ${SRC_PATH}; \
bash publish-backend.sh -sp ${SRC_PATH} -ar "-r linux-x64"
bash publish-backend.sh -sp ${SRC_PATH}
find ${SRC_PATH}/publish/ \
-depth -type f -regex '.*\(eslintrc.*\|npmignore\|gitignore\|gitattributes\|gitmodules\|un~\|DS_Store\)' -exec rm -f {} \;
rm -rf ${SRC_PATH}/ASC.Migration.Runner/service/runtimes/linux-arm*
rm -f ${SRC_PATH}/config/nginx/onlyoffice-login.conf
sed -i "s@var/www@var/www/${PRODUCT}@g" ${SRC_PATH}/config/nginx/*.conf
sed -i "s@var/www@var/www/${PRODUCT}@g" ${SRC_PATH}/config/nginx/includes/*.conf
if ! grep -q 'var/www/${PRODUCT}' ${SRC_PATH}/config/nginx/*.conf; then find ${SRC_PATH}/config/nginx/ -name "*.conf" -exec sed -i "s@\(var/www/\)@\1${PRODUCT}/@" {} +; fi
json -I -f ${SRC_PATH}/config/appsettings.services.json -e "this.logPath=\"/var/log/onlyoffice/${PRODUCT}\"" -e "this.socket={ 'path': '../ASC.Socket.IO/' }" \
-e "this.ssoauth={ 'path': '../ASC.SsoAuth/' }" -e "this.core={ 'products': { 'folder': '/var/www/${PRODUCT}/products', 'subfolder': 'server'} }"
find ${SRC_PATH}/config/ -type f -regex '.*\.\(test\|dev\).*' -delete
for i in ${PRODUCT} $$(ls ${CURRENT_PATH}/debian/*.install | grep -oP 'debian/\K.*' | grep -o '^[^.]*'); do \
cp ${CURRENT_PATH}/debian/source/lintian-overrides ${CURRENT_PATH}/debian/$$i.lintian-overrides; \
done
@ -60,7 +61,10 @@ override_dh_strip:
dh_strip -Xarm --no-automatic-dbgsym
override_dh_shlibdeps:
dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info -Xarm -Xkafka
dh_shlibdeps -Xarm -Xkafka -- -xlibgcc-s1 --ignore-missing-info -xlibgcc1
override_dh_builddeb:
dh_builddeb -- -Zxz
override_dh_installinit:
# don't do anything, silences lintian warnings "init.d-script-not-included-in-package"

View File

@ -7,7 +7,7 @@ privacy-breach-generic var/www/{{product}}/services/*/node_modules/*
# Ignoring node_modules errors due to lack of ability to influence them
script-not-executable var/www/{{product}}/services/*/node_modules/*
# Ignoring node_modules errors due to lack of ability to influence them
unusual-interpreter var/www/{{product}}/services/*/node_modules/*
unusual-interpreter */node_modules/*
# The use of the /var/www directory is caused by its past history as the default document root
dir-or-file-in-var-www
@ -44,3 +44,12 @@ untranslatable-debconf-templates
# We use this to protect sensitive information (ie passwords) in the config file
non-standard-file-perm
# There are instances where temporary or future code sections need to be retained for documentation or future development purposes
no-code-sections
# Ignoring errors due to lack of ability to influence them
library-not-linked-against-libc
# Some file triggers a privacy concern, specifically references an image files .png
privacy-breach-generic

View File

@ -1,6 +1,7 @@
# docker-compose tags #
PRODUCT=onlyoffice
REPO=${PRODUCT}
INSTALLATION_TYPE=ENTERPRISE
STATUS=""
DOCKER_IMAGE_PREFIX=${STATUS}docspace
DOCKER_TAG=latest
@ -34,6 +35,8 @@
# app service environment #
ENV_EXTENSION=none
APP_CORE_BASE_DOMAIN=localhost
APP_URL_PORTAL="http://localhost:8092"
APP_KNOWN_PROXIES=""
APP_KNOWN_NETWORKS=""
APP_CORE_MACHINEKEY=your_core_machinekey

View File

@ -1,212 +1,372 @@
FROM ubuntu:18.04
ARG SRC_PATH="/app/onlyoffice/src"
ARG BUILD_PATH="/var/www"
ARG DOTNET_SDK="mcr.microsoft.com/dotnet/sdk:7.0"
ARG DOTNET_RUN="mcr.microsoft.com/dotnet/aspnet:7.0"
ARG RELEASE_DATE="2016-06-21"
ARG RELEASE_DATE_SIGN=""
ARG VERSION="8.9.0.190"
ARG SOURCE_REPO_URL="deb http://static.teamlab.com.s3.amazonaws.com/repo/debian squeeze main"
FROM $DOTNET_SDK AS base
ARG SRC_PATH
ARG BUILD_PATH
ARG BUILD_DOTNET_CORE_ARGS
ENV BUILD_DOTNET_CORE_ARGS=${BUILD_DOTNET_CORE_ARGS}
ARG PROPERTY_BUILD="all"
ARG BACKEND_NODEJS_SERVICES
ENV BACKEND_NODEJS_SERVICES=${BACKEND_NODEJS_SERVICES}
ARG BACKEND_DOTNETCORE_SERVICES
ENV BACKEND_DOTNETCORE_SERVICES=${BACKEND_DOTNETCORE_SERVICES}
ARG SELF_CONTAINED=""
ARG PUBLISH_BACKEND_ARGS
ENV PUBLISH_BACKEND_ARGS=${PUBLISH_BACKEND_ARGS}
ARG PUBLISH_CNF="Release"
ARG FRONTEND_BUILD_ARGS="build"
ARG FRONTEND_DEPLOY_ARGS="deploy"
ARG DEBUG_INFO_CHECK="true"
ARG MIGRATION_CHECK="true"
ARG GIT_BRANCH="master"
ARG RELEASE_DATE="2016-06-22"
ARG DEBIAN_FRONTEND=noninteractive
ARG GIT_BRANCH="develop"
ARG PRODUCT_VERSION=0.0.0
ARG BUILD_NUMBER=0
LABEL onlyoffice.community.release-date="${RELEASE_DATE}" \
onlyoffice.community.version="${VERSION}" \
LABEL onlyoffice.appserver.release-date="${RELEASE_DATE}" \
maintainer="Ascensio System SIA <support@onlyoffice.com>"
ENV LANG=en_US.UTF-8 \
LANGUAGE=en_US:en \
LC_ALL=en_US.UTF-8
WORKDIR ${SRC_PATH}
COPY . .
RUN apt-get -y update && \
apt-get -y upgrade && \
apt-get -y dist-upgrade && \
apt-get -yq install gnupg2 ca-certificates && \
apt-get install -yq sudo locales && \
apt-get install -yq \
sudo \
locales \
git \
npm && \
locale-gen en_US.UTF-8 && \
npm install --global yarn && \
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - && \
apt-get install -y nodejs && \
rm -rf /var/lib/apt/lists/*
RUN git clone -b main/community-server https://github.com/ONLYOFFICE/document-templates ${SRC_PATH}/ASC.Files/Server/DocStore
RUN mkdir -p /app/onlyoffice/ && \
find config/ -maxdepth 1 -name "*.json" | grep -v test | grep -v dev | xargs tar -cvf config.tar && \
tar -C "/app/onlyoffice/" -xvf config.tar && \
cp config/*.config /app/onlyoffice/config/ && \
mkdir -p ${SRC_PATH}/build/deploy/client && \
mkdir -p ${SRC_PATH}/build/deploy/public && \
mkdir -p /etc/nginx/conf.d && cp -f config/nginx/onlyoffice*.conf /etc/nginx/conf.d/ && \
mkdir -p /etc/nginx/includes/ && cp -f config/nginx/includes/onlyoffice*.conf /etc/nginx/includes/ && \
sed -i "s/\"number\".*,/\"number\": \"${PRODUCT_VERSION}.${BUILD_NUMBER}\",/g" /app/onlyoffice/config/appsettings.json && \
sed -e 's/#//' -i /etc/nginx/conf.d/onlyoffice.conf && \
cd ${SRC_PATH}/build/install/common/ && \
bash build-services.sh \
-sp "${SRC_PATH}" \
-bp "${BUILD_PATH}" \
-pb "${PROPERTY_BUILD}" \
-sc "${SELF_CONTAINED}" \
-pc "${PUBLISH_CNF}" \
-yb "${FRONTEND_BUILD_ARGS}" \
-yd "${FRONTEND_DEPLOY_ARGS}" \
-dc "${DEBUG_INFO_CHECK}" \
-mc "${MIGRATION_CHECK}" &&\
rm -rf ${SRC_PATH}/common/* && \
rm -rf ${SRC_PATH}/web/ASC.Web.Core/* && \
rm -rf ${SRC_PATH}/web/ASC.Web.Studio/* && \
rm -rf ${SRC_PATH}/products/ASC.Files/Service/* && \
rm -rf ${SRC_PATH}/products/ASC.Files/Server/* && \
rm -rf ${SRC_PATH}/products/ASC.People/Server/*
FROM $DOTNET_RUN as dotnetrun
ARG BUILD_PATH
ARG SRC_PATH
ENV BUILD_PATH=${BUILD_PATH}
ENV SRC_PATH=${SRC_PATH}
# add defualt user and group for no-root run
RUN mkdir -p /var/log/onlyoffice && \
mkdir -p /app/onlyoffice/data && \
addgroup --system --gid 107 onlyoffice && \
adduser -uid 104 --quiet --home /var/www/onlyoffice --system --gid 107 onlyoffice && \
addgroup --system --gid 104 elasticsearch && \
adduser -uid 103 --quiet --home /nonexistent --system --gid 104 elasticsearch && \
locale-gen en_US.UTF-8 && \
chown onlyoffice:onlyoffice /app/onlyoffice -R && \
chown onlyoffice:onlyoffice /var/log -R && \
chown onlyoffice:onlyoffice /var/www -R && \
apt-get -y update && \
apt-get install -yq software-properties-common wget curl cron rsyslog && \
curl -OL http://dev.mysql.com/get/mysql-apt-config_0.8.15-1_all.deb && \
echo "mysql-apt-config mysql-apt-config/repo-codename select bionic" | sudo debconf-set-selections && \
echo "mysql-apt-config mysql-apt-config/repo-distro select ubuntu" | sudo debconf-set-selections && \
echo "mysql-apt-config mysql-apt-config/select-server select mysql-8.0" | sudo debconf-set-selections && \
DEBIAN_FRONTEND=noninteractive dpkg -i mysql-apt-config_0.8.15-1_all.deb && \
rm -f mysql-apt-config_0.8.15-1_all.deb && \
wget http://nginx.org/keys/nginx_signing.key && \
apt-key add nginx_signing.key && \
echo "deb http://nginx.org/packages/mainline/ubuntu/ bionic nginx" >> /etc/apt/sources.list.d/nginx.list && \
echo "deb-src http://nginx.org/packages/mainline/ubuntu/ bionic nginx" >> /etc/apt/sources.list.d/nginx.list && \
apt-get install -yq openjdk-8-jre-headless && \
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add - && \
apt-get install -yq apt-transport-https && \
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF && \
echo "deb https://download.mono-project.com/repo/ubuntu stable-bionic main" | tee /etc/apt/sources.list.d/mono-official.list && \
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-7.x.list && \
apt-get install -yq \
python3-pip \
nano \
curl \
vim \
libgdiplus && \
pip3 install --upgrade jsonpath-ng multipledispatch netaddr netifaces && \
rm -rf /var/lib/apt/lists/*
COPY --from=base --chown=onlyoffice:onlyoffice /app/onlyoffice/config/* /app/onlyoffice/config/
#USER onlyoffice
EXPOSE 5050
ENTRYPOINT ["python3", "docker-entrypoint.py"]
FROM node:18.12.1-slim as noderun
ARG BUILD_PATH
ARG SRC_PATH
ENV BUILD_PATH=${BUILD_PATH}
ENV SRC_PATH=${SRC_PATH}
RUN mkdir -p /var/log/onlyoffice && \
mkdir -p /app/onlyoffice/data && \
addgroup --system --gid 107 onlyoffice && \
adduser -uid 104 --quiet --home /var/www/onlyoffice --system --gid 107 onlyoffice && \
chown onlyoffice:onlyoffice /app/onlyoffice -R && \
chown onlyoffice:onlyoffice /var/log -R && \
chown onlyoffice:onlyoffice /var/www -R && \
apt-get -y update && \
apt-get install -yq elasticsearch=7.4.0 && \
add-apt-repository -y ppa:certbot/certbot && \
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - && \
apt-get install -y nodejs && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list && \
wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb && \
dpkg -i packages-microsoft-prod.deb && \
apt-get -y update && \
apt-get install -yq nginx && \
cd ~ && \
wget https://downloads.apache.org/kafka/2.5.0/kafka_2.12-2.5.0.tgz && \
tar xzf kafka_2.12-2.5.0.tgz && \
rm kafka_2.12-2.5.0.tgz && \
echo "#!/bin/sh\nexit 0" > /usr/sbin/policy-rc.d && \
apt-get install -yq libgdiplus \
python-certbot-nginx \
htop \
nano \
dnsutils \
python3-pip \
multiarch-support \
iproute2 \
ffmpeg \
jq \
git \
yarn \
dotnet-sdk-3.1 \
supervisor \
mysql-client \
mysql-server
apt-get install -yq \
nano \
curl \
vim \
python3-pip && \
pip3 install --upgrade jsonpath-ng multipledispatch netaddr netifaces && \
rm -rf /var/lib/apt/lists/*
RUN git clone https://github.com/ONLYOFFICE/AppServer.git /app/onlyoffice/src/ && \
cd /app/onlyoffice/src/ && \
git checkout ${GIT_BRANCH} && \
git pull
COPY --from=base --chown=onlyoffice:onlyoffice /app/onlyoffice/config/* /app/onlyoffice/config/
RUN cd /app/onlyoffice/src/ && \
yarn install --cwd web/ASC.Web.Components --frozen-lockfile > build/ASC.Web.Components.log && \
yarn pack --cwd web/ASC.Web.Components
RUN cd /app/onlyoffice/src/ && \
component=$(ls web/ASC.Web.Components/asc-web-components-v1.*.tgz) && \
yarn remove asc-web-components --cwd web/ASC.Web.Common --peer && \
yarn add file:../../$component --cwd web/ASC.Web.Common --cache-folder ../../yarn --peer && \
yarn install --cwd web/ASC.Web.Common --frozen-lockfile > build/ASC.Web.Common.log && \
yarn pack --cwd web/ASC.Web.Common
EXPOSE 5050
ENTRYPOINT ["python3", "docker-entrypoint.py"]
RUN cd /app/onlyoffice/src/ && \
npm run build:storybook --prefix web/ASC.Web.Components && \
mkdir -p /var/www/story/ && \
cp -Rf web/ASC.Web.Components/storybook-static/* /var/www/story/
## Nginx image ##
FROM nginx AS proxy
ARG SRC_PATH
ARG BUILD_PATH
ARG COUNT_WORKER_CONNECTIONS=1024
ENV DNS_NAMESERVER=127.0.0.11 \
COUNT_WORKER_CONNECTIONS=$COUNT_WORKER_CONNECTIONS \
MAP_HASH_BUCKET_SIZE=""
RUN cd /app/onlyoffice/src/ && \
component=$(ls web/ASC.Web.Components/asc-web-components-v1.*.tgz) && \
common=$(ls web/ASC.Web.Common/asc-web-common-v1.*.tgz) && \
yarn remove asc-web-components asc-web-common --cwd web/ASC.Web.Client && \
yarn add ../../$component --cwd web/ASC.Web.Client --cache-folder ../../yarn && \
yarn add ../../$common --cwd web/ASC.Web.Client --cache-folder ../../yarn && \
yarn install --cwd web/ASC.Web.Client --frozen-lockfile || (cd web/ASC.Web.Client && npm i && cd ../../) && \
npm run build --prefix web/ASC.Web.Client && \
rm -rf /var/www/studio/client/* && \
mkdir -p /var/www/studio/client && \
cp -rf web/ASC.Web.Client/build/* /var/www/studio/client
RUN apt-get -y update && \
apt-get install -yq vim && \
rm -rf /var/lib/apt/lists/* && \
rm -rf /usr/share/nginx/html/*
RUN cd /app/onlyoffice/src/ && \
component=$(ls web/ASC.Web.Components/asc-web-components-v1.*.tgz) && \
common=$(ls web/ASC.Web.Common/asc-web-common-v1.*.tgz) && \
yarn remove asc-web-components asc-web-common --cwd products/ASC.Files/Client && \
yarn add ../../../$component --cwd products/ASC.Files/Client --cache-folder ../../../yarn && \
yarn add ../../../$common --cwd products/ASC.Files/Client --cache-folder ../../../yarn && \
yarn install --cwd products/ASC.Files/Client --frozen-lockfile || (cd products/ASC.Files/Client && npm i && cd ../../../) && \
npm run build --prefix products/ASC.Files/Client && \
mkdir -p /var/www/products/ASC.Files/client && \
cp -Rf products/ASC.Files/Client/build/* /var/www/products/ASC.Files/client && \
mkdir -p /var/www/products/ASC.Files/client/products/files
# copy static services files and config values
COPY --from=base /etc/nginx/conf.d /etc/nginx/conf.d
COPY --from=base /etc/nginx/includes /etc/nginx/includes
COPY --from=base ${SRC_PATH}/build/deploy/client ${BUILD_PATH}/client
COPY --from=base ${SRC_PATH}/build/deploy/public ${BUILD_PATH}/public
COPY --from=base ${SRC_PATH}/build/install/docker/config/nginx/templates/upstream.conf.template /etc/nginx/templates/upstream.conf.template
COPY --from=base ${SRC_PATH}/build/install/docker/config/nginx/templates/nginx.conf.template /etc/nginx/nginx.conf.template
COPY --from=base ${SRC_PATH}/build/install/docker/prepare-nginx-proxy.sh /docker-entrypoint.d/prepare-nginx-proxy.sh
RUN cd /app/onlyoffice/src/ && \
component=$(ls web/ASC.Web.Components/asc-web-components-v1.*.tgz) && \
common=$(ls web/ASC.Web.Common/asc-web-common-v1.*.tgz) && \
yarn remove asc-web-components asc-web-common --cwd products/ASC.People/Client && \
yarn add ../../../$component --cwd products/ASC.People/Client --cache-folder ../../../yarn && \
yarn add ../../../$common --cwd products/ASC.People/Client --cache-folder ../../../yarn && \
yarn install --cwd products/ASC.People/Client --frozen-lockfile || (cd products/ASC.People/Client && npm i && cd ../../../) && \
npm run build --prefix products/ASC.People/Client && \
mkdir -p /var/www/products/ASC.People/client && \
cp -Rf products/ASC.People/Client/build/* /var/www/products/ASC.People/client && \
mkdir -p /var/www/products/ASC.People/client/products/people
# add defualt user and group for no-root run
RUN chown nginx:nginx /etc/nginx/* -R && \
chown nginx:nginx /docker-entrypoint.d/* && \
# changes for upstream configure
sed -i 's/127.0.0.1:5010/$service_api_system/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5012/$service_backup/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5007/$service_files/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5004/$service_people_server/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5000/$service_api/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5003/$service_studio/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:9899/$service_socket/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:9834/$service_sso/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5013/$service_doceditor/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5011/$service_login/' /etc/nginx/conf.d/onlyoffice.conf && \
if [[ -z "${SERVICE_CLIENT}" ]] ; then sed -i 's/127.0.0.1:5001/$service_client/' /etc/nginx/conf.d/onlyoffice.conf; fi && \
sed -i 's/127.0.0.1:5033/$service_healthchecks/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/$public_root/\/var\/www\/public\//' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/172.*/$document_server;/' /etc/nginx/conf.d/onlyoffice.conf
RUN cd /app/onlyoffice/src/ && \
rm -f /etc/nginx/conf.d/* && \
mkdir -p /var/www/public/ && cp -f public/* /var/www/public/ && \
mkdir -p /app/onlyoffice/config/ && cp -rf config/* /app/onlyoffice/config/ && \
cp -f config/nginx/onlyoffice*.conf /etc/nginx/conf.d/ && \
mkdir -p /etc/nginx/includes/ && cp -f config/nginx/includes/onlyoffice*.conf /etc/nginx/includes/ && \
sed -e 's/#//' -i /etc/nginx/conf.d/onlyoffice.conf && \
dotnet restore ASC.Web.slnf && \
dotnet build -r linux-x64 ASC.Web.slnf && \
cd products/ASC.People/Server && \
dotnet -d publish --no-build --self-contained -r linux-x64 -o /var/www/products/ASC.People/server && \
cd ../../../ && \
cd products/ASC.Files/Server && \
dotnet -d publish --no-build --self-contained -r linux-x64 -o /var/www/products/ASC.Files/server && \
cp -avrf DocStore /var/www/products/ASC.Files/server/ && \
cd ../../../ && \
cd products/ASC.Files/Service && \
dotnet -d publish --no-build --self-contained -r linux-x64 -o /var/www/products/ASC.Files/service && \
cd ../../../ && \
cd web/ASC.Web.Api && \
dotnet -d publish --no-build --self-contained -r linux-x64 -o /var/www/studio/api && \
cd ../../ && \
cd web/ASC.Web.Studio && \
dotnet -d publish --no-build --self-contained -r linux-x64 -o /var/www/studio/server && \
cd ../../ && \
cd common/services/ASC.Data.Backup && \
dotnet -d publish --no-build --self-contained -r linux-x64 -o /var/www/services/backup && \
cd ../../../ && \
cd common/services/ASC.Notify && \
dotnet -d publish --no-build --self-contained -r linux-x64 -o /var/www/services/notify && \
cd ../../../ && \
cd common/services/ASC.ApiSystem && \
dotnet -d publish --no-build --self-contained -r linux-x64 -o /var/www/services/apisystem && \
cd ../../../ && \
cd common/services/ASC.Thumbnails.Svc && \
dotnet -d publish --no-build --self-contained -r linux-x64 -o /services/thumb/service && \
cd ../../../ && \
yarn install --cwd common/ASC.Thumbnails --frozen-lockfile && \
mkdir -p /var/www/services/thumb/client && cp -Rf common/ASC.Thumbnails/* /var/www/services/thumb/client && \
cd common/services/ASC.UrlShortener.Svc && \
dotnet -d publish --no-build --self-contained -r linux-x64 -o /services/urlshortener/service && \
cd ../../../ && \
yarn install --cwd common/ASC.UrlShortener --frozen-lockfile && \
mkdir -p /var/www/services/urlshortener/client && cp -Rf common/ASC.UrlShortener/* /var/www/services/urlshortener/client && \
cd common/services/ASC.Studio.Notify && \
dotnet -d publish --no-build --self-contained -r linux-x64 -o /var/www/services/studio.notify
## Doceditor ##
FROM noderun as doceditor
WORKDIR ${BUILD_PATH}/services/ASC.Editors/editor
COPY config/mysql/conf.d/mysql.cnf /etc/mysql/conf.d/mysql.cnf
COPY config/supervisor/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-entrypoint.py .
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/deploy/editor/ .
COPY config/createdb.sql /app/onlyoffice/createdb.sql
COPY config/onlyoffice.sql /app/onlyoffice/onlyoffice.sql
COPY config/onlyoffice.data.sql /app/onlyoffice/onlyoffice.data.sql
COPY config/onlyoffice.resources.sql /app/onlyoffice/onlyoffice.resources.sql
CMD ["server.js", "ASC.Editors"]
RUN sed -i 's/Server=.*;Port=/Server=127.0.0.1;Port=/' /app/onlyoffice/config/appsettings.test.json
## Login ##
FROM noderun as login
WORKDIR ${BUILD_PATH}/services/ASC.Login/login
RUN mkdir -p /var/mysqld/ && \
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld /var/mysqld/ && \
sudo -u mysql bash -c "/usr/bin/pidproxy /var/mysqld/mysqld.pid /usr/bin/mysqld_safe --pid-file=/var/mysqld/mysqld.pid &" && \
sleep 5s && \
mysql -e "CREATE DATABASE IF NOT EXISTS onlyoffice CHARACTER SET utf8 COLLATE 'utf8_general_ci'" && \
mysql -D "onlyoffice" < /app/onlyoffice/createdb.sql && \
mysql -D "onlyoffice" < /app/onlyoffice/onlyoffice.sql && \
mysql -D "onlyoffice" < /app/onlyoffice/onlyoffice.data.sql && \
mysql -D "onlyoffice" < /app/onlyoffice/onlyoffice.resources.sql && \
mysql -D "onlyoffice" -e 'CREATE USER IF NOT EXISTS "onlyoffice_user"@"localhost" IDENTIFIED WITH mysql_native_password BY "onlyoffice_pass";' && \
mysql -D "onlyoffice" -e 'GRANT ALL PRIVILEGES ON *.* TO 'onlyoffice_user'@'localhost';' && \
killall -u mysql -n mysql
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-entrypoint.py .
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/deploy/login/ .
RUN rm -rf /var/lib/apt/lists/*
CMD ["server.js", "ASC.Login"]
VOLUME /var/lib/mysql
## ASC.Data.Backup.BackgroundTasks ##
FROM dotnetrun AS backup_background
WORKDIR ${BUILD_PATH}/services/ASC.Data.Backup.BackgroundTasks/service/
EXPOSE 80 443 8092 8081
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-entrypoint.py .
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Data.Backup.BackgroundTasks/service/ .
ENTRYPOINT ["/usr/bin/supervisord", "--"]
CMD ["ASC.Data.Backup.BackgroundTasks.dll", "ASC.Data.Backup.BackgroundTasks", "core:eventBus:subscriptionClientName=asc_event_bus_backup_queue"]
# ASC.ApiSystem ##
FROM dotnetrun AS api_system
WORKDIR ${BUILD_PATH}/services/ASC.ApiSystem/service/
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-entrypoint.py .
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.ApiSystem/service/ .
CMD ["ASC.ApiSystem.dll", "ASC.ApiSystem"]
## ASC.ClearEvents ##
FROM dotnetrun AS clear-events
WORKDIR ${BUILD_PATH}/services/ASC.ClearEvents/service/
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-entrypoint.py .
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.ClearEvents/service/ .
CMD ["ASC.ClearEvents.dll", "ASC.ClearEvents"]
## ASC.Data.Backup ##
FROM dotnetrun AS backup
WORKDIR ${BUILD_PATH}/services/ASC.Data.Backup/service/
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-entrypoint.py .
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Data.Backup/service/ .
CMD ["ASC.Data.Backup.dll", "ASC.Data.Backup"]
## ASC.Files ##
FROM dotnetrun AS files
WORKDIR ${BUILD_PATH}/products/ASC.Files/server/
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-entrypoint.py .
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Files/service/ .
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/ASC.Files/Server/DocStore .
CMD ["ASC.Files.dll", "ASC.Files"]
## ASC.Files.Service ##
FROM dotnetrun AS files_services
ENV LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64
WORKDIR ${BUILD_PATH}/products/ASC.Files/service/
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-entrypoint.py .
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Files.Service/service/ .
COPY --from=linuxserver/ffmpeg:latest --chown=onlyoffice:onlyoffice /usr/local/bin/ /usr/local/bin/
CMD ["ASC.Files.Service.dll", "ASC.Files.Service", "core:eventBus:subscriptionClientName=asc_event_bus_files_service_queue"]
## ASC.Notify ##
FROM dotnetrun AS notify
WORKDIR ${BUILD_PATH}/services/ASC.Notify/service/
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-entrypoint.py .
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Notify/service/ .
CMD ["ASC.Notify.dll", "ASC.Notify", "core:eventBus:subscriptionClientName=asc_event_bus_notify_queue"]
## ASC.People ##
FROM dotnetrun AS people_server
WORKDIR ${BUILD_PATH}/products/ASC.People/server/
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-entrypoint.py .
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.People/service/ .
CMD ["ASC.People.dll", "ASC.People"]
## ASC.Socket.IO ##
FROM noderun AS socket
WORKDIR ${BUILD_PATH}/services/ASC.Socket.IO/service/
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-entrypoint.py .
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Socket.IO/service/ .
CMD ["server.js", "ASC.Socket.IO"]
## ASC.SsoAuth ##
FROM noderun AS ssoauth
WORKDIR ${BUILD_PATH}/services/ASC.SsoAuth/service/
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-entrypoint.py .
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.SsoAuth/service/ .
CMD ["app.js", "ASC.SsoAuth"]
## ASC.Studio.Notify ##
FROM dotnetrun AS studio_notify
WORKDIR ${BUILD_PATH}/services/ASC.Studio.Notify/service/
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-entrypoint.py .
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Studio.Notify/service/ .
CMD ["ASC.Studio.Notify.dll", "ASC.Studio.Notify"]
## ASC.Web.Api ##
FROM dotnetrun AS api
WORKDIR ${BUILD_PATH}/studio/ASC.Web.Api/
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-entrypoint.py .
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Web.Api/service/ .
CMD ["ASC.Web.Api.dll", "ASC.Web.Api"]
## ASC.Web.Studio ##
FROM dotnetrun AS studio
WORKDIR ${BUILD_PATH}/studio/ASC.Web.Studio/
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-entrypoint.py .
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Web.Studio/service/ .
CMD ["ASC.Web.Studio.dll", "ASC.Web.Studio"]
## ASC.Web.HealthChecks.UI ##
FROM dotnetrun AS healthchecks
WORKDIR ${BUILD_PATH}/services/ASC.Web.HealthChecks.UI/service
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-healthchecks-entrypoint.sh .
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Web.HealthChecks.UI/service/ .
ENTRYPOINT ["./docker-healthchecks-entrypoint.sh"]
CMD ["ASC.Web.HealthChecks.UI.dll", "ASC.Web.HealthChecks.UI"]
## ASC.Migration.Runner ##
FROM $DOTNET_RUN AS onlyoffice-migration-runner
ARG BUILD_PATH
ARG SRC_PATH
ENV BUILD_PATH=${BUILD_PATH}
ENV SRC_PATH=${SRC_PATH}
WORKDIR ${BUILD_PATH}/services/ASC.Migration.Runner/
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/docker-migration-entrypoint.sh .
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Migration.Runner/service/ .
ENTRYPOINT ["./docker-migration-entrypoint.sh"]
## image for k8s bin-share ##
FROM busybox:latest AS bin_share
ARG BUILD_PATH
ARG SRC_PATH
ENV BUILD_PATH=${BUILD_PATH}
ENV SRC_PATH=${SRC_PATH}
RUN mkdir -p /app/appserver/ASC.Files/server && \
mkdir -p /app/appserver/ASC.People/server/ && \
mkdir -p /app/appserver/ASC.CRM/server/ && \
mkdir -p /app/appserver/ASC.Projects/server/ && \
mkdir -p /app/appserver/ASC.Calendar/server/ && \
mkdir -p /app/appserver/ASC.Mail/server/ && \
addgroup --system --gid 107 onlyoffice && \
adduser -u 104 onlyoffice --home /var/www/onlyoffice --system -G onlyoffice
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/bin-share-docker-entrypoint.sh /app/docker-entrypoint.sh
COPY --from=base /var/www/services/ASC.Files/service/ /app/appserver/ASC.Files/server/
COPY --from=base /var/www/services/ASC.People/service/ /app/appserver/ASC.People/server/
ENTRYPOINT ["./app/docker-entrypoint.sh"]
## image for k8s wait-bin-share ##
FROM busybox:latest AS wait_bin_share
ARG BUILD_PATH
ARG SRC_PATH
ENV BUILD_PATH=${BUILD_PATH}
ENV SRC_PATH=${SRC_PATH}
RUN mkdir /app
COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/install/docker/wait-bin-share-docker-entrypoint.sh /app/docker-entrypoint.sh
ENTRYPOINT ["./app/docker-entrypoint.sh"]

View File

@ -1,336 +0,0 @@
ARG SRC_PATH="/app/onlyoffice/src"
ARG BUILD_PATH="/var/www"
ARG DOTNET_SDK="mcr.microsoft.com/dotnet/sdk:7.0"
ARG DOTNET_RUN="mcr.microsoft.com/dotnet/aspnet:7.0"
FROM $DOTNET_SDK AS base
ARG RELEASE_DATE="2022-10-09"
ARG DEBIAN_FRONTEND=noninteractive
ARG PRODUCT_VERSION=0.0.0
ARG BUILD_NUMBER=0
ARG GIT_BRANCH="develop"
ARG SRC_PATH
ARG BUILD_PATH
ARG BUILD_ARGS="build"
ARG DEPLOY_ARGS="deploy"
ARG DEBUG_INFO="true"
ARG PUBLISH_CNF="Debug"
LABEL onlyoffice.docspace.release-date="${RELEASE_DATE}" \
maintainer="Ascensio System SIA <support@onlyoffice.com>"
ENV LANG=en_US.UTF-8 \
LANGUAGE=en_US:en \
LC_ALL=en_US.UTF-8
RUN apt-get -y update && \
apt-get install -yq \
sudo \
locales \
git \
npm && \
locale-gen en_US.UTF-8 && \
npm install --global yarn && \
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - && \
apt-get install -y nodejs && \
rm -rf /var/lib/apt/lists/*
ADD https://api.github.com/repos/ONLYOFFICE/DocSpace/git/refs/heads/${GIT_BRANCH} version.json
RUN echo ${GIT_BRANCH} && \
git clone --recurse-submodules -b ${GIT_BRANCH} https://github.com/ONLYOFFICE/DocSpace.git ${SRC_PATH}
RUN cd ${SRC_PATH} && \
mkdir -p /app/onlyoffice/ && \
find config/ -maxdepth 1 -name "*.json" | grep -v test | xargs tar -cvf config.tar && \
tar -C "/app/onlyoffice/" -xvf config.tar && \
cp config/*.config /app/onlyoffice/config/ && \
mkdir -p /etc/nginx/conf.d && cp -f config/nginx/onlyoffice.conf /etc/nginx/conf.d/ && \
mkdir -p /etc/nginx/includes/ && cp -f config/nginx/includes/onlyoffice*.conf /etc/nginx/includes/ && \
sed -i "s/\"number\".*,/\"number\": \"${PRODUCT_VERSION}.${BUILD_NUMBER}\",/g" /app/onlyoffice/config/appsettings.json && \
sed -e 's/#//' -i /etc/nginx/conf.d/onlyoffice.conf && \
cd ${SRC_PATH}/build/install/common/ && \
bash build-backend.sh -sp "${SRC_PATH}" && \
bash publish-backend.sh -pc "${PUBLISH_CNF}" -sp "${SRC_PATH}" -bp "${BUILD_PATH}" && \
cp -rf ${SRC_PATH}/products/ASC.Files/Server/DocStore ${BUILD_PATH}/products/ASC.Files/server/ && \
rm -rf ${SRC_PATH}/common/* && \
rm -rf ${SRC_PATH}/web/ASC.Web.Core/* && \
rm -rf ${SRC_PATH}/web/ASC.Web.Studio/* && \
rm -rf ${SRC_PATH}/products/ASC.Files/Server/* && \
rm -rf ${SRC_PATH}/products/ASC.Files/Service/* && \
rm -rf ${SRC_PATH}/products/ASC.People/Server/*
COPY config/mysql/conf.d/mysql.cnf /etc/mysql/conf.d/mysql.cnf
FROM $DOTNET_RUN as dotnetrun
ARG BUILD_PATH
ARG SRC_PATH
ENV BUILD_PATH=${BUILD_PATH}
ENV SRC_PATH=${SRC_PATH}
# add defualt user and group for no-root run
RUN mkdir -p /var/log/onlyoffice && \
mkdir -p /app/onlyoffice/data && \
addgroup --system --gid 107 onlyoffice && \
adduser -uid 104 --quiet --home /var/www/onlyoffice --system --gid 107 onlyoffice && \
chown onlyoffice:onlyoffice /app/onlyoffice -R && \
chown onlyoffice:onlyoffice /var/log -R && \
chown onlyoffice:onlyoffice /var/www -R && \
apt-get -y update && \
apt-get install -yq \
sudo \
nano \
curl \
vim \
python3-pip \
libgdiplus && \
pip3 install --upgrade jsonpath-ng multipledispatch netaddr netifaces && \
rm -rf /var/lib/apt/lists/*
COPY --from=base --chown=onlyoffice:onlyoffice /app/onlyoffice/config/* /app/onlyoffice/config/
#USER onlyoffice
EXPOSE 5050
ENTRYPOINT ["python3", "docker-entrypoint.py"]
FROM node:18.12.1-slim as noderun
ARG BUILD_PATH
ARG SRC_PATH
ENV BUILD_PATH=${BUILD_PATH}
ENV SRC_PATH=${SRC_PATH}
RUN mkdir -p /var/log/onlyoffice && \
mkdir -p /app/onlyoffice/data && \
addgroup --system --gid 107 onlyoffice && \
adduser -uid 104 --quiet --home /var/www/onlyoffice --system --gid 107 onlyoffice && \
chown onlyoffice:onlyoffice /app/onlyoffice -R && \
chown onlyoffice:onlyoffice /var/log -R && \
chown onlyoffice:onlyoffice /var/www -R && \
apt-get -y update && \
apt-get install -yq \
sudo \
nano \
curl \
vim \
python3-pip && \
pip3 install --upgrade jsonpath-ng multipledispatch netaddr netifaces && \
rm -rf /var/lib/apt/lists/*
COPY --from=base --chown=onlyoffice:onlyoffice /app/onlyoffice/config/* /app/onlyoffice/config/
EXPOSE 5050
ENTRYPOINT ["python3", "docker-entrypoint.py"]
## Nginx image ##
FROM nginx AS proxy
ARG SRC_PATH
ARG BUILD_PATH
ARG COUNT_WORKER_CONNECTIONS=1024
ENV DNS_NAMESERVER=127.0.0.11 \
COUNT_WORKER_CONNECTIONS=$COUNT_WORKER_CONNECTIONS \
MAP_HASH_BUCKET_SIZE=""
RUN apt-get -y update && \
apt-get install -yq vim \
dos2unix && \
rm -rf /var/lib/apt/lists/* && \
rm -rf /usr/share/nginx/html/*
# copy static services files and config values
COPY --from=base /etc/nginx/conf.d /etc/nginx/conf.d
COPY --from=base /etc/nginx/includes /etc/nginx/includes
COPY /config/nginx/templates/upstream.conf.template /etc/nginx/templates/upstream.conf.template
COPY /config/nginx/templates/nginx.conf.template /etc/nginx/nginx.conf.template
COPY prepare-nginx-proxy.sh /docker-entrypoint.d/prepare-nginx-proxy.sh
RUN dos2unix /docker-entrypoint.d/prepare-nginx-proxy.sh && \
apt-get --purge remove -y dos2unix && \
rm -rf /var/lib/apt/lists/*
# add defualt user and group for no-root run
RUN chown nginx:nginx /etc/nginx/* -R && \
chown nginx:nginx /docker-entrypoint.d/* && \
# changes for upstream configure
# sed -i 's/127.0.0.1:5010/$service_api_system/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5012/$service_backup/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5007/$service_files/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5004/$service_people_server/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5000/$service_api/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5003/$service_studio/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:9899/$service_socket/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:9834/$service_sso/' /etc/nginx/conf.d/onlyoffice.conf && \
# sed -i 's/127.0.0.1:9999/$service_urlshortener/' /etc/nginx/conf.d/onlyoffice.conf && \
# sed -i 's/127.0.0.1:5034/$service_migration/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5013/$service_doceditor/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5011/$service_login/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5001/$service_client/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5033/$service_healthchecks/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/$public_root/\/var\/www\/public\//' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/172.*/$document_server;/' /etc/nginx/conf.d/onlyoffice.conf
## ASC.Data.Backup.BackgroundTasks ##
FROM dotnetrun AS backup_background
WORKDIR ${BUILD_PATH}/services/ASC.Data.Backup.BackgroundTasks/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Data.Backup.BackgroundTasks/service/ .
CMD ["ASC.Data.Backup.BackgroundTasks.dll", "ASC.Data.Backup.BackgroundTasks"]
# ASC.ApiSystem ##
# FROM dotnetrun AS api_system
# WORKDIR ${BUILD_PATH}/services/ASC.ApiSystem/
# COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
# COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.ApiSystem/service/ .
# CMD ["ASC.ApiSystem.dll", "ASC.ApiSystem"]
## ASC.ClearEvents ##
# FROM dotnetrun AS clear-events
# WORKDIR ${BUILD_PATH}/services/ASC.ClearEvents/
# COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
# COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.ClearEvents/service/ .
# CMD ["ASC.ClearEvents.dll", "ASC.ClearEvents"]
## ASC.Migration ##
# FROM dotnetrun AS migration
# WORKDIR ${BUILD_PATH}/services/ASC.Migration/
# COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
# COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Migration/service/ .
# CMD ["ASC.Migration.dll", "ASC.Migration"]
## ASC.Data.Backup ##
FROM dotnetrun AS backup
WORKDIR ${BUILD_PATH}/services/ASC.Data.Backup/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Data.Backup/service/ .
CMD ["ASC.Data.Backup.dll", "ASC.Data.Backup"]
## ASC.Files ##
FROM dotnetrun AS files
WORKDIR ${BUILD_PATH}/products/ASC.Files/server/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/products/ASC.Files/server/ .
CMD ["ASC.Files.dll", "ASC.Files"]
## ASC.Files.Service ##
FROM dotnetrun AS files_services
RUN apt-get -y update && \
apt-get install -yq ffmpeg
WORKDIR ${BUILD_PATH}/products/ASC.Files/service/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Files.Service/service/ .
CMD ["ASC.Files.Service.dll", "ASC.Files.Service"]
## ASC.Notify ##
# FROM dotnetrun AS notify
# WORKDIR ${BUILD_PATH}/services/ASC.Notify/service
# COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
# COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Notify/service/ .
# CMD ["ASC.Notify.dll", "ASC.Notify"]
## ASC.People ##
FROM dotnetrun AS people_server
WORKDIR ${BUILD_PATH}/products/ASC.People/server/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/products/ASC.People/server/ .
CMD ["ASC.People.dll", "ASC.People"]
## ASC.Socket.IO ##
FROM noderun AS socket
WORKDIR ${BUILD_PATH}/services/ASC.Socket.IO/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Socket.IO/service/ .
CMD ["server.js", "ASC.Socket.IO"]
## ASC.SsoAuth ##
FROM noderun AS ssoauth
WORKDIR ${BUILD_PATH}/services/ASC.SsoAuth/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.SsoAuth/service/ .
CMD ["app.js", "ASC.SsoAuth"]
## ASC.Studio.Notify ##
FROM dotnetrun AS studio_notify
WORKDIR ${BUILD_PATH}/services/ASC.Studio.Notify/service/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Studio.Notify/service/ .
CMD ["ASC.Studio.Notify.dll", "ASC.Studio.Notify"]
## ASC.TelegramService ##
# FROM dotnetrun AS telegram_service
# WORKDIR ${BUILD_PATH}/services/ASC.TelegramService/
# COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
# COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.TelegramService/service/ .
# CMD ["ASC.TelegramService.dll", "ASC.TelegramService"]
## ASC.UrlShortener ##
# FROM noderun AS urlshortener
# WORKDIR ${BUILD_PATH}/services/ASC.UrlShortener/service/
# COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
# COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.UrlShortener/service/ .
# CMD ["index.js", "ASC.UrlShortener"]
## ASC.Web.Api ##
FROM dotnetrun AS api
WORKDIR ${BUILD_PATH}/studio/ASC.Web.Api/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Web.Api/service/ .
CMD ["ASC.Web.Api.dll", "ASC.Web.Api"]
## ASC.Web.Studio ##
FROM dotnetrun AS studio
WORKDIR ${BUILD_PATH}/studio/ASC.Web.Studio/
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Web.Studio/service/ .
CMD ["ASC.Web.Studio.dll", "ASC.Web.Studio"]
## ASC.Migration.Runner ##
FROM $DOTNET_RUN AS onlyoffice-migration-runner
ARG BUILD_PATH
ARG SRC_PATH
ENV BUILD_PATH=${BUILD_PATH}
ENV SRC_PATH=${SRC_PATH}
WORKDIR ${BUILD_PATH}/services/ASC.Migration.Runner/
RUN apt-get update && \
apt-get install -yq dos2unix
COPY docker-migration-entrypoint.sh docker-migration-entrypoint.sh
RUN dos2unix docker-migration-entrypoint.sh && \
apt-get --purge remove -y dos2unix && \
rm -rf /var/lib/apt/lists/*
COPY --from=base ${SRC_PATH}/ASC.Migration.Runner/service/ .
ENTRYPOINT ["./docker-migration-entrypoint.sh"]

View File

@ -0,0 +1,115 @@
ARG SRC_PATH="/app/onlyoffice/src"
ARG BUILD_PATH="/var/www"
ARG DOTNET_SDK="mcr.microsoft.com/dotnet/sdk:7.0"
ARG DOTNET_RUN="mcr.microsoft.com/dotnet/aspnet:7.0"
FROM alpine:latest AS base
ARG SRC_PATH
ARG BUILD_PATH
WORKDIR ${SRC_PATH}
COPY /config ./config
RUN find config/ -maxdepth 1 -name "*.json" | grep -v test | grep -v dev | xargs tar -cvf config.tar && \
tar -C "/app/onlyoffice/" -xvf config.tar && \
cp config/*.config /app/onlyoffice/config/ && \
mkdir -p /etc/nginx/conf.d && cp -f config/nginx/onlyoffice*.conf /etc/nginx/conf.d/ && \
mkdir -p /etc/nginx/includes/ && cp -f config/nginx/includes/onlyoffice*.conf /etc/nginx/includes/ && \
sed -i "s/\"number\".*,/\"number\": \"${PRODUCT_VERSION}.${BUILD_NUMBER}\",/g" /app/onlyoffice/config/appsettings.json && \
sed -e 's/#//' -i /etc/nginx/conf.d/onlyoffice.conf
FROM $DOTNET_RUN as dotnetrun
ARG BUILD_PATH
ARG SRC_PATH
ENV BUILD_PATH=${BUILD_PATH}
ENV SRC_PATH=${SRC_PATH}
# add defualt user and group for no-root run
RUN mkdir -p /var/log/onlyoffice && \
mkdir -p /app/onlyoffice/data && \
addgroup --system --gid 107 onlyoffice && \
adduser -uid 104 --quiet --home /var/www/onlyoffice --system --gid 107 onlyoffice && \
chown onlyoffice:onlyoffice /app/onlyoffice -R && \
chown onlyoffice:onlyoffice /var/log -R && \
chown onlyoffice:onlyoffice /var/www -R && \
apt-get -y update && \
apt-get install -yq \
python3-pip \
nano \
curl \
vim \
libgdiplus && \
pip3 install --upgrade jsonpath-ng multipledispatch netaddr netifaces && \
rm -rf /var/lib/apt/lists/*
COPY --from=base --chown=onlyoffice:onlyoffice /app/onlyoffice/config/* /app/onlyoffice/config/
EXPOSE 5050
ENTRYPOINT ["python3", "docker-entrypoint.py"]
FROM node:18.12.1-slim as noderun
ARG BUILD_PATH
ARG SRC_PATH
ENV BUILD_PATH=${BUILD_PATH}
ENV SRC_PATH=${SRC_PATH}
RUN mkdir -p /var/log/onlyoffice && \
mkdir -p /app/onlyoffice/data && \
addgroup --system --gid 107 onlyoffice && \
adduser -uid 104 --quiet --home /var/www/onlyoffice --system --gid 107 onlyoffice && \
chown onlyoffice:onlyoffice /app/onlyoffice -R && \
chown onlyoffice:onlyoffice /var/log -R && \
chown onlyoffice:onlyoffice /var/www -R && \
apt-get -y update && \
apt-get install -yq \
nano \
curl \
vim \
python3-pip && \
pip3 install --upgrade jsonpath-ng multipledispatch netaddr netifaces && \
rm -rf /var/lib/apt/lists/*
COPY --from=base --chown=onlyoffice:onlyoffice /app/onlyoffice/config/* /app/onlyoffice/config/
EXPOSE 5050
ENTRYPOINT ["python3", "docker-entrypoint.py"]
FROM nginx AS proxy
ARG SRC_PATH
ARG BUILD_PATH
ARG COUNT_WORKER_CONNECTIONS=1024
ENV DNS_NAMESERVER=127.0.0.11 \
COUNT_WORKER_CONNECTIONS=$COUNT_WORKER_CONNECTIONS \
MAP_HASH_BUCKET_SIZE=""
RUN apt-get -y update && \
apt-get install -yq vim && \
rm -rf /var/lib/apt/lists/* && \
rm -rf /usr/share/nginx/html/*
# copy static services files and config values
COPY --from=base /etc/nginx/conf.d /etc/nginx/conf.d
COPY /build/install/docker/config/nginx/templates/upstream.conf.template /etc/nginx/templates/upstream.conf.template
COPY /build/install/docker/config/nginx/templates/nginx.conf.template /etc/nginx/nginx.conf.template
COPY /build/install/docker/prepare-nginx-proxy.sh /docker-entrypoint.d/prepare-nginx-proxy.sh
# todo modify for client
# add defualt user and group for no-root run
RUN chown nginx:nginx /etc/nginx/* -R && \
chown nginx:nginx /docker-entrypoint.d/* && \
# changes for upstream configure
sed -i 's/127.0.0.1:5010/$service_api_system/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5012/$service_backup/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5007/$service_files/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5004/$service_people_server/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5000/$service_api/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5003/$service_studio/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:9899/$service_socket/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:9834/$service_sso/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5013/$service_doceditor/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5011/$service_login/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5001/$service_client/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/127.0.0.1:5033/$service_healthchecks/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/$public_root/\/var\/www\/public\//' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/172.*/$document_server;/' /etc/nginx/conf.d/onlyoffice.conf

View File

@ -1,128 +0,0 @@
version: "3.8"
services:
onlyoffice-backup-background-tasks:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: backup_background
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup-background:${DOCKER_TAG}"
# onlyoffice-clear-events:
# build:
# context: ./
# dockerfile: "${DOCKERFILE}"
# target: clear-events
# image: "${REPO}/${DOCKER_IMAGE_PREFIX}-clear-events:${DOCKER_TAG}"
# onlyoffice-migration:
# build:
# context: ./
# dockerfile: "${DOCKERFILE}"
# target: migration
# image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration:${DOCKER_TAG}"
onlyoffice-backup:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: backup
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup:${DOCKER_TAG}"
onlyoffice-files:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: files
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files:${DOCKER_TAG}"
onlyoffice-files-services:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: files_services
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files-services:${DOCKER_TAG}"
# onlyoffice-notify:
# build:
# context: ./
# dockerfile: "${DOCKERFILE}"
# target: notify
# image: "${REPO}/${DOCKER_IMAGE_PREFIX}-notify:${DOCKER_TAG}"
onlyoffice-people-server:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: people_server
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-people-server:${DOCKER_TAG}"
onlyoffice-socket:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: socket
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-socket:${DOCKER_TAG}"
onlyoffice-studio-notify:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: studio_notify
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio-notify:${DOCKER_TAG}"
# onlyoffice-telegram-service:
# build:
# context: ./
# dockerfile: "${DOCKERFILE}"
# target: telegram_service
# image: "${REPO}/${DOCKER_IMAGE_PREFIX}-telegram-service:${DOCKER_TAG}"
# onlyoffice-urlshortener:
# build:
# context: ./
# dockerfile: "${DOCKERFILE}"
# target: urlshortener
# image: "${REPO}/${DOCKER_IMAGE_PREFIX}-urlshortener:${DOCKER_TAG}"
onlyoffice-api:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: api
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api:${DOCKER_TAG}"
# onlyoffice-api-system:
# build:
# context: ./
# dockerfile: "${DOCKERFILE}"
# target: api_system
# image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api-system:${DOCKER_TAG}"
onlyoffice-studio:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: studio
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio:${DOCKER_TAG}"
onlyoffice-ssoauth:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: ssoauth
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-ssoauth:${DOCKER_TAG}"
onlyoffice-proxy:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: proxy
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-proxy:${DOCKER_TAG}"
onlyoffice-migration-runner:
build:
context: ./
dockerfile: "${DOCKERFILE}"
target: onlyoffice-migration-runner
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration-runner:${DOCKER_TAG}"

View File

@ -3,7 +3,7 @@ version: "3.8"
services:
onlyoffice-mysql-server:
image: ${MYSQL_IMAGE}
command: --default-authentication-plugin=mysql_native_password
command: --default-authentication-plugin=caching_sha2_password
cap_add:
- SYS_NICE
container_name: ${MYSQL_HOST}

View File

@ -17,6 +17,7 @@ URLS = os.environ["URLS"] if environ.get("URLS") else "http://0.0.0.0:"
PATH_TO_CONF = os.environ["PATH_TO_CONF"] if environ.get("PATH_TO_CONF") else "/app/" + PRODUCT + "/config"
LOG_DIR = os.environ["LOG_DIR"] if environ.get("LOG_DIR") else "/var/log/" + PRODUCT
ROUTER_HOST = os.environ["ROUTER_HOST"] if environ.get("ROUTER_HOST") else "localhost"
SOCKET_HOST = os.environ["SOCKET_HOST"] if environ.get("SOCKET_HOST") else "onlyoffice-socket"
MYSQL_HOST = os.environ["MYSQL_HOST"] if environ.get("MYSQL_HOST") else "localhost"
MYSQL_DATABASE = os.environ["MYSQL_DATABASE"] if environ.get("MYSQL_DATABASE") else "onlyoffice"
@ -25,6 +26,7 @@ MYSQL_PASSWORD = os.environ["MYSQL_PASSWORD"] if environ.get("MYSQL_PASSWORD") e
APP_CORE_BASE_DOMAIN = os.environ["APP_CORE_BASE_DOMAIN"] if environ.get("APP_CORE_BASE_DOMAIN") is not None else "localhost"
APP_CORE_MACHINEKEY = os.environ["APP_CORE_MACHINEKEY"] if environ.get("APP_CORE_MACHINEKEY") else "your_core_machinekey"
INSTALLATION_TYPE = os.environ["INSTALLATION_TYPE"].upper() if environ.get("INSTALLATION_TYPE") else "ENTERPRISE"
APP_URL_PORTAL = os.environ["APP_URL_PORTAL"] if environ.get("APP_URL_PORTAL") else "http://" + ROUTER_HOST + ":8092"
APP_STORAGE_ROOT = os.environ["APP_STORAGE_ROOT"] if environ.get("APP_STORAGE_ROOT") else BASE_DIR + "/data/"
APP_KNOWN_PROXIES = os.environ["APP_KNOWN_PROXIES"]
@ -137,16 +139,19 @@ saveFilePath = filePath
filePath = "/app/onlyoffice/config/appsettings.json"
jsonData = openJsonFile(filePath)
#jsonUpdateValue = parseJsonValue(jsonValue)
updateJsonData(jsonData,"$.ConnectionStrings.default.connectionString", "Server="+ MYSQL_HOST +";Port=3306;Database="+ MYSQL_DATABASE +";User ID="+ MYSQL_USER +";Password="+ MYSQL_PASSWORD +";Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none;ConnectionReset=false",)
updateJsonData(jsonData,"$.ConnectionStrings.default.connectionString", "Server="+ MYSQL_HOST +";Port=3306;Database="+ MYSQL_DATABASE +";User ID="+ MYSQL_USER +";Password="+ MYSQL_PASSWORD +";Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none;ConnectionReset=false;AllowPublicKeyRetrieval=true",)
updateJsonData(jsonData,"$.core.base-domain", APP_CORE_BASE_DOMAIN)
updateJsonData(jsonData,"$.core.machinekey", APP_CORE_MACHINEKEY)
updateJsonData(jsonData,"$.core.products.subfolder", "server")
updateJsonData(jsonData,"$.web.hub.internal", "http://onlyoffice-socket:" + SERVICE_PORT + "/")
updateJsonData(jsonData,"$.core.notify.postman", "services")
updateJsonData(jsonData,"$.web.hub.internal", "http://" + SOCKET_HOST + ":" + SERVICE_PORT + "/")
updateJsonData(jsonData,"$.files.docservice.url.portal", APP_URL_PORTAL)
updateJsonData(jsonData,"$.files.docservice.url.public", DOCUMENT_SERVER_URL_PUBLIC)
updateJsonData(jsonData,"$.files.docservice.url.internal", DOCUMENT_SERVER_URL_INTERNAL)
updateJsonData(jsonData,"$.files.docservice.secret.value", DOCUMENT_SERVER_JWT_SECRET)
updateJsonData(jsonData,"$.files.docservice.secret.header", DOCUMENT_SERVER_JWT_HEADER)
if INSTALLATION_TYPE == "ENTERPRISE":
updateJsonData(jsonData, "$.license.file.path", "/app/onlyoffice/data/license.lic")
ip_address = netifaces.ifaddresses('eth0').get(netifaces.AF_INET)[0].get('addr')
netmask = netifaces.ifaddresses('eth0').get(netifaces.AF_INET)[0].get('netmask')
@ -168,7 +173,7 @@ writeJsonFile(filePath, jsonData)
filePath = "/app/onlyoffice/config/apisystem.json"
jsonData = openJsonFile(filePath)
updateJsonData(jsonData, "$.ConnectionStrings.default.connectionString", "Server="+ MYSQL_HOST +";Port=3306;Database="+ MYSQL_DATABASE +";User ID="+ MYSQL_USER +";Password="+ MYSQL_PASSWORD +";Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none;ConnectionReset=false",)
updateJsonData(jsonData, "$.ConnectionStrings.default.connectionString", "Server="+ MYSQL_HOST +";Port=3306;Database="+ MYSQL_DATABASE +";User ID="+ MYSQL_USER +";Password="+ MYSQL_PASSWORD +";Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none;ConnectionReset=false;AllowPublicKeyRetrieval=true",)
updateJsonData(jsonData,"$.core.base-domain", APP_CORE_BASE_DOMAIN)
updateJsonData(jsonData,"$.core.machinekey", APP_CORE_MACHINEKEY)
writeJsonFile(filePath, jsonData)

View File

@ -4,7 +4,14 @@ MYSQL_HOST=${MYSQL_HOST:-"localhost"}
MYSQL_DATABASE=${MYSQL_DATABASE:-"onlyoffice"}
MYSQL_USER=${MYSQL_USER:-"onlyoffice_user"}
MYSQL_PASSWORD=${MYSQL_PASSWORD:-"onlyoffice_pass"}
MIGRATION_TYPE=${MIGRATION_TYPE:-"STANDALONE"}
PARAMETERS="standalone=true"
sed -i "s!\"ConnectionString\".*!\"ConnectionString\": \"Server=${MYSQL_HOST};Database=${MYSQL_DATABASE};User ID=${MYSQL_USER};Password=${MYSQL_PASSWORD}\",!g" ./appsettings.runner.json
dotnet ASC.Migration.Runner.dll
if [[ ${MIGRATION_TYPE} == "SAAS" ]]
then
PARAMETERS=""
fi
dotnet ASC.Migration.Runner.dll ${PARAMETERS}

View File

@ -1,206 +0,0 @@
version: "3.8"
x-service: &x-service-base
container_name: base
restart: always
expose:
- ${SERVICE_PORT}
environment:
MYSQL_HOST: ${MYSQL_HOST}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
DATABASE_MIGRATION: ${DATABASE_MIGRATION}
APP_DOTNET_ENV: ${APP_DOTNET_ENV}
APP_KNOWN_NETWORKS: ${APP_KNOWN_NETWORKS}
APP_KNOWN_PROXIES: ${APP_KNOWN_PROXIES}
APP_CORE_BASE_DOMAIN: ${APP_CORE_BASE_DOMAIN}
APP_CORE_MACHINEKEY: ${APP_CORE_MACHINEKEY}
APP_URL_PORTAL: ${APP_URL_PORTAL}
DOCUMENT_SERVER_JWT_SECRET: ${DOCUMENT_SERVER_JWT_SECRET}
DOCUMENT_SERVER_JWT_HEADER: ${DOCUMENT_SERVER_JWT_HEADER}
DOCUMENT_SERVER_URL_PUBLIC: ${DOCUMENT_SERVER_URL_PUBLIC}
DOCUMENT_SERVER_URL_INTERNAL: ${DOCUMENT_SERVER_URL_INTERNAL}
KAFKA_HOST: ${KAFKA_HOST}
ELK_HOST: ${ELK_HOST}
PROXY_HOST: ${PROXY_HOST}
ENV_EXTENSION: ${ENV_EXTENSION}
volumes:
#- /app/onlyoffice/CommunityServer/data:/app/onlyoffice/data
- app_data:/app/onlyoffice/data
- files_data:/var/www/products/ASC.Files/server/
- people_data:/var/www/products/ASC.People/server/
- ${ROOT_DIR}/config/appsettings.${ENV_EXTENSION}.json:/app/onlyoffice/config/appsettings.${ENV_EXTENSION}.json
- ${ROOT_DIR}/config/apisystem.${ENV_EXTENSION}.json:/app/onlyoffice/config/apisystem.${ENV_EXTENSION}.json
services:
# onlyoffice-elasticsearch:
# image: onlyoffice/elasticsearch:${ELK_VERSION}
# container_name: ${ELK_HOST}
# restart: always
# environment:
# - discovery.type=single-node
# - bootstrap.memory_lock=true
# - "ES_JAVA_OPTS=-Xms4g -Xmx4g -Dlog4j2.formatMsgNoLookups=true"
# - "indices.fielddata.cache.size=30%"
# - "indices.memory.index_buffer_size=30%"
# ulimits:
# memlock:
# soft: -1
# hard: -1
# nofile:
# soft: 65535
# hard: 65535
# volumes:
# - es_data:/usr/share/elasticsearch/data
# expose:
# - "9200"
# - "9300"
onlyoffice-backup-background-tasks:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup-background:${DOCKER_TAG}"
container_name: ${BACKUP_BACKGRUOND_TASKS_HOST}
onlyoffice-backup:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup:${DOCKER_TAG}"
container_name: ${BACKUP_HOST}
# onlyoffice-clear-events:
# <<: *x-service-base
# image: "${REPO}/${DOCKER_IMAGE_PREFIX}-clear-events:${DOCKER_TAG}"
# container_name: ${CLEAR_EVENTS_HOST}
# onlyoffice-migration:
# <<: *x-service-base
# image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration:${DOCKER_TAG}"
# container_name: ${MIGRATION_HOST}
onlyoffice-files:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files:${DOCKER_TAG}"
container_name: ${FILES_HOST}
onlyoffice-files-services:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files-services:${DOCKER_TAG}"
container_name: ${FILES_SERVICES_HOST}
onlyoffice-people-server:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-people-server:${DOCKER_TAG}"
container_name: ${PEOPLE_SERVER_HOST}
onlyoffice-socket:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-socket:${DOCKER_TAG}"
container_name: ${SOCKET_HOST}
expose:
- ${SERVICE_PORT}
onlyoffice-studio-notify:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio-notify:${DOCKER_TAG}"
container_name: ${STUDIO_NOTIFY_HOST}
# onlyoffice-telegram-service:
# <<: *x-service-base
# image: "${REPO}/${DOCKER_IMAGE_PREFIX}-telegram-service:${DOCKER_TAG}"
# container_name: ${TELEGRAM_SERVICE_HOST}
# onlyoffice-urlshortener:
# <<: *x-service-base
# image: "${REPO}/${DOCKER_IMAGE_PREFIX}-urlshortener:${DOCKER_TAG}"
# container_name: ${URLSHORTENER_HOST}
# expose:
# - ${SERVICE_PORT}
# - "9999"
onlyoffice-api:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api:${DOCKER_TAG}"
container_name: ${API_HOST}
# onlyoffice-api-system:
# <<: *x-service-base
# image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api-system:${DOCKER_TAG}"
# container_name: ${API_SYSTEM_HOST}
onlyoffice-studio:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio:${DOCKER_TAG}"
container_name: ${STUDIO_HOST}
onlyoffice-ssoauth:
<<: *x-service-base
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-ssoauth:${DOCKER_TAG}"
container_name: ${SSOAUTH_HOST}
expose:
- ${SERVICE_PORT}
- "9834"
onlyoffice-proxy:
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-proxy:${DOCKER_TAG}"
container_name: ${PROXY_HOST}
restart: always
expose:
- "8081"
- "8099"
- "8092"
ports:
- 8092:8092
depends_on:
- onlyoffice-backup-background-tasks
- onlyoffice-backup
# - onlyoffice-clear-events
# - onlyoffice-migration
- onlyoffice-files
- onlyoffice-files-services
- onlyoffice-people-server
- onlyoffice-socket
- onlyoffice-studio-notify
# - onlyoffice-telegram-service
# - onlyoffice-urlshortener
- onlyoffice-api
# - onlyoffice-api-system
- onlyoffice-studio
- onlyoffice-ssoauth
environment:
- SERVICE_BACKUP=${SERVICE_BACKUP}
- SERVICE_FILES=${SERVICE_FILES}
- SERVICE_FILES_SERVICES=${SERVICE_FILES_SERVICES}
# - SERVICE_CLEAR_EVENTS=${SERVICE_CLEAR_EVENTS}
# - SERVICE_MIGRATION=${SERVICE_MIGRATION}
- SERVICE_NOTIFY=${SERVICE_NOTIFY}
- SERVICE_PEOPLE_SERVER=${SERVICE_PEOPLE_SERVER}
- SERVICE_SOCKET=${SERVICE_SOCKET}
- SERVICE_STUDIO_NOTIFY=${SERVICE_STUDIO_NOTIFY}
# - SERVICE_TELEGRAM_SERVICE=${SERVICE_TELEGRAM_SERVICE}
# - SERVICE_URLSHORTENER=${SERVICE_URLSHORTENER}
- SERVICE_API=${SERVICE_API}
- SERVICE_API_SYSTEM=${SERVICE_API_SYSTEM}
- SERVICE_STUDIO=${SERVICE_STUDIO}
- SERVICE_SSOAUTH=${SERVICE_SSOAUTH}
- SERVICE_DOCEDITOR=${SERVICE_DOCEDITOR}
- SERVICE_LOGIN=${SERVICE_LOGIN}
- SERVICE_CLIENT=${SERVICE_CLIENT}
- SERVICE_HELTHCHECKS=${SERVICE_HELTHCHECKS}
- DOCUMENT_SERVER=${DOCUMENT_SERVER_HOST}
- SERVICE_PORT=${SERVICE_PORT}
- GIT_BRANCH=${GIT_BRANCH}
- ROOT_DIR=${ROOT_DIR}
volumes:
- proxy_log:/var/log/nginx
- ${ROOT_DIR}/public:/var/www/public
networks:
default:
name: ${NETWORK_NAME}
external: true
volumes:
es_data:
proxy_log:
app_data:
files_data:
people_data:

View File

@ -0,0 +1,185 @@
version: "3.8"
x-profiles-local: &x-profiles-local
profiles: ["backend-local"]
environment:
BUILD_PATH: "/var/www"
SRC_PATH: "/app/services"
ROOT_DIR: ""
ENV_EXTENSION: "dev"
services:
onlyoffice-backup-background-tasks:
<<: *x-profiles-local
image: ${Baseimage_Dotnet_Run}
working_dir: ${BUILD_PATH}/services/ASC.Data.Backup.BackgroundTasks/
command:
[
"ASC.Data.Backup.BackgroundTasks.dll",
"ASC.Data.Backup.BackgroundTasks",
"core:eventBus:subscriptionClientName=asc_event_bus_backup_queue",
]
volumes:
- ${SRC_PATH}/ASC.Data.Backup.BackgroundTasks/service:${BUILD_PATH}/services/ASC.Data.Backup.BackgroundTasks/
- ${SRC_PATH}/ASC.Files/service/:${BUILD_PATH}/products/ASC.Files/server/
- ${SRC_PATH}/ASC.People/service/:${BUILD_PATH}/products/ASC.People/server/
- ${ROOT_DIR}/config/appsettings.${ENV_EXTENSION}.json:/app/onlyoffice/config/appsettings.${ENV_EXTENSION}.json
- ${ROOT_DIR}/config/apisystem.${ENV_EXTENSION}.json:/app/onlyoffice/config/apisystem.${ENV_EXTENSION}.json
depends_on:
onlyoffice-migration-runner:
condition: service_completed_successfully
onlyoffice-backup:
<<: *x-profiles-local
image: ${Baseimage_Dotnet_Run}
working_dir: ${BUILD_PATH}/services/ASC.Data.Backup/service/
command: ["ASC.Data.Backup.dll", "ASC.Data.Backup"]
volumes:
- ${SRC_PATH}/ASC.Data.Backup/service:${BUILD_PATH}/services/ASC.Data.Backup/service/
- ${SRC_PATH}/ASC.Files/service/:${BUILD_PATH}/products/ASC.Files/server/
- ${SRC_PATH}/ASC.People/service/:${BUILD_PATH}/products/ASC.People/server/
- ${ROOT_DIR}/config/appsettings.${ENV_EXTENSION}.json:/app/onlyoffice/config/appsettings.${ENV_EXTENSION}.json
- ${ROOT_DIR}/config/apisystem.${ENV_EXTENSION}.json:/app/onlyoffice/config/apisystem.${ENV_EXTENSION}.json
depends_on:
onlyoffice-migration-runner:
condition: service_completed_successfully
onlyoffice-files:
<<: *x-profiles-local
image: ${Baseimage_Dotnet_Run}
working_dir: ${BUILD_PATH}/products/ASC.Files/server/
command: ["ASC.Files.dll", "ASC.Files"]
volumes:
- ${SRC_PATH}/ASC.Files/service:${BUILD_PATH}/products/ASC.Files/server/
- ${SRC_PATH}/ASC.People/service/:${BUILD_PATH}/products/ASC.People/server/
- ${ROOT_DIR}/config/appsettings.${ENV_EXTENSION}.json:/app/onlyoffice/config/appsettings.${ENV_EXTENSION}.json
- ${ROOT_DIR}/config/apisystem.${ENV_EXTENSION}.json:/app/onlyoffice/config/apisystem.${ENV_EXTENSION}.json
depends_on:
onlyoffice-migration-runner:
condition: service_completed_successfully
onlyoffice-files-services:
<<: *x-profiles-local
image: ${Baseimage_Dotnet_Run}
working_dir: ${BUILD_PATH}/products/ASC.Files/service/
command:
[
"ASC.Files.Service.dll",
"ASC.Files.Service",
"core:eventBus:subscriptionClientName=asc_event_bus_files_service_queue",
]
volumes:
- ${SRC_PATH}/ASC.Files.Service/service:${BUILD_PATH}/products/ASC.Files/service/
- ${SRC_PATH}/ASC.Files/service/:${BUILD_PATH}/products/ASC.Files/server/
- ${SRC_PATH}/ASC.People/service/:${BUILD_PATH}/products/ASC.People/server/
- ${ROOT_DIR}/config/appsettings.${ENV_EXTENSION}.json:/app/onlyoffice/config/appsettings.${ENV_EXTENSION}.json
- ${ROOT_DIR}/config/apisystem.${ENV_EXTENSION}.json:/app/onlyoffice/config/apisystem.${ENV_EXTENSION}.json
depends_on:
onlyoffice-migration-runner:
condition: service_completed_successfully
onlyoffice-people-server:
<<: *x-profiles-local
image: ${Baseimage_Dotnet_Run}
working_dir: ${BUILD_PATH}/products/ASC.People/server/
command: ["ASC.People.dll", "ASC.People"]
volumes:
- ${SRC_PATH}/ASC.People/service:${BUILD_PATH}/products/ASC.People/server/
- ${SRC_PATH}/ASC.Files/service/:${BUILD_PATH}/products/ASC.Files/server/
- ${ROOT_DIR}/config/appsettings.${ENV_EXTENSION}.json:/app/onlyoffice/config/appsettings.${ENV_EXTENSION}.json
- ${ROOT_DIR}/config/apisystem.${ENV_EXTENSION}.json:/app/onlyoffice/config/apisystem.${ENV_EXTENSION}.json
depends_on:
onlyoffice-migration-runner:
condition: service_completed_successfully
onlyoffice-socket:
<<: *x-profiles-local
image: ${Baseimage_Nodejs_Run}
working_dir: ${BUILD_PATH}/services/ASC.Socket.IO/
command: ["server.js", "ASC.Socket.IO"]
volumes:
- ${SRC_PATH}/ASC.Socket.IO/service:${BUILD_PATH}/services/ASC.Socket.IO/
depends_on:
onlyoffice-migration-runner:
condition: service_completed_successfully
onlyoffice-studio-notify:
<<: *x-profiles-local
image: ${Baseimage_Dotnet_Run}
working_dir: ${BUILD_PATH}/services/ASC.Studio.Notify/service/
command: ["ASC.Studio.Notify.dll", "ASC.Studio.Notify"]
volumes:
- ${SRC_PATH}/ASC.Studio.Notify/service:${BUILD_PATH}/services/ASC.Studio.Notify/service/
- ${SRC_PATH}/ASC.Files/service/:${BUILD_PATH}/products/ASC.Files/server/
- ${SRC_PATH}/ASC.People/service/:${BUILD_PATH}/products/ASC.People/server/
- ${ROOT_DIR}/config/appsettings.${ENV_EXTENSION}.json:/app/onlyoffice/config/appsettings.${ENV_EXTENSION}.json
- ${ROOT_DIR}/config/apisystem.${ENV_EXTENSION}.json:/app/onlyoffice/config/apisystem.${ENV_EXTENSION}.json
depends_on:
onlyoffice-migration-runner:
condition: service_completed_successfully
onlyoffice-api:
<<: *x-profiles-local
image: ${Baseimage_Dotnet_Run}
working_dir: ${BUILD_PATH}/studio/ASC.Web.Api/
command: ["ASC.Web.Api.dll", "ASC.Web.Api"]
volumes:
- ${SRC_PATH}/ASC.Web.Api/service:${BUILD_PATH}/studio/ASC.Web.Api/
- ${SRC_PATH}/ASC.Files/service/:${BUILD_PATH}/products/ASC.Files/server/
- ${SRC_PATH}/ASC.People/service/:${BUILD_PATH}/products/ASC.People/server/
- ${ROOT_DIR}/config/appsettings.${ENV_EXTENSION}.json:/app/onlyoffice/config/appsettings.${ENV_EXTENSION}.json
- ${ROOT_DIR}/config/apisystem.${ENV_EXTENSION}.json:/app/onlyoffice/config/apisystem.${ENV_EXTENSION}.json
depends_on:
onlyoffice-migration-runner:
condition: service_completed_successfully
onlyoffice-studio:
<<: *x-profiles-local
image: ${Baseimage_Dotnet_Run}
working_dir: ${BUILD_PATH}/studio/ASC.Web.Studio/
command: ["ASC.Web.Studio.dll", "ASC.Web.Studio"]
volumes:
- ${SRC_PATH}/ASC.Web.Studio/service:${BUILD_PATH}/studio/ASC.Web.Studio/
- ${SRC_PATH}/ASC.Files/service/:${BUILD_PATH}/products/ASC.Files/server/
- ${SRC_PATH}/ASC.People/service/:${BUILD_PATH}/products/ASC.People/server/
- ${ROOT_DIR}/config/appsettings.${ENV_EXTENSION}.json:/app/onlyoffice/config/appsettings.${ENV_EXTENSION}.json
- ${ROOT_DIR}/config/apisystem.${ENV_EXTENSION}.json:/app/onlyoffice/config/apisystem.${ENV_EXTENSION}.json
depends_on:
onlyoffice-migration-runner:
condition: service_completed_successfully
onlyoffice-ssoauth:
<<: *x-profiles-local
image: ${Baseimage_Nodejs_Run}
working_dir: ${BUILD_PATH}/services/ASC.SsoAuth/
command: ["app.js", "ASC.SsoAuth"]
volumes:
- ${SRC_PATH}/ASC.SsoAuth/service:${BUILD_PATH}/services/ASC.SsoAuth/
depends_on:
onlyoffice-migration-runner:
condition: service_completed_successfully
onlyoffice-migration-runner:
image: ${Baseimage_Dotnet_Run}
entrypoint: ${BUILD_PATH}/services/ASC.Migration.Runner/docker-migration-entrypoint.sh
working_dir: ${BUILD_PATH}/services/ASC.Migration.Runner/
volumes:
- ${SRC_PATH}/ASC.Migration.Runner/service:${BUILD_PATH}/services/ASC.Migration.Runner/
onlyoffice-proxy:
<<: *x-profiles-local
image: ${Baseimage_Proxy_Run}
environment:
- SERVICE_CLIENT=${SERVICE_CLIENT}
volumes:
- ${ROOT_DIR}/public:/var/www/public/
onlyoffice-rabbitmq:
<<: *x-profiles-local
onlyoffice-redis:
<<: *x-profiles-local
onlyoffice-document-server:
<<: *x-profiles-local
volumes:
- ${DATA_DIR}:/var/www/onlyoffice/Data

View File

@ -0,0 +1,282 @@
version: "3.8"
x-healthcheck: &x-healthcheck
test: curl --fail http://127.0.0.1 || exit 1
interval: 60s
retries: 5
start_period: 20s
timeout: 10s
x-profiles-backend: &x-profiles-backend
profiles: ["prod", "backend"]
x-profiles-frontend: &x-profiles-frontend
profiles: ["prod", "frontend"]
x-profiles-extra-services: &x-profiles-extra-services
profiles: ["prod", "extra-services"]
x-service: &x-service-base
container_name: base
restart: always
expose:
- ${SERVICE_PORT}
environment:
MYSQL_HOST: ${MYSQL_HOST}
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
DATABASE_MIGRATION: ${DATABASE_MIGRATION}
APP_DOTNET_ENV: ${APP_DOTNET_ENV}
APP_KNOWN_NETWORKS: ${APP_KNOWN_NETWORKS}
APP_KNOWN_PROXIES: ${APP_KNOWN_PROXIES}
APP_CORE_BASE_DOMAIN: ${APP_CORE_BASE_DOMAIN}
APP_CORE_MACHINEKEY: ${APP_CORE_MACHINEKEY}
APP_URL_PORTAL: ${APP_URL_PORTAL}
INSTALLATION_TYPE: ${INSTALLATION_TYPE}
DOCUMENT_SERVER_JWT_SECRET: ${DOCUMENT_SERVER_JWT_SECRET}
DOCUMENT_SERVER_JWT_HEADER: ${DOCUMENT_SERVER_JWT_HEADER}
DOCUMENT_SERVER_URL_PUBLIC: ${DOCUMENT_SERVER_URL_PUBLIC}
DOCUMENT_SERVER_URL_INTERNAL: ${DOCUMENT_SERVER_URL_INTERNAL}
KAFKA_HOST: ${KAFKA_HOST}
ELK_HOST: ${ELK_HOST}
PROXY_HOST: ${PROXY_HOST}
volumes:
- ${ROOT_DIR}/Data:/app/onlyoffice/data
- files_data:/var/www/products/ASC.Files/server/
- people_data:/var/www/products/ASC.People/server/
services:
onlyoffice-elasticsearch:
<<: [*x-profiles-extra-services]
image: onlyoffice/elasticsearch:${ELK_VERSION}
container_name: ${ELK_HOST}
restart: always
environment:
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms4g -Xmx4g -Dlog4j2.formatMsgNoLookups=true"
- "indices.fielddata.cache.size=30%"
- "indices.memory.index_buffer_size=30%"
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65535
hard: 65535
volumes:
- es_data:/usr/share/elasticsearch/data
expose:
- "9200"
- "9300"
onlyoffice-rabbitmq:
<<: [*x-profiles-extra-services]
image: rabbitmq:3
container_name: onlyoffice-rabbitmq
restart: always
expose:
- "5672"
- "80"
onlyoffice-redis:
<<: [*x-profiles-extra-services]
image: redis:7
container_name: onlyoffice-redis
restart: always
expose:
- "6379"
onlyoffice-document-server:
<<: [*x-profiles-extra-services]
image: "${DOCUMENT_SERVER_IMAGE_NAME}"
container_name: ${DOCUMENT_SERVER_HOST}
# Strings below enable the JSON Web Token validation.
environment:
- JWT_ENABLED=true
- JWT_SECRET=${DOCUMENT_SERVER_JWT_SECRET}
- JWT_HEADER=${DOCUMENT_SERVER_JWT_HEADER}
- JWT_IN_BODY=true
expose:
- "80"
stdin_open: true
restart: always
stop_grace_period: 60s
onlyoffice-notify:
<<: [*x-service-base, *x-profiles-backend]
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-notify:${DOCKER_TAG}"
container_name: ${NOTIFY_HOST}
healthcheck:
<<: *x-healthcheck
test: curl --fail http://${SERVICE_NOTIFY}/health/ || exit 1
onlyoffice-backup-background-tasks:
<<: [*x-service-base, *x-profiles-backend]
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup-background:${DOCKER_TAG}"
container_name: ${BACKUP_BACKGRUOND_TASKS_HOST}
healthcheck:
<<: *x-healthcheck
test: curl --fail http://${SERVICE_BACKUP_BACKGRUOND_TASKS}/health/ || exit 1
onlyoffice-backup:
<<: [*x-service-base, *x-profiles-backend]
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup:${DOCKER_TAG}"
container_name: ${BACKUP_HOST}
healthcheck:
<<: *x-healthcheck
test: curl --fail http://${SERVICE_BACKUP}/health/ || exit 1
onlyoffice-clear-events:
<<: [*x-service-base, *x-profiles-backend]
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-clear-events:${DOCKER_TAG}"
container_name: ${CLEAR_EVENTS_HOST}
healthcheck:
<<: *x-healthcheck
test: curl --fail http://${SERVICE_CLEAR_EVENTS}/health/ || exit 1
onlyoffice-files:
<<: [*x-service-base, *x-profiles-backend]
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files:${DOCKER_TAG}"
container_name: ${FILES_HOST}
healthcheck:
<<: *x-healthcheck
test: curl --fail http://${SERVICE_FILES}/health/ || exit 1
onlyoffice-files-services:
<<: [*x-service-base, *x-profiles-backend]
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files-services:${DOCKER_TAG}"
container_name: ${FILES_SERVICES_HOST}
healthcheck:
<<: *x-healthcheck
test: curl --fail http://${SERVICE_FILES_SERVICES}/health/ || exit 1
onlyoffice-people-server:
<<: [*x-service-base, *x-profiles-backend]
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-people-server:${DOCKER_TAG}"
container_name: ${PEOPLE_SERVER_HOST}
healthcheck:
<<: *x-healthcheck
test: curl --fail http://${SERVICE_PEOPLE_SERVER}/health/ || exit 1
onlyoffice-socket:
<<: [*x-service-base, *x-profiles-backend]
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-socket:${DOCKER_TAG}"
container_name: ${SOCKET_HOST}
expose:
- ${SERVICE_PORT}
onlyoffice-studio-notify:
<<: [*x-service-base, *x-profiles-backend]
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio-notify:${DOCKER_TAG}"
container_name: ${STUDIO_NOTIFY_HOST}
healthcheck:
<<: *x-healthcheck
test: curl --fail http://${SERVICE_STUDIO_NOTIFY}/health/ || exit 1
onlyoffice-api:
<<: [*x-service-base, *x-profiles-backend]
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api:${DOCKER_TAG}"
container_name: ${API_HOST}
healthcheck:
<<: *x-healthcheck
test: curl --fail http://${SERVICE_API}/health/ || exit 1
onlyoffice-api-system:
<<: [*x-service-base, *x-profiles-backend]
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api-system:${DOCKER_TAG}"
container_name: ${API_SYSTEM_HOST}
healthcheck:
<<: *x-healthcheck
test: curl --fail http://${SERVICE_API_SYSTEM}/health/ || exit 1
onlyoffice-studio:
<<: [*x-service-base, *x-profiles-backend]
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio:${DOCKER_TAG}"
container_name: ${STUDIO_HOST}
healthcheck:
<<: *x-healthcheck
test: curl --fail http://${SERVICE_STUDIO}/health/ || exit 1
onlyoffice-ssoauth:
<<: [*x-service-base, *x-profiles-backend]
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-ssoauth:${DOCKER_TAG}"
container_name: ${SSOAUTH_HOST}
expose:
- ${SERVICE_PORT}
- "9834"
onlyoffice-doceditor:
<<: [*x-service-base, *x-profiles-frontend]
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-doceditor:${DOCKER_TAG}"
container_name: ${DOCEDITOR_HOST}
restart: always
expose:
- "5013"
onlyoffice-login:
<<: [*x-service-base, *x-profiles-frontend]
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-login:${DOCKER_TAG}"
container_name: ${LOGIN_HOST}
restart: always
expose:
- "5011"
onlyoffice-proxy:
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-proxy:${DOCKER_TAG}"
profiles: ["prod", "backend", frontend]
container_name: ${PROXY_HOST}
restart: always
healthcheck:
<<: *x-healthcheck
test: nginx -t || exit 1
expose:
- "8081"
- "8099"
- "8092"
ports:
- 8092:8092
environment:
- SERVICE_BACKUP=${SERVICE_BACKUP}
- SERVICE_FILES=${SERVICE_FILES}
- SERVICE_FILES_SERVICES=${SERVICE_FILES_SERVICES}
- SERVICE_CLEAR_EVENTS=${SERVICE_CLEAR_EVENTS}
- SERVICE_NOTIFY=${SERVICE_NOTIFY}
- SERVICE_PEOPLE_SERVER=${SERVICE_PEOPLE_SERVER}
- SERVICE_SOCKET=${SERVICE_SOCKET}
- SERVICE_STUDIO_NOTIFY=${SERVICE_STUDIO_NOTIFY}
- SERVICE_API=${SERVICE_API}
- SERVICE_API_SYSTEM=${SERVICE_API_SYSTEM}
- SERVICE_STUDIO=${SERVICE_STUDIO}
- SERVICE_SSOAUTH=${SERVICE_SSOAUTH}
- SERVICE_DOCEDITOR=${SERVICE_DOCEDITOR}
- SERVICE_LOGIN=${SERVICE_LOGIN}
- SERVICE_HELTHCHECKS=${SERVICE_HELTHCHECKS}
- DOCUMENT_SERVER=${DOCUMENT_SERVER_HOST}
- SERVICE_PORT=${SERVICE_PORT}
volumes:
- proxy_log:/var/log/nginx
onlyoffice-migration-runner:
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration-runner:${DOCKER_TAG}"
profiles: ["migration-runner", "backend-local"]
container_name: ${MIGRATION_RUNNER_HOST}
restart: "no"
environment:
MYSQL_HOST: ${MYSQL_HOST}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
networks:
default:
name: ${NETWORK_NAME}
external: true
volumes:
es_data:
proxy_log:
app_data:
files_data:
people_data:

View File

@ -24,6 +24,8 @@ x-service: &x-service-base
APP_KNOWN_PROXIES: ${APP_KNOWN_PROXIES}
APP_CORE_BASE_DOMAIN: ${APP_CORE_BASE_DOMAIN}
APP_CORE_MACHINEKEY: ${APP_CORE_MACHINEKEY}
APP_URL_PORTAL: ${APP_URL_PORTAL}
INSTALLATION_TYPE: ${INSTALLATION_TYPE}
DOCUMENT_SERVER_JWT_SECRET: ${DOCUMENT_SERVER_JWT_SECRET}
DOCUMENT_SERVER_JWT_HEADER: ${DOCUMENT_SERVER_JWT_HEADER}
DOCUMENT_SERVER_URL_PUBLIC: ${DOCUMENT_SERVER_URL_PUBLIC}

View File

@ -1,23 +0,0 @@
version: "3.8"
services:
onlyoffice-document-server:
image: "${DOCUMENT_SERVER_IMAGE_NAME}"
container_name: ${DOCUMENT_SERVER_HOST}
# Strings below enable the JSON Web Token validation.
environment:
- JWT_ENABLED=true
- JWT_SECRET=${DOCUMENT_SERVER_JWT_SECRET}
- JWT_HEADER=${DOCUMENT_SERVER_JWT_HEADER}
- JWT_IN_BODY=true
expose:
- "80"
volumes:
- ${ROOT_DIR}/Data:/var/www/onlyoffice/Data
stdin_open: true
restart: always
stop_grace_period: 60s
networks:
default:
name: ${NETWORK_NAME}
external: true

View File

@ -9,6 +9,8 @@ services:
- JWT_SECRET=${DOCUMENT_SERVER_JWT_SECRET}
- JWT_HEADER=${DOCUMENT_SERVER_JWT_HEADER}
- JWT_IN_BODY=true
volumes:
- app_data:/var/www/onlyoffice/Data
expose:
- '80'
stdin_open: true
@ -17,5 +19,8 @@ services:
networks:
default:
external:
name: ${NETWORK_NAME}
name: ${NETWORK_NAME}
external: true
volumes:
app_data:

View File

@ -19,8 +19,8 @@ services:
networks:
default:
external:
name: ${NETWORK_NAME}
name: ${NETWORK_NAME}
external: true
volumes:
app_data:

View File

@ -49,8 +49,8 @@ services:
networks:
default:
external:
name: ${NETWORK_NAME}
name: ${NETWORK_NAME}
external: true
volumes:
app_data:

View File

@ -7,9 +7,6 @@ addFilter(r' W: non-standard-(uid|gid)')
# This is necessary to ensure that all child packages are updated correctly
addFilter(r'W: requires-on-release')
# The signature of packages occurs in further stages
addFilter(r'E: no-signature')
# The basic documentation comes with the common package
addFilter(r'W: no-documentation')
@ -45,3 +42,18 @@ addFilter(r'non-standard-executable-perm')
# We use this to protect sensitive information (ie passwords) in the config file
addFilter(r'non-readable')
# No one license from allowed pull AGPLv3, AGPLv3+ worked
addFilter(r'W: invalid-license AGPLv3')
# Сertain services require write access to the log directory. These services are launched under a user account that is different from the root user.
addFilter(r'logrotate-user-writable-log-dir')
# The use of the /var/www directory is caused by its past history as the default document root
addFilter(r'W: non-standard-dir-in-var www')
# Shared libraries centos7-librdkafka.so, libgrpc_csharp_ext.x64.so location of which is hardcoded
addFilter(r'W: binary-or-shlib-calls-gethostbyname')
# There are the same files, however on a different languages
addFilter(r'files-duplicate')

View File

@ -4,17 +4,19 @@ bash build/install/common/systemd/build.sh
bash build/install/common/build-frontend.sh --srcpath %{_builddir}/%{sourcename}
bash build/install/common/build-backend.sh --srcpath %{_builddir}/%{sourcename}
bash build/install/common/publish-backend.sh --srcpath %{_builddir}/%{sourcename} -ar "-r linux-x64"
bash build/install/common/publish-backend.sh --srcpath %{_builddir}/%{sourcename}
rename -f -v "s/product([^\/]*)$/%{product}\$1/g" build/install/common/*
sed -i "s/{{product}}/%{product}/g" %{_builddir}/%{sourcename}/build/install/common/logrotate/product-common
rm -rf %{_builddir}/%{sourcename}/ASC.Migration.Runner/service/runtimes/linux-arm*
rm -f %{_builddir}/%{sourcename}/config/nginx/onlyoffice-login.conf
sed -i "s@var/www@var/www/%{product}@g" config/nginx/*.conf && sed -i "s@var/www@var/www/%{product}@g" config/nginx/includes/*.conf
if ! grep -q 'var/www/%{product}' config/nginx/*.conf; then find config/nginx/ -name "*.conf" -exec sed -i "s@\(var/www/\)@\1%{product}/@" {} +; fi
json -I -f %{_builddir}/%{sourcename}/config/appsettings.services.json -e "this.logPath=\"/var/log/onlyoffice/%{product}\"" -e "this.socket={ 'path': '../ASC.Socket.IO/' }" \
-e "this.ssoauth={ 'path': '../ASC.SsoAuth/' }" -e "this.core={ 'products': { 'folder': '%{buildpath}/products', 'subfolder': 'server'} }"
find %{_builddir}/%{sourcename}/config/ -type f -regex '.*\.\(test\|dev\).*' -delete
find %{_builddir}/%{sourcename}/publish/ \
%{_builddir}/%{sourcename}/ASC.Migration.Runner \
-depth -type f -regex '.*\(dll\|dylib\|so\)$' -exec chmod 755 {} \;

View File

@ -38,6 +38,7 @@
%dir %{_sysconfdir}/onlyoffice/
%dir %{_sysconfdir}/onlyoffice/%{product}/
%dir %{_sysconfdir}/onlyoffice/%{product}/.private/
%dir %{_var}/www/onlyoffice/Data
%dir %{_var}/log/onlyoffice/
%files files-services

View File

@ -30,6 +30,7 @@ mkdir -p "%{buildroot}%{buildpath}/public/"
mkdir -p "%{buildroot}%{buildpath}/client/"
mkdir -p "%{buildroot}%{buildpath}/products/ASC.Login/login/"
mkdir -p "%{buildroot}/usr/lib/systemd/system/"
mkdir -p "%{buildroot}/%{_var}/www/onlyoffice/Data"
cp -rf %{_builddir}/%{sourcename}/LICENSE "%{buildroot}%{_docdir}/%{name}-%{version}-%{release}/"
cp -rf %{_builddir}/%{sourcename}/README.md "%{buildroot}%{_docdir}/%{name}-%{version}-%{release}/"
cp -rf %{_builddir}/%{sourcename}/ASC.Migration.Runner/service/* "%{buildroot}%{buildpath}/services/ASC.Migration.Runner/"

View File

@ -1,179 +1,249 @@
%package backup
Packager: %{packager}
Summary: Backup
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: dotnet-sdk-7.0
AutoReqProv: no
BuildArch: noarch
%description backup
Backup
The service which handles API requests related to backup
%package common
Packager: %{packager}
Summary: Common
Group: Applications/Internet
Requires: logrotate
BuildArch: noarch
%description common
Common
A package containing configure and scripts
%package files-services
Packager: %{packager}
Summary: Files-services
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: dotnet-sdk-7.0
Requires: ffmpeg
AutoReqProv: no
BuildArch: noarch
%description files-services
Files-services
The service which launches additional services related to file management:
- ElasticSearchIndexService - indexes documents using Elasticsearch;
- FeedAggregatorService - aggregates notifications;
- FeedCleanerService - removes notifications;
- FileConverterService - converts documents;
- ThumbnailBuilderService - generates thumbnails for documents;
- Launcher - removes outdated files from Trash;
%package notify
Packager: %{packager}
Summary: Notify
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: dotnet-sdk-7.0
AutoReqProv: no
BuildArch: noarch
%description notify
Notify
The service which launches additional services
related to notifications about DocSpace events:
NotifySenderService which sends messages from the base,
and NotifyCleanerService which removes messages
%package files
Packager: %{packager}
Summary: Files
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: dotnet-sdk-7.0
AutoReqProv: no
BuildArch: noarch
%description files
Files
The service which handles API requests related to
documents and launches the OFormService service
%package proxy
Packager: %{packager}
Summary: Proxy
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: nginx >= 1.9.5
Requires: mysql-community-client >= 5.7.0
AutoReqProv: no
BuildArch: noarch
%description proxy
Proxy
The service which is used as a web server and reverse proxy,
it receives and handles requests, transmits them to other services,
receives a response from them and returns it to the client
%package studio-notify
Packager: %{packager}
Summary: Studio-notify
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: dotnet-sdk-7.0
AutoReqProv: no
BuildArch: noarch
%description studio-notify
Studio-notify
The service responsible for creating notifications and
sending them to other services, for example, TelegramService and NotifyService
%package people-server
Packager: %{packager}
Summary: People-server
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: dotnet-sdk-7.0
AutoReqProv: no
BuildArch: noarch
%description people-server
People-server
The service which handles API requests related to the People module
%package socket
Packager: %{packager}
Summary: Socket
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: nodejs >= 16.0
AutoReqProv: no
BuildArch: noarch
%description socket
Socket
The service which provides two-way communication between a client and a server
%package studio
Packager: %{packager}
Summary: Studio
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: dotnet-sdk-7.0
AutoReqProv: no
BuildArch: noarch
%description studio
Studio
The service which processes storage handlers and authorization pages
%package api
Packager: %{packager}
Summary: Api
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: dotnet-sdk-7.0
AutoReqProv: no
BuildArch: noarch
%description api
Api
The service which is used for working with a certain portal. This service
handles API requests not related to backup, documents, and the People
module, for example, requests related to settings, audit, authentication, etc.
%package api-system
Packager: %{packager}
Summary: Api-system
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: dotnet-sdk-7.0
AutoReqProv: no
BuildArch: noarch
%description api-system
Api-system
The service which is used for working with portals (creating, removing, etc.)
%package ssoauth
Packager: %{packager}
Summary: Ssoauth
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: nodejs >= 16.0
AutoReqProv: no
BuildArch: noarch
%description ssoauth
Ssoauth
The service responsible for enabling and configuring
SAML-based single sign-on (SSO) authentication to provide a more quick,
easy and secure way to access DocSpace for users
%package clear-events
Packager: %{packager}
Summary: Clear-events
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: dotnet-sdk-7.0
AutoReqProv: no
BuildArch: noarch
%description clear-events
Clear-events
The service responsible for clearing the login_events and audit_events tables
by LoginHistoryLifeTime and AuditTrailLifeTime to log out users after a timeout
%package backup-background
Packager: %{packager}
Summary: Backup-background
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: dotnet-sdk-7.0
AutoReqProv: no
BuildArch: noarch
%description backup-background
Backup-background
The service which launches additional services related to backup creation:
- BackupWorkerService - launches WorkerService which runs backup/restore, etc;
- BackupListenerService - waits for a signal to delete backups;
- BackupCleanerTempFileService - removes temporary backup files;
- BackupCleanerService - removes outdated backup files;
- BackupSchedulerService - runs backup according to a schedule;
%package radicale
Packager: %{packager}
Summary: Radicale
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: python3 >= 3.6
Requires: python3-pip
Requires: python3-requests
Requires: python3-setuptools
AutoReqProv: no
BuildArch: noarch
%description radicale
Radicale
Radicale is a server designed to support the CalDav and CardDav protocols.
It operates either as a standalone package using its own internal HTTP server
or can be integrated with an existing web server
%package doceditor
Packager: %{packager}
Summary: Doceditor
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: nodejs >= 16.0
AutoReqProv: no
BuildArch: noarch
%description doceditor
Doceditor
The service which allows interaction with document-server
%package migration-runner
Packager: %{packager}
Summary: Migration-runner
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: dotnet-sdk-7.0
AutoReqProv: no
BuildArch: noarch
%description migration-runner
Migration-runner
The service responsible for the database creation.
A database connection is transferred to the service and
the service creates tables and populates them with values
%package login
Packager: %{packager}
Summary: Login
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: nodejs >= 16.0
AutoReqProv: no
BuildArch: noarch
%description login
Login
The service which is used for logging users and displaying the wizard
%package healthchecks
Packager: %{packager}
Summary: Healthchecks
Group: Applications/Internet
Requires: %name-common = %version-%release
Requires: dotnet-sdk-7.0
AutoReqProv: no
BuildArch: noarch
%description healthchecks
Healthchecks
The service which displays launched services

View File

@ -1,3 +1,4 @@
%define _binaries_in_noarch_packages_terminate_build 0
%define _build_id_links none
%global product docspace
@ -12,8 +13,10 @@ Release: %{release}
AutoReqProv: no
BuildArch: noarch
URL: http://onlyoffice.com
Vendor: Ascensio System SIA
Packager: %{packager}
License: AGPLv3
Source0: https://github.com/ONLYOFFICE/%{product}/archive/%GIT_BRANCH.tar.gz#/%{sourcename}.tar.gz
@ -96,10 +99,7 @@ if ! which python3; then
fi
fi
python3 -m pip install --upgrade pip
python3 -m pip install --upgrade requests
python3 -m pip install --upgrade setuptools
python3 -m pip install --upgrade radicale==3.0.5
python3 -m pip install --upgrade radicale
python3 -m pip install --upgrade %{buildpath}/Tools/radicale/plugins/app_auth_plugin/.
python3 -m pip install --upgrade %{buildpath}/Tools/radicale/plugins/app_store_plugin/.
python3 -m pip install --upgrade %{buildpath}/Tools/radicale/plugins/app_rights_plugin/.

View File

@ -0,0 +1,871 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DOCUMENT Type="Advanced Installer" CreateVersion="20.0" version="20.0" Modules="enterprise" RootPath="." Language="en" Id="{5159D3C5-2644-4DB0-AAF9-7FB7ED1201EC}">
<COMPONENT cid="caphyon.advinst.msicomp.ProjectOptionsComponent">
<ROW Name="HiddenItems" Value="AppXProductDetailsComponent;AppXDependenciesComponent;AppXAppDetailsComponent;AppXVisualAssetsComponent;AppXCapabilitiesComponent;AppXAppDeclarationsComponent;AppXUriRulesComponent;SccmComponent;ActSyncAppComponent;CPLAppletComponent;AutorunComponent;GameUxComponent;SilverlightSlnComponent;SharePointSlnComponent;FixupComponent;MsiXDiffComponent;MsixManifestEditorComponent"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiPropsComponent">
<ROW Property="AI_BITMAP_DISPLAY_MODE" Value="0"/>
<ROW Property="AI_EMBD_MSI_EXTR_PATH" Value="[TempFolder]" ValueLocId="-"/>
<ROW Property="AI_FINDEXE_TITLE" Value="Select the installation package for [|ProductName]" ValueLocId="AI.Property.FindExeTitle"/>
<ROW Property="AI_PREREQ_REPAIR_ENABLED" MultiBuildValue="DefaultBuild:1"/>
<ROW Property="ALLUSERS" Value="1"/>
<ROW Property="AMQP_HOST" Value="localhost"/>
<ROW Property="AMQP_PORT" Value="5672"/>
<ROW Property="AMQP_PWD" Value="guest"/>
<ROW Property="AMQP_USER" Value="guest"/>
<ROW Property="AMQP_VHOST" Value="/"/>
<ROW Property="ARPCOMMENTS" Value="[|PRODUCT_NAME] is a platform based on .NET Core and React engines which comprises document management features and makes it possible to implement advanced folder management." ValueLocId="*"/>
<ROW Property="ARPCONTACT" Value="20A-6, Ernesta Birznieka-Upisha str., Riga, LV-1050"/>
<ROW Property="ARPHELPLINK" Value="http://dev.onlyoffice.org/"/>
<ROW Property="ARPHELPTELEPHONE" Value="+371 66016425"/>
<ROW Property="ARPNOREPAIR" MultiBuildValue="DefaultBuild:1"/>
<ROW Property="ARPURLINFOABOUT" Value="http://www.onlyoffice.com"/>
<ROW Property="ARPURLUPDATEINFO" Value="http://www.onlyoffice.com/download.aspx"/>
<ROW Property="DATABASE_MIGRATION" Value="true"/>
<ROW Property="DB_HOST" Value="localhost"/>
<ROW Property="DB_NAME" Value="onlyoffice"/>
<ROW Property="DB_PORT" Value="3306"/>
<ROW Property="DB_PWD" Value="root"/>
<ROW Property="DB_USER" Value="root"/>
<ROW Property="DOCUMENT_SERVER_HOST" Value="localhost"/>
<ROW Property="DOCUMENT_SERVER_PORT" Value="8083"/>
<ROW Property="ELASTICSEARCH_HOST" Value="localhost"/>
<ROW Property="ELASTICSEARCH_MSG" Value="Unable to connect to remote Elasticsearch server at "/>
<ROW Property="ELASTICSEARCH_PORT" Value="9200"/>
<ROW Property="ELASTICSEARCH_SCHEME" Value="http"/>
<ROW Property="INSTALL_ROOT_FOLDER_NAME" Value="[|Manufacturer]"/>
<ROW Property="JWT_ENABLED" Value="true"/>
<ROW Property="JWT_HEADER" Value="Authorization"/>
<ROW Property="LICENSE_PATH" Value=" "/>
<ROW Property="MSIFASTINSTALL" MultiBuildValue="DefaultBuild:3"/>
<ROW Property="MYSQLODBCDRIVER" Value="MySQL ODBC 8.0 Unicode Driver"/>
<ROW Property="Manufacturer" Value="Ascensio System SIA"/>
<ROW Property="MsiLogging" MultiBuildValue="DefaultBuild:vp"/>
<ROW Property="MySQLConnector" Value="MySQL Connector/ODBC 8.0.21 x86"/>
<ROW Property="NEED_REINDEX_ELASTICSEARCH" Value="FALSE"/>
<ROW Property="PACKAGE_NAME" Value="ONLYOFFICE_DocSpace_Enterprise_Win-install.v[|ProductVersion]"/>
<ROW Property="PRODUCT_NAME" Value="ONLYOFFICE DocSpace"/>
<ROW Property="PS_DB_HOST" Value="localhost"/>
<ROW Property="PS_DB_NAME" Value="onlyoffice"/>
<ROW Property="PS_DB_PORT" Value="5432"/>
<ROW Property="PS_DB_PWD" Value="onlyoffice"/>
<ROW Property="PS_DB_USER" Value="onlyoffice"/>
<ROW Property="Prereq_IAgree" Value="No"/>
<ROW Property="ProductCode" Value="1033:{9EB28D7F-9705-4DBB-97E1-FFCA1F5DBF12} " Type="16"/>
<ROW Property="ProductLanguage" Value="1033"/>
<ROW Property="ProductName" Value="[|PRODUCT_NAME]"/>
<ROW Property="ProductVersion" Value="1.0.0" Options="32"/>
<ROW Property="REDIS_HOST" Value="localhost"/>
<ROW Property="REDIS_PORT" Value="6379"/>
<ROW Property="REDIS_PWD" Value=" " Options="1"/>
<ROW Property="SecureCustomProperties" Value="OLDPRODUCTS;AI_NEWERPRODUCTFOUND;AI_SETUPEXEPATH;SETUPEXEDIR"/>
<ROW Property="UpgradeCode" Value="{4BCD210E-EB09-4CC7-B23A-ECA6D6AFA76D}"/>
<ROW Property="WindowsType9X" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
<ROW Property="WindowsType9XDisplay" MultiBuildValue="DefaultBuild:Windows 9x/ME" ValueLocId="-"/>
<ROW Property="WindowsTypeNT" MultiBuildValue="DefaultBuild:Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" ValueLocId="-"/>
<ROW Property="WindowsTypeNT40" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
<ROW Property="WindowsTypeNT40Display" MultiBuildValue="DefaultBuild:Windows NT 4.0" ValueLocId="-"/>
<ROW Property="WindowsTypeNT50" MultiBuildValue="DefaultBuild:Windows 2000" ValueLocId="-"/>
<ROW Property="WindowsTypeNT50Display" MultiBuildValue="DefaultBuild:Windows 2000" ValueLocId="-"/>
<ROW Property="WindowsTypeNT5X" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
<ROW Property="WindowsTypeNT5XDisplay" MultiBuildValue="DefaultBuild:Windows XP/2003" ValueLocId="-"/>
<ROW Property="WindowsTypeNT64" MultiBuildValue="DefaultBuild:Windows Vista x64, Windows Server 2008 x64, Windows 7 x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows 8.1 x64, Windows 10 x64, Windows 11 x64" ValueLocId="-"/>
<ROW Property="WindowsTypeNT64Display" MultiBuildValue="DefaultBuild:Windows Vista x64, Windows Server 2008 x64, Windows 7 x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows 8.1 x64, Windows 10 x64, Windows 11 x64" ValueLocId="-"/>
<ROW Property="WindowsTypeNTDisplay" MultiBuildValue="DefaultBuild:32-bit Windows versions" ValueLocId="-"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiDirsComponent">
<ROW Directory="APPDIR" Directory_Parent="TARGETDIR" DefaultDir="APPDIR:." IsPseudoRoot="1"/>
<ROW Directory="TARGETDIR" DefaultDir="SourceDir"/>
<ROW Directory="TempFolder" Directory_Parent="TARGETDIR" DefaultDir="TEMPFO~1|TempFolder" IsPseudoRoot="1"/>
<ROW Directory="config_Dir" Directory_Parent="APPDIR" DefaultDir="config"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCompsComponent">
<ROW Component="APPDIR" ComponentId="{900ECB1B-D0C1-47FE-8322-54CBE0B1FFE4}" Directory_="APPDIR" Attributes="0" Options="2"/>
<ROW Component="ONLYOFFICEDocumentS" ComponentId="{BF807396-6118-4767-83CD-B3108EB7F9A3}" Directory_="APPDIR" Attributes="4" KeyPath="ONLYOFFICEDocumentS" Options="2"/>
<ROW Component="config" ComponentId="{E7F92803-D873-450B-8CD6-9AA04C888056}" Directory_="config_Dir" Attributes="0"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatsComponent">
<ROW Feature="MainFeature" Title="MainFeature" Description="Description" Display="1" Level="1" Directory_="APPDIR" Attributes="0"/>
<ROW Feature="ONLYOFFICEDocumentS" Title="ONLYOFFICE DocumentServer" Description="ONLYOFFICE DocumentServer" Display="3" Level="1" Attributes="0"/>
<ATTRIBUTE name="CurrentFeature" value="MainFeature"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.BootstrOptComponent">
<ROW BootstrOptKey="GlobalOptions" DownloadFolder="[AppDataFolder][|Manufacturer]\[|ProductName]\prerequisites" Options="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.BuildComponent">
<ROW BuildKey="DefaultBuild" BuildName="EXE_ENTERPRISE" BuildOrder="1" BuildType="0" PackageFolder="publish" PackageFileName="[|PACKAGE_NAME]" Languages="en" InstallationType="4" CabsLocation="1" PackageType="1" FilesInsideExe="true" ExeIconPath="Resources\icon.ico" ExtractionFolder="[AppDataFolder][|INSTALL_ROOT_FOLDER_NAME]\DocSpace\install" ExtUI="true" UseLargeSchema="true" Unicode="true" ExeName="[|PACKAGE_NAME]" UACExecutionLevel="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.ChainedPackageComponent">
<ROW ChainedPackage="ONLYOFFICE_DocSpace" Order="1" Options="108" LogPath="[TempFolder]CHAINERS_LOG\ONLYOFFICE_DocSpace_Enterprise_Win-install.v[ProductVersion].log" InstallCondition="NOT Installed AND NOT DOCSPACE_INSTALLED" MaintenanceCondition="UILevel = 5" RemoveCondition="REMOVE=&quot;ALL&quot;"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.ChainedPackageFileComponent">
<ROW FileId="ONLYOFFICE_DocSpace_Wininstall.v8" ChainedPackage="ONLYOFFICE_DocSpace" Options="1" TargetPath="ONLYOFFICE_DocSpace_Win-install.msi" Content="publish\ONLYOFFICE_DocSpace_Win-install.msi"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent">
<ROW Path="&lt;AI_DICTS&gt;ui.ail"/>
<ROW Path="&lt;AI_DICTS&gt;ui_en.ail"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.DigCertStoreComponent">
<ROW TimeStampUrl="http://timestamp.comodoca.com" SignerDescription="[|ProductName]" SignOptions="0" SignTool="0" UseSha256="1"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.FragmentComponent">
<ROW Fragment="CommonUI.aip" Path="&lt;AI_FRAGS&gt;CommonUI.aip"/>
<ROW Fragment="FolderDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\FolderDlg.aip"/>
<ROW Fragment="MaintenanceTypeDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\MaintenanceTypeDlg.aip"/>
<ROW Fragment="MaintenanceWelcomeDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\MaintenanceWelcomeDlg.aip"/>
<ROW Fragment="PreparePrereqDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\PreparePrereqDlg.aip"/>
<ROW Fragment="PrerequisitesDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\PrerequisitesDlg.aip"/>
<ROW Fragment="ProgressPrereqDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\ProgressPrereqDlg.aip"/>
<ROW Fragment="SQLConnectionDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\SQLConnectionDlg.aip"/>
<ROW Fragment="SequenceDialogs.aip" Path="&lt;AI_THEMES&gt;classic\fragments\SequenceDialogs.aip"/>
<ROW Fragment="Sequences.aip" Path="&lt;AI_FRAGS&gt;Sequences.aip"/>
<ROW Fragment="StaticUIStrings.aip" Path="&lt;AI_FRAGS&gt;StaticUIStrings.aip"/>
<ROW Fragment="Themes.aip" Path="&lt;AI_FRAGS&gt;Themes.aip"/>
<ROW Fragment="UI.aip" Path="&lt;AI_THEMES&gt;classic\fragments\UI.aip"/>
<ROW Fragment="Validation.aip" Path="&lt;AI_FRAGS&gt;Validation.aip"/>
<ROW Fragment="VerifyRemoveDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\VerifyRemoveDlg.aip"/>
<ROW Fragment="VerifyRepairDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\VerifyRepairDlg.aip"/>
<ROW Fragment="WelcomeDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\WelcomeDlg.aip"/>
<ROW Fragment="WelcomePrereqDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\WelcomePrereqDlg.aip"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.JsonFileComponent">
<ROW JsonFile="appsettings.json" FileName="APPSET~1.JSO|appsettings.production.json" DirProperty="config_Dir" Component="config" RootProperty="Root" Flags="6" IndentUnits="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.JsonPropertyComponent">
<ROW JsonProperty="Root" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="file" Parent="license" Name="file" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="license" Parent="Root" Name="license" Condition="1" Order="2" Flags="60"/>
<ROW JsonProperty="path" Parent="file" Name="path" Condition="1" Order="0" Flags="57" Value="[LICENSE_PATH]"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiActionTextComponent">
<ROW Action="AI_ConfigureChainer" Description="Configuring prerequisites launcher" DescriptionLocId="ActionText.Description.AI_ConfigureChainer" Template="Configure Launcher" TemplateLocId="ActionText.Template.AI_ConfigureChainer"/>
<ROW Action="AI_DeleteLzma" Description="Deleting files extracted from archive" DescriptionLocId="ActionText.Description.AI_DeleteLzma" TemplateLocId="-"/>
<ROW Action="AI_DeleteRLzma" Description="Deleting files extracted from archive" DescriptionLocId="ActionText.Description.AI_DeleteLzma" TemplateLocId="-"/>
<ROW Action="AI_DownloadPrereq" Description="Downloading prerequisite software" DescriptionLocId="ActionText.Description.AI_DownloadPrereq" Template="[1]" TemplateLocId="ActionText.Template.AI_DownloadPrereq"/>
<ROW Action="AI_ExtractFiles" Description="Extracting files from archive" DescriptionLocId="ActionText.Description.AI_ExtractLzma" TemplateLocId="-"/>
<ROW Action="AI_ExtractLzma" Description="Extracting files from archive" DescriptionLocId="ActionText.Description.AI_ExtractLzma" TemplateLocId="-"/>
<ROW Action="AI_ExtractPrereq" Description="Extracting prerequisite software" DescriptionLocId="ActionText.Description.AI_ExtractPrereq" Template="[1]" TemplateLocId="ActionText.Template.AI_ExtractPrereq"/>
<ROW Action="AI_InstallPostPrerequisite" Description="Installing prerequisite software" DescriptionLocId="ActionText.Description.AI_InstallPrerequisite" Template="[1]" TemplateLocId="ActionText.Template.AI_InstallPrerequisite"/>
<ROW Action="AI_InstallPrerequisite" Description="Installing prerequisite software" DescriptionLocId="ActionText.Description.AI_InstallPrerequisite" Template="[1]" TemplateLocId="ActionText.Template.AI_InstallPrerequisite"/>
<ROW Action="AI_JsonCommit" Description="Committing JSON file configurations." DescriptionLocId="ActionText.Description.AI_JsonCommit" Template="Committing JSON file configurations." TemplateLocId="ActionText.Template.AI_JsonCommit"/>
<ROW Action="AI_JsonConfig" Description="Executing JSON file configurations" DescriptionLocId="ActionText.Description.AI_JsonConfig" Template="Configuring JSON file: &quot;[1]&quot;" TemplateLocId="ActionText.Template.AI_JsonConfig"/>
<ROW Action="AI_JsonInstall" Description="Generating actions to configure JSON files" DescriptionLocId="ActionText.Description.AI_JsonInstall"/>
<ROW Action="AI_JsonRemove" Description="Executing JSON file configurations" DescriptionLocId="ActionText.Description.AI_JsonRemove" Template="Configuring JSON file: &quot;[1]&quot;" TemplateLocId="ActionText.Template.AI_JsonRemove"/>
<ROW Action="AI_JsonRollback" Description="Rolling back JSON file configurations." DescriptionLocId="ActionText.Description.AI_JsonRollback" Template="Rolling back JSON file configurations." TemplateLocId="ActionText.Template.AI_JsonRollback"/>
<ROW Action="AI_JsonUninstall" Description="Generating actions to configure JSON files" DescriptionLocId="ActionText.Description.AI_JsonUninstall"/>
<ROW Action="AI_VerifyPrereq" Description="Verifying prerequisites" DescriptionLocId="ActionText.Description.AI_VerifyPrereq" Template="[1] was not installed correctly." TemplateLocId="ActionText.Template.AI_VerifyPrereq"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiAppSearchComponent">
<ROW Property="AI_SETUPEXEPATH" Signature_="AI_EXE_PATH_LM" Builds="DefaultBuild"/>
<ROW Property="AI_SETUPEXEPATH" Signature_="AI_EXE_PATH_CU" Builds="DefaultBuild"/>
<ROW Property="REDIS_PWD" Signature_="AppSearchSign"/>
<ROW Property="REDIS_PORT" Signature_="AppSearchSign_1"/>
<ROW Property="REDIS_HOST" Signature_="AppSearchSign_2"/>
<ROW Property="PS_DB_USER" Signature_="AppSearchSign_3"/>
<ROW Property="PS_DB_PWD" Signature_="AppSearchSign_4"/>
<ROW Property="PS_DB_PORT" Signature_="AppSearchSign_5"/>
<ROW Property="PS_DB_NAME" Signature_="AppSearchSign_6"/>
<ROW Property="PS_DB_HOST" Signature_="AppSearchSign_7"/>
<ROW Property="ELASTICSEARCH_SCHEME" Signature_="AppSearchSign_8"/>
<ROW Property="ELASTICSEARCH_PORT" Signature_="AppSearchSign_9"/>
<ROW Property="ELASTICSEARCH_MSG" Signature_="AppSearchSign_10"/>
<ROW Property="ELASTICSEARCH_HOST" Signature_="AppSearchSign_11"/>
<ROW Property="DB_USER" Signature_="AppSearchSign_12"/>
<ROW Property="DB_PWD" Signature_="AppSearchSign_13"/>
<ROW Property="DB_PORT" Signature_="AppSearchSign_14"/>
<ROW Property="DB_NAME" Signature_="AppSearchSign_15"/>
<ROW Property="DB_HOST" Signature_="AppSearchSign_16"/>
<ROW Property="AMQP_VHOST" Signature_="AppSearchSign_17"/>
<ROW Property="AMQP_USER" Signature_="AppSearchSign_18"/>
<ROW Property="AMQP_PWD" Signature_="AppSearchSign_19"/>
<ROW Property="AMQP_PORT" Signature_="AppSearchSign_20"/>
<ROW Property="AMQP_HOST" Signature_="AppSearchSign_21"/>
<ROW Property="DOCUMENT_SERVER_JWT_ENABLED" Signature_="AppSearchSign_22"/>
<ROW Property="DOCUMENT_SERVER_JWT_HEADER" Signature_="AppSearchSign_23"/>
<ROW Property="DOCUMENT_SERVER_JWT_SECRET" Signature_="AppSearchSign_24"/>
<ROW Property="DOCUMENT_SERVER_PORT" Signature_="AppSearchSign_25"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiBinaryComponent">
<ROW Name="Prereq.dll" SourcePath="&lt;AI_CUSTACTS&gt;Prereq.dll"/>
<ROW Name="Utils.CA.dll" SourcePath="Utils.CA.dll"/>
<ROW Name="aicustact.dll" SourcePath="&lt;AI_CUSTACTS&gt;aicustact.dll"/>
<ROW Name="aipackagechainer.exe" SourcePath="&lt;AI_CUSTACTS&gt;aipackagechainer.exe" DigSign="true"/>
<ROW Name="banner.bmp" SourcePath="Resources\banner.bmp"/>
<ROW Name="chainersupport.dll" SourcePath="&lt;AI_CUSTACTS&gt;chainersupport.dll"/>
<ROW Name="dialog.bmp" SourcePath="Resources\dialog.bmp"/>
<ROW Name="file_deleter.ps1" SourcePath="&lt;AI_SCRIPTS&gt;file_deleter.ps1"/>
<ROW Name="jsonCfg.dll" SourcePath="&lt;AI_CUSTACTS&gt;jsonCfg.dll"/>
<ROW Name="lzmaextractor.dll" SourcePath="&lt;AI_CUSTACTS&gt;lzmaextractor.dll"/>
<ROW Name="msichainer.exe" SourcePath="&lt;AI_CUSTACTS&gt;msichainer.exe"/>
<ROW Name="utils.vbs" SourcePath="utils.vbs"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlComponent">
<ROW Dialog_="AdminBrowseDlg" Control="OK" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_OK]" Order="300" TextLocId="-" MsiKey="AdminBrowseDlg#OK"/>
<ROW Dialog_="AdminBrowseDlg" Control="Cancel" Type="PushButton" X="240" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="400" TextLocId="-" MsiKey="AdminBrowseDlg#Cancel"/>
<ROW Dialog_="AdminBrowseDlg" Control="ComboLabel" Type="Text" X="25" Y="58" Width="60" Height="10" Attributes="3" Text="&amp;Look in:" Order="500" TextLocId="Control.Text.AdminBrowseDlg#ComboLabel" MsiKey="AdminBrowseDlg#ComboLabel"/>
<ROW Dialog_="AdminBrowseDlg" Control="DirectoryCombo" Type="DirectoryCombo" X="86" Y="55" Width="204" Height="80" Attributes="458755" Property="TARGETDIR" Order="600" MsiKey="AdminBrowseDlg#DirectoryCombo"/>
<ROW Dialog_="AdminBrowseDlg" Control="Up" Type="PushButton" X="298" Y="55" Width="19" Height="19" Attributes="3670019" Text="[UpDirIcon]" Help="Up One Level|" Order="700" HelpLocId="Control.Help.AdminBrowseDlg#Up" MsiKey="AdminBrowseDlg#Up"/>
<ROW Dialog_="AdminBrowseDlg" Control="NewFolder" Type="PushButton" X="325" Y="55" Width="19" Height="19" Attributes="3670019" Text="[NewDirIcon]" Help="Create A New Folder|" Order="800" HelpLocId="Control.Help.AdminBrowseDlg#NewFolder" MsiKey="AdminBrowseDlg#NewFolder"/>
<ROW Dialog_="AdminBrowseDlg" Control="DirectoryList" Type="DirectoryList" X="25" Y="83" Width="320" Height="110" Attributes="7" Property="TARGETDIR" Order="900" MsiKey="AdminBrowseDlg#DirectoryList"/>
<ROW Dialog_="AdminBrowseDlg" Control="PathLabel" Type="Text" X="25" Y="205" Width="75" Height="10" Attributes="3" Text="&amp;Folder name:" Order="1000" TextLocId="Control.Text.AdminBrowseDlg#PathLabel" MsiKey="AdminBrowseDlg#PathLabel"/>
<ROW Dialog_="AdminBrowseDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="1100" MsiKey="AdminBrowseDlg#BannerBitmap"/>
<ROW Dialog_="AdminBrowseDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="65539" Text="Change current destination folder" TextStyle="[DlgTitleFont]" Order="1200" TextLocId="Control.Text.AdminBrowseDlg#Title" MsiKey="AdminBrowseDlg#Title"/>
<ROW Dialog_="AdminBrowseDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Attributes="196611" Text="Browse to the destination folder" Order="1300" TextLocId="Control.Text.AdminBrowseDlg#Description" MsiKey="AdminBrowseDlg#Description"/>
<ROW Dialog_="AdminBrowseDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="1400" MsiKey="AdminBrowseDlg#BannerLine"/>
<ROW Dialog_="AdminInstallPointDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="500" TextLocId="-" MsiKey="AdminInstallPointDlg#Back" Options="1"/>
<ROW Dialog_="AdminInstallPointDlg" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Next]" Order="600" TextLocId="-" MsiKey="AdminInstallPointDlg#Next" Options="1"/>
<ROW Dialog_="AdminInstallPointDlg" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="700" TextLocId="-" MsiKey="AdminInstallPointDlg#Cancel" Options="1"/>
<ROW Dialog_="AdminInstallPointDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="800" MsiKey="AdminInstallPointDlg#BannerBitmap"/>
<ROW Dialog_="AdminInstallPointDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Network Location" TextStyle="[DlgTitleFont]" Order="900" TextLocId="Control.Text.AdminInstallPointDlg#Title" MsiKey="AdminInstallPointDlg#Title"/>
<ROW Dialog_="AdminInstallPointDlg" Control="Description" Type="Text" X="25" Y="20" Width="280" Height="20" Attributes="196611" Text="Please specify a network location for the server image of [ProductName] product" Order="1000" TextLocId="Control.Text.AdminInstallPointDlg#Description" MsiKey="AdminInstallPointDlg#Description"/>
<ROW Dialog_="AdminInstallPointDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="1100" MsiKey="AdminInstallPointDlg#BannerLine"/>
<ROW Dialog_="AdminWelcomeDlg" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="dialog.bmp" Order="300" MsiKey="AdminWelcomeDlg#Bitmap"/>
<ROW Dialog_="AdminWelcomeDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="AdminWelcomeDlg#Back" Options="1"/>
<ROW Dialog_="BrowseDlg" Control="OK" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_OK]" Order="300" TextLocId="-" MsiKey="BrowseDlg#OK"/>
<ROW Dialog_="BrowseDlg" Control="Cancel" Type="PushButton" X="240" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="400" TextLocId="-" MsiKey="BrowseDlg#Cancel"/>
<ROW Dialog_="BrowseDlg" Control="ComboLabel" Type="Text" X="25" Y="58" Width="60" Height="10" Attributes="3" Text="&amp;Look in:" Order="500" TextLocId="Control.Text.BrowseDlg#ComboLabel" MsiKey="BrowseDlg#ComboLabel"/>
<ROW Dialog_="BrowseDlg" Control="DirectoryCombo" Type="DirectoryCombo" X="86" Y="55" Width="204" Height="80" Attributes="393227" Property="_BrowseProperty" Order="600" MsiKey="BrowseDlg#DirectoryCombo"/>
<ROW Dialog_="BrowseDlg" Control="Up" Type="PushButton" X="298" Y="55" Width="19" Height="19" Attributes="3670019" Text="[UpDirIcon]" Help="Up One Level|" Order="700" HelpLocId="Control.Help.BrowseDlg#Up" MsiKey="BrowseDlg#Up"/>
<ROW Dialog_="BrowseDlg" Control="NewFolder" Type="PushButton" X="325" Y="55" Width="19" Height="19" Attributes="3670019" Text="[NewDirIcon]" Help="Create A New Folder|" Order="800" HelpLocId="Control.Help.BrowseDlg#NewFolder" MsiKey="BrowseDlg#NewFolder"/>
<ROW Dialog_="BrowseDlg" Control="DirectoryList" Type="DirectoryList" X="25" Y="83" Width="320" Height="110" Attributes="15" Property="_BrowseProperty" Order="900" MsiKey="BrowseDlg#DirectoryList"/>
<ROW Dialog_="BrowseDlg" Control="PathLabel" Type="Text" X="25" Y="205" Width="75" Height="10" Attributes="3" Text="&amp;Folder name:" Order="1000" TextLocId="Control.Text.BrowseDlg#PathLabel" MsiKey="BrowseDlg#PathLabel"/>
<ROW Dialog_="BrowseDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="1100" MsiKey="BrowseDlg#BannerBitmap"/>
<ROW Dialog_="BrowseDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Change current destination folder" TextStyle="[DlgTitleFont]" Order="1200" TextLocId="Control.Text.BrowseDlg#Title" MsiKey="BrowseDlg#Title"/>
<ROW Dialog_="BrowseDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Attributes="196611" Text="Browse to the destination folder" Order="1300" TextLocId="Control.Text.BrowseDlg#Description" MsiKey="BrowseDlg#Description"/>
<ROW Dialog_="BrowseDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="1400" MsiKey="BrowseDlg#BannerLine"/>
<ROW Dialog_="CustomizeDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="600" TextLocId="-" MsiKey="CustomizeDlg#Back" Options="1"/>
<ROW Dialog_="CustomizeDlg" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Next]" Order="700" TextLocId="-" MsiKey="CustomizeDlg#Next" Options="1"/>
<ROW Dialog_="CustomizeDlg" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="800" TextLocId="-" MsiKey="CustomizeDlg#Cancel" Options="1"/>
<ROW Dialog_="CustomizeDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="900" MsiKey="CustomizeDlg#BannerBitmap"/>
<ROW Dialog_="CustomizeDlg" Control="LocationLabel" Type="Text" X="25" Y="200" Width="50" Height="10" Attributes="3" Text="Location:" Order="1000" TextLocId="Control.Text.CustomizeDlg#LocationLabel" MsiKey="CustomizeDlg#LocationLabel"/>
<ROW Dialog_="CustomizeDlg" Control="Location" Type="Text" X="75" Y="200" Width="215" Height="20" Attributes="3" Property="APPDIR" Text="&lt;The selection&apos;s path&gt;" Order="1100" TextLocId="Control.Text.CustomizeDlg#Location" MsiKey="CustomizeDlg#Location"/>
<ROW Dialog_="CustomizeDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Attributes="196611" Text="Select the way you want features to be installed." Order="1200" TextLocId="Control.Text.CustomizeDlg#Description" MsiKey="CustomizeDlg#Description"/>
<ROW Dialog_="CustomizeDlg" Control="Box" Type="GroupBox" X="210" Y="81" Width="140" Height="98" Attributes="1" Order="1300" MsiKey="CustomizeDlg#Box"/>
<ROW Dialog_="CustomizeDlg" Control="ItemSize" Type="Text" X="215" Y="128" Width="131" Height="50" Attributes="3" Text="The size of the currently selected item." Order="1400" TextLocId="Control.Text.CustomizeDlg#ItemSize" MsiKey="CustomizeDlg#ItemSize"/>
<ROW Dialog_="CustomizeDlg" Control="ItemDescription" Type="Text" X="215" Y="90" Width="131" Height="30" Attributes="3" Text="Multiline description of the currently selected item." Order="1500" TextLocId="Control.Text.CustomizeDlg#ItemDescription" MsiKey="CustomizeDlg#ItemDescription"/>
<ROW Dialog_="CustomizeDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="1600" MsiKey="CustomizeDlg#BannerLine"/>
<ROW Dialog_="CustomizeDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Custom Setup" TextStyle="[DlgTitleFont]" Order="1700" TextLocId="Control.Text.CustomizeDlg#Title" MsiKey="CustomizeDlg#Title"/>
<ROW Dialog_="CustomizeDlg" Control="Text" Type="Text" X="25" Y="55" Width="320" Height="20" Attributes="3" Text="Click on the icons in the tree below to change the way features will be installed." Order="1800" TextLocId="Control.Text.CustomizeDlg#Text" MsiKey="CustomizeDlg#Text"/>
<ROW Dialog_="DiskCostDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="200" MsiKey="DiskCostDlg#BannerBitmap"/>
<ROW Dialog_="DiskCostDlg" Control="VolumeList" Type="VolumeCostList" X="20" Y="100" Width="330" Height="120" Attributes="393223" Text="{120}{70}{70}{70}{70}" Order="400" TextLocId="Control.Text.DiskCostDlg#VolumeList" MsiKey="DiskCostDlg#VolumeList"/>
<ROW Dialog_="DiskCostDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Disk Space Requirements" TextStyle="[DlgTitleFont]" Order="500" TextLocId="Control.Text.DiskCostDlg#Title" MsiKey="DiskCostDlg#Title"/>
<ROW Dialog_="DiskCostDlg" Control="Text" Type="Text" X="20" Y="53" Width="330" Height="40" Attributes="3" Text="The highlighted volumes (if any) do not have enough disk space available for the currently selected features. You can either remove some files from the highlighted volumes, or choose to install less features onto local drive(s), or select different destination drive(s)." Order="600" TextLocId="Control.Text.DiskCostDlg#Text" MsiKey="DiskCostDlg#Text"/>
<ROW Dialog_="DiskCostDlg" Control="Description" Type="Text" X="20" Y="20" Width="280" Height="20" Attributes="196611" Text="The disk space required for the installation of the selected features." Order="700" TextLocId="Control.Text.DiskCostDlg#Description" MsiKey="DiskCostDlg#Description"/>
<ROW Dialog_="DiskCostDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="800" MsiKey="DiskCostDlg#BannerLine"/>
<ROW Dialog_="ELKConnectionDlg" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Next]" Order="100" Options="1"/>
<ROW Dialog_="ELKConnectionDlg" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="200" Options="1"/>
<ROW Dialog_="ELKConnectionDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="300" Options="1"/>
<ROW Dialog_="ELKConnectionDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="400"/>
<ROW Dialog_="ELKConnectionDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="500"/>
<ROW Dialog_="ELKConnectionDlg" Control="BottomLine" Type="Line" X="5" Y="234" Width="368" Height="0" Attributes="1" Order="600"/>
<ROW Dialog_="ELKConnectionDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Attributes="196611" Text="Настройка подключения Elasticsearch..." Order="700"/>
<ROW Dialog_="ELKConnectionDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Elasticsearch настройки подключения" TextStyle="[DlgTitleFont]" Order="800"/>
<ROW Dialog_="ELKConnectionDlg" Control="ProtocolLabel" Type="Text" X="25" Y="65" Width="67" Height="11" Attributes="65539" Text="Protocol" Order="900"/>
<ROW Dialog_="ELKConnectionDlg" Control="ServerLabel" Type="Text" X="25" Y="92" Width="67" Height="11" Attributes="65539" Text="Server:" Order="1000"/>
<ROW Dialog_="ELKConnectionDlg" Control="PortLabel" Type="Text" X="25" Y="119" Width="67" Height="11" Attributes="65539" Text="Port:" Order="1100"/>
<ROW Dialog_="ELKConnectionDlg" Control="ProtocolEdit" Type="Edit" X="98" Y="61" Width="253" Height="18" Attributes="3" Property="ELASTICSEARCH_SCHEME" Text="{5}" Order="1200"/>
<ROW Dialog_="ELKConnectionDlg" Control="ServerEdit" Type="Edit" X="98" Y="89" Width="253" Height="18" Attributes="3" Property="ELASTICSEARCH_HOST" Text="[ComputerName]" Order="1300"/>
<ROW Dialog_="ELKConnectionDlg" Control="PortEdit" Type="Edit" X="98" Y="116" Width="253" Height="18" Attributes="19" Property="ELASTICSEARCH_PORT" Text="{7}" Order="1400"/>
<ROW Dialog_="ExitDialog" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="dialog.bmp" Order="300" MsiKey="ExitDialog#Bitmap"/>
<ROW Dialog_="ExitDialog" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="ExitDialog#Back" Options="1"/>
<ROW Dialog_="FatalError" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="dialog.bmp" Order="300" MsiKey="FatalError#Bitmap"/>
<ROW Dialog_="FatalError" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="FatalError#Back" Options="1"/>
<ROW Dialog_="FilesInUse" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="400" MsiKey="FilesInUse#BannerBitmap"/>
<ROW Dialog_="FilesInUse" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Files in Use" TextStyle="[DlgTitleFont]" Order="600" TextLocId="Control.Text.FilesInUse#Title" MsiKey="FilesInUse#Title"/>
<ROW Dialog_="FilesInUse" Control="Text" Type="Text" X="20" Y="55" Width="330" Height="30" Attributes="3" Text="The following applications are using files that need to be updated by this setup. You can either close the applications and then click &quot;Retry&quot;, or click &quot;Ignore&quot; so that the installer continues the installation and replaces these files when your system restarts." Order="700" TextLocId="Control.Text.FilesInUse#Text" MsiKey="FilesInUse#Text"/>
<ROW Dialog_="FilesInUse" Control="List" Type="ListBox" X="20" Y="87" Width="330" Height="130" Attributes="7" Property="FileInUseProcess" Order="800" MsiKey="FilesInUse#List"/>
<ROW Dialog_="FilesInUse" Control="Description" Type="Text" X="20" Y="23" Width="280" Height="20" Attributes="196611" Text="Some files that need to be updated are currently in use." Order="900" TextLocId="Control.Text.FilesInUse#Description" MsiKey="FilesInUse#Description"/>
<ROW Dialog_="FilesInUse" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="1000" MsiKey="FilesInUse#BannerLine"/>
<ROW Dialog_="FolderDlg" Control="FolderEdit" Type="PathEdit" X="18" Y="126" Width="252" Height="18" Attributes="7" Property="APPDIR" Help="|" Order="300" HelpLocId="Control.Help.FolderDlg#FolderEdit" MsiKey="FolderDlg#FolderEdit"/>
<ROW Dialog_="FolderDlg" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="600" TextLocId="-" MsiKey="FolderDlg#Cancel" Options="1"/>
<ROW Dialog_="FolderDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="700" TextLocId="-" MsiKey="FolderDlg#Back" Options="1"/>
<ROW Dialog_="FolderDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Help="|" Order="800" HelpLocId="Control.Help.FolderDlg#BannerBitmap" MsiKey="FolderDlg#BannerBitmap"/>
<ROW Dialog_="FolderDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Select Installation Folder" TextStyle="[DlgTitleFont]" Order="900" TextLocId="Control.Text.FolderDlg#Title" MsiKey="FolderDlg#Title"/>
<ROW Dialog_="FolderDlg" Control="Text" Type="Text" X="25" Y="70" Width="320" Height="40" Attributes="3" Text="To install in this folder, click &quot;[Text_Next]&quot;. To install to a different folder, enter it below or click &quot;Browse&quot;." Order="1000" TextLocId="Control.Text.FolderDlg#Text" MsiKey="FolderDlg#Text"/>
<ROW Dialog_="FolderDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Attributes="196611" Text="This is the folder where [ProductName] will be installed." Order="1100" TextLocId="Control.Text.FolderDlg#Description" MsiKey="FolderDlg#Description"/>
<ROW Dialog_="FolderDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="1200" MsiKey="FolderDlg#BannerLine"/>
<ROW Dialog_="MaintenanceTypeDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="700" TextLocId="-" MsiKey="MaintenanceTypeDlg#Back" Options="1"/>
<ROW Dialog_="MaintenanceTypeDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="1000" MsiKey="MaintenanceTypeDlg#BannerBitmap"/>
<ROW Dialog_="MaintenanceTypeDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Attributes="196611" Text="Select the operation you wish to perform." Order="1200" TextLocId="Control.Text.MaintenanceTypeDlg#Description" MsiKey="MaintenanceTypeDlg#Description"/>
<ROW Dialog_="MaintenanceTypeDlg" Control="ChangeText" Type="Text" X="105" Y="78" Width="230" Height="20" Attributes="3" Text="Allows users to change the way features are installed." Order="1300" TextLocId="Control.Text.MaintenanceTypeDlg#ChangeText" MsiKey="MaintenanceTypeDlg#ChangeText"/>
<ROW Dialog_="MaintenanceTypeDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="1400" MsiKey="MaintenanceTypeDlg#BannerLine"/>
<ROW Dialog_="MaintenanceTypeDlg" Control="Title" Type="Text" X="15" Y="6" Width="240" Height="15" Attributes="196611" Text="Modify, Repair or Remove installation" TextStyle="[DlgTitleFont]" Order="1500" TextLocId="Control.Text.MaintenanceTypeDlg#Title" MsiKey="MaintenanceTypeDlg#Title"/>
<ROW Dialog_="MaintenanceTypeDlg" Control="RepairText" Type="Text" X="105" Y="127" Width="230" Height="30" Attributes="3" Text="Repairs errors in the most recent installation state - fixes missing or corrupt files, shortcuts and registry entries." Order="1600" TextLocId="Control.Text.MaintenanceTypeDlg#RepairText" MsiKey="MaintenanceTypeDlg#RepairText"/>
<ROW Dialog_="MaintenanceTypeDlg" Control="RemoveText" Type="Text" X="105" Y="176" Width="230" Height="20" Attributes="3" Text="Removes [ProductName] from your computer." Order="1700" TextLocId="Control.Text.MaintenanceTypeDlg#RemoveText" MsiKey="MaintenanceTypeDlg#RemoveText"/>
<ROW Dialog_="MaintenanceWelcomeDlg" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="dialog.bmp" Order="300" MsiKey="MaintenanceWelcomeDlg#Bitmap"/>
<ROW Dialog_="MaintenanceWelcomeDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="MaintenanceWelcomeDlg#Back" Options="1"/>
<ROW Dialog_="MsiRMFilesInUse" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="300" MsiKey="MsiRMFilesInUse#BannerBitmap"/>
<ROW Dialog_="OutOfDiskDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="200" MsiKey="OutOfDiskDlg#BannerBitmap"/>
<ROW Dialog_="OutOfDiskDlg" Control="VolumeList" Type="VolumeCostList" X="20" Y="100" Width="330" Height="120" Attributes="393223" Text="{120}{70}{70}{70}{70}" Order="400" TextLocId="Control.Text.OutOfDiskDlg#VolumeList" MsiKey="OutOfDiskDlg#VolumeList"/>
<ROW Dialog_="OutOfDiskDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Out of Disk Space" TextStyle="[DlgTitleFont]" Order="500" TextLocId="Control.Text.OutOfDiskDlg#Title" MsiKey="OutOfDiskDlg#Title"/>
<ROW Dialog_="OutOfDiskDlg" Control="Text" Type="Text" X="20" Y="53" Width="330" Height="40" Attributes="3" Text="The highlighted volumes do not have enough disk space available for the currently selected features. You can either remove some files from the highlighted volumes, or choose to install less features onto local drive(s), or select different destination drive(s)." Order="600" TextLocId="Control.Text.OutOfDiskDlg#Text" MsiKey="OutOfDiskDlg#Text"/>
<ROW Dialog_="OutOfDiskDlg" Control="Description" Type="Text" X="20" Y="20" Width="280" Height="20" Attributes="196611" Text="Disk space required for the installation exceeds available disk space." Order="700" TextLocId="Control.Text.OutOfDiskDlg#Description" MsiKey="OutOfDiskDlg#Description"/>
<ROW Dialog_="OutOfDiskDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="800" MsiKey="OutOfDiskDlg#BannerLine"/>
<ROW Dialog_="OutOfRbDiskDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="300" MsiKey="OutOfRbDiskDlg#BannerBitmap"/>
<ROW Dialog_="OutOfRbDiskDlg" Control="Text2" Type="Text" X="20" Y="94" Width="330" Height="40" Attributes="3" Text="Alternatively, you may choose to disable the installer&apos;s rollback functionality. This allows the installer to restore your computer&apos;s original state should the installation be interrupted in any way. Click &quot;Yes&quot; if you wish to take the risk to disable rollback." Order="500" TextLocId="Control.Text.OutOfRbDiskDlg#Text2" MsiKey="OutOfRbDiskDlg#Text2"/>
<ROW Dialog_="OutOfRbDiskDlg" Control="Text" Type="Text" X="20" Y="53" Width="330" Height="40" Attributes="3" Text="The highlighted volumes do not have enough disk space available for the currently selected features. You can either remove some files from the highlighted volumes, or choose to install less features onto local drive(s), or select different destination drive(s)." Order="600" TextLocId="Control.Text.OutOfRbDiskDlg#Text" MsiKey="OutOfRbDiskDlg#Text"/>
<ROW Dialog_="OutOfRbDiskDlg" Control="Description" Type="Text" X="20" Y="20" Width="280" Height="20" Attributes="196611" Text="Disk space required for the installation exceeds available disk space." Order="700" TextLocId="Control.Text.OutOfRbDiskDlg#Description" MsiKey="OutOfRbDiskDlg#Description"/>
<ROW Dialog_="OutOfRbDiskDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="800" MsiKey="OutOfRbDiskDlg#BannerLine"/>
<ROW Dialog_="OutOfRbDiskDlg" Control="VolumeList" Type="VolumeCostList" X="20" Y="140" Width="330" Height="80" Attributes="4587527" Text="{120}{70}{70}{70}{70}" Order="900" TextLocId="Control.Text.OutOfRbDiskDlg#VolumeList" MsiKey="OutOfRbDiskDlg#VolumeList"/>
<ROW Dialog_="OutOfRbDiskDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Out of Disk Space" TextStyle="[DlgTitleFont]" Order="1000" TextLocId="Control.Text.OutOfRbDiskDlg#Title" MsiKey="OutOfRbDiskDlg#Title"/>
<ROW Dialog_="PatchWelcomeDlg" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="dialog.bmp" Order="300" MsiKey="PatchWelcomeDlg#Bitmap"/>
<ROW Dialog_="PatchWelcomeDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="PatchWelcomeDlg#Back" Options="1"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Next]" Order="100" Options="1"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="200" Options="1"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="300" Options="1"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="400"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="500"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="BottomLine" Type="Line" X="5" Y="234" Width="368" Height="0" Attributes="1" Order="600"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Attributes="196611" Text="Configure PostgreSQL Connection..." Order="700"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="PostgreSQL Database" TextStyle="[DlgTitleFont]" Order="800"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="ServerEdit" Type="Edit" X="98" Y="61" Width="253" Height="18" Attributes="3" Property="PS_DB_HOST" Text="{255}" Order="900" TextLocId="Control.Text.SQLConnectionDlg#ServerEdit"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="PortEdit" Type="Edit" X="98" Y="89" Width="253" Height="18" Attributes="19" Property="PS_DB_PORT" Text="{5}" Order="1000" TextLocId="Control.Text.SQLConnectionDlg#PortEdit"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="DatabaseEdit" Type="Edit" X="98" Y="116" Width="253" Height="18" Attributes="3" Property="PS_DB_NAME" Text="{255}" Order="1100" TextLocId="Control.Text.SQLConnectionDlg#DatabaseEdit"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="UsernameEdit" Type="Edit" X="98" Y="143" Width="253" Height="18" Attributes="3" Property="PS_DB_USER" Text="{255}" Order="1200" TextLocId="Control.Text.SQLConnectionDlg#UsernameEdit"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="PasswordEdit" Type="Edit" X="98" Y="172" Width="253" Height="18" Attributes="2097155" Property="PS_DB_PWD" Text="{255}" Order="1300" TextLocId="Control.Text.SQLConnectionDlg#PasswordEdit"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="ServerLabel" Type="Text" X="25" Y="65" Width="67" Height="11" Attributes="196611" Text="Server:" Order="1400"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="PortLabel" Type="Text" X="25" Y="92" Width="67" Height="11" Attributes="196611" Text="Port:" Order="1500"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="DatabaseLabel" Type="Text" X="25" Y="119" Width="67" Height="11" Attributes="196611" Text="Database:" Order="1600"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="UsernameLabel" Type="Text" X="25" Y="148" Width="67" Height="11" Attributes="196611" Text="Username:" Order="1700"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control="PasswordLabel" Type="Text" X="25" Y="176" Width="67" Height="11" Attributes="196611" Text="Password:" Order="1800"/>
<ROW Dialog_="PrepareDlg" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="dialog.bmp" Order="200" MsiKey="PrepareDlg#Bitmap"/>
<ROW Dialog_="PrepareDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1048577" Text="[ButtonText_Back]" Order="700" TextLocId="-" MsiKey="PrepareDlg#Back" Options="1"/>
<ROW Dialog_="PreparePrereqDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="300" TextLocId="-" MsiKey="PreparePrereqDlg#Back" Options="1"/>
<ROW Dialog_="PreparePrereqDlg" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="dialog.bmp" Order="400" MsiKey="PreparePrereqDlg#Bitmap"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Next]" Order="100" TextLocId="-" Options="1"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="200" TextLocId="-" Options="1"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="300" TextLocId="-" Options="1"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="400"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="500"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="BottomLine" Type="Line" X="0" Y="234" Width="368" Height="0" Attributes="1" Order="600"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Attributes="196611" Text="Please read the following license agreement carefully" Order="700"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="Title" Type="Text" X="15" Y="6" Width="289" Height="15" Attributes="196611" Text="End-User License Agreement" TextStyle="[DlgTitleFont]" Order="800"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="AgreementText" Type="ScrollableText" X="20" Y="60" Width="330" Height="120" Attributes="7" Text="Resources\License_Enterprise_Redist.rtf" Order="900" TextLocId="-"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="Buttons" Type="RadioButtonGroup" X="20" Y="187" Width="330" Height="40" Attributes="3" Property="Prereq_IAgree" Order="1000"/>
<ROW Dialog_="PrerequisitesDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="300" TextLocId="-" MsiKey="PrerequisitesDlg#Back" Options="1"/>
<ROW Dialog_="PrerequisitesDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="400" MsiKey="PrerequisitesDlg#BannerBitmap"/>
<ROW Dialog_="PrerequisitesDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Attributes="196611" Text="Select which prerequisites will be installed" Order="700" TextLocId="Control.Text.PrerequisitesDlg#Description" MsiKey="PrerequisitesDlg#Description"/>
<ROW Dialog_="PrerequisitesDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Prerequisites" TextStyle="[DlgTitleFont]" Order="800" TextLocId="Control.Text.PrerequisitesDlg#Title" MsiKey="PrerequisitesDlg#Title"/>
<ROW Dialog_="PrerequisitesDlg" Control="PrerequisiteSelector" Type="PrerequisiteSelector" X="15" Y="57" Width="344" Height="162" Attributes="3" Property="PREREQUISITESDLGPREREQUISITESELECTOR_0_PROP" Text="{110}{80}{70}{70}Name,Required,Found,Action" Order="900" TextLocId="Control.Text.PrerequisitesDlg#PrerequisiteSelector" MsiKey="PrerequisitesDlg#PrerequisiteSelector" ExtType="PrerequisiteSelector"/>
<ROW Dialog_="ProgressDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="200" MsiKey="ProgressDlg#BannerBitmap"/>
<ROW Dialog_="ProgressDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="ProgressDlg#Back" Options="1"/>
<ROW Dialog_="ProgressDlg" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Next]" Order="500" TextLocId="-" MsiKey="ProgressDlg#Next" Options="1"/>
<ROW Dialog_="ProgressDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="600" MsiKey="ProgressDlg#BannerLine"/>
<ROW Dialog_="ProgressDlg" Control="ActionText" Type="Text" X="80" Y="100" Width="255" Height="10" Attributes="3" Order="700" MsiKey="ProgressDlg#ActionText"/>
<ROW Dialog_="ProgressDlg" Control="Title" Type="Text" X="20" Y="15" Width="250" Height="15" Attributes="196611" Text="[Progress1] [ProductName]" TextStyle="[DlgTitleFont]" Order="800" TextLocId="Control.Text.ProgressDlg#Title" MsiKey="ProgressDlg#Title"/>
<ROW Dialog_="ProgressDlg" Control="Text" Type="Text" X="35" Y="65" Width="300" Height="30" Attributes="196611" Text="Please wait while the [Wizard] [Progress2] [ProductName]. This may take several minutes." Order="900" TextLocId="Control.Text.ProgressDlg#Text" MsiKey="ProgressDlg#Text"/>
<ROW Dialog_="ProgressDlg" Control="StatusLabel" Type="Text" X="35" Y="100" Width="45" Height="10" Attributes="3" Text="Status:" Order="1000" TextLocId="Control.Text.ProgressDlg#StatusLabel" MsiKey="ProgressDlg#StatusLabel"/>
<ROW Dialog_="ProgressDlg" Control="ProgressBar" Type="ProgressBar" X="35" Y="115" Width="300" Height="10" Attributes="65537" Text="Progress done" Order="1100" TextLocId="Control.Text.ProgressDlg#ProgressBar" MsiKey="ProgressDlg#ProgressBar"/>
<ROW Dialog_="ProgressPrereqDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="300" TextLocId="-" MsiKey="ProgressPrereqDlg#Back" Options="1"/>
<ROW Dialog_="ProgressPrereqDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="400" MsiKey="ProgressPrereqDlg#BannerBitmap"/>
<ROW Dialog_="ProgressPrereqDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" Attributes="1" Order="600" MsiKey="ProgressPrereqDlg#BannerLine"/>
<ROW Dialog_="ProgressPrereqDlg" Control="ActionText" Type="Text" X="80" Y="100" Width="255" Height="10" Attributes="3" Order="700" MsiKey="ProgressPrereqDlg#ActionText"/>
<ROW Dialog_="ProgressPrereqDlg" Control="Title" Type="Text" X="20" Y="15" Width="250" Height="15" Attributes="196611" Text="[Progress1] prerequisites for [ProductName]" TextStyle="[DlgTitleFont]" Order="800" TextLocId="Control.Text.ProgressPrereqDlg#Title" MsiKey="ProgressPrereqDlg#Title"/>
<ROW Dialog_="ProgressPrereqDlg" Control="Text" Type="Text" X="35" Y="65" Width="300" Height="30" Attributes="196611" Text="Please wait while the [Wizard] [Progress2] prerequisites for [ProductName]. This may take several minutes." Order="900" TextLocId="Control.Text.ProgressPrereqDlg#Text" MsiKey="ProgressPrereqDlg#Text"/>
<ROW Dialog_="ProgressPrereqDlg" Control="StatusLabel" Type="Text" X="35" Y="100" Width="45" Height="10" Attributes="3" Text="Status:" Order="1000" TextLocId="Control.Text.ProgressPrereqDlg#StatusLabel" MsiKey="ProgressPrereqDlg#StatusLabel"/>
<ROW Dialog_="ProgressPrereqDlg" Control="ProgressBar" Type="ProgressBar" X="35" Y="115" Width="300" Height="10" Attributes="65537" Text="Progress done" Order="1100" TextLocId="Control.Text.ProgressPrereqDlg#ProgressBar" MsiKey="ProgressPrereqDlg#ProgressBar"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Next]" Order="100" Options="1"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="200" Options="1"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="300" Options="1"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="400"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="500"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="BottomLine" Type="Line" X="5" Y="234" Width="368" Height="0" Attributes="1" Order="600"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Attributes="196611" Text="Configure RabbitMQ Connection..." Order="700"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="Text_1" Type="Text" X="15" Y="6" Width="289" Height="15" Attributes="196611" Text="RabbitMQ connection settings" TextStyle="[DlgTitleFont]" Order="800"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="ServerLabel" Type="Text" X="25" Y="65" Width="65" Height="11" Attributes="65539" Text="Server:" Order="900" TextLocId="Control.Text.SQLConnectionDlg#ServerLabel"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="PortLabel" Type="Text" X="25" Y="92" Width="65" Height="11" Attributes="65539" Text="Port:" Order="1000" TextLocId="Control.Text.SQLConnectionDlg#PortLabel"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="DatabaseLabel" Type="Text" X="25" Y="119" Width="65" Height="11" Attributes="65539" Text="Virtual Host:" Order="1100"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="UsernameLabel" Type="Text" X="25" Y="148" Width="65" Height="11" Attributes="65539" Text="Username:" Order="1200" TextLocId="Control.Text.SQLConnectionDlg#UsernameLabel"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="PasswordLabel" Type="Text" X="25" Y="176" Width="73" Height="11" Attributes="65539" Text="Password:" Order="1300" TextLocId="Control.Text.SQLConnectionDlg#PasswordLabel"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="Edit_1" Type="Edit" X="98" Y="63" Width="253" Height="18" Attributes="3" Property="AMQP_HOST" Text="{260}" Order="1400"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="PortEdit" Type="Edit" X="98" Y="89" Width="253" Height="18" Attributes="19" Property="AMQP_PORT" Text="{5}" Order="1500"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="DatabaseEdit" Type="Edit" X="98" Y="116" Width="253" Height="18" Attributes="3" Property="AMQP_VHOST" Text="{255}" Order="1600"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="UsernameEdit" Type="Edit" X="98" Y="143" Width="253" Height="18" Attributes="3" Property="AMQP_USER" Text="[LogonUser]" Order="1700"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control="PasswordEdit" Type="Edit" X="98" Y="171" Width="253" Height="18" Attributes="2097155" Property="AMQP_PWD" Text="{255}" Order="1800"/>
<ROW Dialog_="RedisServerConnectionDlg" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Next]" Order="100" Options="1"/>
<ROW Dialog_="RedisServerConnectionDlg" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="200" Options="1"/>
<ROW Dialog_="RedisServerConnectionDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="300" Options="1"/>
<ROW Dialog_="RedisServerConnectionDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="400"/>
<ROW Dialog_="RedisServerConnectionDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="500"/>
<ROW Dialog_="RedisServerConnectionDlg" Control="BottomLine" Type="Line" X="5" Y="234" Width="368" Height="0" Attributes="1" Order="600"/>
<ROW Dialog_="RedisServerConnectionDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Attributes="196611" Text="Redis Server connection settings" Order="700"/>
<ROW Dialog_="RedisServerConnectionDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Redis Server connection settings" TextStyle="[DlgTitleFont]" Order="800"/>
<ROW Dialog_="RedisServerConnectionDlg" Control="ServerLabel" Type="Text" X="25" Y="65" Width="65" Height="11" Attributes="65539" Text="Host:" Order="900"/>
<ROW Dialog_="RedisServerConnectionDlg" Control="PortLabel" Type="Text" X="25" Y="92" Width="65" Height="11" Attributes="65539" Text="Port:" Order="1000" TextLocId="Control.Text.SQLConnectionDlg#PortLabel"/>
<ROW Dialog_="RedisServerConnectionDlg" Control="Text_1" Type="Text" X="25" Y="120" Width="66" Height="11" Attributes="65539" Text="Auth (Optional):" Order="1100"/>
<ROW Dialog_="RedisServerConnectionDlg" Control="ServerEdit" Type="Edit" X="98" Y="61" Width="253" Height="18" Attributes="3" Property="REDIS_HOST" Text="[ComputerName]" Help="|" Order="1200" ExtDataLocId="-"/>
<ROW Dialog_="RedisServerConnectionDlg" Control="PortEdit" Type="Edit" X="98" Y="89" Width="253" Height="18" Attributes="19" Property="REDIS_PORT" Text="{5}" Help="|" Order="1300"/>
<ROW Dialog_="RedisServerConnectionDlg" Control="Edit_1" Type="Edit" X="98" Y="117" Width="253" Height="18" Attributes="2097155" Property="REDIS_PWD" Text="{5}" Help="|" Order="1400"/>
<ROW Dialog_="ResumeDlg" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="dialog.bmp" Order="300" MsiKey="ResumeDlg#Bitmap"/>
<ROW Dialog_="ResumeDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="ResumeDlg#Back" Options="1"/>
<ROW Dialog_="SQLConnectionDlg" Control="SQLConnectionDlgDialogInitializer" Type="DialogInitializer" X="0" Y="0" Width="0" Height="0" Attributes="0" Order="-1" TextLocId="-" HelpLocId="-" ExtDataLocId="-"/>
<ROW Dialog_="SQLConnectionDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="100" MsiKey="SQLConnectionDlg#BannerBitmap"/>
<ROW Dialog_="SQLConnectionDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="MySQL Database" TextStyle="[DlgTitleFont]" Order="200" MsiKey="SQLConnectionDlg#Title"/>
<ROW Dialog_="SQLConnectionDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Attributes="196611" Text="Configure MySQL Connection..." Order="300" MsiKey="SQLConnectionDlg#Description"/>
<ROW Dialog_="SQLConnectionDlg" Control="ServerEdit" Type="Edit" X="98" Y="61" Width="253" Height="18" Attributes="3" Property="DB_HOST" Text="{255}" Order="500" TextLocId="Control.Text.SQLConnectionDlg#ServerEdit" MsiKey="SQLConnectionDlg#ServerEdit"/>
<ROW Dialog_="SQLConnectionDlg" Control="PortEdit" Type="Edit" X="98" Y="89" Width="253" Height="18" Attributes="19" Property="DB_PORT" Text="{5}" Order="600" TextLocId="Control.Text.SQLConnectionDlg#PortEdit" MsiKey="SQLConnectionDlg#PortEdit"/>
<ROW Dialog_="SQLConnectionDlg" Control="DatabaseEdit" Type="Edit" X="98" Y="116" Width="253" Height="18" Attributes="3" Property="DB_NAME" Text="{255}" Order="700" TextLocId="Control.Text.SQLConnectionDlg#DatabaseEdit" MsiKey="SQLConnectionDlg#DatabaseEdit"/>
<ROW Dialog_="SQLConnectionDlg" Control="UsernameEdit" Type="Edit" X="98" Y="143" Width="253" Height="18" Attributes="3" Property="DB_USER" Text="{255}" Order="800" TextLocId="Control.Text.SQLConnectionDlg#UsernameEdit" MsiKey="SQLConnectionDlg#UsernameEdit"/>
<ROW Dialog_="SQLConnectionDlg" Control="PasswordEdit" Type="Edit" X="98" Y="172" Width="253" Height="18" Attributes="2097155" Property="DB_PWD" Text="{255}" Order="900" TextLocId="Control.Text.SQLConnectionDlg#PasswordEdit" MsiKey="SQLConnectionDlg#PasswordEdit"/>
<ROW Dialog_="SQLConnectionDlg" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Next]" Order="1000" TextLocId="-" MsiKey="SQLConnectionDlg#Next" Options="1"/>
<ROW Dialog_="SQLConnectionDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="1100" TextLocId="-" MsiKey="SQLConnectionDlg#Back" Options="1"/>
<ROW Dialog_="SQLConnectionDlg" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="1200" TextLocId="-" MsiKey="SQLConnectionDlg#Cancel" Options="1"/>
<ROW Dialog_="SQLConnectionDlg" Control="ServerLabel" Type="Text" X="25" Y="65" Width="67" Height="11" Attributes="196611" Text="Server:" Order="1300" MsiKey="SQLConnectionDlg#ServerLabel"/>
<ROW Dialog_="SQLConnectionDlg" Control="PortLabel" Type="Text" X="25" Y="92" Width="67" Height="11" Attributes="196611" Text="Port:" Order="1400" MsiKey="SQLConnectionDlg#PortLabel"/>
<ROW Dialog_="SQLConnectionDlg" Control="DatabaseLabel" Type="Text" X="25" Y="119" Width="67" Height="11" Attributes="196611" Text="Database:" Order="1500" MsiKey="SQLConnectionDlg#DatabaseLabel"/>
<ROW Dialog_="SQLConnectionDlg" Control="UsernameLabel" Type="Text" X="25" Y="148" Width="67" Height="11" Attributes="196611" Text="Username:" Order="1600" MsiKey="SQLConnectionDlg#UsernameLabel"/>
<ROW Dialog_="SQLConnectionDlg" Control="PasswordLabel" Type="Text" X="25" Y="176" Width="67" Height="11" Attributes="196611" Text="Password:" Order="1700" MsiKey="SQLConnectionDlg#PasswordLabel"/>
<ROW Dialog_="SQLConnectionDlg" Control="BottomLine" Type="Line" X="5" Y="234" Width="368" Height="0" Attributes="1" Order="1800" MsiKey="SQLConnectionDlg#BottomLine"/>
<ROW Dialog_="UserExit" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="dialog.bmp" Order="300" MsiKey="UserExit#Bitmap"/>
<ROW Dialog_="UserExit" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="UserExit#Back" Options="1"/>
<ROW Dialog_="VerifyReadyDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="300" MsiKey="VerifyReadyDlg#BannerBitmap"/>
<ROW Dialog_="VerifyReadyDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="500" TextLocId="-" MsiKey="VerifyReadyDlg#Back" Options="1"/>
<ROW Dialog_="VerifyReadyDlg" Control="Text" Type="Text" X="25" Y="70" Width="320" Height="40" Attributes="196611" Text="Click &quot;Install&quot; to begin the installation. If you want to review or change any of your installation settings, click &quot;Back&quot;. Click &quot;Cancel&quot; to exit the wizard." Order="600" TextLocId="Control.Text.VerifyReadyDlg#Text" MsiKey="VerifyReadyDlg#Text"/>
<ROW Dialog_="VerifyReadyDlg" Control="Description" Type="Text" X="25" Y="23" Width="304" Height="20" Attributes="196611" Text="The [Wizard] is ready to begin the [ProductName] installation" Order="700" TextLocId="Control.Text.VerifyReadyDlg#Description" MsiKey="VerifyReadyDlg#Description"/>
<ROW Dialog_="VerifyReadyDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="800" MsiKey="VerifyReadyDlg#BannerLine"/>
<ROW Dialog_="VerifyReadyDlg" Control="Title" Type="Text" X="15" Y="6" Width="304" Height="15" Attributes="196611" Text="Ready to Install" TextStyle="[DlgTitleFont]" Order="900" TextLocId="Control.Text.VerifyReadyDlg#Title" MsiKey="VerifyReadyDlg#Title"/>
<ROW Dialog_="VerifyRemoveDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="100" TextLocId="-" MsiKey="VerifyRemoveDlg#Back" Options="1"/>
<ROW Dialog_="VerifyRemoveDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="400" MsiKey="VerifyRemoveDlg#BannerBitmap"/>
<ROW Dialog_="VerifyRemoveDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Remove [ProductName]" TextStyle="DlgFontBold8" Order="600" TextLocId="Control.Text.VerifyRemoveDlg#Title" MsiKey="VerifyRemoveDlg#Title"/>
<ROW Dialog_="VerifyRemoveDlg" Control="Text" Type="Text" X="25" Y="70" Width="320" Height="60" Attributes="3" Text="Click &quot;Remove&quot; to remove [ProductName] from your computer. If you want to review or change any of your installation settings, click &quot;Back&quot;. Click &quot;Cancel&quot; to exit the wizard." Order="700" TextLocId="Control.Text.VerifyRemoveDlg#Text" MsiKey="VerifyRemoveDlg#Text"/>
<ROW Dialog_="VerifyRemoveDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Attributes="196611" Text="You have chosen to remove the program from your computer." Order="800" TextLocId="Control.Text.VerifyRemoveDlg#Description" MsiKey="VerifyRemoveDlg#Description"/>
<ROW Dialog_="VerifyRemoveDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="900" MsiKey="VerifyRemoveDlg#BannerLine"/>
<ROW Dialog_="VerifyRepairDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="300" MsiKey="VerifyRepairDlg#BannerBitmap"/>
<ROW Dialog_="VerifyRepairDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="500" TextLocId="-" MsiKey="VerifyRepairDlg#Back" Options="1"/>
<ROW Dialog_="VerifyRepairDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Repair [ProductName]" TextStyle="DlgFontBold8" Order="600" TextLocId="Control.Text.VerifyRepairDlg#Title" MsiKey="VerifyRepairDlg#Title"/>
<ROW Dialog_="VerifyRepairDlg" Control="Text" Type="Text" X="25" Y="70" Width="320" Height="60" Attributes="3" Text="Click &quot;Repair&quot; to repair the installation of [ProductName]. If you want to review or change any of your installation settings, click &quot;Back&quot;. Click &quot;Cancel&quot; to exit the wizard." Order="700" TextLocId="Control.Text.VerifyRepairDlg#Text" MsiKey="VerifyRepairDlg#Text"/>
<ROW Dialog_="VerifyRepairDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Attributes="196611" Text="The [Wizard] is ready to begin the repair of [ProductName]." Order="800" TextLocId="Control.Text.VerifyRepairDlg#Description" MsiKey="VerifyRepairDlg#Description"/>
<ROW Dialog_="VerifyRepairDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="900" MsiKey="VerifyRepairDlg#BannerLine"/>
<ROW Dialog_="WelcomeDlg" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="dialog.bmp" Order="300" MsiKey="WelcomeDlg#Bitmap"/>
<ROW Dialog_="WelcomeDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="400" TextLocId="-" MsiKey="WelcomeDlg#Back" Options="1"/>
<ROW Dialog_="WelcomePrereqDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="300" TextLocId="-" MsiKey="WelcomePrereqDlg#Back" Options="1"/>
<ROW Dialog_="WelcomePrereqDlg" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="dialog.bmp" Order="500" MsiKey="WelcomePrereqDlg#Bitmap"/>
<ATTRIBUTE name="DeletedRows" value="AdminBrowseDlg#Logo@AdminInstallPointDlg#Logo@BrowseDlg#Logo@CustomizeDlg#Logo@DiskCostDlg#Logo@FilesInUse#Logo@FolderDlg#Logo@MaintenanceTypeDlg#Logo@MsiRMFilesInUse#Logo@OutOfDiskDlg#Logo@OutOfRbDiskDlg#Logo@PrerequisitesDlg#Logo@ProgressDlg#Logo@ProgressPrereqDlg#Logo@SQLConnectionDlg#Logo@SQLConnectionDlg#OdbcResourceEdit@SQLConnectionDlg#OdbcResourceLabel@SQLConnectionDlg.aip@VerifyReadyDlg#Logo@VerifyRemoveDlg#Logo@VerifyRepairDlg#Logo"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlConditionComponent">
<ROW Dialog_="PrereqLicenseAgreementDlg" Control_="Next" Action="Disable" Condition="Prereq_IAgree &lt;&gt; &quot;Yes&quot;"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control_="Next" Action="Enable" Condition="Prereq_IAgree = &quot;Yes&quot;"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlEventComponent">
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; )" Ordering="19"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="SQLConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="216"/>
<ROW Dialog_="FolderDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL" Ordering="1"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_INSTALL" Ordering="197"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="RedisServerConnectionDlg" Condition="AI_INSTALL AND ( RedisServerConnectionError &lt;&gt; &quot;&quot; )" Ordering="203"/>
<ROW Dialog_="MaintenanceWelcomeDlg" Control_="Next" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="99"/>
<ROW Dialog_="CustomizeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_MAINT" Ordering="101"/>
<ROW Dialog_="CustomizeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT" Ordering="1"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_MAINT" Ordering="198"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="204"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="ChangeButton" Event="NewDialog" Argument="CustomizeDlg" Condition="AI_MAINT" Ordering="501"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceWelcomeDlg" Condition="AI_MAINT" Ordering="1"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="RemoveButton" Event="NewDialog" Argument="VerifyRemoveDlg" Condition="AI_MAINT AND InstallMode=&quot;Remove&quot;" Ordering="601"/>
<ROW Dialog_="VerifyRemoveDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode=&quot;Remove&quot;" Ordering="1"/>
<ROW Dialog_="MaintenanceTypeDlg" Control_="RepairButton" Event="NewDialog" Argument="VerifyRepairDlg" Condition="AI_MAINT AND InstallMode=&quot;Repair&quot;" Ordering="601"/>
<ROW Dialog_="VerifyRepairDlg" Control_="Back" Event="NewDialog" Argument="MaintenanceTypeDlg" Condition="AI_MAINT AND InstallMode=&quot;Repair&quot;" Ordering="1"/>
<ROW Dialog_="VerifyRepairDlg" Control_="Repair" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode=&quot;Repair&quot;" Ordering="399" Options="1"/>
<ROW Dialog_="VerifyRemoveDlg" Control_="Remove" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode=&quot;Remove&quot;" Ordering="299" Options="1"/>
<ROW Dialog_="PatchWelcomeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_PATCH" Ordering="201"/>
<ROW Dialog_="ResumeDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_RESUME" Ordering="299"/>
<ROW Dialog_="WelcomePrereqDlg" Control_="Next" Event="NewDialog" Argument="PrereqLicenseAgreementDlg" Condition="AI_BOOTSTRAPPER" Ordering="1"/>
<ROW Dialog_="PrerequisitesDlg" Control_="Next" Event="EndDialog" Argument="Return" Condition="AI_BOOTSTRAPPER" Ordering="1"/>
<ROW Dialog_="PrerequisitesDlg" Control_="Back" Event="NewDialog" Argument="PrereqLicenseAgreementDlg" Condition="AI_BOOTSTRAPPER" Ordering="1"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control_="Next" Event="NewDialog" Argument="PrerequisitesDlg" Condition="AI_BOOTSTRAPPER" Ordering="1"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control_="Back" Event="NewDialog" Argument="WelcomePrereqDlg" Condition="AI_BOOTSTRAPPER" Ordering="1"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_PATCH" Ordering="199"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="PatchWelcomeDlg" Condition="AI_PATCH" Ordering="205"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_5" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="4"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="DoAction" Argument="TestSQLConnectionMsgBox" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="5"/>
<ROW Dialog_="SQLConnectionDlg" Control_="SQLConnectionDlgDialogInitializer" Event="[DB_PWD]" Argument="{}" Condition="AI_INSTALL AND ( OLDPRODUCTS=&quot;&quot; AND SQLConnectionDlg_Cond )" Ordering="4"/>
<ROW Dialog_="SQLConnectionDlg" Control_="SQLConnectionDlgDialogInitializer" Event="[AI_ButtonText_Next_Orig]" Argument="[ButtonText_Next]" Condition="AI_INSTALL AND ( OLDPRODUCTS=&quot;&quot; AND SQLConnectionDlg_Cond )" Ordering="3"/>
<ROW Dialog_="SQLConnectionDlg" Control_="SQLConnectionDlgDialogInitializer" Event="[ButtonText_Next]" Argument="[[AI_CommitButton]]" Condition="AI_INSTALL AND ( OLDPRODUCTS=&quot;&quot; AND SQLConnectionDlg_Cond )" Ordering="2"/>
<ROW Dialog_="SQLConnectionDlg" Control_="SQLConnectionDlgDialogInitializer" Event="[AI_Text_Next_Orig]" Argument="[Text_Next]" Condition="AI_INSTALL AND ( OLDPRODUCTS=&quot;&quot; AND SQLConnectionDlg_Cond )" Ordering="1"/>
<ROW Dialog_="SQLConnectionDlg" Control_="SQLConnectionDlgDialogInitializer" Event="[Text_Next]" Argument="[Text_Install]" Condition="AI_INSTALL AND ( OLDPRODUCTS=&quot;&quot; AND SQLConnectionDlg_Cond )" Ordering="0"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="NewDialog" Argument="ELKConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="6"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; )" Ordering="2"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="DoAction" Argument="TestSqlConnection" Condition="AI_INSTALL" Ordering="1"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="SQLConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; AND OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="20"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND RabbitMQServerConnectionError = &quot;&quot; AND RedisServerConnectionError = &quot;&quot; AND OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="25"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="DoAction" Argument="TestSqlConnection" Condition="AI_INSTALL" Ordering="201"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND RabbitMQServerConnectionError = &quot;&quot; AND RedisServerConnectionError = &quot;&quot; )" Ordering="222"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="DoAction" Argument="TestSqlConnection" Condition="AI_INSTALL" Ordering="3"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; )" Ordering="201"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="202"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="NewDialog" Argument="RabbitMQConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND RabbitMQServerConnectionError &lt;&gt; &quot;&quot; )" Ordering="5"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; )" Ordering="3"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Back" Event="NewDialog" Argument="SQLConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="5"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="DoAction" Argument="TestElasticsearchConnection" Condition="AI_INSTALL" Ordering="2"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_1" Condition="AI_INSTALL" Ordering="1"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="DoAction" Argument="TestElasticsearchConnectionMsgBox" Condition="AI_INSTALL AND ( ELK_CONNECTION = &quot;False&quot; )" Ordering="4"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER" Condition="AI_INSTALL AND ( ELK_CONNECTION = &quot;False&quot; )" Ordering="3"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="3"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="4"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="DoAction" Argument="TestElasticsearchConnection" Condition="AI_INSTALL" Ordering="16"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_1" Condition="AI_INSTALL" Ordering="15"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="ELKConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;False&quot; AND OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="22"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="DoAction" Argument="TestElasticsearchConnection" Condition="AI_INSTALL AND ( SqlConnectionError=&quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; )" Ordering="212"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_1" Condition="AI_INSTALL AND ( SqlConnectionError=&quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; )" Ordering="211"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="ELKConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;False&quot; )" Ordering="218"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control_="Next" Event="NewDialog" Argument="RedisServerConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND RabbitMQServerConnectionError = &quot;&quot; AND RedisServerConnectionError &lt;&gt; &quot;&quot; )" Ordering="11"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control_="Back" Event="NewDialog" Argument="ELKConnectionDlg" Condition="AI_INSTALL AND ( ELK_CONNECTION = &quot;False&quot; )" Ordering="3"/>
<ROW Dialog_="RedisServerConnectionDlg" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/>
<ROW Dialog_="RedisServerConnectionDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND RabbitMQServerConnectionError = &quot;&quot; AND RedisServerConnectionError = &quot;&quot; )" Ordering="5"/>
<ROW Dialog_="RedisServerConnectionDlg" Control_="Back" Event="NewDialog" Argument="RabbitMQConnectionDlg" Condition="AI_INSTALL AND ( RabbitMQServerConnectionError = &quot;&quot; )" Ordering="3"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; )" Ordering="2"/>
<ROW Dialog_="RedisServerConnectionDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; )" Ordering="2"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="1"/>
<ROW Dialog_="RedisServerConnectionDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="1"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="DoAction" Argument="TestRabbitMQServerConnection" Condition="AI_INSTALL" Ordering="17"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="DoAction" Argument="TestRedisServerConnection" Condition="AI_INSTALL" Ordering="18"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="RabbitMQConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;False&quot; AND RabbitMQServerConnectionError &lt;&gt; &quot;&quot; AND OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="23"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="RedisServerConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;False&quot; AND RabbitMQServerConnectionError = &quot;&quot; AND RedisServerConnectionError &lt;&gt; &quot;&quot; AND OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="24"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="RabbitMQConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND RabbitMQServerConnectionError &lt;&gt; &quot;&quot; )" Ordering="219"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="RedisServerConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND RabbitMQServerConnectionError = &quot;&quot; AND RedisServerConnectionError &lt;&gt; &quot;&quot; )" Ordering="221"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="DoAction" Argument="TestRabbitMQServerConnection" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND RabbitMQServerConnectionError &lt;&gt; &quot;&quot; )" Ordering="213"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="DoAction" Argument="TestRedisServerConnection" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND RabbitMQServerConnectionError = &quot;&quot; AND RedisServerConnectionError &lt;&gt; &quot;&quot; )" Ordering="214"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="NewDialog" Argument="RabbitMQConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND RabbitMQServerConnectionError &lt;&gt; &quot;&quot; )" Ordering="10"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="NewDialog" Argument="RedisServerConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND RabbitMQServerConnectionError = &quot;&quot; AND RedisServerConnectionError &lt;&gt; &quot;&quot; )" Ordering="11"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND RabbitMQServerConnectionError = &quot;&quot; AND RedisServerConnectionError = &quot;&quot; )" Ordering="12"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="NewDialog" Argument="RedisServerConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND RabbitMQServerConnectionError = &quot;&quot; AND RedisServerConnectionError &lt;&gt; &quot;&quot; )" Ordering="6"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND RabbitMQServerConnectionError = &quot;&quot; AND RedisServerConnectionError = &quot;&quot; )" Ordering="10"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control_="Next" Event="DoAction" Argument="TestRabbitMQConnectionMsgBox" Condition="AI_INSTALL AND ( RabbitMQServerConnectionError &lt;&gt; &quot;&quot; )" Ordering="10"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_18" Condition="AI_INSTALL AND ( RabbitMQServerConnectionError &lt;&gt; &quot;&quot; )" Ordering="9"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND RabbitMQServerConnectionError = &quot;&quot; AND RedisServerConnectionError = &quot;&quot; )" Ordering="12"/>
<ROW Dialog_="RedisServerConnectionDlg" Control_="Next" Event="DoAction" Argument="TestRedisServerConnection" Condition="AI_INSTALL" Ordering="2"/>
<ROW Dialog_="RedisServerConnectionDlg" Control_="Next" Event="DoAction" Argument="TestRedisServerConnectionMsgBox" Condition="AI_INSTALL AND ( RedisServerConnectionError &lt;&gt; &quot;&quot; )" Ordering="4"/>
<ROW Dialog_="RedisServerConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_17" Condition="AI_INSTALL AND ( RedisServerConnectionError &lt;&gt; &quot;&quot; )" Ordering="3"/>
<ROW Dialog_="RabbitMQConnectionDlg" Control_="Next" Event="DoAction" Argument="TestRabbitMQServerConnection" Condition="AI_INSTALL" Ordering="8"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control_="Next" Event="DoAction" Argument="TestPostgreSqlConnection" Condition="AI_INSTALL" Ordering="1"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control_="Next" Event="DoAction" Argument="TestPostgreSqlConnectionMsgBox" Condition="AI_INSTALL AND ( PostgreSqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="3"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_20" Condition="AI_INSTALL AND ( PostgreSqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="2"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="NewDialog" Argument="ELKConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;False&quot; )" Ordering="9"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control_="Back" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; )" Ordering="1"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control_="Back" Event="NewDialog" Argument="WelcomeDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="2"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="DoAction" Argument="TestPostgreSqlConnection" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; )" Ordering="210"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="PostgreSQLConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="217"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="PostgreSQLConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError &lt;&gt; &quot;&quot; AND OLDPRODUCTS &lt;&gt; &quot;&quot; )" Ordering="21"/>
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="DoAction" Argument="TestPostgreSqlConnection" Condition="AI_INSTALL" Ordering="14"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="[PostgreSQLConnectionDlg_Cond]" Argument="1" Condition="((&amp;DocumentServer = 3) AND NOT (!DocumentServer = 3))" Ordering="2"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="[PostgreSQLConnectionDlg_Cond]" Argument="{}" Condition="1" Ordering="1"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="NewDialog" Argument="PostgreSQLConnectionDlg" Condition="AI_INSTALL AND PostgreSQLConnectionDlg_Cond AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="8"/>
<ROW Dialog_="ELKConnectionDlg" Control_="Back" Event="NewDialog" Argument="PostgreSQLConnectionDlg" Condition="AI_INSTALL AND PostgreSQLConnectionDlg_Cond AND ( PostgreSqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="6"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control_="Next" Event="NewDialog" Argument="ELKConnectionDlg" Condition="AI_INSTALL AND PostgreSQLConnectionDlg_Cond AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;False&quot; )" Ordering="5"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control_="Back" Event="NewDialog" Argument="SQLConnectionDlg" Condition="PostgreSQLConnectionDlg_Cond AND AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="3"/>
<ROW Dialog_="PostgreSQLConnectionDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_INSTALL AND PostgreSQLConnectionDlg_Cond AND ( SqlConnectionError = &quot;&quot; AND PostgreSqlConnectionError = &quot;&quot; AND ELK_CONNECTION = &quot;True&quot; AND RabbitMQServerConnectionError = &quot;&quot; AND RedisServerConnectionError = &quot;&quot; )" Ordering="6"/>
<ROW Dialog_="ExitDialog" Control_="Finish" Event="DoAction" Argument="AI_ChainerScheduleReboot" Condition="Not AIEXTERNALUI" Ordering="302"/>
<ROW Dialog_="ExitDialog" Control_="Finish" Event="DoAction" Argument="AI_CleanPrereq" Condition="1" Ordering="303"/>
<ROW Dialog_="FatalError" Control_="Finish" Event="DoAction" Argument="AI_CleanPrereq" Condition="1" Ordering="102"/>
<ROW Dialog_="UserExit" Control_="Finish" Event="DoAction" Argument="AI_CleanPrereq" Condition="1" Ordering="101"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCreateFolderComponent">
<ROW Directory_="APPDIR" Component_="APPDIR" ManualDelete="true"/>
<ROW Directory_="config_Dir" Component_="config" ManualDelete="false"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCustActComponent">
<ROW Action="AI_AppSearchEx" Type="1" Source="Prereq.dll" Target="DoAppSearchEx"/>
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH_ORIGINAL" Target="[AI_SETUPEXEPATH]"/>
<ROW Action="AI_ChainerScheduleReboot" Type="1" Source="chainersupport.dll" Target="ScheduleReboot" WithoutSeq="true"/>
<ROW Action="AI_CleanPrereq" Type="65" Source="Prereq.dll" Target="CleanPrereq" WithoutSeq="true"/>
<ROW Action="AI_CommitChainers" Type="11841" Source="chainersupport.dll" Target="CommitChainedPackages" WithoutSeq="true"/>
<ROW Action="AI_ConfigureChainer" Type="1" Source="Prereq.dll" Target="ConfigurePrereqLauncher"/>
<ROW Action="AI_DATA_SETTER" Type="51" Source="CustomActionData" Target="[AI_SETUPEXEPATH]"/>
<ROW Action="AI_DATA_SETTER_1" Type="51" Source="CustomActionData" Target="HOST=[ELASTICSEARCH_HOST];PORT=[ELASTICSEARCH_PORT];OUTPUT=ELK_CONNECTION"/>
<ROW Action="AI_DATA_SETTER_10" Type="51" Source="StartWebApi" Target="ASC.WebApi"/>
<ROW Action="AI_DATA_SETTER_2" Type="51" Source="CustomActionData" Target="[ELASTICSEARCH_MSG]&#13;\n[ELASTICSEARCH_SCHEME]://[ELASTICSEARCH_HOST]:[ELASTICSEARCH_PORT] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/>
<ROW Action="AI_DATA_SETTER_3" Type="51" Source="CustomActionData" Target="[PostgreSqlConnectionError] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/>
<ROW Action="AI_DATA_SETTER_4" Type="51" Source="CustomActionData" Target="[RabbitMQServerConnectionError] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/>
<ROW Action="AI_DATA_SETTER_5" Type="51" Source="CustomActionData" Target="[RedisServerConnectionError] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/>
<ROW Action="AI_DATA_SETTER_6" Type="51" Source="CustomActionData" Target="[SqlConnectionError] |[ProductName] Setup |MB_OK,MB_ICONWARNING,MB_DEFBUTTON1||[CLIENTPROCESSID]"/>
<ROW Action="AI_DATA_SETTER_7" Type="51" Source="CustomActionData" Target="[~]"/>
<ROW Action="AI_DATA_SETTER_8" Type="51" Source="CustomActionData" Target="[~]"/>
<ROW Action="AI_DATA_SETTER_9" Type="51" Source="StopWebApi" Target="ASC.WebApi"/>
<ROW Action="AI_DOWNGRADE" Type="19" Target="4010"/>
<ROW Action="AI_DeleteCadLzma" Type="51" Source="AI_DeleteLzma" Target="[AI_SETUPEXEPATH]"/>
<ROW Action="AI_DeleteLzma" Type="1025" Source="lzmaextractor.dll" Target="DeleteLZMAFiles"/>
<ROW Action="AI_DeleteRCadLzma" Type="51" Source="AI_DeleteRLzma" Target="[AI_SETUPEXEPATH]"/>
<ROW Action="AI_DeleteRLzma" Type="1281" Source="lzmaextractor.dll" Target="DeleteLZMAFiles"/>
<ROW Action="AI_DownloadPrereq" Type="1" Source="Prereq.dll" Target="DownloadPrereq"/>
<ROW Action="AI_DpiContentScale" Type="1" Source="aicustact.dll" Target="DpiContentScale"/>
<ROW Action="AI_EnableDebugLog" Type="321" Source="aicustact.dll" Target="EnableDebugLog"/>
<ROW Action="AI_ExtractCadLzma" Type="51" Source="AI_ExtractLzma" Target="[AI_SETUPEXEPATH]"/>
<ROW Action="AI_ExtractFiles" Type="1" Source="Prereq.dll" Target="ExtractSourceFiles" AdditionalSeq="AI_DATA_SETTER"/>
<ROW Action="AI_ExtractLzma" Type="1025" Source="lzmaextractor.dll" Target="ExtractLZMAFiles"/>
<ROW Action="AI_ExtractPrereq" Type="65" Source="Prereq.dll" Target="ExtractPrereq"/>
<ROW Action="AI_FindExeLzma" Type="1" Source="lzmaextractor.dll" Target="FindEXE"/>
<ROW Action="AI_InstallModeCheck" Type="1" Source="aicustact.dll" Target="UpdateInstallMode" WithoutSeq="true"/>
<ROW Action="AI_InstallPostPrerequisite" Type="1" Source="Prereq.dll" Target="InstallPostPrereq"/>
<ROW Action="AI_InstallPrerequisite" Type="1" Source="Prereq.dll" Target="InstallPrereq"/>
<ROW Action="AI_JsonCommit" Type="11777" Source="jsonCfg.dll" Target="OnJsonCommit" WithoutSeq="true"/>
<ROW Action="AI_JsonConfig" Type="11265" Source="jsonCfg.dll" Target="OnJsonConfig" WithoutSeq="true"/>
<ROW Action="AI_JsonInstall" Type="1" Source="jsonCfg.dll" Target="OnJsonInstall" AdditionalSeq="AI_DATA_SETTER_7"/>
<ROW Action="AI_JsonRemove" Type="11265" Source="jsonCfg.dll" Target="OnJsonRemove" WithoutSeq="true"/>
<ROW Action="AI_JsonRollback" Type="11521" Source="jsonCfg.dll" Target="OnJsonRollback" WithoutSeq="true"/>
<ROW Action="AI_JsonUninstall" Type="1" Source="jsonCfg.dll" Target="OnJsonUninstall" AdditionalSeq="AI_DATA_SETTER_8"/>
<ROW Action="AI_LaunchChainer" Type="3314" Source="AI_PREREQ_CHAINER"/>
<ROW Action="AI_PREPARE_UPGRADE" Type="65" Source="aicustact.dll" Target="PrepareUpgrade"/>
<ROW Action="AI_PRESERVE_INSTALL_TYPE" Type="65" Source="aicustact.dll" Target="PreserveInstallType"/>
<ROW Action="AI_PrepareChainers" Type="1" Source="chainersupport.dll" Target="PrepareChainedPackages"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Type="51" Source="AI_SETUPEXEPATH" Target="[AI_SETUPEXEPATH_ORIGINAL]"/>
<ROW Action="AI_RESTORE_LOCATION" Type="65" Source="aicustact.dll" Target="RestoreLocation"/>
<ROW Action="AI_ResolveKnownFolders" Type="1" Source="aicustact.dll" Target="AI_ResolveKnownFolders"/>
<ROW Action="AI_RollbackChainers" Type="11585" Source="chainersupport.dll" Target="RollbackChainedPackages" WithoutSeq="true"/>
<ROW Action="AI_SHOW_LOG" Type="65" Source="aicustact.dll" Target="LaunchLogFile" WithoutSeq="true"/>
<ROW Action="AI_STORE_LOCATION" Type="51" Source="ARPINSTALLLOCATION" Target="[APPDIR]"/>
<ROW Action="AI_VerifyPrereq" Type="1" Source="Prereq.dll" Target="VerifyPrereq"/>
<ROW Action="ElasticSearchInstallPlugin" Type="1030" Source="utils.vbs" Target="ElasticSearchInstallPlugin"/>
<ROW Action="ElasticSearchSetup" Type="6" Source="utils.vbs" Target="ElasticSearchSetup"/>
<ROW Action="MySQLConfigure" Type="6" Source="utils.vbs" Target="MySQLConfigure"/>
<ROW Action="PostgreSqlConfigure" Type="4102" Source="utils.vbs" Target="PostgreSqlConfigure"/>
<ROW Action="RedisSearchSetup" Type="6" Source="utils.vbs" Target="RedisSetup"/>
<ROW Action="SET_APPDIR" Type="307" Source="APPDIR" Target="[ProgramFilesFolder][Manufacturer]\[ProductName]" MultiBuildTarget="DefaultBuild:[ProgramFilesFolder][INSTALL_ROOT_FOLDER_NAME]\DocSpace"/>
<ROW Action="SET_SHORTCUTDIR" Type="307" Source="SHORTCUTDIR" Target="[ProgramMenuFolder][ProductName]" MultiBuildTarget="DefaultBuild:[ProgramMenuFolder][INSTALL_ROOT_FOLDER_NAME]\DocSpace"/>
<ROW Action="SET_TARGETDIR_TO_APPDIR" Type="51" Source="TARGETDIR" Target="[APPDIR]"/>
<ROW Action="SetDocumentServerJWTSecretProp" Type="6" Source="utils.vbs" Target="SetDocumentServerJWTSecretProp"/>
<ROW Action="Set_DS_JWT_ENABLED" Type="51" Source="DOCUMENT_SERVER_JWT_ENABLED" Target="[JWT_ENABLED]"/>
<ROW Action="Set_DS_JWT_HEADER" Type="51" Source="DOCUMENT_SERVER_JWT_HEADER" Target="[JWT_HEADER]"/>
<ROW Action="Set_DS_JWT_SECRET" Type="51" Source="DOCUMENT_SERVER_JWT_SECRET" Target="[JWT_SECRET]"/>
<ROW Action="Set_LICENSE_PATH" Type="51" Source="LICENSE_PATH" Target="[APPDIR]\Data\license.lic"/>
<ROW Action="StartWebApi" Type="3585" Source="aicustact.dll" Target="StartWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_10"/>
<ROW Action="StopWebApi" Type="3585" Source="aicustact.dll" Target="StopWinService" Options="1" AdditionalSeq="AI_DATA_SETTER_9"/>
<ROW Action="TestElasticsearchConnection" Type="1" Source="Utils.CA.dll" Target="CheckTCPAvailability" WithoutSeq="true" AdditionalSeq="AI_DATA_SETTER_1"/>
<ROW Action="TestElasticsearchConnectionMsgBox" Type="1" Source="aicustact.dll" Target="MsgBox" WithoutSeq="true" Options="1" AdditionalSeq="AI_DATA_SETTER_2"/>
<ROW Action="TestPostgreSqlConnection" Type="4102" Source="utils.vbs" Target="TestPostgreSqlConnection" WithoutSeq="true"/>
<ROW Action="TestPostgreSqlConnectionMsgBox" Type="1" Source="aicustact.dll" Target="MsgBox" WithoutSeq="true" Options="1" AdditionalSeq="AI_DATA_SETTER_3"/>
<ROW Action="TestRabbitMQConnectionMsgBox" Type="1" Source="aicustact.dll" Target="MsgBox" WithoutSeq="true" Options="1" AdditionalSeq="AI_DATA_SETTER_4"/>
<ROW Action="TestRabbitMQServerConnection" Type="1" Source="Utils.CA.dll" Target="TestRabbitMQConnection" WithoutSeq="true"/>
<ROW Action="TestRedisServerConnection" Type="1" Source="Utils.CA.dll" Target="TestRedisServerConnection" WithoutSeq="true"/>
<ROW Action="TestRedisServerConnectionMsgBox" Type="1" Source="aicustact.dll" Target="MsgBox" WithoutSeq="true" Options="1" AdditionalSeq="AI_DATA_SETTER_5"/>
<ROW Action="TestSQLConnectionMsgBox" Type="1" Source="aicustact.dll" Target="MsgBox" WithoutSeq="true" Options="1" AdditionalSeq="AI_DATA_SETTER_6"/>
<ROW Action="TestSqlConnection" Type="6" Source="utils.vbs" Target="TestSqlConnection" WithoutSeq="true"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiDialogComponent">
<ROW Dialog="ELKConnectionDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
<ROW Dialog="PostgreSQLConnectionDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
<ROW Dialog="PrereqLicenseAgreementDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel" TitleLocId="-"/>
<ROW Dialog="RabbitMQConnectionDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
<ROW Dialog="RedisServerConnectionDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiEmbeddedChainerComponent">
<ROW MsiEmbeddedChainer="msichainer.exe" Condition="VersionMsi &gt;= &quot;4.05&quot;" CommandLine="[AI_CHAINER_CMD_LINE]" Source="msichainer.exe" Type="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiEventMappingComponent">
<ROW Dialog_="RabbitMQConnectionDlg" Control_="PasswordLabel" Event="ActionData" Attribute="Visible"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiFeatCompsComponent">
<ROW Feature_="MainFeature" Component_="APPDIR"/>
<ROW Feature_="ONLYOFFICEDocumentS" Component_="ONLYOFFICEDocumentS"/>
<ROW Feature_="MainFeature" Component_="config"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstExSeqComponent">
<ROW Action="AI_DOWNGRADE" Condition="AI_NEWERPRODUCTFOUND AND (UILevel &lt;&gt; 5)" Sequence="210"/>
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
<ROW Action="AI_STORE_LOCATION" Condition="(Not Installed) OR REINSTALL" Sequence="1505"/>
<ROW Action="AI_PREPARE_UPGRADE" Condition="AI_UPGRADE=&quot;No&quot; AND (Not Installed)" Sequence="1397"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="52"/>
<ROW Action="AI_EnableDebugLog" Sequence="51"/>
<ROW Action="AI_AppSearchEx" Sequence="102"/>
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99" Builds="DefaultBuild"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Condition="AI_SETUPEXEPATH_ORIGINAL" Sequence="101" Builds="DefaultBuild"/>
<ROW Action="AI_DeleteCadLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="199" Builds="DefaultBuild"/>
<ROW Action="AI_DeleteRCadLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="198" Builds="DefaultBuild"/>
<ROW Action="AI_ExtractCadLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="197" Builds="DefaultBuild"/>
<ROW Action="AI_FindExeLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="196" Builds="DefaultBuild"/>
<ROW Action="AI_ExtractLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="1549" Builds="DefaultBuild"/>
<ROW Action="AI_DeleteRLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="1548" Builds="DefaultBuild"/>
<ROW Action="AI_DeleteLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="6597" Builds="DefaultBuild"/>
<ROW Action="AI_ExtractFiles" Sequence="1399" Builds="DefaultBuild"/>
<ROW Action="AI_DATA_SETTER" Sequence="1398"/>
<ROW Action="ElasticSearchInstallPlugin" Condition="( NOT Installed )" Sequence="6405"/>
<ROW Action="ElasticSearchSetup" Condition="( NOT Installed )" Sequence="6404"/>
<ROW Action="MySQLConfigure" Condition="( NOT Installed )" Sequence="6403"/>
<ROW Action="PostgreSqlConfigure" Condition="( NOT Installed )" Sequence="6402"/>
<ROW Action="RedisSearchSetup" Condition="( NOT Installed )" Sequence="6401"/>
<ROW Action="AI_PrepareChainers" Condition="VersionMsi &gt;= &quot;4.05&quot;" Sequence="5851"/>
<ROW Action="AI_ConfigureChainer" Condition="((UILevel = 2) OR (UILevel = 3)) AND (NOT UPGRADINGPRODUCTCODE)" Sequence="6598"/>
<ROW Action="AI_LaunchChainer" Condition="AI_PREREQ_CHAINER AND (NOT UPGRADINGPRODUCTCODE)" Sequence="6599"/>
<ROW Action="AI_VerifyPrereq" Sequence="1101"/>
<ROW Action="AI_JsonInstall" Condition="(REMOVE &lt;&gt; &quot;ALL&quot;)" Sequence="5102"/>
<ROW Action="AI_DATA_SETTER_7" Condition="(REMOVE &lt;&gt; &quot;ALL&quot;)" Sequence="5101"/>
<ROW Action="AI_JsonUninstall" Condition="(REMOVE)" Sequence="3102"/>
<ROW Action="AI_DATA_SETTER_8" Condition="(REMOVE)" Sequence="3101"/>
<ROW Action="StopWebApi" Condition="( NOT Installed )" Sequence="1502"/>
<ROW Action="AI_DATA_SETTER_9" Condition="( NOT Installed )" Sequence="1501"/>
<ROW Action="StartWebApi" Condition="( NOT Installed )" Sequence="1504"/>
<ROW Action="AI_DATA_SETTER_10" Condition="( NOT Installed )" Sequence="1503"/>
<ROW Action="Set_LICENSE_PATH" Condition="( ( NOT Installed ) OR ( Installed AND REMOVE &lt;&gt; &quot;ALL&quot; AND AI_INSTALL_MODE &lt;&gt; &quot;Remove&quot; ) OR ( Installed AND ( REMOVE = &quot;ALL&quot; OR AI_INSTALL_MODE = &quot;Remove&quot; ) AND UPGRADINGPRODUCTCODE ) )" Sequence="201"/>
<ATTRIBUTE name="RegisterProduct" value="false"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
<ROW Action="AI_PRESERVE_INSTALL_TYPE" Sequence="199"/>
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="53"/>
<ROW Action="AI_DpiContentScale" Sequence="52"/>
<ROW Action="AI_EnableDebugLog" Sequence="51"/>
<ROW Action="AI_AppSearchEx" Sequence="102"/>
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Condition="AI_SETUPEXEPATH_ORIGINAL" Sequence="101"/>
<ROW Action="MySQLConfigure" Sequence="1101"/>
<ROW Action="PostgreSqlConfigure" Condition="( NOT Installed )" Sequence="1102"/>
<ROW Action="AI_DownloadPrereq" Sequence="1297"/>
<ROW Action="AI_ExtractPrereq" Sequence="1298"/>
<ROW Action="AI_InstallPrerequisite" Sequence="1299"/>
<ROW Action="AI_InstallPostPrerequisite" Sequence="1301"/>
<ROW Action="AI_CleanPrereq" Sequence="1302"/>
<ROW Action="Set_DS_JWT_ENABLED" Condition="( ( NOT Installed ) OR ( Installed AND REMOVE &lt;&gt; &quot;ALL&quot; AND AI_INSTALL_MODE &lt;&gt; &quot;Remove&quot; ) ) AND ( JWT_ENABLED = &quot;true&quot; )" Sequence="1104"/>
<ROW Action="Set_DS_JWT_HEADER" Condition="( ( NOT Installed ) OR ( Installed AND REMOVE &lt;&gt; &quot;ALL&quot; AND AI_INSTALL_MODE &lt;&gt; &quot;Remove&quot; ) ) AND ( JWT_ENABLED = &quot;true&quot; )" Sequence="1105"/>
<ROW Action="Set_DS_JWT_SECRET" Condition="( ( NOT Installed ) OR ( Installed AND REMOVE &lt;&gt; &quot;ALL&quot; AND AI_INSTALL_MODE &lt;&gt; &quot;Remove&quot; ) ) AND ( JWT_ENABLED = &quot;true&quot; AND NOT DOCSPACE_INSTALLED )" Sequence="1106"/>
<ROW Action="SetDocumentServerJWTSecretProp" Condition="( ( NOT Installed ) OR ( Installed AND REMOVE &lt;&gt; &quot;ALL&quot; AND AI_INSTALL_MODE &lt;&gt; &quot;Remove&quot; ) ) AND ( JWT_ENABLED = &quot;true&quot; AND NOT DOCSPACE_INSTALLED )" Sequence="1103"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent">
<ROW Condition="( Version9X OR ( NOT VersionNT64 ) OR ( VersionNT64 AND ((VersionNT64 &lt;&gt; 600) OR (MsiNTProductType &lt;&gt; 1)) AND ((VersionNT64 &lt;&gt; 600) OR (MsiNTProductType = 1)) AND ((VersionNT64 &lt;&gt; 601) OR (MsiNTProductType &lt;&gt; 1)) AND ((VersionNT64 &lt;&gt; 601) OR (MsiNTProductType = 1)) AND ((VersionNT64 &lt;&gt; 602) OR (MsiNTProductType &lt;&gt; 1)) AND ((VersionNT64 &lt;&gt; 603) OR (MsiNTProductType &lt;&gt; 1)) AND ((VersionNT64 &lt;&gt; 1000) OR (MsiNTProductType &lt;&gt; 1)) AND ((VersionNT64 &lt;&gt; 1100) OR (MsiNTProductType &lt;&gt; 1)) ) )" Description="[ProductName] cannot be installed on the following Windows versions: [WindowsTypeNT64Display]." DescriptionLocId="AI.LaunchCondition.NoSpecificNT64" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="( Version9X OR VersionNT64 )" Description="[ProductName] cannot be installed on [WindowsTypeNTDisplay]." DescriptionLocId="AI.LaunchCondition.NoNT" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="((VersionNT &lt;&gt; 501) AND (VersionNT &lt;&gt; 502))" Description="[ProductName] cannot be installed on [WindowsTypeNT5XDisplay]." DescriptionLocId="AI.LaunchCondition.NoNT5X" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="(VersionNT &lt;&gt; 400)" Description="[ProductName] cannot be installed on [WindowsTypeNT40Display]." DescriptionLocId="AI.LaunchCondition.NoNT40" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="(VersionNT &lt;&gt; 500)" Description="[ProductName] cannot be installed on [WindowsTypeNT50Display]." DescriptionLocId="AI.LaunchCondition.NoNT50" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="SETUPEXEDIR OR (REMOVE=&quot;ALL&quot;)" Description="This package can only be run from a bootstrapper." DescriptionLocId="AI.LaunchCondition.RequireBootstrapper" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="VersionNT" Description="[ProductName] cannot be installed on [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiRadioButtonComponent">
<ROW Property="Prereq_IAgree" Order="1" Value="Yes" X="5" Y="0" Width="250" Height="15" Text="I &amp;accept the terms in the License Agreement" TextStyle="DlgFont8" TextLocId="RadioButton.Text.IAgree#1"/>
<ROW Property="Prereq_IAgree" Order="2" Value="No" X="5" Y="20" Width="250" Height="15" Text="I &amp;do not accept the terms in the License Agreement" TextStyle="DlgFont8" TextLocId="RadioButton.Text.IAgree#2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiRegLocatorComponent">
<ROW Signature_="AI_EXE_PATH_CU" Root="1" Key="Software\Caphyon\Advanced Installer\LZMA\[ProductCode]\[ProductVersion]" Name="AI_ExePath" Type="2"/>
<ROW Signature_="AI_EXE_PATH_LM" Root="2" Key="Software\Caphyon\Advanced Installer\LZMA\[ProductCode]\[ProductVersion]" Name="AI_ExePath" Type="2"/>
<ROW Signature_="AppSearchSign" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="REDIS_PWD" Type="2"/>
<ROW Signature_="AppSearchSign_1" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="REDIS_PORT" Type="2"/>
<ROW Signature_="AppSearchSign_10" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="ELASTICSEARCH_MSG" Type="2"/>
<ROW Signature_="AppSearchSign_11" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="ELASTICSEARCH_HOST" Type="2"/>
<ROW Signature_="AppSearchSign_12" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DB_USER" Type="2"/>
<ROW Signature_="AppSearchSign_13" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DB_PWD" Type="2"/>
<ROW Signature_="AppSearchSign_14" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DB_PORT" Type="2"/>
<ROW Signature_="AppSearchSign_15" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DB_NAME" Type="2"/>
<ROW Signature_="AppSearchSign_16" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DB_HOST" Type="2"/>
<ROW Signature_="AppSearchSign_17" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="AMQP_VHOST" Type="2"/>
<ROW Signature_="AppSearchSign_18" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="AMQP_USER" Type="2"/>
<ROW Signature_="AppSearchSign_19" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="AMQP_PWD" Type="2"/>
<ROW Signature_="AppSearchSign_2" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="REDIS_HOST" Type="2"/>
<ROW Signature_="AppSearchSign_20" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="AMQP_PORT" Type="2"/>
<ROW Signature_="AppSearchSign_21" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="AMQP_HOST" Type="2"/>
<ROW Signature_="AppSearchSign_22" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DOCUMENT_SERVER_JWT_ENABLED" Type="2"/>
<ROW Signature_="AppSearchSign_23" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DOCUMENT_SERVER_JWT_HEADER" Type="2"/>
<ROW Signature_="AppSearchSign_24" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DOCUMENT_SERVER_JWT_SECRET" Type="2"/>
<ROW Signature_="AppSearchSign_25" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DOCUMENT_SERVER_PORT" Type="2"/>
<ROW Signature_="AppSearchSign_3" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="PS_DB_USER" Type="2"/>
<ROW Signature_="AppSearchSign_4" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="PS_DB_PWD" Type="2"/>
<ROW Signature_="AppSearchSign_5" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="PS_DB_PORT" Type="2"/>
<ROW Signature_="AppSearchSign_6" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="PS_DB_NAME" Type="2"/>
<ROW Signature_="AppSearchSign_7" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="PS_DB_HOST" Type="2"/>
<ROW Signature_="AppSearchSign_8" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="ELASTICSEARCH_SCHEME" Type="2"/>
<ROW Signature_="AppSearchSign_9" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="ELASTICSEARCH_PORT" Type="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiRegsComponent">
<ROW Registry="AI_ExePath" Root="-1" Key="Software\Caphyon\Advanced Installer\LZMA\[ProductCode]\[ProductVersion]" Name="AI_ExePath" Value="[AI_SETUPEXEPATH]" Component_="APPDIR"/>
<ROW Registry="AMQP_HOST" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="AMQP_HOST" Value="[AMQP_HOST]" Component_="APPDIR"/>
<ROW Registry="AMQP_PORT" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="AMQP_PORT" Value="[AMQP_PORT]" Component_="APPDIR"/>
<ROW Registry="AMQP_PWD" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="AMQP_PWD" Value="[AMQP_PWD]" Component_="APPDIR"/>
<ROW Registry="AMQP_USER" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="AMQP_USER" Value="[AMQP_USER]" Component_="APPDIR"/>
<ROW Registry="AMQP_VHOST" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="AMQP_VHOST" Value="[AMQP_VHOST]" Component_="APPDIR"/>
<ROW Registry="AdvancedInstaller" Root="-1" Key="Software\Caphyon\Advanced Installer" Name="\" Component_="APPDIR"/>
<ROW Registry="Caphyon" Root="-1" Key="Software\Caphyon" Name="\" Component_="APPDIR"/>
<ROW Registry="DB_HOST" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="DB_HOST" Value="[DB_HOST]" Component_="APPDIR"/>
<ROW Registry="DB_NAME" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="DB_NAME" Value="[DB_NAME]" Component_="APPDIR"/>
<ROW Registry="DB_PORT" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="DB_PORT" Value="[DB_PORT]" Component_="APPDIR"/>
<ROW Registry="DB_PWD" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="DB_PWD" Value="[DB_PWD]" Component_="APPDIR"/>
<ROW Registry="DB_USER" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="DB_USER" Value="[DB_USER]" Component_="APPDIR"/>
<ROW Registry="DOCUMENT_SERVER_JWT_ENABLED" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="DOCUMENT_SERVER_JWT_ENABLED" Value="[DOCUMENT_SERVER_JWT_ENABLED]" Component_="APPDIR"/>
<ROW Registry="DOCUMENT_SERVER_JWT_HEADER" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="DOCUMENT_SERVER_JWT_HEADER" Value="[DOCUMENT_SERVER_JWT_HEADER]" Component_="APPDIR"/>
<ROW Registry="DOCUMENT_SERVER_JWT_SECRET" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="DOCUMENT_SERVER_JWT_SECRET" Value="[DOCUMENT_SERVER_JWT_SECRET]" Component_="APPDIR"/>
<ROW Registry="DOCUMENT_SERVER_PORT" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="DOCUMENT_SERVER_PORT" Value="[DOCUMENT_SERVER_PORT]" Component_="APPDIR"/>
<ROW Registry="ELASTICSEARCH_HOST" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="ELASTICSEARCH_HOST" Value="[ELASTICSEARCH_HOST]" Component_="APPDIR"/>
<ROW Registry="ELASTICSEARCH_PORT" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="ELASTICSEARCH_PORT" Value="[ELASTICSEARCH_PORT]" Component_="APPDIR"/>
<ROW Registry="ELASTICSEARCH_SCHEME" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="ELASTICSEARCH_SCHEME" Value="[ELASTICSEARCH_SCHEME]" Component_="APPDIR"/>
<ROW Registry="LZMA" Root="-1" Key="Software\Caphyon\Advanced Installer\LZMA" Name="\" Component_="APPDIR"/>
<ROW Registry="Manufacturer" Root="-1" Key="Software\[Manufacturer]" Name="\" Component_="APPDIR"/>
<ROW Registry="ONLYOFFICEDocumentS" Root="-1" Key="Software\Caphyon\Advanced Installer\Prereqs\[ProductCode]\[ProductVersion]" Name="ONLYOFFICEDocumentS" Value="1" Component_="ONLYOFFICEDocumentS"/>
<ROW Registry="PS_DB_HOST" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="PS_DB_HOST" Value="[PS_DB_HOST]" Component_="APPDIR"/>
<ROW Registry="PS_DB_NAME" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="PS_DB_NAME" Value="[PS_DB_NAME]" Component_="APPDIR"/>
<ROW Registry="PS_DB_PORT" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="PS_DB_PORT" Value="[PS_DB_PORT]" Component_="APPDIR"/>
<ROW Registry="PS_DB_PWD" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="PS_DB_PWD" Value="[PS_DB_PWD]" Component_="APPDIR"/>
<ROW Registry="PS_DB_USER" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="PS_DB_USER" Value="[PS_DB_USER]" Component_="APPDIR"/>
<ROW Registry="Path" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Path" Value="[APPDIR]" Component_="APPDIR"/>
<ROW Registry="Prereqs" Root="-1" Key="Software\Caphyon\Advanced Installer\Prereqs" Name="\"/>
<ROW Registry="ProductCode" Root="-1" Key="Software\Caphyon\Advanced Installer\LZMA\[ProductCode]" Name="\" Component_="APPDIR"/>
<ROW Registry="ProductCode_1" Root="-1" Key="Software\Caphyon\Advanced Installer\Prereqs\[ProductCode]" Name="\"/>
<ROW Registry="ProductName" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="\" Component_="APPDIR"/>
<ROW Registry="ProductVersion" Root="-1" Key="Software\Caphyon\Advanced Installer\LZMA\[ProductCode]\[ProductVersion]" Name="\" Component_="APPDIR"/>
<ROW Registry="ProductVersion_1" Root="-1" Key="Software\Caphyon\Advanced Installer\Prereqs\[ProductCode]\[ProductVersion]" Name="\"/>
<ROW Registry="REDIS_HOST" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="REDIS_HOST" Value="[REDIS_HOST]" Component_="APPDIR"/>
<ROW Registry="REDIS_PORT" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="REDIS_PORT" Value="[REDIS_PORT]" Component_="APPDIR"/>
<ROW Registry="REDIS_PWD" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="REDIS_PWD" Value="[REDIS_PWD]" Component_="APPDIR"/>
<ROW Registry="Software" Root="-1" Key="Software" Name="\"/>
<ROW Registry="Version" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="Version" Value="[ProductVersion]" Component_="APPDIR"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiThemeComponent">
<ATTRIBUTE name="UsedTheme" value="classic"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiUpgradeComponent">
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="0.0.1" VersionMax="[|ProductVersion]" Attributes="257" ActionProperty="OLDPRODUCTS"/>
<ROW UpgradeCode="[|UpgradeCode]" VersionMin="[|ProductVersion]" Attributes="2" ActionProperty="AI_NEWERPRODUCTFOUND"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.NotesComponent">
<ROW Type="2" DisplayString="Custom Actions" Note="{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fnil\fcharset204 MS Shell Dlg 2;}}&#13;&#10;\viewkind4\uc1\pard\f0\fs17\par&#13;&#10;}&#13;&#10;" ViewId="Custom Actions"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.PreReqComponent">
<ROW PrereqKey="C5949268848C59079D60551E525B7" DisplayName=".NET Runtime 7.0.4 x86" VersionMin="7.0" SetupFileUrl="redist\dotnet-runtime-7.0.4-win-x86.exe" Location="0" ExactSize="0" WinNTVersions="Windows Vista x86, Windows Server 2008 x86, Windows 7 RTM x86, Windows 8 x86, Windows 10 version 1507 x86, Windows 10 version 1511 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="ym" TargetName=".NET 7.0\dotnet-runtime-7.0.4-win-x86.exe"/>
<ROW PrereqKey="CA62D813A4E74FA2AAE86A7D7B7B1493" DisplayName="Visual C++ Redistributable for Visual Studio 2013 Update 5 x64" VersionMin="12.0" SetupFileUrl="redist\vcredist_2013u5_x64.exe" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="xym" TargetName="Visual C++ Redistributable for Visual Studio 2013\vcredist_2013u5_x64.exe"/>
<ROW PrereqKey="D564007E3BBE4F85950A09B470A7CA65" DisplayName="Visual C++ Redistributable for Visual Studio 2013 Update 5 x86" VersionMin="12.0" SetupFileUrl="redist\vcredist_2013u5_x86.exe" Location="0" ExactSize="0" Operator="0" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="ym" TargetName="Visual C++ Redistributable for Visual Studio 2013\vcredist_2013u5_x86.exe"/>
<ROW PrereqKey="EA5B60A5CAD4115A8386D017CC889B9" DisplayName="ASP.NET Core Runtime 7.0.4 x64" VersionMin="7.0" SetupFileUrl="redist\aspnetcore-runtime-7.0.4-win-x64.exe" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="xym" TargetName="ASP.NET Core 7.0\aspnetcore-runtime-7.0.4-win-x64.exe"/>
<ROW PrereqKey="Elasticsearch7.16.3" DisplayName="Elasticsearch v7.16.3 x64" VersionMin="7.16.3" SetupFileUrl="redist\elasticsearch-7.16.3.msi" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/quiet" BasicUiComLine="/quiet" NoUiComLine="/quiet" Options="y" TargetName="Elasticsearch 7.16.3 x64\elasticsearch-7.16.3.msi"/>
<ROW PrereqKey="F3520F64DA5998338D97129FAD2" DisplayName=".NET Runtime 7.0.4 x64" VersionMin="7.0" SetupFileUrl="redist\dotnet-runtime-7.0.4-win-x64.exe" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="ym" TargetName=".NET 7.0\dotnet-runtime-7.0.4-win-x64.exe"/>
<ROW PrereqKey="FC441DA8855740179A0DFCF9560D3DEE" DisplayName="ASP.NET Core Runtime 7.0.4 x86" VersionMin="7.0" SetupFileUrl="redist\aspnetcore-runtime-7.0.4-win-x86.exe" Location="0" ExactSize="0" WinNTVersions="Windows Vista x86, Windows Server 2008 x86, Windows 7 RTM x86, Windows 8 x86, Windows 10 version 1507 x86, Windows 10 version 1511 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="ym" TargetName="ASP.NET Core 7.0\aspnetcore-runtime-7.0.4-win-x86.exe"/>
<ROW PrereqKey="FFmpegEssentials" DisplayName="FFmpeg x64" VersionMin="6.0.0" SetupFileUrl="redist\FFmpeg_Essentials.msi" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/quiet" BasicUiComLine="/quiet" NoUiComLine="/quiet" Options="yx" TargetName="FFmpeg x64\FFmpeg_Essentials.msi"/>
<ROW PrereqKey="Microsoft.NETFrame" DisplayName=".NET Framework 4.8" VersionMin="4.8" SetupFileUrl="redist\.net_framework_4.8.exe" Location="0" ExactSize="0" WinNTVersions="Windows Vista x86, Windows Server 2008 x86, Windows 7 RTM x86, Windows 8 x86, Windows 10 version 1507 x86, Windows 10 version 1511 x86, Windows 10 version 1903 x86, Windows 10 version 1909 x86, Windows 10 version 2004 x86, Windows 10 version 20H2 x86, Windows 10 version 21H1 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 RTM x64, Windows 8 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64, Windows 10 version 1903 x64, Windows 10 version 1909 x64, Windows 10 version 2004 x64, Windows 10 version 20H2 x64, Windows 10 version 21H1 x64" Operator="1" ComLine="/q /promptrestart" BasicUiComLine="/q /promptrestart" NoUiComLine="/q /promptrestart" Options="yxm" TargetName="Microsoft .NET Framework 4.8\.net_framework_4.8.exe"/>
<ROW PrereqKey="MicrosoftVisualC_2" DisplayName="Visual C++ Redistributable for Visual Studio 2015-2019 x86" VersionMin="14.26" SetupFileUrl="redist\VC_redist.x86.exe" Location="0" ExactSize="0" WinNTVersions="Windows Vista RTM x86, Windows Vista SP1 x86, Windows Server 2008 RTM x86, Windows 7 RTM x86" WinNT64Versions="Windows Vista RTM x64, Windows Vista SP1 x64, Windows Server 2008 RTM x64, Windows 7 RTM x64, Windows Server 2008 R2 RTM x64" Operator="0" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="ym" TargetName="Visual C++ Redistributable for Visual Studio 2015-2019\VC_redist.x86.exe"/>
<ROW PrereqKey="MicrosoftVisualC_3" DisplayName="Visual C++ Redistributable for Visual Studio 2015-2019 x64" VersionMin="14.26" SetupFileUrl="redist\VC_redist.x64.exe" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" WinNT64Versions="Windows Vista RTM x64, Windows Vista SP1 x64, Windows Server 2008 RTM x64, Windows 7 RTM x64, Windows Server 2008 R2 RTM x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="myx" TargetName="Visual C++ Redistributable for Visual Studio 2015-2019\VC_redist.x64.exe"/>
<ROW PrereqKey="MySQLConnectorODBC" DisplayName="MySQL Connector/ODBC 8.0.32 x86" VersionMin="8.0.32" SetupFileUrl="redist\mysql-connector-odbc-8.0.32-win32.msi" Location="0" ExactSize="0" Operator="1" ComLine="/quiet" BasicUiComLine="/quiet" NoUiComLine="/quiet" Options="ym" TargetName="MySQL Connector ODBC 8.0.32 x86\mysql-connector-odbc-8.0.32-win32.msi"/>
<ROW PrereqKey="MySQLInstallerCo" DisplayName="MySQL Installer Community 8.0.32 x86" VersionMin="1.6.5.0" SetupFileUrl="redist\mysql-installer-community-8.0.32.0.msi" Location="0" ExactSize="0" Operator="1" ComLine="/quiet" BasicUiComLine="/quiet" NoUiComLine="/quiet" Options="y" TargetName="MySQL Installer Community 8.0.32 x86\mysql-installer-community-8.0.32.0.msi"/>
<ROW PrereqKey="MySQLInstallerRunn" DisplayName="MySQL Installer Community 8.0.32 x86 Runner" SetupFileUrl="MySQL Installer Runner.exe" Location="0" ExactSize="0" Operator="1" ComLine="/VERYSILENT /DB_PWD=&quot;root&quot; /MYSQL_VERSION=&quot;8.0.32&quot;" BasicUiComLine="/VERYSILENT /DB_PWD=&quot;root&quot; /MYSQL_VERSION=&quot;8.0.32&quot;" NoUiComLine="/VERYSILENT /DB_PWD=&quot;root&quot; /MYSQL_VERSION=&quot;8.0.32&quot;" Options="y" TargetName="MySQL Installer Runner \MySQL Installer Runner.exe" ParentPrereq="MySQLInstallerCo"/>
<ROW PrereqKey="Node.js" DisplayName="Node.js 18.16.1" VersionMin="18.16.0" SetupFileUrl="redist\node-v18.16.1-x64.msi" Location="0" ExactSize="0" Operator="0" ComLine="/quiet" BasicUiComLine="/quiet" NoUiComLine="/quiet" Options="ym" TargetName="Node.js v18.16.1 x64\node-v18.16.1-x64.msi"/>
<ROW PrereqKey="ONLYOFFICEDocumentS" DisplayName="ONLYOFFICE DocumentServer" SetupFileUrl="onlyoffice-documentserver-ee.exe" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/VERYSILENT /norestart /DIR=&quot;[APPDIR]..\DocumentServer&quot; /DS_PORT=&quot;[DOCUMENT_SERVER_PORT]&quot; /JWT_ENABLED=&quot;[DOCUMENT_SERVER_JWT_ENABLED]&quot; /JWT_SECRET=&quot;[DOCUMENT_SERVER_JWT_SECRET]&quot; /JWT_HEADER=&quot;[DOCUMENT_SERVER_JWT_HEADER]&quot; /DB_HOST=&quot;[PS_DB_HOST]&quot; /DB_USER=&quot;[PS_DB_USER]&quot; /DB_PWD=&quot;[PS_DB_PWD]&quot; /DB_NAME=&quot;[PS_DB_NAME]&quot; /LICENSE_PATH=&quot;[APPDIR]Data\license.lic&quot; /LOG" BasicUiComLine="/VERYSILENT /norestart /DIR=&quot;[APPDIR]..\DocumentServer&quot; /DS_PORT=&quot;[DOCUMENT_SERVER_PORT]&quot; /JWT_ENABLED=&quot;[DOCUMENT_SERVER_JWT_ENABLED]&quot; /JWT_SECRET=&quot;[DOCUMENT_SERVER_JWT_SECRET]&quot; /JWT_HEADER=&quot;[DOCUMENT_SERVER_JWT_HEADER]&quot; /DB_HOST=&quot;[PS_DB_HOST]&quot; /DB_USER=&quot;[PS_DB_USER]&quot; /DB_PWD=&quot;[PS_DB_PWD]&quot; /DB_NAME=&quot;[PS_DB_NAME]&quot; /LICENSE_PATH=&quot;[APPDIR]Data\license.lic&quot;/LOG" NoUiComLine="/VERYSILENT /norestart /DIR=&quot;[APPDIR]..\DocumentServer&quot; /DS_PORT=&quot;[DOCUMENT_SERVER_PORT]&quot; /JWT_ENABLED=&quot;[DOCUMENT_SERVER_JWT_ENABLED]&quot; /JWT_SECRET=&quot;[DOCUMENT_SERVER_JWT_SECRET]&quot; /JWT_HEADER=&quot;[DOCUMENT_SERVER_JWT_HEADER]&quot; /DB_HOST=&quot;[PS_DB_HOST]&quot; /DB_USER=&quot;[PS_DB_USER]&quot; /DB_PWD=&quot;[PS_DB_PWD]&quot; /DB_NAME=&quot;[PS_DB_NAME]&quot; /LICENSE_PATH=&quot;[APPDIR]Data\license.lic&quot; /LOG" Options="fi=" TargetName=" \onlyoffice-documentserver-ee.exe" Feature="ONLYOFFICEDocumentS" RepairComLine="/VERYSILENT /norestart /DIR=&quot;[APPDIR]..\DocumentServer&quot; /DS_PORT=&quot;[DOCUMENT_SERVER_PORT]&quot; /JWT_ENABLED=&quot;[DOCUMENT_SERVER_JWT_ENABLED]&quot; /JWT_SECRET=&quot;[DOCUMENT_SERVER_JWT_SECRET]&quot; /JWT_HEADER=&quot;[DOCUMENT_SERVER_JWT_HEADER]&quot; /DB_HOST=&quot;[PS_DB_HOST]&quot; /DB_USER=&quot;[PS_DB_USER]&quot; /DB_PWD=&quot;[PS_DB_PWD]&quot; /DB_NAME=&quot;[PS_DB_NAME]&quot; /LICENSE_PATH=&quot;[APPDIR]Data\license.lic&quot; /LOG"/>
<ROW PrereqKey="PostgreSQL" DisplayName="PostgresSQL v12.9 x64" VersionMin="12.9" SetupFileUrl="redist\postgresql-12.9-1-windows-x64.exe" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="--unattendedmodeui none --install_runtimes 0 --mode unattended --superaccount &quot;postgres&quot; --superpassword &quot;postgres&quot;" BasicUiComLine="--unattendedmodeui none --install_runtimes 0 --mode unattended --superaccount &quot;postgres&quot; --superpassword &quot;postgres&quot;" NoUiComLine="--unattendedmodeui none --install_runtimes 0 --mode unattended --superaccount &quot;postgres&quot; --superpassword &quot;postgres&quot;" Options="yx" TargetName="postgresql-12.9-1-windows-x64.exe"/>
<ROW PrereqKey="RabbitMQServer" DisplayName="RabbitMQ v3.7.4 x64" VersionMin="3.7.4" SetupFileUrl="redist\rabbitmq-server-3.7.4.exe" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/S" BasicUiComLine="/S" NoUiComLine="/S" Options="yx" TargetName="RabbitMQ v3.7.4 x64\rabbitmq-server-3.7.4.exe"/>
<ROW PrereqKey="RedisonWindows" DisplayName="Redis 5.0.10 x64" VersionMin="5.0" SetupFileUrl="redist\Redis-x64-5.0.10.msi" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/quiet ADD_INSTALLFOLDER_TO_PATH=1" BasicUiComLine="/quiet ADD_INSTALLFOLDER_TO_PATH=1" NoUiComLine="/quiet ADD_INSTALLFOLDER_TO_PATH=1" Options="yx" TargetName="Redis 5.0.10 x64\Redis-x64-5.0.10.msi"/>
<ROW PrereqKey="RequiredApplication" DisplayName="Erlang v20.3 x64" VersionMin="20.3" SetupFileUrl="redist\otp_win64_20.3.exe" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/S" BasicUiComLine="/S" NoUiComLine="/S" Options="yx" TargetName="Erlang v20.3 x64\otp_win64_20.3.exe"/>
<ROW PrereqKey="psqlODBC_x64" DisplayName="PostgreSQL ODBC Driver x64" SetupFileUrl="redist\psqlodbc_x64.msi" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/quiet" BasicUiComLine="/quiet" NoUiComLine="/quiet" Options="myx" TargetName="psqlodbc_x64.msi"/>
<ATTRIBUTE name="PrereqsOrder" value="Microsoft.NETFrame C5949268848C59079D60551E525B7 F3520F64DA5998338D97129FAD2 FC441DA8855740179A0DFCF9560D3DEE EA5B60A5CAD4115A8386D017CC889B9 D564007E3BBE4F85950A09B470A7CA65 CA62D813A4E74FA2AAE86A7D7B7B1493 MicrosoftVisualC_2 MicrosoftVisualC_3 MySQLConnectorODBC MySQLInstallerCo MySQLInstallerRunn Node.js Elasticsearch7.16.3 RequiredApplication RabbitMQServer RedisonWindows FFmpegEssentials psqlODBC_x64 PostgreSQL ONLYOFFICEDocumentS"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.PreReqSearchComponent">
<ROW SearchKey="C5949268848C59079D60551E525B7System" Prereq="C5949268848C59079D60551E525B7" SearchType="12" SearchString="HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x86\sharedfx\Microsoft.NETCore.App" VerMin="7.0" Order="1" Property="PreReqSearch_3_C5949268848C59079D60"/>
<ROW SearchKey="CA62D813A4E74FA2AAE86A7D7B7B1493Ver" Prereq="CA62D813A4E74FA2AAE86A7D7B7B1493" SearchType="2" SearchString="HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\12.0\RuntimeMinimum\Version" VerMin="12.0.40649" Order="1" Property="PreReqSearch_CA62D813A4E74FA2AAE86A"/>
<ROW SearchKey="D564007E3BBE4F85950A09B470A7CA65S_1" Prereq="D564007E3BBE4F85950A09B470A7CA65" SearchType="0" SearchString="[SystemFolder]msvcr120.dll" VerMin="12.0.40649.5" Order="3" Property="PreReqSearch_2_D564007E3BBE4F85950A"/>
<ROW SearchKey="D564007E3BBE4F85950A09B470A7CA65Sys" Prereq="D564007E3BBE4F85950A09B470A7CA65" SearchType="0" SearchString="[SystemFolder]msvcp120.dll" VerMin="12.0.40649.5" Order="2" Property="PreReqSearch_1_D564007E3BBE4F85950A"/>
<ROW SearchKey="D564007E3BBE4F85950A09B470A7CA65Ver" Prereq="D564007E3BBE4F85950A09B470A7CA65" SearchType="2" SearchString="HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\12.0\RuntimeMinimum\Version" VerMin="12.0.40649" Order="1" Property="PreReqSearch_D564007E3BBE4F85950A09"/>
<ROW SearchKey="DOCSPACE_INSTALLED" SearchType="4" SearchString="{FFA9CD16-E087-45F3-8D34-3BBA1EF8A897}" Order="4" Property="DOCSPACE_INSTALLED"/>
<ROW SearchKey="EA5B60A5CAD4115A8386D017CC889B9Syst" Prereq="EA5B60A5CAD4115A8386D017CC889B9" SearchType="1" SearchString="HKLM\SOFTWARE\Microsoft\ASP.NET Core\Shared Framework\v7.0" VerMin="7.0" Order="1" Property="PreReqSearch_5_EA5B60A5CAD4115A8386"/>
<ROW SearchKey="F3520F64DA5998338D97129FAD2SystemFo" Prereq="F3520F64DA5998338D97129FAD2" SearchType="12" SearchString="HKLM\SOFTWARE\dotnet\Setup\InstalledVersions\x64\sharedfx\Microsoft.NETCore.App" VerMin="7.0" Order="1" Property="PreReqSearch_2_F3520F64DA5998338D97"/>
<ROW SearchKey="FC441DA8855740179A0DFCF9560D3DEESys" Prereq="FC441DA8855740179A0DFCF9560D3DEE" SearchType="1" SearchString="HKLM\SOFTWARE\Microsoft\ASP.NET Core\Shared Framework\v7.0" VerMin="7.0" Order="1" Property="PreReqSearch_6_FC441DA8855740179A0D"/>
<ROW SearchKey="SystemFolderfile.dll" Prereq="Microsoft.NETFrame" SearchType="9" SearchString="HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\Release" RefContent="G528048" Order="1" Property="PreReqSearch"/>
<ROW SearchKey="SystemFolderfile.dll_1" Prereq="ONLYOFFICEDocumentS" SearchType="0" SearchString="[SystemFolder]file.dll" VerMin="1.0" Order="1" Property="PreReqSearch_1"/>
<ROW SearchKey="SystemFolderfile.dll_10" Prereq="RequiredApplication" SearchType="5" SearchString="HKLM\SOFTWARE\Wow6432Node\Ericsson\Erlang\9.3" Order="1" Property="PreReqSearch_19"/>
<ROW SearchKey="SystemFolderfile.dll_11" Prereq="RabbitMQServer" SearchType="5" SearchString="HKLM\SOFTWARE\Ericsson\Erlang\ErlSrv\1.1\RabbitMQ" Order="1" Property="PreReqSearch_20"/>
<ROW SearchKey="SystemFolderfile.dll_12" Prereq="PostgreSQL" SearchType="5" SearchString="HKLM\SOFTWARE\PostgreSQL\Installations\postgresql-x64-12" Order="1" Property="PreReqSearch_24"/>
<ROW SearchKey="SystemFolderfile.dll_7" Prereq="MicrosoftVisualC_2" SearchType="2" SearchString="HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\14.0\RuntimeMinimum\Version" VerMin="14.26" Order="1" Property="PreReqSearch_9"/>
<ROW SearchKey="SystemFolderfile.dll_8" Prereq="MicrosoftVisualC_3" SearchType="2" SearchString="HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\14.0\RuntimeMinimum\Version" VerMin="14.26" Order="1" Property="PreReqSearch_11"/>
<ROW SearchKey="SystemFolderfile.dll_9" Prereq="MySQLInstallerRunn" SearchType="2" SearchString="HKLM\SOFTWARE\MySQL AB\MySQL Server 5.5\Version" VerMin="5.5" Order="1" Property="PreReqSearch_14"/>
<ROW SearchKey="SystemFoldervcruntime140.dll" Prereq="MicrosoftVisualC_2" SearchType="0" SearchString="[SystemFolder]vcruntime140.dll" VerMin="14.26" Order="2" Property="PreReqSearch_10"/>
<ROW SearchKey="UpgradeCode" Prereq="MySQLConnectorODBC" SearchType="4" SearchString="{FF073FBB-32E2-4052-B6B2-830C5ED4A809}" VerMin="8.0.32" Order="1" Property="PreReqSearch_12"/>
<ROW SearchKey="UpgradeCode_1" Prereq="MySQLInstallerCo" SearchType="4" SearchString="{18B94B70-06F1-4AC0-B308-37280DB868C2}" VerMin="1.6.5.0" Order="1" Property="PreReqSearch_13"/>
<ROW SearchKey="UpgradeCode_2" Prereq="Node.js" SearchType="4" SearchString="{47C07A3A-42EF-4213-A85D-8F5A59077C28}" VerMin="18.16.0" Order="1" Property="PreReqSearch_17"/>
<ROW SearchKey="UpgradeCode_3" Prereq="Elasticsearch7.16.3" SearchType="4" SearchString="{DAAA2CBA-A1ED-4F29-AFBF-5478617B00F6}" VerMin="7.16.3" Order="1" Property="PreReqSearch_18"/>
<ROW SearchKey="UpgradeCode_4" Prereq="RedisonWindows" SearchType="4" SearchString="{05410198-7212-4FC4-B7C8-AFEFC3DA0FBC}" VerMin="5.0.10" Order="1" Property="PreReqSearch_21"/>
<ROW SearchKey="UpgradeCode_5" Prereq="FFmpegEssentials" SearchType="4" SearchString="{384A74EC-865A-4907-8561-9DE765EE6E14}" VerMin="6.0.0.20230306" Order="1" Property="PreReqSearch_22"/>
<ROW SearchKey="UpgradeCode_6" Prereq="psqlODBC_x64" SearchType="4" SearchString="{BBD29DF5-89F6-4B8B-BDC9-C3EA3A4AFDBB}" VerMin="09.05.0400" Order="1" Property="PreReqSearch_23"/>
<ROW SearchKey="Version" Prereq="MySQLInstallerRunn" SearchType="2" SearchString="HKLM\SOFTWARE\MySQL AB\MySQL Server 5.7\Version" Order="2" Property="PreReqSearch_15"/>
<ROW SearchKey="Version_1" Prereq="MySQLInstallerRunn" SearchType="2" SearchString="HKLM\SOFTWARE\MySQL AB\MySQL Server 8.0\Version" Order="3" Property="PreReqSearch_16"/>
</COMPONENT>
</DOCUMENT>

View File

@ -31,6 +31,7 @@
<ROW Property="ARPSYSTEMCOMPONENT" Value="1"/>
<ROW Property="ARPURLINFOABOUT" Value="http://www.onlyoffice.com"/>
<ROW Property="ARPURLUPDATEINFO" Value="http://www.onlyoffice.com/download.aspx"/>
<ROW Property="BASE_DOMAIN" Value="localhost"/>
<ROW Property="COMMON_SHORTCUT_NAME" Value="ONLYOFFICE"/>
<ROW Property="DATABASE_MIGRATION" Value="true"/>
<ROW Property="DB_HOST" Value="localhost"/>
@ -56,13 +57,14 @@
<ROW Property="MsiLogging" MultiBuildValue="DefaultBuild:vp#ExeBuild:vp"/>
<ROW Property="MySQLConnector" Value="MySQL Connector/ODBC 8.0.21 x86"/>
<ROW Property="NEED_REINDEX_ELASTICSEARCH" Value="FALSE" ValueLocId="-"/>
<ROW Property="PACKAGE_NAME" Value="ONLYOFFICE_DocSpace_Community_Win-install.v[|ProductVersion]" MultiBuildValue="ExeBuild:ONLYOFFICE_DocSpace_Enterprise_Win-install.v[|ProductVersion]"/>
<ROW Property="PACKAGE_NAME" Value="ONLYOFFICE_DocSpace_Community_Win-install.v[|ProductVersion]" MultiBuildValue="ExeBuild:ONLYOFFICE_DocSpace_Win-install"/>
<ROW Property="PRODUCT_NAME" Value="ONLYOFFICE DocSpace"/>
<ROW Property="PS_DB_HOST" Value="localhost"/>
<ROW Property="PS_DB_NAME" Value="onlyoffice"/>
<ROW Property="PS_DB_PORT" Value="5432"/>
<ROW Property="PS_DB_PWD" Value="onlyoffice"/>
<ROW Property="PS_DB_USER" Value="onlyoffice"/>
<ROW Property="Prereq_IAgree" Value="No"/>
<ROW Property="ProductCode" Value="1033:{3FABEB4A-D27F-4BA6-A40E-16BE47540727} " Type="16"/>
<ROW Property="ProductLanguage" Value="1033"/>
<ROW Property="ProductName" Value="[|PRODUCT_NAME]"/>
@ -207,7 +209,6 @@
<ROW Component="Data" ComponentId="{C46222BF-779D-4F78-9A6B-EA249CCB9761}" Directory_="Data_Dir" Attributes="0"/>
<ROW Component="DocEditor.exe" ComponentId="{FBE9155F-9ACD-4A1A-9198-891ED73BA90C}" Directory_="tools_Dir" Attributes="0" KeyPath="DocEditor.exe"/>
<ROW Component="DocumentServer" ComponentId="{9F6BB24B-F2F9-4FE5-8431-A46F38A301AD}" Directory_="APPDIR" Attributes="260" KeyPath="DocumentServer" Options="2"/>
<ROW Component="DocumentServer.EE" ComponentId="{DFF09176-439E-4FC8-BDEB-39DDBD835A0F}" Directory_="APPDIR" Attributes="260" KeyPath="DocumentServer.EE" Options="2"/>
<ROW Component="Login.exe" ComponentId="{FBE9155F-9ACD-4A1A-9198-891ED73BA202}" Directory_="tools_Dir" Attributes="0" KeyPath="Login.exe"/>
<ROW Component="Logs" ComponentId="{6C28AF1C-0190-4DE3-A753-430496711F3C}" Directory_="Logs_Dir" Attributes="0"/>
<ROW Component="ProdInfo" ComponentId="{5FB28D19-6A7D-4078-901F-58C2DF0DE176}" Directory_="APPDIR" Attributes="260" KeyPath="Version"/>
@ -262,7 +263,6 @@
<ROW Feature="DataBackup" Feature_Parent="DotnetServices" Title=".NET DataBackup Service" Description="Feature contains .NET DataBackup service" Display="27" Level="1" Directory_="APPDIR" Attributes="0"/>
<ROW Feature="DocEditor" Feature_Parent="NodeJSServices" Title="Node.js DocEditor Service" Description="Feature contains Node.js DocEditor service" Display="3" Level="1" Directory_="APPDIR" Attributes="0"/>
<ROW Feature="DocumentServer" Title="DocumentServer" Description="DocumentServer" Display="5" Level="1" Attributes="0" Builds="DefaultBuild"/>
<ROW Feature="DocumentServer.EE" Title="DocumentServer-EE" Description="DocumentServer-EE" Display="35" Level="1" Attributes="0" Builds="ExeBuild"/>
<ROW Feature="DotnetServices" Feature_Parent="MainFeature" Title=".NET services" Description="Feature contains all .NET services" Display="3" Level="1" Directory_="APPDIR" Attributes="0"/>
<ROW Feature="File" Feature_Parent="DotnetServices" Title=".NET File Service" Description="Feature contains .NET File service" Display="23" Level="1" Directory_="APPDIR" Attributes="0"/>
<ROW Feature="Files" Feature_Parent="DotnetServices" Title=".NET Files Service" Description="Feature contains .NET Files service" Display="21" Level="1" Directory_="APPDIR" Attributes="0"/>
@ -309,8 +309,8 @@
<ROW Action="AI_DetectSoftware" Sequence="151"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.BuildComponent">
<ROW BuildKey="DefaultBuild" BuildName="EXE_COMMUNITY" BuildOrder="1" BuildType="0" PackageFolder="publish" PackageFileName="[|PACKAGE_NAME]" Languages="en" InstallationType="4" CabsLocation="1" PackageType="1" FilesInsideExe="true" ExeIconPath="Resources\icon.ico" ExtractionFolder="[AppDataFolder][|INSTALL_ROOT_FOLDER_NAME]\DocSpace\install" ExtUI="true" UseLargeSchema="true" Unicode="true" ExeName="[|PACKAGE_NAME]" UACExecutionLevel="2"/>
<ROW BuildKey="ExeBuild" BuildName="EXE_ENTERPRISE" BuildOrder="2" BuildType="0" PackageFolder="publish" PackageFileName="[|PACKAGE_NAME]" Languages="en" InstallationType="4" CabsLocation="1" PackageType="1" FilesInsideExe="true" ExeIconPath="Resources\icon.ico" ExtractionFolder="[AppDataFolder][|INSTALL_ROOT_FOLDER_NAME]\DocSpace\install" UseLargeSchema="true" Unicode="true" ExeName="[|PACKAGE_NAME]" UACExecutionLevel="2"/>
<ROW BuildKey="DefaultBuild" BuildName="DOCSPACE_EXE" BuildOrder="1" BuildType="0" PackageFolder="publish" PackageFileName="[|PACKAGE_NAME]" Languages="en" InstallationType="4" CabsLocation="1" PackageType="1" FilesInsideExe="true" ExeIconPath="Resources\icon.ico" ExtractionFolder="[AppDataFolder][|INSTALL_ROOT_FOLDER_NAME]\DocSpace\install" ExtUI="true" UseLargeSchema="true" Unicode="true" ExeName="[|PACKAGE_NAME]" UACExecutionLevel="2"/>
<ROW BuildKey="ExeBuild" BuildName="DOCSPACE_MSI" BuildOrder="2" BuildType="0" PackageFolder="publish" PackageFileName="[|PACKAGE_NAME]" Languages="en" InstallationType="4" UseLargeSchema="true" Unicode="true" UACExecutionLevel="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.DictionaryComponent">
<ROW Path="&lt;AI_DICTS&gt;ui.ail"/>
@ -344,10 +344,9 @@
<ROW Fragment="WelcomePrereqDlg.aip" Path="&lt;AI_THEMES&gt;classic\fragments\WelcomePrereqDlg.aip"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.JsonFileComponent">
<ROW JsonFile="apisystem.json" FileName="APISYS~1.JSO|apisystem.json" DirProperty="config_Dir" Component="config" RootProperty="Root_12" Flags="6" IndentUnits="2"/>
<ROW JsonFile="apisystem.json" FileName="APISYS~1.JSO|apisystem.PRODUCT.ENVIRONMENT.SUB.json" DirProperty="config_Dir" Component="config" RootProperty="Root_12" Flags="6" IndentUnits="2"/>
<ROW JsonFile="appsettings.env.json" FileName="APPSET~1.JSO|appsettings.PRODUCT.ENVIRONMENT.SUB.json" DirProperty="config_Dir" Component="config" RootProperty="Root_1" Flags="6" IndentUnits="2"/>
<ROW JsonFile="appsettings.json_ASC.Migration.Runner" FileName="APPSET~2.JSO|appsettings.runner.json" DirProperty="service_6_Dir" Component="ASC.Migration.Runner.exe" RootProperty="Root_11" Flags="6" IndentUnits="2"/>
<ROW JsonFile="appsettings.json_config" FileName="APPSET~3.JSO|appsettings.json" DirProperty="config_Dir" Component="config" RootProperty="Root_5" Flags="6" IndentUnits="2"/>
<ROW JsonFile="appsettings.services.json" FileName="APPSET~2.JSO|appsettings.services.json" DirProperty="config_Dir" Component="config" RootProperty="Root_4" Flags="6" IndentUnits="2"/>
<ROW JsonFile="config.json_config_editor" FileName="CONFIG~1.JSO|config.json" DirProperty="editor_Dir" Component="editor" RootProperty="Root_10" Flags="6" IndentUnits="2"/>
<ROW JsonFile="config.json_config_login" FileName="CONFIG~1.JSO|config.json" DirProperty="login_Dir" Component="login" RootProperty="Root_9" Flags="6" IndentUnits="2"/>
@ -382,7 +381,6 @@
<ROW JsonProperty="Root_2" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_3" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_4" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_5" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_6" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_7" Name="Root" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="Root_9" Name="Root" Condition="1" Order="0" Flags="60"/>
@ -399,11 +397,12 @@
<ROW JsonProperty="appsettings_1" Parent="app_1" Name="appsettings" Condition="1" Order="1" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
<ROW JsonProperty="appsettings_3" Parent="app_3" Name="appsettings" Condition="1" Order="0" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
<ROW JsonProperty="appsettings_4" Parent="app_4" Name="appsettings" Condition="1" Order="0" Flags="57" Value="[APPDIR_FORWARD_SLASH]config"/>
<ROW JsonProperty="connectionString" Parent="default" Name="connectionString" Condition="1" Order="0" Flags="57" Value="Server=[DB_HOST];Port=[DB_PORT];Database=[DB_NAME];User ID=[DB_USER];Password=[DB_PWD];Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none"/>
<ROW JsonProperty="connectionString_1" Parent="default_1" Name="connectionString" Condition="1" Order="0" Flags="57" Value="Server=[DB_HOST];Port=[DB_PORT];Database=[DB_NAME];User ID=[DB_USER];Password=[DB_PWD];Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none"/>
<ROW JsonProperty="basedomain" Parent="core_3" Name="base-domain" Condition="1" Order="0" Flags="57" Value="[BASE_DOMAIN]"/>
<ROW JsonProperty="basedomain_1" Parent="core_1" Name="base-domain" Condition="1" Order="0" Flags="57" Value="[BASE_DOMAIN]"/>
<ROW JsonProperty="connectionString" Parent="default" Name="connectionString" Condition="1" Order="0" Flags="57" Value="Server=[DB_HOST];Port=[DB_PORT];Database=[DB_NAME];User ID=[DB_USER];Password=[DB_PWD];Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none;AllowPublicKeyRetrieval=true;Connection Timeout=30;Maximum Pool Size=300"/>
<ROW JsonProperty="connectionString_1" Parent="default_1" Name="connectionString" Condition="1" Order="0" Flags="57" Value="Server=[DB_HOST];Port=[DB_PORT];Database=[DB_NAME];User ID=[DB_USER];Password=[DB_PWD];Pooling=true;Character Set=utf8;AutoEnlist=false;SSL Mode=none;AllowPublicKeyRetrieval=true;Connection Timeout=30;Maximum Pool Size=300"/>
<ROW JsonProperty="core" Parent="Root_4" Name="core" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="core_1" Parent="Root_5" Name="core" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="core_2" Parent="Root_1" Name="core" Condition="1" Order="2" Flags="60"/>
<ROW JsonProperty="core_1" Parent="Root_1" Name="core" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="core_3" Parent="Root_12" Name="core" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="default" Parent="ConnectionStrings" Name="default" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="default_1" Parent="ConnectionStrings_1" Name="default" Condition="1" Order="0" Flags="60"/>
@ -412,23 +411,26 @@
<ROW JsonProperty="enabled" Parent="migration" Name="enabled" Condition="1" Order="0" Flags="57" Value="[DATABASE_MIGRATION]"/>
<ROW JsonProperty="environment" Parent="app" Name="environment" Condition="1" Order="2" Flags="57" Value="[ENVIRONMENT]"/>
<ROW JsonProperty="environment_1" Parent="app_1" Name="environment" Condition="1" Order="2" Flags="57" Value="[ENVIRONMENT]"/>
<ROW JsonProperty="environment_2" Parent="app_3" Name="environment" Condition="1" Order="1" Flags="57" Value="[ENVIRONMENT]"/>
<ROW JsonProperty="environment_3" Parent="app_4" Name="environment" Condition="1" Order="1" Flags="57" Value="[ENVIRONMENT]"/>
<ROW JsonProperty="files" Parent="Root_1" Name="files" Condition="1" Order="3" Flags="60"/>
<ROW JsonProperty="folder" Parent="products" Name="folder" Condition="1" Order="0" Flags="57" Value="[APPDIR_FORWARD_SLASH]products"/>
<ROW JsonProperty="folder_1" Parent="products_1" Name="folder" Condition="1" Order="0" Flags="57" Value="[APPDIR_FORWARD_SLASH]products"/>
<ROW JsonProperty="header" Parent="secret" Name="header" Condition="1" Order="1" Flags="57" Value="[DOCUMENT_SERVER_JWT_HEADER]"/>
<ROW JsonProperty="internal" Parent="url" Name="internal" Condition="1" Order="1" Flags="57" Value="http://[DOCUMENT_SERVER_HOST]:[DOCUMENT_SERVER_PORT]"/>
<ROW JsonProperty="logPath" Parent="Root_4" Name="logPath" Condition="1" Order="1" Flags="57" Value="[APPDIR_FORWARD_SLASH]Logs"/>
<ROW JsonProperty="machinekey" Parent="core_2" Name="machinekey" Condition="1" Order="0" Flags="57" Value="[MACHINE_KEY]"/>
<ROW JsonProperty="machinekey" Parent="core_1" Name="machinekey" Condition="1" Order="1" Flags="57" Value="[MACHINE_KEY]"/>
<ROW JsonProperty="machinekey_1" Parent="app_1" Name="machinekey" Condition="1" Order="3" Flags="57" Value="[MACHINE_KEY]"/>
<ROW JsonProperty="machinekey_2" Parent="core_1" Name="machinekey" Condition="1" Order="0" Flags="57" Value="[MACHINE_KEY]"/>
<ROW JsonProperty="machinekey_3" Parent="core_3" Name="machinekey" Condition="1" Order="0" Flags="57" Value="[MACHINE_KEY]"/>
<ROW JsonProperty="machinekey_3" Parent="core_3" Name="machinekey" Condition="1" Order="1" Flags="57" Value="[MACHINE_KEY]"/>
<ROW JsonProperty="migration" Parent="Root_1" Name="migration" Condition="1" Order="1" Flags="60"/>
<ROW JsonProperty="notify" Parent="Root_1" Name="notify" Condition="1" Order="1" Flags="60"/>
<ROW JsonProperty="options" Parent="Root_11" Name="options" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="port" Parent="app" Name="port" Condition="1" Order="0" Flags="57" Value="[Socket.IO_Port]"/>
<ROW JsonProperty="port_1" Parent="app_1" Name="port" Condition="1" Order="0" Flags="57" Value="[SsoAuth_Port]"/>
<ROW JsonProperty="portal" Parent="url" Name="portal" Condition="1" Order="2" Flags="57" Value="http://localhost:80"/>
<ROW JsonProperty="postman" Parent="notify" Name="postman" Condition="1" Order="0" Flags="57" Value="services"/>
<ROW JsonProperty="products" Parent="core" Name="products" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="products_1" Parent="core_2" Name="products" Condition="1" Order="1" Flags="60"/>
<ROW JsonProperty="products_1" Parent="core_1" Name="products" Condition="1" Order="2" Flags="60"/>
<ROW JsonProperty="public" Parent="url" Name="public" Condition="1" Order="0" Flags="57" Value="http://[DOCUMENT_SERVER_HOST]:[DOCUMENT_SERVER_PORT]"/>
<ROW JsonProperty="secret" Parent="docservice" Name="secret" Condition="1" Order="0" Flags="60"/>
<ROW JsonProperty="url" Parent="docservice" Name="url" Condition="1" Order="1" Flags="60"/>
@ -470,8 +472,33 @@
<ROW Action="AI_XmlUninstall" Description="Generating actions to configure XML files" DescriptionLocId="ActionText.Description.AI_XmlUninstall"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiAppSearchComponent">
<ROW Property="AI_SETUPEXEPATH" Signature_="AI_EXE_PATH_LM" Builds="DefaultBuild;ExeBuild"/>
<ROW Property="AI_SETUPEXEPATH" Signature_="AI_EXE_PATH_CU" Builds="DefaultBuild;ExeBuild"/>
<ROW Property="AI_SETUPEXEPATH" Signature_="AI_EXE_PATH_LM" Builds="DefaultBuild"/>
<ROW Property="AI_SETUPEXEPATH" Signature_="AI_EXE_PATH_CU" Builds="DefaultBuild"/>
<ROW Property="REDIS_PWD" Signature_="AppSearchSign"/>
<ROW Property="REDIS_PORT" Signature_="AppSearchSign_1"/>
<ROW Property="REDIS_HOST" Signature_="AppSearchSign_2"/>
<ROW Property="PS_DB_USER" Signature_="AppSearchSign_3"/>
<ROW Property="PS_DB_PWD" Signature_="AppSearchSign_4"/>
<ROW Property="PS_DB_PORT" Signature_="AppSearchSign_5"/>
<ROW Property="PS_DB_NAME" Signature_="AppSearchSign_6"/>
<ROW Property="PS_DB_HOST" Signature_="AppSearchSign_7"/>
<ROW Property="ELASTICSEARCH_SCHEME" Signature_="AppSearchSign_8"/>
<ROW Property="ELASTICSEARCH_PORT" Signature_="AppSearchSign_9"/>
<ROW Property="ELASTICSEARCH_HOST" Signature_="AppSearchSign_10"/>
<ROW Property="DB_USER" Signature_="AppSearchSign_11"/>
<ROW Property="DB_PWD" Signature_="AppSearchSign_12"/>
<ROW Property="DB_PORT" Signature_="AppSearchSign_13"/>
<ROW Property="DB_NAME" Signature_="AppSearchSign_14"/>
<ROW Property="DB_HOST" Signature_="AppSearchSign_15"/>
<ROW Property="AMQP_VHOST" Signature_="AppSearchSign_16"/>
<ROW Property="AMQP_USER" Signature_="AppSearchSign_17"/>
<ROW Property="AMQP_PWD" Signature_="AppSearchSign_18"/>
<ROW Property="AMQP_PORT" Signature_="AppSearchSign_19"/>
<ROW Property="AMQP_HOST" Signature_="AppSearchSign_20"/>
<ROW Property="DOCUMENT_SERVER_JWT_ENABLED" Signature_="AppSearchSign_21"/>
<ROW Property="DOCUMENT_SERVER_JWT_HEADER" Signature_="AppSearchSign_22"/>
<ROW Property="DOCUMENT_SERVER_JWT_SECRET" Signature_="AppSearchSign_23"/>
<ROW Property="DOCUMENT_SERVER_PORT" Signature_="AppSearchSign_24"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiBinaryComponent">
<ROW Name="NetFirewall.dll" SourcePath="&lt;AI_CUSTACTS&gt;NetFirewall.dll"/>
@ -509,7 +536,6 @@
<ROW Feature_="WebStudio" Level="4" Condition="WEB_STUDIO_SERVICE = 0"/>
<ROW Feature_="Proxy" Level="4" Condition="PROXY_SERVICE = 0"/>
<ROW Feature_="WebHealthChecksUI" Level="4" Condition="WEB_HEALTHCHECKS_UI_SERVICE = 0"/>
<ROW Feature_="DocumentServer.EE" Level="4" Condition="DOCUMENT_SERVER_INSTALL_NONE = 1"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlComponent">
<ROW Dialog_="AdminBrowseDlg" Control="OK" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_OK]" Order="300" TextLocId="-" MsiKey="AdminBrowseDlg#OK"/>
@ -644,6 +670,16 @@
<ROW Dialog_="PrepareDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1048577" Text="[ButtonText_Back]" Order="700" TextLocId="-" MsiKey="PrepareDlg#Back" Options="1"/>
<ROW Dialog_="PreparePrereqDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Back]" Order="300" TextLocId="-" MsiKey="PreparePrereqDlg#Back" Options="1"/>
<ROW Dialog_="PreparePrereqDlg" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="dialog.bmp" Order="400" MsiKey="PreparePrereqDlg#Bitmap"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Next]" Order="100" TextLocId="-" Options="1"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="200" TextLocId="-" Options="1"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="300" TextLocId="-" Options="1"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="400"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="500"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="BottomLine" Type="Line" X="0" Y="234" Width="368" Height="0" Attributes="1" Order="600"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Attributes="196611" Text="Please read the following license agreement carefully" Order="700"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="Title" Type="Text" X="15" Y="6" Width="289" Height="15" Attributes="196611" Text="End-User License Agreement" TextStyle="[DlgTitleFont]" Order="800"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="AgreementText" Type="ScrollableText" X="20" Y="60" Width="330" Height="120" Attributes="7" Text="Resources\License_Redist.rtf" Order="900" TextLocId="-"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control="Buttons" Type="RadioButtonGroup" X="20" Y="187" Width="330" Height="40" Attributes="3" Property="Prereq_IAgree" Order="1000"/>
<ROW Dialog_="PrerequisitesDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="300" TextLocId="-" MsiKey="PrerequisitesDlg#Back" Options="1"/>
<ROW Dialog_="PrerequisitesDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="banner.bmp" Order="400" MsiKey="PrerequisitesDlg#BannerBitmap"/>
<ROW Dialog_="PrerequisitesDlg" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="20" Attributes="196611" Text="Select which prerequisites will be installed" Order="700" TextLocId="Control.Text.PrerequisitesDlg#Description" MsiKey="PrerequisitesDlg#Description"/>
@ -744,6 +780,10 @@
<ROW Dialog_="WelcomePrereqDlg" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="dialog.bmp" Order="500" MsiKey="WelcomePrereqDlg#Bitmap"/>
<ATTRIBUTE name="DeletedRows" value="AdminBrowseDlg#Logo@AdminInstallPointDlg#Logo@BrowseDlg#Logo@CustomizeDlg#Logo@DiskCostDlg#Logo@FilesInUse#Logo@FolderDlg#Logo@MaintenanceTypeDlg#Logo@MsiRMFilesInUse#Logo@OutOfDiskDlg#Logo@OutOfRbDiskDlg#Logo@PrerequisitesDlg#Logo@ProgressDlg#Logo@ProgressPrereqDlg#Logo@SQLConnectionDlg#Logo@SQLConnectionDlg#OdbcResourceEdit@SQLConnectionDlg#OdbcResourceLabel@SQLConnectionDlg.aip@VerifyReadyDlg#Logo@VerifyRemoveDlg#Logo@VerifyRepairDlg#Logo"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlConditionComponent">
<ROW Dialog_="PrereqLicenseAgreementDlg" Control_="Next" Action="Disable" Condition="Prereq_IAgree &lt;&gt; &quot;Yes&quot;"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control_="Next" Action="Enable" Condition="Prereq_IAgree = &quot;Yes&quot;"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiControlEventComponent">
<ROW Dialog_="WelcomeDlg" Control_="Next" Event="NewDialog" Argument="FolderDlg" Condition="AI_INSTALL AND ( OLDPRODUCTS = &quot;&quot; )" Ordering="19"/>
<ROW Dialog_="FolderDlg" Control_="Next" Event="NewDialog" Argument="SQLConnectionDlg" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="216"/>
@ -765,11 +805,14 @@
<ROW Dialog_="VerifyRemoveDlg" Control_="Remove" Event="EndDialog" Argument="Return" Condition="AI_MAINT AND InstallMode=&quot;Remove&quot;" Ordering="299" Options="1"/>
<ROW Dialog_="PatchWelcomeDlg" Control_="Next" Event="NewDialog" Argument="VerifyReadyDlg" Condition="AI_PATCH" Ordering="201"/>
<ROW Dialog_="ResumeDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_RESUME" Ordering="299"/>
<ROW Dialog_="WelcomePrereqDlg" Control_="Next" Event="NewDialog" Argument="PrerequisitesDlg" Condition="AI_BOOTSTRAPPER" Ordering="1"/>
<ROW Dialog_="WelcomePrereqDlg" Control_="Next" Event="NewDialog" Argument="PrereqLicenseAgreementDlg" Condition="AI_BOOTSTRAPPER" Ordering="1"/>
<ROW Dialog_="PrerequisitesDlg" Control_="Next" Event="EndDialog" Argument="Return" Condition="AI_BOOTSTRAPPER" Ordering="1"/>
<ROW Dialog_="PrerequisitesDlg" Control_="Back" Event="NewDialog" Argument="PrereqLicenseAgreementDlg" Condition="AI_BOOTSTRAPPER" Ordering="1"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control_="Next" Event="NewDialog" Argument="PrerequisitesDlg" Condition="AI_BOOTSTRAPPER" Ordering="1"/>
<ROW Dialog_="PrereqLicenseAgreementDlg" Control_="Back" Event="NewDialog" Argument="WelcomePrereqDlg" Condition="AI_BOOTSTRAPPER" Ordering="1"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Install" Event="EndDialog" Argument="Return" Condition="AI_PATCH" Ordering="199"/>
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="PatchWelcomeDlg" Condition="AI_PATCH" Ordering="205"/>
<ROW Dialog_="PrerequisitesDlg" Control_="Back" Event="NewDialog" Argument="WelcomePrereqDlg" Condition="AI_BOOTSTRAPPER" Ordering="1"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="DoAction" Argument="AI_DATA_SETTER_5" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="4"/>
<ROW Dialog_="SQLConnectionDlg" Control_="Next" Event="DoAction" Argument="TestSQLConnectionMsgBox" Condition="AI_INSTALL AND ( SqlConnectionError &lt;&gt; &quot;&quot; )" Ordering="5"/>
<ROW Dialog_="SQLConnectionDlg" Control_="SQLConnectionDlgDialogInitializer" Event="[DB_PWD]" Argument="{}" Condition="AI_INSTALL AND ( OLDPRODUCTS=&quot;&quot; AND SQLConnectionDlg_Cond )" Ordering="4"/>
@ -983,6 +1026,7 @@
<ROW Action="AI_RESTORE_LOCATION" Type="65" Source="aicustact.dll" Target="RestoreLocation"/>
<ROW Action="AI_ResolveKnownFolders" Type="1" Source="aicustact.dll" Target="AI_ResolveKnownFolders"/>
<ROW Action="AI_ResolveLocalizedCredentials" Type="1" Source="aicustact.dll" Target="GetLocalizedCredentials"/>
<ROW Action="AI_RestartElevated" Type="1" Source="aicustact.dll" Target="RestartElevated"/>
<ROW Action="AI_RevokePermissions" Type="11265" Source="userAccounts.dll" Target="OnRevokePermissions" WithoutSeq="true"/>
<ROW Action="AI_SHOW_LOG" Type="65" Source="aicustact.dll" Target="LaunchLogFile" WithoutSeq="true"/>
<ROW Action="AI_STORE_LOCATION" Type="51" Source="ARPINSTALLLOCATION" Target="[APPDIR]"/>
@ -1034,6 +1078,7 @@
<COMPONENT cid="caphyon.advinst.msicomp.MsiDialogComponent">
<ROW Dialog="ELKConnectionDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
<ROW Dialog="PostgreSQLConnectionDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
<ROW Dialog="PrereqLicenseAgreementDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel" TitleLocId="-"/>
<ROW Dialog="RabbitMQConnectionDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
<ROW Dialog="RedisServerConnectionDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
</COMPONENT>
@ -1123,7 +1168,6 @@
<ROW Feature_="NodeJSServices" Component_="tools"/>
<ROW Feature_="MainFeature" Component_="AppPath"/>
<ROW Feature_="MainFeature" Component_="icon.ico"/>
<ROW Feature_="DocumentServer.EE" Component_="DocumentServer.EE"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiIconsComponent">
<ROW Name="icon.exe" SourcePath="Resources\icon.ico" Index="0"/>
@ -1143,16 +1187,16 @@
<ROW Action="AI_EnableDebugLog" Sequence="52"/>
<ROW Action="AI_AppSearchEx" Sequence="103"/>
<ROW Action="AI_DetectSoftware" Sequence="102"/>
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99" Builds="DefaultBuild;ExeBuild"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Condition="AI_SETUPEXEPATH_ORIGINAL" Sequence="101" Builds="DefaultBuild;ExeBuild"/>
<ROW Action="AI_DeleteCadLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="199" Builds="DefaultBuild;ExeBuild"/>
<ROW Action="AI_DeleteRCadLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="198" Builds="DefaultBuild;ExeBuild"/>
<ROW Action="AI_ExtractCadLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="197" Builds="DefaultBuild;ExeBuild"/>
<ROW Action="AI_FindExeLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="196" Builds="DefaultBuild;ExeBuild"/>
<ROW Action="AI_ExtractLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="1549" Builds="DefaultBuild;ExeBuild"/>
<ROW Action="AI_DeleteRLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="1548" Builds="DefaultBuild;ExeBuild"/>
<ROW Action="AI_DeleteLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="6597" Builds="DefaultBuild;ExeBuild"/>
<ROW Action="AI_ExtractFiles" Sequence="1399" Builds="DefaultBuild;ExeBuild"/>
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99" Builds="DefaultBuild"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Condition="AI_SETUPEXEPATH_ORIGINAL" Sequence="101" Builds="DefaultBuild"/>
<ROW Action="AI_DeleteCadLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="199" Builds="DefaultBuild"/>
<ROW Action="AI_DeleteRCadLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="198" Builds="DefaultBuild"/>
<ROW Action="AI_ExtractCadLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="197" Builds="DefaultBuild"/>
<ROW Action="AI_FindExeLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="196" Builds="DefaultBuild"/>
<ROW Action="AI_ExtractLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="1549" Builds="DefaultBuild"/>
<ROW Action="AI_DeleteRLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="1548" Builds="DefaultBuild"/>
<ROW Action="AI_DeleteLzma" Condition="SETUPEXEDIR=&quot;&quot; AND Installed AND (REMOVE&lt;&gt;&quot;ALL&quot;) AND (AI_INSTALL_MODE&lt;&gt;&quot;Remove&quot;) AND (NOT PATCH)" Sequence="6597" Builds="DefaultBuild"/>
<ROW Action="AI_ExtractFiles" Sequence="1399" Builds="DefaultBuild"/>
<ROW Action="AI_DATA_SETTER_2" Sequence="1398"/>
<ROW Action="AI_ProcessFailActions" Sequence="5848"/>
<ROW Action="AI_DATA_SETTER_3" Sequence="5847"/>
@ -1204,15 +1248,15 @@
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiInstallUISequenceComponent">
<ROW Action="AI_RESTORE_LOCATION" Condition="APPDIR=&quot;&quot;" Sequence="749"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="54"/>
<ROW Action="AI_DpiContentScale" Sequence="53"/>
<ROW Action="AI_EnableDebugLog" Sequence="52"/>
<ROW Action="AI_ResolveKnownFolders" Sequence="55"/>
<ROW Action="AI_DpiContentScale" Sequence="54"/>
<ROW Action="AI_EnableDebugLog" Sequence="53"/>
<ROW Action="AI_BACKUP_AI_SETUPEXEPATH" Sequence="99"/>
<ROW Action="AI_RESTORE_AI_SETUPEXEPATH" Condition="AI_SETUPEXEPATH_ORIGINAL" Sequence="103"/>
<ROW Action="AI_AppSearchEx" Sequence="102"/>
<ROW Action="AI_DetectSoftware" Sequence="101"/>
<ROW Action="MySQLConfigure" Condition="( NOT Installed )" Sequence="1101"/>
<ROW Action="AI_ResolveLocalizedCredentials" Sequence="51"/>
<ROW Action="AI_ResolveLocalizedCredentials" Sequence="52"/>
<ROW Action="AI_DownloadPrereq" Sequence="1297"/>
<ROW Action="AI_ExtractPrereq" Sequence="1298"/>
<ROW Action="AI_InstallPrerequisite" Sequence="1299"/>
@ -1224,6 +1268,7 @@
<ROW Action="Set_DS_JWT_SECRET" Condition="( ( NOT Installed ) OR ( Installed AND REMOVE &lt;&gt; &quot;ALL&quot; AND AI_INSTALL_MODE &lt;&gt; &quot;Remove&quot; ) ) AND ( JWT_ENABLED = &quot;true&quot; )" Sequence="1106"/>
<ROW Action="PostgreSQLConfigure" Condition="( NOT Installed )" Sequence="1102"/>
<ROW Action="AI_PRESERVE_INSTALL_TYPE" Sequence="199"/>
<ROW Action="AI_RestartElevated" Sequence="51" Builds="ExeBuild"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent">
<ROW Condition="( Version9X OR ( NOT VersionNT64 ) OR ( VersionNT64 AND ((VersionNT64 &lt;&gt; 600) OR (MsiNTProductType &lt;&gt; 1)) AND ((VersionNT64 &lt;&gt; 600) OR (MsiNTProductType = 1)) AND ((VersionNT64 &lt;&gt; 601) OR (MsiNTProductType &lt;&gt; 1)) AND ((VersionNT64 &lt;&gt; 601) OR (MsiNTProductType = 1)) AND ((VersionNT64 &lt;&gt; 602) OR (MsiNTProductType &lt;&gt; 1)) AND ((VersionNT64 &lt;&gt; 603) OR (MsiNTProductType &lt;&gt; 1)) AND ((VersionNT64 &lt;&gt; 1000) OR (MsiNTProductType &lt;&gt; 1)) AND ((VersionNT64 &lt;&gt; 1100) OR (MsiNTProductType &lt;&gt; 1)) ) )" Description="[ProductName] cannot be installed on the following Windows versions: [WindowsTypeNT64Display]." DescriptionLocId="AI.LaunchCondition.NoSpecificNT64" IsPredefined="true" Builds="DefaultBuild;ExeBuild"/>
@ -1233,7 +1278,7 @@
<ROW Condition="(VersionNT &lt;&gt; 500)" Description="[ProductName] cannot be installed on [WindowsTypeNT50Display]." DescriptionLocId="AI.LaunchCondition.NoNT50" IsPredefined="true" Builds="DefaultBuild;ExeBuild"/>
<ROW Condition="AI_DETECTED_ADMIN_USER" Description="[ProductName] requires installation by an Admin user account." DescriptionLocId="AI.LaunchCondition.Admin.User" IsPredefined="true" Builds="DefaultBuild;ExeBuild"/>
<ROW Condition="AI_DETECTED_INTERNET_CONNECTION" Description="[ProductName] requires an active Internet connection for installation. Please check your network configuration and proxy settings." DescriptionLocId="AI.LaunchCondition.Internet" IsPredefined="true" Builds="DefaultBuild;ExeBuild"/>
<ROW Condition="SETUPEXEDIR OR (REMOVE=&quot;ALL&quot;)" Description="This package can only be run from a bootstrapper." DescriptionLocId="AI.LaunchCondition.RequireBootstrapper" IsPredefined="true" Builds="DefaultBuild;ExeBuild"/>
<ROW Condition="SETUPEXEDIR OR (REMOVE=&quot;ALL&quot;)" Description="This package can only be run from a bootstrapper." DescriptionLocId="AI.LaunchCondition.RequireBootstrapper" IsPredefined="true" Builds="DefaultBuild"/>
<ROW Condition="VersionNT" Description="[ProductName] cannot be installed on [WindowsType9XDisplay]." DescriptionLocId="AI.LaunchCondition.No9X" IsPredefined="true" Builds="DefaultBuild;ExeBuild"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiLockPermComponent">
@ -1296,9 +1341,38 @@
<ROW LockObject="Data_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="2"/>
<ROW LockObject="temp_16_Dir" Table="CreateFolder" User="[USR_LOCAL_SERVICE]" Permission="1180063" Flags="0"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiRadioButtonComponent">
<ROW Property="Prereq_IAgree" Order="1" Value="Yes" X="5" Y="0" Width="250" Height="15" Text="I &amp;accept the terms in the License Agreement" TextStyle="DlgFont8" TextLocId="RadioButton.Text.IAgree#1"/>
<ROW Property="Prereq_IAgree" Order="2" Value="No" X="5" Y="20" Width="250" Height="15" Text="I &amp;do not accept the terms in the License Agreement" TextStyle="DlgFont8" TextLocId="RadioButton.Text.IAgree#2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiRegLocatorComponent">
<ROW Signature_="AI_EXE_PATH_CU" Root="1" Key="Software\Caphyon\Advanced Installer\LZMA\[ProductCode]\[ProductVersion]" Name="AI_ExePath" Type="2"/>
<ROW Signature_="AI_EXE_PATH_LM" Root="2" Key="Software\Caphyon\Advanced Installer\LZMA\[ProductCode]\[ProductVersion]" Name="AI_ExePath" Type="2"/>
<ROW Signature_="AppSearchSign" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="REDIS_PWD" Type="2"/>
<ROW Signature_="AppSearchSign_1" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="REDIS_PORT" Type="2"/>
<ROW Signature_="AppSearchSign_10" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="ELASTICSEARCH_HOST" Type="2"/>
<ROW Signature_="AppSearchSign_11" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DB_USER" Type="2"/>
<ROW Signature_="AppSearchSign_12" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DB_PWD" Type="2"/>
<ROW Signature_="AppSearchSign_13" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DB_PORT" Type="2"/>
<ROW Signature_="AppSearchSign_14" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DB_NAME" Type="2"/>
<ROW Signature_="AppSearchSign_15" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DB_HOST" Type="2"/>
<ROW Signature_="AppSearchSign_16" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="AMQP_VHOST" Type="2"/>
<ROW Signature_="AppSearchSign_17" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="AMQP_USER" Type="2"/>
<ROW Signature_="AppSearchSign_18" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="AMQP_PWD" Type="2"/>
<ROW Signature_="AppSearchSign_19" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="AMQP_PORT" Type="2"/>
<ROW Signature_="AppSearchSign_2" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="REDIS_HOST" Type="2"/>
<ROW Signature_="AppSearchSign_20" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="AMQP_HOST" Type="2"/>
<ROW Signature_="AppSearchSign_21" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DOCUMENT_SERVER_JWT_ENABLED" Type="2"/>
<ROW Signature_="AppSearchSign_22" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DOCUMENT_SERVER_JWT_HEADER" Type="2"/>
<ROW Signature_="AppSearchSign_23" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DOCUMENT_SERVER_JWT_SECRET" Type="2"/>
<ROW Signature_="AppSearchSign_24" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="DOCUMENT_SERVER_PORT" Type="2"/>
<ROW Signature_="AppSearchSign_3" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="PS_DB_USER" Type="2"/>
<ROW Signature_="AppSearchSign_4" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="PS_DB_PWD" Type="2"/>
<ROW Signature_="AppSearchSign_5" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="PS_DB_PORT" Type="2"/>
<ROW Signature_="AppSearchSign_6" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="PS_DB_NAME" Type="2"/>
<ROW Signature_="AppSearchSign_7" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="PS_DB_HOST" Type="2"/>
<ROW Signature_="AppSearchSign_8" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="ELASTICSEARCH_SCHEME" Type="2"/>
<ROW Signature_="AppSearchSign_9" Root="2" Key="Software\[Manufacturer]\[ProductName]" Name="ELASTICSEARCH_PORT" Type="2"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiRegsComponent">
<ROW Registry="AI_ExePath" Root="-1" Key="Software\Caphyon\Advanced Installer\LZMA\[ProductCode]\[ProductVersion]" Name="AI_ExePath" Value="[AI_SETUPEXEPATH]" Component_="AI_ExePath"/>
@ -1307,11 +1381,11 @@
<ROW Registry="Comments" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Comments" Value="[ARPCOMMENTS]" Component_="AI_CustomARPName"/>
<ROW Registry="Contact" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="Contact" Value="[ARPCONTACT]" Component_="AI_CustomARPName"/>
<ROW Registry="CurrentVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion" Name="\"/>
<ROW Registry="DOCUMENT_SERVER_JWT_SECRET" Root="-1" Key="Software\[Manufacturer]\[ProductName]" Name="DOCUMENT_SERVER_JWT_SECRET" Value="[DOCUMENT_SERVER_JWT_SECRET]" Component_="APPDIR"/>
<ROW Registry="DisplayIcon" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayIcon" Value="[ARP_ICON_PATH]" Component_="AI_CustomARPName"/>
<ROW Registry="DisplayName" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayName" Value="[AI_PRODUCTNAME_ARP]" Component_="AI_CustomARPName"/>
<ROW Registry="DisplayVersion" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="DisplayVersion" Value="[ProductVersion]" Component_="AI_CustomARPName"/>
<ROW Registry="DocumentServer" Root="-1" Key="Software\Caphyon\Advanced Installer\Prereqs\[ProductCode]\[ProductVersion]" Name="DocumentServer" Value="1" Component_="DocumentServer"/>
<ROW Registry="DocumentServer.EE" Root="-1" Key="Software\Caphyon\Advanced Installer\Prereqs\[ProductCode]\[ProductVersion]" Name="DocumentServer.EE" Value="1" Component_="DocumentServer.EE"/>
<ROW Registry="EstimatedSize" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="EstimatedSize" Value="#[AI_ARP_SIZE]" Component_="AI_CustomARPName" VirtualValue="#"/>
<ROW Registry="HelpLink" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="HelpLink" Value="[ARPHELPLINK]" Component_="AI_CustomARPName"/>
<ROW Registry="HelpTelephone" Root="-1" Key="Software\Microsoft\Windows\CurrentVersion\Uninstall\[ProductName] [ProductVersion]" Name="HelpTelephone" Value="[ARPHELPTELEPHONE]" Component_="AI_CustomARPName"/>
@ -1402,23 +1476,23 @@
<ROW ServiceControl="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" Event="161" Wait="0" Component_="ASC.Web.Studio.exe"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiServInstComponent">
<ROW ServiceInstall="ServiceName_WebHealthChecksUI" Name="[ServiceName_WebHealthChecksUI]" DisplayName="[ServiceName_WebHealthChecksUI]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5033" Component_="ASC.Web.HealthChecks.UI.exe"/>
<ROW ServiceInstall="ServiceName_ApiSystemService" Name="[ServiceName_ApiSystemService]" DisplayName="[ServiceName_ApiSystemService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5010 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_ApiSystemService]" Component_="ASC.ApiSystem.exe"/>
<ROW ServiceInstall="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" DisplayName="[ServiceName_BackgroundTasks]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5032 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER] --core:eventBus:subscriptionClientName=asc_event_bus_backup_queue" Component_="ASC.Data.Backup.BackgroundTasks.exe"/>
<ROW ServiceInstall="ServiceName_BackupService" Name="[ServiceName_BackupService]" DisplayName="[ServiceName_BackupService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5012 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Data.Backup.exe"/>
<ROW ServiceInstall="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" DisplayName="[ServiceName_ClearEvents]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5027 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.ClearEvents.exe"/>
<ROW ServiceInstall="ServiceName_DocEditor" Name="[ServiceName_DocEditor]" DisplayName="[ServiceName_DocEditor]" ServiceType="16" StartType="2" ErrorControl="1" Component_="DocEditor.exe"/>
<ROW ServiceInstall="ServiceName_FileServer" Name="[ServiceName_FileServer]" DisplayName="[ServiceName_FileServer]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5007 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_FileServer] [SUBFOLDER_SERVER]" Component_="ASC.Files.exe"/>
<ROW ServiceInstall="ServiceName_FileService" Name="[ServiceName_FileService]" DisplayName="[ServiceName_FileService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5009 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_FileService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER] --core:eventBus:subscriptionClientName=asc_event_bus_files_service_queue" Component_="ASC.Files.Service.exe"/>
<ROW ServiceInstall="ServiceName_Login" Name="[ServiceName_Login]" DisplayName="[ServiceName_Login]" ServiceType="16" StartType="2" ErrorControl="1" Component_="Login.exe"/>
<ROW ServiceInstall="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" DisplayName="[ServiceName_NotifyService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5005 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_NotifyService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER] --core:eventBus:subscriptionClientName=asc_event_bus_notify_queue" Component_="ASC.Notify.exe"/>
<ROW ServiceInstall="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" DisplayName="[ServiceName_PeopleServer]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5004 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_PeopleServer] [SUBFOLDER_SERVER]" Component_="ASC.People.exe"/>
<ROW ServiceInstall="ServiceName_Proxy" Name="[ServiceName_Proxy]" DisplayName="[ServiceName_Proxy]" ServiceType="16" StartType="2" ErrorControl="1" Component_="Proxy.exe"/>
<ROW ServiceInstall="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" DisplayName="[ServiceName_Socket.IO]" ServiceType="16" StartType="2" ErrorControl="1" Component_="Socket.IO.exe"/>
<ROW ServiceInstall="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" DisplayName="[ServiceName_SsoAuth]" ServiceType="16" StartType="2" ErrorControl="1" Component_="SsoAuth.exe"/>
<ROW ServiceInstall="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" DisplayName="[ServiceName_StudioNotifyService]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5006 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_StudioNotifyService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Studio.Notify.exe"/>
<ROW ServiceInstall="ServiceName_WebApi" Name="[ServiceName_WebApi]" DisplayName="[ServiceName_WebApi]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5000 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_WebApi] [SUBFOLDER_SERVER]" Component_="ASC.Web.Api.exe"/>
<ROW ServiceInstall="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" DisplayName="[ServiceName_WebStudio]" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5003 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_WebStudio] [SUBFOLDER_SERVER]" Component_="ASC.Web.Studio.exe"/>
<ROW ServiceInstall="ServiceName_WebHealthChecksUI" Name="[ServiceName_WebHealthChecksUI]" DisplayName="[ProductName] Web.HealthChecks.UI" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5033 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_WebHealthChecksUI]" Component_="ASC.Web.HealthChecks.UI.exe" Description="[ProductName] Web.HealthChecks.UI"/>
<ROW ServiceInstall="ServiceName_ApiSystemService" Name="[ServiceName_ApiSystemService]" DisplayName="[ProductName] ApiSystem" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5010 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_ApiSystemService]" Component_="ASC.ApiSystem.exe" Description="[ProductName] ApiSystem"/>
<ROW ServiceInstall="ServiceName_BackgroundTasks" Name="[ServiceName_BackgroundTasks]" DisplayName="[ProductName] Data.Backup.BackgroundTasks" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5032 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackgroundTasks] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER] --core:eventBus:subscriptionClientName=asc_event_bus_backup_queue" Component_="ASC.Data.Backup.BackgroundTasks.exe" Description="[ProductName] Data.Backup.BackgroundTasks"/>
<ROW ServiceInstall="ServiceName_BackupService" Name="[ServiceName_BackupService]" DisplayName="[ProductName] BackupService" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5012 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_BackupService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Data.Backup.exe" Description="[ProductName] BackupService"/>
<ROW ServiceInstall="ServiceName_ClearEvents" Name="[ServiceName_ClearEvents]" DisplayName="[ProductName] ClearEvents" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5027 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_ClearEvents] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.ClearEvents.exe" Description="[ProductName] ClearEvents"/>
<ROW ServiceInstall="ServiceName_DocEditor" Name="[ServiceName_DocEditor]" DisplayName="[ProductName] DocEditor" ServiceType="16" StartType="2" ErrorControl="1" Component_="DocEditor.exe" Description="[ProductName] DocEditor"/>
<ROW ServiceInstall="ServiceName_FileServer" Name="[ServiceName_FileServer]" DisplayName="[ProductName] FileServer" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5007 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_FileServer] [SUBFOLDER_SERVER]" Component_="ASC.Files.exe" Description="[ProductName] FileServer"/>
<ROW ServiceInstall="ServiceName_FileService" Name="[ServiceName_FileService]" DisplayName="[ProductName] FileService" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5009 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_FileService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER] --core:eventBus:subscriptionClientName=asc_event_bus_files_service_queue" Component_="ASC.Files.Service.exe" Description="[ProductName] FileService"/>
<ROW ServiceInstall="ServiceName_Login" Name="[ServiceName_Login]" DisplayName="[ProductName] Login" ServiceType="16" StartType="2" ErrorControl="1" Component_="Login.exe" Description="[ProductName] Login"/>
<ROW ServiceInstall="ServiceName_NotifyService" Name="[ServiceName_NotifyService]" DisplayName="[ProductName] NotifyService" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5005 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_NotifyService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER] --core:eventBus:subscriptionClientName=asc_event_bus_notify_queue" Component_="ASC.Notify.exe" Description="[ProductName] NotifyService"/>
<ROW ServiceInstall="ServiceName_PeopleServer" Name="[ServiceName_PeopleServer]" DisplayName="[ProductName] PeopleServer" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5004 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_PeopleServer] [SUBFOLDER_SERVER]" Component_="ASC.People.exe" Description="[ProductName] PeopleServer"/>
<ROW ServiceInstall="ServiceName_Proxy" Name="[ServiceName_Proxy]" DisplayName="[ProductName] Proxy" ServiceType="16" StartType="2" ErrorControl="1" Component_="Proxy.exe" Description="[ProductName] Proxy"/>
<ROW ServiceInstall="ServiceName_Socket.IO" Name="[ServiceName_Socket.IO]" DisplayName="[ProductName] Socket.IO" ServiceType="16" StartType="2" ErrorControl="1" Component_="Socket.IO.exe" Description="[ProductName] Socket.IO"/>
<ROW ServiceInstall="ServiceName_SsoAuth" Name="[ServiceName_SsoAuth]" DisplayName="[ProductName] SsoAuth.Svc" ServiceType="16" StartType="2" ErrorControl="1" Component_="SsoAuth.exe" Description="[ProductName] SsoAuth.Svc"/>
<ROW ServiceInstall="ServiceName_StudioNotifyService" Name="[ServiceName_StudioNotifyService]" DisplayName="[ProductName] StudioNotifyService" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5006 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_StudioNotifyService] --core:products:folder=&quot;[APPDIR]products&quot; [SUBFOLDER_SERVER]" Component_="ASC.Studio.Notify.exe" Description="[ProductName] StudioNotifyService"/>
<ROW ServiceInstall="ServiceName_WebApi" Name="[ServiceName_WebApi]" DisplayName="[ProductName] WebApi" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5000 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_WebApi] [SUBFOLDER_SERVER]" Component_="ASC.Web.Api.exe" Description="[ProductName] WebApi"/>
<ROW ServiceInstall="ServiceName_WebStudio" Name="[ServiceName_WebStudio]" DisplayName="[ProductName] WebStudio" ServiceType="16" StartType="2" ErrorControl="1" Arguments="--urls=[APP_URLS]:5003 --ENVIRONMENT=[ENVIRONMENT] --pathToConf=&quot;[APPDIR]config&quot; --$STORAGE_ROOT=&quot;[APPDIR]Data&quot; --log:dir=&quot;[APPDIR]Logs&quot; --log:name=[ServiceName_WebStudio] [SUBFOLDER_SERVER]" Component_="ASC.Web.Studio.exe" Description="[ProductName] WebStudio"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiThemeComponent">
<ATTRIBUTE name="UsedTheme" value="classic"/>
@ -1438,7 +1512,6 @@
<ROW PrereqKey="CA62D813A4E74FA2AAE86A7D7B7B1493" DisplayName="Visual C++ Redistributable for Visual Studio 2013 Update 5 x64" VersionMin="12.0" SetupFileUrl="http://download.microsoft.com/download/C/C/2/CC2DF5F8-4454-44B4-802D-5EA68D086676/vcredist_x64.exe" Location="1" ExactSize="7201056" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/quiet" BasicUiComLine="/quiet" NoUiComLine="/quiet" Options="xym" MD5="b364dd867258dfc79342e00d57c81bb5" TargetName="Visual C++ Redistributable for Visual Studio 2013?vcredist_2013u5_x64.exe"/>
<ROW PrereqKey="D564007E3BBE4F85950A09B470A7CA65" DisplayName="Visual C++ Redistributable for Visual Studio 2013 Update 5 x86" VersionMin="12.0" SetupFileUrl="http://download.microsoft.com/download/C/C/2/CC2DF5F8-4454-44B4-802D-5EA68D086676/vcredist_x86.exe" Location="1" ExactSize="6510272" Operator="0" ComLine="/quiet" BasicUiComLine="/quiet" NoUiComLine="/quiet" Options="ym" MD5="6a3a1760342ea699d5e6df1f2a1c7707" TargetName="Visual C++ Redistributable for Visual Studio 2013?vcredist_2013u5_x86.exe"/>
<ROW PrereqKey="DocumentServer" DisplayName="DocumentServer" SetupFileUrl="onlyoffice-documentserver.exe" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/VERYSILENT /norestart /DIR=&quot;[APPDIR]..\DocumentServer&quot; /DS_PORT=&quot;[DOCUMENT_SERVER_PORT]&quot; /JWT_ENABLED=&quot;[DOCUMENT_SERVER_JWT_ENABLED]&quot; /JWT_SECRET=&quot;[DOCUMENT_SERVER_JWT_SECRET]&quot; /JWT_HEADER=&quot;[DOCUMENT_SERVER_JWT_HEADER]&quot; /DB_HOST=&quot;[PS_DB_HOST]&quot; /DB_USER=&quot;[PS_DB_USER]&quot; /DB_PWD=&quot;[PS_DB_PWD]&quot; /DB_NAME=&quot;[PS_DB_NAME]&quot; /LOG" BasicUiComLine="/VERYSILENT /norestart /DIR=&quot;[APPDIR]..\DocumentServer&quot; /DS_PORT=&quot;[DOCUMENT_SERVER_PORT]&quot; /JWT_ENABLED=&quot;[DOCUMENT_SERVER_JWT_ENABLED]&quot; /JWT_SECRET=&quot;[DOCUMENT_SERVER_JWT_SECRET]&quot; /JWT_HEADER=&quot;[DOCUMENT_SERVER_JWT_HEADER]&quot; /DB_HOST=&quot;[PS_DB_HOST]&quot; /DB_USER=&quot;[PS_DB_USER]&quot; /DB_PWD=&quot;[PS_DB_PWD]&quot; /DB_NAME=&quot;[PS_DB_NAME]&quot; /LOG" NoUiComLine="/VERYSILENT /norestart /DIR=&quot;[APPDIR]..\DocumentServer&quot; /DS_PORT=&quot;[DOCUMENT_SERVER_PORT]&quot; /JWT_ENABLED=&quot;[DOCUMENT_SERVER_JWT_ENABLED]&quot; /JWT_SECRET=&quot;[DOCUMENT_SERVER_JWT_SECRET]&quot; /JWT_HEADER=&quot;[DOCUMENT_SERVER_JWT_HEADER]&quot; /DB_HOST=&quot;[PS_DB_HOST]&quot; /DB_USER=&quot;[PS_DB_USER]&quot; /DB_PWD=&quot;[PS_DB_PWD]&quot; /DB_NAME=&quot;[PS_DB_NAME]&quot; /LOG" Options="fi=" TargetName="onlyoffice-documentserver.exe" Builds="DefaultBuild" Feature="DocumentServer" RepairComLine="/VERYSILENT /norestart /DIR=&quot;[APPDIR]..\DocumentServer&quot; /DS_PORT=&quot;[DOCUMENT_SERVER_PORT]&quot; /JWT_ENABLED=&quot;[DOCUMENT_SERVER_JWT_ENABLED]&quot; /JWT_SECRET=&quot;[DOCUMENT_SERVER_JWT_SECRET]&quot; /JWT_HEADER=&quot;[DOCUMENT_SERVER_JWT_HEADER]&quot; /DB_HOST=&quot;[PS_DB_HOST]&quot; /DB_USER=&quot;[PS_DB_USER]&quot; /DB_PWD=&quot;[PS_DB_PWD]&quot; /DB_NAME=&quot;[PS_DB_NAME]&quot; /LOG"/>
<ROW PrereqKey="DocumentServer.EE" DisplayName="DocumentServer-EE" SetupFileUrl="onlyoffice-documentserver-ee.exe" Location="0" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/VERYSILENT /norestart /DIR=&quot;[APPDIR]..\DocumentServer&quot; /DS_PORT=&quot;[DOCUMENT_SERVER_PORT]&quot; /JWT_ENABLED=&quot;[DOCUMENT_SERVER_JWT_ENABLED]&quot; /JWT_SECRET=&quot;[DOCUMENT_SERVER_JWT_SECRET]&quot; /JWT_HEADER=&quot;[DOCUMENT_SERVER_JWT_HEADER]&quot; /DB_HOST=&quot;[PS_DB_HOST]&quot; /DB_USER=&quot;[PS_DB_USER]&quot; /DB_PWD=&quot;[PS_DB_PWD]&quot; /DB_NAME=&quot;[PS_DB_NAME]&quot; /LOG" BasicUiComLine="/VERYSILENT /norestart /DIR=&quot;[APPDIR]..\DocumentServer&quot; /DS_PORT=&quot;[DOCUMENT_SERVER_PORT]&quot; /JWT_ENABLED=&quot;[DOCUMENT_SERVER_JWT_ENABLED]&quot; /JWT_SECRET=&quot;[DOCUMENT_SERVER_JWT_SECRET]&quot; /JWT_HEADER=&quot;[DOCUMENT_SERVER_JWT_HEADER]&quot; /DB_HOST=&quot;[PS_DB_HOST]&quot; /DB_USER=&quot;[PS_DB_USER]&quot; /DB_PWD=&quot;[PS_DB_PWD]&quot; /DB_NAME=&quot;[PS_DB_NAME]&quot; /LOG" NoUiComLine="/VERYSILENT /norestart /DIR=&quot;[APPDIR]..\DocumentServer&quot; /DS_PORT=&quot;[DOCUMENT_SERVER_PORT]&quot; /JWT_ENABLED=&quot;[DOCUMENT_SERVER_JWT_ENABLED]&quot; /JWT_SECRET=&quot;[DOCUMENT_SERVER_JWT_SECRET]&quot; /JWT_HEADER=&quot;[DOCUMENT_SERVER_JWT_HEADER]&quot; /DB_HOST=&quot;[PS_DB_HOST]&quot; /DB_USER=&quot;[PS_DB_USER]&quot; /DB_PWD=&quot;[PS_DB_PWD]&quot; /DB_NAME=&quot;[PS_DB_NAME]&quot; /LOG" Options="fi=" TargetName="onlyoffice-documentserver-ee.exe" Builds="ExeBuild" Feature="DocumentServer.EE" RepairComLine="/VERYSILENT /norestart /DIR=&quot;[APPDIR]..\DocumentServer&quot; /DS_PORT=&quot;[DOCUMENT_SERVER_PORT]&quot; /JWT_ENABLED=&quot;[DOCUMENT_SERVER_JWT_ENABLED]&quot; /JWT_SECRET=&quot;[DOCUMENT_SERVER_JWT_SECRET]&quot; /JWT_HEADER=&quot;[DOCUMENT_SERVER_JWT_HEADER]&quot; /DB_HOST=&quot;[PS_DB_HOST]&quot; /DB_USER=&quot;[PS_DB_USER]&quot; /DB_PWD=&quot;[PS_DB_PWD]&quot; /DB_NAME=&quot;[PS_DB_NAME]&quot; /LOG"/>
<ROW PrereqKey="EA5B60A5CAD4115A8386D017CC889B9" DisplayName="ASP.NET Core Runtime 7.0.3 x64" VersionMin="7.0" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/d37efccc-2ba1-4fc9-a1ef-a8e1e77fb681/b9a20fc29ff05f18d81620ec88ade699/aspnetcore-runtime-7.0.3-win-x64.exe" Location="1" ExactSize="9562088" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="xym" MD5="a87c53a62579d43c6e20683ad686c991" TargetName="ASP.NET Core 7.0"/>
<ROW PrereqKey="C5949268848C59079D60551E525B7" DisplayName=".NET Runtime 7.0.3 x86" VersionMin="7.0" SetupFileUrl="https://download.visualstudio.microsoft.com/download/pr/9dd2da29-ca47-40fb-81a0-96fe26ea8ea2/e8f7e09a6d4848b8c4a13282d964b9e1/dotnet-runtime-7.0.3-win-x86.exe" Location="1" ExactSize="25849872" WinNTVersions="Windows Vista x86, Windows Server 2008 x86, Windows 7 RTM x86, Windows 8 x86, Windows 10 version 1507 x86, Windows 10 version 1511 x86" WinNT64Versions="Windows Vista x64, Windows Server 2008 x64, Windows 7 RTM x64, Windows Server 2008 R2 x64, Windows 8 x64, Windows Server 2012 x64, Windows 10 version 1507 x64, Windows 10 version 1511 x64" Operator="1" ComLine="/q /norestart" BasicUiComLine="/q /norestart" NoUiComLine="/q /norestart" Options="ym" MD5="5252b28e402d52361910ddffe7dc7c2b" TargetName=".NET 7.0"/>
<ROW PrereqKey="Erlangv20.3x64" DisplayName="Erlang v20.3 x64" VersionMin="20.3" SetupFileUrl="http://download.onlyoffice.com/install/windows/enterprise/otp_win64_20.3.exe" Location="1" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/S" BasicUiComLine="/S" NoUiComLine="/S" Options="yx" TargetName="Erlang v20.3 x64"/>
@ -1452,7 +1525,7 @@
<ROW PrereqKey="RequiredApplication_4" DisplayName="Elasticsearch v7.16.3 x64" VersionMin="7.16.3" SetupFileUrl="https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.16.3.msi" Location="1" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/quiet" BasicUiComLine="/quiet" NoUiComLine="/quiet" Options="y" TargetName="Elasticsearch v7.16.3 x64"/>
<ROW PrereqKey="RequiredApplication_5" DisplayName="RabbitMQ v3.7.4 x64" VersionMin="3.7.4" SetupFileUrl="https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.4/rabbitmq-server-3.7.4.exe" Location="1" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/S" BasicUiComLine="/S" NoUiComLine="/S" Options="yx" TargetName="RabbitMQ v3.7.4 x64"/>
<ROW PrereqKey="RequiredApplication_6" DisplayName="Redis 5.0.10 x64" VersionMin="5.0" SetupFileUrl="http://download.onlyoffice.com/install/windows/redist/Redis-x64-5.0.10.msi" Location="1" ExactSize="0" WinNTVersions="Windows 9x/ME/NT/2000/XP/Vista/Windows 7/Windows 8 x86/Windows 8.1 x86/Windows 10 x86" Operator="1" ComLine="/quiet ADD_INSTALLFOLDER_TO_PATH=1" BasicUiComLine="/quiet ADD_INSTALLFOLDER_TO_PATH=1" NoUiComLine="/quiet ADD_INSTALLFOLDER_TO_PATH=1" Options="yx" TargetName="Redis 5.0.10 x64"/>
<ATTRIBUTE name="PrereqsOrder" value="B96F93FA27E74B02866727AAE83982D0 F3520F64DA5998338D97129FAD2 C5949268848C59079D60551E525B7 EA5B60A5CAD4115A8386D017CC889B9 FC441DA8855740179A0DFCF9560D3DEE D564007E3BBE4F85950A09B470A7CA65 CA62D813A4E74FA2AAE86A7D7B7B1493 A918597FE054CCCB65ABDBA0AD8F63C C4FE6FD5B7C4D07B3A313E754A9A6A8 B365F790B0C4E08A90D54675D858A21 B450414DF7494F99141402B8725A7C RequiredApplication RequiredApplication_2 MySQLInstallerRunn RequiredApplication_1 RequiredApplication_4 Erlangv20.3x64 RequiredApplication_5 RequiredApplication_6 FFmpegx64 PostgreSQL_ODBC PostgresSQL DocumentServer DocumentServer.EE"/>
<ATTRIBUTE name="PrereqsOrder" value="B96F93FA27E74B02866727AAE83982D0 F3520F64DA5998338D97129FAD2 C5949268848C59079D60551E525B7 EA5B60A5CAD4115A8386D017CC889B9 FC441DA8855740179A0DFCF9560D3DEE D564007E3BBE4F85950A09B470A7CA65 CA62D813A4E74FA2AAE86A7D7B7B1493 A918597FE054CCCB65ABDBA0AD8F63C C4FE6FD5B7C4D07B3A313E754A9A6A8 B365F790B0C4E08A90D54675D858A21 B450414DF7494F99141402B8725A7C RequiredApplication RequiredApplication_2 MySQLInstallerRunn RequiredApplication_1 RequiredApplication_4 Erlangv20.3x64 RequiredApplication_5 RequiredApplication_6 FFmpegx64 PostgreSQL_ODBC PostgresSQL DocumentServer"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.PreReqSearchComponent">
<ROW SearchKey="A918597FE054CCCB65ABDBA0AD8F63CSyst" Prereq="A918597FE054CCCB65ABDBA0AD8F63C" SearchType="0" SearchString="[SystemFolder]vcruntime140.dll" VerMin="14.26.28720" Order="2" Property="PreReqSearch_1_A918597FE054CCCB65AB"/>
@ -1475,7 +1548,6 @@
<ROW SearchKey="SystemFolderfile.dll" Prereq="RequiredApplication" SearchType="4" SearchString="{FF073FBB-32E2-4052-B6B2-830C5ED4A809}" VerMin="8.0.32" Order="1" Property="PreReqSearch"/>
<ROW SearchKey="SystemFolderfile.dll_1" Prereq="RequiredApplication_1" SearchType="4" SearchString="{47C07A3A-42EF-4213-A85D-8F5A59077C28}" VerMin="14.17.4" Order="1" Property="PreReqSearch_1"/>
<ROW SearchKey="SystemFolderfile.dll_2" Prereq="RequiredApplication_2" SearchType="4" SearchString="{18B94B70-06F1-4AC0-B308-37280DB868C2}" VerMin="8.0.32" Order="1" Property="PreReqSearch_2"/>
<ROW SearchKey="SystemFolderfile.dll_3" Prereq="DocumentServer.EE" SearchType="0" SearchString="HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ONLYOFFICE DocumentServer_is1" Order="1" Property="PreReqSearch_8" Platform="1"/>
<ROW SearchKey="UpgradeCode" Prereq="PostgreSQL_ODBC" SearchType="4" SearchString="{BBD29DF5-89F6-4B8B-BDC9-C3EA3A4AFDBB}" VerMin="09.05" Order="1" Property="PreReqSearch_14"/>
<ROW SearchKey="UpgradeCode_1" Prereq="RequiredApplication_4" SearchType="4" SearchString="{DAAA2CBA-A1ED-4F29-AFBF-5478617B00F6}" VerMin="7.13.1" Order="2" Property="PreReqSearch_7"/>
<ROW SearchKey="UpgradeCode_3" Prereq="RequiredApplication_6" SearchType="4" SearchString="{05410198-7212-4FC4-B7C8-AFEFC3DA0FBC}" VerMin="5.0.10" Order="2" Property="PreReqSearch_12"/>
@ -1504,7 +1576,7 @@
<ROW Key="YourFile.txt" Component="conf" FileName="onlyoffice.conf" Directory="conf_Dir" Options="17"/>
<ROW Key="YourFile.txt_1" Component="conf" FileName="onlyoffice-client.conf" Directory="conf_Dir" Options="17"/>
<ROW Key="YourFile.txt_2" Component="includes" FileName="onlyoffice-public.conf" Directory="includes_Dir" Options="17"/>
<ROW Key="xml" Component="AI_ExePath" FileName="*.xml" Directory="tools_Dir" Options="17"/>
<ROW Key="xml" Component="tools" FileName="*.xml" Directory="tools_Dir" Options="17"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.XmlAttributeComponent">
<ROW XmlAttribute="minlevel" XmlElement="logger" Name="minlevel" Flags="14" Order="0" Value="Trace"/>

View File

@ -0,0 +1,22 @@
{\rtf1\ansi\ansicpg1251\deff0\nouicompat\deflang1049{\fonttbl{\f0\fnil\fcharset0 Times New Roman;}{\f1\fnil\fcharset2 Symbol;}}
{\colortbl ;\red0\green0\blue255;}
{\*\generator Riched20 10.0.19041}\viewkind4\uc1
\pard\sa200\sl276\slmult1\f0\fs20\lang9 On the next step you will have to review a list of components and applications provided by third parties. Ascensio System SIA is not associated with those third parties and can grant you no rights to use their software. To continue installation of ONLYOFFICE DocSpace Enterprise you will need to install the components listed below by reading and accepting their respective license terms if some of these components have not already been installed on your computer:\par
{\pntext\f1\'B7\tab}Visual C++ Redistributable. It is distributed under the following license: {{\field{\*\fldinst{HYPERLINK http://onlyo.co/1rr0Ruq }}{\fldrslt{http://onlyo.co/1rr0Ruq\ul0\cf0}}}}\f0\fs20\par
{\pntext\f1\'B7\tab}MySQL Community Server. It is distributed under the GNU GPL license v. 2.0: {{\field{\*\fldinst{HYPERLINK http://www.gnu.org/licenses/old-licenses/gpl-2.0.html }}{\fldrslt{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html\ul0\cf0}}}}\f0\fs20\par
{\pntext\f1\'B7\tab}MySQL Connector / ODBC. It is distributed under the GNU GPL license v. 2.0. You may use it free of charge due to FOSS License Exception {{\field{\*\fldinst{HYPERLINK http://www.mysql.com/about/legal/licensing/foss-exception/ }}{\fldrslt{http://www.mysql.com/about/legal/licensing/foss-exception/\ul0\cf0}}}}\f0\fs20 The text of the GNU GPL license v. 2.0 can be found here: {{\field{\*\fldinst{HYPERLINK http://www.gnu.org/licenses/old-licenses/gpl-2.0.html }}{\fldrslt{http://www.gnu.org/licenses/old-licenses/gpl-2.0.html\ul0\cf0}}}}\f0\fs20 .\par
{\pntext\f1\'B7\tab}Node.js. It is distributed under the MIT license that can be found here: {{\field{\*\fldinst{HYPERLINK https://raw.githubusercontent.com/joyent/node/v0.10.32/LICENSE }}{\fldrslt{https://raw.githubusercontent.com/joyent/node/v0.10.32/LICENSE\ul0\cf0}}}}\f0\fs20 .\par
{\pntext\f1\'B7\tab}PostgresSQL. It is distributed under the PostgreSQL License that can be found here: {{\field{\*\fldinst{HYPERLINK http://www.opensource.org/licenses/postgresql }}{\fldrslt{http://www.opensource.org/licenses/postgresql\ul0\cf0}}}}\f0\fs20\par
{\pntext\f1\'B7\tab}PostgreSQL ODBC driver. It is distributed under the LGPL License that can be found here: {{\field{\*\fldinst{HYPERLINK http://www.opensource.org/licenses/lgpl-license.php }}{\fldrslt{http://www.opensource.org/licenses/lgpl-license.php\ul0\cf0}}}}\f0\fs20\par
{\pntext\f1\'B7\tab}RabbitMQ. It is distributed under the Mozilla Public License 1.1 that can be found here: {{\field{\*\fldinst{HYPERLINK https://www.rabbitmq.com/mpl.html }}{\fldrslt{https://www.rabbitmq.com/mpl.html\ul0\cf0}}}}\f0\fs20\par
{\pntext\f1\'B7\tab}Redis. It is distributed under the three clause BSD license that can be found here: {{\field{\*\fldinst{HYPERLINK http://redis.io/topics/license }}{\fldrslt{http://redis.io/topics/license\ul0\cf0}}}}\f0\fs20\par
{\pntext\f1\'B7\tab}ERLANG. It is distributed under the ERLANG PUBLIC LICENSE Version 1.1 license that can be found here: {{\field{\*\fldinst{HYPERLINK https://www.erlang.org/EPLICENSE }}{\fldrslt{https://www.erlang.org/EPLICENSE\ul0\cf0}}}}\f0\fs20\par
{\pntext\f1\'B7\tab}.NET/C# RabbitMQ client library. It is distributed dual-licensed under the Apache License v2 and the Mozilla Public License v1.1. that can be found here: {{\field{\*\fldinst{HYPERLINK http://www.apache.org/licenses/LICENSE-2.0 }}{\fldrslt{http://www.apache.org/licenses/LICENSE-2.0\ul0\cf0}}}}\f0\fs20 {{\field{\*\fldinst{HYPERLINK https://www.rabbitmq.com/mpl.html }}{\fldrslt{https://www.rabbitmq.com/mpl.html\ul0\cf0}}}}\f0\fs20\par
{\pntext\f1\'B7\tab}Elasticsearch. It is distributed under the Apache License v2 license that can be found here: {{\field{\*\fldinst{HYPERLINK http://www.apache.org/licenses/LICENSE-2.0 }}{\fldrslt{http://www.apache.org/licenses/LICENSE-2.0\ul0\cf0}}}}\f0\fs20\par
{\pntext\f1\'B7\tab}Python. It is distributed under the following license: {{\field{\*\fldinst{HYPERLINK https://docs.python.org/3.7/license.html }}{\fldrslt{https://docs.python.org/3.7/license.html\ul0\cf0}}}}\f0\fs20\par
{\pntext\f1\'B7\tab}redis-sharp. It is distributed under the new BSD license license that can be found here: {{\field{\*\fldinst{HYPERLINK http://redis.io/topics/license }}{\fldrslt{http://redis.io/topics/license\ul0\cf0}}}}\f0\fs20\par
\pard\sa200\sl276\slmult1 By clicking the "Next" button you indicate that you agree to install the above software on your computer and confirm that you have read and accepted the terms of the above-mentioned licenses.\par
}

View File

@ -2,7 +2,7 @@ REM echo ######## Set variables ########
set "publisher="Ascensio System SIA""
set "nuget="%cd%\thirdparty\SimpleRestServices\src\.nuget\NuGet.exe""
set "nginx_version=1.21.1"
set "environment=test"
set "environment=production"
REM echo ######## Extracting and preparing files to build ########
%sevenzip% x build\install\win\nginx-%nginx_version%.zip -o"build\install\win\Files" -y
@ -37,6 +37,14 @@ copy build\install\win\tools\Login.xml "build\install\win\Files\tools\Login.xml"
copy "build\install\win\nginx.conf" "build\install\win\Files\nginx\conf\nginx.conf" /y
rmdir build\install\win\publish /s /q
REM echo ######## Delete test and dev configs ########
del /f /q build\install\win\Files\config\*.test.json
del /f /q build\install\win\Files\config\*.dev.json
REM echo ######## Remove AWSTarget from nlog.config ########
%sed% -i "/<target type=\"AWSTarget\" name=\"aws\"/,/<\/target>/d; /<target type=\"AWSTarget\" name=\"aws_sql\"/,/<\/target>/d" build\install\win\Files\config\nlog.config
del /q build\install\win\Files\config\sed*
::edit environment
%sed% -i "s/\(\W\)PRODUCT.ENVIRONMENT.SUB\(\W\)/\1%environment%\2/g" build\install\win\DocSpace.aip
@ -62,8 +70,18 @@ REM echo ######## Build DocSpace package ########
%AdvancedInstaller% /edit build\install\win\DocSpace.aip /SetVersion %BUILD_VERSION%.%BUILD_NUMBER%
IF "%SignBuild%"=="true" (
:%AdvancedInstaller% /edit build\install\win\DocSpace.aip /SetSig
:%AdvancedInstaller% /edit build\install\win\DocSpace.aip /SetDigitalCertificateFile -file %onlyoffice_codesign_path% -password "%onlyoffice_codesign_password%"
%AdvancedInstaller% /edit build\install\win\DocSpace.aip /SetSig
%AdvancedInstaller% /edit build\install\win\DocSpace.aip /SetDigitalCertificateFile -file %onlyoffice_codesign_path% -password "%onlyoffice_codesign_password%"
)
%AdvancedInstaller% /rebuild build\install\win\DocSpace.aip
REM echo ######## Build DocSpace Enterprise package ########
%AdvancedInstaller% /edit build\install\win\DocSpace.Enterprise.aip /SetVersion %BUILD_VERSION%.%BUILD_NUMBER%
IF "%SignBuild%"=="true" (
%AdvancedInstaller% /edit build\install\win\DocSpace.Enterprise.aip /SetSig
%AdvancedInstaller% /edit build\install\win\DocSpace.Enterprise.aip /SetDigitalCertificateFile -file %onlyoffice_codesign_path% -password "%onlyoffice_codesign_password%"
)
%AdvancedInstaller% /rebuild build\install\win\DocSpace.Enterprise.aip

View File

@ -103,6 +103,126 @@ $nuget_packages = @(
}
)
$path_enterprise_prereq = "${pwd}\build\install\win\redist\"
$enterprise_prerequisites = @(
@{
download_allways = $false;
name = ".net_framework_4.8.exe";
link = "https://download.visualstudio.microsoft.com/download/pr/014120d7-d689-4305-befd-3cb711108212/0fd66638cde16859462a6243a4629a50/ndp48-x86-x64-allos-enu.exe"
}
@{
download_allways = $false;
name = "aspnetcore-runtime-7.0.4-win-x64.exe";
link = "https://download.visualstudio.microsoft.com/download/pr/1c260404-69d2-4c07-979c-644846ba1f46/7d27639ac67f1e502b83a738406da0ee/aspnetcore-runtime-7.0.4-win-x64.exe";
}
@{
download_allways = $false;
name = "aspnetcore-runtime-7.0.4-win-x86.exe";
link = "https://download.visualstudio.microsoft.com/download/pr/771de8e0-6c27-435f-8471-32e360408e15/4f84ca38b7988cc602d1ca62c0469ad2/aspnetcore-runtime-7.0.4-win-x86.exe";
}
@{
download_allways = $false;
name = "dotnet-runtime-7.0.4-win-x64.exe";
link = "https://download.visualstudio.microsoft.com/download/pr/7e842a78-9877-4b82-8450-f3311b406a6f/83352282a0bdf1e5f9dfc5fcc88dc83f/dotnet-runtime-7.0.4-win-x64.exe";
}
@{
download_allways = $false;
name = "dotnet-runtime-7.0.4-win-x86.exe";
link = "https://download.visualstudio.microsoft.com/download/pr/a44ad7c4-c079-4299-a5a5-669d53707f76/9a94eeb3cdf9529d40e8020a3b8f6c61/dotnet-runtime-7.0.4-win-x86.exe";
}
@{
download_allways = $false;
name = "vcredist_2013u5_x86.exe";
link = "http://download.microsoft.com/download/C/C/2/CC2DF5F8-4454-44B4-802D-5EA68D086676/vcredist_x86.exe";
}
@{
download_allways = $false;
name = "vcredist_2013u5_x64.exe";
link = "http://download.microsoft.com/download/C/C/2/CC2DF5F8-4454-44B4-802D-5EA68D086676/vcredist_x64.exe";
}
@{
download_allways = $false;
name = "VC_redist.x86.exe";
link = "https://download.visualstudio.microsoft.com/download/pr/d60aa805-26e9-47df-b4e3-cd6fcc392333/A06AAC66734A618AB33C1522920654DDFC44FC13CAFAA0F0AB85B199C3D51DC0/VC_redist.x86.exe";
}
@{
download_allways = $false;
name = "VC_redist.x64.exe";
link = "https://download.visualstudio.microsoft.com/download/pr/d60aa805-26e9-47df-b4e3-cd6fcc392333/7D7105C52FCD6766BEEE1AE162AA81E278686122C1E44890712326634D0B055E/VC_redist.x64.exe";
}
@{
download_allways = $false;
name = "mysql-connector-odbc-8.0.32-win32.msi";
link = "https://cdn.mysql.com/Downloads/Connector-ODBC/8.0/mysql-connector-odbc-8.0.32-win32.msi";
}
@{
download_allways = $false;
name = "mysql-installer-community-8.0.32.0.msi";
link = "https://cdn.mysql.com/Downloads/MySQLInstaller/mysql-installer-community-8.0.32.0.msi";
}
@{
download_allways = $false;
name = "node-v18.16.1-x64.msi";
link = "https://nodejs.org/dist/v18.16.1/node-v18.16.1-x64.msi";
}
@{
download_allways = $false;
name = "elasticsearch-7.16.3.msi";
link = "https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.16.3.msi";
}
@{
download_allways = $false;
name = "otp_win64_20.3.exe";
link = "https://erlang.org/download/otp_win64_20.3.exe";
}
@{
download_allways = $false;
name = "rabbitmq-server-3.7.4.exe";
link = "https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.4/rabbitmq-server-3.7.4.exe";
}
@{
download_allways = $false;
name = "Redis-x64-5.0.10.msi";
link = "http://download.onlyoffice.com/install/windows/redist/Redis-x64-5.0.10.msi";
}
@{
download_allways = $false;
name = "FFmpeg_Essentials.msi";
link = "https://github.com/icedterminal/ffmpeg-installer/releases/download/6.0.0.20230306/FFmpeg_Essentials.msi";
}
@{
download_allways = $false;
name = "psqlodbc_x64.msi";
link = "http://download.onlyoffice.com/install/windows/redist/psqlodbc_x64.msi"
}
@{
download_allways = $false;
name = "postgresql-${psql_version}-1-windows-x64.exe";
link = "https://get.enterprisedb.com/postgresql/postgresql-${psql_version}-1-windows-x64.exe"
}
)
DownloadComponents $prerequisites $path_prereq
DownloadComponents $nuget_packages $path_nuget_packages
DownloadComponents $enterprise_prerequisites $path_enterprise_prereq

View File

@ -180,7 +180,7 @@ Function MySQLConfigure
If service.Started Then
shell.Run """" & installDir & "bin\mysqladmin"" -u root password " & dbpass, 0, true
shell.Run """" & installDir & "bin\mysql"" -u root -p" & dbpass & " -e ""ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY " & "'" & dbpass & "';""", 0, true
shell.Run """" & installDir & "bin\mysql"" -u root -p" & dbpass & " -e ""ALTER USER 'root'@'localhost' IDENTIFIED BY " & "'" & dbpass & "';""", 0, true
End If
Set filesys = CreateObject("Scripting.FileSystemObject")
@ -191,7 +191,6 @@ Function MySQLConfigure
WriteIni filesys.BuildPath(dataDir, "my.ini"), "mysqld", "group_concat_max_len", "2048"
WriteIni filesys.BuildPath(dataDir, "my.ini"), "mysqld", "character_set_server", "utf8"
WriteIni filesys.BuildPath(dataDir, "my.ini"), "mysqld", "collation_server", "utf8_general_ci"
WriteIni filesys.BuildPath(dataDir, "my.ini"), "mysqld", "default-authentication-plugin", "mysql_native_password"
Call WriteToLog("MySQLConfigure: WriteIni Path" & filesys.BuildPath(dataDir, "my.ini"))

View File

@ -1,4 +1,4 @@
PUSHD %~dp0..
set dir=%~dp0..
PUSHD %~dp0\..
set dir="%cd%"
echo %dir%
dotnet test common\Tests\Frontend.Translations.Tests\Frontend.Translations.Tests.csproj --filter "TestCategory=Locales" -l:html --environment "BASE_DIR=%dir%" --results-directory "%dir%/TestsResults"
dotnet test %dir%\common\Tests\Frontend.Translations.Tests\Frontend.Translations.Tests.csproj --filter "TestCategory=Locales" -l:html --environment "BASE_DIR=%dir%" --results-directory "%dir%\TestsResults"

View File

@ -0,0 +1,10 @@
@echo "MIGRATIONS"
@echo off
cd /D "%~dp0"
call start\stop.bat nopause
dotnet build ..\asc.web.slnf
dotnet build ..\ASC.Migrations.sln
PUSHD %~dp0..\common\Tools\ASC.Migration.Runner\bin\Debug\net7.0
dotnet ASC.Migration.Runner.dll standalone=true
pause

View File

@ -6,36 +6,27 @@ if ($PSversionMajor -lt 7 -or $PSversionMinor -lt 2) {
exit
}
$Branch = git branch --show-current
$BranchExistRemote = git ls-remote --heads origin $Branch
if (-not $BranchExistRemote) {
Write-Error "The current branch does not exist in the remote repository. Please push changes."
exit
}
$RootDir = Split-Path (Split-Path -Parent $PSScriptRoot) -Parent
$DockerDir = ($RootDir + "\build\install\docker")
$BuildDate = Get-Date -Format "yyyy-MM-dd"
$LocalIp = (Get-CimInstance -ClassName Win32_NetworkAdapterConfiguration | Where-Object { $_.DHCPEnabled -ne $null -and $_.DefaultIPGateway -ne $null }).IPAddress | Select-Object -First 1
$Doceditor = ($LocalIp + ":5013")
$Login = ($LocalIp + ":5011")
$Client = ($LocalIp + ":5001")
$DockerFile = "Dockerfile.dev"
$EnvExtension = "dev"
$CoreBaseDomain = "localhost"
Set-Location -Path $DockerDir
Write-Host "Start all backend services (containers)" -ForegroundColor Green
$Env:DOCKERFILE = $DockerFile
$Env:ROOT_DIR = $RootDir
$Env:RELEASE_DATE = $BuildDate
$Env:GIT_BRANCH = $Branch
$Env:SERVICE_DOCEDITOR = $Doceditor
$Env:SERVICE_LOGIN = $Login
$Env:SERVICE_CLIENT = $Client
$Env:APP_CORE_BASE_DOMAIN = $CoreBaseDomain
$Env:APP_URL_PORTAL = ("http://" + $LocalIp + ":8092")
$Env:ENV_EXTENSION = $EnvExtension
docker compose -f ($DockerDir + "\docspace.dev.yml") up -d
Write-Host "Start all services (containers)" -ForegroundColor Green
$Env:ENV_EXTENSION="dev"
$Env:Baseimage_Dotnet_Run="onlyoffice/4testing-docspace-dotnet-runtime:v1.0.0"
$Env:Baseimage_Nodejs_Run="onlyoffice/4testing-docspace-nodejs-runtime:v1.0.0"
$Env:Baseimage_Proxy_Run="onlyoffice/4testing-docspace-proxy-runtime:v1.0.0"
$Env:DOCUMENT_SERVER_IMAGE_NAME="onlyoffice/documentserver-de:latest"
$Env:SERVICE_DOCEDITOR=$Doceditor
$Env:SERVICE_LOGIN=$Login
$Env:SERVICE_CLIENT=$Client
$Env:ROOT_DIR=$RootDir
$Env:BUILD_PATH="/var/www"
$Env:SRC_PATH="$RootDir\publish\services"
$Env:DATA_DIR="$RootDir\Data"
docker compose -f docspace.profiles.yml -f docspace.overcome.yml --profile migration-runner --profile backend-local start

View File

@ -8,29 +8,12 @@ dir=$(builtin cd $rd/../../; pwd)
echo "Root directory:" $dir
cd $dir
branch=$(git branch --show-current)
echo "GIT_BRANCH:" $branch
branch_exist_remote=$(git ls-remote --heads origin $branch)
if [ -z "$branch_exist_remote" ]; then
echo "The current branch does not exist in the remote repository. Please push changes."
exit 1
fi
cd $dir/build/install/docker/
docker_dir="$( pwd )"
echo "Docker directory:" $docker_dir
build_date=$(date +%Y-%m-%d)
echo "BUILD DATE: $build_date"
local_ip=$(ipconfig getifaddr en0)
echo "LOCAL IP: $local_ip"
@ -43,19 +26,16 @@ echo "SERVICE_DOCEDITOR: $doceditor"
echo "SERVICE_LOGIN: $login"
echo "SERVICE_CLIENT: $client"
docker_file=Dockerfile.dev
env_extension="dev"
core_base_domain="localhost"
echo "Start all backend services (containers)"
DOCKERFILE=$docker_file \
ROOT_DIR=$dir \
RELEASE_DATE=$build_date \
GIT_BRANCH=$branch \
Baseimage_Dotnet_Run="onlyoffice/4testing-docspace-dotnet-runtime:v1.0.0" \
Baseimage_Nodejs_Run="onlyoffice/4testing-docspace-nodejs-runtime:v1.0.0" \
Baseimage_Proxy_Run="onlyoffice/4testing-docspace-proxy-runtime:v1.0.0" \
BUILD_PATH="/var/www" \
SRC_PATH="$dir/publish/services" \
SERVICE_DOCEDITOR=$doceditor \
SERVICE_LOGIN=$login \
SERVICE_CLIENT=$client \
APP_CORE_BASE_DOMAIN=$core_base_domain \
APP_URL_PORTAL="http://$local_ip:8092" \
ENV_EXTENSION=$env_extension \
docker compose -f docspace.dev.yml up -d
ROOT_DIR=$dir \
DATA_DIR="$dir/Data" \
ENV_EXTENSION="dev" \
DOCUMENT_SERVER_IMAGE_NAME=onlyoffice/documentserver-de:latest \
docker-compose -f docspace.profiles.yml -f docspace.overcome.yml --profile backend-local start

View File

@ -49,7 +49,7 @@ public class DbHelper
var data = await activeDirectoryDbContext.WebstudioSettings
.Where(r => r.Id == id)
.Join(activeDirectoryDbContext.Tenants, r => r.TenantId, r => r.Id, (settings, tenant) => new { settings, tenant })
.Select(r => JsonExtensions.JsonValue(nameof(r.settings.Data).ToLower(), enableLdapAuthentication.ToString()))
.Select(r => DbFunctionsExtension.JsonValue(nameof(r.settings.Data).ToLower(), enableLdapAuthentication.ToString()))
.Distinct()
.Select(r => r != null ? Convert.ToInt32(r) : 0)
.ToListAsync();

View File

@ -23,7 +23,7 @@
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.2" />
<PackageReference Include="Microsoft.Extensions.Hosting.Systemd" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="7.0.0" />
<PackageReference Include="NLog.Web.AspNetCore" Version="5.2.1" />
<PackageReference Include="NLog.Web.AspNetCore" Version="5.3.0" />
<PackageReference Include="StackExchange.Redis.Extensions.AspNetCore" Version="8.0.5" />
<PackageReference Include="StackExchange.Redis.Extensions.Newtonsoft" Version="8.0.5" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="8.0.0" />

View File

@ -199,7 +199,7 @@ public abstract class BaseStartup
config.Filters.Add(new TypeFilterAttribute(typeof(IpSecurityFilter)));
config.Filters.Add(new TypeFilterAttribute(typeof(ProductSecurityFilter)));
config.Filters.Add(new CustomResponseFilterAttribute());
config.Filters.Add(new CustomExceptionFilterAttribute());
config.Filters.Add<CustomExceptionFilterAttribute>();
config.Filters.Add(new TypeFilterAttribute(typeof(WebhooksGlobalFilterAttribute)));
});
@ -316,9 +316,9 @@ public abstract class BaseStartup
app.UseLoggerMiddleware();
app.UseEndpoints(async endpoints =>
app.UseEndpoints(endpoints =>
{
await endpoints.MapCustomAsync(WebhooksEnabled, app.ApplicationServices);
endpoints.MapCustomAsync(WebhooksEnabled, app.ApplicationServices).Wait();
endpoints.MapHealthChecks("/health", new HealthCheckOptions()
{

View File

@ -62,7 +62,7 @@ public class LoggerMiddleware
state.Add("tenantMappedDomain", tenant.MappedDomain);
}
using (logger.BeginScope(state.ToArray()))
using (logger.BeginScope(state))
{
await _next.Invoke(context);
}

View File

@ -28,6 +28,13 @@ namespace ASC.Api.Core.Middleware;
public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
{
private readonly ILogger<CustomExceptionFilterAttribute> _logger;
public CustomExceptionFilterAttribute(ILogger<CustomExceptionFilterAttribute> logger)
{
_logger = logger;
}
public override void OnException(ExceptionContext context)
{
var status = (HttpStatusCode)context.HttpContext.Response.StatusCode;
@ -69,6 +76,9 @@ public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
break;
}
_logger.LogCritical(exception,
$"error during executing {context.HttpContext.Request?.Method}: {context.HttpContext.Request?.Path.Value}");
var result = new ObjectResult(new ErrorApiResponse(status, exception, message, withStackTrace))
{
StatusCode = (int)status

View File

@ -0,0 +1,114 @@
// (c) Copyright Ascensio System SIA 2010-2022
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
namespace ASC.Api.Core.Middleware;
// problem: https://github.com/aspnet/Logging/issues/677
public class UnhandledExceptionMiddleware
{
private readonly RequestDelegate _next;
public UnhandledExceptionMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context,
ILogger<UnhandledExceptionMiddleware> logger)
{
try
{
await _next(context);
}
catch (Exception ex) when (LogError(ex))
{
await OnException(context, ex);
}
bool LogError(Exception ex)
{
logger.LogError(ex,
$"Request {context.Request?.Method}: {context.Request?.Path.Value} failed");
return true;
}
}
public async Task OnException(HttpContext context, Exception exception)
{
var status = (HttpStatusCode)context.Response.StatusCode;
string message = null;
if (status == HttpStatusCode.OK)
{
status = HttpStatusCode.InternalServerError;
}
var withStackTrace = true;
switch (exception)
{
case ItemNotFoundException:
status = HttpStatusCode.NotFound;
message = "The record could not be found";
break;
case ArgumentException:
status = HttpStatusCode.BadRequest;
message = "Invalid arguments";
break;
case SecurityException:
status = HttpStatusCode.Forbidden;
message = "Access denied";
break;
case AuthenticationException:
status = HttpStatusCode.Unauthorized;
withStackTrace = false;
break;
case InvalidOperationException:
status = HttpStatusCode.Forbidden;
break;
case TenantQuotaException:
case BillingNotFoundException:
status = HttpStatusCode.PaymentRequired;
break;
}
var result = new ErrorApiResponse(status, exception, message, withStackTrace);
context.Response.StatusCode = (int)status;
await context.Response.WriteAsJsonAsync(result);
}
}
public static class UnhandledExceptionMiddlewareExtensions
{
public static IApplicationBuilder UseUnhandledExceptionMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<UnhandledExceptionMiddleware>();
}
}

View File

@ -24,7 +24,7 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using System;
using System.Collections.Concurrent;
namespace ASC.Web.Api.Models;
@ -54,36 +54,39 @@ public class EmployeeDtoHelper
{
protected readonly UserPhotoManager _userPhotoManager;
protected readonly UserManager _userManager;
private readonly ILogger<EmployeeDtoHelper> _logger;
private readonly ApiContext _httpContext;
private readonly DisplayUserSettingsHelper _displayUserSettingsHelper;
private readonly CommonLinkUtility _commonLinkUtility;
private readonly Dictionary<Guid, EmployeeDto> _dictionary;
private readonly ConcurrentDictionary<Guid, EmployeeDto> _dictionary;
public EmployeeDtoHelper(
ApiContext httpContext,
DisplayUserSettingsHelper displayUserSettingsHelper,
UserPhotoManager userPhotoManager,
CommonLinkUtility commonLinkUtility,
UserManager userManager)
UserManager userManager,
ILogger<EmployeeDtoHelper> logger)
{
_userPhotoManager = userPhotoManager;
_userManager = userManager;
_logger = logger;
_httpContext = httpContext;
_displayUserSettingsHelper = displayUserSettingsHelper;
_commonLinkUtility = commonLinkUtility;
_dictionary = new Dictionary<Guid, EmployeeDto>();
_dictionary = new ConcurrentDictionary<Guid, EmployeeDto>();
}
public async Task<EmployeeDto> GetAsync(UserInfo userInfo)
{
if (_dictionary.ContainsKey(userInfo.Id))
if (!_dictionary.TryGetValue(userInfo.Id, out var employee))
{
return _dictionary[userInfo.Id];
employee = await InitAsync(new EmployeeDto(), userInfo);
_dictionary.AddOrUpdate(userInfo.Id, i => employee, (i, v) => employee);
}
var employee = await InitAsync(new EmployeeDto(), userInfo);
_dictionary.Add(userInfo.Id, employee);
return employee;
}
@ -93,8 +96,9 @@ public class EmployeeDtoHelper
{
return await GetAsync(await _userManager.GetUsersAsync(userId));
}
catch (Exception)
catch (Exception e)
{
_logger.ErrorWithException(e);
return await GetAsync(ASC.Core.Users.Constants.LostUser);
}
}

View File

@ -114,8 +114,9 @@ public class EmployeeFullDtoHelper : EmployeeDtoHelper
ApiDateTimeHelper apiDateTimeHelper,
WebItemManager webItemManager,
SettingsManager settingsManager,
IQuotaService quotaService)
: base(context, displayUserSettingsHelper, userPhotoManager, commonLinkUtility, userManager)
IQuotaService quotaService,
ILogger<EmployeeDtoHelper> logger)
: base(context, displayUserSettingsHelper, userPhotoManager, commonLinkUtility, userManager, logger)
{
_context = context;
_webItemSecurity = webItemSecurity;

View File

@ -86,11 +86,17 @@ public class InvitationLinkHelper
var commonLinkResult = await _emailValidationKeyProvider.ValidateEmailKeyAsync(ConfirmType.LinkInvite.ToStringFast() + (int)employeeType,
key, _emailValidationKeyProvider.ValidEmailKeyInterval);
if (commonLinkResult == ValidationResult.Invalid)
{
commonLinkResult = await _emailValidationKeyProvider.ValidateEmailKeyAsync(email + ConfirmType.EmpInvite.ToStringFast() + (int)employeeType,
key, _emailValidationKeyProvider.ValidEmailKeyInterval);
}
if (commonLinkResult != ValidationResult.Invalid)
{
validationResult.Result = commonLinkResult;
validationResult.LinkType = InvitationLinkType.Common;
return validationResult;
}
@ -109,7 +115,7 @@ public class InvitationLinkHelper
private async Task<ValidationResult> ValidateIndividualLinkAsync(string email, string key, EmployeeType employeeType)
{
var result = await _emailValidationKeyProvider.ValidateEmailKeyAsync(email + ConfirmType.LinkInvite.ToStringFast() + employeeType.ToStringFast(),
var result = await _emailValidationKeyProvider.ValidateEmailKeyAsync(email + ConfirmType.LinkInvite.ToStringFast() + employeeType.ToStringFast(),
key, IndividualLinkExpirationInterval);
if (result != ValidationResult.Ok)
@ -123,7 +129,7 @@ public class InvitationLinkHelper
{
return ValidationResult.Invalid;
}
var visitMessage = await GetLinkVisitMessageAsync(email, key);
if (visitMessage == null)
@ -148,7 +154,7 @@ public class InvitationLinkHelper
private async Task<AuditEvent> GetLinkVisitMessageAsync(string email, string key)
{
await using var context = _dbContextFactory.CreateDbContext();
var target = _messageTarget.Create(email);
var description = JsonConvert.SerializeObject(new[] { key });

View File

@ -26,6 +26,7 @@
<EmbeddedResource Include="Utils\TimeZoneConverter\timeZoneNames.xml" />
</ItemGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="ARSoft.Tools.NetStandard.DXSdata" Version="1.0.0" />
<PackageReference Include="Autofac.Configuration" Version="6.0.0" />
<PackageReference Include="AutoMapper" Version="12.0.1" />
@ -39,7 +40,6 @@
<PackageReference Include="JWT" Version="9.0.3" />
<PackageReference Include="log4net" Version="2.0.15" />
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="7.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.5" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="7.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="7.0.2" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="7.0.0" />
@ -55,7 +55,7 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> -->
<PackageReference Include="NLog" Version="5.1.1" />
<PackageReference Include="NLog" Version="5.2.0" />
<PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" />
<PackageReference Include="NVelocity" Version="1.2.0" />
<PackageReference Include="protobuf-net" Version="3.1.26" />

View File

@ -24,57 +24,119 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
namespace ASC.Common.Caching;
[Singletone]
public class RedisCacheNotify<T> : ICacheNotify<T> where T : IMessage<T>, new()
{
private readonly IRedisDatabase _redis;
private readonly ConcurrentDictionary<CacheNotifyAction, ConcurrentBag<Action<T>>> _invoctionList;
private readonly Guid _instanceId;
public RedisCacheNotify(IRedisClient redisCacheClient)
{
_redis = redisCacheClient.GetDefaultDatabase();
_instanceId = Guid.NewGuid();
_invoctionList = new ConcurrentDictionary<CacheNotifyAction, ConcurrentBag<Action<T>>>();
}
public void Publish(T obj, CacheNotifyAction action)
{
Task.Run(async () => await _redis.PublishAsync(GetChannelName(action), new RedisCachePubSubItem<T>() { Object = obj, Action = action }))
Task.Run(async () => await _redis.PublishAsync(GetChannelName(), new RedisCachePubSubItem<T>() { Id = _instanceId, Object = obj, Action = action }))
.GetAwaiter()
.GetResult();
foreach (var hanlder in GetInvoctionList(action))
{
hanlder(obj);
}
}
public async Task PublishAsync(T obj, CacheNotifyAction action)
{
await Task.Run(async () => await _redis.PublishAsync(GetChannelName(action), new RedisCachePubSubItem<T>() { Object = obj, Action = action }));
await Task.Run(async () => await _redis.PublishAsync(GetChannelName(), new RedisCachePubSubItem<T>() { Id = _instanceId, Object = obj, Action = action }));
foreach (var hanlder in GetInvoctionList(action))
{
hanlder(obj);
}
}
public void Subscribe(Action<T> onchange, CacheNotifyAction action)
public void Subscribe(Action<T> onChange, CacheNotifyAction action)
{
Task.Run(async () => await _redis.SubscribeAsync<RedisCachePubSubItem<T>>(GetChannelName(action), (i) =>
Task.Run(async () => await _redis.SubscribeAsync<RedisCachePubSubItem<T>>(GetChannelName(), (i) =>
{
onchange(i.Object);
if (i.Id != _instanceId && (i.Action == action || Enum.IsDefined(typeof(CacheNotifyAction), (i.Action & action))))
{
onChange(i.Object);
}
return Task.FromResult(true);
})).GetAwaiter()
.GetResult();
AddToInInvoctionList(onChange, action);
}
public void Unsubscribe(CacheNotifyAction action)
{
Task.Run(async () => await _redis.UnsubscribeAsync<RedisCachePubSubItem<T>>(GetChannelName(action), (i) =>
Task.Run(async () => await _redis.UnsubscribeAsync<RedisCachePubSubItem<T>>(GetChannelName(), (i) =>
{
return Task.FromResult(true);
})).GetAwaiter()
.GetResult();
_invoctionList.TryRemove(action, out _);
}
private string GetChannelName(CacheNotifyAction action)
private string GetChannelName()
{
return $"asc:channel:{action}:{typeof(T).FullName}".ToLower(CultureInfo.InvariantCulture);
return $"asc:channel:{typeof(T).FullName}".ToLower(CultureInfo.InvariantCulture);
}
private List<Action<T>> GetInvoctionList(CacheNotifyAction action)
{
var result = new List<Action<T>>();
foreach (var val in (CacheNotifyAction[])Enum.GetValues(typeof(CacheNotifyAction)))
{
if (!(val == action || Enum.IsDefined(typeof(CacheNotifyAction), (val & action)))) continue;
if (_invoctionList.TryGetValue(val, out var handlers))
{
result.AddRange(handlers);
}
}
return result;
}
private void AddToInInvoctionList(Action<T> onChange, CacheNotifyAction action)
{
if (onChange != null)
{
_invoctionList.AddOrUpdate(action,
new ConcurrentBag<Action<T>> { onChange },
(type, bag) =>
{
bag.Add(onChange);
return bag;
});
}
else
{
_invoctionList.TryRemove(action, out _);
}
}
class RedisCachePubSubItem<T0>
{
public Guid Id { get; set; }
public T0 Object { get; set; }
public CacheNotifyAction Action { get; set; }

View File

@ -43,6 +43,7 @@ global using System.Text;
global using System.Text.Json;
global using System.Text.Json.Serialization;
global using System.Text.RegularExpressions;
global using System.Threading.Channels;
global using System.Web;
global using System.Xml.Linq;
global using System.Xml.XPath;
@ -75,7 +76,6 @@ global using JWT.Serializers;
global using Microsoft.AspNetCore.Cryptography.KeyDerivation;
global using Microsoft.AspNetCore.Http;
global using Microsoft.AspNetCore.Http.Extensions;
global using Microsoft.AspNetCore.Http.Features;
global using Microsoft.AspNetCore.Mvc;
global using Microsoft.AspNetCore.Mvc.Filters;
global using Microsoft.AspNetCore.WebUtilities;
@ -106,4 +106,3 @@ global using RabbitMQ.Client.Events;
global using StackExchange.Redis.Extensions.Core.Abstractions;
global using ILogger = Microsoft.Extensions.Logging.ILogger;
global using System.Threading.Channels;

View File

@ -24,29 +24,29 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
/*
*
* (c) Copyright Ascensio System Limited 2010-2018
*
* This program is freeware. You can redistribute it and/or modify it under the terms of the GNU
* General Public License (GPL) version 3 as published by the Free Software Foundation (https://www.gnu.org/copyleft/gpl.html).
* In accordance with Section 7(a) of the GNU GPL its Section 15 shall be amended to the effect that
* Ascensio System SIA expressly excludes the warranty of non-infringement of any third-party rights.
*
* THIS PROGRAM IS DISTRIBUTED WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR
* FITNESS FOR A PARTICULAR PURPOSE. For more details, see GNU GPL at https://www.gnu.org/copyleft/gpl.html
*
* You can contact Ascensio System SIA by email at sales@onlyoffice.com
*
* The interactive user interfaces in modified source and object code versions of ONLYOFFICE must display
* Appropriate Legal Notices, as required under Section 5 of the GNU GPL version 3.
*
* Pursuant to Section 7 § 3(b) of the GNU GPL you must retain the original ONLYOFFICE logo which contains
* relevant author attributions when distributing the software. If the display of the logo in its graphic
* form is not reasonably feasible for technical reasons, you must include the words "Powered by ONLYOFFICE"
* in every copy of the program you distribute.
* Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks.
*
/*
*
* (c) Copyright Ascensio System Limited 2010-2018
*
* This program is freeware. You can redistribute it and/or modify it under the terms of the GNU
* General Public License (GPL) version 3 as published by the Free Software Foundation (https://www.gnu.org/copyleft/gpl.html).
* In accordance with Section 7(a) of the GNU GPL its Section 15 shall be amended to the effect that
* Ascensio System SIA expressly excludes the warranty of non-infringement of any third-party rights.
*
* THIS PROGRAM IS DISTRIBUTED WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY OR
* FITNESS FOR A PARTICULAR PURPOSE. For more details, see GNU GPL at https://www.gnu.org/copyleft/gpl.html
*
* You can contact Ascensio System SIA by email at sales@onlyoffice.com
*
* The interactive user interfaces in modified source and object code versions of ONLYOFFICE must display
* Appropriate Legal Notices, as required under Section 5 of the GNU GPL version 3.
*
* Pursuant to Section 7 § 3(b) of the GNU GPL you must retain the original ONLYOFFICE logo which contains
* relevant author attributions when distributing the software. If the display of the logo in its graphic
* form is not reasonably feasible for technical reasons, you must include the words "Powered by ONLYOFFICE"
* in every copy of the program you distribute.
* Pursuant to Section 7 § 3(e) we decline to grant you any rights under trademark law for use of our trademarks.
*
*/
namespace ASC.Common.Threading;
@ -62,6 +62,7 @@ public class DistributedTaskQueue
private readonly ICacheNotify<DistributedTaskCancelation> _cancellationCacheNotify;
private readonly IDistributedCache _distributedCache;
private readonly ILogger<DistributedTaskQueue> _logger;
private bool _subscribed;
/// <summary>
/// setup -1 for infinity thread counts
@ -83,23 +84,16 @@ public class DistributedTaskQueue
_cancellationCacheNotify = cancelTaskNotify;
_cancelations = new ConcurrentDictionary<string, CancellationTokenSource>();
_logger = logger;
_cancellationCacheNotify.Subscribe((c) =>
{
if (_cancelations.TryGetValue(c.Id, out var s))
{
s.Cancel();
}
}, CacheNotifyAction.Remove);
_subscribed = false;
}
public string Name
{
get => _name;
set => _name = QUEUE_DEFAULT_PREFIX + value;
get => _name;
set => _name = QUEUE_DEFAULT_PREFIX + value;
}
public int MaxThreadsCount
public int MaxThreadsCount
{
get
{
@ -109,8 +103,8 @@ public class DistributedTaskQueue
set
{
Scheduler = value <= 0
? TaskScheduler.Default
: new ConcurrentExclusiveSchedulerPair(TaskScheduler.Default, value).ConcurrentScheduler;
? TaskScheduler.Default
: new ConcurrentExclusiveSchedulerPair(TaskScheduler.Default, value).ConcurrentScheduler;
if (value > 0)
{
@ -133,10 +127,28 @@ public class DistributedTaskQueue
distributedTask.InstanceId = INSTANCE_ID;
if (distributedTask.LastModifiedOn.Equals(DateTime.MinValue))
{
distributedTask.LastModifiedOn = DateTime.UtcNow;
}
var cancelation = new CancellationTokenSource();
var token = cancelation.Token;
_cancelations[distributedTask.Id] = cancelation;
if (!_subscribed)
{
_cancellationCacheNotify.Subscribe((c) =>
{
if (_cancelations.TryGetValue(c.Id, out var s))
{
s.Cancel();
}
}, CacheNotifyAction.Remove);
_subscribed = true;
}
var task = new Task(() =>
{
var t = action(distributedTask, token);
@ -146,7 +158,7 @@ public class DistributedTaskQueue
}, token, TaskCreationOptions.LongRunning);
task.ConfigureAwait(false);
distributedTask.Status = DistributedTaskStatus.Running;
if (distributedTask.Publication == null)
@ -174,7 +186,7 @@ public class DistributedTaskQueue
foreach (var task in queueTasks)
{
if (task.Publication == null)
if (task.Publication == null)
{
task.Publication = GetPublication();
}
@ -235,7 +247,7 @@ public class DistributedTaskQueue
if (task.Exception != null)
{
distributedTask.Exception = task.Exception;
}
}
if (task.IsFaulted)
{
distributedTask.Status = DistributedTaskStatus.Failted;
@ -307,11 +319,12 @@ public class DistributedTaskQueue
{
var listTasks = queueTasks.ToList();
listTasks.RemoveAll(IsOrphanCacheItem);
if (listTasks.RemoveAll(IsOrphanCacheItem) > 0)
{
SaveToCache(listTasks);
}
SaveToCache(listTasks);
return queueTasks;
return listTasks;
}
private bool IsOrphanCacheItem(DistributedTask obj)

View File

@ -63,7 +63,6 @@
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="7.0.0" />
<PackageReference Include="System.Linq.Async" Version="6.0.1" />
<PackageReference Include="Telegram.Bot" Version="18.0.0" />
<PackageReference Include="Telegram.Bot.Extensions.Polling" Version="1.0.2" />
</ItemGroup>
<ItemGroup>
<Protobuf Include="protos\create_client_proto.proto" />

View File

@ -37,7 +37,7 @@ public class BillingClient
public BillingClient(IConfiguration configuration, IHttpClientFactory httpClientFactory)
{
_configuration = configuration.GetSection("core:payment").Get<PaymentConfiguration>();
_configuration = configuration.GetSection("core:payment").Get<PaymentConfiguration>() ?? new PaymentConfiguration();
_httpClientFactory = httpClientFactory;
_configuration.Url = (_configuration.Url ?? "").Trim().TrimEnd('/');

View File

@ -37,8 +37,10 @@ public interface ITariffService
Uri GetShoppingUri(string[] productIds, string affiliateId = null, string currency = null, string language = null, string customerId = null, string quantity = null);
void ClearCache(int tenantId);
Task DeleteDefaultBillingInfoAsync();
Task SetTariffAsync(int tenantId, Tariff tariff);
Task SetTariffAsync(int tenantId, Tariff tariff, List<TenantQuota> quotas = null);
Task<Uri> GetAccountLinkAsync(int tenant, string backUrl);
Task<bool> PaymentChangeAsync(int tenant, Dictionary<string, int> quantity);
int GetPaymentDelay();
Task<Tariff> GetBillingInfoAsync(int? tenant = null, int? id = null);
bool IsConfigured();
}

View File

@ -97,15 +97,23 @@ public class LicenseConverter : System.Text.Json.Serialization.JsonConverter<obj
public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
if (typeToConvert == typeof(int) && reader.TokenType == JsonTokenType.String)
if (typeToConvert == typeof(int))
{
var i = reader.GetString();
if (!int.TryParse(i, out var result))
if (reader.TokenType == JsonTokenType.String)
{
return 0;
var i = reader.GetString();
if (!int.TryParse(i, out var result))
{
return 0;
}
return result;
}
else if (reader.TokenType == JsonTokenType.Number)
{
return reader.GetInt32();
}
return result;
}
if (typeToConvert == typeof(bool))

View File

@ -197,14 +197,20 @@ public class LicenseReader
var quota = new TenantQuota(-1000)
{
CountUser = _constants.MaxEveryoneCount,
Name = "license",
Trial = license.Trial,
Audit = true,
Ldap = true,
Sso = true,
WhiteLabel = true,
ThirdParty = true,
AutoBackupRestore = true,
Oauth = true,
ContentSearch = true,
MaxFileSize = defaultQuota.MaxFileSize,
MaxTotalSize = defaultQuota.MaxTotalSize,
Name = "license",
DocsEdition = true,
Customization = license.Customization,
Update = true,
Trial = license.Trial
Customization = license.Customization
};
await _tenantManager.SaveTenantQuotaAsync(quota);
@ -215,7 +221,7 @@ public class LicenseReader
DueDate = license.DueDate,
};
await _tariffService.SetTariffAsync(-1, tariff);
await _tariffService.SetTariffAsync(Tenant.DefaultTenant, tariff, new List<TenantQuota> { quota });
}
private void LogError(Exception error)

View File

@ -26,6 +26,34 @@
namespace ASC.Core.Billing;
[Singletone]
public class TenantExtraConfig
{
private readonly CoreBaseSettings _coreBaseSettings;
private readonly LicenseReaderConfig _licenseReaderConfig;
public TenantExtraConfig(CoreBaseSettings coreBaseSettings, LicenseReaderConfig licenseReaderConfig)
{
_coreBaseSettings = coreBaseSettings;
_licenseReaderConfig = licenseReaderConfig;
}
public bool Saas
{
get { return !_coreBaseSettings.Standalone; }
}
public bool Enterprise
{
get { return _coreBaseSettings.Standalone && !string.IsNullOrEmpty(_licenseReaderConfig.LicensePath); }
}
public bool Opensource
{
get { return _coreBaseSettings.Standalone && string.IsNullOrEmpty(_licenseReaderConfig.LicensePath); }
}
}
[Singletone]
public class TariffServiceStorage
{
@ -33,15 +61,17 @@ public class TariffServiceStorage
private static readonly TimeSpan _standaloneCacheExpiration = TimeSpan.FromMinutes(15);
internal readonly ICache Cache;
private readonly CoreBaseSettings _coreBaseSettings;
private readonly IServiceProvider _serviceProvider;
internal readonly ICacheNotify<TariffCacheItem> Notify;
private TimeSpan _cacheExpiration;
public TariffServiceStorage(ICacheNotify<TariffCacheItem> notify, ICache cache, CoreBaseSettings coreBaseSettings)
public TariffServiceStorage(ICacheNotify<TariffCacheItem> notify, ICache cache, CoreBaseSettings coreBaseSettings, IServiceProvider serviceProvider)
{
_cacheExpiration = _defaultCacheExpiration;
Cache = cache;
_coreBaseSettings = coreBaseSettings;
_serviceProvider = serviceProvider;
Notify = notify;
Notify.Subscribe((i) =>
{
@ -54,23 +84,14 @@ public class TariffServiceStorage
Notify.Subscribe((i) =>
{
Cache.Insert(TariffService.GetTariffCacheKey(i.TenantId), i.TariffId.ToString(), DateTime.UtcNow.Add(GetCacheExpiration()));
}, CacheNotifyAction.Insert);
//TODO: Change code of WCF -> not supported in .NET standard/.Net Core
/*try
{
var section = (ClientSection)ConfigurationManager.GetSection("system.serviceModel/client");
if (section != null)
using var scope = _serviceProvider.CreateScope();
var tariffService = scope.ServiceProvider.GetService<ITariffService>();
var tariff = tariffService.GetBillingInfoAsync(i.TenantId, i.TariffId).Result;
if (tariff != null)
{
billingConfigured = section.Endpoints.Cast<ChannelEndpointElement>()
.Any(e => e.Contract == typeof(IService).FullName);
InsertToCache(i.TenantId, tariff);
}
}
catch (Exception err)
{
log.Error(err);
}*/
}, CacheNotifyAction.Insert);
}
private TimeSpan GetCacheExpiration()
@ -82,6 +103,11 @@ public class TariffServiceStorage
return _cacheExpiration;
}
public void InsertToCache(int tenantId, Tariff tariff)
{
Cache.Insert(TariffService.GetTariffCacheKey(tenantId), tariff, DateTime.UtcNow.Add(GetCacheExpiration()));
}
public void ResetCacheExpiration()
{
if (_coreBaseSettings.Standalone)
@ -108,6 +134,7 @@ public class TariffService : ITariffService
private readonly TariffServiceStorage _tariffServiceStorage;
private readonly BillingClient _billingClient;
private readonly IServiceProvider _serviceProvider;
private readonly TenantExtraConfig _tenantExtraConfig;
//private readonly int _activeUsersMin;
//private readonly int _activeUsersMax;
@ -126,8 +153,8 @@ public class TariffService : ITariffService
TariffServiceStorage tariffServiceStorage,
ILogger<TariffService> logger,
BillingClient billingClient,
IServiceProvider serviceProvider)
IServiceProvider serviceProvider,
TenantExtraConfig tenantExtraConfig)
{
_logger = logger;
_quotaService = quotaService;
@ -136,9 +163,10 @@ public class TariffService : ITariffService
_tariffServiceStorage = tariffServiceStorage;
_billingClient = billingClient;
_serviceProvider = serviceProvider;
_tenantExtraConfig = tenantExtraConfig;
_coreBaseSettings = coreBaseSettings;
var paymentConfiguration = configuration.GetSection("core:payment").Get<PaymentConfiguration>();
var paymentConfiguration = configuration.GetSection("core:payment").Get<PaymentConfiguration>() ?? new PaymentConfiguration();
_paymentDelay = paymentConfiguration.Delay;
_trialEnabled = paymentConfiguration.TrialEnabled;
@ -155,17 +183,13 @@ public class TariffService : ITariffService
tenantId = -1;
}
var tariff = refresh ? null : await GetTariffFromCacheAsync(tenantId);
var tariff = refresh ? null : _cache.Get<Tariff>(GetTariffCacheKey(tenantId));
if (tariff == null)
{
tariff = await GetBillingInfoAsync(tenantId) ?? await CreateDefaultAsync();
tariff = await CalculateTariffAsync(tenantId, tariff);
if (string.IsNullOrEmpty(_cache.Get<string>(GetTariffNeedToUpdateCacheKey(tenantId))))
{
UpdateCache(tariff.Id);
}
_tariffServiceStorage.InsertToCache(tenantId, tariff);
if (_billingClient.Configured && withRequestToPaymentSystem)
{
@ -261,6 +285,28 @@ public class TariffService : ITariffService
UpdateCache(tariff.Id);
}
}
else if (_tenantExtraConfig.Enterprise && tariff.Id == 0 && tariff.LicenseDate == DateTime.MaxValue)
{
var defaultQuota = await _quotaService.GetTenantQuotaAsync(Tenant.DefaultTenant);
var quota = new TenantQuota(defaultQuota)
{
Name = "start_trial",
Trial = true,
TenantId = -1000
};
await _quotaService.SaveTenantQuotaAsync(quota);
tariff = new Tariff
{
Quotas = new List<Quota> { new Quota(quota.TenantId, 1) },
DueDate = DateTime.UtcNow.AddDays(DefaultTrialPeriod)
};
await SetTariffAsync(Tenant.DefaultTenant, tariff, new List<TenantQuota> { quota });
UpdateCache(tariff.Id);
}
}
else
{
@ -343,13 +389,12 @@ public class TariffService : ITariffService
}
public async Task SetTariffAsync(int tenantId, Tariff tariff)
public async Task SetTariffAsync(int tenantId, Tariff tariff, List<TenantQuota> quotas = null)
{
ArgumentNullException.ThrowIfNull(tariff);
List<TenantQuota> quotas = null;
if (tariff.Quotas == null ||
(quotas = await tariff.Quotas.ToAsyncEnumerable().SelectAwait(async q => await _quotaService.GetTenantQuotaAsync(q.Id)).ToListAsync()).Any(q => q == null))
(quotas ??= await tariff.Quotas.ToAsyncEnumerable().SelectAwait(async q => await _quotaService.GetTenantQuotaAsync(q.Id)).ToListAsync()).Any(q => q == null))
{
return;
}
@ -359,28 +404,18 @@ public class TariffService : ITariffService
if (quotas.Any(q => q.Trial))
{
// reset trial date
var tenant = await _tenantService.GetTenantAsync(tenantId);
if (tenant != null)
if (tenantId != Tenant.DefaultTenant)
{
tenant.VersionChanged = DateTime.UtcNow;
await _tenantService.SaveTenantAsync(_coreSettings, tenant);
var tenant = await _tenantService.GetTenantAsync(tenantId);
if (tenant != null)
{
tenant.VersionChanged = DateTime.UtcNow;
await _tenantService.SaveTenantAsync(_coreSettings, tenant);
}
}
}
}
internal async Task<Tariff> GetTariffFromCacheAsync(int tenantId)
{
var id = _cache.Get<string>(GetTariffCacheKey(tenantId));
if (!int.TryParse(id, out var tariffId))
{
return null;
}
return await GetBillingInfoAsync(tenantId, tariffId);
}
internal static string GetTariffCacheKey(int tenantId)
{
return $"{tenantId}:tariff";
@ -660,13 +695,13 @@ public class TariffService : ITariffService
try
{
url = _billingClient.GetAccountLink(await _coreSettings.GetKeyAsync(tenant), backUrl);
_cache.Insert(key, url, DateTime.UtcNow.Add(TimeSpan.FromMinutes(10)));
}
catch (Exception error)
{
LogError(error);
}
}
_cache.Insert(key, url, DateTime.UtcNow.Add(TimeSpan.FromMinutes(10)));
}
if (!string.IsNullOrEmpty(url))
{
@ -677,7 +712,7 @@ public class TariffService : ITariffService
}
private async Task<Tariff> GetBillingInfoAsync(int? tenant = null, int? id = null)
public async Task<Tariff> GetBillingInfoAsync(int? tenant = null, int? id = null)
{
await using var coreDbContext = _dbContextFactory.CreateDbContext();
@ -758,12 +793,16 @@ public class TariffService : ITariffService
if (inserted)
{
var t = await _tenantService.GetTenantAsync(tenant);
if (t != null)
if (tenant != Tenant.DefaultTenant)
{
// update tenant.LastModified to flush cache in documents
await _tenantService.SaveTenantAsync(_coreSettings, t);
var t = await _tenantService.GetTenantAsync(tenant);
if (t != null)
{
// update tenant.LastModified to flush cache in documents
await _tenantService.SaveTenantAsync(_coreSettings, t);
}
}
ClearCache(tenant);
await NotifyWebSocketAsync(currentTariff, tariffInfo);
@ -839,6 +878,40 @@ public class TariffService : ITariffService
tariff.DueDate != DateTime.MaxValue && tariff.DueDate.Date < DateTime.UtcNow.Date.AddDays(-delay))
{
tariff.State = TariffState.NotPaid;
if (_coreBaseSettings.Standalone)
{
TenantQuota updatedQuota = null;
var tenantQuotas = await _quotaService.GetTenantQuotasAsync();
foreach (var quota in tariff.Quotas)
{
var tenantQuota = tenantQuotas.SingleOrDefault(q => q.TenantId == quota.Id);
if (tenantQuota != null)
{
tenantQuota *= quota.Quantity;
updatedQuota += tenantQuota;
}
}
var defaultQuota = await _quotaService.GetTenantQuotaAsync(Tenant.DefaultTenant);
defaultQuota.Name = "overdue";
defaultQuota.Features = updatedQuota.Features;
await _quotaService.SaveTenantQuotaAsync(defaultQuota);
var unlimTariff = await CreateDefaultAsync();
unlimTariff.LicenseDate = tariff.DueDate;
unlimTariff.DueDate = tariff.DueDate;
unlimTariff.Quotas = new List<Quota>()
{
new Quota(defaultQuota.TenantId, 1)
};
tariff = unlimTariff;
}
}
return tariff;
@ -878,11 +951,10 @@ public class TariffService : ITariffService
if (_trialEnabled)
{
toAdd = allQuotas.FirstOrDefault(r => r.Trial && !r.Custom);
}
else
{
toAdd = allQuotas.FirstOrDefault(r => r.Free && !r.Custom);
toAdd = allQuotas.FirstOrDefault(r => _coreBaseSettings.Standalone || r.Free && !r.Custom);
}
if (toAdd != null)
@ -969,6 +1041,11 @@ public class TariffService : ITariffService
{
return _paymentDelay;
}
public bool IsConfigured()
{
return _billingClient.Configured;
}
}
static file class Queries

View File

@ -40,6 +40,8 @@ public class SmtpSettings
public bool EnableSSL { get; set; }
public bool EnableAuth { get; set; }
public bool IsDefaultSettings { get; internal set; }
public bool UseNtlm { get; set; }
public static readonly SmtpSettings Empty = new SmtpSettings();
private SmtpSettings() { }
@ -132,10 +134,12 @@ public class SmtpSettings
{
settings.SetCredentials(credentialsUserName, credentialsUserPassword, credentialsDomain);
settings.EnableAuth = true;
settings.UseNtlm = 8 < props.Length && !string.IsNullOrEmpty(props[8]) && Convert.ToBoolean(props[8]);
}
else
{
settings.EnableAuth = false;
settings.UseNtlm = false;
}
return settings;
@ -151,6 +155,7 @@ public class SmtpSettings
Port.ToString(),
HttpUtility.UrlEncode(SenderAddress),
HttpUtility.UrlEncode(SenderDisplayName),
EnableSSL.ToString());
EnableSSL.ToString(),
UseNtlm.ToString());
}
}

View File

@ -334,7 +334,7 @@ public class CoreConfiguration
return _personalMaxSpace.Value;
}
public async Task<SmtpSettings> GetSmtpSettingsAsync()
public async Task<SmtpSettings> GetDefaultSmtpSettingsAsync()
{
var isDefaultSettings = false;
var tenant = await _tenantManager.GetCurrentTenantAsync(false);

View File

@ -455,54 +455,58 @@ public class UserManager
new Uri(_cache.Get<string>("REWRITE_URL" + tenant.Id)).ToString() : tenant.GetTenantDomain(_coreSettings);
var rootAuthorization = _cardDavAddressbook.GetSystemAuthorization();
var allUserEmails = (await GetDavUserEmailsAsync()).ToList();
if (oldUserData != null && oldUserData.Status != newUser.Status && newUser.Status == EmployeeStatus.Terminated)
if (rootAuthorization != null)
{
var userAuthorization = oldUserData.Email.ToLower() + ":" + _instanceCrypto.Encrypt(oldUserData.Email);
var requestUrlBook = _cardDavAddressbook.GetRadicaleUrl(myUri, newUser.Email.ToLower(), true, true);
var collection = await _cardDavAddressbook.GetCollection(requestUrlBook, userAuthorization, myUri.ToString());
if (collection.Completed && collection.StatusCode != 404)
var allUserEmails = (await GetDavUserEmailsAsync()).ToList();
if (oldUserData != null && oldUserData.Status != newUser.Status && newUser.Status == EmployeeStatus.Terminated)
{
await _cardDavAddressbook.Delete(myUri, newUser.Id, newUser.Email, tenant.Id);
}
foreach (var email in allUserEmails)
{
var requestUrlItem = _cardDavAddressbook.GetRadicaleUrl(myUri.ToString(), email.ToLower(), true, true, itemID: newUser.Id.ToString());
try
var userAuthorization = oldUserData.Email.ToLower() + ":" + _instanceCrypto.Encrypt(oldUserData.Email);
var requestUrlBook = _cardDavAddressbook.GetRadicaleUrl(myUri, newUser.Email.ToLower(), true, true);
var collection = await _cardDavAddressbook.GetCollection(requestUrlBook, userAuthorization, myUri.ToString());
if (collection.Completed && collection.StatusCode != 404)
{
var davItemRequest = new DavRequest()
await _cardDavAddressbook.Delete(myUri, newUser.Id, newUser.Email, tenant.Id);
}
foreach (var email in allUserEmails)
{
var requestUrlItem = _cardDavAddressbook.GetRadicaleUrl(myUri.ToString(), email.ToLower(), true, true, itemID: newUser.Id.ToString());
try
{
Url = requestUrlItem,
Authorization = rootAuthorization,
Header = myUri
};
await _radicaleClient.RemoveAsync(davItemRequest).ConfigureAwait(false);
}
catch (Exception ex)
{
_log.ErrorWithException(ex);
var davItemRequest = new DavRequest()
{
Url = requestUrlItem,
Authorization = rootAuthorization,
Header = myUri
};
await _radicaleClient.RemoveAsync(davItemRequest).ConfigureAwait(false);
}
catch (Exception ex)
{
_log.ErrorWithException(ex);
}
}
}
}
else
{
try
else
{
var cardDavUser = new CardDavItem(u.Id, u.FirstName, u.LastName, u.UserName, u.BirthDate, u.Sex, u.Title, u.Email, u.ContactsList, u.MobilePhone);
try
{
await _cardDavAddressbook.UpdateItemForAllAddBooks(allUserEmails, myUri, cardDavUser, await _tenantManager.GetCurrentTenantIdAsync(), oldUserData != null && oldUserData.Email != newUser.Email ? oldUserData.Email : null);
var cardDavUser = new CardDavItem(u.Id, u.FirstName, u.LastName, u.UserName, u.BirthDate, u.Sex, u.Title, u.Email, u.ContactsList, u.MobilePhone);
try
{
await _cardDavAddressbook.UpdateItemForAllAddBooks(allUserEmails, myUri, cardDavUser, await _tenantManager.GetCurrentTenantIdAsync(), oldUserData != null && oldUserData.Email != newUser.Email ? oldUserData.Email : null);
}
catch (Exception ex)
{
_log.ErrorWithException(ex);
}
}
catch (Exception ex)
{
_log.ErrorWithException(ex);
}
}
catch (Exception ex)
{
_log.ErrorWithException(ex);
}
}
}
@ -544,38 +548,41 @@ public class UserManager
new Uri(_cache.Get<string>("REWRITE_URL" + tenant.Id)).ToString() : tenant.GetTenantDomain(_coreSettings);
var davUsersEmails = await GetDavUserEmailsAsync();
var requestUrlBook = _cardDavAddressbook.GetRadicaleUrl(myUri, delUser.Email.ToLower(), true, true);
var addBookCollection = await _cardDavAddressbook.GetCollection(requestUrlBook, userAuthorization, myUri.ToString());
if (addBookCollection.Completed && addBookCollection.StatusCode != 404)
if(rootAuthorization != null)
{
var davbookRequest = new DavRequest()
var addBookCollection = await _cardDavAddressbook.GetCollection(requestUrlBook, userAuthorization, myUri.ToString());
if (addBookCollection.Completed && addBookCollection.StatusCode != 404)
{
Url = requestUrlBook,
Authorization = rootAuthorization,
Header = myUri
};
await _radicaleClient.RemoveAsync(davbookRequest).ConfigureAwait(false);
}
foreach (var email in davUsersEmails)
{
var requestUrlItem = _cardDavAddressbook.GetRadicaleUrl(myUri.ToString(), email.ToLower(), true, true, itemID: delUser.Id.ToString());
try
{
var davItemRequest = new DavRequest()
var davbookRequest = new DavRequest()
{
Url = requestUrlItem,
Url = requestUrlBook,
Authorization = rootAuthorization,
Header = myUri
};
await _radicaleClient.RemoveAsync(davItemRequest).ConfigureAwait(false);
await _radicaleClient.RemoveAsync(davbookRequest).ConfigureAwait(false);
}
catch (Exception ex)
foreach (var email in davUsersEmails)
{
_log.ErrorWithException(ex);
var requestUrlItem = _cardDavAddressbook.GetRadicaleUrl(myUri.ToString(), email.ToLower(), true, true, itemID: delUser.Id.ToString());
try
{
var davItemRequest = new DavRequest()
{
Url = requestUrlItem,
Authorization = rootAuthorization,
Header = myUri
};
await _radicaleClient.RemoveAsync(davItemRequest).ConfigureAwait(false);
}
catch (Exception ex)
{
_log.ErrorWithException(ex);
}
}
}
}
catch (Exception ex)
{

View File

@ -46,6 +46,6 @@ public class WebstudioDbContext : DbContext
.AddWebstudioUserVisit()
.AddDbWebstudioIndex()
.AddDbTenant()
.AddDbFunction();
.AddDbFunctions();
}
}

View File

@ -1,36 +1,41 @@
// (c) Copyright Ascensio System SIA 2010-2022
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
namespace ASC.Core.Common.EF;
public static class JsonExtensions
{
public static string JsonValue(string column, [NotParameterized] string path)
{
//not using
return column + path;
}
}
// (c) Copyright Ascensio System SIA 2010-2022
//
// This program is a free software product.
// You can redistribute it and/or modify it under the terms
// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software
// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended
// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of
// any third-party rights.
//
// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see
// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
//
// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021.
//
// The interactive user interfaces in modified source and object code versions of the Program must
// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3.
//
// Pursuant to Section 7(b) of the License you must retain the original Product logo when
// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under
// trademark law for use of our trademarks.
//
// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
namespace ASC.Core.Common.EF;
public static class DbFunctionsExtension
{
public static string SubstringIndex(string str, char delimiter, int number)
{
throw new NotImplementedException();
}
public static string JsonValue(string column, [NotParameterized] string path)
{
//not using
return column + path;
}
}

View File

@ -82,10 +82,10 @@ public class ModelBuilderWrapper
return ModelBuilder.Entity<T>();
}
public void AddDbFunction()
public void AddDbFunctions()
{
ModelBuilder
.HasDbFunction(typeof(JsonExtensions).GetMethod(nameof(JsonExtensions.JsonValue)))
.HasDbFunction(typeof(DbFunctionsExtension).GetMethod(nameof(DbFunctionsExtension.JsonValue))!)
.HasTranslation(e =>
{
var res = new List<SqlExpression>();
@ -104,5 +104,21 @@ public class ModelBuilderWrapper
return new SqlFunctionExpression("JSON_EXTRACT", res, true, res.Select((SqlExpression a) => false), typeof(string), null);
});
switch (Provider)
{
case Provider.MySql:
ModelBuilder
.HasDbFunction(typeof(DbFunctionsExtension).GetMethod(nameof(DbFunctionsExtension.SubstringIndex), new[] { typeof(string), typeof(char), typeof(int) })!)
.HasName("SUBSTRING_INDEX");
break;
case Provider.PostgreSql:
ModelBuilder
.HasDbFunction(typeof(DbFunctionsExtension).GetMethod(nameof(DbFunctionsExtension.SubstringIndex), new[] { typeof(string), typeof(char), typeof(int) })!)
.HasName("SPLIT_PART");
break;
default:
throw new InvalidOperationException();
}
}
}

View File

@ -52,7 +52,9 @@ public static class DbQuotaExtension
{
modelBuilder
.Add(MySqlAddDbQuota, Provider.MySql)
.Add(PgSqlAddDbQuota, Provider.PostgreSql)
.Add(PgSqlAddDbQuota, Provider.PostgreSql);
modelBuilder
.HasData(
new DbQuota
{

View File

@ -93,7 +93,7 @@ public class GeolocationHelper
if (!ip.Equals(IPAddress.Loopback))
{
_logger.DebugRemoteIpAddress(ip.ToString());
_logger.TraceRemoteIpAddress(ip.ToString());
return await GetIPGeolocationAsync(ip);
}

View File

@ -42,8 +42,6 @@ public class HostedSolution
internal SettingsManager SettingsManager { get; set; }
internal CoreSettings CoreSettings { get; set; }
public string Region { get; private set; }
public HostedSolution(ITenantService tenantService,
IUserService userService,
IQuotaService quotaService,
@ -65,14 +63,9 @@ public class HostedSolution
CoreSettings = coreSettings;
}
public void Init(string region)
{
Region = region;
}
public async Task<List<Tenant>> GetTenantsAsync(DateTime from)
{
return (await TenantService.GetTenantsAsync(from)).Select(AddRegion).ToList();
return (await TenantService.GetTenantsAsync(from)).ToList();
}
public async Task<List<Tenant>> FindTenantsAsync(string login, string passwordHash = null)
@ -82,22 +75,22 @@ public class HostedSolution
throw new SecurityException("Invalid login or password.");
}
return (await TenantService.GetTenantsAsync(login, passwordHash)).Select(AddRegion).ToList();
return (await TenantService.GetTenantsAsync(login, passwordHash)).ToList();
}
public async Task<Tenant> GetTenantAsync(string domain)
{
return AddRegion(await TenantService.GetTenantAsync(domain));
return await TenantService.GetTenantAsync(domain);
}
public async Task<Tenant> GetTenantAsync(int id)
{
return AddRegion(await TenantService.GetTenantAsync(id));
return await TenantService.GetTenantAsync(id);
}
public Tenant GetTenant(int id)
{
return AddRegion(TenantService.GetTenant(id));
return TenantService.GetTenant(id);
}
public async Task CheckTenantAddressAsync(string address)
@ -242,14 +235,4 @@ public class HostedSolution
{
return await UserService.GetUsersAllTenantsAsync(userIds);
}
private Tenant AddRegion(Tenant tenant)
{
if (tenant != null)
{
tenant.HostedRegion = Region;
}
return tenant;
}
}

View File

@ -27,8 +27,8 @@
namespace ASC.Core.Common.Log;
internal static partial class GeolocationHelperLogger
{
[LoggerMessage(Level = LogLevel.Debug, Message = "This is remote ip address {remoteIp}")]
public static partial void DebugRemoteIpAddress(this ILogger<GeolocationHelper> logger, string remoteIp);
[LoggerMessage(Level = LogLevel.Trace, Message = "This is remote ip address {remoteIp}")]
public static partial void TraceRemoteIpAddress(this ILogger<GeolocationHelper> logger, string remoteIp);
[LoggerMessage(Level = LogLevel.Error, Message = "GetIPGeolocation")]
public static partial void ErrorGetIPGeolocation(this ILogger<GeolocationHelper> logger, Exception exception);

View File

@ -48,6 +48,6 @@ public class MessagesContext : DbContext
.AddUser()
.AddWebstudioSettings()
.AddDbTenant()
.AddDbFunction();
.AddDbFunctions();
}
}

View File

@ -161,11 +161,6 @@ public class MultiRegionHostedSolution
}
}
public IEnumerable<string> GetRegions()
{
return GetRegionServices().Select(s => s.Region).ToList();
}
private IEnumerable<HostedSolution> GetRegionServices()
{
return _regions.Where(x => !string.IsNullOrEmpty(x.Key))

View File

@ -97,7 +97,7 @@ public class EmailSenderSinkMessageCreator : SinkMessageCreator
var tenant = await _tenantManager.GetCurrentTenantAsync(false);
m.TenantId = tenant == null ? Tenant.DefaultTenant : tenant.Id;
var settings = await _coreConfiguration.GetSmtpSettingsAsync();
var settings = await _coreConfiguration.GetDefaultSmtpSettingsAsync();
var from = MailAddressUtils.Create(settings.SenderAddress, settings.SenderDisplayName);
var fromTag = message.Arguments.FirstOrDefault(x => x.Tag.Equals("MessageFrom"));
if ((settings.IsDefaultSettings || string.IsNullOrEmpty(settings.SenderDisplayName)) &&

View File

@ -49,7 +49,7 @@ class FirebaseApiKey
{
get
{
return _configuration["firebase:projectId"] ?? "";
return _configuration["firebase-mobile:projectId"] ?? "";
}
}
[JsonProperty("private_key_id")]
@ -57,7 +57,7 @@ class FirebaseApiKey
{
get
{
return _configuration["firebase:privateKeyId"] ?? "";
return _configuration["firebase-mobile:privateKeyId"] ?? "";
}
}
[JsonProperty("private_key")]
@ -65,7 +65,7 @@ class FirebaseApiKey
{
get
{
return _configuration["firebase:privateKey"] ?? "";
return _configuration["firebase-mobile:privateKey"] ?? "";
}
}
[JsonProperty("client_email")]
@ -73,7 +73,7 @@ class FirebaseApiKey
{
get
{
return _configuration["firebase:clientEmail"] ?? "";
return _configuration["firebase-mobile:clientEmail"] ?? "";
}
}
[JsonProperty("client_id")]
@ -81,7 +81,7 @@ class FirebaseApiKey
{
get
{
return _configuration["firebase:clientId"] ?? "";
return _configuration["firebase-mobile:clientId"] ?? "";
}
}
[JsonProperty("auth_uri")]
@ -113,7 +113,7 @@ class FirebaseApiKey
{
get
{
return _configuration["firebase:x509CertUrl"] ?? "";
return _configuration["firebase-mobile:x509CertUrl"] ?? "";
}
}
}

View File

@ -24,8 +24,6 @@
// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0
// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
using Message = Amazon.SimpleEmail.Model.Message;
namespace ASC.Core.Notify.Senders;
[Singletone]
@ -69,7 +67,7 @@ public class AWSSender : SmtpSender, IDisposable
await tenantManager.SetCurrentTenantAsync(m.TenantId);
var configuration = scope.ServiceProvider.GetService<CoreConfiguration>();
if (!(await configuration.GetSmtpSettingsAsync()).IsDefaultSettings)
if (!(await configuration.GetDefaultSmtpSettingsAsync()).IsDefaultSettings)
{
result = await base.SendAsync(m);
}

View File

@ -38,6 +38,7 @@ public class SmtpSender : INotifySender
private int _port;
private bool _ssl;
private ICredentials _credentials;
private SaslMechanism _saslMechanism;
protected bool _useCoreSettings;
const int NetworkTimeout = 30000;
@ -84,6 +85,10 @@ public class SmtpSender : INotifySender
{
smtpClient.Authenticate(_credentials);
}
else if (_saslMechanism != null)
{
smtpClient.Authenticate(_saslMechanism);
}
smtpClient.Send(mail);
result = NoticeSendResult.OK;
@ -154,7 +159,7 @@ public class SmtpSender : INotifySender
private async Task BuildSmtpSettingsAsync(CoreConfiguration configuration)
{
if ((await configuration.GetSmtpSettingsAsync()).IsDefaultSettings && _initProperties.ContainsKey("host") && !string.IsNullOrEmpty(_initProperties["host"]))
if ((await configuration.GetDefaultSmtpSettingsAsync()).IsDefaultSettings && _initProperties.ContainsKey("host") && !string.IsNullOrEmpty(_initProperties["host"]))
{
_host = _initProperties["host"];
@ -178,21 +183,24 @@ public class SmtpSender : INotifySender
if (_initProperties.ContainsKey("userName"))
{
_credentials = new NetworkCredential(
_initProperties["userName"],
_initProperties["password"]);
var useNtlm = _initProperties.ContainsKey("useNtlm") && bool.Parse(_initProperties["useNtlm"]);
_credentials = !useNtlm ? new NetworkCredential(_initProperties["userName"], _initProperties["password"]) : null;
_saslMechanism = useNtlm ? new SaslMechanismNtlm(_initProperties["userName"], _initProperties["password"]) : null;
}
}
else
{
var s = await configuration.GetSmtpSettingsAsync();
var s = await configuration.GetDefaultSmtpSettingsAsync();
_host = s.Host;
_port = s.Port;
_ssl = s.EnableSSL;
_credentials = !string.IsNullOrEmpty(s.CredentialsUserName)
? new NetworkCredential(s.CredentialsUserName, s.CredentialsUserPassword)
: null;
if (!string.IsNullOrEmpty(s.CredentialsUserName))
{
_credentials = !s.UseNtlm ? new NetworkCredential(s.CredentialsUserName, s.CredentialsUserPassword) : null;
_saslMechanism = s.UseNtlm ? new SaslMechanismNtlm(s.CredentialsUserName, s.CredentialsUserPassword) : null;
}
}
}
protected MimeMessage BuildMailMessage(NotifyMessage m)

View File

@ -32,6 +32,7 @@ public class TenantQuotaFeature
public virtual bool Visible { get; init; } = true;
public virtual string Name { get; init; }
public virtual bool Paid { get; init; }
public bool Standalone { get; init; }
protected internal virtual void Multiply(int quantity)
{
@ -63,7 +64,7 @@ public class TenantQuotaFeature<T> : TenantQuotaFeature
}
set
{
_tenantQuota.ReplaceFeature(Name, value);
_tenantQuota.ReplaceFeature(Name, value, Default);
}
}
@ -96,9 +97,16 @@ public class TenantQuotaFeatureCount : TenantQuotaFeature<int>
protected internal override void Multiply(int quantity)
{
if (Value != int.MaxValue)
try
{
Value *= quantity;
if (Value != int.MaxValue)
{
Value = checked(Value * quantity);
}
}
catch (OverflowException)
{
Value = int.MaxValue;
}
}
}
@ -118,9 +126,16 @@ public class TenantQuotaFeatureSize : TenantQuotaFeature<long>
protected internal override void Multiply(int quantity)
{
if (Value != long.MaxValue)
try
{
Value *= quantity;
if (Value != long.MaxValue)
{
Value = checked(Value * quantity);
}
}
catch (OverflowException)
{
Value = long.MaxValue;
}
}

View File

@ -68,7 +68,11 @@ public abstract class RadicaleEntity
}
public string GetSystemAuthorization()
{
{
if(_configuration["radicale:admin"] == null || _configuration["radicale:admin"] == "")
{
return null;
}
return _configuration["radicale:admin"] + ":" + _instanceCrypto.Encrypt(_configuration["radicale:admin"]);
}

View File

@ -31,6 +31,7 @@ public class TenantCookieSettings : ISettings<TenantCookieSettings>
{
public int Index { get; set; }
public int LifeTime { get; set; }
public bool Enabled { get; set; }
public TenantCookieSettings GetDefault()
{
@ -41,12 +42,15 @@ public class TenantCookieSettings : ISettings<TenantCookieSettings>
{
var defaultSettings = GetInstance();
return LifeTime == defaultSettings.LifeTime;
return LifeTime == defaultSettings.LifeTime && Enabled == defaultSettings.Enabled;
}
public static TenantCookieSettings GetInstance()
{
return new TenantCookieSettings();
return new TenantCookieSettings()
{
LifeTime = 1440
};
}
[JsonIgnore]
@ -113,7 +117,9 @@ public class TenantCookieSettingsHelper
public async Task<DateTime> GetExpiresTimeAsync(int tenantId)
{
var settingsTenant = await GetForTenantAsync(tenantId);
var expires = settingsTenant.IsDefault() ? DateTime.UtcNow.AddYears(1) : DateTime.UtcNow.AddMinutes(settingsTenant.LifeTime);
var expires = settingsTenant.IsDefault() || !settingsTenant.Enabled ?
DateTime.UtcNow.AddYears(1) :
DateTime.UtcNow.AddMinutes(settingsTenant.LifeTime);
return expires;
}

View File

@ -230,7 +230,7 @@ public class TenantQuota : IMapFrom<DbQuota>
_nonProfitFeature = new TenantQuotaFeatureFlag(this) { Name = "non-profit", Visible = false };
_trialFeature = new TenantQuotaFeatureFlag(this) { Name = "trial", Visible = false };
_freeFeature = new FreeFeature(this) { Visible = false };
_updateFeature = new TenantQuotaFeatureFlag(this) { Name = "update", Visible = false };
_updateFeature = new TenantQuotaFeatureFlag(this) { Name = "update", Standalone = true };
_auditFeature = new TenantQuotaFeatureFlag(this) { Name = "audit", Order = 7 };
_docsEditionFeature = new TenantQuotaFeatureFlag(this) { Name = "docs", Visible = false };
_ldapFeature = new TenantQuotaFeatureFlag(this) { Name = "ldap", Visible = false };
@ -239,9 +239,9 @@ public class TenantQuota : IMapFrom<DbQuota>
_customizationFeature = new TenantQuotaFeatureFlag(this) { Name = "customization", Visible = false };
_customFeature = new TenantQuotaFeatureFlag(this) { Name = "custom", Visible = false };
_autoBackupRestoreFeature = new TenantQuotaFeatureFlag(this) { Name = "restore", Order = 6 };
_oauthFeature = new TenantQuotaFeatureFlag(this) { Name = "oauth", Visible = false };
_oauthFeature = new TenantQuotaFeatureFlag(this) { Name = "oauth" };
_contentSearchFeature = new TenantQuotaFeatureFlag(this) { Name = "contentsearch", Visible = false };
_thirdPartyFeature = new TenantQuotaFeatureFlag(this) { Name = "thirdparty", Visible = false };
_thirdPartyFeature = new TenantQuotaFeatureFlag(this) { Name = "thirdparty", Order = 9 };
TenantQuotaFeatures = new List<TenantQuotaFeature>
{
@ -333,7 +333,10 @@ public class TenantQuota : IMapFrom<DbQuota>
{
if (f is MaxFileSizeFeature fileSize)
{
fileSize.Value = Math.Max(fileSize.Value, quota.MaxFileSize);
if (quota.MaxFileSize != long.MaxValue)
{
fileSize.Value = Math.Max(fileSize.Value, quota.MaxFileSize);
}
}
else if (f is TenantQuotaFeatureCount count)
{
@ -346,7 +349,17 @@ public class TenantQuota : IMapFrom<DbQuota>
}
else if (currentValue != count.Default && newValue != count.Default)
{
count.Value += newValue;
try
{
if (newValue != int.MaxValue)
{
count.Value = checked(count.Value + newValue);
}
}
catch (OverflowException)
{
count.Value = int.MaxValue;
}
}
}
else if (f is TenantQuotaFeatureSize length)
@ -360,7 +373,17 @@ public class TenantQuota : IMapFrom<DbQuota>
}
else
{
length.Value += newValue;
try
{
if (newValue != long.MaxValue)
{
length.Value = checked(length.Value + newValue);
}
}
catch (OverflowException)
{
length.Value = long.MaxValue;
}
}
}
else if (f is TenantQuotaFeatureFlag flag)
@ -393,14 +416,21 @@ public class TenantQuota : IMapFrom<DbQuota>
return _featuresList.FirstOrDefault(f => string.Equals(f.Split(':')[0], $"{name}", StringComparison.OrdinalIgnoreCase));
}
internal void ReplaceFeature<T>(string name, T value)
internal void ReplaceFeature<T>(string name, T value, T defaultValue)
{
var featureValue = GetFeature(name);
_featuresList.Remove(featureValue);
if (!EqualityComparer<T>.Default.Equals(value, default))
if (!EqualityComparer<T>.Default.Equals(value, default) && !EqualityComparer<T>.Default.Equals(value, defaultValue))
{
_featuresList.Add($"{name}:{value}");
if (value is bool)
{
_featuresList.Add($"{name}");
}
else
{
_featuresList.Add($"{name}:{value}");
}
}
}
}

View File

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="BackupNotFound" xml:space="preserve">
<value>Архивният файл е невалиден. Моля, използвайте файл, създаден в ONLYOFFICE v11.5 или по-нова версия.</value>
</data>
<data name="ButtonSetPassword" xml:space="preserve">
<value>Задайте парола</value>
</data>
</root>

View File

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="BackupNotFound" xml:space="preserve">
<value>Záložní soubor je neplatný. Použijte prosím soubor vytvořený v aplikaci ONLYOFFICE v11.5 nebo novější.</value>
</data>
<data name="ButtonSetPassword" xml:space="preserve">
<value>Nastavit heslo</value>
</data>
</root>

View File

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ButtonSetPassword" xml:space="preserve">
<value>Establecer contraseña</value>
</data>
<data name="BackupNotFound" xml:space="preserve">
<value>El archivo de copia de seguridad no es válido. Por favor, utilice un archivo creado en ONLYOFFICE v11.5 o superior.</value>
</data>
</root>

View File

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="ButtonSetPassword" xml:space="preserve">
<value>Aseta salasana</value>
</data>
<data name="BackupNotFound" xml:space="preserve">
<value>Varmuuskopiotiedosto on virheellinen. Ole hyvä ja käytä tiedostoa, joka on luotu ONLYOFFICE v11.5:llä tai uudemmalla versiolla.</value>
</data>
</root>

View File

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="BackupNotFound" xml:space="preserve">
<value>Պահուստային ֆայլն անվավեր է. Խնդրում ենք օգտագործել ONLYOFFICE v11.5 կամ ավելի ուշ.</value>
</data>
<data name="ButtonSetPassword" xml:space="preserve">
<value>Սահմանել գաղտնաբառ</value>
</data>
</root>

Some files were not shown because too many files have changed in this diff Show More