Verified Commit 1fcf7340 authored by Rainer Killinger's avatar Rainer Killinger
Browse files

feat: reload nginx on proxyconfig change

parent ed7b5eaf
Loading
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
/*
 * 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}"`);

+13 −9
Original line number Diff line number Diff line
/*
 * 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]);
@@ -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) => {