Basic support for Mosaico-based email templates.
This commit is contained in:
parent
b5cdf57f72
commit
7b5642e911
38 changed files with 1271 additions and 751 deletions
165
index.js
165
index.js
|
@ -1,14 +1,9 @@
|
|||
'use strict';
|
||||
|
||||
/**
|
||||
* Module dependencies.
|
||||
*/
|
||||
|
||||
const config = require('config');
|
||||
const log = require('npmlog');
|
||||
const app = require('./app');
|
||||
const appBuilder = require('./app-builder');
|
||||
const http = require('http');
|
||||
const fork = require('child_process').fork;
|
||||
const triggers = require('./services/triggers');
|
||||
const importer = require('./services/importer');
|
||||
const verpServer = require('./services/verp-server');
|
||||
|
@ -24,100 +19,86 @@ const privilegeHelpers = require('./lib/privilege-helpers');
|
|||
const knex = require('./lib/knex');
|
||||
const shares = require('./models/shares');
|
||||
|
||||
let port = config.www.port;
|
||||
let host = config.www.host;
|
||||
const trustedPort = config.www.port;
|
||||
const sandboxPort = config.www.sandboxPort;
|
||||
const host = config.www.host;
|
||||
|
||||
if (config.title) {
|
||||
process.title = config.title;
|
||||
}
|
||||
|
||||
log.level = config.log.level;
|
||||
app.set('port', port);
|
||||
|
||||
/**
|
||||
* Create HTTP server.
|
||||
*/
|
||||
|
||||
let server = http.createServer(app);
|
||||
function startHTTPServer(trusted, port, callback) {
|
||||
const app = appBuilder.createApp(trusted);
|
||||
app.set('port', port);
|
||||
|
||||
server.on('error', err => {
|
||||
if (err.syscall !== 'listen') {
|
||||
throw err;
|
||||
}
|
||||
const server = http.createServer(app);
|
||||
|
||||
let bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port;
|
||||
|
||||
// handle specific listen errors with friendly messages
|
||||
switch (err.code) {
|
||||
case 'EACCES':
|
||||
log.error('Express', '%s requires elevated privileges', bind);
|
||||
return process.exit(1);
|
||||
case 'EADDRINUSE':
|
||||
log.error('Express', '%s is already in use', bind);
|
||||
return process.exit(1);
|
||||
default:
|
||||
server.on('error', err => {
|
||||
if (err.syscall !== 'listen') {
|
||||
throw err;
|
||||
}
|
||||
});
|
||||
|
||||
function spawnSenders(callback) {
|
||||
let processes = Math.max(Number(config.queue.processes) || 1, 1);
|
||||
let spawned = 0;
|
||||
let returned = false;
|
||||
|
||||
if (processes > 1 && !config.redis.enabled) {
|
||||
log.error('Queue', '%s processes requested but Redis is not enabled, spawning 1 process', processes);
|
||||
processes = 1;
|
||||
}
|
||||
|
||||
let spawnSender = function () {
|
||||
if (spawned >= processes) {
|
||||
if (!returned) {
|
||||
returned = true;
|
||||
return callback();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
let child = fork(__dirname + '/services/sender.js', []);
|
||||
let pid = child.pid;
|
||||
senders.workers.add(child);
|
||||
const bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port;
|
||||
|
||||
child.on('close', (code, signal) => {
|
||||
spawned--;
|
||||
senders.workers.delete(child);
|
||||
log.error('Child', 'Sender process %s exited with %s', pid, code || signal);
|
||||
// Respawn after 5 seconds
|
||||
setTimeout(() => spawnSender(), 5 * 1000).unref();
|
||||
});
|
||||
// handle specific listen errors with friendly messages
|
||||
switch (err.code) {
|
||||
case 'EACCES':
|
||||
log.error('Express', '%s requires elevated privileges', bind);
|
||||
return process.exit(1);
|
||||
case 'EADDRINUSE':
|
||||
log.error('Express', '%s is already in use', bind);
|
||||
return process.exit(1);
|
||||
default:
|
||||
throw err;
|
||||
}
|
||||
});
|
||||
|
||||
spawned++;
|
||||
setImmediate(spawnSender);
|
||||
};
|
||||
server.on('listening', () => {
|
||||
const addr = server.address();
|
||||
const bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port;
|
||||
log.info('Express', 'WWW server listening on %s', bind);
|
||||
});
|
||||
|
||||
spawnSender();
|
||||
server.listen({port, host}, callback);
|
||||
}
|
||||
|
||||
server.on('listening', () => {
|
||||
let addr = server.address();
|
||||
let bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port;
|
||||
log.info('Express', 'WWW server listening on %s', bind);
|
||||
|
||||
// start additional services
|
||||
function startNextServices() {
|
||||
testServer(() => {
|
||||
verpServer(() => {
|
||||
// ---------------------------------------------------------------------------------------
|
||||
// Start the whole circus here
|
||||
// ---------------------------------------------------------------------------------------
|
||||
dbcheck(err => { // Check if database needs upgrading before starting the server - legacy migration first
|
||||
if (err) {
|
||||
log.error('DB', err.message || err);
|
||||
return process.exit(1);
|
||||
}
|
||||
|
||||
privilegeHelpers.dropRootPrivileges();
|
||||
knex.migrate.latest() // And now the current migration with Knex
|
||||
|
||||
tzupdate(() => {
|
||||
importer(() => {
|
||||
triggers(() => {
|
||||
spawnSenders(() => {
|
||||
feedcheck(() => {
|
||||
postfixBounceServer(async () => {
|
||||
await reportProcessor.init();
|
||||
log.info('Service', 'All services started');
|
||||
.then(() => shares.regenerateRoleNamesTable())
|
||||
.then(() => shares.rebuildPermissions())
|
||||
|
||||
.then(() =>
|
||||
executor.spawn(() => {
|
||||
testServer(() => {
|
||||
verpServer(() => {
|
||||
startHTTPServer(true, trustedPort, () => {
|
||||
startHTTPServer(false, sandboxPort, () => {
|
||||
privilegeHelpers.dropRootPrivileges();
|
||||
|
||||
tzupdate(() => {
|
||||
importer(() => {
|
||||
triggers(() => {
|
||||
senders.spawn(() => {
|
||||
feedcheck(() => {
|
||||
postfixBounceServer(async () => {
|
||||
await reportProcessor.init();
|
||||
log.info('Service', 'All services started');
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -125,30 +106,8 @@ server.on('listening', () => {
|
|||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if (config.reports && config.reports.enabled === true) {
|
||||
executor.spawn(startNextServices);
|
||||
} else {
|
||||
startNextServices();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
// Check if database needs upgrading before starting the server
|
||||
// First, the legacy migration
|
||||
dbcheck(err => {
|
||||
if (err) {
|
||||
log.error('DB', err.message || err);
|
||||
return process.exit(1);
|
||||
}
|
||||
|
||||
// And now the current migration with Knex
|
||||
knex.migrate.latest()
|
||||
.then(() => shares.regenerateRoleNamesTable())
|
||||
.then(() => shares.rebuildPermissions())
|
||||
.then(() => server.listen(port, host)); // Listen on provided port, on all network interfaces.
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue