Hosting
There are two approaches to hosting itself: Docker (recommended) and an installation on the operating system (Linux is recommended here). Both approaches are described below:
Docker (recommended)
This approach describes hosting the middleware via Docker. This is the generally recommended way, as it can solve some OS specific problems.
We describe here the simplest way by using a docker-compose.yml
file. For a real productive use we recommend kubernetes or other container ochistration software.
Prerequirements
- Docker
- docker-compose
Configuration
For the configuration of the service the docker-compose.yml
is used. With the Docker version of the middleware, a pre-configured
xemiddleware.config.mjs
is already shipped. This can either be completely overwritten by mounting the file in the container
via a volume or configured via the existing variables.
version: '3'
services:
middleware:
image: 'hub.xeditor.com/middleware:latest'
ports:
- '8080:8080'
environment:
# Variables with default value:
XEDITOR_MIDDLEWARE_CONFIG: '/usr/app/xemiddleware.config.mjs'
XEDITOR_MIDDLEWARE_PROTOCOL: 'HTTP'
XEDITOR_MIDDLEWARE_HTTPS_CA: ''
XEDITOR_MIDDLEWARE_HTTPS_KEY: ''
XEDITOR_MIDDLEWARE_HTTPS_CERT: ''
XEDITOR_MIDDLEWARE_HOST: '0.0.0.0'
XEDITOR_MIDDLEWARE_PORT: 8080
XEDITOR_SERVER_URL: 'http://localhost:8080'
XEDITOR_SERVER_HOST: ''
XEDITOR_SERVER_PORT: ''
XEDITOR_SERVER_PROTOCOL: 'HTTP'
XEDITOR_SERVER_PATH: ''
XEDITOR_SERVER_ALLOW_UNTRUSTED: 'false'
XEDITOR_SERVER_CONTENT_TYPE: 'application/x-www-form-urlencoded'
XEDITOR_MIDDLEWARE_ENABLE_VALIDATE_ON_LOAD: 'false'
XEDITOR_MIDDLEWARE_ENABLE_COMPRESSION: 'true'
XEDITOR_MIDDLEWARE_ENABLE_DOCUMENTATION: 'false'
XEDITOR_MIDDLEWARE_ENABLE_REMOVE_DEFAULT_NAMESPACE: 'false'
XEDITOR_MIDDLEWARE_MATHML_PROCESSOR: 'xformula'
XEDITOR_MIDDLEWARE_ENABLE_SVG_SUPPORT: 'false'
XEDITOR_SPELLCHECKER_URL: ''
XEDITOR_SPELLCHECKER_HOST: ''
XEDITOR_SPELLCHECKER_PORT: ''
XEDITOR_SPELLCHECKER_PROTOCOL: ''
XEDITOR_SPELLCHECKER_PATH: ''
XEDITOR_SPELLCHECKER_ALLOW_UNTRUSTED: 'false'
XEDITOR_SPELLCHECKER_CONTENT_TYPE: 'application/x-www-form-urlencoded'
XEDITOR_MIDDLEWARE_LOG_LEVEL: 'info'
XEDITOR_MIDDLEWARE_LOG_OUTPUT_CONSOLE: 'true'
XEDITOR_MIDDLEWARE_LOG_OUTPUT_FILE: ''
XEDITOR_MIDDLEWARE_LOG_OUTPUT_RFS_FILE: '/usr/app/logs/middleware.log'
XEDITOR_MIDDLEWARE_LOG_OUTPUT_RFS_SIZE: '1M'
XEDITOR_MIDDLEWARE_LOG_OUTPUT_RFS_MAX_FILES: '14'
XEDITOR_MIDDLEWARE_LOG_OUTPUT_RFS_INTERVAL: '1d'
XEDITOR_MIDDLEWARE_LOG_OUTPUT_RFS_COMPRESS: 'true'
XEDITOR_MIDDLEWARE_SCHEMA_CONFIGURATION_FILE: '/usr/app/config/xemiddleware.schema.config.mjs'
XEDITOR_MIDDLEWARE_HOOK_CONFIGURATION_FILE: '/usr/app/config/xemiddleware.hook.config.mjs'
# Add path to local xemiddleware.schema.config.mjs / xemiddleware.hook.config.mjs
volumes:
- "./config:/usr/app/config"
In addition, at least the file config/xemiddleware.schema.config.mjs
and the XSD/XSLT are required here, which can be mounted via the volume.
export const configuration = {
'default': 'demo@0.0',
'demo@0.0': {
file: './xsd/content.xsd',
map: {
'mathml/mathml3.xsd': './xsd/mathml/mathml3.xsd',
'mathml3-common.xsd': './xsd/mathml/mathml3-common.xsd',
'mathml3-content.xsd': './xsd/mathml/mathml3-content.xsd',
'mathml3-presentation.xsd': './xsd/mathml/mathml3-presentation.xsd',
'mathml3-strict-content.xsd': './xsd/mathml/mathml3-strict-content.xsd',
'svg/svg.xsd': './xsd/svg/svg.xsd',
'../modules/xlink.xsd': './xsd/modules/xlink.xsd',
'../modules/xml.xsd': './xsd/modules/xml.xsd',
},
transformation: {
contenttoeditor: "./xsl/xml-to-html-override.xsl",
editortocontent: "./xsl/html-to-xml.xsl",
pastetoeditorfirst: "./xsl/pastetoeditorfirst.xsl",
pastetoeditorsecond: "./xsl/pastetoeditorsecond.xsl"
}
}
}
Now that we have created our docker-compose.yml
and config/xemiddleware.schema.config.mjs
and placed our XSD/XSLT files
in the config
folder, we can start the middleware. This can be done easily with the docker-compose up
command.
Build your own Docker image
If there is a possibility to create Docker images in a pipeline and store them in a private repository, then we recommend to create your own Dockerfile. For this you can simply inherit from the base and overwrite all necessary ENV variables and copy all necessary files into the image.
This could look as simple as the following:
FROM hub.xeditor.com/middleware:latest
COPY ./config /usr/app/config
Linux / Operating System
In this approach, the middleware is installed directly on an operating system.
Prerequirements
- NodeJS 18.16.0 (latest LTS)
- NPM 9.5.1 (Usually comes along automatically with NodeJS.)
- Java JRE >= 11
- xsltproc
Installation
For the installation of the middleware we recommend to create a separate folder on the server e.g. /opt/xeditor/middleware
.
In the folder we now create a package.json
file which takes care of the version of the productive middleware:
{
"name": "xeditor-middleware-configuration",
"version": "1.0.0",
"scripts": {
"start": "xemiddleware --config ./xemiddleware.config.mjs"
},
"dependencies": {
"@xeditor/middleware": "3.0.0"
}
}
After that we can already install all needed Node Modules via npm install
.
Now the middleware can be started and used with the command npm start
.
Service
Linux
For productive use it makes sense to run the middleware as a service.
For this purpose, a /etc/systemd/system/middleware.service
file can simply be created.
[Unit]
Description=Xeditor middleware service
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=5
User=centos
WorkingDirectory=/opt/xeditor/middleware
ExecStart=/usr/bin/env node /opt/xeditor/middleware/node_modules/.bin/xemiddleware --config ./xemiddleware.config.mjs
[Install]
WantedBy=multi-user.target
Windows
In order to use a service on Windows, we use the NodeJS library node-windows
.
For this we need to install the node-windows
dependency:
npm install -S node-windows
After that, we can create a new file here in the project with the name install_service.js
in the root of our project:
var Service = require('node-windows').Service;
const path = require('path');
const fs = require('fs');
const logPath = path.join(__dirname, 'logs')
if (!fs.existsSync(logPath)) {
fs.mkdirSync(logPath)
}
var svc = new Service({
name:'Xeditor Middleware Serivce',
description: 'Xeditor Middleware Serivce',
script: path.join(__dirname, 'node_modules/@xeditor/middleware/bin/xemiddleware.js'),
scriptOptions: [
`"--config=xemiddleware.config.mjs"`
],
logpath: logPath
});
svc.on('install',function(){
console.log("Install complete. Starting...")
svc.start();
});
svc.on('alreadyinstalled',function(){
svc.uninstall();
console.log("Uninstall complete.")
});
svc.install()
To install the service, you can run node install_service.js
. Run it again to uninstall the service.