diff --git a/src/cli.ts b/src/cli.ts index d4db4cb5..53f20c7e 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -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}"`); diff --git a/src/main.ts b/src/main.ts index 842d10f7..bea85968 100644 --- a/src/main.ts +++ b/src/main.ts @@ -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 { + 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) => {