From 62c6f366dfd93a415393014134fcea818ead5b21 Mon Sep 17 00:00:00 2001 From: SuhorukovAnton Date: Thu, 6 Oct 2022 15:51:15 +0300 Subject: [PATCH 01/20] fix local restore --- common/ASC.Data.Backup.Core/BackupAjaxHandler.cs | 2 +- .../BackupFileUploadHandler.cs | 9 +-------- common/services/ASC.Data.Backup/GlobalUsings.cs | 9 +++------ common/services/ASC.Data.Backup/Startup.cs | 14 ++++++++++++-- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs b/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs index 59de7d95f5..ad0960f45a 100644 --- a/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs +++ b/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs @@ -385,7 +385,7 @@ public class BackupAjaxHandler public string GetTmpFilePath() { - var folder = Path.Combine(_tempPath.GetTempPath(), BackupTempFolder, _tenantManager.GetCurrentTenant().Id.ToString()); + var folder = Path.Combine(_tempPath.GetTempPath().Replace("\\ASC.Data.Backup\\", "\\ASC.Data.Backup.BackgroundTasks\\"), BackupTempFolder, _tenantManager.GetCurrentTenant().Id.ToString()); if (!Directory.Exists(folder)) { diff --git a/common/ASC.Data.Backup.Core/BackupFileUploadHandler.cs b/common/ASC.Data.Backup.Core/BackupFileUploadHandler.cs index 181d1b8bb8..d387b36139 100644 --- a/common/ASC.Data.Backup.Core/BackupFileUploadHandler.cs +++ b/common/ASC.Data.Backup.Core/BackupFileUploadHandler.cs @@ -27,8 +27,7 @@ namespace ASC.Web.Studio.Core.Backup; public class BackupFileUploadHandler -{ - private const long MaxBackupFileSize = 1024L * 1024L * 1024L; +{ public BackupFileUploadHandler(RequestDelegate next) { @@ -53,12 +52,6 @@ public class BackupFileUploadHandler var file = context.Request.Form.Files[0]; - if (file.Length <= 0 || file.Length > MaxBackupFileSize) - { - result = Error($"File size must be greater than 0 and less than {MaxBackupFileSize} bytes"); - } - - var filePath = backupAjaxHandler.GetTmpFilePath(); if (File.Exists(filePath)) diff --git a/common/services/ASC.Data.Backup/GlobalUsings.cs b/common/services/ASC.Data.Backup/GlobalUsings.cs index 9423bc1dfc..e1f011542c 100644 --- a/common/services/ASC.Data.Backup/GlobalUsings.cs +++ b/common/services/ASC.Data.Backup/GlobalUsings.cs @@ -39,6 +39,7 @@ global using ASC.Data.Backup.ApiModels; global using ASC.Data.Backup.Contracts; global using ASC.Data.Backup.Core.IntegrationEvents.Events; global using ASC.Data.Backup.EF.Context; +global using ASC.Data.Backup.Extension; global using ASC.Data.Backup.Services; global using ASC.EventBus.Abstractions; global using ASC.Files.Core.EF; @@ -51,16 +52,12 @@ global using Autofac; global using Microsoft.AspNetCore.Builder; global using Microsoft.AspNetCore.Hosting; +global using Microsoft.AspNetCore.Http.Features; global using Microsoft.AspNetCore.Mvc; +global using Microsoft.AspNetCore.Server.Kestrel.Core; global using Microsoft.Extensions.Configuration; global using Microsoft.Extensions.DependencyInjection; global using Microsoft.Extensions.Hosting; global using Microsoft.Extensions.Hosting.WindowsServices; global using static ASC.Data.Backup.BackupAjaxHandler; - -global using ASC.Data.Backup.Extension; - -global using NLog.Extensions.Logging; -global using NLog.Web; -global using NLog.AWS.Logger; \ No newline at end of file diff --git a/common/services/ASC.Data.Backup/Startup.cs b/common/services/ASC.Data.Backup/Startup.cs index 0fd8242c7d..89e720b64c 100644 --- a/common/services/ASC.Data.Backup/Startup.cs +++ b/common/services/ASC.Data.Backup/Startup.cs @@ -22,8 +22,8 @@ // // All the Product's GUI elements, including illustrations and icon sets, as well as technical writing // content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 -// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - +// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + namespace ASC.Data.Backup; public class Startup : BaseStartup @@ -38,6 +38,16 @@ public class Startup : BaseStartup { base.ConfigureServices(services); + var maxRequestLimit = 1024L * 1024L * 1024L; + services.Configure(options => + { + options.Limits.MaxRequestBodySize = maxRequestLimit; + }); + services.Configure(x => + { + x.MultipartBodyLengthLimit = maxRequestLimit; + }); + services.AddBaseDbContextPool(); services.AddBaseDbContextPool(); From ded6b08e0ea8a57c3e79bc10bbbb37cb5092f7d9 Mon Sep 17 00:00:00 2001 From: SuhorukovAnton Date: Tue, 11 Oct 2022 15:29:23 +0300 Subject: [PATCH 02/20] fix GetTmpFilePath --- common/ASC.Data.Backup.Core/BackupAjaxHandler.cs | 16 ++++++++++------ common/ASC.Data.Backup.Core/GlobalUsings.cs | 2 +- config/storage.json | 8 ++++++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs b/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs index ad0960f45a..f7ab9eee9d 100644 --- a/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs +++ b/common/ASC.Data.Backup.Core/BackupAjaxHandler.cs @@ -22,8 +22,8 @@ // // All the Product's GUI elements, including illustrations and icon sets, as well as technical writing // content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 -// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode - +// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + namespace ASC.Data.Backup; [Scope] @@ -40,8 +40,9 @@ public class BackupAjaxHandler private readonly ConsumerFactory _consumerFactory; private readonly BackupService _backupService; private readonly TempPath _tempPath; + private readonly StorageFactory _storageFactory; - private const string BackupTempFolder = "backup"; + private const string BackupTempModule = "backup_temp"; private const string BackupFileName = "backup.tmp"; #region backup @@ -57,7 +58,8 @@ public class BackupAjaxHandler UserManager userManager, TenantExtra tenantExtra, ConsumerFactory consumerFactory, - TempPath tempPath) + TempPath tempPath, + StorageFactory storageFactory) { _tenantManager = tenantManager; _messageService = messageService; @@ -69,7 +71,8 @@ public class BackupAjaxHandler _tenantExtra = tenantExtra; _consumerFactory = consumerFactory; _backupService = backupService; - _tempPath = tempPath; + _tempPath = tempPath; + _storageFactory = storageFactory; } public void StartBackup(BackupStorageType storageType, Dictionary storageParams) @@ -385,7 +388,8 @@ public class BackupAjaxHandler public string GetTmpFilePath() { - var folder = Path.Combine(_tempPath.GetTempPath().Replace("\\ASC.Data.Backup\\", "\\ASC.Data.Backup.BackgroundTasks\\"), BackupTempFolder, _tenantManager.GetCurrentTenant().Id.ToString()); + var discStore = _storageFactory.GetStorage("", _tenantManager.GetCurrentTenant().Id.ToString(), BackupTempModule, null) as DiscDataStore; + var folder = discStore.GetPhysicalPath("", ""); if (!Directory.Exists(folder)) { diff --git a/common/ASC.Data.Backup.Core/GlobalUsings.cs b/common/ASC.Data.Backup.Core/GlobalUsings.cs index 13b4eeec4d..c488a83300 100644 --- a/common/ASC.Data.Backup.Core/GlobalUsings.cs +++ b/common/ASC.Data.Backup.Core/GlobalUsings.cs @@ -72,6 +72,7 @@ global using ASC.Data.Backup.Tasks.Modules; global using ASC.Data.Backup.Utils; global using ASC.Data.Storage; global using ASC.Data.Storage.Configuration; +global using ASC.Data.Storage.DiscStorage; global using ASC.EventBus.Events; global using ASC.Files.Core; global using ASC.MessagingSystem.Core; @@ -103,6 +104,5 @@ global using Microsoft.Extensions.Logging; global using MySql.Data.MySqlClient; global using Newtonsoft.Json; -global using Newtonsoft.Json.Linq; global using ProtoBuf; diff --git a/config/storage.json b/config/storage.json index 7354eb00a5..33ab61c3ee 100644 --- a/config/storage.json +++ b/config/storage.json @@ -249,6 +249,14 @@ "virtualpath": "~/studio/{0}/backup", "expires": "0:10:0", "disableEncryption": true + }, + { + "name": "backup_temp", + "visible": false, + "type": "disc", + "path": "$STORAGE_ROOT\\Studio\\{0}\\temp\\backup", + "expires": "0:10:0", + "disableEncryption": true }, { "name": "customnavigation", From 8b52d93fd3b652157f49272acb566e3c5511ba74 Mon Sep 17 00:00:00 2001 From: Alexey Safronov Date: Tue, 11 Oct 2022 16:01:03 +0300 Subject: [PATCH 03/20] Init backend and environment build and run in docker --- build/install/docker/.env.dev | 99 +++++ build/install/docker/Dockerfile.dev | 359 ++++++++++++++++++ build/install/docker/build.dev.yml | 142 +++++++ build/install/docker/db.arm.yml | 35 ++ build/install/docker/docspace.dev.yml | 191 ++++++++++ build/run/macos/backend-environment.docker.sh | 15 + build/run/macos/backend.docker.sh | 16 + 7 files changed, 857 insertions(+) create mode 100644 build/install/docker/.env.dev create mode 100644 build/install/docker/Dockerfile.dev create mode 100644 build/install/docker/build.dev.yml create mode 100644 build/install/docker/db.arm.yml create mode 100644 build/install/docker/docspace.dev.yml create mode 100755 build/run/macos/backend-environment.docker.sh create mode 100755 build/run/macos/backend.docker.sh diff --git a/build/install/docker/.env.dev b/build/install/docker/.env.dev new file mode 100644 index 0000000000..743393db77 --- /dev/null +++ b/build/install/docker/.env.dev @@ -0,0 +1,99 @@ +# docker-compose tags # + PRODUCT=onlyoffice + REPO=${PRODUCT} + STATUS="" + DOCKER_IMAGE_PREFIX=${STATUS}docspace + DOCKER_TAG=latest + CONTAINER_PREFIX=${PRODUCT}- + MYSQL_VERSION=8.0.18 + ELK_VERSION=7.13.1 + SERVICE_PORT=5050 + DOCUMENT_SERVER_IMAGE_NAME=onlyoffice/4testing-documentserver-ee:latest + DOCKERFILE=Dockerfile.dev + +# zookeeper # + ZOO_PORT=2181 + ZOO_HOST=${CONTAINER_PREFIX}zookeeper + ZOO_SERVER=server.1=${ZOO_HOST}:2888:3888 + +# kafka # + KAFKA_HOST=${CONTAINER_PREFIX}kafka + KAFKA_ADVERTISED_LISTENERS=LISTENER_DOCKER_INTERNAL://${KAFKA_HOST}:9092 + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=LISTENER_DOCKER_INTERNAL:PLAINTEXT,LISTENER_DOCKER_EXTERNAL:PLAINTEXT + KAFKA_INTER_BROKER_LISTENER_NAME=LISTENER_DOCKER_INTERNAL + KAFKA_ZOOKEEPER_CONNECT=${ZOO_HOST}:2181 + KAFKA_BROKER_ID=1 + KAFKA_LOG4J_LOGGERS=kafka.controller=INFO,kafka.producer.async.DefaultEventHandler=INFO,state.change.logger=INFO + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 + +# elasticsearch # + ELK_HOST=${CONTAINER_PREFIX}elasticsearch + +# app service environment # + ENV_EXTENSION=none + APP_DOTNET_ENV= + APP_CORE_BASE_DOMAIN=localhost + APP_CORE_MACHINEKEY=your_core_machinekey + + DOCUMENT_SERVER_JWT_SECRET=your_jwt_secret + DOCUMENT_SERVER_JWT_HEADER=AuthorizationJwt + DOCUMENT_SERVER_URL_PUBLIC=/ds-vpath/ + DOCUMENT_SERVER_HOST=${CONTAINER_PREFIX}document-server + DOCUMENT_SERVER_URL_INTERNAL=http://${DOCUMENT_SERVER_HOST}/ + + MYSQL_ROOT_PASSWORD=my-secret-pw + MYSQL_DATABASE=${PRODUCT} + MYSQL_USER=${PRODUCT}_user + MYSQL_PASSWORD=${PRODUCT}_pass + MYSQL_HOST=${CONTAINER_PREFIX}mysql-server + DATABASE_MIGRATION=false + +# service host # + API_SYSTEM_HOST=${CONTAINER_PREFIX}api-system + BACKUP_HOST=${CONTAINER_PREFIX}backup + BACKUP_BACKGRUOND_TASKS_HOST=${CONTAINER_PREFIX}backup-background-tasks + CLEAR_EVENTS_HOST=${CONTAINER_PREFIX}clear-events + MIGRATION_HOST=${CONTAINER_PREFIX}migration + WEBHOOKS_SERVICE_HOST=${CONTAINER_PREFIX}webhooks-service + STORAGE_ENCRYPTION_HOST=${CONTAINER_PREFIX}storage-encryption + FILES_HOST=${CONTAINER_PREFIX}files + FILES_SERVICES_HOST=${CONTAINER_PREFIX}files-services + STORAGE_MIGRATION_HOST=${CONTAINER_PREFIX}storage-migration + NOTIFY_HOST=${CONTAINER_PREFIX}notify + PEOPLE_SERVER_HOST=${CONTAINER_PREFIX}people-server + SOCKET_HOST=${CONTAINER_PREFIX}socket + STUDIO_NOTIFY_HOST=${CONTAINER_PREFIX}studio-notify + TELEGRAM_SERVICE_HOST=${CONTAINER_PREFIX}telegram-service + URLSHORTENER_HOST=${CONTAINER_PREFIX}urlshortener + API_HOST=${CONTAINER_PREFIX}api + STUDIO_HOST=${CONTAINER_PREFIX}studio + SSOAUTH_HOST=${CONTAINER_PREFIX}ssoauth + MIGRATION_RUNNER_HOST=${CONTAINER_PREFIX}migration-runner + PROXY_HOST=${CONTAINER_PREFIX}proxy + DOCEDITOR_HOST=${CONTAINER_PREFIX}doceditor + LOGIN_HOST=${CONTAINER_PREFIX}login + +# proxy upstream environment # + SERVICE_API_SYSTEM=${API_SYSTEM_HOST}:${SERVICE_PORT} + SERVICE_BACKUP=${BACKUP_HOST}:${SERVICE_PORT} + SERVICE_BACKUP_BACKGRUOND_TASKS=${BACKUP_BACKGRUOND_TASKS_HOST}:${SERVICE_PORT} + SERVICE_CLEAR_EVENTS=${CLEAR_EVENTS_HOST}:${SERVICE_PORT} + SERVICE_MIGRATION=${MIGRATION_HOST}:${SERVICE_PORT} + SERVICE_WEBHOOKS_SERVICE=${WEBHOOKS_SERVICE_HOST}:${SERVICE_PORT} + SERVICE_STORAGE_ENCRYPTION=${STORAGE_ENCRYPTION_HOST}:${SERVICE_PORT} + SERVICE_FILES=${FILES_HOST}:${SERVICE_PORT} + SERVICE_FILES_SERVICES=${FILES_SERVICES_HOST}:${SERVICE_PORT} + SERVICE_STORAGE_MIGRATION=${STORAGE_MIGRATION_HOST}:${SERVICE_PORT} + SERVICE_NOTIFY=${NOTIFY_HOST}:${SERVICE_PORT} + SERVICE_PEOPLE_SERVER=${PEOPLE_SERVER_HOST}:${SERVICE_PORT} + SERVICE_SOCKET=${SOCKET_HOST}:${SERVICE_PORT} + SERVICE_STUDIO_NOTIFY=${STUDIO_NOTIFY_HOST}:${SERVICE_PORT} + SERVICE_TELEGRAM_SERVICE=${TELEGRAM_SERVICE_HOST}:${SERVICE_PORT} + SERVICE_URLSHORTENER=${URLSHORTENER_HOST}:${SERVICE_PORT} + SERVICE_API=${API_HOST}:${SERVICE_PORT} + SERVICE_STUDIO=${STUDIO_HOST}:${SERVICE_PORT} + SERVICE_SSOAUTH=${SSOAUTH_HOST}:${SERVICE_PORT} + SERVICE_DOCEDITOR=${DOCEDITOR_HOST}:5013 + SERVICE_LOGIN=${LOGIN_HOST}:5011 + + NETWORK_NAME=${PRODUCT} diff --git a/build/install/docker/Dockerfile.dev b/build/install/docker/Dockerfile.dev new file mode 100644 index 0000000000..8087b85925 --- /dev/null +++ b/build/install/docker/Dockerfile.dev @@ -0,0 +1,359 @@ +ARG SRC_PATH="/app/onlyoffice/src" +ARG BUILD_PATH="/var/www" +ARG DOTNET_SDK="mcr.microsoft.com/dotnet/sdk:6.0" +ARG DOTNET_RUN="mcr.microsoft.com/dotnet/aspnet:6.0" + +FROM $DOTNET_SDK AS base +ARG RELEASE_DATE="2022-10-09" +ARG DEBIAN_FRONTEND=noninteractive +ARG PRODUCT_VERSION=0.0.0 +ARG BUILD_NUMBER=0 +ARG GIT_BRANCH="develop" +ARG SRC_PATH +ARG BUILD_PATH +ARG BUILD_ARGS="build" +ARG DEPLOY_ARGS="deploy" +ARG DEBUG_INFO="true" + +LABEL onlyoffice.appserver.release-date="${RELEASE_DATE}" \ + maintainer="Ascensio System SIA " + +ENV LANG=en_US.UTF-8 \ + LANGUAGE=en_US:en \ + LC_ALL=en_US.UTF-8 + +RUN apt-get -y update && \ + apt-get install -yq \ + sudo \ + locales \ + git \ + npm && \ + locale-gen en_US.UTF-8 && \ + npm install --global yarn && \ + curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - && \ + apt-get install -y nodejs && \ + rm -rf /var/lib/apt/lists/* + +RUN echo ${GIT_BRANCH} && \ + git clone --depth 1 --recurse-submodules -b ${GIT_BRANCH} https://github.com/ONLYOFFICE/DocSpace.git ${SRC_PATH} + +RUN cd ${SRC_PATH} && \ + # mkdir -p /app/onlyoffice/config/ && cp -rf config/* /app/onlyoffice/config/ && \ + mkdir -p /app/onlyoffice/ && \ + find config/ -maxdepth 1 -name "*.json" | grep -v test | xargs tar -cvf config.tar && \ + tar -C "/app/onlyoffice/" -xvf config.tar && \ + cp config/*.config /app/onlyoffice/config/ && \ + mkdir -p /etc/nginx/conf.d && cp -f config/nginx/onlyoffice.conf /etc/nginx/conf.d/ && \ + mkdir -p /etc/nginx/includes/ && cp -f config/nginx/includes/onlyoffice*.conf /etc/nginx/includes/ && \ + sed -i "s/\"number\".*,/\"number\": \"${PRODUCT_VERSION}.${BUILD_NUMBER}\",/g" /app/onlyoffice/config/appsettings.json && \ + sed -e 's/#//' -i /etc/nginx/conf.d/onlyoffice.conf && \ + cd ${SRC_PATH}/build/install/common/ && \ + # bash build-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 -sp "${SRC_PATH}" -bp "${BUILD_PATH}" && \ + cp -rf ${SRC_PATH}/products/ASC.Files/Server/DocStore ${BUILD_PATH}/products/ASC.Files/server/ && \ + rm -rf ${SRC_PATH}/common/* && \ + rm -rf ${SRC_PATH}/web/ASC.Web.Core/* && \ + rm -rf ${SRC_PATH}/web/ASC.Web.Studio/* && \ + rm -rf ${SRC_PATH}/products/ASC.Files/Server/* && \ + rm -rf ${SRC_PATH}/products/ASC.Files/Service/* && \ + rm -rf ${SRC_PATH}/products/ASC.People/Server/* + +COPY config/mysql/conf.d/mysql.cnf /etc/mysql/conf.d/mysql.cnf + +FROM $DOTNET_RUN as dotnetrun +ARG BUILD_PATH +ARG SRC_PATH +ENV BUILD_PATH=${BUILD_PATH} +ENV SRC_PATH=${SRC_PATH} + +# add defualt user and group for no-root run +RUN mkdir -p /var/log/onlyoffice && \ + mkdir -p /app/onlyoffice/data && \ + addgroup --system --gid 107 onlyoffice && \ + adduser -uid 104 --quiet --home /var/www/onlyoffice --system --gid 107 onlyoffice && \ + chown onlyoffice:onlyoffice /app/onlyoffice -R && \ + chown onlyoffice:onlyoffice /var/log -R && \ + chown onlyoffice:onlyoffice /var/www -R && \ + apt-get -y update && \ + apt-get install -yq \ + sudo \ + nano \ + curl \ + vim \ + python3-pip \ + libgdiplus && \ + pip3 install --upgrade jsonpath-ng multipledispatch && \ + rm -rf /var/lib/apt/lists/* + +COPY --from=base --chown=onlyoffice:onlyoffice /app/onlyoffice/config/* /app/onlyoffice/config/ + +#USER onlyoffice +EXPOSE 5050 +ENTRYPOINT ["python3", "docker-entrypoint.py"] + +FROM node:16.16-slim as noderun +ARG BUILD_PATH +ARG SRC_PATH +ENV BUILD_PATH=${BUILD_PATH} +ENV SRC_PATH=${SRC_PATH} + +RUN mkdir -p /var/log/onlyoffice && \ + mkdir -p /app/onlyoffice/data && \ + addgroup --system --gid 107 onlyoffice && \ + adduser -uid 104 --quiet --home /var/www/onlyoffice --system --gid 107 onlyoffice && \ + chown onlyoffice:onlyoffice /app/onlyoffice -R && \ + chown onlyoffice:onlyoffice /var/log -R && \ + chown onlyoffice:onlyoffice /var/www -R && \ + apt-get -y update && \ + apt-get install -yq \ + sudo \ + nano \ + curl \ + vim \ + python3-pip && \ + pip3 install --upgrade jsonpath-ng multipledispatch && \ + rm -rf /var/lib/apt/lists/* + +COPY --from=base --chown=onlyoffice:onlyoffice /app/onlyoffice/config/* /app/onlyoffice/config/ + +EXPOSE 5050 +ENTRYPOINT ["python3", "docker-entrypoint.py"] + +## Nginx image ## +FROM nginx AS proxy +ARG SRC_PATH +ARG BUILD_PATH +ARG COUNT_WORKER_CONNECTIONS=1024 +ENV DNS_NAMESERVER=127.0.0.11 \ + COUNT_WORKER_CONNECTIONS=$COUNT_WORKER_CONNECTIONS \ + MAP_HASH_BUCKET_SIZE="" + +RUN apt-get -y update && \ + apt-get install -yq vim && \ + rm -rf /var/lib/apt/lists/* && \ + rm -rf /usr/share/nginx/html/* + +# copy static services files and config values +COPY --from=base /etc/nginx/conf.d /etc/nginx/conf.d +COPY --from=base /etc/nginx/includes /etc/nginx/includes +# COPY --from=base ${SRC_PATH}/build/deploy/client ${BUILD_PATH}/client +# COPY --from=base ${SRC_PATH}/build/deploy/public ${BUILD_PATH}/public +COPY /config/nginx/templates/upstream.conf.template /etc/nginx/templates/upstream.conf.template +COPY /config/nginx/templates/nginx.conf.template /etc/nginx/nginx.conf.template +COPY prepare-nginx-proxy.sh /docker-entrypoint.d/prepare-nginx-proxy.sh + +# add defualt user and group for no-root run +RUN chown nginx:nginx /etc/nginx/* -R && \ + chown nginx:nginx /docker-entrypoint.d/* && \ + # changes for upstream configure + sed -i 's/127.0.0.1:5010/$service_api_system/' /etc/nginx/conf.d/onlyoffice.conf && \ + sed -i 's/127.0.0.1:5012/$service_backup/' /etc/nginx/conf.d/onlyoffice.conf && \ + #sed -i 's/127.0.0.1:5021/$service_crm/' /etc/nginx/conf.d/onlyoffice.conf && \ + sed -i 's/127.0.0.1:5007/$service_files/' /etc/nginx/conf.d/onlyoffice.conf && \ + sed -i 's/127.0.0.1:5004/$service_people_server/' /etc/nginx/conf.d/onlyoffice.conf && \ + #sed -i 's/127.0.0.1:5020/$service_projects_server/' /etc/nginx/conf.d/onlyoffice.conf && \ + sed -i 's/127.0.0.1:5000/$service_api/' /etc/nginx/conf.d/onlyoffice.conf && \ + sed -i 's/127.0.0.1:5003/$service_studio/' /etc/nginx/conf.d/onlyoffice.conf && \ + #sed -i 's/127.0.0.1:5023/$service_calendar/' /etc/nginx/conf.d/onlyoffice.conf && \ + sed -i 's/127.0.0.1:9899/$service_socket/' /etc/nginx/conf.d/onlyoffice.conf && \ + sed -i 's/127.0.0.1:9834/$service_sso/' /etc/nginx/conf.d/onlyoffice.conf && \ + #sed -i 's/127.0.0.1:5022/$service_mail/' /etc/nginx/conf.d/onlyoffice.conf && \ + sed -i 's/127.0.0.1:9999/$service_urlshortener/' /etc/nginx/conf.d/onlyoffice.conf && \ + sed -i 's/127.0.0.1:5034/$service_migration/' /etc/nginx/conf.d/onlyoffice.conf && \ + #sed -i 's/127.0.0.1:5013/$service_doceditor/' /etc/nginx/conf.d/onlyoffice.conf && \ + #sed -i 's/127.0.0.1:5011/$service_login/' /etc/nginx/conf.d/onlyoffice.conf && \ + sed -i 's/172.*/$document_server;/' /etc/nginx/conf.d/onlyoffice.conf + +## Doceditor ## +# FROM noderun as doceditor +# WORKDIR ${BUILD_PATH}/products/ASC.Files/editor + +# COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/deploy/editor/ . +# ENTRYPOINT ["node", "server.js"] + +## Login ## +#FROM noderun as login +#WORKDIR ${BUILD_PATH}/products/ASC.Login/login + +# COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/deploy/login/ . +# ENTRYPOINT ["node", "server.js"] + +## ASC.Data.Backup.BackgroundTasks ## +FROM dotnetrun AS backup_background +WORKDIR ${BUILD_PATH}/services/ASC.Data.Backup.BackgroundTasks/ + +COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py +COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Data.Backup.BackgroundTasks/service/ . + +CMD ["ASC.Data.Backup.BackgroundTasks.dll", "ASC.Data.Backup.BackgroundTasks"] + +## ASC.ClearEvents ## +FROM dotnetrun AS clear-events +WORKDIR ${BUILD_PATH}/services/ASC.ClearEvents/ + +COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py +COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.ClearEvents/service/ . + +CMD ["ASC.ClearEvents.dll", "ASC.ClearEvents"] + +## ASC.Migration ## +FROM dotnetrun AS migration +WORKDIR ${BUILD_PATH}/services/ASC.Migration/ + +COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py +COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Migration/service/ . + +CMD ["ASC.Migration.dll", "ASC.Migration"] + +## ASC.Data.Backup ## +FROM dotnetrun AS backup +WORKDIR ${BUILD_PATH}/services/ASC.Data.Backup/ + +COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py +COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Data.Backup/service/ . + +CMD ["ASC.Data.Backup.dll", "ASC.Data.Backup"] + +## ASC.Files ## +FROM dotnetrun AS files +WORKDIR ${BUILD_PATH}/products/ASC.Files/server/ + +COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py +COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/products/ASC.Files/server/ . + +CMD ["ASC.Files.dll", "ASC.Files"] + +## ASC.Files.Service ## +FROM dotnetrun AS files_services +WORKDIR ${BUILD_PATH}/products/ASC.Files/service/ + +COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py +COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Files.Service/service/ . + +CMD ["ASC.Files.Service.dll", "ASC.Files.Service"] + +## ASC.Notify ## +FROM dotnetrun AS notify +WORKDIR ${BUILD_PATH}/services/ASC.Notify/service + +COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py +COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Notify/service/ . + +CMD ["ASC.Notify.dll", "ASC.Notify"] + +## ASC.People ## +FROM dotnetrun AS people_server +WORKDIR ${BUILD_PATH}/products/ASC.People/server/ + +COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py +COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/products/ASC.People/server/ . + +CMD ["ASC.People.dll", "ASC.People"] + +## ASC.Socket.IO ## +FROM noderun AS socket +WORKDIR ${BUILD_PATH}/services/ASC.Socket.IO/ + +COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py +COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Socket.IO/service/ . + +CMD ["server.js", "ASC.Socket.IO"] + +## ASC.SsoAuth ## +FROM noderun AS ssoauth +WORKDIR ${BUILD_PATH}/services/ASC.SsoAuth/ + +COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py +COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.SsoAuth/service/ . + +CMD ["app.js", "ASC.SsoAuth"] + +## ASC.Studio.Notify ## +FROM dotnetrun AS studio_notify +WORKDIR ${BUILD_PATH}/services/ASC.Studio.Notify/service/ + +COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py +COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Studio.Notify/service/ . + +CMD ["ASC.Studio.Notify.dll", "ASC.Studio.Notify"] + +## ASC.TelegramService ## +FROM dotnetrun AS telegram_service +WORKDIR ${BUILD_PATH}/services/ASC.TelegramService/ + +COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py +COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.TelegramService/service/ . + +CMD ["ASC.TelegramService.dll", "ASC.TelegramService"] + +## ASC.UrlShortener ## +FROM noderun AS urlshortener +WORKDIR ${BUILD_PATH}/services/ASC.UrlShortener/service/ + +COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py +COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.UrlShortener/service/ . + +CMD ["index.js", "ASC.UrlShortener"] + +## ASC.Web.Api ## +FROM dotnetrun AS api +WORKDIR ${BUILD_PATH}/studio/ASC.Web.Api/ + +COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py +COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Web.Api/service/ . + +CMD ["ASC.Web.Api.dll", "ASC.Web.Api"] + +## ASC.Webhooks.Service ## +FROM dotnetrun AS webhooks-service +WORKDIR ${BUILD_PATH}/services/ASC.Webhooks.Service/ + +COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py +COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Webhooks.Service/service/ . + +CMD ["ASC.Webhooks.Service.dll", "ASC.Webhooks.Service"] + +## ASC.Web.Studio ## +FROM dotnetrun AS studio +WORKDIR ${BUILD_PATH}/studio/ASC.Web.Studio/ + +COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py +COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Web.Studio/service/ . + +CMD ["ASC.Web.Studio.dll", "ASC.Web.Studio"] + +## ASC.Migration.Runner ## +FROM $DOTNET_RUN AS onlyoffice-migration-runner +ARG BUILD_PATH +ARG SRC_PATH +ENV BUILD_PATH=${BUILD_PATH} +ENV SRC_PATH=${SRC_PATH} +WORKDIR ${BUILD_PATH}/services/ASC.Migration.Runner/ +COPY ./docker-migration-entrypoint.sh ./docker-migration-entrypoint.sh +COPY --from=base ${SRC_PATH}/ASC.Migration.Runner/service/ . + +ENTRYPOINT ["./docker-migration-entrypoint.sh"] + +## image for k8s bin-share ## +FROM busybox:latest AS bin_share +RUN mkdir -p /app/appserver/ASC.Files/server && \ + mkdir -p /app/appserver/ASC.People/server/ && \ + #mkdir -p /app/appserver/ASC.CRM/server/ && \ + #mkdir -p /app/appserver/ASC.Projects/server/ && \ + #mkdir -p /app/appserver/ASC.Calendar/server/ && \ + #mkdir -p /app/appserver/ASC.Mail/server/ && \ + addgroup --system --gid 107 onlyoffice && \ + adduser -u 104 onlyoffice --home /var/www/onlyoffice --system -G onlyoffice + +COPY bin-share-docker-entrypoint.sh /app/docker-entrypoint.sh +COPY --from=base /var/www/products/ASC.Files/server/ /app/appserver/ASC.Files/server/ +COPY --from=base /var/www/products/ASC.People/server/ /app/appserver/ASC.People/server/ +ENTRYPOINT ["./app/docker-entrypoint.sh"] + +## image for k8s wait-bin-share ## +FROM busybox:latest AS wait_bin_share +RUN mkdir /app + +COPY wait-bin-share-docker-entrypoint.sh /app/docker-entrypoint.sh +ENTRYPOINT ["./app/docker-entrypoint.sh"] diff --git a/build/install/docker/build.dev.yml b/build/install/docker/build.dev.yml new file mode 100644 index 0000000000..e105e52d8a --- /dev/null +++ b/build/install/docker/build.dev.yml @@ -0,0 +1,142 @@ +version: "3.8" + +services: + onlyoffice-backup-background-tasks: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: backup_background + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup-background:${DOCKER_TAG}" + + onlyoffice-clear-events: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: clear-events + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-clear-events:${DOCKER_TAG}" + + onlyoffice-migration: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: migration + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration:${DOCKER_TAG}" + + onlyoffice-backup: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: backup + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup:${DOCKER_TAG}" + + onlyoffice-files: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: files + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files:${DOCKER_TAG}" + + onlyoffice-files-services: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: files_services + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files-services:${DOCKER_TAG}" + + onlyoffice-notify: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: notify + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-notify:${DOCKER_TAG}" + + onlyoffice-people-server: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: people_server + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-people-server:${DOCKER_TAG}" + + onlyoffice-socket: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: socket + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-socket:${DOCKER_TAG}" + + onlyoffice-studio-notify: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: studio_notify + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio-notify:${DOCKER_TAG}" + + onlyoffice-telegram-service: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: telegram_service + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-telegram-service:${DOCKER_TAG}" + + onlyoffice-urlshortener: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: urlshortener + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-urlshortener:${DOCKER_TAG}" + + onlyoffice-api: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: api + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api:${DOCKER_TAG}" + + onlyoffice-studio: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: studio + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio:${DOCKER_TAG}" + + onlyoffice-ssoauth: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: ssoauth + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-ssoauth:${DOCKER_TAG}" + + onlyoffice-webhooks-service: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: webhooks-service + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-webhooks-service:${DOCKER_TAG}" + + onlyoffice-bin-share: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: bin_share + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-bin-share:${DOCKER_TAG}" + + onlyoffice-wait-bin-share: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: wait_bin_share + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-wait-bin-share:${DOCKER_TAG}" + + onlyoffice-proxy: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: proxy + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-proxy:${DOCKER_TAG}" + + onlyoffice-migration-runner: + build: + context: ./ + dockerfile: "${DOCKERFILE}" + target: onlyoffice-migration-runner + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration-runner:${DOCKER_TAG}" diff --git a/build/install/docker/db.arm.yml b/build/install/docker/db.arm.yml new file mode 100644 index 0000000000..ffe7a959ee --- /dev/null +++ b/build/install/docker/db.arm.yml @@ -0,0 +1,35 @@ +version: "3.8" + +services: + onlyoffice-mysql-server: + image: arm64v8/mysql:oracle + command: --default-authentication-plugin=mysql_native_password + cap_add: + - SYS_NICE + container_name: ${MYSQL_HOST} + restart: always + tty: true + user: mysql + expose: + - "3306" + ports: + - 3307:3306 + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} + MYSQL_DATABASE: ${MYSQL_DATABASE} + MYSQL_USER: ${MYSQL_USER} + MYSQL_PASSWORD: ${MYSQL_PASSWORD} + volumes: + - mysql_data:/var/lib/mysql + - ./config/mysql/conf.d/:/etc/mysql/conf.d + networks: + - ${NETWORK_NAME} + tmpfs: /var/log/mysql/ + +networks: + onlyoffice: + name: ${NETWORK_NAME} + driver: "bridge" + +volumes: + mysql_data: diff --git a/build/install/docker/docspace.dev.yml b/build/install/docker/docspace.dev.yml new file mode 100644 index 0000000000..d49fce4de7 --- /dev/null +++ b/build/install/docker/docspace.dev.yml @@ -0,0 +1,191 @@ +version: "3.8" +x-service: &x-service-base + container_name: base + restart: always + expose: + - ${SERVICE_PORT} + environment: + MYSQL_HOST: ${MYSQL_HOST} + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} + MYSQL_DATABASE: ${MYSQL_DATABASE} + MYSQL_USER: ${MYSQL_USER} + MYSQL_PASSWORD: ${MYSQL_PASSWORD} + DATABASE_MIGRATION: ${DATABASE_MIGRATION} + APP_DOTNET_ENV: ${APP_DOTNET_ENV} + APP_CORE_BASE_DOMAIN: ${APP_CORE_BASE_DOMAIN} + APP_CORE_MACHINEKEY: ${APP_CORE_MACHINEKEY} + DOCUMENT_SERVER_JWT_SECRET: ${DOCUMENT_SERVER_JWT_SECRET} + DOCUMENT_SERVER_JWT_HEADER: ${DOCUMENT_SERVER_JWT_HEADER} + DOCUMENT_SERVER_URL_PUBLIC: ${DOCUMENT_SERVER_URL_PUBLIC} + DOCUMENT_SERVER_URL_INTERNAL: ${DOCUMENT_SERVER_URL_INTERNAL} + KAFKA_HOST: ${KAFKA_HOST} + ELK_HOST: ${ELK_HOST} + PROXY_HOST: ${PROXY_HOST} + volumes: + #- /app/onlyoffice/CommunityServer/data:/app/onlyoffice/data + - app_data:/app/onlyoffice/data + - files_data:/var/www/products/ASC.Files/server/ + - people_data:/var/www/products/ASC.People/server/ + +services: + onlyoffice-elasticsearch: + image: docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION} + container_name: ${ELK_HOST} + restart: always + environment: + - discovery.type=single-node + - bootstrap.memory_lock=true + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65535 + hard: 65535 + volumes: + - es_data:/usr/share/elasticsearch/data + expose: + - "9200" + - "9300" + onlyoffice-backup-background-tasks: + <<: *x-service-base + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup-background:${DOCKER_TAG}" + container_name: ${BACKUP_BACKGRUOND_TASKS_HOST} + + onlyoffice-backup: + <<: *x-service-base + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-backup:${DOCKER_TAG}" + container_name: ${BACKUP_HOST} + + onlyoffice-clear-events: + <<: *x-service-base + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-clear-events:${DOCKER_TAG}" + container_name: ${CLEAR_EVENTS_HOST} + + onlyoffice-migration: + <<: *x-service-base + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-migration:${DOCKER_TAG}" + container_name: ${MIGRATION_HOST} + + onlyoffice-files: + <<: *x-service-base + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files:${DOCKER_TAG}" + container_name: ${FILES_HOST} + + onlyoffice-files-services: + <<: *x-service-base + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-files-services:${DOCKER_TAG}" + container_name: ${FILES_SERVICES_HOST} + + onlyoffice-people-server: + <<: *x-service-base + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-people-server:${DOCKER_TAG}" + container_name: ${PEOPLE_SERVER_HOST} + + onlyoffice-socket: + <<: *x-service-base + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-socket:${DOCKER_TAG}" + container_name: ${SOCKET_HOST} + expose: + - ${SERVICE_PORT} + + onlyoffice-studio-notify: + <<: *x-service-base + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio-notify:${DOCKER_TAG}" + container_name: ${STUDIO_NOTIFY_HOST} + + onlyoffice-telegram-service: + <<: *x-service-base + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-telegram-service:${DOCKER_TAG}" + container_name: ${TELEGRAM_SERVICE_HOST} + + onlyoffice-urlshortener: + <<: *x-service-base + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-urlshortener:${DOCKER_TAG}" + container_name: ${URLSHORTENER_HOST} + expose: + - ${SERVICE_PORT} + - "9999" + + onlyoffice-api: + <<: *x-service-base + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api:${DOCKER_TAG}" + container_name: ${API_HOST} + + onlyoffice-studio: + <<: *x-service-base + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio:${DOCKER_TAG}" + container_name: ${STUDIO_HOST} + + onlyoffice-ssoauth: + <<: *x-service-base + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-ssoauth:${DOCKER_TAG}" + container_name: ${SSOAUTH_HOST} + expose: + - ${SERVICE_PORT} + - "9834" + + onlyoffice-webhooks-service: + <<: *x-service-base + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-webhooks-service:${DOCKER_TAG}" + container_name: ${WEBHOOKS_SERVICE_HOST} + + onlyoffice-proxy: + image: "${REPO}/${DOCKER_IMAGE_PREFIX}-proxy:${DOCKER_TAG}" + container_name: ${PROXY_HOST} + restart: always + expose: + - "8081" + - "8099" + - "8092" + ports: + - 8092:8092 + depends_on: + - onlyoffice-backup-background-tasks + - onlyoffice-backup + - onlyoffice-clear-events + - onlyoffice-migration + - onlyoffice-webhooks-service + - onlyoffice-files + - onlyoffice-files-services + - onlyoffice-people-server + - onlyoffice-socket + - onlyoffice-studio-notify + - onlyoffice-telegram-service + - onlyoffice-urlshortener + - onlyoffice-api + - onlyoffice-studio + - onlyoffice-ssoauth + environment: + - SERVICE_BACKUP=${SERVICE_BACKUP} + - SERVICE_FILES=${SERVICE_FILES} + - SERVICE_FILES_SERVICES=${SERVICE_FILES_SERVICES} + - SERVICE_CLEAR_EVENTS=${SERVICE_CLEAR_EVENTS} + - SERVICE_MIGRATION=${SERVICE_MIGRATION} + - SERVICE_WEBHOOKS_SERVICE=${SERVICE_WEBHOOKS_SERVICE} + - SERVICE_NOTIFY=${SERVICE_NOTIFY} + - SERVICE_PEOPLE_SERVER=${SERVICE_PEOPLE_SERVER} + - SERVICE_SOCKET=${SERVICE_SOCKET} + - SERVICE_STUDIO_NOTIFY=${SERVICE_STUDIO_NOTIFY} + - SERVICE_TELEGRAM_SERVICE=${SERVICE_TELEGRAM_SERVICE} + - SERVICE_URLSHORTENER=${SERVICE_URLSHORTENER} + - SERVICE_API=${SERVICE_API} + - SERVICE_STUDIO=${SERVICE_STUDIO} + - SERVICE_SSOAUTH=${SERVICE_SSOAUTH} + - DOCUMENT_SERVER=${DOCUMENT_SERVER_HOST} + - SERVICE_PORT=${SERVICE_PORT} + volumes: + - proxy_log:/var/log/nginx + +networks: + default: + external: + name: ${NETWORK_NAME} + +volumes: + es_data: + proxy_log: + app_data: + files_data: + people_data: diff --git a/build/run/macos/backend-environment.docker.sh b/build/run/macos/backend-environment.docker.sh new file mode 100755 index 0000000000..99bdfdd264 --- /dev/null +++ b/build/run/macos/backend-environment.docker.sh @@ -0,0 +1,15 @@ +#!/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/build/install/docker/ + +docker_dir="$( pwd )" + +echo "Docker directory:" $docker_dir + +docker compose --env-file .env.dev -f db.arm.yml -f redis.yml -f rabbitmq.yml up -d \ No newline at end of file diff --git a/build/run/macos/backend.docker.sh b/build/run/macos/backend.docker.sh new file mode 100755 index 0000000000..5f2159bee0 --- /dev/null +++ b/build/run/macos/backend.docker.sh @@ -0,0 +1,16 @@ +#!/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/build/install/docker/ + +docker_dir="$( pwd )" + +echo "Docker directory:" $docker_dir + +docker compose --env-file .env.dev -f build.dev.yml build +docker compose --env-file .env.dev -f migration-runner.yml -f docspace.dev.yml up -d \ No newline at end of file From 5cda2d314fd2b103112c84840961083d7705cf40 Mon Sep 17 00:00:00 2001 From: Alexey Safronov Date: Wed, 12 Oct 2022 14:33:06 +0300 Subject: [PATCH 04/20] Added nginx routing to Host client apps --- build/install/docker/.env.dev | 9 +++++---- build/install/docker/Dockerfile.dev | 5 +++-- .../docker/config/nginx/templates/upstream.conf.template | 5 +++++ build/install/docker/docspace.dev.yml | 3 +++ build/run/macos/backend.docker.sh | 1 + 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/build/install/docker/.env.dev b/build/install/docker/.env.dev index 743393db77..6a6ba09c0e 100644 --- a/build/install/docker/.env.dev +++ b/build/install/docker/.env.dev @@ -1,3 +1,5 @@ +LOCAL_IP=192.168.1.4 + # docker-compose tags # PRODUCT=onlyoffice REPO=${PRODUCT} @@ -70,8 +72,6 @@ SSOAUTH_HOST=${CONTAINER_PREFIX}ssoauth MIGRATION_RUNNER_HOST=${CONTAINER_PREFIX}migration-runner PROXY_HOST=${CONTAINER_PREFIX}proxy - DOCEDITOR_HOST=${CONTAINER_PREFIX}doceditor - LOGIN_HOST=${CONTAINER_PREFIX}login # proxy upstream environment # SERVICE_API_SYSTEM=${API_SYSTEM_HOST}:${SERVICE_PORT} @@ -93,7 +93,8 @@ SERVICE_API=${API_HOST}:${SERVICE_PORT} SERVICE_STUDIO=${STUDIO_HOST}:${SERVICE_PORT} SERVICE_SSOAUTH=${SSOAUTH_HOST}:${SERVICE_PORT} - SERVICE_DOCEDITOR=${DOCEDITOR_HOST}:5013 - SERVICE_LOGIN=${LOGIN_HOST}:5011 + SERVICE_DOCEDITOR=${LOCAL_IP}:5013 + SERVICE_LOGIN=${LOCAL_IP}:5011 + SERVICE_CLIENT=${LOCAL_IP}:5001 NETWORK_NAME=${PRODUCT} diff --git a/build/install/docker/Dockerfile.dev b/build/install/docker/Dockerfile.dev index 8087b85925..0d7875c3d9 100644 --- a/build/install/docker/Dockerfile.dev +++ b/build/install/docker/Dockerfile.dev @@ -161,8 +161,9 @@ RUN chown nginx:nginx /etc/nginx/* -R && \ #sed -i 's/127.0.0.1:5022/$service_mail/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:9999/$service_urlshortener/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5034/$service_migration/' /etc/nginx/conf.d/onlyoffice.conf && \ - #sed -i 's/127.0.0.1:5013/$service_doceditor/' /etc/nginx/conf.d/onlyoffice.conf && \ - #sed -i 's/127.0.0.1:5011/$service_login/' /etc/nginx/conf.d/onlyoffice.conf && \ + sed -i 's/127.0.0.1:5013/$service_doceditor/' /etc/nginx/conf.d/onlyoffice.conf && \ + sed -i 's/127.0.0.1:5011/$service_login/' /etc/nginx/conf.d/onlyoffice.conf && \ + sed -i 's/127.0.0.1:5001/$service_client/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/172.*/$document_server;/' /etc/nginx/conf.d/onlyoffice.conf ## Doceditor ## diff --git a/build/install/docker/config/nginx/templates/upstream.conf.template b/build/install/docker/config/nginx/templates/upstream.conf.template index cbbc1265ba..0dbd6fa60e 100644 --- a/build/install/docker/config/nginx/templates/upstream.conf.template +++ b/build/install/docker/config/nginx/templates/upstream.conf.template @@ -10,6 +10,11 @@ map $SERVICE_DOCEDITOR $service_doceditor { $SERVICE_DOCEDITOR $SERVICE_DOCEDITOR; } +map $SERVICE_CLIENT $service_client { + volatile; + $SERVICE_CLIENT $SERVICE_CLIENT; +} + map $SERVICE_MIGRATION $service_migration { volatile; $SERVICE_MIGRATION $SERVICE_MIGRATION; diff --git a/build/install/docker/docspace.dev.yml b/build/install/docker/docspace.dev.yml index d49fce4de7..f30c47734f 100644 --- a/build/install/docker/docspace.dev.yml +++ b/build/install/docker/docspace.dev.yml @@ -173,6 +173,9 @@ services: - SERVICE_API=${SERVICE_API} - SERVICE_STUDIO=${SERVICE_STUDIO} - SERVICE_SSOAUTH=${SERVICE_SSOAUTH} + - SERVICE_DOCEDITOR=${SERVICE_DOCEDITOR} + - SERVICE_LOGIN=${SERVICE_LOGIN} + - SERVICE_CLIENT=${SERVICE_CLIENT} - DOCUMENT_SERVER=${DOCUMENT_SERVER_HOST} - SERVICE_PORT=${SERVICE_PORT} volumes: diff --git a/build/run/macos/backend.docker.sh b/build/run/macos/backend.docker.sh index 5f2159bee0..c9421e08e5 100755 --- a/build/run/macos/backend.docker.sh +++ b/build/run/macos/backend.docker.sh @@ -13,4 +13,5 @@ docker_dir="$( pwd )" echo "Docker directory:" $docker_dir docker compose --env-file .env.dev -f build.dev.yml build +docker compose --env-file .env.dev -f docspace.dev.yml down -v docker compose --env-file .env.dev -f migration-runner.yml -f docspace.dev.yml up -d \ No newline at end of file From c1208e931a3e656e88dcac06cae11c2cecfaa81e Mon Sep 17 00:00:00 2001 From: Alexey Bannov Date: Wed, 12 Oct 2022 14:43:00 +0300 Subject: [PATCH 05/20] added support ActiveMQ EventBus --- ASC.Web.sln | 6 + ASC.Web.slnf | 1 + common/ASC.Api.Core/ASC.Api.Core.csproj | 1 + .../ConfigurationManagerExtension.cs | 2 + .../Extensions/ServiceCollectionExtension.cs | 49 +++ common/ASC.Api.Core/GlobalUsings.cs | 4 + common/ASC.Common/Caching/RabbitMQCache.cs | 15 +- .../Caching/Settings/ActiveMQSettings.cs | 31 ++ .../Caching/Settings/RabbitMQSettings.cs | 39 ++ .../ASC.EventBus.ActiveMQ.csproj | 20 + .../DefaultActiveMQPersistentConnection.cs | 175 +++++++++ .../ASC.EventBus.ActiveMQ/EventBusActiveMQ.cs | 363 ++++++++++++++++++ common/ASC.EventBus.ActiveMQ/GlobalUsings.cs | 42 ++ .../IActiveMQPersistentConnection.cs | 35 ++ ...faultActiveMQPersistentConnectionLogger.cs | 53 +++ .../Log/EventBusActiveMQLogger.cs | 74 ++++ .../ASC.EventBus.RabbitMQ/EventBusRabbitMQ.cs | 27 +- config/activemq.json | 5 + 18 files changed, 911 insertions(+), 31 deletions(-) create mode 100644 common/ASC.Common/Caching/Settings/ActiveMQSettings.cs create mode 100644 common/ASC.Common/Caching/Settings/RabbitMQSettings.cs create mode 100644 common/ASC.EventBus.ActiveMQ/ASC.EventBus.ActiveMQ.csproj create mode 100644 common/ASC.EventBus.ActiveMQ/DefaultActiveMQPersistentConnection.cs create mode 100644 common/ASC.EventBus.ActiveMQ/EventBusActiveMQ.cs create mode 100644 common/ASC.EventBus.ActiveMQ/GlobalUsings.cs create mode 100644 common/ASC.EventBus.ActiveMQ/IActiveMQPersistentConnection.cs create mode 100644 common/ASC.EventBus.ActiveMQ/Log/DefaultActiveMQPersistentConnectionLogger.cs create mode 100644 common/ASC.EventBus.ActiveMQ/Log/EventBusActiveMQLogger.cs create mode 100644 config/activemq.json diff --git a/ASC.Web.sln b/ASC.Web.sln index 5e956f6b43..7eeb12063d 100644 --- a/ASC.Web.sln +++ b/ASC.Web.sln @@ -101,6 +101,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.Migration", "common\ASC EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.ActiveDirectory", "common\ASC.ActiveDirectory\ASC.ActiveDirectory.csproj", "{9F81862F-303D-467F-8DC9-044BE2CCF329}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ASC.EventBus.ActiveMQ", "common\ASC.EventBus.ActiveMQ\ASC.EventBus.ActiveMQ.csproj", "{86916EF2-4A1B-441C-B673-EB0F68EC9C3A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -287,6 +289,10 @@ Global {9F81862F-303D-467F-8DC9-044BE2CCF329}.Debug|Any CPU.Build.0 = Debug|Any CPU {9F81862F-303D-467F-8DC9-044BE2CCF329}.Release|Any CPU.ActiveCfg = Release|Any CPU {9F81862F-303D-467F-8DC9-044BE2CCF329}.Release|Any CPU.Build.0 = Release|Any CPU + {86916EF2-4A1B-441C-B673-EB0F68EC9C3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86916EF2-4A1B-441C-B673-EB0F68EC9C3A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86916EF2-4A1B-441C-B673-EB0F68EC9C3A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86916EF2-4A1B-441C-B673-EB0F68EC9C3A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/ASC.Web.slnf b/ASC.Web.slnf index 97a3273494..8696da7e39 100644 --- a/ASC.Web.slnf +++ b/ASC.Web.slnf @@ -10,6 +10,7 @@ "common\\ASC.Data.Encryption\\ASC.Data.Encryption.csproj", "common\\ASC.Data.Reassigns\\ASC.Data.Reassigns.csproj", "common\\ASC.Data.Storage\\ASC.Data.Storage.csproj", + "common\\ASC.EventBus.ActiveMQ\\ASC.EventBus.ActiveMQ.csproj", "common\\ASC.EventBus.Extensions.Logger\\ASC.EventBus.Extensions.Logger.csproj", "common\\ASC.EventBus.RabbitMQ\\ASC.EventBus.RabbitMQ.csproj", "common\\ASC.EventBus\\ASC.EventBus.csproj", diff --git a/common/ASC.Api.Core/ASC.Api.Core.csproj b/common/ASC.Api.Core/ASC.Api.Core.csproj index f9bd664cde..a20d31ef2e 100644 --- a/common/ASC.Api.Core/ASC.Api.Core.csproj +++ b/common/ASC.Api.Core/ASC.Api.Core.csproj @@ -29,6 +29,7 @@ + diff --git a/common/ASC.Api.Core/Extensions/ConfigurationManagerExtension.cs b/common/ASC.Api.Core/Extensions/ConfigurationManagerExtension.cs index 79df0e4421..981f98994c 100644 --- a/common/ASC.Api.Core/Extensions/ConfigurationManagerExtension.cs +++ b/common/ASC.Api.Core/Extensions/ConfigurationManagerExtension.cs @@ -54,6 +54,8 @@ public static class ConfigurationManagerExtension .AddJsonFile($"kafka.{env.EnvironmentName}.json", optional: true, reloadOnChange: true) .AddJsonFile("rabbitmq.json", optional: true, reloadOnChange: true) .AddJsonFile($"rabbitmq.{env.EnvironmentName}.json", optional: true, reloadOnChange: true) + .AddJsonFile("activemq.json", optional: true, reloadOnChange: true) + .AddJsonFile($"activemq.{env.EnvironmentName}.json", optional: true, reloadOnChange: true) .AddJsonFile("redis.json", optional: true, reloadOnChange: true) .AddJsonFile($"redis.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); diff --git a/common/ASC.Api.Core/Extensions/ServiceCollectionExtension.cs b/common/ASC.Api.Core/Extensions/ServiceCollectionExtension.cs index 3b6aa600ec..2793136231 100644 --- a/common/ASC.Api.Core/Extensions/ServiceCollectionExtension.cs +++ b/common/ASC.Api.Core/Extensions/ServiceCollectionExtension.cs @@ -75,6 +75,7 @@ public static class ServiceCollectionExtension services.AddSingleton(); var rabbitMQConfiguration = configuration.GetSection("RabbitMQ").Get(); + var activeMQConfiguration = configuration.GetSection("ActiveMQ").Get(); if (rabbitMQConfiguration != null) { @@ -154,6 +155,54 @@ public static class ServiceCollectionExtension return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, serializer, subscriptionClientName, retryCount); }); + } + else if (activeMQConfiguration != null) + { + services.AddSingleton(sp => + { + var cfg = sp.GetRequiredService(); + + var logger = sp.GetRequiredService>(); + + var factory = new Apache.NMS.NMSConnectionFactory(activeMQConfiguration.Uri); + + var retryCount = 5; + + if (!string.IsNullOrEmpty(cfg["core:eventBus:connectRetryCount"])) + { + retryCount = int.Parse(cfg["core:eventBus:connectRetryCount"]); + } + + return new DefaultActiveMQPersistentConnection(factory, logger, retryCount); + }); + + services.AddSingleton(sp => + { + var cfg = sp.GetRequiredService(); + + var activeMQPersistentConnection = sp.GetRequiredService(); + var iLifetimeScope = sp.GetRequiredService(); + var logger = sp.GetRequiredService>(); + var eventBusSubcriptionsManager = sp.GetRequiredService(); + + var serializer = new EventBus.Serializers.ProtobufSerializer(); + + var subscriptionClientName = "asc_event_bus_default_queue"; + + if (!string.IsNullOrEmpty(cfg["core:eventBus:subscriptionClientName"])) + { + subscriptionClientName = cfg["core:eventBus:subscriptionClientName"]; + } + + var retryCount = 5; + + if (!string.IsNullOrEmpty(cfg["core:eventBus:connectRetryCount"])) + { + retryCount = int.Parse(cfg["core:eventBus:connectRetryCount"]); + } + + return new EventBusActiveMQ(activeMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, serializer, subscriptionClientName, retryCount); + }); } else { diff --git a/common/ASC.Api.Core/GlobalUsings.cs b/common/ASC.Api.Core/GlobalUsings.cs index e230c1b254..1c11008fa8 100644 --- a/common/ASC.Api.Core/GlobalUsings.cs +++ b/common/ASC.Api.Core/GlobalUsings.cs @@ -144,3 +144,7 @@ global using StackExchange.Redis.Extensions.Core.Configuration; global using StackExchange.Redis.Extensions.Newtonsoft; global using LogLevel = Microsoft.Extensions.Logging.LogLevel; + +global using ASC.Common.Caching.Settings; +global using ASC.EventBus.ActiveMQ; + diff --git a/common/ASC.Common/Caching/RabbitMQCache.cs b/common/ASC.Common/Caching/RabbitMQCache.cs index 48b8873287..56531ac1bd 100644 --- a/common/ASC.Common/Caching/RabbitMQCache.cs +++ b/common/ASC.Common/Caching/RabbitMQCache.cs @@ -232,17 +232,4 @@ public class RabbitMQCache : IDisposable, ICacheNotify where T : IMessage< _disposed = true; } -} - -public class RabbitMQSettings -{ - public string HostName { get; set; } - public string UserName { get; set; } - public string Password { get; set; } - public int Port { get; set; } - public string VirtualHost { get; set; } - public string Uri { get; set; } - public bool EnableSsl { get; set; } - public string SslServerName { get; set; } - public string SslCertPath { get; set; } -} +} \ No newline at end of file diff --git a/common/ASC.Common/Caching/Settings/ActiveMQSettings.cs b/common/ASC.Common/Caching/Settings/ActiveMQSettings.cs new file mode 100644 index 0000000000..dab21df243 --- /dev/null +++ b/common/ASC.Common/Caching/Settings/ActiveMQSettings.cs @@ -0,0 +1,31 @@ +// (c) Copyright Ascensio System SIA 2010-2022 +// +// This program is a free software product. +// You can redistribute it and/or modify it under the terms +// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software +// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended +// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of +// any third-party rights. +// +// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see +// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html +// +// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021. +// +// The interactive user interfaces in modified source and object code versions of the Program must +// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3. +// +// Pursuant to Section 7(b) of the License you must retain the original Product logo when +// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under +// trademark law for use of our trademarks. +// +// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing +// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 +// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + +namespace ASC.Common.Caching.Settings; +public class ActiveMQSettings +{ + public string Uri { get; set; } +} diff --git a/common/ASC.Common/Caching/Settings/RabbitMQSettings.cs b/common/ASC.Common/Caching/Settings/RabbitMQSettings.cs new file mode 100644 index 0000000000..9dc1b85b5d --- /dev/null +++ b/common/ASC.Common/Caching/Settings/RabbitMQSettings.cs @@ -0,0 +1,39 @@ +// (c) Copyright Ascensio System SIA 2010-2022 +// +// This program is a free software product. +// You can redistribute it and/or modify it under the terms +// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software +// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended +// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of +// any third-party rights. +// +// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see +// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html +// +// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021. +// +// The interactive user interfaces in modified source and object code versions of the Program must +// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3. +// +// Pursuant to Section 7(b) of the License you must retain the original Product logo when +// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under +// trademark law for use of our trademarks. +// +// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing +// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 +// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + +namespace ASC.Common.Caching; +public class RabbitMQSettings +{ + public string HostName { get; set; } + public string UserName { get; set; } + public string Password { get; set; } + public int Port { get; set; } + public string VirtualHost { get; set; } + public string Uri { get; set; } + public bool EnableSsl { get; set; } + public string SslServerName { get; set; } + public string SslCertPath { get; set; } +} diff --git a/common/ASC.EventBus.ActiveMQ/ASC.EventBus.ActiveMQ.csproj b/common/ASC.EventBus.ActiveMQ/ASC.EventBus.ActiveMQ.csproj new file mode 100644 index 0000000000..54b5c44169 --- /dev/null +++ b/common/ASC.EventBus.ActiveMQ/ASC.EventBus.ActiveMQ.csproj @@ -0,0 +1,20 @@ + + + + net6.0 + enable + disable + enable + + + + + + + + + + + + + diff --git a/common/ASC.EventBus.ActiveMQ/DefaultActiveMQPersistentConnection.cs b/common/ASC.EventBus.ActiveMQ/DefaultActiveMQPersistentConnection.cs new file mode 100644 index 0000000000..e46584f8bf --- /dev/null +++ b/common/ASC.EventBus.ActiveMQ/DefaultActiveMQPersistentConnection.cs @@ -0,0 +1,175 @@ +// (c) Copyright Ascensio System SIA 2010-2022 +// +// This program is a free software product. +// You can redistribute it and/or modify it under the terms +// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software +// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended +// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of +// any third-party rights. +// +// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see +// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html +// +// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021. +// +// The interactive user interfaces in modified source and object code versions of the Program must +// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3. +// +// Pursuant to Section 7(b) of the License you must retain the original Product logo when +// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under +// trademark law for use of our trademarks. +// +// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing +// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 +// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + +using ASC.EventBus.ActiveMQ.Log; + +namespace ASC.EventBus.ActiveMQ; + +public class DefaultActiveMQPersistentConnection + : IActiveMQPersistentConnection +{ + private readonly IConnectionFactory _connectionFactory; + private readonly ILogger _logger; + private readonly int _retryCount; + private IConnection _connection; + private bool _disposed; + readonly object sync_root = new object(); + + public DefaultActiveMQPersistentConnection(IConnectionFactory connectionFactory, ILogger logger, int retryCount = 5) + { + _connectionFactory = connectionFactory ?? throw new ArgumentNullException(nameof(connectionFactory)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _retryCount = retryCount; + } + + public bool IsConnected + { + get + { + return _connection != null && _connection.IsStarted && !_disposed; + } + } + + public ISession CreateSession() + { + return CreateSession(AcknowledgementMode.AutoAcknowledge); + } + + public void Dispose() + { + if (_disposed) + { + return; + } + + _disposed = true; + + try + { + _connection.ExceptionListener -= OnExceptionListener; + _connection.ConnectionInterruptedListener -= OnConnectionInterruptedListener; + _connection.ConnectionResumedListener -= OnConnectionResumedListener; + + _connection.Dispose(); + } + catch (IOException ex) + { + _logger.CriticalDefaultActiveMQPersistentConnection(ex); + } + } + + private void OnExceptionListener(Exception exception) + { + if (_disposed) + { + return; + } + + _logger.WarningActiveMQConnectionThrowException(); + + TryConnect(); + } + + private void OnConnectionResumedListener() + { + if (_disposed) + { + return; + } + + _logger.WarningActiveMQConnectionThrowException(); + + TryConnect(); + } + + private void OnConnectionInterruptedListener() + { + if (_disposed) + { + return; + } + + _logger.WarningActiveMQConnectionThrowException(); + + TryConnect(); + } + + public bool TryConnect() + { + _logger.InformationActiveMQTryingConnect(); + + lock (sync_root) + { + var policy = Policy.Handle() + .WaitAndRetry(_retryCount, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), (ex, time) => + { + _logger.WarningActiveMQCouldNotConnect(time.TotalSeconds, ex); + } + ); + + policy.Execute(() => + { + _connection = _connectionFactory + .CreateConnection(); + _connection.Start(); + }); + + if (IsConnected) + { + _connection.ExceptionListener += OnExceptionListener; + _connection.ConnectionInterruptedListener += OnConnectionInterruptedListener; + _connection.ConnectionResumedListener += OnConnectionResumedListener; + + if (_connection is Apache.NMS.AMQP.NmsConnection) + { + var hostname = ((Apache.NMS.AMQP.NmsConnection)_connection).ConnectionInfo.ConfiguredUri.Host; + + _logger.InformationActiveMQAcquiredPersistentConnection(hostname); + + } + + + return true; + } + else + { + _logger.CriticalActiveMQCouldNotBeCreated(); + + return false; + } + } + } + + public ISession CreateSession(AcknowledgementMode acknowledgementMode) + { + if (!IsConnected) + { + throw new InvalidOperationException("No ActiveMQ connections are available to perform this action"); + } + + return _connection.CreateSession(acknowledgementMode); + } +} diff --git a/common/ASC.EventBus.ActiveMQ/EventBusActiveMQ.cs b/common/ASC.EventBus.ActiveMQ/EventBusActiveMQ.cs new file mode 100644 index 0000000000..4d56f30ab6 --- /dev/null +++ b/common/ASC.EventBus.ActiveMQ/EventBusActiveMQ.cs @@ -0,0 +1,363 @@ +// (c) Copyright Ascensio System SIA 2010-2022 +// +// This program is a free software product. +// You can redistribute it and/or modify it under the terms +// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software +// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended +// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of +// any third-party rights. +// +// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see +// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html +// +// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021. +// +// The interactive user interfaces in modified source and object code versions of the Program must +// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3. +// +// Pursuant to Section 7(b) of the License you must retain the original Product logo when +// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under +// trademark law for use of our trademarks. +// +// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing +// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 +// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + +namespace ASC.EventBus.ActiveMQ; + +public class EventBusActiveMQ : IEventBus, IDisposable +{ + const string EXCHANGE_NAME = "asc_event_bus"; + const string AUTOFAC_SCOPE_NAME = "asc_event_bus"; + + private readonly ILogger _logger; + private readonly IEventBusSubscriptionsManager _subsManager; + private readonly ILifetimeScope _autofac; + + private static ConcurrentQueue _rejectedEvents; + private readonly IActiveMQPersistentConnection _persistentConnection; + private readonly IIntegrationEventSerializer _serializer; + private ISession _consumerSession; + + private readonly List _consumers; + + private readonly int _retryCount; + private string _queueName; + + public EventBusActiveMQ(IActiveMQPersistentConnection persistentConnection, + ILogger logger, + ILifetimeScope autofac, + IEventBusSubscriptionsManager subsManager, + IIntegrationEventSerializer serializer, + string queueName = null, + int retryCount = 5) + { + _persistentConnection = persistentConnection ?? throw new ArgumentNullException(nameof(persistentConnection)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + _subsManager = subsManager ?? new InMemoryEventBusSubscriptionsManager(); + _serializer = serializer; + _queueName = queueName; + _autofac = autofac; + _retryCount = retryCount; + _rejectedEvents = new ConcurrentQueue(); + _consumerSession = CreateConsumerSession(); + _subsManager.OnEventRemoved += SubsManager_OnEventRemoved; + _consumers = new List(); + } + + private void SubsManager_OnEventRemoved(object sender, string eventName) + { + if (!_persistentConnection.IsConnected) + { + _persistentConnection.TryConnect(); + } + + using (var session = _persistentConnection.CreateSession()) + { + var messageSelector = $"eventName='{eventName}'"; + + var findedConsumer = _consumers.Find(x => x.MessageSelector == messageSelector); + + if (findedConsumer != null) + { + findedConsumer.Close(); + + _consumers.Remove(findedConsumer); + } + + if (_subsManager.IsEmpty) + { + _queueName = string.Empty; + _consumerSession.Close(); + } + } + } + + public void Publish(IntegrationEvent @event) + { + if (!_persistentConnection.IsConnected) + { + _persistentConnection.TryConnect(); + } + + var policy = Policy.Handle() + .WaitAndRetry(_retryCount, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), (ex, time) => + { + _logger.WarningCouldNotPublishEvent(@event.Id, time.TotalSeconds, ex); + }); + + using (var session = _persistentConnection.CreateSession(AcknowledgementMode.ClientAcknowledge)) + { + var destination = session.GetQueue(_queueName); + + using (var producer = session.CreateProducer(destination)) + { + producer.DeliveryMode = MsgDeliveryMode.Persistent; + + var body = _serializer.Serialize(@event); + + var request = session.CreateStreamMessage(); + var eventName = @event.GetType().Name; + + request.Properties["eventName"] = eventName; + + request.WriteBytes(body); + + producer.Send(request); + } + } + } + + public void Subscribe() + where T : IntegrationEvent + where TH : IIntegrationEventHandler + { + var eventName = _subsManager.GetEventKey(); + + _logger.InformationSubscribing(eventName, typeof(TH).GetGenericTypeName()); + + _subsManager.AddSubscription(); + + StartBasicConsume(eventName); + } + + public void SubscribeDynamic(string eventName) where TH : IDynamicIntegrationEventHandler + { + _logger.InformationSubscribingDynamic(eventName, typeof(TH).GetGenericTypeName()); + + _subsManager.AddDynamicSubscription(eventName); + + StartBasicConsume(eventName); + } + + private ISession CreateConsumerSession() + { + if (!_persistentConnection.IsConnected) + { + _persistentConnection.TryConnect(); + } + + _logger.TraceCreatingConsumerSession(); + + _consumerSession = _persistentConnection.CreateSession(AcknowledgementMode.ClientAcknowledge); + + return _consumerSession; + } + + private void StartBasicConsume(string eventName) + { + _logger.TraceStartingBasicConsume(); + + if (!_persistentConnection.IsConnected) + { + _persistentConnection.TryConnect(); + } + + var destination = _consumerSession.GetQueue(_queueName); + + var messageSelector = $"eventName='{eventName}'"; + + var consumer = _consumerSession.CreateConsumer(destination, messageSelector); + + _consumers.Add(consumer); + + if (_consumerSession != null) + { + consumer.Listener += Consumer_Listener; + } + else + { + _logger.ErrorStartBasicConsumeCantCall(); + } + } + + private void Consumer_Listener(IMessage objMessage) + { + var streamMessage = objMessage as IStreamMessage; + + var eventName = streamMessage.Properties["eventName"].ToString(); + + var buffer = new byte[4 * 1024]; + + byte[] serializedMessage; + + using (var ms = new MemoryStream()) + { + int read; + + while ((read = streamMessage.ReadBytes(buffer)) > 0) + { + ms.Write(buffer, 0, read); + + if (read < buffer.Length) + { + break; + } + } + + serializedMessage = ms.ToArray(); + } + + var @event = GetEvent(eventName, serializedMessage); + var message = @event.ToString(); + + try + { + if (message.ToLowerInvariant().Contains("throw-fake-exception")) + { + throw new InvalidOperationException($"Fake exception requested: \"{message}\""); + } + + ProcessEvent(eventName, @event) + .GetAwaiter() + .GetResult(); + + streamMessage.Acknowledge(); + } + catch (IntegrationEventRejectExeption ex) + { + _logger.WarningProcessingMessage(message, ex); + + if (_rejectedEvents.TryPeek(out var result) && result.Equals(ex.EventId)) + { + _rejectedEvents.TryDequeue(out var _); + streamMessage.Acknowledge(); + } + else + { + _rejectedEvents.Enqueue(ex.EventId); + } + + } + catch (Exception ex) + { + _logger.WarningProcessingMessage(message, ex); + + streamMessage.Acknowledge(); + } + } + + private IntegrationEvent GetEvent(string eventName, byte[] serializedMessage) + { + var eventType = _subsManager.GetEventTypeByName(eventName); + + var integrationEvent = (IntegrationEvent)_serializer.Deserialize(serializedMessage, eventType); + + return integrationEvent; + } + + + public void Unsubscribe() + where T : IntegrationEvent + where TH : IIntegrationEventHandler + { + var eventName = _subsManager.GetEventKey(); + + _logger.InformationUnsubscribing(eventName); + + _subsManager.RemoveSubscription(); + } + + public void UnsubscribeDynamic(string eventName) where TH : IDynamicIntegrationEventHandler + { + _subsManager.RemoveDynamicSubscription(eventName); + } + + private void PreProcessEvent(IntegrationEvent @event) + { + if (_rejectedEvents.Count == 0) + { + return; + } + + if (_rejectedEvents.TryPeek(out var result) && result.Equals(@event.Id)) + { + @event.Redelivered = true; + } + } + + private async Task ProcessEvent(string eventName, IntegrationEvent @event) + { + _logger.TraceProcessingEvent(eventName); + + PreProcessEvent(@event); + + if (_subsManager.HasSubscriptionsForEvent(eventName)) + { + using (var scope = _autofac.BeginLifetimeScope(AUTOFAC_SCOPE_NAME)) + { + var subscriptions = _subsManager.GetHandlersForEvent(eventName); + + foreach (var subscription in subscriptions) + { + if (subscription.IsDynamic) + { + var handler = scope.ResolveOptional(subscription.HandlerType) as IDynamicIntegrationEventHandler; + if (handler == null) + { + continue; + } + + using dynamic eventData = @event; + await Task.Yield(); + await handler.Handle(eventData); + } + else + { + var handler = scope.ResolveOptional(subscription.HandlerType); + if (handler == null) + { + continue; + } + + var eventType = _subsManager.GetEventTypeByName(eventName); + var concreteType = typeof(IIntegrationEventHandler<>).MakeGenericType(eventType); + + await Task.Yield(); + await (Task)concreteType.GetMethod("Handle").Invoke(handler, new object[] { @event }); + } + } + } + } + else + { + _logger.WarningNoSubscription(eventName); + } + } + + public void Dispose() + { + foreach (var consumer in _consumers) + { + consumer.Dispose(); + } + + if (_consumerSession != null) + { + _consumerSession.Dispose(); + } + + _subsManager.Clear(); + } +} \ No newline at end of file diff --git a/common/ASC.EventBus.ActiveMQ/GlobalUsings.cs b/common/ASC.EventBus.ActiveMQ/GlobalUsings.cs new file mode 100644 index 0000000000..2236131caf --- /dev/null +++ b/common/ASC.EventBus.ActiveMQ/GlobalUsings.cs @@ -0,0 +1,42 @@ +// (c) Copyright Ascensio System SIA 2010-2022 +// +// This program is a free software product. +// You can redistribute it and/or modify it under the terms +// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software +// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended +// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of +// any third-party rights. +// +// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see +// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html +// +// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021. +// +// The interactive user interfaces in modified source and object code versions of the Program must +// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3. +// +// Pursuant to Section 7(b) of the License you must retain the original Product logo when +// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under +// trademark law for use of our trademarks. +// +// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing +// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 +// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + +global using System.Collections.Concurrent; +global using System.Net.Sockets; + +global using ASC.EventBus.Abstractions; +global using ASC.EventBus.Events; +global using ASC.EventBus.ActiveMQ.Log; +global using Apache.NMS; +global using Autofac; + +global using Microsoft.Extensions.Logging; + +global using Polly; + +global using ASC.EventBus.Exceptions; +global using ASC.EventBus.Extensions; +global using ASC.EventBus.Serializers; diff --git a/common/ASC.EventBus.ActiveMQ/IActiveMQPersistentConnection.cs b/common/ASC.EventBus.ActiveMQ/IActiveMQPersistentConnection.cs new file mode 100644 index 0000000000..103978f6ff --- /dev/null +++ b/common/ASC.EventBus.ActiveMQ/IActiveMQPersistentConnection.cs @@ -0,0 +1,35 @@ +// (c) Copyright Ascensio System SIA 2010-2022 +// +// This program is a free software product. +// You can redistribute it and/or modify it under the terms +// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software +// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended +// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of +// any third-party rights. +// +// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see +// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html +// +// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021. +// +// The interactive user interfaces in modified source and object code versions of the Program must +// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3. +// +// Pursuant to Section 7(b) of the License you must retain the original Product logo when +// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under +// trademark law for use of our trademarks. +// +// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing +// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 +// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + +namespace ASC.EventBus.ActiveMQ; + +public interface IActiveMQPersistentConnection +{ + bool IsConnected { get; } + bool TryConnect(); + ISession CreateSession(AcknowledgementMode acknowledgementMode); + ISession CreateSession(); +} \ No newline at end of file diff --git a/common/ASC.EventBus.ActiveMQ/Log/DefaultActiveMQPersistentConnectionLogger.cs b/common/ASC.EventBus.ActiveMQ/Log/DefaultActiveMQPersistentConnectionLogger.cs new file mode 100644 index 0000000000..23d9c83936 --- /dev/null +++ b/common/ASC.EventBus.ActiveMQ/Log/DefaultActiveMQPersistentConnectionLogger.cs @@ -0,0 +1,53 @@ +// (c) Copyright Ascensio System SIA 2010-2022 +// +// This program is a free software product. +// You can redistribute it and/or modify it under the terms +// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software +// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended +// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of +// any third-party rights. +// +// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see +// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html +// +// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021. +// +// The interactive user interfaces in modified source and object code versions of the Program must +// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3. +// +// Pursuant to Section 7(b) of the License you must retain the original Product logo when +// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under +// trademark law for use of our trademarks. +// +// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing +// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 +// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + +namespace ASC.EventBus.ActiveMQ.Log; +internal static partial class DefaultActiveMQPersistentConnectionLogger +{ + [LoggerMessage(Level = LogLevel.Critical, Message = "DefaultActiveMQPersistentConnection")] + public static partial void CriticalDefaultActiveMQPersistentConnection(this ILogger logger, Exception exception); + + [LoggerMessage(Level = LogLevel.Information, Message = "ActiveMQ Client is trying to connect")] + public static partial void InformationActiveMQTryingConnect(this ILogger logger); + + [LoggerMessage(Level = LogLevel.Warning, Message = "ActiveMQ Client could not connect after {timeOut}s")] + public static partial void WarningActiveMQCouldNotConnect(this ILogger logger, double timeOut, Exception exception); + + [LoggerMessage(Level = LogLevel.Information, Message = "ActiveMQ Client acquired a persistent connection to '{hostName}' and is subscribed to failure events")] + public static partial void InformationActiveMQAcquiredPersistentConnection(this ILogger logger, string hostName); + + [LoggerMessage(Level = LogLevel.Critical, Message = "FATAL ERROR: ActiveMQ connections could not be created and opened")] + public static partial void CriticalActiveMQCouldNotBeCreated(this ILogger logger); + + [LoggerMessage(Level = LogLevel.Warning, Message = "A ActiveMQ connection is shutdown. Trying to re-connect...")] + public static partial void WarningActiveMQConnectionShutdown(this ILogger logger); + + [LoggerMessage(Level = LogLevel.Warning, Message = "A ActiveMQ connection throw exception. Trying to re-connect...")] + public static partial void WarningActiveMQConnectionThrowException(this ILogger logger); + + [LoggerMessage(Level = LogLevel.Warning, Message = "A ActiveMQ connection is on shutdown. Trying to re-connect...")] + public static partial void WarningActiveMQConnectionIsOnShutDown(this ILogger logger); +} diff --git a/common/ASC.EventBus.ActiveMQ/Log/EventBusActiveMQLogger.cs b/common/ASC.EventBus.ActiveMQ/Log/EventBusActiveMQLogger.cs new file mode 100644 index 0000000000..1e093c9dd6 --- /dev/null +++ b/common/ASC.EventBus.ActiveMQ/Log/EventBusActiveMQLogger.cs @@ -0,0 +1,74 @@ +// (c) Copyright Ascensio System SIA 2010-2022 +// +// This program is a free software product. +// You can redistribute it and/or modify it under the terms +// of the GNU Affero General Public License (AGPL) version 3 as published by the Free Software +// Foundation. In accordance with Section 7(a) of the GNU AGPL its Section 15 shall be amended +// to the effect that Ascensio System SIA expressly excludes the warranty of non-infringement of +// any third-party rights. +// +// This program is distributed WITHOUT ANY WARRANTY, without even the implied warranty +// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For details, see +// the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html +// +// You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia, EU, LV-1021. +// +// The interactive user interfaces in modified source and object code versions of the Program must +// display Appropriate Legal Notices, as required under Section 5 of the GNU AGPL version 3. +// +// Pursuant to Section 7(b) of the License you must retain the original Product logo when +// distributing the program. Pursuant to Section 7(e) we decline to grant you any rights under +// trademark law for use of our trademarks. +// +// All the Product's GUI elements, including illustrations and icon sets, as well as technical writing +// content are licensed under the terms of the Creative Commons Attribution-ShareAlike 4.0 +// International. See the License terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + +namespace ASC.EventBus.ActiveMQ.Log; +internal static partial class EventBusActiveMQLogger +{ + [LoggerMessage(Level = LogLevel.Warning, Message = "Could not publish event: {eventId} after {timeout}s")] + public static partial void WarningCouldNotPublishEvent(this ILogger logger, Guid eventId, double timeout, Exception exception); + + [LoggerMessage(Level = LogLevel.Trace, Message = "Creating ActiveMQ session to publish event: {eventId} ({eventName})")] + public static partial void TraceCreatingActiveMQSession(this ILogger logger, Guid eventId, string eventName); + + [LoggerMessage(Level = LogLevel.Trace, Message = "Declaring ActiveMQ exchange to publish event: {eventId}")] + public static partial void TraceDeclaringActiveMQSession(this ILogger logger, Guid eventId); + + [LoggerMessage(Level = LogLevel.Trace, Message = "Publishing event to ActiveMQ: {eventId}")] + public static partial void TracePublishingEvent(this ILogger logger, Guid eventId); + + [LoggerMessage(Level = LogLevel.Information, Message = "Subscribing to dynamic event {eventName} with {eventHandler}")] + public static partial void InformationSubscribingDynamic(this ILogger logger, string eventName, string eventHandler); + + [LoggerMessage(Level = LogLevel.Information, Message = "Subscribing to event {eventName} with {eventHandler}")] + public static partial void InformationSubscribing(this ILogger logger, string eventName, string eventHandler); + + [LoggerMessage(Level = LogLevel.Information, Message = "Unsubscribing from event {eventName}")] + public static partial void InformationUnsubscribing(this ILogger logger, string eventName); + + [LoggerMessage(Level = LogLevel.Trace, Message = "Starting ActiveMQ basic consume")] + public static partial void TraceStartingBasicConsume(this ILogger logger); + + [LoggerMessage(Level = LogLevel.Trace, Message = "Consumer tag {consumerTag} already exist. Cancelled BasicConsume again")] + public static partial void TraceConsumerTagExist(this ILogger logger, string consumerTag); + + [LoggerMessage(Level = LogLevel.Error, Message = "StartBasicConsume can't call on _consumerSession == null")] + public static partial void ErrorStartBasicConsumeCantCall(this ILogger logger); + + [LoggerMessage(Level = LogLevel.Warning, Message = "----- ERROR Processing message \"{message}\"")] + public static partial void WarningProcessingMessage(this ILogger logger, string message, Exception exception); + + [LoggerMessage(Level = LogLevel.Trace, Message = "Creating ActiveMQ consumer session")] + public static partial void TraceCreatingConsumerSession(this ILogger logger); + + [LoggerMessage(Level = LogLevel.Warning, Message = "Recreating ActiveMQ consumer session")] + public static partial void WarningRecreatingConsumerSession(this ILogger logger, Exception exception); + + [LoggerMessage(Level = LogLevel.Trace, Message = "Processing ActiveMQ event: {eventName}")] + public static partial void TraceProcessingEvent(this ILogger logger, string eventName); + + [LoggerMessage(Level = LogLevel.Warning, Message = "No subscription for ActiveMQ event: {eventName}")] + public static partial void WarningNoSubscription(this ILogger logger, string eventName); +} diff --git a/common/ASC.EventBus.RabbitMQ/EventBusRabbitMQ.cs b/common/ASC.EventBus.RabbitMQ/EventBusRabbitMQ.cs index cf974ec5c8..e6da29c8f6 100644 --- a/common/ASC.EventBus.RabbitMQ/EventBusRabbitMQ.cs +++ b/common/ASC.EventBus.RabbitMQ/EventBusRabbitMQ.cs @@ -65,7 +65,6 @@ public class EventBusRabbitMQ : IEventBus, IDisposable _subsManager.OnEventRemoved += SubsManager_OnEventRemoved; _serializer = serializer; _rejectedEvents = new ConcurrentQueue(); - } private void SubsManager_OnEventRemoved(object sender, string eventName) @@ -250,22 +249,16 @@ public class EventBusRabbitMQ : IEventBus, IDisposable } catch (IntegrationEventRejectExeption ex) { - _logger.WarningProcessingMessage(message, ex); - - if (eventArgs.Redelivered) - { - if (_rejectedEvents.TryPeek(out var result) && result.Equals(ex.EventId)) - { - _rejectedEvents.TryDequeue(out var _); - _consumerChannel.BasicReject(eventArgs.DeliveryTag, requeue: false); - } - else - { - _rejectedEvents.Enqueue(ex.EventId); - } - } - else - { + _logger.WarningProcessingMessage(message, ex); + + if (_rejectedEvents.TryPeek(out var result) && result.Equals(ex.EventId)) + { + _rejectedEvents.TryDequeue(out var _); + _consumerChannel.BasicReject(eventArgs.DeliveryTag, requeue: false); + } + else + { + _rejectedEvents.Enqueue(ex.EventId); _consumerChannel.BasicNack(eventArgs.DeliveryTag, multiple: false, requeue: true); } } diff --git a/config/activemq.json b/config/activemq.json new file mode 100644 index 0000000000..9d1e05bcae --- /dev/null +++ b/config/activemq.json @@ -0,0 +1,5 @@ +{ + "ActiveMQ": { + "Uri": "amqp://127.0.0.1:5672" + } +} \ No newline at end of file From 21628d2ef7163219bdd5b256e7f09a613408bd60 Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Wed, 12 Oct 2022 14:59:17 +0300 Subject: [PATCH 06/20] Web: fixed styles --- packages/common/custom.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/common/custom.scss b/packages/common/custom.scss index 68b5f428f2..d648207645 100644 --- a/packages/common/custom.scss +++ b/packages/common/custom.scss @@ -6,6 +6,7 @@ $font-family-base: "Open Sans", sans-serif; html, body { height: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } #root { min-height: 100%; From 905e98450dc4e160be389d0f5d30a302c59aa141 Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Wed, 12 Oct 2022 14:59:41 +0300 Subject: [PATCH 07/20] Web: Client: fixed header jumps --- packages/client/src/pages/Home/Section/Header/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/client/src/pages/Home/Section/Header/index.js b/packages/client/src/pages/Home/Section/Header/index.js index 5d286de435..17f4d6fdb4 100644 --- a/packages/client/src/pages/Home/Section/Header/index.js +++ b/packages/client/src/pages/Home/Section/Header/index.js @@ -23,6 +23,7 @@ import { getMainButtonItems } from "SRC_DIR/helpers/plugins"; const StyledContainer = styled.div` width: 100%; min-height: 33px; + height: 33px; .table-container_group-menu { margin: 0 0 0 -20px; From 6b12fe9e1ebc635348d2cd7325fd26bf79dc4938 Mon Sep 17 00:00:00 2001 From: Alexey Safronov Date: Wed, 12 Oct 2022 15:25:56 +0300 Subject: [PATCH 08/20] Added public volume --- build/install/docker/docspace.dev.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/build/install/docker/docspace.dev.yml b/build/install/docker/docspace.dev.yml index f30c47734f..3d62bf9e3b 100644 --- a/build/install/docker/docspace.dev.yml +++ b/build/install/docker/docspace.dev.yml @@ -180,6 +180,7 @@ services: - SERVICE_PORT=${SERVICE_PORT} volumes: - proxy_log:/var/log/nginx + - /Users/holomoot/Documents/GitHub/AppServer/public:/var/www/public networks: default: From 4d4a09d8e757b98a6e6f114d651645d87abcba16 Mon Sep 17 00:00:00 2001 From: Tatiana Lopaeva Date: Wed, 12 Oct 2022 16:03:19 +0300 Subject: [PATCH 09/20] Web: The edit button has been removed. --- .../Body/sub-components/CommentEditor.js | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/packages/client/src/pages/Home/InfoPanel/Body/sub-components/CommentEditor.js b/packages/client/src/pages/Home/InfoPanel/Body/sub-components/CommentEditor.js index 8857a944be..a99711cd3e 100644 --- a/packages/client/src/pages/Home/InfoPanel/Body/sub-components/CommentEditor.js +++ b/packages/client/src/pages/Home/InfoPanel/Body/sub-components/CommentEditor.js @@ -11,7 +11,7 @@ const CommentEditor = ({ item, setSelection, - + isRecycleBinFolder, fetchFileVersions, updateCommentVersion, }) => { @@ -60,15 +60,17 @@ const CommentEditor = ({ {comment} )} -
- -
- {comment ? t("Common:EditButton") : t("Common:AddButton")} + {!isRecycleBinFolder && ( +
+ +
+ {comment ? t("Common:EditButton") : t("Common:AddButton")} +
-
+ )}
) : (
@@ -101,14 +103,14 @@ const CommentEditor = ({ ); }; -export default inject(({ auth, versionHistoryStore }) => { +export default inject(({ auth, versionHistoryStore, treeFoldersStore }) => { const { setSelection } = auth.infoPanelStore; const { fetchFileVersions, updateCommentVersion } = versionHistoryStore; - + const { isRecycleBinFolder } = treeFoldersStore; return { setSelection, - + isRecycleBinFolder, fetchFileVersions, updateCommentVersion, }; From d19639f7c00e06d9504391d80f4150de00fa018a Mon Sep 17 00:00:00 2001 From: Tatiana Lopaeva Date: Wed, 12 Oct 2022 16:04:05 +0300 Subject: [PATCH 10/20] Web: PortalSettings: Removed useless code after merge. --- .../categories/common/settingsBranding/whitelabel.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/client/src/pages/PortalSettings/categories/common/settingsBranding/whitelabel.js b/packages/client/src/pages/PortalSettings/categories/common/settingsBranding/whitelabel.js index 0942c81ad2..fefaf7560e 100644 --- a/packages/client/src/pages/PortalSettings/categories/common/settingsBranding/whitelabel.js +++ b/packages/client/src/pages/PortalSettings/categories/common/settingsBranding/whitelabel.js @@ -449,7 +449,6 @@ const WhiteLabel = (props) => { fontWeight="600" isHovered type="action" - color={!isPortalPaid ? "#A3A9AE" : ""} className="settings_unavailable" > {t("ChangeLogoButton")} @@ -505,7 +504,6 @@ const WhiteLabel = (props) => { fontWeight="600" isHovered type="action" - color={!isPortalPaid ? "#A3A9AE" : ""} className="settings_unavailable" > {t("ChangeLogoButton")} @@ -561,7 +559,6 @@ const WhiteLabel = (props) => { fontWeight="600" isHovered type="action" - color={!isPortalPaid ? "#A3A9AE" : ""} className="settings_unavailable" > {t("ChangeLogoButton")} @@ -617,7 +614,6 @@ const WhiteLabel = (props) => { fontWeight="600" isHovered type="action" - color={!isPortalPaid ? "#A3A9AE" : ""} className="settings_unavailable" > {t("ChangeLogoButton")} @@ -674,7 +670,6 @@ const WhiteLabel = (props) => { fontWeight="600" isHovered type="action" - color={!isPortalPaid ? "#A3A9AE" : ""} className="settings_unavailable" > {t("ChangeLogoButton")} @@ -779,7 +774,6 @@ const WhiteLabel = (props) => { fontWeight="600" isHovered type="action" - color={!isPortalPaid ? "#A3A9AE" : ""} className="settings_unavailable" > {t("ChangeLogoButton")} @@ -836,7 +830,6 @@ const WhiteLabel = (props) => { fontWeight="600" isHovered type="action" - color={!isPortalPaid ? "#A3A9AE" : ""} className="settings_unavailable" > {t("ChangeLogoButton")} From 1c5bea4fcc99059a6e58fa1ed886d81bd00a4556 Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Wed, 12 Oct 2022 17:02:07 +0300 Subject: [PATCH 11/20] fix cache --- common/ASC.Core.Common/Billing/TariffService.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/ASC.Core.Common/Billing/TariffService.cs b/common/ASC.Core.Common/Billing/TariffService.cs index a61653cad2..262109f1f4 100644 --- a/common/ASC.Core.Common/Billing/TariffService.cs +++ b/common/ASC.Core.Common/Billing/TariffService.cs @@ -210,6 +210,7 @@ public class TariffService : ITariffService if (SaveBillingInfo(tenantId, asynctariff)) { asynctariff = CalculateTariff(tenantId, asynctariff); + tariff = asynctariff; } tariffId = asynctariff.Id; @@ -237,6 +238,7 @@ public class TariffService : ITariffService if (SaveBillingInfo(tenantId, asynctariff)) { asynctariff = CalculateTariff(tenantId, asynctariff); + tariff = asynctariff; } tariffId = asynctariff.Id; From 44149d47b7c0fac9a36bc818509362421be5c0bc Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Wed, 12 Oct 2022 18:53:48 +0300 Subject: [PATCH 12/20] Users: trash, favorites, recent folders --- products/ASC.Files/Core/Core/Security/FileSecurity.cs | 10 ---------- products/ASC.Files/Core/Helpers/Global.cs | 10 ---------- .../Server/Helpers/FoldersControllerHelper.cs | 10 ++++++---- products/ASC.People/Server/Api/UserController.cs | 6 ------ 4 files changed, 6 insertions(+), 30 deletions(-) diff --git a/products/ASC.Files/Core/Core/Security/FileSecurity.cs b/products/ASC.Files/Core/Core/Security/FileSecurity.cs index 05a5c037e5..319c885306 100644 --- a/products/ASC.Files/Core/Core/Security/FileSecurity.cs +++ b/products/ASC.Files/Core/Core/Security/FileSecurity.cs @@ -509,16 +509,6 @@ public class FileSecurity : IFileSecurity return false; } - if (isVisitor && e.RootFolderType == FolderType.Recent) - { - return false; - } - - if (isVisitor && e.RootFolderType == FolderType.Favorites) - { - return false; - } - if (isVisitor && e.RootFolderType == FolderType.Templates) { return false; diff --git a/products/ASC.Files/Core/Helpers/Global.cs b/products/ASC.Files/Core/Helpers/Global.cs index f240fbc7dc..ca343451fa 100644 --- a/products/ASC.Files/Core/Helpers/Global.cs +++ b/products/ASC.Files/Core/Helpers/Global.cs @@ -522,11 +522,6 @@ public class GlobalFolder return 0; } - if (_userManager.IsVisitor(_authContext.CurrentAccount.ID)) - { - return 0; - } - if (!RecentFolderCache.TryGetValue(_tenantManager.GetCurrentTenant().Id, out var recentFolderId)) { var folderDao = daoFactory.GetFolderDao(); @@ -551,11 +546,6 @@ public class GlobalFolder return 0; } - if (_userManager.IsVisitor(_authContext.CurrentAccount.ID)) - { - return 0; - } - if (!FavoritesFolderCache.TryGetValue(_tenantManager.GetCurrentTenant().Id, out var favoriteFolderId)) { var folderDao = daoFactory.GetFolderDao(); diff --git a/products/ASC.Files/Server/Helpers/FoldersControllerHelper.cs b/products/ASC.Files/Server/Helpers/FoldersControllerHelper.cs index f8b0f7e579..039ecac9c2 100644 --- a/products/ASC.Files/Server/Helpers/FoldersControllerHelper.cs +++ b/products/ASC.Files/Server/Helpers/FoldersControllerHelper.cs @@ -114,7 +114,7 @@ public class FoldersControllerHelper : FilesHelperBase yield return await _globalFolderHelper.FolderShareAsync; } - if (!IsVisitor && !withoutAdditionalFolder) + if (!withoutAdditionalFolder) { if (_filesSettingsHelper.FavoritesSection) { @@ -126,8 +126,10 @@ public class FoldersControllerHelper : FilesHelperBase yield return await _globalFolderHelper.FolderRecentAsync; } - if (!_coreBaseSettings.Personal && _coreBaseSettings.DisableDocSpace - && PrivacyRoomSettings.IsAvailable()) + if (!IsVisitor && + !_coreBaseSettings.Personal && + _coreBaseSettings.DisableDocSpace && + PrivacyRoomSettings.IsAvailable()) { yield return await _globalFolderHelper.FolderPrivacyAsync; } @@ -147,7 +149,7 @@ public class FoldersControllerHelper : FilesHelperBase yield return await _globalFolderHelper.FolderTemplatesAsync; } - if (!withoutTrash) + if (!withoutTrash && !IsVisitor) { yield return (int)_globalFolderHelper.FolderTrash; } diff --git a/products/ASC.People/Server/Api/UserController.cs b/products/ASC.People/Server/Api/UserController.cs index 827e9a4bd9..26260c98c8 100644 --- a/products/ASC.People/Server/Api/UserController.cs +++ b/products/ASC.People/Server/Api/UserController.cs @@ -32,8 +32,6 @@ public class UserController : PeopleControllerBase private readonly ICache _cache; private readonly TenantManager _tenantManager; - private readonly GlobalSpace _globalSpace; - private readonly Constants _constants; private readonly CookiesManager _cookiesManager; private readonly CoreBaseSettings _coreBaseSettings; private readonly CustomNamingPeople _customNamingPeople; @@ -69,8 +67,6 @@ public class UserController : PeopleControllerBase public UserController( ICache cache, TenantManager tenantManager, - GlobalSpace globalSpace, - Constants constants, CookiesManager cookiesManager, CoreBaseSettings coreBaseSettings, CustomNamingPeople customNamingPeople, @@ -112,8 +108,6 @@ public class UserController : PeopleControllerBase { _cache = cache; _tenantManager = tenantManager; - _globalSpace = globalSpace; - _constants = constants; _cookiesManager = cookiesManager; _coreBaseSettings = coreBaseSettings; _customNamingPeople = customNamingPeople; From c7fbe5d87c4c040cf3bca13a5e1a141df4e58d6f Mon Sep 17 00:00:00 2001 From: pavelbannov Date: Thu, 13 Oct 2022 12:30:24 +0300 Subject: [PATCH 13/20] Billing: fix cache --- .../ASC.Core.Common/Billing/TariffService.cs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/common/ASC.Core.Common/Billing/TariffService.cs b/common/ASC.Core.Common/Billing/TariffService.cs index 262109f1f4..7923d65505 100644 --- a/common/ASC.Core.Common/Billing/TariffService.cs +++ b/common/ASC.Core.Common/Billing/TariffService.cs @@ -45,6 +45,8 @@ public class TariffServiceStorage Notify = notify; Notify.Subscribe((i) => { + Cache.Insert(TariffService.GetTariffNeedToUpdateCacheKey(i.TenantId), "update", _cacheExpiration); + Cache.Remove(TariffService.GetTariffCacheKey(i.TenantId)); Cache.Remove(TariffService.GetBillingUrlCacheKey(i.TenantId)); Cache.Remove(TariffService.GetBillingPaymentCacheKey(i.TenantId)); // clear all payments @@ -169,7 +171,11 @@ public class TariffService : ITariffService { tariff = GetBillingInfo(tenantId) ?? CreateDefault(); tariff = CalculateTariff(tenantId, tariff); - tariffId = tariff.Id; + + if (string.IsNullOrEmpty(_cache.Get(GetTariffNeedToUpdateCacheKey(tenantId)))) + { + tariffId = tariff.Id; + } if (_billingClient.Configured && withRequestToPaymentSystem) { @@ -211,9 +217,8 @@ public class TariffService : ITariffService { asynctariff = CalculateTariff(tenantId, asynctariff); tariff = asynctariff; + tariffId = asynctariff.Id; } - - tariffId = asynctariff.Id; } catch (BillingNotFoundException) { @@ -239,9 +244,8 @@ public class TariffService : ITariffService { asynctariff = CalculateTariff(tenantId, asynctariff); tariff = asynctariff; + tariffId = asynctariff.Id; } - - tariffId = asynctariff.Id; } catch (Exception error) { @@ -369,6 +373,11 @@ public class TariffService : ITariffService return $"{tenantId}:tariff"; } + internal static string GetTariffNeedToUpdateCacheKey(int tenantId) + { + return $"{tenantId}:update"; + } + internal static string GetBillingUrlCacheKey(int tenantId) { return $"{tenantId}:billing:urls"; From db926fee0e9e3c94ebf1ceaeb6bfaf3416a86b7b Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Thu, 13 Oct 2022 12:51:40 +0300 Subject: [PATCH 14/20] Web: Files: fixed header context-menu --- packages/client/src/pages/Home/Section/Header/index.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/client/src/pages/Home/Section/Header/index.js b/packages/client/src/pages/Home/Section/Header/index.js index 17f4d6fdb4..2dd72ae674 100644 --- a/packages/client/src/pages/Home/Section/Header/index.js +++ b/packages/client/src/pages/Home/Section/Header/index.js @@ -304,7 +304,7 @@ class SectionHeaderContent extends React.Component { }; getContextOptionsFolder = () => { - const { t, toggleInfoPanel, personal } = this.props; + const { t, isRecycleBinFolder } = this.props; return [ { @@ -494,7 +494,6 @@ class SectionHeaderContent extends React.Component { isHeaderChecked, isHeaderIndeterminate, showText, - toggleInfoPanel, isRoomsFolder, isEmptyPage, } = this.props; From 43023619630ce4b0708efba0291ebee6e9b335aa Mon Sep 17 00:00:00 2001 From: gopienkonikita Date: Thu, 13 Oct 2022 12:52:11 +0300 Subject: [PATCH 15/20] Web: Client: fixed header styles --- packages/client/src/pages/AccountsHome/Section/Header/index.js | 3 +++ packages/client/src/pages/Home/Section/Header/index.js | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/client/src/pages/AccountsHome/Section/Header/index.js b/packages/client/src/pages/AccountsHome/Section/Header/index.js index f0368853b0..c12c6e2fcb 100644 --- a/packages/client/src/pages/AccountsHome/Section/Header/index.js +++ b/packages/client/src/pages/AccountsHome/Section/Header/index.js @@ -23,6 +23,8 @@ import withPeopleLoader from "SRC_DIR/HOCs/withPeopleLoader"; const StyledContainer = styled.div` width: 100%; + min-height: 33px; + height: 60px; .group-button-menu-container { margin: 0 0 0 -20px; @@ -142,6 +144,7 @@ const StyledInfoPanelToggleWrapper = styled.div` align-items: center; justify-content: center; border-radius: 50%; + margin-bottom: 1px; } `; diff --git a/packages/client/src/pages/Home/Section/Header/index.js b/packages/client/src/pages/Home/Section/Header/index.js index 2dd72ae674..0b28d5afb8 100644 --- a/packages/client/src/pages/Home/Section/Header/index.js +++ b/packages/client/src/pages/Home/Section/Header/index.js @@ -23,7 +23,6 @@ import { getMainButtonItems } from "SRC_DIR/helpers/plugins"; const StyledContainer = styled.div` width: 100%; min-height: 33px; - height: 33px; .table-container_group-menu { margin: 0 0 0 -20px; @@ -61,6 +60,7 @@ const StyledContainer = styled.div` .header-container { min-height: 33px; + height: 60px; } `; From 6cb1d7ac2146adac4fb410465aa54343630b9836 Mon Sep 17 00:00:00 2001 From: Alexey Safronov Date: Thu, 13 Oct 2022 14:28:26 +0300 Subject: [PATCH 16/20] Added new variables setup + refactoring --- build/build.backend.docker.sh | 82 ++++++++++++++ build/install/docker/.env.dev | 100 ------------------ build/install/docker/Dockerfile.dev | 28 +---- build/install/docker/docspace.dev.yml | 3 +- build/run/macos/api.sh | 10 -- build/run/macos/backend-environment.docker.sh | 15 --- build/run/macos/backend.docker.sh | 17 --- build/run/macos/backend.sh | 10 -- .../run/macos/docker-tools/docker-compose.yml | 20 ---- build/run/macos/files.service.sh | 11 -- build/run/macos/files.sh | 11 -- build/run/macos/people.sh | 11 -- build/run/macos/socket.sh | 10 -- build/run/macos/studio.sh | 11 -- 14 files changed, 85 insertions(+), 254 deletions(-) create mode 100755 build/build.backend.docker.sh delete mode 100644 build/install/docker/.env.dev delete mode 100755 build/run/macos/api.sh delete mode 100755 build/run/macos/backend-environment.docker.sh delete mode 100755 build/run/macos/backend.docker.sh delete mode 100755 build/run/macos/backend.sh delete mode 100644 build/run/macos/docker-tools/docker-compose.yml delete mode 100755 build/run/macos/files.service.sh delete mode 100755 build/run/macos/files.sh delete mode 100755 build/run/macos/people.sh delete mode 100755 build/run/macos/socket.sh delete mode 100755 build/run/macos/studio.sh diff --git a/build/build.backend.docker.sh b/build/build.backend.docker.sh new file mode 100755 index 0000000000..dd5cb9ec47 --- /dev/null +++ b/build/build.backend.docker.sh @@ -0,0 +1,82 @@ +#!/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 + +branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p') + +echo "GIT_BRANCH:" $branch + +cd $dir/build/install/docker/ + +docker_dir="$( pwd )" + +echo "Docker directory:" $docker_dir + +build_date=$(date +%Y-%m-%d) + +echo "BUILD DATE: $build_date" + +local_ip=$(ipconfig getifaddr en0) + +echo "LOCAL IP: $local_ip" + +doceditor=${local_ip}:5013 +login=${local_ip}:5011 +client=${local_ip}:5001 + +echo "SERVICE_DOCEDITOR: $doceditor" +echo "SERVICE_LOGIN: $login" +echo "SERVICE_CLIENT: $client" + +arch_name="$(uname -m)" + +echo "Run MySQL" + +if [ "${arch_name}" = "x86_64" ]; then + echo "CPU Type: x86_64 -> run db.yml" + docker compose -f db.yml up -d +elif [ "${arch_name}" = "arm64" ]; then + echo "CPU Type: arm64 -> run ddb.arm.yml" + docker compose -f db.arm.yml up -d +else + echo "Error: Unknown CPU Type: ${arch_name}." + exit 1 +fi + +echo "Run environments (redis, rabbitmq, document-server)" +DOCKERFILE=Dockerfile.dev \ +docker compose -f redis.yml -f rabbitmq.yml -f ds.yml up -d + +echo "Stop all backend services" +DOCKERFILE=Dockerfile.dev \ +docker compose -f docspace.dev.yml down -v + +echo "Build all backend services" +DOCKERFILE=Dockerfile.dev \ +RELEASE_DATE=$build_date \ +GIT_BRANCH=$branch \ +SERVICE_DOCEDITOR=$doceditor \ +SERVICE_LOGIN=$login \ +SERVICE_CLIENT=$client \ +docker compose -f build.dev.yml build + +echo "Run DB migration" +DOCKERFILE=Dockerfile.dev \ +docker compose -f migration-runner.yml + +echo "Start all backend services" +DOCKERFILE=Dockerfile.dev \ +ROOT_DIR=$dir \ +RELEASE_DATE=$build_date \ +GIT_BRANCH=$branch \ +SERVICE_DOCEDITOR=$doceditor \ +SERVICE_LOGIN=$login \ +SERVICE_CLIENT=$client \ +docker compose -f docspace.dev.yml up -d \ No newline at end of file diff --git a/build/install/docker/.env.dev b/build/install/docker/.env.dev deleted file mode 100644 index 6a6ba09c0e..0000000000 --- a/build/install/docker/.env.dev +++ /dev/null @@ -1,100 +0,0 @@ -LOCAL_IP=192.168.1.4 - -# docker-compose tags # - PRODUCT=onlyoffice - REPO=${PRODUCT} - STATUS="" - DOCKER_IMAGE_PREFIX=${STATUS}docspace - DOCKER_TAG=latest - CONTAINER_PREFIX=${PRODUCT}- - MYSQL_VERSION=8.0.18 - ELK_VERSION=7.13.1 - SERVICE_PORT=5050 - DOCUMENT_SERVER_IMAGE_NAME=onlyoffice/4testing-documentserver-ee:latest - DOCKERFILE=Dockerfile.dev - -# zookeeper # - ZOO_PORT=2181 - ZOO_HOST=${CONTAINER_PREFIX}zookeeper - ZOO_SERVER=server.1=${ZOO_HOST}:2888:3888 - -# kafka # - KAFKA_HOST=${CONTAINER_PREFIX}kafka - KAFKA_ADVERTISED_LISTENERS=LISTENER_DOCKER_INTERNAL://${KAFKA_HOST}:9092 - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=LISTENER_DOCKER_INTERNAL:PLAINTEXT,LISTENER_DOCKER_EXTERNAL:PLAINTEXT - KAFKA_INTER_BROKER_LISTENER_NAME=LISTENER_DOCKER_INTERNAL - KAFKA_ZOOKEEPER_CONNECT=${ZOO_HOST}:2181 - KAFKA_BROKER_ID=1 - KAFKA_LOG4J_LOGGERS=kafka.controller=INFO,kafka.producer.async.DefaultEventHandler=INFO,state.change.logger=INFO - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 - -# elasticsearch # - ELK_HOST=${CONTAINER_PREFIX}elasticsearch - -# app service environment # - ENV_EXTENSION=none - APP_DOTNET_ENV= - APP_CORE_BASE_DOMAIN=localhost - APP_CORE_MACHINEKEY=your_core_machinekey - - DOCUMENT_SERVER_JWT_SECRET=your_jwt_secret - DOCUMENT_SERVER_JWT_HEADER=AuthorizationJwt - DOCUMENT_SERVER_URL_PUBLIC=/ds-vpath/ - DOCUMENT_SERVER_HOST=${CONTAINER_PREFIX}document-server - DOCUMENT_SERVER_URL_INTERNAL=http://${DOCUMENT_SERVER_HOST}/ - - MYSQL_ROOT_PASSWORD=my-secret-pw - MYSQL_DATABASE=${PRODUCT} - MYSQL_USER=${PRODUCT}_user - MYSQL_PASSWORD=${PRODUCT}_pass - MYSQL_HOST=${CONTAINER_PREFIX}mysql-server - DATABASE_MIGRATION=false - -# service host # - API_SYSTEM_HOST=${CONTAINER_PREFIX}api-system - BACKUP_HOST=${CONTAINER_PREFIX}backup - BACKUP_BACKGRUOND_TASKS_HOST=${CONTAINER_PREFIX}backup-background-tasks - CLEAR_EVENTS_HOST=${CONTAINER_PREFIX}clear-events - MIGRATION_HOST=${CONTAINER_PREFIX}migration - WEBHOOKS_SERVICE_HOST=${CONTAINER_PREFIX}webhooks-service - STORAGE_ENCRYPTION_HOST=${CONTAINER_PREFIX}storage-encryption - FILES_HOST=${CONTAINER_PREFIX}files - FILES_SERVICES_HOST=${CONTAINER_PREFIX}files-services - STORAGE_MIGRATION_HOST=${CONTAINER_PREFIX}storage-migration - NOTIFY_HOST=${CONTAINER_PREFIX}notify - PEOPLE_SERVER_HOST=${CONTAINER_PREFIX}people-server - SOCKET_HOST=${CONTAINER_PREFIX}socket - STUDIO_NOTIFY_HOST=${CONTAINER_PREFIX}studio-notify - TELEGRAM_SERVICE_HOST=${CONTAINER_PREFIX}telegram-service - URLSHORTENER_HOST=${CONTAINER_PREFIX}urlshortener - API_HOST=${CONTAINER_PREFIX}api - STUDIO_HOST=${CONTAINER_PREFIX}studio - SSOAUTH_HOST=${CONTAINER_PREFIX}ssoauth - MIGRATION_RUNNER_HOST=${CONTAINER_PREFIX}migration-runner - PROXY_HOST=${CONTAINER_PREFIX}proxy - -# proxy upstream environment # - SERVICE_API_SYSTEM=${API_SYSTEM_HOST}:${SERVICE_PORT} - SERVICE_BACKUP=${BACKUP_HOST}:${SERVICE_PORT} - SERVICE_BACKUP_BACKGRUOND_TASKS=${BACKUP_BACKGRUOND_TASKS_HOST}:${SERVICE_PORT} - SERVICE_CLEAR_EVENTS=${CLEAR_EVENTS_HOST}:${SERVICE_PORT} - SERVICE_MIGRATION=${MIGRATION_HOST}:${SERVICE_PORT} - SERVICE_WEBHOOKS_SERVICE=${WEBHOOKS_SERVICE_HOST}:${SERVICE_PORT} - SERVICE_STORAGE_ENCRYPTION=${STORAGE_ENCRYPTION_HOST}:${SERVICE_PORT} - SERVICE_FILES=${FILES_HOST}:${SERVICE_PORT} - SERVICE_FILES_SERVICES=${FILES_SERVICES_HOST}:${SERVICE_PORT} - SERVICE_STORAGE_MIGRATION=${STORAGE_MIGRATION_HOST}:${SERVICE_PORT} - SERVICE_NOTIFY=${NOTIFY_HOST}:${SERVICE_PORT} - SERVICE_PEOPLE_SERVER=${PEOPLE_SERVER_HOST}:${SERVICE_PORT} - SERVICE_SOCKET=${SOCKET_HOST}:${SERVICE_PORT} - SERVICE_STUDIO_NOTIFY=${STUDIO_NOTIFY_HOST}:${SERVICE_PORT} - SERVICE_TELEGRAM_SERVICE=${TELEGRAM_SERVICE_HOST}:${SERVICE_PORT} - SERVICE_URLSHORTENER=${URLSHORTENER_HOST}:${SERVICE_PORT} - SERVICE_API=${API_HOST}:${SERVICE_PORT} - SERVICE_STUDIO=${STUDIO_HOST}:${SERVICE_PORT} - SERVICE_SSOAUTH=${SSOAUTH_HOST}:${SERVICE_PORT} - SERVICE_DOCEDITOR=${LOCAL_IP}:5013 - SERVICE_LOGIN=${LOCAL_IP}:5011 - SERVICE_CLIENT=${LOCAL_IP}:5001 - - NETWORK_NAME=${PRODUCT} diff --git a/build/install/docker/Dockerfile.dev b/build/install/docker/Dockerfile.dev index 0d7875c3d9..aefb7a4664 100644 --- a/build/install/docker/Dockerfile.dev +++ b/build/install/docker/Dockerfile.dev @@ -15,7 +15,7 @@ ARG BUILD_ARGS="build" ARG DEPLOY_ARGS="deploy" ARG DEBUG_INFO="true" -LABEL onlyoffice.appserver.release-date="${RELEASE_DATE}" \ +LABEL onlyoffice.docspace.release-date="${RELEASE_DATE}" \ maintainer="Ascensio System SIA " ENV LANG=en_US.UTF-8 \ @@ -38,7 +38,6 @@ RUN echo ${GIT_BRANCH} && \ git clone --depth 1 --recurse-submodules -b ${GIT_BRANCH} https://github.com/ONLYOFFICE/DocSpace.git ${SRC_PATH} RUN cd ${SRC_PATH} && \ - # mkdir -p /app/onlyoffice/config/ && cp -rf config/* /app/onlyoffice/config/ && \ mkdir -p /app/onlyoffice/ && \ find config/ -maxdepth 1 -name "*.json" | grep -v test | xargs tar -cvf config.tar && \ tar -C "/app/onlyoffice/" -xvf config.tar && \ @@ -48,7 +47,6 @@ RUN cd ${SRC_PATH} && \ sed -i "s/\"number\".*,/\"number\": \"${PRODUCT_VERSION}.${BUILD_NUMBER}\",/g" /app/onlyoffice/config/appsettings.json && \ sed -e 's/#//' -i /etc/nginx/conf.d/onlyoffice.conf && \ cd ${SRC_PATH}/build/install/common/ && \ - # bash build-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 -sp "${SRC_PATH}" -bp "${BUILD_PATH}" && \ cp -rf ${SRC_PATH}/products/ASC.Files/Server/DocStore ${BUILD_PATH}/products/ASC.Files/server/ && \ @@ -137,8 +135,6 @@ RUN apt-get -y update && \ # copy static services files and config values COPY --from=base /etc/nginx/conf.d /etc/nginx/conf.d COPY --from=base /etc/nginx/includes /etc/nginx/includes -# COPY --from=base ${SRC_PATH}/build/deploy/client ${BUILD_PATH}/client -# COPY --from=base ${SRC_PATH}/build/deploy/public ${BUILD_PATH}/public COPY /config/nginx/templates/upstream.conf.template /etc/nginx/templates/upstream.conf.template COPY /config/nginx/templates/nginx.conf.template /etc/nginx/nginx.conf.template COPY prepare-nginx-proxy.sh /docker-entrypoint.d/prepare-nginx-proxy.sh @@ -149,16 +145,12 @@ RUN chown nginx:nginx /etc/nginx/* -R && \ # changes for upstream configure sed -i 's/127.0.0.1:5010/$service_api_system/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5012/$service_backup/' /etc/nginx/conf.d/onlyoffice.conf && \ - #sed -i 's/127.0.0.1:5021/$service_crm/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5007/$service_files/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5004/$service_people_server/' /etc/nginx/conf.d/onlyoffice.conf && \ - #sed -i 's/127.0.0.1:5020/$service_projects_server/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5000/$service_api/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5003/$service_studio/' /etc/nginx/conf.d/onlyoffice.conf && \ - #sed -i 's/127.0.0.1:5023/$service_calendar/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:9899/$service_socket/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:9834/$service_sso/' /etc/nginx/conf.d/onlyoffice.conf && \ - #sed -i 's/127.0.0.1:5022/$service_mail/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:9999/$service_urlshortener/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5034/$service_migration/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/127.0.0.1:5013/$service_doceditor/' /etc/nginx/conf.d/onlyoffice.conf && \ @@ -166,20 +158,6 @@ RUN chown nginx:nginx /etc/nginx/* -R && \ sed -i 's/127.0.0.1:5001/$service_client/' /etc/nginx/conf.d/onlyoffice.conf && \ sed -i 's/172.*/$document_server;/' /etc/nginx/conf.d/onlyoffice.conf -## Doceditor ## -# FROM noderun as doceditor -# WORKDIR ${BUILD_PATH}/products/ASC.Files/editor - -# COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/deploy/editor/ . -# ENTRYPOINT ["node", "server.js"] - -## Login ## -#FROM noderun as login -#WORKDIR ${BUILD_PATH}/products/ASC.Login/login - -# COPY --from=base --chown=onlyoffice:onlyoffice ${SRC_PATH}/build/deploy/login/ . -# ENTRYPOINT ["node", "server.js"] - ## ASC.Data.Backup.BackgroundTasks ## FROM dotnetrun AS backup_background WORKDIR ${BUILD_PATH}/services/ASC.Data.Backup.BackgroundTasks/ @@ -340,10 +318,6 @@ ENTRYPOINT ["./docker-migration-entrypoint.sh"] FROM busybox:latest AS bin_share RUN mkdir -p /app/appserver/ASC.Files/server && \ mkdir -p /app/appserver/ASC.People/server/ && \ - #mkdir -p /app/appserver/ASC.CRM/server/ && \ - #mkdir -p /app/appserver/ASC.Projects/server/ && \ - #mkdir -p /app/appserver/ASC.Calendar/server/ && \ - #mkdir -p /app/appserver/ASC.Mail/server/ && \ addgroup --system --gid 107 onlyoffice && \ adduser -u 104 onlyoffice --home /var/www/onlyoffice --system -G onlyoffice diff --git a/build/install/docker/docspace.dev.yml b/build/install/docker/docspace.dev.yml index 3d62bf9e3b..8e182c851b 100644 --- a/build/install/docker/docspace.dev.yml +++ b/build/install/docker/docspace.dev.yml @@ -178,9 +178,10 @@ services: - SERVICE_CLIENT=${SERVICE_CLIENT} - DOCUMENT_SERVER=${DOCUMENT_SERVER_HOST} - SERVICE_PORT=${SERVICE_PORT} + - GIT_BRANCH=${GIT_BRANCH} volumes: - proxy_log:/var/log/nginx - - /Users/holomoot/Documents/GitHub/AppServer/public:/var/www/public + - ${ROOT_DIR}/public:/var/www/public networks: default: diff --git a/build/run/macos/api.sh b/build/run/macos/api.sh deleted file mode 100755 index 238d3cee69..0000000000 --- a/build/run/macos/api.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -rd="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -echo "Run script directory:" $rd - -dir=$(builtin cd $rd/../../../; pwd) -echo "Root directory:" $dir - -# Web API Root -dotnet $dir/web/ASC.Web.Api/bin/Debug/ASC.Web.Api.dll urls=http://0.0.0.0:5000 $STORAGE_ROOT=$dir/Data log:dir=$dir/Logs log:name=api pathToConf=$dir/config core:products:folder=$dir/products \ No newline at end of file diff --git a/build/run/macos/backend-environment.docker.sh b/build/run/macos/backend-environment.docker.sh deleted file mode 100755 index 99bdfdd264..0000000000 --- a/build/run/macos/backend-environment.docker.sh +++ /dev/null @@ -1,15 +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/build/install/docker/ - -docker_dir="$( pwd )" - -echo "Docker directory:" $docker_dir - -docker compose --env-file .env.dev -f db.arm.yml -f redis.yml -f rabbitmq.yml up -d \ No newline at end of file diff --git a/build/run/macos/backend.docker.sh b/build/run/macos/backend.docker.sh deleted file mode 100755 index c9421e08e5..0000000000 --- a/build/run/macos/backend.docker.sh +++ /dev/null @@ -1,17 +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/build/install/docker/ - -docker_dir="$( pwd )" - -echo "Docker directory:" $docker_dir - -docker compose --env-file .env.dev -f build.dev.yml build -docker compose --env-file .env.dev -f docspace.dev.yml down -v -docker compose --env-file .env.dev -f migration-runner.yml -f docspace.dev.yml up -d \ No newline at end of file diff --git a/build/run/macos/backend.sh b/build/run/macos/backend.sh deleted file mode 100755 index 6bde5ca7d6..0000000000 --- a/build/run/macos/backend.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -echo "Root directory:" $dir - -$dir/api.sh & -$dir/studio.sh & -$dir/people.sh & -$dir/files.sh & -$dir/files.service.sh & \ No newline at end of file diff --git a/build/run/macos/docker-tools/docker-compose.yml b/build/run/macos/docker-tools/docker-compose.yml deleted file mode 100644 index 1f5378f8e8..0000000000 --- a/build/run/macos/docker-tools/docker-compose.yml +++ /dev/null @@ -1,20 +0,0 @@ -version: "3.8" - -services: - rhonda_rabbitmq: - image: rabbitmq:3-management-alpine - container_name: "rabbitmq" - ports: - - 5672:5672 - - 15672:15672 - volumes: - - ~/.container-data/rabbitmq/data/:/var/lib/rabbitmq/ - - ~/.container-data/rabbitmq/log/:/var/log/rabbitmq - redis: - image: redis:latest - volumes: - - ~/.container-data/redis/log/:/var/log/redis - ports: - - 6379:6379 -volumes: - container-data: diff --git a/build/run/macos/files.service.sh b/build/run/macos/files.service.sh deleted file mode 100755 index ae06ee9944..0000000000 --- a/build/run/macos/files.service.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -rd="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -echo "Run script directory:" $rd - -dir=$(builtin cd $rd/../../../; pwd) -echo "Root directory:" $dir - -# Web API Files.Service -# set servicepath=%cd%\products\ASC.Files\Service\bin\Debug\ASC.Files.Service.exe urls=http://0.0.0.0:5009 $STORAGE_ROOT=%cd%\Data log:dir=%cd%\Logs log:name=files.service pathToConf=%cd%\config core:products:folder=%cd%\products -dotnet $dir/products/ASC.Files/Service/bin/Debug/ASC.Files.Service.dll urls=http://0.0.0.0:5009 $STORAGE_ROOT=$dir/Data log:dir=$dir/Logs log:name=files.service pathToConf=$dir/config core:products:folder=$dir/products \ No newline at end of file diff --git a/build/run/macos/files.sh b/build/run/macos/files.sh deleted file mode 100755 index dbba634148..0000000000 --- a/build/run/macos/files.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -rd="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -echo "Run script directory:" $rd - -dir=$(builtin cd $rd/../../../; pwd) -echo "Root directory:" $dir - -# Web API Files -# set servicepath=%cd%\products\ASC.Files\Server\bin\Debug\ASC.Files.exe urls=http://0.0.0.0:5007 $STORAGE_ROOT=%cd%\Data log:dir=%cd%\Logs log:name=files pathToConf=%cd%\config core:products:folder=%cd%\products -dotnet $dir/products/ASC.Files/Server/bin/Debug/ASC.Files.dll urls=http://0.0.0.0:5007 $STORAGE_ROOT=$dir/Data log:dir=$dir/Logs log:name=files pathToConf=$dir/config core:products:folder=$dir/products \ No newline at end of file diff --git a/build/run/macos/people.sh b/build/run/macos/people.sh deleted file mode 100755 index 6e14fd0b53..0000000000 --- a/build/run/macos/people.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -rd="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -echo "Run script directory:" $rd - -dir=$(builtin cd $rd/../../../; pwd) -echo "Root directory:" $dir - -# Web API People -# set servicepath=%cd%\products\ASC.People\Server\bin\Debug\ASC.People.exe urls=http://0.0.0.0:5004 $STORAGE_ROOT=%cd%\Data log:dir=%cd%\Logs log:name=people pathToConf=%cd%\config core:products:folder=%cd%\products -dotnet $dir/products/ASC.People/Server/bin/Debug/ASC.People.dll urls=http://0.0.0.0:5004 $STORAGE_ROOT=$dir/Data log:dir=$dir/Logs log:name=people pathToConf=$dir/config core:products:folder=$dir/products \ No newline at end of file diff --git a/build/run/macos/socket.sh b/build/run/macos/socket.sh deleted file mode 100755 index 903b8ee958..0000000000 --- a/build/run/macos/socket.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -rd="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -echo "Run script directory:" $rd - -dir=$(builtin cd $rd/../../../; pwd) -echo "Root directory:" $dir - -# Web Socket IO -node $dir/common/ASC.Socket.IO/server.js --logPath=$dir/Logs \ No newline at end of file diff --git a/build/run/macos/studio.sh b/build/run/macos/studio.sh deleted file mode 100755 index 38001b0206..0000000000 --- a/build/run/macos/studio.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -rd="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -echo "Run script directory:" $rd - -dir=$(builtin cd $rd/../../../; pwd) -echo "Root directory:" $dir - -# Web Studio -# set servicepath=%cd%\web\ASC.Web.Studio\bin\Debug\ASC.Web.Studio.exe urls=http://0.0.0.0:5003 $STORAGE_ROOT=%cd%\Data log:dir=%cd%\Logs log:name=studio pathToConf=%cd%\config core:products:folder=%cd%\products -dotnet $dir/web/ASC.Web.Studio/bin/Debug/ASC.Web.Studio.dll urls=http://0.0.0.0:5003 $STORAGE_ROOT=$dir/Data log:dir=$dir/Logs log:name=studio pathToConf=$dir/config core:products:folder=$dir/products \ No newline at end of file From 82f0731d7d5ca93f9fde141260aa8f49c7e15546 Mon Sep 17 00:00:00 2001 From: Alexey Safronov Date: Thu, 13 Oct 2022 15:26:37 +0300 Subject: [PATCH 17/20] Fix open files in DocEditor + refactoring --- build/build.backend.docker.sh | 6 +++-- build/install/docker/.env | 1 + build/install/docker/db.arm.yml | 35 --------------------------- build/install/docker/db.yml | 6 ++--- build/install/docker/docspace.dev.yml | 1 + 5 files changed, 9 insertions(+), 40 deletions(-) delete mode 100644 build/install/docker/db.arm.yml diff --git a/build/build.backend.docker.sh b/build/build.backend.docker.sh index dd5cb9ec47..81d739124a 100755 --- a/build/build.backend.docker.sh +++ b/build/build.backend.docker.sh @@ -44,7 +44,8 @@ if [ "${arch_name}" = "x86_64" ]; then docker compose -f db.yml up -d elif [ "${arch_name}" = "arm64" ]; then echo "CPU Type: arm64 -> run ddb.arm.yml" - docker compose -f db.arm.yml up -d + MYSQL_IMAGE=arm64v8/mysql:oracle \ + docker compose -f db.yml up -d else echo "Error: Unknown CPU Type: ${arch_name}." exit 1 @@ -56,7 +57,7 @@ docker compose -f redis.yml -f rabbitmq.yml -f ds.yml up -d echo "Stop all backend services" DOCKERFILE=Dockerfile.dev \ -docker compose -f docspace.dev.yml down -v +docker compose -f docspace.dev.yml down echo "Build all backend services" DOCKERFILE=Dockerfile.dev \ @@ -79,4 +80,5 @@ GIT_BRANCH=$branch \ SERVICE_DOCEDITOR=$doceditor \ SERVICE_LOGIN=$login \ SERVICE_CLIENT=$client \ +APP_URL_PORTAL="http://$local_ip:8092" \ docker compose -f docspace.dev.yml up -d \ No newline at end of file diff --git a/build/install/docker/.env b/build/install/docker/.env index fa648c9fd1..ca4ea7de82 100644 --- a/build/install/docker/.env +++ b/build/install/docker/.env @@ -6,6 +6,7 @@ DOCKER_TAG=latest CONTAINER_PREFIX=${PRODUCT}- MYSQL_VERSION=8.0.18 + MYSQL_IMAGE=mysql:${MYSQL_VERSION} ELK_VERSION=7.13.1 SERVICE_PORT=5050 DOCUMENT_SERVER_IMAGE_NAME=onlyoffice/4testing-documentserver-ee:latest diff --git a/build/install/docker/db.arm.yml b/build/install/docker/db.arm.yml deleted file mode 100644 index ffe7a959ee..0000000000 --- a/build/install/docker/db.arm.yml +++ /dev/null @@ -1,35 +0,0 @@ -version: "3.8" - -services: - onlyoffice-mysql-server: - image: arm64v8/mysql:oracle - command: --default-authentication-plugin=mysql_native_password - cap_add: - - SYS_NICE - container_name: ${MYSQL_HOST} - restart: always - tty: true - user: mysql - expose: - - "3306" - ports: - - 3307:3306 - environment: - MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} - MYSQL_DATABASE: ${MYSQL_DATABASE} - MYSQL_USER: ${MYSQL_USER} - MYSQL_PASSWORD: ${MYSQL_PASSWORD} - volumes: - - mysql_data:/var/lib/mysql - - ./config/mysql/conf.d/:/etc/mysql/conf.d - networks: - - ${NETWORK_NAME} - tmpfs: /var/log/mysql/ - -networks: - onlyoffice: - name: ${NETWORK_NAME} - driver: "bridge" - -volumes: - mysql_data: diff --git a/build/install/docker/db.yml b/build/install/docker/db.yml index 61cdabd602..c3ebc5228b 100644 --- a/build/install/docker/db.yml +++ b/build/install/docker/db.yml @@ -2,7 +2,7 @@ version: "3.8" services: onlyoffice-mysql-server: - image: mysql:${MYSQL_VERSION} + image: ${MYSQL_IMAGE} command: --default-authentication-plugin=mysql_native_password cap_add: - SYS_NICE @@ -21,13 +21,13 @@ services: - mysql_data:/var/lib/mysql - ./config/mysql/conf.d/:/etc/mysql/conf.d networks: - - ${NETWORK_NAME} + - ${NETWORK_NAME} tmpfs: /var/log/mysql/ networks: onlyoffice: name: ${NETWORK_NAME} - driver: 'bridge' + driver: "bridge" volumes: mysql_data: diff --git a/build/install/docker/docspace.dev.yml b/build/install/docker/docspace.dev.yml index 8e182c851b..ff13fc3ff6 100644 --- a/build/install/docker/docspace.dev.yml +++ b/build/install/docker/docspace.dev.yml @@ -14,6 +14,7 @@ x-service: &x-service-base APP_DOTNET_ENV: ${APP_DOTNET_ENV} APP_CORE_BASE_DOMAIN: ${APP_CORE_BASE_DOMAIN} APP_CORE_MACHINEKEY: ${APP_CORE_MACHINEKEY} + APP_URL_PORTAL: ${APP_URL_PORTAL} DOCUMENT_SERVER_JWT_SECRET: ${DOCUMENT_SERVER_JWT_SECRET} DOCUMENT_SERVER_JWT_HEADER: ${DOCUMENT_SERVER_JWT_HEADER} DOCUMENT_SERVER_URL_PUBLIC: ${DOCUMENT_SERVER_URL_PUBLIC} From b6c363e10332338108b6a67e52d07fd5e62412a5 Mon Sep 17 00:00:00 2001 From: Alexey Safronov Date: Thu, 13 Oct 2022 16:02:25 +0300 Subject: [PATCH 18/20] Added ROOT_DIR --- build/install/docker/docspace.dev.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/build/install/docker/docspace.dev.yml b/build/install/docker/docspace.dev.yml index ff13fc3ff6..1e6f474baf 100644 --- a/build/install/docker/docspace.dev.yml +++ b/build/install/docker/docspace.dev.yml @@ -180,6 +180,7 @@ services: - DOCUMENT_SERVER=${DOCUMENT_SERVER_HOST} - SERVICE_PORT=${SERVICE_PORT} - GIT_BRANCH=${GIT_BRANCH} + - ROOT_DIR=${ROOT_DIR} volumes: - proxy_log:/var/log/nginx - ${ROOT_DIR}/public:/var/www/public From 0ee788fb00b1d405b9b5ef6a29036234a9537c06 Mon Sep 17 00:00:00 2001 From: Alexey Safronov Date: Thu, 13 Oct 2022 16:18:14 +0300 Subject: [PATCH 19/20] Fix run migration-runner --- build/build.backend.docker.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/build.backend.docker.sh b/build/build.backend.docker.sh index 81d739124a..49e973ec4a 100755 --- a/build/build.backend.docker.sh +++ b/build/build.backend.docker.sh @@ -70,7 +70,7 @@ docker compose -f build.dev.yml build echo "Run DB migration" DOCKERFILE=Dockerfile.dev \ -docker compose -f migration-runner.yml +docker compose -f migration-runner.yml up -d echo "Start all backend services" DOCKERFILE=Dockerfile.dev \ From fb8190b465867fad2dfb7fa13cefeeae0afab87c Mon Sep 17 00:00:00 2001 From: Alexey Safronov Date: Thu, 13 Oct 2022 17:52:46 +0300 Subject: [PATCH 20/20] Added --no_ds param --- build/build.backend.docker.sh | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/build/build.backend.docker.sh b/build/build.backend.docker.sh index 49e973ec4a..ad2d948ea2 100755 --- a/build/build.backend.docker.sh +++ b/build/build.backend.docker.sh @@ -51,9 +51,16 @@ else exit 1 fi -echo "Run environments (redis, rabbitmq, document-server)" +echo "Run environments (redis, rabbitmq)" DOCKERFILE=Dockerfile.dev \ -docker compose -f redis.yml -f rabbitmq.yml -f ds.yml up -d +docker compose -f redis.yml -f rabbitmq.yml up -d + +if [ "$1" = "--no_ds" ]; then + echo "SKIP Document server" +else + echo "Run Document server" + docker compose -f ds.yml up -d +fi echo "Stop all backend services" DOCKERFILE=Dockerfile.dev \