diff --git a/apps/docspace/config.json b/apps/docspace/config.json new file mode 100644 index 0000000..1f50776 --- /dev/null +++ b/apps/docspace/config.json @@ -0,0 +1,83 @@ +{ + "name": "ONLYOFFICE DocSpace", + "id": "docspace", + "available": true, + "short_desc": "Collaborative room-based document management platform with built-in editors", + "author": "ONLYOFFICE", + "port": 8843, + "categories": ["utilities", "documents", "collaboration"], + "tipi_version": 1, + "version": "latest", + "source": "https://github.com/ONLYOFFICE/DocSpace", + "website": "https://www.onlyoffice.com/docspace.aspx", + "exposable": true, + "dynamic_config": true, + "supported_architectures": ["amd64"], + "min_tipi_version": "4.0.0", + "form_fields": [ + { + "type": "random", + "label": "JWT Secret", + "hint": "Secret key for Document Server JWT authentication", + "env_variable": "DOCSPACE_JWT_SECRET", + "min": 32, + "encoding": "hex" + }, + { + "type": "random", + "label": "MySQL Root Password", + "hint": "Root password for the MySQL database", + "env_variable": "DOCSPACE_MYSQL_ROOT_PASSWORD", + "min": 24, + "encoding": "hex" + }, + { + "type": "random", + "label": "MySQL User Password", + "hint": "Password for the docspace MySQL user", + "env_variable": "DOCSPACE_MYSQL_PASSWORD", + "min": 24, + "encoding": "hex" + }, + { + "type": "random", + "label": "App Machine Key", + "hint": "Core machine key used for encryption and signing", + "env_variable": "DOCSPACE_MACHINEKEY", + "min": 32, + "encoding": "hex" + }, + { + "type": "random", + "label": "Identity Encryption Secret", + "hint": "Secret key for identity service encryption", + "env_variable": "DOCSPACE_IDENTITY_SECRET", + "min": 32, + "encoding": "hex" + }, + { + "type": "random", + "label": "RabbitMQ Password", + "hint": "Password for the RabbitMQ message broker", + "env_variable": "DOCSPACE_RABBITMQ_PASSWORD", + "min": 24, + "encoding": "hex" + }, + { + "type": "email", + "label": "Admin Email", + "hint": "Email address for the DocSpace administrator account", + "required": true, + "env_variable": "DOCSPACE_ADMIN_EMAIL" + }, + { + "type": "fqdn", + "label": "DocSpace Domain", + "hint": "Domain name for accessing DocSpace (e.g., docspace.example.com)", + "required": false, + "env_variable": "DOCSPACE_DOMAIN" + } + ], + "created_at": 1712793600000, + "updated_at": 1712793600000 +} diff --git a/apps/docspace/data/config/nginx/letsencrypt.conf b/apps/docspace/data/config/nginx/letsencrypt.conf new file mode 100644 index 0000000..00d100b --- /dev/null +++ b/apps/docspace/data/config/nginx/letsencrypt.conf @@ -0,0 +1,4 @@ +location ^~ /.well-known/acme-challenge/ { + root /letsencrypt; + default_type "text/plain"; +} diff --git a/apps/docspace/data/config/nginx/nginx.conf.template b/apps/docspace/data/config/nginx/nginx.conf.template new file mode 100644 index 0000000..d89e400 --- /dev/null +++ b/apps/docspace/data/config/nginx/nginx.conf.template @@ -0,0 +1,33 @@ +user nginx; +worker_processes 1; + +error_log /var/log/nginx/error.log warn; +pid /tmp/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + client_body_temp_path /tmp/client_temp; + proxy_temp_path /tmp/proxy_temp_path; + fastcgi_temp_path /tmp/fastcgi_temp; + uwsgi_temp_path /tmp/uwsgi_temp; + scgi_temp_path /tmp/scgi_temp; + include /etc/nginx/mime.types; + default_type application/octet-stream; + + log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + '$status $body_bytes_sent "$http_referer" ' + '"$http_user_agent" "$http_x_forwarded_for"'; + + access_log /var/log/nginx/access.log main; + + sendfile on; + + keepalive_timeout 65; + + include /etc/nginx/conf.d/*.conf; +} diff --git a/apps/docspace/data/config/nginx/onlyoffice-proxy.conf b/apps/docspace/data/config/nginx/onlyoffice-proxy.conf new file mode 100644 index 0000000..c4d88c4 --- /dev/null +++ b/apps/docspace/data/config/nginx/onlyoffice-proxy.conf @@ -0,0 +1,30 @@ +proxy_set_header Upgrade $http_upgrade; +proxy_set_header Connection $proxy_connection; +proxy_set_header Host $this_host; +proxy_set_header X-Forwarded-Host $proxy_x_forwarded_host; +proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +proxy_hide_header 'Server'; +proxy_hide_header 'X-Powered-By'; +proxy_buffering off; +proxy_http_version 1.1; + +proxy_buffer_size 128k; +proxy_buffers 8 128k; +proxy_busy_buffers_size 256k; + +access_log /var/log/nginx/access-proxy.log; +error_log /var/log/nginx/error-proxy.log; + +server { + listen 0.0.0.0:80; + listen [::]:80 default_server; + + client_max_body_size 4G; + + location / { + proxy_pass http://$router_host:8092; + } + + include includes/letsencrypt.conf; +} diff --git a/apps/docspace/data/config/nginx/proxy.upstream.conf.template b/apps/docspace/data/config/nginx/proxy.upstream.conf.template new file mode 100644 index 0000000..ea33ac4 --- /dev/null +++ b/apps/docspace/data/config/nginx/proxy.upstream.conf.template @@ -0,0 +1,32 @@ +resolver 127.0.0.11 valid=30s; + +map $http_host $this_host { + "" $host; + default $http_host; +} + +map $http_x_forwarded_proto $proxy_x_forwarded_proto { + default $http_x_forwarded_proto; + "" $scheme; +} + +map $http_x_forwarded_host $proxy_x_forwarded_host { + default $http_x_forwarded_host; + "" $this_host; +} + +map $http_x_forwarded_port $proxy_x_forwarded_port { + default $http_x_forwarded_port; + '' $server_port; +} + +map $http_upgrade $proxy_connection { + default upgrade; + "" close; +} + +map $ROUTER_HOST $router_host { + volatile; + default onlyoffice-router; + ~^(.*)$ $1; +} diff --git a/apps/docspace/docker-compose.json b/apps/docspace/docker-compose.json new file mode 100644 index 0000000..d2a57c9 --- /dev/null +++ b/apps/docspace/docker-compose.json @@ -0,0 +1,725 @@ +{ + "schemaVersion": 2, + "$schema": "https://schemas.runtipi.io/dynamic-compose.json", + "services": [ + { + "name": "docspace-mysql", + "image": "mysql:8.3.0", + "capAdd": ["SYS_NICE"], + "user": "mysql", + "environment": [ + { "key": "MYSQL_ROOT_PASSWORD", "value": "${DOCSPACE_MYSQL_ROOT_PASSWORD}" }, + { "key": "MYSQL_DATABASE", "value": "docspace" }, + { "key": "MYSQL_USER", "value": "onlyoffice_user" }, + { "key": "MYSQL_PASSWORD", "value": "${DOCSPACE_MYSQL_PASSWORD}" } + ], + "volumes": [ + { + "hostPath": "${APP_DATA_DIR}/data/mysql", + "containerPath": "/var/lib/mysql" + } + ], + "healthCheck": { + "test": "mysql -u onlyoffice_user --password=${DOCSPACE_MYSQL_PASSWORD} -e ';'", + "interval": "10s", + "timeout": "5s", + "retries": 5 + } + }, + { + "name": "docspace-redis", + "image": "redis:7", + "healthCheck": { + "test": "redis-cli ping", + "interval": "10s", + "timeout": "10s", + "retries": 3 + } + }, + { + "name": "docspace-rabbitmq", + "image": "rabbitmq:3", + "environment": [ + { "key": "RABBITMQ_DEFAULT_USER", "value": "guest" }, + { "key": "RABBITMQ_DEFAULT_PASS", "value": "${DOCSPACE_RABBITMQ_PASSWORD}" } + ], + "healthCheck": { + "test": "rabbitmq-diagnostics status", + "interval": "10s", + "timeout": "10s", + "retries": 5 + } + }, + { + "name": "docspace-opensearch", + "image": "onlyoffice/opensearch:2.18.0", + "environment": [ + { "key": "discovery.type", "value": "single-node" }, + { "key": "bootstrap.memory_lock", "value": "true" }, + { "key": "OPENSEARCH_JAVA_OPTS", "value": "-Xms1g -Xmx1g -Dlog4j2.formatMsgNoLookups=true" }, + { "key": "indices.fielddata.cache.size", "value": "30%" }, + { "key": "indices.memory.index_buffer_size", "value": "30%" }, + { "key": "DISABLE_INSTALL_DEMO_CONFIG", "value": "true" }, + { "key": "DISABLE_SECURITY_PLUGIN", "value": "true" } + ], + "volumes": [ + { + "hostPath": "${APP_DATA_DIR}/data/opensearch", + "containerPath": "/usr/share/opensearch/data" + } + ], + "ulimits": { + "memlock": { "soft": -1, "hard": -1 }, + "nofile": { "soft": 65536, "hard": 65536 } + }, + "healthCheck": { + "test": "curl -f http://localhost:9200/_cluster/health?pretty", + "interval": "30s", + "timeout": "10s", + "retries": 5 + } + }, + { + "name": "docspace-document-server", + "image": "onlyoffice/documentserver:latest", + "environment": [ + { "key": "JWT_ENABLED", "value": "true" }, + { "key": "JWT_SECRET", "value": "${DOCSPACE_JWT_SECRET}" }, + { "key": "JWT_HEADER", "value": "AuthorizationJwt" }, + { "key": "JWT_IN_BODY", "value": "true" }, + { "key": "AMQP_URI", "value": "amqp://guest:${DOCSPACE_RABBITMQ_PASSWORD}@docspace-rabbitmq:5672/" }, + { "key": "REDIS_SERVER_HOST", "value": "docspace-redis" }, + { "key": "REDIS_SERVER_PORT", "value": "6379" }, + { "key": "REDIS_SERVER_USER", "value": "" }, + { "key": "REDIS_SERVER_PASS", "value": "" }, + { "key": "REDIS_SERVER_DB", "value": "0" } + ], + "volumes": [ + { + "hostPath": "${APP_DATA_DIR}/data/ds-app", + "containerPath": "/var/www/onlyoffice/Data" + }, + { + "hostPath": "${APP_DATA_DIR}/data/ds-log", + "containerPath": "/var/log/onlyoffice" + }, + { + "hostPath": "${APP_DATA_DIR}/data/ds-fonts", + "containerPath": "/usr/share/fonts" + } + ], + "healthCheck": { + "test": "curl -f http://localhost:8000/info/info.json", + "interval": "30s", + "timeout": "10s", + "retries": 5 + }, + "dependsOn": { + "docspace-redis": { "condition": "service_healthy" }, + "docspace-rabbitmq": { "condition": "service_healthy" } + } + }, + { + "name": "docspace-migration-runner", + "image": "onlyoffice/docspace-migration-runner:latest", + "environment": [ + { "key": "MYSQL_CONTAINER_NAME", "value": "docspace-mysql" }, + { "key": "MYSQL_HOST", "value": "" }, + { "key": "MYSQL_PORT", "value": "3306" }, + { "key": "MYSQL_DATABASE", "value": "docspace" }, + { "key": "MYSQL_USER", "value": "onlyoffice_user" }, + { "key": "MYSQL_PASSWORD", "value": "${DOCSPACE_MYSQL_PASSWORD}" } + ], + "dependsOn": { + "docspace-mysql": { "condition": "service_healthy" } + } + }, + { + "name": "docspace-dotnet", + "image": "onlyoffice/docspace-dotnet:latest", + "user": "root:root", + "environment": [ + { "key": "APP_CORE_BASE_DOMAIN", "value": "${DOCSPACE_DOMAIN:-localhost}" }, + { "key": "APP_CORE_MACHINEKEY", "value": "${DOCSPACE_MACHINEKEY}" }, + { "key": "APP_CORE_SERVER_ROOT", "value": "" }, + { "key": "APP_KNOWN_NETWORKS", "value": "" }, + { "key": "APP_KNOWN_PROXIES", "value": "" }, + { "key": "APP_URL_PORTAL", "value": "http://docspace-router:8092" }, + { "key": "CERTIFICATE_PATH", "value": "" }, + { "key": "DEBUG_INFO", "value": "false" }, + { "key": "DOCUMENT_CONTAINER_NAME", "value": "docspace-document-server" }, + { "key": "DOCUMENT_SERVER_JWT_HEADER", "value": "AuthorizationJwt" }, + { "key": "DOCUMENT_SERVER_JWT_SECRET", "value": "${DOCSPACE_JWT_SECRET}" }, + { "key": "DOCUMENT_SERVER_URL_EXTERNAL", "value": "" }, + { "key": "DOCUMENT_SERVER_URL_PUBLIC", "value": "/ds-vpath/" }, + { "key": "ELK_HOST", "value": "docspace-opensearch" }, + { "key": "ELK_PORT", "value": "9200" }, + { "key": "ELK_SCHEME", "value": "http" }, + { "key": "IDENTITY_API_SERVER_PORT", "value": "9090" }, + { "key": "IDENTITY_AUTHORIZATION_SERVER_PORT", "value": "8080" }, + { "key": "INSTALLATION_TYPE", "value": "COMMUNITY" }, + { "key": "JDBC_DATABASE", "value": "docspace" }, + { "key": "JDBC_PASSWORD", "value": "${DOCSPACE_MYSQL_PASSWORD}" }, + { "key": "JDBC_URL", "value": "docspace-mysql" }, + { "key": "JDBC_USER_NAME", "value": "onlyoffice_user" }, + { "key": "LOG_LEVEL", "value": "Warning" }, + { "key": "MYSQL_CONTAINER_NAME", "value": "docspace-mysql" }, + { "key": "MYSQL_DATABASE", "value": "docspace" }, + { "key": "MYSQL_HOST", "value": "" }, + { "key": "MYSQL_PASSWORD", "value": "${DOCSPACE_MYSQL_PASSWORD}" }, + { "key": "MYSQL_PORT", "value": "3306" }, + { "key": "MYSQL_ROOT_PASSWORD", "value": "${DOCSPACE_MYSQL_ROOT_PASSWORD}" }, + { "key": "MYSQL_USER", "value": "onlyoffice_user" }, + { "key": "NODE_CONTAINER_NAME", "value": "docspace-node" }, + { "key": "NODE_OPTIONS", "value": "--max_old_space_size=4096" }, + { "key": "OAUTH_REDIRECT_URL", "value": "https://service.onlyoffice.com/oauth2.aspx" }, + { "key": "RABBIT_HOST", "value": "docspace-rabbitmq" }, + { "key": "RABBIT_PASSWORD", "value": "${DOCSPACE_RABBITMQ_PASSWORD}" }, + { "key": "RABBIT_PORT", "value": "5672" }, + { "key": "RABBIT_PROTOCOL", "value": "amqp" }, + { "key": "RABBIT_USER_NAME", "value": "guest" }, + { "key": "RABBIT_VIRTUAL_HOST", "value": "/" }, + { "key": "REDIS_DB", "value": "0" }, + { "key": "REDIS_HOST", "value": "docspace-redis" }, + { "key": "REDIS_PASSWORD", "value": "" }, + { "key": "REDIS_PORT", "value": "6379" }, + { "key": "REDIS_USER_NAME", "value": "" }, + { "key": "ROUTER_HOST", "value": "docspace-router" }, + { "key": "SERVICE_AI_PORT", "value": "5157" }, + { "key": "SERVICE_AI_SERVICE_PORT", "value": "5124" }, + { "key": "SERVICE_API_PORT", "value": "5000" }, + { "key": "SERVICE_API_SYSTEM_PORT", "value": "5010" }, + { "key": "SERVICE_BACKUP_BACKGRUOND_TASKS_PORT", "value": "5032" }, + { "key": "SERVICE_BACKUP_PORT", "value": "5012" }, + { "key": "SERVICE_CLEAR_EVENTS_PORT", "value": "5027" }, + { "key": "SERVICE_DOCEDITOR_PORT", "value": "5013" }, + { "key": "SERVICE_FILES_PORT", "value": "5007" }, + { "key": "SERVICE_FILES_SERVICES_PORT", "value": "5009" }, + { "key": "SERVICE_HEALTHCHECKS_PORT", "value": "5033" }, + { "key": "SERVICE_LOGIN_PORT", "value": "5011" }, + { "key": "SERVICE_MANAGEMENT_PORT", "value": "5015" }, + { "key": "SERVICE_NOTIFY_PORT", "value": "5005" }, + { "key": "SERVICE_PEOPLE_SERVER_PORT", "value": "5004" }, + { "key": "SERVICE_SDK_PORT", "value": "5099" }, + { "key": "SERVICE_SOCKET_PORT", "value": "9899" }, + { "key": "SERVICE_SSOAUTH_PORT", "value": "9834" }, + { "key": "SERVICE_STUDIO_NOTIFY_PORT", "value": "5006" }, + { "key": "SERVICE_STUDIO_PORT", "value": "5003" }, + { "key": "SERVICE_TELEGRAM_PORT", "value": "5075" }, + { "key": "SPRING_APPLICATION_ENCRYPTION_SECRET", "value": "${DOCSPACE_IDENTITY_SECRET}" }, + { "key": "SPRING_APPLICATION_SIGNATURE_SECRET", "value": "${DOCSPACE_MACHINEKEY}" }, + { "key": "SPRING_PROFILES_ACTIVE", "value": "dev,server" } + ], + "volumes": [ + { + "hostPath": "${APP_DATA_DIR}/data/app", + "containerPath": "/app/onlyoffice/data" + }, + { + "hostPath": "${APP_DATA_DIR}/data/log", + "containerPath": "/var/log/onlyoffice" + } + ], + "healthCheck": { + "test": "supervisorctl status | grep -v 'ASC.Migration.Runner' | grep -qv RUNNING && exit 1 || exit 0", + "interval": "60s", + "timeout": "10s", + "retries": 5 + }, + "dependsOn": { + "docspace-migration-runner": { "condition": "service_completed_successfully" }, + "docspace-mysql": { "condition": "service_healthy" }, + "docspace-redis": { "condition": "service_healthy" }, + "docspace-rabbitmq": { "condition": "service_healthy" }, + "docspace-opensearch": { "condition": "service_healthy" } + } + }, + { + "name": "docspace-java", + "image": "onlyoffice/docspace-java:latest", + "user": "root:root", + "environment": [ + { "key": "APP_CORE_BASE_DOMAIN", "value": "${DOCSPACE_DOMAIN:-localhost}" }, + { "key": "APP_CORE_MACHINEKEY", "value": "${DOCSPACE_MACHINEKEY}" }, + { "key": "APP_CORE_SERVER_ROOT", "value": "" }, + { "key": "APP_KNOWN_NETWORKS", "value": "" }, + { "key": "APP_KNOWN_PROXIES", "value": "" }, + { "key": "APP_URL_PORTAL", "value": "http://docspace-router:8092" }, + { "key": "CERTIFICATE_PATH", "value": "" }, + { "key": "DEBUG_INFO", "value": "false" }, + { "key": "DOCUMENT_CONTAINER_NAME", "value": "docspace-document-server" }, + { "key": "DOCUMENT_SERVER_JWT_HEADER", "value": "AuthorizationJwt" }, + { "key": "DOCUMENT_SERVER_JWT_SECRET", "value": "${DOCSPACE_JWT_SECRET}" }, + { "key": "DOCUMENT_SERVER_URL_EXTERNAL", "value": "" }, + { "key": "DOCUMENT_SERVER_URL_PUBLIC", "value": "/ds-vpath/" }, + { "key": "ELK_HOST", "value": "docspace-opensearch" }, + { "key": "ELK_PORT", "value": "9200" }, + { "key": "ELK_SCHEME", "value": "http" }, + { "key": "IDENTITY_API_SERVER_PORT", "value": "9090" }, + { "key": "IDENTITY_AUTHORIZATION_SERVER_PORT", "value": "8080" }, + { "key": "INSTALLATION_TYPE", "value": "COMMUNITY" }, + { "key": "JDBC_DATABASE", "value": "docspace" }, + { "key": "JDBC_PASSWORD", "value": "${DOCSPACE_MYSQL_PASSWORD}" }, + { "key": "JDBC_URL", "value": "docspace-mysql" }, + { "key": "JDBC_USER_NAME", "value": "onlyoffice_user" }, + { "key": "LOG_LEVEL", "value": "Warning" }, + { "key": "MYSQL_CONTAINER_NAME", "value": "docspace-mysql" }, + { "key": "MYSQL_DATABASE", "value": "docspace" }, + { "key": "MYSQL_HOST", "value": "" }, + { "key": "MYSQL_PASSWORD", "value": "${DOCSPACE_MYSQL_PASSWORD}" }, + { "key": "MYSQL_PORT", "value": "3306" }, + { "key": "MYSQL_ROOT_PASSWORD", "value": "${DOCSPACE_MYSQL_ROOT_PASSWORD}" }, + { "key": "MYSQL_USER", "value": "onlyoffice_user" }, + { "key": "NODE_CONTAINER_NAME", "value": "docspace-node" }, + { "key": "NODE_OPTIONS", "value": "--max_old_space_size=4096" }, + { "key": "OAUTH_REDIRECT_URL", "value": "https://service.onlyoffice.com/oauth2.aspx" }, + { "key": "RABBIT_HOST", "value": "docspace-rabbitmq" }, + { "key": "RABBIT_PASSWORD", "value": "${DOCSPACE_RABBITMQ_PASSWORD}" }, + { "key": "RABBIT_PORT", "value": "5672" }, + { "key": "RABBIT_PROTOCOL", "value": "amqp" }, + { "key": "RABBIT_USER_NAME", "value": "guest" }, + { "key": "RABBIT_VIRTUAL_HOST", "value": "/" }, + { "key": "REDIS_DB", "value": "0" }, + { "key": "REDIS_HOST", "value": "docspace-redis" }, + { "key": "REDIS_PASSWORD", "value": "" }, + { "key": "REDIS_PORT", "value": "6379" }, + { "key": "REDIS_USER_NAME", "value": "" }, + { "key": "ROUTER_HOST", "value": "docspace-router" }, + { "key": "SERVICE_AI_PORT", "value": "5157" }, + { "key": "SERVICE_AI_SERVICE_PORT", "value": "5124" }, + { "key": "SERVICE_API_PORT", "value": "5000" }, + { "key": "SERVICE_API_SYSTEM_PORT", "value": "5010" }, + { "key": "SERVICE_BACKUP_BACKGRUOND_TASKS_PORT", "value": "5032" }, + { "key": "SERVICE_BACKUP_PORT", "value": "5012" }, + { "key": "SERVICE_CLEAR_EVENTS_PORT", "value": "5027" }, + { "key": "SERVICE_DOCEDITOR_PORT", "value": "5013" }, + { "key": "SERVICE_FILES_PORT", "value": "5007" }, + { "key": "SERVICE_FILES_SERVICES_PORT", "value": "5009" }, + { "key": "SERVICE_HEALTHCHECKS_PORT", "value": "5033" }, + { "key": "SERVICE_LOGIN_PORT", "value": "5011" }, + { "key": "SERVICE_MANAGEMENT_PORT", "value": "5015" }, + { "key": "SERVICE_NOTIFY_PORT", "value": "5005" }, + { "key": "SERVICE_PEOPLE_SERVER_PORT", "value": "5004" }, + { "key": "SERVICE_SDK_PORT", "value": "5099" }, + { "key": "SERVICE_SOCKET_PORT", "value": "9899" }, + { "key": "SERVICE_SSOAUTH_PORT", "value": "9834" }, + { "key": "SERVICE_STUDIO_NOTIFY_PORT", "value": "5006" }, + { "key": "SERVICE_STUDIO_PORT", "value": "5003" }, + { "key": "SERVICE_TELEGRAM_PORT", "value": "5075" }, + { "key": "SPRING_APPLICATION_ENCRYPTION_SECRET", "value": "${DOCSPACE_IDENTITY_SECRET}" }, + { "key": "SPRING_APPLICATION_SIGNATURE_SECRET", "value": "${DOCSPACE_MACHINEKEY}" }, + { "key": "SPRING_PROFILES_ACTIVE", "value": "dev,server" } + ], + "volumes": [ + { + "hostPath": "${APP_DATA_DIR}/data/app", + "containerPath": "/app/onlyoffice/data" + }, + { + "hostPath": "${APP_DATA_DIR}/data/log", + "containerPath": "/var/log/onlyoffice" + } + ], + "healthCheck": { + "test": "supervisorctl status | grep -v 'ASC.Migration.Runner' | grep -qv RUNNING && exit 1 || exit 0", + "interval": "60s", + "timeout": "10s", + "retries": 5 + }, + "dependsOn": { + "docspace-migration-runner": { "condition": "service_completed_successfully" }, + "docspace-mysql": { "condition": "service_healthy" }, + "docspace-redis": { "condition": "service_healthy" }, + "docspace-rabbitmq": { "condition": "service_healthy" }, + "docspace-opensearch": { "condition": "service_healthy" } + } + }, + { + "name": "docspace-node", + "image": "onlyoffice/docspace-node:latest", + "user": "root:root", + "environment": [ + { "key": "APP_CORE_BASE_DOMAIN", "value": "${DOCSPACE_DOMAIN:-localhost}" }, + { "key": "APP_CORE_MACHINEKEY", "value": "${DOCSPACE_MACHINEKEY}" }, + { "key": "APP_CORE_SERVER_ROOT", "value": "" }, + { "key": "APP_KNOWN_NETWORKS", "value": "" }, + { "key": "APP_KNOWN_PROXIES", "value": "" }, + { "key": "APP_URL_PORTAL", "value": "http://docspace-router:8092" }, + { "key": "CERTIFICATE_PATH", "value": "" }, + { "key": "DEBUG_INFO", "value": "false" }, + { "key": "DOCUMENT_CONTAINER_NAME", "value": "docspace-document-server" }, + { "key": "DOCUMENT_SERVER_JWT_HEADER", "value": "AuthorizationJwt" }, + { "key": "DOCUMENT_SERVER_JWT_SECRET", "value": "${DOCSPACE_JWT_SECRET}" }, + { "key": "DOCUMENT_SERVER_URL_EXTERNAL", "value": "" }, + { "key": "DOCUMENT_SERVER_URL_PUBLIC", "value": "/ds-vpath/" }, + { "key": "ELK_HOST", "value": "docspace-opensearch" }, + { "key": "ELK_PORT", "value": "9200" }, + { "key": "ELK_SCHEME", "value": "http" }, + { "key": "IDENTITY_API_SERVER_PORT", "value": "9090" }, + { "key": "IDENTITY_AUTHORIZATION_SERVER_PORT", "value": "8080" }, + { "key": "INSTALLATION_TYPE", "value": "COMMUNITY" }, + { "key": "JDBC_DATABASE", "value": "docspace" }, + { "key": "JDBC_PASSWORD", "value": "${DOCSPACE_MYSQL_PASSWORD}" }, + { "key": "JDBC_URL", "value": "docspace-mysql" }, + { "key": "JDBC_USER_NAME", "value": "onlyoffice_user" }, + { "key": "LOG_LEVEL", "value": "Warning" }, + { "key": "MYSQL_CONTAINER_NAME", "value": "docspace-mysql" }, + { "key": "MYSQL_DATABASE", "value": "docspace" }, + { "key": "MYSQL_HOST", "value": "" }, + { "key": "MYSQL_PASSWORD", "value": "${DOCSPACE_MYSQL_PASSWORD}" }, + { "key": "MYSQL_PORT", "value": "3306" }, + { "key": "MYSQL_ROOT_PASSWORD", "value": "${DOCSPACE_MYSQL_ROOT_PASSWORD}" }, + { "key": "MYSQL_USER", "value": "onlyoffice_user" }, + { "key": "NODE_CONTAINER_NAME", "value": "docspace-node" }, + { "key": "NODE_OPTIONS", "value": "--max_old_space_size=4096" }, + { "key": "OAUTH_REDIRECT_URL", "value": "https://service.onlyoffice.com/oauth2.aspx" }, + { "key": "RABBIT_HOST", "value": "docspace-rabbitmq" }, + { "key": "RABBIT_PASSWORD", "value": "${DOCSPACE_RABBITMQ_PASSWORD}" }, + { "key": "RABBIT_PORT", "value": "5672" }, + { "key": "RABBIT_PROTOCOL", "value": "amqp" }, + { "key": "RABBIT_USER_NAME", "value": "guest" }, + { "key": "RABBIT_VIRTUAL_HOST", "value": "/" }, + { "key": "REDIS_DB", "value": "0" }, + { "key": "REDIS_HOST", "value": "docspace-redis" }, + { "key": "REDIS_PASSWORD", "value": "" }, + { "key": "REDIS_PORT", "value": "6379" }, + { "key": "REDIS_USER_NAME", "value": "" }, + { "key": "ROUTER_HOST", "value": "docspace-router" }, + { "key": "SERVICE_AI_PORT", "value": "5157" }, + { "key": "SERVICE_AI_SERVICE_PORT", "value": "5124" }, + { "key": "SERVICE_API_PORT", "value": "5000" }, + { "key": "SERVICE_API_SYSTEM_PORT", "value": "5010" }, + { "key": "SERVICE_BACKUP_BACKGRUOND_TASKS_PORT", "value": "5032" }, + { "key": "SERVICE_BACKUP_PORT", "value": "5012" }, + { "key": "SERVICE_CLEAR_EVENTS_PORT", "value": "5027" }, + { "key": "SERVICE_DOCEDITOR_PORT", "value": "5013" }, + { "key": "SERVICE_FILES_PORT", "value": "5007" }, + { "key": "SERVICE_FILES_SERVICES_PORT", "value": "5009" }, + { "key": "SERVICE_HEALTHCHECKS_PORT", "value": "5033" }, + { "key": "SERVICE_LOGIN_PORT", "value": "5011" }, + { "key": "SERVICE_MANAGEMENT_PORT", "value": "5015" }, + { "key": "SERVICE_NOTIFY_PORT", "value": "5005" }, + { "key": "SERVICE_PEOPLE_SERVER_PORT", "value": "5004" }, + { "key": "SERVICE_SDK_PORT", "value": "5099" }, + { "key": "SERVICE_SOCKET_PORT", "value": "9899" }, + { "key": "SERVICE_SSOAUTH_PORT", "value": "9834" }, + { "key": "SERVICE_STUDIO_NOTIFY_PORT", "value": "5006" }, + { "key": "SERVICE_STUDIO_PORT", "value": "5003" }, + { "key": "SERVICE_TELEGRAM_PORT", "value": "5075" }, + { "key": "SPRING_APPLICATION_ENCRYPTION_SECRET", "value": "${DOCSPACE_IDENTITY_SECRET}" }, + { "key": "SPRING_APPLICATION_SIGNATURE_SECRET", "value": "${DOCSPACE_MACHINEKEY}" }, + { "key": "SPRING_PROFILES_ACTIVE", "value": "dev,server" } + ], + "volumes": [ + { + "hostPath": "${APP_DATA_DIR}/data/app", + "containerPath": "/app/onlyoffice/data" + }, + { + "hostPath": "${APP_DATA_DIR}/data/log", + "containerPath": "/var/log/onlyoffice" + } + ], + "healthCheck": { + "test": "supervisorctl status | grep -v 'ASC.Migration.Runner' | grep -qv RUNNING && exit 1 || exit 0", + "interval": "60s", + "timeout": "10s", + "retries": 5 + }, + "dependsOn": { + "docspace-migration-runner": { "condition": "service_completed_successfully" }, + "docspace-mysql": { "condition": "service_healthy" }, + "docspace-redis": { "condition": "service_healthy" }, + "docspace-rabbitmq": { "condition": "service_healthy" }, + "docspace-opensearch": { "condition": "service_healthy" } + } + }, + { + "name": "docspace-router", + "image": "onlyoffice/docspace-router:latest", + "user": "root:root", + "environment": [ + { "key": "DASHBOARDS_CONTAINER_NAME", "value": "" }, + { "key": "DASHBOARDS_PASSWORD", "value": "" }, + { "key": "DASHBOARDS_USERNAME", "value": "" }, + { "key": "DOCUMENT_CONTAINER_NAME", "value": "docspace-document-server" }, + { "key": "DOCUMENT_SERVER_URL_EXTERNAL", "value": "" }, + { "key": "REDIS_CONTAINER_NAME", "value": "docspace-redis" }, + { "key": "REDIS_DB", "value": "0" }, + { "key": "REDIS_HOST", "value": "" }, + { "key": "REDIS_PASSWORD", "value": "" }, + { "key": "REDIS_PORT", "value": "6379" }, + { "key": "SERVICE_AI", "value": "docspace-dotnet:5157" }, + { "key": "SERVICE_AI_SERVICE", "value": "docspace-dotnet:5124" }, + { "key": "SERVICE_API", "value": "docspace-dotnet:5000" }, + { "key": "SERVICE_API_SYSTEM", "value": "docspace-dotnet:5010" }, + { "key": "SERVICE_BACKUP", "value": "docspace-dotnet:5012" }, + { "key": "SERVICE_CLEAR_EVENTS", "value": "docspace-dotnet:5027" }, + { "key": "SERVICE_DOCEDITOR", "value": "docspace-node:5013" }, + { "key": "SERVICE_FILES", "value": "docspace-dotnet:5007" }, + { "key": "SERVICE_FILES_SERVICES", "value": "docspace-dotnet:5009" }, + { "key": "SERVICE_HEALTHCHECKS", "value": "docspace-dotnet:5033" }, + { "key": "SERVICE_IDENTITY", "value": "docspace-java:8080" }, + { "key": "SERVICE_IDENTITY_API", "value": "docspace-java:9090" }, + { "key": "SERVICE_LOGIN", "value": "docspace-node:5011" }, + { "key": "SERVICE_MANAGEMENT", "value": "docspace-node:5015" }, + { "key": "SERVICE_NOTIFY", "value": "docspace-dotnet:5005" }, + { "key": "SERVICE_PORT", "value": "5050" }, + { "key": "SERVICE_PEOPLE_SERVER", "value": "docspace-dotnet:5004" }, + { "key": "SERVICE_SDK", "value": "docspace-node:5099" }, + { "key": "SERVICE_SOCKET", "value": "docspace-node:9899" }, + { "key": "SERVICE_SSOAUTH", "value": "docspace-node:9834" }, + { "key": "SERVICE_STUDIO", "value": "docspace-dotnet:5003" }, + { "key": "SERVICE_STUDIO_NOTIFY", "value": "docspace-dotnet:5006" }, + { "key": "SERVICE_TELEGRAM", "value": "docspace-dotnet:5075" }, + { "key": "WRONG_PORTAL_NAME_URL", "value": "" } + ], + "volumes": [ + { + "hostPath": "${APP_DATA_DIR}/data/log", + "containerPath": "/var/log/onlyoffice" + } + ], + "healthCheck": { + "test": "nginx -t || exit 1", + "interval": "60s", + "timeout": "10s", + "retries": 5 + }, + "dependsOn": { + "docspace-dotnet": { "condition": "service_healthy" }, + "docspace-java": { "condition": "service_healthy" }, + "docspace-node": { "condition": "service_healthy" } + } + }, + { + "name": "docspace-identity-authorization", + "image": "onlyoffice/docspace-identity-authorization:latest", + "user": "root:root", + "environment": [ + { "key": "SPRING_PROFILES_ACTIVE", "value": "dev,server" }, + { "key": "SPRING_APPLICATION_SIGNATURE_SECRET", "value": "${DOCSPACE_MACHINEKEY}" }, + { "key": "SPRING_APPLICATION_ENCRYPTION_SECRET", "value": "${DOCSPACE_IDENTITY_SECRET}" }, + { "key": "MYSQL_CONTAINER_NAME", "value": "docspace-mysql" }, + { "key": "MYSQL_HOST", "value": "" }, + { "key": "MYSQL_PORT", "value": "3306" }, + { "key": "MYSQL_DATABASE", "value": "docspace" }, + { "key": "MYSQL_USER", "value": "onlyoffice_user" }, + { "key": "MYSQL_PASSWORD", "value": "${DOCSPACE_MYSQL_PASSWORD}" }, + { "key": "RABBIT_CONTAINER_NAME", "value": "docspace-rabbitmq" }, + { "key": "RABBIT_PROTOCOL", "value": "amqp" }, + { "key": "RABBIT_HOST", "value": "" }, + { "key": "RABBIT_USER_NAME", "value": "guest" }, + { "key": "RABBIT_PASSWORD", "value": "${DOCSPACE_RABBITMQ_PASSWORD}" }, + { "key": "RABBIT_VIRTUAL_HOST", "value": "/" }, + { "key": "REDIS_HOST", "value": "" }, + { "key": "REDIS_PORT", "value": "6379" }, + { "key": "REDIS_USER_NAME", "value": "" }, + { "key": "REDIS_PASSWORD", "value": "" }, + { "key": "REDIS_CONTAINER_NAME", "value": "docspace-redis" }, + { "key": "SERVER_PORT", "value": "8080" }, + { "key": "GRPC_CLIENT_REGISTRATION_ADDRESS", "value": "static://docspace-identity-api:8888" } + ], + "volumes": [ + { + "hostPath": "${APP_DATA_DIR}/data/log", + "containerPath": "/var/log/onlyoffice" + } + ], + "healthCheck": { + "test": "curl --fail http://docspace-identity-authorization:8080/health/ || exit 1", + "interval": "60s", + "timeout": "10s", + "retries": 5 + }, + "dependsOn": { + "docspace-migration-runner": { "condition": "service_completed_successfully" }, + "docspace-mysql": { "condition": "service_healthy" }, + "docspace-redis": { "condition": "service_healthy" }, + "docspace-rabbitmq": { "condition": "service_healthy" } + } + }, + { + "name": "docspace-identity-api", + "image": "onlyoffice/docspace-identity-api:latest", + "user": "root:root", + "environment": [ + { "key": "SPRING_PROFILES_ACTIVE", "value": "dev,server" }, + { "key": "SPRING_APPLICATION_SIGNATURE_SECRET", "value": "${DOCSPACE_MACHINEKEY}" }, + { "key": "SPRING_APPLICATION_ENCRYPTION_SECRET", "value": "${DOCSPACE_IDENTITY_SECRET}" }, + { "key": "MYSQL_CONTAINER_NAME", "value": "docspace-mysql" }, + { "key": "MYSQL_HOST", "value": "" }, + { "key": "MYSQL_PORT", "value": "3306" }, + { "key": "MYSQL_DATABASE", "value": "docspace" }, + { "key": "MYSQL_USER", "value": "onlyoffice_user" }, + { "key": "MYSQL_PASSWORD", "value": "${DOCSPACE_MYSQL_PASSWORD}" }, + { "key": "RABBIT_CONTAINER_NAME", "value": "docspace-rabbitmq" }, + { "key": "RABBIT_PROTOCOL", "value": "amqp" }, + { "key": "RABBIT_HOST", "value": "" }, + { "key": "RABBIT_USER_NAME", "value": "guest" }, + { "key": "RABBIT_PASSWORD", "value": "${DOCSPACE_RABBITMQ_PASSWORD}" }, + { "key": "RABBIT_VIRTUAL_HOST", "value": "/" }, + { "key": "REDIS_HOST", "value": "" }, + { "key": "REDIS_PORT", "value": "6379" }, + { "key": "REDIS_USER_NAME", "value": "" }, + { "key": "REDIS_PASSWORD", "value": "" }, + { "key": "REDIS_CONTAINER_NAME", "value": "docspace-redis" }, + { "key": "SERVER_PORT", "value": "9090" }, + { "key": "GRPC_CLIENT_AUTHORIZATION_ADDRESS", "value": "static://docspace-identity-authorization:9999" } + ], + "volumes": [ + { + "hostPath": "${APP_DATA_DIR}/data/log", + "containerPath": "/var/log/onlyoffice" + } + ], + "healthCheck": { + "test": "curl --fail http://docspace-identity-api:9090/health/ || exit 1", + "interval": "60s", + "timeout": "10s", + "retries": 5 + }, + "dependsOn": { + "docspace-migration-runner": { "condition": "service_completed_successfully" }, + "docspace-mysql": { "condition": "service_healthy" }, + "docspace-redis": { "condition": "service_healthy" }, + "docspace-rabbitmq": { "condition": "service_healthy" } + } + }, + { + "name": "docspace-notify", + "image": "onlyoffice/docspace-notify:latest", + "environment": [ + { "key": "MYSQL_CONTAINER_NAME", "value": "docspace-mysql" }, + { "key": "MYSQL_HOST", "value": "" }, + { "key": "MYSQL_PORT", "value": "3306" }, + { "key": "MYSQL_ROOT_PASSWORD", "value": "${DOCSPACE_MYSQL_ROOT_PASSWORD}" }, + { "key": "MYSQL_DATABASE", "value": "docspace" }, + { "key": "MYSQL_USER", "value": "onlyoffice_user" }, + { "key": "MYSQL_PASSWORD", "value": "${DOCSPACE_MYSQL_PASSWORD}" }, + { "key": "DATABASE_MIGRATION", "value": "false" }, + { "key": "APP_DOTNET_ENV", "value": "" }, + { "key": "APP_KNOWN_NETWORKS", "value": "" }, + { "key": "APP_KNOWN_PROXIES", "value": "" }, + { "key": "APP_CORE_SERVER_ROOT", "value": "" }, + { "key": "APP_CORE_BASE_DOMAIN", "value": "${DOCSPACE_DOMAIN:-localhost}" }, + { "key": "APP_CORE_MACHINEKEY", "value": "${DOCSPACE_MACHINEKEY}" }, + { "key": "APP_URL_PORTAL", "value": "http://docspace-router:8092" }, + { "key": "INSTALLATION_TYPE", "value": "COMMUNITY" }, + { "key": "OAUTH_REDIRECT_URL", "value": "https://service.onlyoffice.com/oauth2.aspx" }, + { "key": "DOCUMENT_SERVER_JWT_SECRET", "value": "${DOCSPACE_JWT_SECRET}" }, + { "key": "DOCUMENT_SERVER_JWT_HEADER", "value": "AuthorizationJwt" }, + { "key": "DOCUMENT_SERVER_URL_PUBLIC", "value": "/ds-vpath/" }, + { "key": "DOCUMENT_CONTAINER_NAME", "value": "docspace-document-server" }, + { "key": "DOCUMENT_SERVER_URL_EXTERNAL", "value": "" }, + { "key": "ELK_CONTAINER_NAME", "value": "docspace-opensearch" }, + { "key": "ELK_SCHEME", "value": "http" }, + { "key": "ELK_HOST", "value": "" }, + { "key": "ELK_PORT", "value": "9200" }, + { "key": "REDIS_CONTAINER_NAME", "value": "docspace-redis" }, + { "key": "REDIS_HOST", "value": "" }, + { "key": "REDIS_PORT", "value": "6379" }, + { "key": "REDIS_USER_NAME", "value": "" }, + { "key": "REDIS_PASSWORD", "value": "" }, + { "key": "RABBIT_CONTAINER_NAME", "value": "docspace-rabbitmq" }, + { "key": "RABBIT_PROTOCOL", "value": "amqp" }, + { "key": "RABBIT_HOST", "value": "" }, + { "key": "RABBIT_PORT", "value": "5672" }, + { "key": "RABBIT_VIRTUAL_HOST", "value": "/" }, + { "key": "RABBIT_USER_NAME", "value": "guest" }, + { "key": "RABBIT_PASSWORD", "value": "${DOCSPACE_RABBITMQ_PASSWORD}" }, + { "key": "ROUTER_HOST", "value": "docspace-router" }, + { "key": "LOG_LEVEL", "value": "Warning" }, + { "key": "DEBUG_INFO", "value": "false" } + ], + "volumes": [ + { + "hostPath": "${APP_DATA_DIR}/data/app", + "containerPath": "/app/onlyoffice/data" + }, + { + "hostPath": "${APP_DATA_DIR}/data/log", + "containerPath": "/var/log/onlyoffice" + } + ], + "healthCheck": { + "test": "curl --fail http://docspace-notify:5005/health/ || exit 1", + "interval": "60s", + "timeout": "10s", + "retries": 5 + }, + "dependsOn": { + "docspace-migration-runner": { "condition": "service_completed_successfully" }, + "docspace-mysql": { "condition": "service_healthy" }, + "docspace-redis": { "condition": "service_healthy" }, + "docspace-rabbitmq": { "condition": "service_healthy" } + } + }, + { + "name": "docspace-healthchecks", + "image": "onlyoffice/docspace-healthchecks:latest", + "environment": [ + { "key": "LOG_LEVEL", "value": "Warning" } + ], + "volumes": [ + { + "hostPath": "${APP_DATA_DIR}/data/app", + "containerPath": "/app/onlyoffice/data" + } + ], + "healthCheck": { + "test": "curl --fail http://docspace-healthchecks:5033/liveness/ || exit 1", + "interval": "60s", + "timeout": "10s", + "retries": 5 + }, + "dependsOn": { + "docspace-dotnet": { "condition": "service_healthy" } + } + }, + { + "name": "docspace", + "image": "nginx:latest", + "isMain": true, + "internalPort": 80, + "environment": [ + { "key": "ROUTER_HOST", "value": "docspace-router" } + ], + "volumes": [ + { + "hostPath": "${APP_DATA_DIR}/data/nginx-log", + "containerPath": "/var/log/nginx" + }, + { + "hostPath": "${APP_DATA_DIR}/config/nginx/nginx.conf.template", + "containerPath": "/etc/nginx/nginx.conf", + "readOnly": true + }, + { + "hostPath": "${APP_DATA_DIR}/config/nginx/letsencrypt.conf", + "containerPath": "/etc/nginx/includes/letsencrypt.conf", + "readOnly": true + }, + { + "hostPath": "${APP_DATA_DIR}/config/nginx/proxy.upstream.conf.template", + "containerPath": "/etc/nginx/templates/proxy.upstream.conf.template", + "readOnly": true + }, + { + "hostPath": "${APP_DATA_DIR}/config/nginx/onlyoffice-proxy.conf", + "containerPath": "/etc/nginx/conf.d/default.conf", + "readOnly": true + } + ], + "healthCheck": { + "test": "nginx -t || exit 1", + "interval": "60s", + "timeout": "10s", + "retries": 5 + }, + "dependsOn": { + "docspace-router": { "condition": "service_healthy" } + } + } + ] +} diff --git a/apps/docspace/metadata/description.md b/apps/docspace/metadata/description.md new file mode 100644 index 0000000..f07f9cb --- /dev/null +++ b/apps/docspace/metadata/description.md @@ -0,0 +1,37 @@ +# ONLYOFFICE DocSpace + +ONLYOFFICE DocSpace is a collaborative room-based document management platform that enables teams to create, edit, and manage documents, spreadsheets, and presentations in real-time. + +## Key Features + +- **Room-based collaboration** — Organize work into dedicated rooms with granular access controls for teams, departments, or external partners +- **Built-in document editors** — Full-featured editors for documents, spreadsheets, presentations, and fillable forms powered by ONLYOFFICE Docs +- **File management** — Upload, organize, and share files with version history and audit trails +- **Third-party integrations** — Connect external storage providers (Google Drive, Dropbox, OneDrive, Nextcloud, etc.) +- **Guest access** — Invite external users with limited permissions for secure document sharing +- **Customizable branding** — White-label the interface with your organization's logo and colors + +## Architecture + +This deployment includes the full DocSpace stack: + +- **Nginx proxy** — Reverse proxy and entry point +- **DocSpace router** — Internal request routing +- **.NET services** — Core backend APIs (files, people, backup, studio, etc.) +- **Java services** — Identity and authorization (OAuth2/OpenID Connect) +- **Node.js services** — Frontend apps (login, editor, SDK, management) +- **ONLYOFFICE Document Server** — Real-time document editing engine +- **MySQL 8.3** — Primary database +- **Redis 7** — Caching and session storage +- **RabbitMQ 3** — Message queue for async operations +- **OpenSearch 2.18** — Full-text search indexing + +## System Requirements + +- **RAM:** Minimum 8GB recommended (OpenSearch alone needs 1GB+) +- **Disk:** 10GB+ for application data +- **Architecture:** amd64 only + +## First Launch + +After installation, navigate to the app URL and complete the initial setup wizard to create your administrator account.