Streams Basic Load Balancing (Allows multiple Forwarding Hosts)

This commit is contained in:
Guillaume Liautard
2022-04-14 01:10:28 +02:00
parent 4db34f5894
commit ec60004c96
9 changed files with 137 additions and 32 deletions

View File

@@ -0,0 +1,40 @@
const migrate_name = 'identifier_for_migrate';
const logger = require('../logger').migrate;
/**
* Migrate
*
* @see http://knexjs.org/#Schema
*
* @param {Object} knex
* @param {Promise} Promise
* @returns {Promise}
*/
exports.up = function (knex, Promise) {
logger.info('[' + migrate_name + '] Migrating Up...');
return knex.schema.table('stream', (table) => {
table.renameColumn('forwarding_host', 'forwarding_hosts');
})
.then(function () {
logger.info('[' + migrate_name + '] stream Table altered');
});
};
/**
* Undo Migrate
*
* @param {Object} knex
* @param {Promise} Promise
* @returns {Promise}
*/
exports.down = function (knex, Promise) {
logger.info('[' + migrate_name + '] Migrating Down...');
return knex.schema.table('stream', (table) => {
table.renameColumn('forwarding_hosts', 'forwarding_host');
})
.then(function () {
logger.info('[' + migrate_name + '] stream Table altered');
});
};

View File

@@ -13,6 +13,11 @@ class Stream extends Model {
this.created_on = now();
this.modified_on = now();
// Default for forwarding_hosts
if (typeof this.forwarding_hosts === 'undefined') {
this.forwarding_hosts = [];
}
// Default for meta
if (typeof this.meta === 'undefined') {
this.meta = {};
@@ -21,6 +26,11 @@ class Stream extends Model {
$beforeUpdate () {
this.modified_on = now();
// Sort domain_names
if (typeof this.forwarding_hosts !== 'undefined') {
this.forwarding_hosts.sort();
}
}
static get name () {
@@ -32,7 +42,7 @@ class Stream extends Model {
}
static get jsonAttributes () {
return ['meta'];
return ['forwarding_hosts', 'meta'];
}
static get relationMappings () {

View File

@@ -20,20 +20,26 @@
"minimum": 1,
"maximum": 65535
},
"forwarding_host": {
"anyOf": [
{
"$ref": "../definitions.json#/definitions/domain_name"
},
{
"type": "string",
"format": "ipv4"
},
{
"type": "string",
"format": "ipv6"
}
]
"forwarding_hosts": {
"type": "array",
"minItems": 1,
"maxItems": 15,
"uniqueItems": true,
"items": {
"anyOf": [
{
"$ref": "../definitions.json#/definitions/domain_name"
},
{
"type": "string",
"format": "ipv4"
},
{
"type": "string",
"format": "ipv6"
}
]
}
},
"forwarding_port": {
"type": "integer",
@@ -66,8 +72,8 @@
"incoming_port": {
"$ref": "#/definitions/incoming_port"
},
"forwarding_host": {
"$ref": "#/definitions/forwarding_host"
"forwarding_hosts": {
"$ref": "#/definitions/forwarding_hosts"
},
"forwarding_port": {
"$ref": "#/definitions/forwarding_port"
@@ -118,15 +124,15 @@
"additionalProperties": false,
"required": [
"incoming_port",
"forwarding_host",
"forwarding_hosts",
"forwarding_port"
],
"properties": {
"incoming_port": {
"$ref": "#/definitions/incoming_port"
},
"forwarding_host": {
"$ref": "#/definitions/forwarding_host"
"forwarding_hosts": {
"$ref": "#/definitions/forwarding_hosts"
},
"forwarding_port": {
"$ref": "#/definitions/forwarding_port"
@@ -165,8 +171,8 @@
"incoming_port": {
"$ref": "#/definitions/incoming_port"
},
"forwarding_host": {
"$ref": "#/definitions/forwarding_host"
"forwarding_hosts": {
"$ref": "#/definitions/forwarding_hosts"
},
"forwarding_port": {
"$ref": "#/definitions/forwarding_port"

View File

@@ -3,6 +3,13 @@
# ------------------------------------------------------------
{% if enabled %}
upstream stream_{{ incoming_port }}_tcp {
{% for forwarding_host in forwarding_hosts %}
server {{ forwarding_host }}:{{ forwarding_port }};
{%- endfor %}
}
{% if tcp_forwarding == 1 or tcp_forwarding == true -%}
server {
listen {{ incoming_port }};
@@ -12,7 +19,7 @@ server {
#listen [::]:{{ incoming_port }};
{% endif %}
proxy_pass {{ forwarding_host }}:{{ forwarding_port }};
proxy_pass stream_{{ incoming_port }}_tcp;
# Custom
include /data/nginx/custom/server_stream[.]conf;
@@ -20,18 +27,26 @@ server {
}
{% endif %}
{% if udp_forwarding == 1 or udp_forwarding == true %}
upstream stream_{{ incoming_port }}_udp {
{% for forwarding_host in forwarding_hosts %}
server {{ forwarding_host }}:{{ forwarding_port }};
{%- endfor %}
}
server {
listen {{ incoming_port }} udp;
{% if ipv6 -%}
listen [::]:{{ incoming_port }} udp;
{% else -%}
#listen [::]:{{ incoming_port }} udp;
#listen [::]:{{ incoming_port }} udp;
{% endif %}
proxy_pass {{ forwarding_host }}:{{ forwarding_port }};
proxy_pass stream_{{ incoming_port }}_udp;
# Custom
include /data/nginx/custom/server_stream[.]conf;
include /data/nginx/custom/server_stream_udp[.]conf;
}
{% endif %}
{% endif %}
{% endif %}