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 { ...@@ -82,10 +82,27 @@ export interface RenderData {
ticketKeyPath: string; ticketKeyPath: string;
certsPath: string; certsPath: string;
sites: SiteRenderData[]; sites: SiteRenderData[];
upstreams: Upstream[];
httpExtra?: string[]; httpExtra?: string[];
nginxExtra?: 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( async function getSiteData(
domain: string, domain: string,
input: Record<string, string> = process.env, input: Record<string, string> = process.env,
...@@ -119,7 +136,8 @@ async function getSiteData( ...@@ -119,7 +136,8 @@ async function getSiteData(
const targetUrlInput = input[`SITE_${domain}`]; const targetUrlInput = input[`SITE_${domain}`];
const targetUrlInputs = targetUrlInput.split(','); // TODO: support multiple targets as upstream 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; let specificRenderData: SpecificRenderData;
if (targetUrl.protocol === 'static:') { if (targetUrl.protocol === 'static:') {
specificRenderData = { specificRenderData = {
...@@ -148,7 +166,7 @@ async function getSiteData( ...@@ -148,7 +166,7 @@ async function getSiteData(
const sni = parser.getString('SNI'); const sni = parser.getString('SNI');
specificRenderData = { specificRenderData = {
proxy: true, proxy: true,
upstream: targetUrlInput, upstream: createUpstream(domain, targetUrlInputs),
noVerifyCerts: parser.getBoolean('NO_VERIFY_CERTS'), noVerifyCerts: parser.getBoolean('NO_VERIFY_CERTS'),
noBuffer: parser.getBoolean('NO_BUFFER'), noBuffer: parser.getBoolean('NO_BUFFER'),
sni: sni === '1', sni: sni === '1',
...@@ -210,6 +228,7 @@ export async function getData( ...@@ -210,6 +228,7 @@ export async function getData(
sites: await Promise.all( sites: await Promise.all(
getSiteNames().map((domain) => getSiteData(domain, input)), getSiteNames().map((domain) => getSiteData(domain, input)),
), ),
upstreams,
httpExtra: parser.getArray('HTTP_EXTRA'), httpExtra: parser.getArray('HTTP_EXTRA'),
nginxExtra: parser.getArray('NGINX_EXTRA'), nginxExtra: parser.getArray('NGINX_EXTRA'),
}; };
......
...@@ -140,6 +140,18 @@ http { ...@@ -140,6 +140,18 @@ http {
limit_rate {{.}}; limit_rate {{.}};
{{/limitRate}} {{/limitRate}}
##
# Upstreams
##
{{#upstreams}}
upstream {{name}} {
{{#servers}}
server {{.}};
{{/servers}}
}
{{/upstreams}}
## ##
# Virtual Host Configs # 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