Aggiunge registry nodi stream e provisioning Hetzner/lab per lo scale-out.
Prepara l'architettura multi-nodo (MediaMTX+ffmpeg) con assignment URL per sessione, admin di provision/drain e provider Cloud/DNS astratti verso mltv-stream.net. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Admin
|
||||
class StreamNodesController < Admin::BaseController
|
||||
def index
|
||||
Streams::NodeRegistry.ensure_home_from_env!
|
||||
@nodes = StreamNode.order(:role, :slug)
|
||||
@dns_provider = ENV.fetch("STREAM_DNS_PROVIDER", "lab")
|
||||
@cloud_provider = ENV.fetch("STREAM_CLOUD_PROVIDER", "local_lab")
|
||||
@lab_hosts = lab_dns_snippet
|
||||
@hetzner_configured = ENV["HCLOUD_TOKEN"].present?
|
||||
end
|
||||
|
||||
def create
|
||||
kind = params[:kind].to_s
|
||||
node =
|
||||
if kind == "cloud"
|
||||
Streams::NodeProvisioner.new.provision_cloud!
|
||||
else
|
||||
Streams::NodeProvisioner.new.provision_lab!
|
||||
end
|
||||
redirect_to admin_stream_nodes_path,
|
||||
notice: t("admin.flash.stream_node_created", slug: node.slug)
|
||||
rescue Streams::NodeProvisioner::Error, Streams::CloudProviders::Error, Streams::DnsProviders::Error,
|
||||
KeyError => e
|
||||
redirect_to admin_stream_nodes_path, alert: e.message
|
||||
end
|
||||
|
||||
def drain
|
||||
node = StreamNode.find(params[:id])
|
||||
Streams::NodeProvisioner.new.drain!(node)
|
||||
redirect_to admin_stream_nodes_path, notice: t("admin.flash.stream_node_draining", slug: node.slug)
|
||||
rescue Streams::NodeProvisioner::Error => e
|
||||
redirect_to admin_stream_nodes_path, alert: e.message
|
||||
end
|
||||
|
||||
def destroy
|
||||
node = StreamNode.find(params[:id])
|
||||
Streams::NodeProvisioner.new.decommission!(node)
|
||||
redirect_to admin_stream_nodes_path, notice: t("admin.flash.stream_node_destroyed", slug: node.slug)
|
||||
rescue Streams::NodeProvisioner::BusyError, Streams::NodeProvisioner::Error,
|
||||
Streams::CloudProviders::Error, Streams::DnsProviders::Error => e
|
||||
redirect_to admin_stream_nodes_path, alert: e.message
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def lab_dns_snippet
|
||||
return "" unless @dns_provider == "lab"
|
||||
|
||||
Streams::DnsProviders::Lab.new.hosts_file_snippet
|
||||
rescue Redis::BaseError
|
||||
""
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -180,6 +180,7 @@ module Api
|
||||
platform: session.platform,
|
||||
rtmp_ingest_url: session.rtmp_ingest_url,
|
||||
hls_playback_url: session.hls_playback_url,
|
||||
stream_node: session.stream_node&.slug,
|
||||
watch_page_url: session.matchlivetv_platform? ? session.watch_page_url : nil,
|
||||
share_url: session.share_url,
|
||||
youtube_watch_url: session.youtube_watch_url,
|
||||
|
||||
Reference in New Issue
Block a user