summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorsyeopite <syeopite@syeopite.dev>2025-02-26 14:04:29 -0800
committersyeopite <syeopite@syeopite.dev>2025-02-26 14:04:29 -0800
commit3e329410d1f6426f49d0df425b31e78e9503bd9d (patch)
tree3d363d2622b7647467a16441419f0b4e2b2a1f63 /src
parent74dfda150ed296acfdea0efe942a24d94fdab6a7 (diff)
parentb4a61936427545dd545c5581ea898f2d1c29d3ab (diff)
downloadinvidious-3e329410d1f6426f49d0df425b31e78e9503bd9d.tar.gz
invidious-3e329410d1f6426f49d0df425b31e78e9503bd9d.tar.bz2
invidious-3e329410d1f6426f49d0df425b31e78e9503bd9d.zip
Add the ability to listen on UNIX sockets (#5112)
Diffstat (limited to 'src')
-rw-r--r--src/invidious.cr16
-rw-r--r--src/invidious/config.cr27
2 files changed, 40 insertions, 3 deletions
diff --git a/src/invidious.cr b/src/invidious.cr
index 566d4dc9..52df77be 100644
--- a/src/invidious.cr
+++ b/src/invidious.cr
@@ -240,8 +240,6 @@ add_context_storage_type(Preferences)
add_context_storage_type(Invidious::User)
Kemal.config.logger = LOGGER
-Kemal.config.host_binding = Kemal.config.host_binding != "0.0.0.0" ? Kemal.config.host_binding : CONFIG.host_binding
-Kemal.config.port = Kemal.config.port != 3000 ? Kemal.config.port : CONFIG.port
Kemal.config.app_name = "Invidious"
# Use in kemal's production mode.
@@ -250,4 +248,16 @@ Kemal.config.app_name = "Invidious"
Kemal.config.env = "production" if !ENV.has_key?("KEMAL_ENV")
{% end %}
-Kemal.run
+Kemal.run do |config|
+ if socket_binding = CONFIG.socket_binding
+File.delete?(socket_binding.path)
+ # Create a socket and set its desired permissions
+ server = UNIXServer.new(socket_binding.path)
+ perms = socket_binding.permissions.to_i(base: 8)
+ File.chmod(socket_binding.path, perms)
+ config.server.not_nil!.bind server
+ else
+ Kemal.config.host_binding = Kemal.config.host_binding != "0.0.0.0" ? Kemal.config.host_binding : CONFIG.host_binding
+ Kemal.config.port = Kemal.config.port != 3000 ? Kemal.config.port : CONFIG.port
+ end
+end
diff --git a/src/invidious/config.cr b/src/invidious/config.cr
index 4b3bdafc..453256b5 100644
--- a/src/invidious/config.cr
+++ b/src/invidious/config.cr
@@ -8,6 +8,13 @@ struct DBConfig
property dbname : String
end
+struct SocketBindingConfig
+ include YAML::Serializable
+
+ property path : String
+ property permissions : String
+end
+
struct ConfigPreferences
include YAML::Serializable
@@ -138,6 +145,8 @@ class Config
property port : Int32 = 3000
# Host to bind (overridden by command line argument)
property host_binding : String = "0.0.0.0"
+ # Path and permissions to make Invidious listen on a UNIX socket instead of a TCP port
+ property socket_binding : SocketBindingConfig? = nil
# Pool size for HTTP requests to youtube.com and ytimg.com (each domain has a separate pool of `pool_size`)
property pool_size : Int32 = 100
# HTTP Proxy configuration
@@ -255,6 +264,24 @@ class Config
end
end
+ # Check if the socket configuration is valid
+ if sb = config.socket_binding
+ if sb.path.ends_with?("/") || File.directory?(sb.path)
+ puts "Config: The socket path " + sb.path + " must not be a directory!"
+ exit(1)
+ end
+ d = File.dirname(sb.path)
+ if !File.directory?(d)
+ puts "Config: Socket directory " + sb.path + " does not exist or is not a directory!"
+ exit(1)
+ end
+ p = sb.permissions.to_i?(base: 8)
+ if !p || p < 0 || p > 0o777
+ puts "Config: Socket permissions must be an octal between 0 and 777!"
+ exit(1)
+ end
+ end
+
return config
end
end