feat: reload nginx on proxyconfig change

This commit is contained in:
Rainer Killinger
2022-05-06 12:55:10 +02:00
parent ed7b5eaf65
commit 1fcf7340d4
2 changed files with 22 additions and 14 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 StApps
* Copyright (C) 2022 StApps
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
@@ -17,7 +17,7 @@ import {Logger} from '@openstapps/logger';
import {execSync} from 'child_process';
import * as Dockerode from 'dockerode';
import {render} from 'mustache';
import {asyncReadFile, asyncWriteFile, configFile} from './common';
import {asyncReadFile, asyncWriteFile} from './common';
import {getContainers, getTemplateView} from './main';
// handle unhandled promise rejections
@@ -27,6 +27,7 @@ process.on('unhandledRejection', async (error) => {
});
let containerHashCache = '';
let configHashCache = '';
/**
* Reads the container information from the docker socket and updates the nginx config if necessary
@@ -40,16 +41,19 @@ async function updateNginxConfig() {
})
.join(',');
delete require.cache[require.resolve('config')];
const configFile = require('config');
const configHash = JSON.stringify(configFile);
// if containers changed -> write config file, reload nginx
if (containerHash !== containerHashCache) {
if (containerHash !== containerHashCache || configHash !== configHashCache) {
Logger.log('Generating new NGINX configuration');
// render nginx config file
const nginxConfig = render(await asyncReadFile('nginx.conf.template', 'utf8'), await getTemplateView(containers));
Logger.log(`containers (${containerHash}) matched the configuration.`);
containerHashCache = containerHash;
configHashCache = configHash;
Logger.log(`Writing new config file "${configFile.output}"`);

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2019 StApps
* Copyright (C) 2022 StApps
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
@@ -21,7 +21,7 @@ import {join} from 'path';
import * as semver from 'semver';
import {
asyncReadFile,
configFile,
ConfigFile,
isFileType,
protocolHardeningParameters,
SSLFilePaths,
@@ -107,7 +107,7 @@ export async function generateUpstreamMap(
}
if (activeBackends.length !== 0) {
// not only dublicates
// not only duplicates
foundMatchingContainer = true;
const gateWayOfContainer = await getGatewayOfStAppsBackend(activeBackends[0]);
@@ -156,12 +156,12 @@ export function generateListener(sslFilePaths: SSLFilePaths) {
typeof sslFilePaths.dhparam !== 'undefined' && isFileType(sslFilePaths.dhparam,'pem')
) {
// https listener
listener = `listen 443 ssl default_server;
ssl_certificate ${sslFilePaths.certificate};
ssl_certificate_key ${sslFilePaths.certificateKey};
ssl_trusted_certificate ${sslFilePaths.certificateChain};
ssl_dhparam ${sslFilePaths.dhparam};
${sslHardeningParameters}`;
listener = ` listen 443 ssl default_server;
ssl_certificate ${sslFilePaths.certificate};
ssl_certificate_key ${sslFilePaths.certificateKey};
ssl_trusted_certificate ${sslFilePaths.certificateChain};
ssl_dhparam ${sslFilePaths.dhparam};
${sslHardeningParameters}`;
} else {
// default http listener
listener = 'listen 80 default_server;';
@@ -205,6 +205,10 @@ function generateRateLimitAllowList(entries: string[]): string {
* @param containers List of container info
*/
export async function getTemplateView(containers: Dockerode.ContainerInfo[]): Promise<TemplateView> {
delete require.cache[require.resolve('config')];
const config = require('config');
const configFile = config as ConfigFile;
const cors = await asyncReadFile('./fixtures/cors.template', 'utf8');
const visibleRoutesPromises = ['/'].map(async (route) => {