diff --git a/build.backend.docker.bat b/build.backend.docker.bat
deleted file mode 100644
index e538a525ed..0000000000
--- a/build.backend.docker.bat
+++ /dev/null
@@ -1,7 +0,0 @@
-@echo off
-
-pwsh %~dp0/build.backend.docker.ps1 %*
-
-echo.
-
-pause
\ No newline at end of file
diff --git a/build.backend.docker.ps1 b/build.backend.docker.ps1
deleted file mode 100644
index 70561f6d62..0000000000
--- a/build.backend.docker.ps1
+++ /dev/null
@@ -1,115 +0,0 @@
-$PSversionMajor = $PSVersionTable.PSVersion | sort-object major | ForEach-Object { $_.major }
-$PSversionMinor = $PSVersionTable.PSVersion | sort-object minor | ForEach-Object { $_.minor }
-
-if ($PSversionMajor -lt 7 -or $PSversionMinor -lt 2) {
- Write-Error "Powershell version must be greater than or equal to 7.2."
- exit
-}
-
-$RootDir = Split-Path -Parent $PSScriptRoot
-$DockerDir = "$RootDir\buildtools\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")
-$Management = ($LocalIp + ":5015")
-$PortalUrl = ("http://" + $LocalIp)
-$ProxyVersion="v1.0.0"
-
-# Stop all backend services"
-& "$PSScriptRoot\start\stop.backend.docker.ps1"
-
-$Env:COMPOSE_IGNORE_ORPHANS = "True"
-
-$Force = $False
-
-if ($args[0] -eq "--force") {
- $Force = $True
-}
-
-Write-Host "FORCE BUILD BASE IMAGES: $Force" -ForegroundColor Blue
-
-$ExistsNetwork= docker network ls --format '{{.Name}}' | findstr "onlyoffice"
-
-if (-not $ExistsNetwork) {
- docker network create --driver bridge onlyoffice
-}
-
-Write-Host "Run MySQL" -ForegroundColor Green
-docker compose -f "$DockerDir\db.yml" up -d
-
-if ($args[0] -eq "--dns" ) {
- Write-Host "Run local dns server" -ForegroundColor Green
- $Env:ROOT_DIR=$RootDir
- docker compose -f "$DockerDir\dnsmasq.yml" up -d
-}
-
-Write-Host "Build backend services (to `publish/` folder)" -ForegroundColor Green
-& "$PSScriptRoot\install\common\build-services.ps1"
-
-$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"
-}
-
-Set-Location -Path $RootDir
-
-$DotnetVersion = "dev"
-$NodeVersion = "dev"
-$ProxyVersion = "dev"
-
-$ExistsDotnet= docker images --format "{{.Repository}}:{{.Tag}}" | findstr "onlyoffice/4testing-docspace-dotnet-runtime:$DotnetVersion"
-$ExistsNode= docker images --format "{{.Repository}}:{{.Tag}}" | findstr "onlyoffice/4testing-docspace-nodejs-runtime:$NodeVersion"
-$ExistsProxy= docker images --format "{{.Repository}}:{{.Tag}}" | findstr "onlyoffice/4testing-docspace-proxy-runtime:$ProxyVersion"
-
-if (!$ExistsDotnet -or $Force) {
- Write-Host "Build dotnet base image from source (apply new dotnet config)" -ForegroundColor Green
- docker build -t "onlyoffice/4testing-docspace-dotnet-runtime:$DotnetVersion" -f "$DockerDir\Dockerfile.runtime" --target dotnetrun .
-} else {
- Write-Host "SKIP build dotnet base image (already exists)" -ForegroundColor Blue
-}
-
-if (!$ExistsNode -or $Force) {
- Write-Host "Build node base image from source" -ForegroundColor Green
- docker build -t "onlyoffice/4testing-docspace-nodejs-runtime:$NodeVersion" -f "$DockerDir\Dockerfile.runtime" --target noderun .
-} else {
- Write-Host "SKIP build node base image (already exists)" -ForegroundColor Blue
-}
-
-if (!$ExistsProxy -or $Force) {
- Write-Host "Build proxy base image from source (apply new nginx config)" -ForegroundColor Green
- docker build -t "onlyoffice/4testing-docspace-proxy-runtime:$ProxyVersion" -f "$DockerDir\Dockerfile.runtime" --target router .
-} else {
- Write-Host "SKIP build proxy base image (already exists)" -ForegroundColor Blue
-}
-
-Write-Host "Run migration and services" -ForegroundColor Green
-$Env:ENV_EXTENSION="dev"
-$Env:Baseimage_Dotnet_Run="onlyoffice/4testing-docspace-dotnet-runtime:$DotnetVersion"
-$Env:Baseimage_Nodejs_Run="onlyoffice/4testing-docspace-nodejs-runtime:$NodeVersion"
-$Env:Baseimage_Proxy_Run="onlyoffice/4testing-docspace-proxy-runtime:$ProxyVersion"
-$Env:SERVICE_DOCEDITOR=$Doceditor
-$Env:SERVICE_LOGIN=$Login
-$Env:SERVICE_CLIENT=$Client
-$Env:SERVICE_MANAGEMENT=$Management
-$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 "$DockerDir\docspace.profiles.yml" -f "$DockerDir\docspace.overcome.yml" --profile migration-runner --profile backend-local up -d
-
-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 "SERVICE_MANAGEMENT: $Env:SERVICE_MANAGEMENT" -ForegroundColor Blue
-Write-Host "INSTALLATION_TYPE: $Env:INSTALLATION_TYPE" -ForegroundColor Blue
-
-Set-Location -Path $PSScriptRoot
\ No newline at end of file
diff --git a/build.backend.docker.py b/build.backend.docker.py
new file mode 100755
index 0000000000..6ff3ec66c6
--- /dev/null
+++ b/build.backend.docker.py
@@ -0,0 +1,204 @@
+#!/usr/bin/python3
+
+import os
+import socket
+import subprocess
+import sys, getopt
+import shutil
+import platform
+
+def help():
+ # Display Help
+ print("Build and run backend and working environment. (Use 'yarn start' to run client -> https://github.com/ONLYOFFICE/DocSpace-client)")
+ print()
+ print("Syntax: available params [-h|f|s|c|d|]")
+ print("options:")
+ print("h Print this Help.")
+ print("f Force rebuild base images.")
+ print("s Run as SAAS otherwise as STANDALONE.")
+ print("c Run as COMMUNITY otherwise ENTERPRISE.")
+ print("d Run dnsmasq.")
+ print()
+
+rd = os.path.dirname(os.path.abspath(__file__))
+dir = os.path.abspath(os.path.join(rd, ".."))
+dockerDir = os.path.join(dir, "buildtools", "install", "docker")
+local_ip = socket.gethostbyname_ex(socket.gethostname())[-1][-1]
+
+doceditor = f"{local_ip}:5013"
+login = f"{local_ip}:5011"
+client = f"{local_ip}:5001"
+management = f"{local_ip}:5001"
+portal_url = f"http://{local_ip}"
+
+force = False
+dns = False
+standalone = True
+community = False
+
+migration_type = "STANDALONE" # SAAS
+installation_type = "ENTERPRISE"
+document_server_image_name = "onlyoffice/documentserver-de:latest"
+
+# Get the options
+opts, args = getopt.getopt(sys.argv[1:], "hfscd")
+for opt, arg in opts:
+ if opt == "-h":
+ help()
+ sys.exit()
+ elif opt == "-f":
+ force = arg if arg else True
+ elif opt == "-s":
+ standalone = arg if arg else False
+ elif opt == "-c":
+ community = arg if arg else True
+ elif opt == "-d":
+ dns = arg if arg else True
+ else:
+ print("Error: Invalid '-" + opt + "' option")
+ sys.exit()
+
+print("Run script directory:", dir)
+print("Root directory:", dir)
+print("Docker files root directory:", dockerDir)
+
+print()
+print(f"SERVICE_DOCEDITOR: {doceditor}")
+print(f"SERVICE_LOGIN: {login}")
+print(f"SERVICE_CLIENT: {client}")
+print(f"DOCSPACE_APP_URL: {portal_url}")
+
+print()
+print("FORCE REBUILD BASE IMAGES:", force)
+print("Run dnsmasq:", dns)
+
+if standalone == False:
+ migration_type = "SAAS"
+
+if community == True:
+ installation_type = "COMMUNITY"
+ document_server_image_name = "onlyoffice/documentserver:latest"
+
+print()
+print("MIGRATION TYPE:", migration_type)
+print("INSTALLATION TYPE:", installation_type)
+print("DS image:", document_server_image_name)
+print()
+
+# Stop all backend services
+subprocess.run(["python", os.path.join(dir, "buildtools", "start", "stop.backend.docker.py")])
+
+print("Run MySQL")
+
+arch_name = platform.uname().machine
+
+print(f"PLATFORM {arch_name}")
+
+existsnetwork = subprocess.check_output(["docker", "network", "ls"]).decode("utf-8").splitlines()
+existsnetwork = [line.split()[1] for line in existsnetwork]
+
+if "onlyoffice" not in existsnetwork:
+ subprocess.run(["docker", "network", "create", "--driver", "bridge", "onlyoffice"])
+
+if arch_name == "x86_64" or arch_name == "AMD64":
+ print("CPU Type: x86_64 -> run db.yml")
+ subprocess.run(["docker", "compose", "-f", os.path.join(dockerDir, "db.yml"), "up", "-d"])
+elif arch_name == "arm64":
+ print("CPU Type: arm64 -> run db.yml with arm64v8 image")
+ os.environ["MYSQL_IMAGE"] = "arm64v8/mysql:8.0.32-oracle"
+ subprocess.run(["docker", "compose", "-f", os.path.join(dockerDir, "db.yml"), "up", "-d"])
+else:
+ print("Error: Unknown CPU Type:", arch_name)
+ sys.exit(1)
+
+if dns == True:
+ print("Run local dns server")
+ os.environ["ROOT_DIR"] = dir
+ subprocess.run(["docker", "compose", "-f", os.path.join(dockerDir, "dnsmasq.yml"), "up", "-d"])
+
+print("Clear publish folder")
+shutil.rmtree(os.path.join(dir, "publish/services"), True)
+
+print("Build backend services (to 'publish/' folder)")
+subprocess.run(["python", os.path.join(dir, "buildtools", "install", "common", "build-services.py")])
+
+def check_image(image_name):
+ return subprocess.check_output(["docker", "images", "--format", "'{{.Repository}}:{{.Tag}}'"], shell=True, text=True).__contains__(image_name)
+
+dotnet_image_name = "onlyoffice/4testing-docspace-dotnet-runtime"
+dotnet_version = "dev"
+dotnet_image = f"{dotnet_image_name}:{dotnet_version}"
+
+exists = check_image(dotnet_image)
+
+if not exists or force == True:
+ print("Build dotnet base image from source (apply new dotnet config)")
+ subprocess.run(["docker", "build", "-t", dotnet_image, "-f", os.path.join(dockerDir, "Dockerfile.runtime"), "--target", "dotnetrun", "."])
+else:
+ print(f"SKIP build {dotnet_image} (already exists)")
+
+node_image_name = "onlyoffice/4testing-docspace-nodejs-runtime"
+node_version = "dev"
+node_image = f"{node_image_name}:{node_version}"
+
+exists = check_image(node_image)
+
+if not exists or force == True:
+ print("Build nodejs base image from source")
+ subprocess.run(["docker", "build", "-t", node_image, "-f", os.path.join(dockerDir, "Dockerfile.runtime"), "--target", "noderun", "."])
+else:
+ print(f"SKIP build {node_image} (already exists)")
+
+proxy_image_name = "onlyoffice/4testing-docspace-proxy-runtime"
+proxy_version = "dev"
+proxy_image = f"{proxy_image_name}:{proxy_version}"
+
+exists = check_image(proxy_image)
+
+if not exists or force == True:
+ print("Build proxy base image from source (apply new nginx config)")
+ subprocess.run(["docker", "build", "-t", proxy_image, "-f", os.path.join(dockerDir, "Dockerfile.runtime"), "--target", "router", "."])
+else:
+ print(f"SKIP build {proxy_image} (already exists)")
+
+print("Run migration and services")
+
+os.environ["ENV_EXTENSION"] = "dev"
+os.environ["INSTALLATION_TYPE"] = installation_type
+os.environ["Baseimage_Dotnet_Run"] = "onlyoffice/4testing-docspace-dotnet-runtime:" + dotnet_version
+os.environ["Baseimage_Nodejs_Run"] = "onlyoffice/4testing-docspace-nodejs-runtime:" + node_version
+os.environ["Baseimage_Proxy_Run"] = "onlyoffice/4testing-docspace-proxy-runtime:" + proxy_version
+os.environ["DOCUMENT_SERVER_IMAGE_NAME"] = document_server_image_name
+os.environ["SERVICE_DOCEDITOR"] = doceditor
+os.environ["SERVICE_LOGIN"] = login
+os.environ["SERVICE_MANAGEMENT"] = management
+os.environ["SERVICE_CLIENT"] = client
+os.environ["ROOT_DIR"] = dir
+os.environ["BUILD_PATH"] = "/var/www"
+os.environ["SRC_PATH"] = os.path.join(dir, "publish/services")
+os.environ["DATA_DIR"] = os.path.join(dir, "data")
+os.environ["APP_URL_PORTAL"] = portal_url
+os.environ["MIGRATION_TYPE"] = migration_type
+subprocess.run(["docker-compose", "-f", os.path.join(dockerDir, "docspace.profiles.yml"), "-f", os.path.join(dockerDir, "docspace.overcome.yml"), "--profile", "migration-runner", "--profile", "backend-local", "up", "-d"])
+
+print()
+print("Run script directory:", dir)
+print("Root directory:", dir)
+print("Docker files root directory:", dockerDir)
+
+print()
+print(f"SERVICE_DOCEDITOR: {doceditor}")
+print(f"SERVICE_LOGIN: {login}")
+print(f"SERVICE_MANAGEMENT: {management}")
+print(f"SERVICE_CLIENT: {client}")
+print(f"DOCSPACE_APP_URL: {portal_url}")
+
+print()
+print("FORCE REBUILD BASE IMAGES:", force)
+print("Run dnsmasq:", dns)
+
+print()
+print("MIGRATION TYPE:", migration_type)
+print("INSTALLATION TYPE:", installation_type)
+print("DS image:", document_server_image_name)
+print()
diff --git a/build.backend.docker.sh b/build.backend.docker.sh
deleted file mode 100755
index 8913abb946..0000000000
--- a/build.backend.docker.sh
+++ /dev/null
@@ -1,140 +0,0 @@
-#!/bin/bash
-
-rd="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
-echo "Run script directory:" $dir
-
-dir=$(builtin cd $rd/../; pwd)
-dockerDir="$dir/buildtools/install/docker"
-
-echo "Root directory:" $dir
-echo "Docker files root directory:" $dockerDir
-
-local_ip=$(ipconfig getifaddr en0)
-
-echo "LOCAL IP: $local_ip"
-
-doceditor=${local_ip}:5013
-login=${local_ip}:5011
-client=${local_ip}:5001
-management=${local_ip}:5015
-portal_url="http://$local_ip"
-
-echo "SERVICE_DOCEDITOR: $doceditor"
-echo "SERVICE_LOGIN: $login"
-echo "SERVICE_CLIENT: $client"
-echo "SERVICE_MANAGEMENT: $management"
-echo "APP_URL_PORTAL: $portal_url"
-
-force=false
-
-if [ "$1" = "--force" ]; then
- force=true
-fi
-
-echo "FORCE BUILD BASE IMAGES: $force"
-
-# Stop all backend services"
-$dir/buildtools/start/stop.backend.docker.sh
-
-echo "Run MySQL"
-
-arch_name="$(uname -m)"
-
-existsnetwork=$(docker network ls | awk '{print $2;}' | { grep -x onlyoffice || true; });
-
-if [[ -z ${existsnetwork} ]]; then
- docker network create --driver bridge onlyoffice
-fi
-
-if [ "${arch_name}" = "x86_64" ]; then
- echo "CPU Type: x86_64 -> run db.yml"
- 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 $dockerDir/db.yml up -d
-else
- echo "Error: Unknown CPU Type: ${arch_name}."
- exit 1
-fi
-
-if [ "$1" = "--dns" ]; then
- echo "Run local dns server"
- ROOT_DIR=$dir \
- docker compose -f $dockerDir/dnsmasq.yml up -d
-fi
-
-echo "Clear publish folder"
-rm -rf $dir/publish/services
-
-echo "Build backend services (to "publish/" folder)"
-bash $dir/buildtools/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 "Run migration and services INSTALLATION_TYPE=$INSTALLATION_TYPE"
-dotnet_version=dev
-
-exists=$(docker images | egrep "onlyoffice/4testing-docspace-dotnet-runtime" | egrep "$dotnet_version" | awk 'NR>0 {print $1 ":" $2}')
-
-if [ "${exists}" = "" ] || [ "$force" = true ]; then
- echo "Build dotnet base image from source (apply new dotnet config)"
- docker build -t onlyoffice/4testing-docspace-dotnet-runtime:$dotnet_version -f $dockerDir/Dockerfile.runtime --target dotnetrun .
-else
- echo "SKIP build dotnet base image (already exists)"
-fi
-
-node_version=dev
-
-exists=$(docker images | egrep "onlyoffice/4testing-docspace-nodejs-runtime" | egrep "$node_version" | awk 'NR>0 {print $1 ":" $2}')
-
-if [ "${exists}" = "" ] || [ "$force" = true ]; then
- echo "Build nodejs base image from source"
- docker build -t onlyoffice/4testing-docspace-nodejs-runtime:$node_version -f $dockerDir/Dockerfile.runtime --target noderun .
-else
- echo "SKIP build nodejs base image (already exists)"
-fi
-
-proxy_version=dev
-
-exists=$(docker images | egrep "onlyoffice/4testing-docspace-proxy-runtime" | egrep "$proxy_version" | awk 'NR>0 {print $1 ":" $2}')
-
-if [ "${exists}" = "" ] || [ "$force" = true ]; then
- echo "Build proxy base image from source (apply new nginx config)"
- docker build -t onlyoffice/4testing-docspace-proxy-runtime:$proxy_version -f $dockerDir/Dockerfile.runtime --target router .
-else
- echo "SKIP build proxy base image (already exists)"
-fi
-
-echo "Run migration and services"
-ENV_EXTENSION="dev" \
-INSTALLATION_TYPE=$INSTALLATION_TYPE \
-Baseimage_Dotnet_Run="onlyoffice/4testing-docspace-dotnet-runtime:$dotnet_version" \
-Baseimage_Nodejs_Run="onlyoffice/4testing-docspace-nodejs-runtime:$node_version" \
-Baseimage_Proxy_Run="onlyoffice/4testing-docspace-proxy-runtime:$proxy_version" \
-DOCUMENT_SERVER_IMAGE_NAME=$DOCUMENT_SERVER_IMAGE_NAME \
-SERVICE_DOCEDITOR=$doceditor \
-SERVICE_LOGIN=$login \
-SERVICE_CLIENT=$client \
-SERVICE_MANAGEMENT=$management \
-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 ""
-echo "APP_URL_PORTAL: $portal_url"
-echo "LOCAL IP: $local_ip"
-echo "SERVICE_DOCEDITOR: $doceditor"
-echo "SERVICE_LOGIN: $login"
-echo "SERVICE_CLIENT: $client"
-echo "SERVICE_MANAGEMENT: $management"
-echo "INSTALLATION_TYPE=$INSTALLATION_TYPE"
\ No newline at end of file
diff --git a/clear.backend.docker.bat b/clear.backend.docker.bat
deleted file mode 100644
index 7d215cfc09..0000000000
--- a/clear.backend.docker.bat
+++ /dev/null
@@ -1,7 +0,0 @@
-@echo off
-
-pwsh %~dp0/clear.backend.docker.ps1
-
-echo.
-
-pause
\ No newline at end of file
diff --git a/clear.backend.docker.ps1 b/clear.backend.docker.ps1
deleted file mode 100644
index 8f46f3b631..0000000000
--- a/clear.backend.docker.ps1
+++ /dev/null
@@ -1,38 +0,0 @@
-$Containers = docker ps -aqf "name=^onlyoffice"
-$Images = docker images onlyoffice/4testing-docspace* -q
-$RootDir = Split-Path -Parent $PSScriptRoot
-$DockerDir = ($RootDir + "\buildtools\install\docker")
-
-Write-Host "Clean up containers, volumes or networks" -ForegroundColor Green
-
-if ($Containers -or $Images) {
- Write-Host "Remove all backend containers" -ForegroundColor Blue
-
- $Env:DOCUMENT_SERVER_IMAGE_NAME="onlyoffice/documentserver-de:latest"
- $Env:Baseimage_Dotnet_Run="onlyoffice/4testing-docspace-dotnet-runtime:dev"
- $Env:Baseimage_Nodejs_Run="onlyoffice/4testing-docspace-nodejs-runtime:dev"
- $Env:Baseimage_Proxy_Run="onlyoffice/4testing-docspace-proxy-runtime:dev"
- $Env:SERVICE_CLIENT="localhost:5001"
- $Env:SERVICE_MANAGEMENT="localhost:5015"
- $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 base images (onlyoffice/4testing-docspace)" -ForegroundColor Blue
- docker rmi -f $Images
-
- Write-Host "Remove docker networks" -ForegroundColor Blue
- docker network prune -f
-}
-else {
- Write-Host "No containers, images, volumes or networks to clean up" -ForegroundColor Green
-}
\ No newline at end of file
diff --git a/clear.backend.docker.py b/clear.backend.docker.py
new file mode 100755
index 0000000000..8daff0a126
--- /dev/null
+++ b/clear.backend.docker.py
@@ -0,0 +1,49 @@
+#!/usr/bin/python3
+
+import os, sys
+import subprocess
+
+rd = os.path.dirname(os.path.abspath(__file__))
+root_dir = os.path.abspath(os.path.join(rd, ".."))
+docker_dir = os.path.join(root_dir, "buildtools", "install", "docker")
+
+containers = subprocess.check_output(["docker", "ps", "-aq", "-f", "name=^onlyoffice"], encoding='utf-8').strip().split()
+images = subprocess.check_output(["docker", "images", "onlyoffice/4testing-docspace*", "-q"], encoding='utf-8').strip().split()
+
+if containers or images:
+ print("Clean up containers, volumes or networks")
+
+ print("Remove all backend containers")
+
+ os.environ["Baseimage_Dotnet_Run"] = "onlyoffice/4testing-docspace-dotnet-runtime:dev"
+ os.environ["Baseimage_Nodejs_Run"] = "onlyoffice/4testing-docspace-nodejs-runtime:dev"
+ os.environ["Baseimage_Proxy_Run"] = "onlyoffice/4testing-docspace-proxy-runtime:dev"
+ os.environ["DOCUMENT_SERVER_IMAGE_NAME"] = "onlyoffice/documentserver-de:latest"
+ os.environ["SERVICE_CLIENT"] = "localhost:5001"
+ os.environ["SERVICE_MANAGEMENT"] = "localhost:5015"
+ os.environ["ROOT_DIR"] = root_dir
+ os.environ["BUILD_PATH"] = "/var/www"
+ os.environ["SRC_PATH"] = os.path.join(root_dir, "publish/services")
+ os.environ["DATA_DIR"] = os.path.join(root_dir, "data")
+ subprocess.run(["docker-compose", "-f", os.path.join(docker_dir, "docspace.profiles.yml"), "-f", os.path.join(docker_dir, "docspace.overcome.yml"), "--profile", "migration-runner", "--profile", "backend-local", "down", "--volumes"])
+
+ print("Remove docker contatiners 'mysql'")
+ db_command = f"docker compose -f {os.path.join(docker_dir, 'db.yml')} down --volumes"
+ subprocess.run(db_command, shell=True)
+
+ print("Remove docker volumes")
+ volumes_command = f"docker volume prune -fa"
+ subprocess.run(volumes_command, shell=True)
+
+ print("Remove docker base images (onlyoffice/4testing-docspace)")
+ subprocess.run(['docker', 'rmi', '-f'] + images, check=True)
+
+ print("Remove docker networks")
+ network_command = f"docker network prune -f"
+ subprocess.run(network_command, shell=True)
+
+ print("Remove docker build cache")
+ cache_command = f"docker buildx prune -f"
+ subprocess.run(cache_command, shell=True)
+else:
+ print("No containers or images to clean up")
diff --git a/clear.backend.docker.sh b/clear.backend.docker.sh
deleted file mode 100755
index 38326fd033..0000000000
--- a/clear.backend.docker.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/bash
-
-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}/buildtools/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:dev" \
- Baseimage_Nodejs_Run="onlyoffice/4testing-docspace-nodejs-runtime:dev" \
- Baseimage_Proxy_Run="onlyoffice/4testing-docspace-proxy-runtime:dev" \
- SERVICE_CLIENT="localhost:5001" \
- SERVICE_MANAGEMENT="localhost:5015" \
- 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 docker base images (onlyoffice/4testing-docspace)"
- docker rmi -f $(docker images -a | egrep "onlyoffice/4testing-docspace" | awk 'NR>0 {print $3}')
-
- echo "Remove unused networks."
- docker network prune -f
-else
- echo "No containers, images, volumes or networks to clean up"
-fi
diff --git a/config/appsettings.json b/config/appsettings.json
index 1096f8727c..1ab6f09de4 100644
--- a/config/appsettings.json
+++ b/config/appsettings.json
@@ -34,7 +34,10 @@
"oidc": {
"authority": ""
},
- "server-root": ""
+ "server-root": "",
+ "username": {
+ "regex": "^[\\p{L}\\p{M}' \\-]+$"
+ }
},
"license": {
"file": {
@@ -415,7 +418,8 @@
"script": ["'self'", "'unsafe-inline'", "'unsafe-eval'"],
"style": ["'self'", "'unsafe-inline'"],
"img": ["'self'", "data:", "blob:"],
- "frame": ["'self'"]
+ "frame": ["'self'"],
+ "fonts": ["'self'", "data:"]
},
"zendesk": {
"def": ["*.zdassets.com", "*.zopim.com", "*.zendesk.com", "wss:"],
@@ -427,8 +431,8 @@
"def": ["*.googleapis.com"]
},
"oform": {
- "img": ["*.onlyoffice.com"],
- "def": ["*.onlyoffice.com"]
+ "img": ["static-oforms.teamlab.info"],
+ "def": ["cmsoforms.teamlab.info", "oforms.teamlab.info"]
}
},
"logocolors": [
@@ -462,6 +466,11 @@
"region": "us-east-1",
"logGroupName": "/asc/docspace/cluster/cluster_name/general",
"logStreamName": "${hostname} - ${applicationContext} - ${date} - ${guid}"
+ },
+ "dynamoDB": {
+ "accessKeyId": "",
+ "secretAccessKey": "",
+ "region": "us-east-1"
}
}
}
diff --git a/config/backup.json b/config/backup.json
index c3dc289bd2..6e3acf6dc2 100644
--- a/config/backup.json
+++ b/config/backup.json
@@ -15,8 +15,6 @@
"Cleaner":
{
"Period":"00:15:00"
- },
- "ChunkSize": 524288000,
- "MaxLocalSize": 1048576000
+ }
}
}
\ No newline at end of file
diff --git a/config/nginx/onlyoffice.conf b/config/nginx/onlyoffice.conf
index 85035aa9fb..ca1b2757d9 100644
--- a/config/nginx/onlyoffice.conf
+++ b/config/nginx/onlyoffice.conf
@@ -68,6 +68,8 @@ server {
gzip on;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript;
+ gzip_min_length 1000;
+ gzip_proxied any;
fastcgi_read_timeout 600;
fastcgi_send_timeout 600;
@@ -111,7 +113,7 @@ server {
if redis_pass ~= "" then
local res, err = red:auth(redis_pass)
if not res then
- ngx.log(ngx.ERR, "failed to authenticate: ", err)
+ ngx.log(ngx.INFO, "failed to authenticate: ", err)
return
end
end
diff --git a/config/nlog.config b/config/nlog.config
index f4522c0b2d..e6dfd6ee1a 100644
--- a/config/nlog.config
+++ b/config/nlog.config
@@ -46,12 +46,12 @@
-
+
-
+
diff --git a/config/storage.json b/config/storage.json
index e6e3da6d3e..083325fa44 100644
--- a/config/storage.json
+++ b/config/storage.json
@@ -41,6 +41,7 @@
"data": "00000000-0000-0000-0000-000000000000",
"type": "disc",
"path": "$STORAGE_ROOT\\Products\\Files\\logos\\{0}",
+ "validatorType": "ASC.Files.Core.VirtualRooms.RoomLogoValidator, ASC.Files.Core",
"domain": [
{
"name": "logos_temp",
diff --git a/debuginfo.py b/debuginfo.py
new file mode 100755
index 0000000000..a6fc574dcd
--- /dev/null
+++ b/debuginfo.py
@@ -0,0 +1,97 @@
+#!/usr/bin/python3
+
+import os
+from git import Repo
+from datetime import datetime
+
+rd = os.path.dirname(os.path.abspath(__file__))
+root_dir = os.path.abspath(os.path.join(rd, ".."))
+
+CLIENT = "client"
+SERVER = "server"
+BUILDTOOLS = "buildtools"
+REPO_CLIENT_URL = f"https://github.com/ONLYOFFICE/DocSpace-client"
+REPO_SERVER_URL = f"https://github.com/ONLYOFFICE/DocSpace-server"
+REPO_BUILDTOOLS_URL = f"https://github.com/ONLYOFFICE/DocSpace-buildtools"
+LIMIT_DAYS = 30
+MESSAGE_SEPARATOR = '__MESSAGE_SEPARATOR__'
+SEP = 'ยง'
+
+# https://git-scm.com/docs/pretty-formats
+format = f"%H{SEP}%as{SEP}%an{SEP}%s %b{MESSAGE_SEPARATOR}"
+
+data = {}
+
+
+def fetchCommits(url, type):
+ path = os.path.join(root_dir, type)
+ #print(path, os.path.exists(path))
+ if os.path.exists(path) == False:
+ print("Error folder does not exists", path)
+ return
+
+ repo = Repo(path)
+
+ info = f"| [DocSpace-{type}]({url}) | [{repo.active_branch.name}]({url}/tree/{repo.active_branch.name}) | [{repo.head.commit}]({url}/commit/{repo.head.commit}) |{os.linesep}"
+
+ commits_str = repo.git.log(f"--pretty=format: {format}", "--no-merges", f"--since={LIMIT_DAYS}.days")
+ #print(commits_str)
+
+ commits = commits_str.strip().split(MESSAGE_SEPARATOR)
+ #print(commits)
+
+ for item in commits:
+ elements = item.replace('\n', '').split(SEP)
+
+ if len(elements) != 4:
+ continue
+
+ hash = elements[0].strip()
+ date = datetime.strptime(elements[1].strip(), "%Y-%m-%d")
+ name = elements[2].strip()
+ text = elements[3].strip().capitalize()
+
+ if date not in data:
+ data[date] = {}
+
+ if name not in data[date]:
+ data[date][name] = []
+
+ data[date][name].append(f"- [{type}]: {text} [`{hash[0:7]}`]({url}/commit/{hash})")
+
+ return info
+
+result = f"## Changelog{os.linesep}"
+
+result += f"| Repo | Branch | Last Commit |{os.linesep}"
+result += f"| :- | :- | :- |{os.linesep}"
+
+result += fetchCommits(REPO_CLIENT_URL, CLIENT)
+result += fetchCommits(REPO_SERVER_URL, SERVER)
+result += fetchCommits(REPO_BUILDTOOLS_URL, BUILDTOOLS)
+
+# Create debuginfo.md content
+for date in sorted(data, reverse=True):
+ niceDate = date.strftime("%d %B %Y")
+ result += f"### {niceDate}{os.linesep}"
+ for name in sorted(data[date]):
+ result += f"#### {name}{os.linesep}"
+ for commit in data[date][name]:
+ result += f"{commit}{os.linesep}"
+
+print(result)
+
+pathMD = os.path.join(root_dir, CLIENT, "public/debuginfo.md")
+# Open text file in write mode
+text_file = open(pathMD, "w")
+
+# Write content to file
+n = text_file.write(result)
+
+if n == len(result):
+ print("Success! String written to text file.")
+else:
+ print("Failure! String not written to text file.")
+
+# Close file
+text_file.close()
\ No newline at end of file
diff --git a/install/OneClickInstall/docspace-install.sh b/install/OneClickInstall/docspace-install.sh
index 6e653d62af..b95ca368e6 100644
--- a/install/OneClickInstall/docspace-install.sh
+++ b/install/OneClickInstall/docspace-install.sh
@@ -142,7 +142,7 @@ fi
if [ -z $GIT_BRANCH ]; then
DOWNLOAD_URL_PREFIX="https://download.onlyoffice.com/${product}"
else
- DOWNLOAD_URL_PREFIX="https://raw.githubusercontent.com/ONLYOFFICE/${product}/${GIT_BRANCH}/buildtools/install/OneClickInstall"
+ DOWNLOAD_URL_PREFIX="https://raw.githubusercontent.com/ONLYOFFICE/${product}-buildtools/${GIT_BRANCH}/install/OneClickInstall"
fi
if [ "$DOCKER" == "true" ]; then
diff --git a/install/OneClickInstall/install-Debian.sh b/install/OneClickInstall/install-Debian.sh
index 0cd3824bcd..8dd90ca46f 100644
--- a/install/OneClickInstall/install-Debian.sh
+++ b/install/OneClickInstall/install-Debian.sh
@@ -121,7 +121,7 @@ fi
if [ -z $GIT_BRANCH ]; then
DOWNLOAD_URL_PREFIX="https://download.onlyoffice.com/${product}/install-Debian"
else
- DOWNLOAD_URL_PREFIX="https://raw.githubusercontent.com/ONLYOFFICE/${product}/${GIT_BRANCH}/buildtools/install/OneClickInstall/install-Debian"
+ DOWNLOAD_URL_PREFIX="https://raw.githubusercontent.com/ONLYOFFICE/${product}-buildtools/${GIT_BRANCH}/install/OneClickInstall/install-Debian"
fi
if [ "${LOCAL_SCRIPTS}" == "true" ]; then
diff --git a/install/OneClickInstall/install-Docker.sh b/install/OneClickInstall/install-Docker.sh
index 301ee51da5..06159901e1 100644
--- a/install/OneClickInstall/install-Docker.sh
+++ b/install/OneClickInstall/install-Docker.sh
@@ -491,9 +491,9 @@ while [ "$1" != "" ]; do
echo " -ies, --installelastic install or update elasticsearch (true|false)"
echo " -espr, --elasticprotocol the protocol for the connection to elasticsearch (default value http)"
echo " -esh, --elastichost the IP address or hostname of the elasticsearch"
- echo " -esp, --elasticport elasticsearch port number (default value 6379)"
+ echo " -esp, --elasticport elasticsearch port number (default value 9200)"
echo " -rdsh, --redishost the IP address or hostname of the redis server"
- echo " -rdsp, --redisport redis server port number (default value 9200)"
+ echo " -rdsp, --redisport redis server port number (default value 6379)"
echo " -rdsu, --redisusername redis user name"
echo " -rdspass, --redispassword password set for redis account"
echo " -rbth, --rabbitmqhost the IP address or hostname of the rabbitmq server"
@@ -947,7 +947,7 @@ domain_check () {
echo "Select 'N' to cancel ${PACKAGE_SYSNAME^^} ${PRODUCT_NAME} 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"
+ sed -i 's!{!& "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
@@ -1172,7 +1172,7 @@ download_files () {
if ! command_exists svn; then
install_service svn subversion
fi
- svn export --force https://github.com/${PACKAGE_SYSNAME}/${PRODUCT}/branches/${GIT_BRANCH}/buildtools/install/docker/ ${BASE_DIR} >/dev/null
+ svn export --force https://github.com/${PACKAGE_SYSNAME}/${PRODUCT}-buildtools/branches/${GIT_BRANCH}/install/docker/ ${BASE_DIR} >/dev/null
fi
echo "OK"
diff --git a/install/OneClickInstall/install-RedHat.sh b/install/OneClickInstall/install-RedHat.sh
index 068210756e..3ee10a2c19 100644
--- a/install/OneClickInstall/install-RedHat.sh
+++ b/install/OneClickInstall/install-RedHat.sh
@@ -134,7 +134,7 @@ END
if [ -z $GIT_BRANCH ]; then
DOWNLOAD_URL_PREFIX="https://download.onlyoffice.com/${product}/install-RedHat"
else
- DOWNLOAD_URL_PREFIX="https://raw.githubusercontent.com/ONLYOFFICE/${product}/${GIT_BRANCH}/buildtools/install/OneClickInstall/install-RedHat"
+ DOWNLOAD_URL_PREFIX="https://raw.githubusercontent.com/ONLYOFFICE/${product}-buildtools/${GIT_BRANCH}/install/OneClickInstall/install-RedHat"
fi
if [ "$LOCAL_SCRIPTS" = "true" ]; then
diff --git a/install/common/build-backend.sh b/install/common/build-backend.sh
index 87fdcbcd97..c748b3081a 100644
--- a/install/common/build-backend.sh
+++ b/install/common/build-backend.sh
@@ -42,10 +42,11 @@ done
echo "== BACK-END-BUILD =="
-cd ${SRC_PATH}
+cd ${SRC_PATH}/server
dotnet build ASC.Web.slnf ${ARGS}
-dotnet build ASC.Migrations.sln -o ${SRC_PATH}/ASC.Migration.Runner/service/
+dotnet build ASC.Migrations.sln -o ${SRC_PATH}/server/ASC.Migration.Runner/service/
+cd ${SRC_PATH}/client
# Array of names backend services in directory common (Nodejs)
services_name_backend_nodejs=()
services_name_backend_nodejs+=(ASC.Socket.IO)
@@ -54,5 +55,5 @@ services_name_backend_nodejs+=(ASC.SsoAuth)
# Build backend services (Nodejs)
for i in ${!services_name_backend_nodejs[@]}; do
echo "== Build ${services_name_backend_nodejs[$i]} project =="
- yarn install --cwd common/${services_name_backend_nodejs[$i]} --frozen-lockfile
+ yarn install --cwd ${SRC_PATH}/server/common/${services_name_backend_nodejs[$i]} --frozen-lockfile
done
diff --git a/install/common/build-frontend.sh b/install/common/build-frontend.sh
index 9304bae8f2..a5f74e9910 100644
--- a/install/common/build-frontend.sh
+++ b/install/common/build-frontend.sh
@@ -57,10 +57,12 @@ done
echo "== FRONT-END-BUILD =="
cd ${SRC_PATH}
-yarn install
# debug config
if [ "$DEBUG_INFO" = true ]; then
- yarn debug-info
+ pip install -r ${SRC_PATH}/buildtools/requirements.txt
+ python3 ${SRC_PATH}/buildtools/debuginfo.py
fi
+cd ${SRC_PATH}/client
+yarn install
yarn ${BUILD_ARGS}
yarn ${DEPLOY_ARGS}
diff --git a/install/common/build-services.ps1 b/install/common/build-services.ps1
deleted file mode 100644
index 30dc6f2a39..0000000000
--- a/install/common/build-services.ps1
+++ /dev/null
@@ -1,57 +0,0 @@
-$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\buildtools\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\server\ASC.Web.slnf"
-
-Write-Host "== Build ASC.Migrations.sln ==" -ForegroundColor Green
-dotnet build "$SRC_PATH\server\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\buildtools\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\server\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\server\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\server\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
-}
diff --git a/install/common/build-services.py b/install/common/build-services.py
new file mode 100755
index 0000000000..aec3d154cb
--- /dev/null
+++ b/install/common/build-services.py
@@ -0,0 +1,87 @@
+#!/usr/bin/python3
+
+import os
+import stat
+import subprocess
+import shutil
+import time
+
+SRC_PATH = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
+BUILD_PATH = os.path.join(SRC_PATH, "publish")
+
+print(f"SRC_PATH = {SRC_PATH}")
+print(f"BUILD_PATH = {BUILD_PATH}")
+
+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"]
+
+DOCKER_ENTRYPOINT="docker-entrypoint.py"
+DOCKER_ENTRYPOINT_PATH = os.path.join(SRC_PATH, "buildtools", "install", "docker", DOCKER_ENTRYPOINT)
+
+if os.path.exists(os.path.join(BUILD_PATH, "services")):
+ print("== Clean up services ==")
+ shutil.rmtree(os.path.join(BUILD_PATH, "services"))
+
+print("== Build ASC.Web.slnf ==")
+subprocess.run(["dotnet", "build", os.path.join(SRC_PATH, "server", "ASC.Web.slnf")])
+
+print("== Build ASC.Migrations.sln ==")
+subprocess.run(["dotnet", "build", os.path.join(SRC_PATH, "server", "ASC.Migrations.sln"), "-o", os.path.join(BUILD_PATH, "services", "ASC.Migration.Runner", "service")])
+
+print("== Add docker-migration-entrypoint.sh to ASC.Migration.Runner ==")
+file_path = os.path.join(BUILD_PATH, "services", "ASC.Migration.Runner", "service", "docker-migration-entrypoint.sh")
+src_file_path = os.path.join(SRC_PATH, "buildtools", "install", "docker", "docker-migration-entrypoint.sh")
+
+WINDOWS_LINE_ENDING = b'\r\n'
+UNIX_LINE_ENDING = b'\n'
+
+with open(src_file_path, 'rb') as open_file:
+ content = open_file.read()
+
+content = content.replace(WINDOWS_LINE_ENDING, UNIX_LINE_ENDING)
+
+with open(file_path, 'wb') as open_file:
+ open_file.write(content)
+
+st = os.stat(file_path)
+os.chmod(file_path, st.st_mode | stat.S_IEXEC)
+
+format = "zip"
+
+for service in BACKEND_NODEJS_SERVICES:
+ print(f"== Build {service} project ==")
+ src = os.path.join(SRC_PATH, "server", "common", service)
+ subprocess.run(["yarn", "install"], cwd=src, shell=True)
+
+ dst = os.path.join(BUILD_PATH, "services", service, "service")
+ if not os.path.exists(dst):
+ os.makedirs(dst, exist_ok=True)
+
+ archive_src = os.path.join(SRC_PATH, "server", "common", service, f"service.{format}")
+ archive = os.path.join(BUILD_PATH, "services", service, f"service.{format}")
+
+ print("Make service archive", archive_src)
+ start = time.time()
+ shutil.make_archive(root_dir=src, format=format, base_name=dst)
+ end = time.time()
+ print(f"Took {(end-start)*1000.0} ms")
+
+ print("Unpack service archive", archive)
+ start = time.time()
+ shutil.unpack_archive(archive, dst)
+ end = time.time()
+ print(f"Took {(end-start)*1000.0} ms")
+
+ print("Remove service archive", archive)
+ os.remove(archive)
+
+ print(f"== Add docker-entrypoint.py to {service}")
+ shutil.copyfile(DOCKER_ENTRYPOINT_PATH, os.path.join(dst, DOCKER_ENTRYPOINT))
+
+print("== Publish ASC.Web.slnf ==")
+subprocess.run(["dotnet", "publish", os.path.join(SRC_PATH, "server", "ASC.Web.slnf"), "-p", "PublishProfile=FolderProfile"])
+
+for service in BACKEND_DOTNETCORE_SERVICES:
+ print(f"== Add {DOCKER_ENTRYPOINT} to {service}")
+ dst = os.path.join(BUILD_PATH, "services", service, "service")
+ shutil.copyfile(DOCKER_ENTRYPOINT_PATH, os.path.join(dst, DOCKER_ENTRYPOINT))
diff --git a/install/deb/debian/rules b/install/deb/debian/rules
index 0401ee8fce..dacb7ecb8f 100755
--- a/install/deb/debian/rules
+++ b/install/deb/debian/rules
@@ -47,14 +47,15 @@ override_dh_auto_build:
find ${SRC_PATH}/config/ -type f -regex '.*\.\(test\|dev\).*' -delete
json -I -f ${SRC_PATH}/config/appsettings.json -e "this.core.notify.postman=\"services\"" -e "this.Logging.LogLevel.Default=\"Warning\"" -e "this['debug-info'].enabled=\"false\"" -e "this.web.samesite=\"None\""
json -I -f ${SRC_PATH}/config/apisystem.json -e "this.core.notify.postman=\"services\""
- sed 's_\(minlevel=\)".*"_\1"Warn"_g' -i ${SRC_PATH}/config/nlog.config
+ sed 's_\(minlevel=\)"[^"]*"_\1"Warn"_g' -i ${SRC_PATH}/config/nlog.config
sed 's_etc/nginx_etc/openresty_g' -i ${SRC_PATH}/config/nginx/*.conf
+ sed -i 's_$public_root_/var/www/%{product}/public/_' config/nginx/onlyoffice.conf
sed 's/teamlab.info/onlyoffice.com/g' -i ${SRC_PATH}/config/autofac.consumers.json
json -I -f ${SRC_PATH}/client/public/scripts/config.json -e "this.wrongPortalNameUrl=\"\""
sed -e 's/$$router_host/127.0.0.1/g' -e 's/the_host/host/g' -e 's/the_scheme/scheme/g' -e 's_includes_/etc/openresty/includes_g' -i ${SRC_PATH}/buildtools/install/docker/config/nginx/onlyoffice-proxy*.conf
sed "s_\(.*root\).*;_\1 \"/var/www/${PRODUCT}\";_g" -i ${SRC_PATH}/buildtools/install/docker/config/nginx/letsencrypt.conf
- sed -e '/.pid/d' -e '/temp_path/d' -e 's_etc/nginx_etc/openresty_g' -i ${SRC_PATH}/buildtools/install/docker/config/nginx/templates/nginx.conf.template
+ sed -e '/.pid/d' -e '/temp_path/d' -e 's_etc/nginx_etc/openresty_g' -e 's/\.log/-openresty.log/g' -i ${SRC_PATH}/buildtools/install/docker/config/nginx/templates/nginx.conf.template
mv -f ${SRC_PATH}/buildtools/install/docker/config/nginx/onlyoffice-proxy-ssl.conf ${SRC_PATH}/buildtools/install/docker/config/nginx/onlyoffice-proxy-ssl.conf.template
for i in ${PRODUCT} $$(ls ${CURRENT_PATH}/debian/*.install | grep -oP 'debian/\K.*' | grep -o '^[^.]*'); do \
diff --git a/install/docker/.env b/install/docker/.env
index 0de6ebbefc..d3c9eaabdf 100644
--- a/install/docker/.env
+++ b/install/docker/.env
@@ -84,6 +84,7 @@
MYSQL_USER=${PRODUCT}_user
MYSQL_PASSWORD=${PRODUCT}_pass
DATABASE_MIGRATION=false
+ MIGRATION_TYPE="SAAS"
# service host #
API_SYSTEM_HOST=${CONTAINER_PREFIX}api-system
diff --git a/install/docker/Dockerfile.app b/install/docker/Dockerfile.app
index 60d65e7989..21d7eaa815 100644
--- a/install/docker/Dockerfile.app
+++ b/install/docker/Dockerfile.app
@@ -28,6 +28,7 @@ RUN apt-get -y update && \
sudo \
locales \
git \
+ python3-pip \
npm && \
locale-gen en_US.UTF-8 && \
npm install --global yarn && \
@@ -39,25 +40,23 @@ RUN apt-get -y update && \
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 git clone -b ${GIT_BRANCH} https://github.com/ONLYOFFICE/DocSpace-buildtools.git ${SRC_PATH}/buildtools && \
+ git clone --recurse-submodules -b ${GIT_BRANCH} https://github.com/ONLYOFFICE/DocSpace-Server.git ${SRC_PATH}/server && \
+ git clone -b ${GIT_BRANCH} https://github.com/ONLYOFFICE/DocSpace-Client.git ${SRC_PATH}/client
RUN cd ${SRC_PATH} && \
mkdir -p /app/onlyoffice/config/ && \
cd buildtools/config && \
ls | grep -v test | grep -v dev | grep -v nginx | xargs cp -t /app/onlyoffice/config/ && \
cd ${SRC_PATH} && \
- # mkdir -p /app/onlyoffice/ && \
- #find buildtools/config/ -maxdepth 1 -name "*.json" | grep -v test | grep -v dev | xargs tar -cvf config.tar && \
- # tar -C "/app/onlyoffice/" -xvf config.tar && \
cp buildtools/config/*.config /app/onlyoffice/config/ && \
mkdir -p /etc/nginx/conf.d && cp -f buildtools/config/nginx/onlyoffice*.conf /etc/nginx/conf.d/ && \
mkdir -p /etc/nginx/includes/ && cp -f buildtools/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}/buildtools/install/common/ && \
- bash build-frontend.sh -sp "${SRC_PATH}/client" -ba "${BUILD_ARGS}" -da "${DEPLOY_ARGS}" -di "${DEBUG_INFO}" && \
- bash build-backend.sh -sp "${SRC_PATH}/server" && \
+ bash build-frontend.sh -sp "${SRC_PATH}" -ba "${BUILD_ARGS}" -da "${DEPLOY_ARGS}" -di "${DEBUG_INFO}" && \
+ bash build-backend.sh -sp "${SRC_PATH}" && \
bash publish-backend.sh -pc "${PUBLISH_CNF}" -sp "${SRC_PATH}/server" -bp "${BUILD_PATH}" && \
cp -rf ${SRC_PATH}/server/products/ASC.Files/Server/DocStore ${BUILD_PATH}/products/ASC.Files/server/ && \
rm -rf ${SRC_PATH}/server/common/* && \
@@ -171,7 +170,8 @@ RUN sed -i 's/127.0.0.1:5010/$service_api_system/' /etc/nginx/conf.d/onlyoffice.
sed -i 's/$public_root/\/var\/www\/public\//' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/http:\/\/172.*/$document_server;/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i '/client_body_temp_path/ i \ \ \ \ $MAP_HASH_BUCKET_SIZE' /etc/nginx/nginx.conf.template && \
- sed -i 's/\(worker_connections\).*;/\1 $COUNT_WORKER_CONNECTIONS;/' /etc/nginx/nginx.conf.template
+ sed -i 's/\(worker_connections\).*;/\1 $COUNT_WORKER_CONNECTIONS;/' /etc/nginx/nginx.conf.template && \
+ sed -i -e '/^user/s/^/#/' -e 's#/tmp/nginx.pid#nginx.pid#' -e 's#/etc/nginx/mime.types#mime.types#' /etc/nginx/nginx.conf.template
ENTRYPOINT [ "/docker-entrypoint.sh" ]
@@ -312,7 +312,7 @@ 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"]
+CMD ["ASC.Web.Studio.dll", "ASC.Web.Studio", "core:eventBus:subscriptionClientName=asc_event_bus_webstudio_queue"]
## ASC.Web.HealthChecks.UI ##
FROM dotnetrun AS healthchecks
diff --git a/install/docker/Dockerfile.runtime b/install/docker/Dockerfile.runtime
index 0c43830f9b..ca3320de5a 100644
--- a/install/docker/Dockerfile.runtime
+++ b/install/docker/Dockerfile.runtime
@@ -127,7 +127,8 @@ RUN chown onlyoffice:onlyoffice /etc/nginx/* -R && \
sed -i 's/http:\/\/172.*/$document_server;/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i 's/local redis_host = "127.0.0.1"/local redis_host = "onlyoffice-redis"/' /etc/nginx/conf.d/onlyoffice.conf && \
sed -i '/client_body_temp_path/ i \ \ \ \ $MAP_HASH_BUCKET_SIZE' /etc/nginx/nginx.conf.template && \
- sed -i 's/\(worker_connections\).*;/\1 $COUNT_WORKER_CONNECTIONS;/' /etc/nginx/nginx.conf.template
+ sed -i 's/\(worker_connections\).*;/\1 $COUNT_WORKER_CONNECTIONS;/' /etc/nginx/nginx.conf.template && \
+ sed -i -e '/^user/s/^/#/' -e 's#/tmp/nginx.pid#nginx.pid#' -e 's#/etc/nginx/mime.types#mime.types#' /etc/nginx/nginx.conf.template
ENTRYPOINT [ "/docker-entrypoint.sh" ]
diff --git a/install/docker/docker-entrypoint.py b/install/docker/docker-entrypoint.py
index f51e2b8df0..633c90e49c 100644
--- a/install/docker/docker-entrypoint.py
+++ b/install/docker/docker-entrypoint.py
@@ -35,7 +35,7 @@ OAUTH_REDIRECT_URL = os.environ["OAUTH_REDIRECT_URL"] if environ.get("OAUTH_REDI
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"]
APP_KNOWN_NETWORKS = os.environ["APP_KNOWN_NETWORKS"]
-LOG_LEVEL = os.environ["LOG_LEVEL"] if environ.get("LOG_LEVEL") else None
+LOG_LEVEL = os.environ["LOG_LEVEL"].lower() if environ.get("LOG_LEVEL") else None
DEBUG_INFO = os.environ["DEBUG_INFO"] if environ.get("DEBUG_INFO") else "false"
SAMESITE = os.environ["SAMESITE"] if environ.get("SAMESITE") else "None"
@@ -166,7 +166,6 @@ updateJsonData(jsonData,"$.files.docservice.url.public", DOCUMENT_SERVER_URL_PUB
updateJsonData(jsonData,"$.files.docservice.url.internal", DOCUMENT_SERVER_CONNECTION_HOST)
updateJsonData(jsonData,"$.files.docservice.secret.value", DOCUMENT_SERVER_JWT_SECRET)
updateJsonData(jsonData,"$.files.docservice.secret.header", DOCUMENT_SERVER_JWT_HEADER)
-updateJsonData(jsonData,"$.Logging.LogLevel.Default", LOG_LEVEL)
updateJsonData(jsonData,"$.debug-info.enabled", DEBUG_INFO)
updateJsonData(jsonData,"$.web.samesite", SAMESITE)
if INSTALLATION_TYPE == "ENTERPRISE":
diff --git a/install/docker/docker-healthchecks-entrypoint.sh b/install/docker/docker-healthchecks-entrypoint.sh
index fecc4a3d88..04dd04ee20 100755
--- a/install/docker/docker-healthchecks-entrypoint.sh
+++ b/install/docker/docker-healthchecks-entrypoint.sh
@@ -31,6 +31,7 @@ STUDIO_NOTIFY_HOST=${STUDIO_NOTIFY_HOST:-"${CONTAINER_PREFIX}studio-notify:${SER
API_HOST=${API_HOST:-"${CONTAINER_PREFIX}api:${SERVICE_PORT}"}
STUDIO_HOST=${STUDIO_HOST:-"${CONTAINER_PREFIX}studio:${SERVICE_PORT}"}
+sed -i "/\"Name\": \"ASC.ApiCache\"/,/{/d" ${PATH_TO_CONF}/appsettings.json
sed -i "s!localhost:5010!${API_SYSTEM_HOST}!g" ${PATH_TO_CONF}/appsettings.json
sed -i "s!localhost:5012!${BACKUP_HOST}!g" ${PATH_TO_CONF}/appsettings.json
sed -i "s!localhost:5032!${BACKUP_BACKGRUOND_TASKS_HOST}!g" ${PATH_TO_CONF}/appsettings.json
diff --git a/install/docker/docspace.profiles.yml b/install/docker/docspace.profiles.yml
index dcc085336c..288c42e7fb 100644
--- a/install/docker/docspace.profiles.yml
+++ b/install/docker/docspace.profiles.yml
@@ -293,6 +293,7 @@ services:
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
+ MIGRATION_TYPE: ${MIGRATION_TYPE}
networks:
default:
diff --git a/install/docker/prepare-nginx-router.sh b/install/docker/prepare-nginx-router.sh
index b99e41221e..496a1d26da 100755
--- a/install/docker/prepare-nginx-router.sh
+++ b/install/docker/prepare-nginx-router.sh
@@ -4,7 +4,7 @@ REDIS_HOST=${REDIS_HOST:-"${REDIS_CONTAINER_NAME}"}
REDIS_PORT=${REDIS_PORT:-"6379"}
REDIS_PASSWORD=${REDIS_PASSWORD:-""}
-envsubst '$MAP_HASH_BUCKET_SIZE,$COUNT_WORKER_CONNECTIONS' < /etc/nginx/nginx.conf.template > /etc/nginx/nginx.conf
+envsubst '$MAP_HASH_BUCKET_SIZE,$COUNT_WORKER_CONNECTIONS' < /etc/nginx/nginx.conf.template > /usr/local/openresty/nginx/conf/nginx.conf
sed -i "s~\(redis_host =\).*~\1 \"$REDIS_HOST\"~" /etc/nginx/conf.d/onlyoffice.conf
sed -i "s~\(redis_port =\).*~\1 $REDIS_PORT~" /etc/nginx/conf.d/onlyoffice.conf
sed -i "s~\(redis_pass =\).*~\1 \"$REDIS_PASSWORD\"~" /etc/nginx/conf.d/onlyoffice.conf
diff --git a/install/rpm/SPECS/build.spec b/install/rpm/SPECS/build.spec
index f5a3256b6d..de9bcbf3c3 100644
--- a/install/rpm/SPECS/build.spec
+++ b/install/rpm/SPECS/build.spec
@@ -1,36 +1,40 @@
%build
-bash buildtools/install/common/systemd/build.sh
+cd %{_builddir}/buildtools
-bash buildtools/install/common/build-frontend.sh --srcpath %{_builddir}/%{sourcename}
-bash buildtools/install/common/build-backend.sh --srcpath %{_builddir}/%{sourcename}
-bash buildtools/install/common/publish-backend.sh --srcpath %{_builddir}/%{sourcename}
-rename -f -v "s/product([^\/]*)$/%{product}\$1/g" buildtools/install/common/*
-sed -i "s/{{product}}/%{product}/g" %{_builddir}/%{sourcename}/buildtools/install/common/logrotate/product-common
+bash install/common/systemd/build.sh
-rm -f %{_builddir}/%{sourcename}/config/nginx/onlyoffice-login.conf
+bash install/common/build-frontend.sh --srcpath %{_builddir}/client
+bash install/common/build-backend.sh --srcpath %{_builddir}/server
+bash install/common/publish-backend.sh --srcpath %{_builddir}/server
+
+rename -f -v "s/product([^\/]*)$/%{product}\$1/g" install/common/*
+sed -i "s/{{product}}/%{product}/g" install/common/logrotate/product-common
+
+rm -f config/nginx/onlyoffice-login.conf
+find config/ -type f -regex '.*\.\(test\|dev\).*' -delete
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/' }" \
+json -I -f 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.logLevel=\"warning\"" -e "this.core={ 'products': { 'folder': '%{buildpath}/products', 'subfolder': 'server'} }"
+json -I -f config/appsettings.json -e "this.core.notify.postman=\"services\"" -e "this['debug-info'].enabled=\"false\"" -e "this.web.samesite=\"None\""
+json -I -f config/apisystem.json -e "this.core.notify.postman=\"services\""
+json -I -f %{_builddir}/publish/web/public/scripts/config.json -e "this.wrongPortalNameUrl=\"\""
-find %{_builddir}/%{sourcename}/config/ -type f -regex '.*\.\(test\|dev\).*' -delete
-json -I -f %{_builddir}/%{sourcename}/config/appsettings.json -e "this.core.notify.postman=\"services\"" -e "this.Logging.LogLevel.Default=\"Warning\"" -e "this['debug-info'].enabled=\"false\"" -e "this.web.samesite=\"None\""
-json -I -f %{_builddir}/%{sourcename}/config/apisystem.json -e "this.core.notify.postman=\"services\""
-sed 's_\(minlevel=\)".*"_\1"Warn"_g' -i %{_builddir}/%{sourcename}/config/nlog.config
+sed 's_\(minlevel=\)"[^"]*"_\1"Warn"_g' -i config/nlog.config
+sed 's/teamlab.info/onlyoffice.com/g' -i config/autofac.consumers.json
-sed 's_etc/nginx_etc/openresty_g' -i %{_builddir}/%{sourcename}/config/nginx/*.conf
-sed 's/teamlab.info/onlyoffice.com/g' -i %{_builddir}/%{sourcename}/config/autofac.consumers.json
-json -I -f %{_builddir}/%{sourcename}/client/public/scripts/config.json -e "this.wrongPortalNameUrl=\"\""
-sed -e 's/$router_host/127.0.0.1/g' -e 's/the_host/host/g' -e 's/the_scheme/scheme/g' -e 's_includes_/etc/openresty/includes_g' -i %{_builddir}/%{sourcename}/buildtools/install/docker/config/nginx/onlyoffice-proxy*.conf
-sed -e '/.pid/d' -e '/temp_path/d' -e 's_etc/nginx_etc/openresty_g' -i %{_builddir}/%{sourcename}/buildtools/install/docker/config/nginx/templates/nginx.conf.template
-sed -i "s_\(.*root\).*;_\1 \"/var/www/%{product}\";_g" -i %{_builddir}/%{sourcename}/buildtools/install/docker/config/nginx/letsencrypt.conf
+sed 's_etc/nginx_etc/openresty_g' -i config/nginx/*.conf
+sed -i 's_$public_root_/var/www/%{product}/public/_' config/nginx/onlyoffice.conf
+sed -e 's/$router_host/127.0.0.1/g' -e 's/the_host/host/g' -e 's/the_scheme/scheme/g' -e 's_includes_/etc/openresty/includes_g' -i install/docker/config/nginx/onlyoffice-proxy*.conf
+sed -e '/.pid/d' -e '/temp_path/d' -e 's_etc/nginx_etc/openresty_g' -e 's/\.log/-openresty.log/g' -i install/docker/config/nginx/templates/nginx.conf.template
+sed -i "s_\(.*root\).*;_\1 \"/var/www/%{product}\";_g" -i install/docker/config/nginx/letsencrypt.conf
-find %{_builddir}/%{sourcename}/publish/ \
- %{_builddir}/%{sourcename}/ASC.Migration.Runner \
+find %{_builddir}/server/publish/ \
+ %{_builddir}/server/ASC.Migration.Runner \
-depth -type f -regex '.*\(dll\|dylib\|so\)$' -exec chmod 755 {} \;
-find %{_builddir}/%{sourcename}/publish/ \
- %{_builddir}/%{sourcename}/ASC.Migration.Runner \
+find %{_builddir}/server/publish/ \
+ %{_builddir}/server/ASC.Migration.Runner \
-depth -type f -regex '.*\(so\)$' -exec strip {} \;
diff --git a/install/rpm/SPECS/install.spec b/install/rpm/SPECS/install.spec
index 129d6b71a4..29304fbcc1 100644
--- a/install/rpm/SPECS/install.spec
+++ b/install/rpm/SPECS/install.spec
@@ -1,68 +1,67 @@
%install
-rm -rf %{buildroot}
-mkdir -p "%{buildroot}%{_bindir}/"
-mkdir -p "%{buildroot}%{_docdir}/%{name}-%{version}-%{release}/"
-mkdir -p "%{buildroot}%{_sysconfdir}/logrotate.d"
-mkdir -p "%{buildroot}%{_sysconfdir}/openresty/conf.d/"
-mkdir -p "%{buildroot}%{_sysconfdir}/openresty/includes/"
-mkdir -p "%{buildroot}%{_sysconfdir}/onlyoffice/%{product}/.private/"
-mkdir -p "%{buildroot}%{_sysconfdir}/onlyoffice/%{product}/openresty"
-mkdir -p "%{buildroot}%{_var}/log/onlyoffice/%{product}/"
-mkdir -p "%{buildroot}%{buildpath}/Tools/radicale/plugins/"
-mkdir -p "%{buildroot}%{buildpath}/products/ASC.Files/client/"
-mkdir -p "%{buildroot}%{buildpath}/products/ASC.Files/editor/"
-mkdir -p "%{buildroot}%{buildpath}/products/ASC.Files/server/DocStore/"
-mkdir -p "%{buildroot}%{buildpath}/products/ASC.Files/service/"
-mkdir -p "%{buildroot}%{buildpath}/products/ASC.People/client/"
-mkdir -p "%{buildroot}%{buildpath}/products/ASC.People/server/"
-mkdir -p "%{buildroot}%{buildpath}/services/ASC.ApiSystem/"
-mkdir -p "%{buildroot}%{buildpath}/services/ASC.ClearEvents/"
-mkdir -p "%{buildroot}%{buildpath}/services/ASC.Data.Backup.BackgroundTasks/"
-mkdir -p "%{buildroot}%{buildpath}/services/ASC.Data.Backup/"
-mkdir -p "%{buildroot}%{buildpath}/services/ASC.Migration.Runner/"
-mkdir -p "%{buildroot}%{buildpath}/services/ASC.Notify/"
-mkdir -p "%{buildroot}%{buildpath}/services/ASC.Socket.IO/"
-mkdir -p "%{buildroot}%{buildpath}/services/ASC.SsoAuth/"
-mkdir -p "%{buildroot}%{buildpath}/services/ASC.Studio.Notify/"
-mkdir -p "%{buildroot}%{buildpath}/services/ASC.Web.HealthChecks.UI/"
-mkdir -p "%{buildroot}%{buildpath}/studio/ASC.Web.Api/"
-mkdir -p "%{buildroot}%{buildpath}/studio/ASC.Web.Studio/"
-mkdir -p "%{buildroot}%{buildpath}/public/"
-mkdir -p "%{buildroot}%{buildpath}/client/"
-mkdir -p "%{buildroot}%{buildpath}/products/ASC.Login/login/"
+rm -rf %{buildroot}
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/"
-cp -rf %{_builddir}/%{sourcename}/buildtools/deploy/editor/* "%{buildroot}%{buildpath}/products/ASC.Files/editor/"
-cp -rf %{_builddir}/%{sourcename}/buildtools/deploy/public/* "%{buildroot}%{buildpath}/public/"
-cp -rf %{_builddir}/%{sourcename}/buildtools/deploy/client/* "%{buildroot}%{buildpath}/client/"
-cp -rf %{_builddir}/%{sourcename}/buildtools/deploy/login/* "%{buildroot}%{buildpath}/products/ASC.Login/login/"
-cp -rf %{_builddir}/%{sourcename}/buildtools/install/RadicalePlugins/* "%{buildroot}%{buildpath}/Tools/radicale/plugins/"
-cp -rf %{_builddir}/%{sourcename}/buildtools/install/common/%{product}-configuration "%{buildroot}%{_bindir}/%{product}-configuration"
-cp -rf %{_builddir}/%{sourcename}/buildtools/install/common/systemd/modules/* "%{buildroot}/usr/lib/systemd/system/"
-cp -rf %{_builddir}/%{sourcename}/buildtools/install/common/logrotate/product-common "%{buildroot}%{_sysconfdir}/logrotate.d/%{product}-common"
-cp -rf %{_builddir}/%{sourcename}/config/* "%{buildroot}%{_sysconfdir}/onlyoffice/%{product}/"
-cp -rf %{_builddir}/%{sourcename}/config/nginx/includes/onlyoffice*.conf "%{buildroot}%{_sysconfdir}/openresty/includes/"
-cp -rf %{_builddir}/%{sourcename}/config/nginx/onlyoffice*.conf "%{buildroot}%{_sysconfdir}/openresty/conf.d/"
-cp -rf %{_builddir}/%{sourcename}/products/ASC.Files/Server/DocStore/* "%{buildroot}%{buildpath}/products/ASC.Files/server/DocStore/"
-cp -rf %{_builddir}/%{sourcename}/publish/products/ASC.Files/server/* "%{buildroot}%{buildpath}/products/ASC.Files/server/"
-cp -rf %{_builddir}/%{sourcename}/publish/products/ASC.People/server/* "%{buildroot}%{buildpath}/products/ASC.People/server/"
-cp -rf %{_builddir}/%{sourcename}/publish/services/ASC.ApiSystem/service/* "%{buildroot}%{buildpath}/services/ASC.ApiSystem/"
-cp -rf %{_builddir}/%{sourcename}/publish/services/ASC.ClearEvents/service/* "%{buildroot}%{buildpath}/services/ASC.ClearEvents/"
-cp -rf %{_builddir}/%{sourcename}/publish/services/ASC.Data.Backup.BackgroundTasks/service/* "%{buildroot}%{buildpath}/services/ASC.Data.Backup.BackgroundTasks/"
-cp -rf %{_builddir}/%{sourcename}/publish/services/ASC.Data.Backup/service/* "%{buildroot}%{buildpath}/services/ASC.Data.Backup/"
-cp -rf %{_builddir}/%{sourcename}/publish/services/ASC.Files.Service/service/* "%{buildroot}%{buildpath}/products/ASC.Files/service/"
-cp -rf %{_builddir}/%{sourcename}/publish/services/ASC.Notify/service/* "%{buildroot}%{buildpath}/services/ASC.Notify/"
-cp -rf %{_builddir}/%{sourcename}/publish/services/ASC.Socket.IO/service/* "%{buildroot}%{buildpath}/services/ASC.Socket.IO/"
-cp -rf %{_builddir}/%{sourcename}/publish/services/ASC.SsoAuth/service/* "%{buildroot}%{buildpath}/services/ASC.SsoAuth/"
-cp -rf %{_builddir}/%{sourcename}/publish/services/ASC.Studio.Notify/service/* "%{buildroot}%{buildpath}/services/ASC.Studio.Notify/"
-cp -rf %{_builddir}/%{sourcename}/publish/services/ASC.Web.Api/service/* "%{buildroot}%{buildpath}/studio/ASC.Web.Api/"
-cp -rf %{_builddir}/%{sourcename}/publish/services/ASC.Web.HealthChecks.UI/service/* "%{buildroot}%{buildpath}/services/ASC.Web.HealthChecks.UI/"
-cp -rf %{_builddir}/%{sourcename}/publish/services/ASC.Web.Studio/service/* "%{buildroot}%{buildpath}/studio/ASC.Web.Studio/"
-cp -rf %{_builddir}/%{sourcename}/buildtools/install/docker/config/nginx/onlyoffice-proxy.conf "%{buildroot}%{_sysconfdir}/openresty/conf.d/onlyoffice-proxy.conf"
-cp -rf %{_builddir}/%{sourcename}/buildtools/install/docker/config/nginx/onlyoffice-proxy-ssl.conf "%{buildroot}%{_sysconfdir}/openresty/conf.d/onlyoffice-proxy-ssl.conf.template"
-cp -rf %{_builddir}/%{sourcename}/buildtools/install/docker/config/nginx/letsencrypt.conf "%{buildroot}%{_sysconfdir}/openresty/includes/letsencrypt.conf"
-cp -rf %{_builddir}/%{sourcename}/buildtools/install/docker/config/nginx/templates/nginx.conf.template "%{buildroot}%{_sysconfdir}/onlyoffice/%{product}/openresty/nginx.conf.template"
-cp -rf %{_builddir}/%{sourcename}/buildtools/install/common/%{product}-ssl-setup "%{buildroot}%{_bindir}/%{product}-ssl-setup"
+mkdir -p "%{buildroot}%{buildpath}/Tools/radicale/plugins/"
+mkdir -p "%{buildroot}%{buildpath}/studio/ASC.Web.Studio/"
+mkdir -p "%{buildroot}%{buildpath}/studio/ASC.Web.Api/"
+mkdir -p "%{buildroot}%{buildpath}/services/ASC.Web.HealthChecks.UI/"
+mkdir -p "%{buildroot}%{buildpath}/services/ASC.Studio.Notify/"
+mkdir -p "%{buildroot}%{buildpath}/services/ASC.SsoAuth/"
+mkdir -p "%{buildroot}%{buildpath}/services/ASC.Socket.IO/"
+mkdir -p "%{buildroot}%{buildpath}/services/ASC.Notify/"
+mkdir -p "%{buildroot}%{buildpath}/services/ASC.Migration.Runner/"
+mkdir -p "%{buildroot}%{buildpath}/services/ASC.Data.Backup/"
+mkdir -p "%{buildroot}%{buildpath}/services/ASC.Data.Backup.BackgroundTasks/"
+mkdir -p "%{buildroot}%{buildpath}/services/ASC.ClearEvents/"
+mkdir -p "%{buildroot}%{buildpath}/services/ASC.ApiSystem/"
+mkdir -p "%{buildroot}%{buildpath}/public/"
+mkdir -p "%{buildroot}%{buildpath}/products/ASC.People/server/"
+mkdir -p "%{buildroot}%{buildpath}/products/ASC.People/client/"
+mkdir -p "%{buildroot}%{buildpath}/products/ASC.Login/login/"
+mkdir -p "%{buildroot}%{buildpath}/products/ASC.Files/service/"
+mkdir -p "%{buildroot}%{buildpath}/products/ASC.Files/server/DocStore/"
+mkdir -p "%{buildroot}%{buildpath}/products/ASC.Files/editor/"
+mkdir -p "%{buildroot}%{buildpath}/products/ASC.Files/client/"
+mkdir -p "%{buildroot}%{buildpath}/client/"
+mkdir -p "%{buildroot}%{_var}/log/onlyoffice/%{product}/"
+mkdir -p "%{buildroot}%{_sysconfdir}/openresty/includes/"
+mkdir -p "%{buildroot}%{_sysconfdir}/openresty/conf.d/"
+mkdir -p "%{buildroot}%{_sysconfdir}/onlyoffice/%{product}/openresty"
+mkdir -p "%{buildroot}%{_sysconfdir}/onlyoffice/%{product}/.private/"
+mkdir -p "%{buildroot}%{_sysconfdir}/logrotate.d"
+mkdir -p "%{buildroot}%{_docdir}/%{name}-%{version}-%{release}/"
+mkdir -p "%{buildroot}%{_bindir}/"
+cp -rf %{_builddir}/publish/web/public/* "%{buildroot}%{buildpath}/public/"
+cp -rf %{_builddir}/publish/web/login/* "%{buildroot}%{buildpath}/products/ASC.Login/login/"
+cp -rf %{_builddir}/publish/web/editor/* "%{buildroot}%{buildpath}/products/ASC.Files/editor/"
+cp -rf %{_builddir}/publish/web/client/* "%{buildroot}%{buildpath}/client/"
+cp -rf %{_builddir}/server/publish/services/ASC.Web.Studio/service/* "%{buildroot}%{buildpath}/studio/ASC.Web.Studio/"
+cp -rf %{_builddir}/server/publish/services/ASC.Web.HealthChecks.UI/service/* "%{buildroot}%{buildpath}/services/ASC.Web.HealthChecks.UI/"
+cp -rf %{_builddir}/server/publish/services/ASC.Web.Api/service/* "%{buildroot}%{buildpath}/studio/ASC.Web.Api/"
+cp -rf %{_builddir}/server/publish/services/ASC.Studio.Notify/service/* "%{buildroot}%{buildpath}/services/ASC.Studio.Notify/"
+cp -rf %{_builddir}/server/publish/services/ASC.SsoAuth/service/* "%{buildroot}%{buildpath}/services/ASC.SsoAuth/"
+cp -rf %{_builddir}/server/publish/services/ASC.Socket.IO/service/* "%{buildroot}%{buildpath}/services/ASC.Socket.IO/"
+cp -rf %{_builddir}/server/publish/services/ASC.Notify/service/* "%{buildroot}%{buildpath}/services/ASC.Notify/"
+cp -rf %{_builddir}/server/publish/services/ASC.Files.Service/service/* "%{buildroot}%{buildpath}/products/ASC.Files/service/"
+cp -rf %{_builddir}/server/publish/services/ASC.Data.Backup/service/* "%{buildroot}%{buildpath}/services/ASC.Data.Backup/"
+cp -rf %{_builddir}/server/publish/services/ASC.Data.Backup.BackgroundTasks/service/* "%{buildroot}%{buildpath}/services/ASC.Data.Backup.BackgroundTasks/"
+cp -rf %{_builddir}/server/publish/services/ASC.ClearEvents/service/* "%{buildroot}%{buildpath}/services/ASC.ClearEvents/"
+cp -rf %{_builddir}/server/publish/services/ASC.ApiSystem/service/* "%{buildroot}%{buildpath}/services/ASC.ApiSystem/"
+cp -rf %{_builddir}/server/publish/products/ASC.People/server/* "%{buildroot}%{buildpath}/products/ASC.People/server/"
+cp -rf %{_builddir}/server/publish/products/ASC.Files/server/* "%{buildroot}%{buildpath}/products/ASC.Files/server/"
+cp -rf %{_builddir}/server/LICENSE "%{buildroot}%{_docdir}/%{name}-%{version}-%{release}/"
+cp -rf %{_builddir}/server/ASC.Migration.Runner/service/* "%{buildroot}%{buildpath}/services/ASC.Migration.Runner/"
+cp -rf %{_builddir}/document-templates-main-community-server/* "%{buildroot}%{buildpath}/products/ASC.Files/server/DocStore/"
+cp -rf %{_builddir}/buildtools/install/RadicalePlugins/* "%{buildroot}%{buildpath}/Tools/radicale/plugins/"
+cp -rf %{_builddir}/buildtools/install/docker/config/nginx/templates/nginx.conf.template "%{buildroot}%{_sysconfdir}/onlyoffice/%{product}/openresty/nginx.conf.template"
+cp -rf %{_builddir}/buildtools/install/docker/config/nginx/onlyoffice-proxy.conf "%{buildroot}%{_sysconfdir}/openresty/conf.d/onlyoffice-proxy.conf"
+cp -rf %{_builddir}/buildtools/install/docker/config/nginx/onlyoffice-proxy-ssl.conf "%{buildroot}%{_sysconfdir}/openresty/conf.d/onlyoffice-proxy-ssl.conf.template"
+cp -rf %{_builddir}/buildtools/install/docker/config/nginx/letsencrypt.conf "%{buildroot}%{_sysconfdir}/openresty/includes/letsencrypt.conf"
+cp -rf %{_builddir}/buildtools/install/common/systemd/modules/* "%{buildroot}/usr/lib/systemd/system/"
+cp -rf %{_builddir}/buildtools/install/common/logrotate/product-common "%{buildroot}%{_sysconfdir}/logrotate.d/%{product}-common"
+cp -rf %{_builddir}/buildtools/install/common/%{product}-ssl-setup "%{buildroot}%{_bindir}/%{product}-ssl-setup"
+cp -rf %{_builddir}/buildtools/install/common/%{product}-configuration "%{buildroot}%{_bindir}/%{product}-configuration"
+cp -rf %{_builddir}/buildtools/config/nginx/onlyoffice*.conf "%{buildroot}%{_sysconfdir}/openresty/conf.d/"
+cp -rf %{_builddir}/buildtools/config/nginx/includes/onlyoffice*.conf "%{buildroot}%{_sysconfdir}/openresty/includes/"
+cp -rf %{_builddir}/buildtools/config/* "%{buildroot}%{_sysconfdir}/onlyoffice/%{product}/"
diff --git a/install/rpm/SPECS/product.spec b/install/rpm/SPECS/product.spec
index d5b695f871..c9c3d28624 100644
--- a/install/rpm/SPECS/product.spec
+++ b/install/rpm/SPECS/product.spec
@@ -1,9 +1,10 @@
%define _binaries_in_noarch_packages_terminate_build 0
%define _build_id_links none
+%define __os_install_post /usr/lib/rpm/brp-compress %{nil}
%global product docspace
+%global product_name DocSpace
%global buildpath %{_var}/www/%{product}
-%global sourcename DocSpace-%GIT_BRANCH
Name: %{product}
Summary: Business productivity tools
@@ -19,10 +20,12 @@ Vendor: Ascensio System SIA
Packager: %{packager}
License: AGPLv3
-Source0: https://github.com/ONLYOFFICE/%{product}/archive/%GIT_BRANCH.tar.gz#/%{sourcename}.tar.gz
-Source1: https://github.com/ONLYOFFICE/document-templates/archive/main/community-server.tar.gz#/document-templates-main-community-server.tar.gz
-Source2: https://github.com/ONLYOFFICE/dictionaries/archive/master.tar.gz#/dictionaries-master.tar.gz
-Source3: %{product}.rpmlintrc
+Source0: https://github.com/ONLYOFFICE/%{product}-buildtools/archive/%{BRANCH_BUILDTOOLS}.tar.gz#/%{product_name}-buildtools-%{BRANCH_BUILDTOOLS}.tar.gz
+Source1: https://github.com/ONLYOFFICE/%{product}-client/archive/%{BRANCH_CLIENT}.tar.gz#/%{product_name}-client-%{BRANCH_CLIENT}.tar.gz
+Source2: https://github.com/ONLYOFFICE/%{product}-server/archive/%{BRANCH_SERVER}.tar.gz#/%{product_name}-server-%{BRANCH_SERVER}.tar.gz
+Source3: https://github.com/ONLYOFFICE/document-templates/archive/main/community-server.tar.gz#/document-templates-main-community-server.tar.gz
+Source4: https://github.com/ONLYOFFICE/dictionaries/archive/master.tar.gz#/dictionaries-master.tar.gz
+Source5: %{product}.rpmlintrc
BuildRequires: nodejs >= 18.0
BuildRequires: yarn
@@ -58,11 +61,15 @@ predefined permissions.
%include package.spec
%prep
+rm -rf %{_rpmdir}/%{_arch}/%{name}-* %{_builddir}/*
-rm -rf %{_rpmdir}/%{_arch}/%{name}-*
-%setup -b1 -b2 -n %{sourcename} -q
-mv -f %{_builddir}/document-templates-main-community-server/* %{_builddir}/%{sourcename}/products/ASC.Files/Server/DocStore/
-mv -f %{_builddir}/dictionaries-master/* %{_builddir}/%{sourcename}/common/Tests/Frontend.Translations.Tests/dictionaries/
+echo "%{SOURCE0} %{SOURCE1} %{SOURCE2} %{SOURCE3} %{SOURCE4}" | xargs -n 1 -P 5 tar -xzf
+cp %{SOURCE5} .
+
+mv -f %{product_name}-buildtools-%{BRANCH_BUILDTOOLS} buildtools
+mv -f %{product_name}-client-%{BRANCH_CLIENT} client
+mv -f %{product_name}-server-%{BRANCH_SERVER} server
+mv -f %{_builddir}/dictionaries-master/* %{_builddir}/client/common/Tests/Frontend.Translations.Tests/dictionaries/
%include build.spec
diff --git a/install/win/CustomActions/C#/Utils/Utils.csproj b/install/win/CustomActions/C#/Utils/Utils.csproj
index 7edee52fdf..a9c2a20426 100644
--- a/install/win/CustomActions/C#/Utils/Utils.csproj
+++ b/install/win/CustomActions/C#/Utils/Utils.csproj
@@ -1,5 +1,5 @@
-
+
Debug
x86
diff --git a/install/win/DocSpace.aip b/install/win/DocSpace.aip
index 5ff1cfcfac..da79c53627 100644
--- a/install/win/DocSpace.aip
+++ b/install/win/DocSpace.aip
@@ -50,7 +50,9 @@
+
+
@@ -58,7 +60,7 @@
-
+
@@ -210,8 +212,10 @@
+
+
@@ -264,6 +268,7 @@
+
@@ -310,8 +315,8 @@
-
-
+
+
@@ -415,11 +420,13 @@
+
+
@@ -427,6 +434,7 @@
+
@@ -474,8 +482,8 @@
-
-
+
+
@@ -501,6 +509,7 @@
+
@@ -538,6 +547,7 @@
+
@@ -1069,12 +1079,13 @@
-
+
+
@@ -1188,6 +1199,8 @@
+
+
@@ -1207,16 +1220,16 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
@@ -1241,7 +1254,6 @@
-
@@ -1271,6 +1283,7 @@
+
@@ -1295,6 +1308,7 @@
+
@@ -1304,7 +1318,7 @@
-
+
@@ -1392,6 +1406,7 @@
+
@@ -1402,26 +1417,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1431,6 +1469,9 @@
+
+
+
@@ -1524,47 +1565,80 @@
-
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/install/win/build-batch.bat b/install/win/build-batch.bat
index 138a9701c9..b7a8b0f6c4 100644
--- a/install/win/build-batch.bat
+++ b/install/win/build-batch.bat
@@ -1,111 +1,115 @@
REM echo ######## Set variables ########
set "publisher="Ascensio System SIA""
-set "nuget="%cd%\thirdparty\SimpleRestServices\src\.nuget\NuGet.exe""
+set "nuget="%cd%\server\thirdparty\SimpleRestServices\src\.nuget\NuGet.exe""
set "environment=production"
REM echo ######## Extracting and preparing files to build ########
-md build\install\win\OpenResty\tools
-md build\install\win\Files\tools
-md build\install\win\Files\Logs
-md build\install\win\Files\Data
-md build\install\win\Files\sbin
-md build\install\win\Files\products\ASC.Files\server\temp
-md build\install\win\Files\products\ASC.People\server\temp
-md build\install\win\Files\services\ASC.Data.Backup\service\temp
-md build\install\win\Files\services\ASC.Files.Service\service\temp
-md build\install\win\Files\services\ASC.Notify\service\temp
-md build\install\win\Files\services\ASC.Studio.Notify\service\temp
-md build\install\win\Files\services\ASC.Data.Backup.BackgroundTasks\service\temp
-md build\install\win\Files\services\ASC.ClearEvents\service\temp
-md build\install\win\Files\services\ASC.Web.Api\service\temp
-md build\install\win\Files\services\ASC.Web.Studio\service\temp
-md build\install\win\Files\services\ASC.Web.HealthChecks.UI\service\temp
-copy build\install\win\WinSW.NET4.exe "build\install\win\OpenResty\tools\OpenResty.exe" /y
-copy build\install\win\tools\OpenResty.xml "build\install\win\OpenResty\tools\OpenResty.xml" /y
-copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\Socket.IO.exe" /y
-copy build\install\win\tools\Socket.IO.xml "build\install\win\Files\tools\Socket.IO.xml" /y
-copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\SsoAuth.exe" /y
-copy build\install\win\tools\SsoAuth.xml "build\install\win\Files\tools\SsoAuth.xml" /y
-copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\DocEditor.exe" /y
-copy build\install\win\tools\DocEditor.xml "build\install\win\Files\tools\DocEditor.xml" /y
-copy build\install\win\WinSW3.0.0.exe "build\install\win\Files\tools\Login.exe" /y
-copy build\install\win\tools\Login.xml "build\install\win\Files\tools\Login.xml" /y
-copy "build\install\win\nginx.conf" "build\install\win\Files\nginx\conf\nginx.conf" /y
-copy "build\install\docker\config\nginx\onlyoffice-proxy.conf" "build\install\win\Files\nginx\conf\onlyoffice-proxy.conf" /y
-copy "build\install\docker\config\nginx\onlyoffice-proxy-ssl.conf" "build\install\win\Files\nginx\conf\onlyoffice-proxy-ssl.conf.tmpl" /y
-copy "build\install\docker\config\nginx\letsencrypt.conf" "build\install\win\Files\nginx\conf\includes\letsencrypt.conf" /y
-copy "build\install\win\sbin\docspace-ssl-setup.ps1" "build\install\win\Files\sbin\docspace-ssl-setup.ps1" /y
-rmdir build\install\win\publish /s /q
+md buildtools\install\win\OpenResty\tools
+md buildtools\install\win\Files\tools
+md buildtools\install\win\Files\Logs
+md buildtools\install\win\Files\Data
+md buildtools\install\win\Files\sbin
+md buildtools\install\win\Files\products\ASC.Files\server\temp
+md buildtools\install\win\Files\products\ASC.People\server\temp
+md buildtools\install\win\Files\services\ASC.Data.Backup\service\temp
+md buildtools\install\win\Files\services\ASC.Files.Service\service\temp
+md buildtools\install\win\Files\services\ASC.Notify\service\temp
+md buildtools\install\win\Files\services\ASC.Studio.Notify\service\temp
+md buildtools\install\win\Files\services\ASC.Data.Backup.BackgroundTasks\service\temp
+md buildtools\install\win\Files\services\ASC.ClearEvents\service\temp
+md buildtools\install\win\Files\services\ASC.Web.Api\service\temp
+md buildtools\install\win\Files\services\ASC.Web.Studio\service\temp
+md buildtools\install\win\Files\services\ASC.Web.HealthChecks.UI\service\temp
+copy buildtools\install\win\WinSW.NET4.exe "buildtools\install\win\OpenResty\tools\OpenResty.exe" /y
+copy buildtools\install\win\tools\OpenResty.xml "buildtools\install\win\OpenResty\tools\OpenResty.xml" /y
+copy buildtools\install\win\WinSW3.0.0.exe "buildtools\install\win\Files\tools\Socket.IO.exe" /y
+copy buildtools\install\win\tools\Socket.IO.xml "buildtools\install\win\Files\tools\Socket.IO.xml" /y
+copy buildtools\install\win\WinSW3.0.0.exe "buildtools\install\win\Files\tools\SsoAuth.exe" /y
+copy buildtools\install\win\tools\SsoAuth.xml "buildtools\install\win\Files\tools\SsoAuth.xml" /y
+copy buildtools\install\win\WinSW3.0.0.exe "buildtools\install\win\Files\tools\DocEditor.exe" /y
+copy buildtools\install\win\tools\DocEditor.xml "buildtools\install\win\Files\tools\DocEditor.xml" /y
+copy buildtools\install\win\WinSW3.0.0.exe "buildtools\install\win\Files\tools\Login.exe" /y
+copy buildtools\install\win\tools\Login.xml "buildtools\install\win\Files\tools\Login.xml" /y
+copy "buildtools\install\win\nginx.conf" "buildtools\install\win\Files\nginx\conf\nginx.conf" /y
+copy "buildtools\install\docker\config\nginx\onlyoffice-proxy.conf" "buildtools\install\win\Files\nginx\conf\onlyoffice-proxy.conf" /y
+copy "buildtools\install\docker\config\nginx\onlyoffice-proxy-ssl.conf" "buildtools\install\win\Files\nginx\conf\onlyoffice-proxy-ssl.conf.tmpl" /y
+copy "buildtools\install\docker\config\nginx\letsencrypt.conf" "buildtools\install\win\Files\nginx\conf\includes\letsencrypt.conf" /y
+copy "buildtools\install\win\sbin\docspace-ssl-setup.ps1" "buildtools\install\win\Files\sbin\docspace-ssl-setup.ps1" /y
+rmdir buildtools\install\win\publish /s /q
REM echo ######## SSL configs ########
-%sed% -i "s/the_host/host/g" build\install\win\Files\nginx\conf\onlyoffice-proxy.conf build\install\win\Files\nginx\conf\onlyoffice-proxy-ssl.conf.tmpl
-%sed% -i "s/the_scheme/scheme/g" build\install\win\Files\nginx\conf\onlyoffice-proxy.conf build\install\win\Files\nginx\conf\onlyoffice-proxy-ssl.conf.tmpl
-%sed% -i "s/ssl_dhparam \/etc\/ssl\/certs\/dhparam.pem;/#ssl_dhparam \/etc\/ssl\/certs\/dhparam.pem;/" build\install\win\Files\nginx\conf\onlyoffice-proxy-ssl.conf.tmpl
-%sed% -i "s_\(.*root\).*;_\1 \"{APPDIR}letsencrypt\";_g" -i build\install\win\Files\nginx\conf\includes\letsencrypt.conf
+%sed% -i "s/the_host/host/g" buildtools\install\win\Files\nginx\conf\onlyoffice-proxy.conf buildtools\install\win\Files\nginx\conf\onlyoffice-proxy-ssl.conf.tmpl
+%sed% -i "s/the_scheme/scheme/g" buildtools\install\win\Files\nginx\conf\onlyoffice-proxy.conf buildtools\install\win\Files\nginx\conf\onlyoffice-proxy-ssl.conf.tmpl
+%sed% -i "s/ssl_dhparam \/etc\/ssl\/certs\/dhparam.pem;/#ssl_dhparam \/etc\/ssl\/certs\/dhparam.pem;/" buildtools\install\win\Files\nginx\conf\onlyoffice-proxy-ssl.conf.tmpl
+%sed% -i "s_\(.*root\).*;_\1 \"{APPDIR}letsencrypt\";_g" -i buildtools\install\win\Files\nginx\conf\includes\letsencrypt.conf
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
+del /f /q buildtools\install\win\Files\config\*.test.json
+del /f /q buildtools\install\win\Files\config\*.dev.json
::default logging to warning
-%sed% "s_\(\"Default\":\).*,_\1 \"Warning\",_g" -i build\install\win\Files\config\appsettings.json
-%sed% "s_\(\"logLevel\":\).*_\1 \"warning\"_g" -i build\install\win\Files\config\appsettings.services.json
-%sed% "/\"debug-info\": {/,/}/ s/\(\"enabled\": \)\".*\"/\1\"false\"/" -i build\install\win\Files\config\appsettings.json
+%sed% "s_\(\"Default\":\).*,_\1 \"Warning\",_g" -i buildtools\install\win\Files\config\appsettings.json
+%sed% "s_\(\"logLevel\":\).*_\1 \"warning\"_g" -i buildtools\install\win\Files\config\appsettings.services.json
+%sed% "/\"debug-info\": {/,/}/ s/\(\"enabled\": \)\".*\"/\1\"false\"/" -i buildtools\install\win\Files\config\appsettings.json
-%sed% "s_\(\"samesite\":\).*,_\1 \"None\",_g" -i build\install\win\Files\config\appsettings.json
+%sed% "s_\(\"samesite\":\).*,_\1 \"None\",_g" -i buildtools\install\win\Files\config\appsettings.json
::redirectUrl value replacement
-%sed% "s/teamlab.info/onlyoffice.com/g" -i build\install\win\Files\config/autofac.consumers.json
-%sed% "s_\(\"wrongPortalNameUrl\":\).*,_\1 \"\",_g" -i build\install\win\Files\public\scripts\config.json
+%sed% "s/teamlab.info/onlyoffice.com/g" -i buildtools\install\win\Files\config/autofac.consumers.json
+%sed% "s_\(\"wrongPortalNameUrl\":\).*,_\1 \"\",_g" -i buildtools\install\win\Files\public\scripts\config.json
REM echo ######## Remove AWSTarget from nlog.config ########
-%sed% -i "//d; //d" build\install\win\Files\config\nlog.config
-del /q build\install\win\Files\config\sed*
+%sed% -i "//d; //d" buildtools\install\win\Files\config\nlog.config
::edit environment
-%sed% -i "s/\(\W\)PRODUCT.ENVIRONMENT.SUB\(\W\)/\1%environment%\2/g" build\install\win\DocSpace.aip
+%sed% -i "s/\(\W\)PRODUCT.ENVIRONMENT.SUB\(\W\)/\1%environment%\2/g" buildtools\install\win\DocSpace.aip
::delete nginx configs
-del /f /q build\install\win\Files\nginx\conf\onlyoffice-login.conf
-del /f /q build\install\win\Files\nginx\conf\onlyoffice-story.conf
+del /f /q buildtools\install\win\Files\nginx\conf\onlyoffice-login.conf
+del /f /q buildtools\install\win\Files\nginx\conf\onlyoffice-story.conf
+::Remove unused services from HealthCheck | Bug 64516
+%sed% -i "/\"Name\": \"ASC.ApiCache\"/,/{/d" buildtools\install\win\Files\services\ASC.Web.HealthChecks.UI\service\appsettings.json
+%sed% -i "/\"Name\": \"ASC.ApiSystem\"/,/{/d" buildtools\install\win\Files\services\ASC.Web.HealthChecks.UI\service\appsettings.json
+
+::configure nuget.config
+copy "server\NuGet.config" . /y
+%sed% -i "s/\.nuget\\packages/server\\.nuget\\packages/g" NuGet.config
REM echo ######## Build Utils ########
-%nuget% install %cd%\build\install\win\CustomActions\C#\Utils\packages.config -OutputDirectory %cd%\build\install\win\CustomActions\C#\Utils\packages
-%msbuild% build\install\win\CustomActions\C#\Utils\Utils.csproj
-copy build\install\win\CustomActions\C#\Utils\bin\Debug\Utils.CA.dll build\install\win\Utils.CA.dll /y
-rmdir build\install\win\CustomActions\C#\Utils\bin /s /q
-rmdir build\install\win\CustomActions\C#\Utils\obj /s /q
+%nuget% install %cd%\buildtools\install\win\CustomActions\C#\Utils\packages.config -OutputDirectory %cd%\buildtools\install\win\CustomActions\C#\Utils\packages
+%msbuild% buildtools\install\win\CustomActions\C#\Utils\Utils.csproj
+copy buildtools\install\win\CustomActions\C#\Utils\bin\Debug\Utils.CA.dll buildtools\install\win\Utils.CA.dll /y
+rmdir buildtools\install\win\CustomActions\C#\Utils\bin /s /q
+rmdir buildtools\install\win\CustomActions\C#\Utils\obj /s /q
REM echo ######## Delete temp files ########
-del /f /q build\install\win\*.back.*
+del /f /q buildtools\install\win\*.back.*
+del /f /q sed*
REM echo ######## Build MySQL Server Installer ########
-iscc /Qp /S"byparam="signtool" sign /a /n "%publisher%" /t http://timestamp.digicert.com $f" "build\install\win\MySQL Server Installer Runner.iss"
+iscc /Qp /S"byparam="signtool" sign /a /n "%publisher%" /t http://timestamp.digicert.com $f" "buildtools\install\win\MySQL Server Installer Runner.iss"
REM echo ######## Build OpenResty ########
IF "%SignBuild%"=="true" (
-%AdvancedInstaller% /edit build\install\win\OpenResty.aip /SetSig
-%AdvancedInstaller% /edit build\install\win\OpenResty.aip /SetDigitalCertificateFile -file %onlyoffice_codesign_path% -password "%onlyoffice_codesign_password%"
+%AdvancedInstaller% /edit buildtools\install\win\OpenResty.aip /SetSig
+%AdvancedInstaller% /edit buildtools\install\win\OpenResty.aip /SetDigitalCertificateFile -file %onlyoffice_codesign_path% -password "%onlyoffice_codesign_password%"
)
-%AdvancedInstaller% /rebuild build\install\win\OpenResty.aip
+%AdvancedInstaller% /rebuild buildtools\install\win\OpenResty.aip
REM echo ######## Build DocSpace package ########
-%AdvancedInstaller% /edit build\install\win\DocSpace.aip /SetVersion %BUILD_VERSION%.%BUILD_NUMBER%
+%AdvancedInstaller% /edit buildtools\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 buildtools\install\win\DocSpace.aip /SetSig
+%AdvancedInstaller% /edit buildtools\install\win\DocSpace.aip /SetDigitalCertificateFile -file %onlyoffice_codesign_path% -password "%onlyoffice_codesign_password%"
)
-%AdvancedInstaller% /rebuild build\install\win\DocSpace.aip
+:: Build DocSpace Community
+%AdvancedInstaller% /rebuild buildtools\install\win\DocSpace.aip -buildslist DOCSPACE_COMMUNITY
-REM echo ######## Build DocSpace Enterprise package ########
-%AdvancedInstaller% /edit build\install\win\DocSpace.Enterprise.aip /SetVersion %BUILD_VERSION%.%BUILD_NUMBER%
+:: Build DocSpace Enterprise
+copy "buildtools\install\win\Resources\License_Enterprise.rtf" "buildtools\install\win\Resources\License.rtf" /y
+copy "buildtools\install\win\Resources\License_Enterprise_Redist.rtf" "buildtools\install\win\Resources\License_Redist.rtf" /y
-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
\ No newline at end of file
+%AdvancedInstaller% /rebuild buildtools\install\win\DocSpace.aip -buildslist DOCSPACE_ENTERPRISE
diff --git a/install/win/build-download-prereq.ps1 b/install/win/build-download-prereq.ps1
index 7a7413cdd8..8e5f355126 100644
--- a/install/win/build-download-prereq.ps1
+++ b/install/win/build-download-prereq.ps1
@@ -86,7 +86,7 @@ $prerequisites = @(
}
)
-$path_nuget_packages = "${pwd}\.nuget\packages\"
+$path_nuget_packages = "${pwd}\server\.nuget\packages\"
$nuget_packages = @(
@{
diff --git a/install/win/frontend-copy.bat b/install/win/frontend-copy.bat
index 0cdfe05103..9373971a86 100644
--- a/install/win/frontend-copy.bat
+++ b/install/win/frontend-copy.bat
@@ -16,7 +16,7 @@ if defined SecondArg (
set PathToAppFolder=%FirstArg%\publish
)
-xcopy "%PathToRepository%\buildtools\deploy\public" "%PathToAppFolder%\public" /s /y /b /i
-xcopy "%PathToRepository%\buildtools\deploy\client" "%PathToAppFolder%\client" /s /y /b /i
-xcopy "%PathToRepository%\config\nginx" "%PathToAppFolder%\nginx\conf" /s /y /b /i
-xcopy "%PathToRepository%\config\*" "%PathToAppFolder%\config" /y /b /i
+xcopy "%PathToRepository%\publish\web\public" "%PathToAppFolder%\public" /s /y /b /i
+xcopy "%PathToRepository%\publish\web\client" "%PathToAppFolder%\client" /s /y /b /i
+xcopy "%PathToRepository%\buildtools\config\nginx" "%PathToAppFolder%\nginx\conf" /s /y /b /i
+xcopy "%PathToRepository%\buildtools\config\*" "%PathToAppFolder%\config" /y /b /i
diff --git a/install/win/publish-script.bat b/install/win/publish-script.bat
index 548f9c7d6f..30c87d87f8 100644
--- a/install/win/publish-script.bat
+++ b/install/win/publish-script.bat
@@ -41,7 +41,7 @@ xcopy "%PathToRepository%\common\ASC.SsoAuth" "%PathToAppFolder%\services\ASC.Ss
rem backend services (Nodejs) in directory 'products'
mkdir "%PathToAppFolder%\products\ASC.Login\login"
-xcopy "%PathToRepository%\buildtools\deploy\login" "%PathToAppFolder%\products\ASC.Login\login" /s /y /b /i
+xcopy "%PathToRepository%\..\publish\web\login" "%PathToAppFolder%\products\ASC.Login\login" /s /y /b /i
mkdir "%PathToAppFolder%\products\ASC.Files\editor"
-xcopy "%PathToRepository%\buildtools\deploy\editor" "%PathToAppFolder%\products\ASC.Files\editor" /s /y /b /i
+xcopy "%PathToRepository%\..\publish\web\editor" "%PathToAppFolder%\products\ASC.Files\editor" /s /y /b /i
diff --git a/install/win/tools/DocEditor.xml b/install/win/tools/DocEditor.xml
index 99b8557128..ea5eff2e8f 100644
--- a/install/win/tools/DocEditor.xml
+++ b/install/win/tools/DocEditor.xml
@@ -4,6 +4,7 @@
ONLYOFFICE DocSpace DocEditor
RealTime
Automatic
+ false
node
"{APPDIR}products\ASC.Files\editor\server.js"
diff --git a/install/win/tools/Login.xml b/install/win/tools/Login.xml
index 82299d38e0..379a6961c2 100644
--- a/install/win/tools/Login.xml
+++ b/install/win/tools/Login.xml
@@ -4,6 +4,7 @@
ONLYOFFICE DocSpace Login
RealTime
Automatic
+ false
node
"{APPDIR}products\ASC.Login\login\server.js"
diff --git a/install/win/tools/Socket.IO.xml b/install/win/tools/Socket.IO.xml
index be40e5d953..8377604e7b 100644
--- a/install/win/tools/Socket.IO.xml
+++ b/install/win/tools/Socket.IO.xml
@@ -4,6 +4,7 @@
ONLYOFFICE DocSpace Socket.IO
RealTime
Automatic
+ false
node
"{APPDIR}services\ASC.Socket.IO\service\server.js"
diff --git a/install/win/tools/SsoAuth.xml b/install/win/tools/SsoAuth.xml
index 6d46ff54d3..c14532ae75 100644
--- a/install/win/tools/SsoAuth.xml
+++ b/install/win/tools/SsoAuth.xml
@@ -4,6 +4,7 @@
ONLYOFFICE DocSpace ASC.SsoAuth.Svc
RealTime
Automatic
+ false
node
"{APPDIR}services\ASC.SsoAuth\service\app.js"
diff --git a/install/win/utils.vbs b/install/win/utils.vbs
index d23642b75e..7a02458a5c 100644
--- a/install/win/utils.vbs
+++ b/install/win/utils.vbs
@@ -121,7 +121,34 @@ End Function
Function SetMACHINEKEY
On Error Resume Next
- Session.Property("MACHINE_KEY") = RandomString( 12 )
+ Dim strFilePath, strJSON, strPattern, objRegExp, objMatches
+
+ ' Specify the path to your JSON file
+ strFilePath = Session.Property("APPDIR") & "config\appsettings.production.json"
+
+ ' Read the JSON content
+ Set objFSO = CreateObject("Scripting.FileSystemObject")
+ Set objFile = objFSO.OpenTextFile(strFilePath, 1)
+ strJSON = objFile.ReadAll
+ objFile.Close
+
+ ' Define the regular expression pattern to match the "machinekey" value
+ strPattern = """machinekey"": ""([^""]+)"""
+
+ ' Create a regular expression object and execute the pattern on the JSON string
+ Set objRegExp = New RegExp
+ objRegExp.Global = False
+ objRegExp.IgnoreCase = True
+ objRegExp.Pattern = strPattern
+
+ Set objMatches = objRegExp.Execute(strJSON)
+
+ ' Check if a match was found
+ If objMatches.Count > 0 Then
+ Session.Property("MACHINE_KEY") = objMatches(0).Submatches(0)
+ Else
+ Session.Property("MACHINE_KEY") = RandomString(16)
+ End If
End Function
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000..edc51ee8c8
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,3 @@
+gitdb==4.0.11
+GitPython==3.1.40
+smmap==5.0.1
diff --git a/run.translations.tests.sh b/run.translations.tests.sh
index 82c630b53e..ced8d7652e 100755
--- a/run.translations.tests.sh
+++ b/run.translations.tests.sh
@@ -5,4 +5,4 @@ dir=$(builtin cd $rd/../; pwd)
echo "Root directory:" $dir
-dotnet test $dir/client/common/Tests/Frontend.Translations.Tests/Frontend.Translations.Tests.csproj --filter "TestCategory=Locales" -l:html --results-directory "$dir/TestsResults" --environment "BASE_DIR=$dir"
\ No newline at end of file
+dotnet test $dir/client/common/Tests/Frontend.Translations.Tests/Frontend.Translations.Tests.csproj --filter "TestCategory=Locales" -l:html --results-directory "$dir/TestsResults" --environment "BASE_DIR=$dir/client"
\ No newline at end of file
diff --git a/start/restart.backend.docker.bat b/start/restart.backend.docker.bat
deleted file mode 100644
index 464988e1fd..0000000000
--- a/start/restart.backend.docker.bat
+++ /dev/null
@@ -1,7 +0,0 @@
-@echo off
-
-pwsh %~dp0/restart.backend.docker.ps1 %*
-
-echo.
-
-pause
\ No newline at end of file
diff --git a/start/restart.backend.docker.ps1 b/start/restart.backend.docker.ps1
deleted file mode 100644
index c42a57a008..0000000000
--- a/start/restart.backend.docker.ps1
+++ /dev/null
@@ -1,5 +0,0 @@
-# Stop all backend services"
-& "$PSScriptRoot\stop.backend.docker.ps1"
-
-# Start all backend services"
-& "$PSScriptRoot\start.backend.docker.ps1"
\ No newline at end of file
diff --git a/start/restart.backend.docker.py b/start/restart.backend.docker.py
new file mode 100644
index 0000000000..534fc24a60
--- /dev/null
+++ b/start/restart.backend.docker.py
@@ -0,0 +1,16 @@
+#!/usr/bin/python3
+
+import subprocess
+import time
+import os
+
+rd = os.path.dirname(__file__)
+
+start = time.time()
+
+print("Restart all backend services (containers)")
+subprocess.run(["python", os.path.join(rd, "stop.backend.docker.py")])
+subprocess.run(["python", os.path.join(rd, "start.backend.docker.py")])
+
+end = time.time()
+print("\nElapsed time", end - start)
\ No newline at end of file
diff --git a/start/restart.backend.docker.sh b/start/restart.backend.docker.sh
deleted file mode 100644
index 4edfe6df43..0000000000
--- a/start/restart.backend.docker.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-
-dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
-echo "Root directory:" $dir
-
-$dir/stop.backend.docker.sh
-
-$dir/start.backend.docker.sh
\ No newline at end of file
diff --git a/start/start.backend.docker.bat b/start/start.backend.docker.bat
deleted file mode 100644
index 090dcdb495..0000000000
--- a/start/start.backend.docker.bat
+++ /dev/null
@@ -1,7 +0,0 @@
-@echo off
-
-pwsh %~dp0/start.backend.docker.ps1 %*
-
-echo.
-
-pause
\ No newline at end of file
diff --git a/start/start.backend.docker.ps1 b/start/start.backend.docker.ps1
deleted file mode 100644
index 5c1109bec1..0000000000
--- a/start/start.backend.docker.ps1
+++ /dev/null
@@ -1,34 +0,0 @@
-$PSversionMajor = $PSVersionTable.PSVersion | sort-object major | ForEach-Object { $_.major }
-$PSversionMinor = $PSVersionTable.PSVersion | sort-object minor | ForEach-Object { $_.minor }
-
-if ($PSversionMajor -lt 7 -or $PSversionMinor -lt 2) {
- Write-Error "Powershell version must be greater than or equal to 7.2."
- exit
-}
-
-$RootDir = Split-Path (Split-Path -Parent $PSScriptRoot) -Parent
-$DockerDir = ($RootDir + "\buildtools\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")
-$Management = ($LocalIp + ":5015")
-
-Set-Location -Path $DockerDir
-
-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:SERVICE_MANAGEMENT=$Management
-$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
\ No newline at end of file
diff --git a/start/start.backend.docker.py b/start/start.backend.docker.py
new file mode 100644
index 0000000000..7ba4b52ac8
--- /dev/null
+++ b/start/start.backend.docker.py
@@ -0,0 +1,15 @@
+#!/usr/bin/python3
+
+import subprocess
+import time
+
+start = time.time()
+container_ids = subprocess.check_output(["docker", "ps", "-aq", "-f", "label=com.docker.compose.project=docker"], encoding='utf-8')
+containers = container_ids.strip().split()
+
+if containers:
+ print("Start all backend services (containers)")
+ subprocess.run(['docker', 'start'] + containers, check=True)
+
+end = time.time()
+print("\nElapsed time", end - start)
\ No newline at end of file
diff --git a/start/start.backend.docker.sh b/start/start.backend.docker.sh
deleted file mode 100644
index fb2bd07c16..0000000000
--- a/start/start.backend.docker.sh
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/bin/bash
-
-
-rd="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
-echo "Run script directory:" $dir
-
-dir=$(builtin cd $rd/../../; pwd)
-
-echo "Root directory:" $dir
-
-cd $dir/buildtools/install/docker/
-
-docker_dir="$( pwd )"
-
-echo "Docker directory:" $docker_dir
-
-local_ip=$(ipconfig getifaddr en0)
-
-echo "LOCAL IP: $local_ip"
-
-doceditor=${local_ip}:5013
-login=${local_ip}:5011
-client=${local_ip}:5001
-management=${local_ip}:5015
-
-echo "SERVICE_DOCEDITOR: $doceditor"
-echo "SERVICE_LOGIN: $login"
-echo "SERVICE_CLIENT: $client"
-echo "SERVICE_MANAGEMENT: $management"
-
-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 \
-SERVICE_MANAGEMENT=$management \
-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
diff --git a/start/stop.backend.docker.bat b/start/stop.backend.docker.bat
deleted file mode 100644
index c68a50e400..0000000000
--- a/start/stop.backend.docker.bat
+++ /dev/null
@@ -1,7 +0,0 @@
-@echo off
-
-pwsh %~dp0/stop.backend.docker.ps1
-
-echo.
-
-pause
\ No newline at end of file
diff --git a/start/stop.backend.docker.ps1 b/start/stop.backend.docker.ps1
deleted file mode 100644
index b62cc6f7ea..0000000000
--- a/start/stop.backend.docker.ps1
+++ /dev/null
@@ -1,17 +0,0 @@
-$PSversionMajor = $PSVersionTable.PSVersion | sort-object major | ForEach-Object { $_.major }
-$PSversionMinor = $PSVersionTable.PSVersion | sort-object minor | ForEach-Object { $_.minor }
-
-if ($PSversionMajor -lt 7 -or $PSversionMinor -lt 2) {
- Write-Error "Powershell version must be greater than or equal to 7.2."
- exit
-}
-
-$Containers = docker ps -a -f "name=^onlyoffice" --format="{{.ID}} {{.Names}}" | Select-String -Pattern ("mysql|rabbitmq|redis|elasticsearch|documentserver") -NotMatch | ConvertFrom-String | ForEach-Object P1
-
-if (-not $Containers) {
- Write-Host "No containers to stop" -ForegroundColor Blue
- exit
-}
-
-Write-Host "Stop all backend services (containers)" -ForegroundColor Green
-docker stop $Containers
\ No newline at end of file
diff --git a/start/stop.backend.docker.py b/start/stop.backend.docker.py
new file mode 100755
index 0000000000..574c0746a5
--- /dev/null
+++ b/start/stop.backend.docker.py
@@ -0,0 +1,17 @@
+#!/usr/bin/python3
+
+import subprocess
+import time
+
+start = time.time()
+container_ids = subprocess.check_output(["docker", "ps", "-q", "-f", "label=com.docker.compose.project=docker"], encoding='utf-8')
+containers = container_ids.strip().split()
+
+if containers:
+ print("Stop all backend services (containers)")
+ subprocess.run(['docker', 'stop'] + containers, check=True)
+else:
+ print("No containers to stop")
+
+end = time.time()
+print("\nElapsed time", end - start)
diff --git a/start/stop.backend.docker.sh b/start/stop.backend.docker.sh
deleted file mode 100644
index 6a6154bf38..0000000000
--- a/start/stop.backend.docker.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-
-echo "Stop all backend services (containers)"
-docker stop $(docker ps -a | egrep "onlyoffice" | egrep -v "mysql|rabbitmq|redis|elasticsearch|documentserver" | awk 'NR>0 {print $1}')
\ No newline at end of file