Commit 0af4cec1 authored by nanahira's avatar nanahira

add multiple upstream support

parent 477b9a6e
Pipeline #26095 failed with stages
in 20 minutes and 50 seconds
......@@ -82,10 +82,27 @@ export interface RenderData {
ticketKeyPath: string;
certsPath: string;
sites: SiteRenderData[];
upstreams: Upstream[];
httpExtra?: string[];
nginxExtra?: string[];
}
export interface Upstream {
name: string;
servers: string[];
}
const upstreams: Upstream[] = [];
function createUpstream(domain: string, urlInputs: string[]) {
const urls = urlInputs.map((url) => new URL(url));
if (urls.length === 1) {
return urlInputs[0];
}
const name = `upstream_${domain.replace(/[^a-zA-Z0-9]/g, '_')}`;
upstreams.push({ name, servers: urls.map((url) => url.host) });
return `${urls[0].protocol}//${name}${urlInputs[0].slice(urls[0].origin.length)}`;
}
async function getSiteData(
domain: string,
input: Record<string, string> = process.env,
......@@ -119,7 +136,8 @@ async function getSiteData(
const targetUrlInput = input[`SITE_${domain}`];
const targetUrlInputs = targetUrlInput.split(','); // TODO: support multiple targets as upstream
const targetUrl = new URL(targetUrlInputs[0]);
const targetUrls = targetUrlInputs.map((url) => new URL(url));
const targetUrl = targetUrls[0];
let specificRenderData: SpecificRenderData;
if (targetUrl.protocol === 'static:') {
specificRenderData = {
......@@ -148,7 +166,7 @@ async function getSiteData(
const sni = parser.getString('SNI');
specificRenderData = {
proxy: true,
upstream: targetUrlInput,
upstream: createUpstream(domain, targetUrlInputs),
noVerifyCerts: parser.getBoolean('NO_VERIFY_CERTS'),
noBuffer: parser.getBoolean('NO_BUFFER'),
sni: sni === '1',
......@@ -210,6 +228,7 @@ export async function getData(
sites: await Promise.all(
getSiteNames().map((domain) => getSiteData(domain, input)),
),
upstreams,
httpExtra: parser.getArray('HTTP_EXTRA'),
nginxExtra: parser.getArray('NGINX_EXTRA'),
};
......
......@@ -140,6 +140,18 @@ http {
limit_rate {{.}};
{{/limitRate}}
##
# Upstreams
##
{{#upstreams}}
upstream {{name}} {
{{#servers}}
server {{.}};
{{/servers}}
}
{{/upstreams}}
##
# Virtual Host Configs
##
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment