diff --git a/backend/migrations/20220413214306_stream_multi.js b/backend/migrations/20220413214306_stream_multi.js new file mode 100644 index 000000000..f3edb6c90 --- /dev/null +++ b/backend/migrations/20220413214306_stream_multi.js @@ -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'); + }); +}; diff --git a/backend/models/stream.js b/backend/models/stream.js index ed65de0fc..585c54641 100644 --- a/backend/models/stream.js +++ b/backend/models/stream.js @@ -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 () { diff --git a/backend/schema/endpoints/streams.json b/backend/schema/endpoints/streams.json index 159c8036e..9afb8bf71 100644 --- a/backend/schema/endpoints/streams.json +++ b/backend/schema/endpoints/streams.json @@ -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" diff --git a/backend/templates/stream.conf b/backend/templates/stream.conf index 76159a646..c7848223c 100644 --- a/backend/templates/stream.conf +++ b/backend/templates/stream.conf @@ -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 %} \ No newline at end of file +{% endif %} diff --git a/frontend/js/app/nginx/stream/form.ejs b/frontend/js/app/nginx/stream/form.ejs index eb80c3737..d6bfaa8d7 100644 --- a/frontend/js/app/nginx/stream/form.ejs +++ b/frontend/js/app/nginx/stream/form.ejs @@ -14,8 +14,8 @@