Allow providing 12-Factor-style Database URL in config
This commit is contained in:
parent
c9a316ad35
commit
79e99908de
|
@ -6,6 +6,8 @@ db:
|
|||
host: localhost
|
||||
port: 5432
|
||||
dbname: invidious
|
||||
# alternatively, the database URL can be provided directly - if both are set then the latter takes precedence
|
||||
# database_url: postgres://kemal:kemal@localhost:5432/invidious
|
||||
full_refresh: false
|
||||
https_only: false
|
||||
domain:
|
||||
|
|
|
@ -33,16 +33,7 @@ require "./invidious/jobs/**"
|
|||
CONFIG = Config.load
|
||||
HMAC_KEY = CONFIG.hmac_key || Random::Secure.hex(32)
|
||||
|
||||
PG_URL = URI.new(
|
||||
scheme: "postgres",
|
||||
user: CONFIG.db.user,
|
||||
password: CONFIG.db.password,
|
||||
host: CONFIG.db.host,
|
||||
port: CONFIG.db.port,
|
||||
path: CONFIG.db.dbname,
|
||||
)
|
||||
|
||||
PG_DB = DB.open PG_URL
|
||||
PG_DB = DB.open CONFIG.database_url
|
||||
ARCHIVE_URL = URI.parse("https://archive.org")
|
||||
LOGIN_URL = URI.parse("https://accounts.google.com")
|
||||
PUBSUB_URL = URI.parse("https://pubsubhubbub.appspot.com")
|
||||
|
@ -192,7 +183,7 @@ if CONFIG.captcha_key
|
|||
end
|
||||
|
||||
connection_channel = Channel({Bool, Channel(PQ::Notification)}).new(32)
|
||||
Invidious::Jobs.register Invidious::Jobs::NotificationJob.new(connection_channel, PG_URL)
|
||||
Invidious::Jobs.register Invidious::Jobs::NotificationJob.new(connection_channel, CONFIG.database_url)
|
||||
|
||||
Invidious::Jobs.start_all
|
||||
|
||||
|
|
|
@ -64,11 +64,14 @@ end
|
|||
class Config
|
||||
include YAML::Serializable
|
||||
|
||||
property channel_threads : Int32 = 1 # Number of threads to use for crawling videos from channels (for updating subscriptions)
|
||||
property feed_threads : Int32 = 1 # Number of threads to use for updating feeds
|
||||
property output : String = "STDOUT" # Log file path or STDOUT
|
||||
property log_level : LogLevel = LogLevel::Info # Default log level, valid YAML values are ints and strings, see src/invidious/helpers/logger.cr
|
||||
property db : DBConfig # Database configuration
|
||||
property channel_threads : Int32 = 1 # Number of threads to use for crawling videos from channels (for updating subscriptions)
|
||||
property feed_threads : Int32 = 1 # Number of threads to use for updating feeds
|
||||
property output : String = "STDOUT" # Log file path or STDOUT
|
||||
property log_level : LogLevel = LogLevel::Info # Default log level, valid YAML values are ints and strings, see src/invidious/helpers/logger.cr
|
||||
property db : DBConfig? = nil # Database configuration with separate parameters (username, hostname, etc)
|
||||
|
||||
@[YAML::Field(converter: Preferences::URIConverter)]
|
||||
property database_url : URI = URI.parse("") # Database configuration using 12-Factor "Database URL" syntax
|
||||
property decrypt_polling : Bool = true # Use polling to keep decryption function up to date
|
||||
property full_refresh : Bool = false # Used for crawling channels: threads should check all videos uploaded by a channel
|
||||
property https_only : Bool? # Used to tell Invidious it is behind a proxy, so links to resources should be https://
|
||||
|
@ -170,6 +173,23 @@ class Config
|
|||
end
|
||||
{% end %}
|
||||
|
||||
# Build database_url from db.* if it's not set directly
|
||||
if config.database_url.to_s.empty?
|
||||
if db = config.db
|
||||
config.database_url = URI.new(
|
||||
scheme: "postgres",
|
||||
user: db.user,
|
||||
password: db.password,
|
||||
host: db.host,
|
||||
port: db.port,
|
||||
path: db.dbname,
|
||||
)
|
||||
else
|
||||
puts "Config : Either database_url or db.* is required"
|
||||
exit(1)
|
||||
end
|
||||
end
|
||||
|
||||
return config
|
||||
end
|
||||
end
|
||||
|
|
|
@ -173,6 +173,20 @@ struct Preferences
|
|||
end
|
||||
end
|
||||
|
||||
module URIConverter
|
||||
def self.to_yaml(value : URI, yaml : YAML::Nodes::Builder)
|
||||
yaml.scalar value.normalize!
|
||||
end
|
||||
|
||||
def self.from_yaml(ctx : YAML::ParseContext, node : YAML::Nodes::Node) : URI
|
||||
if node.is_a?(YAML::Nodes::Scalar)
|
||||
URI.parse node.value
|
||||
else
|
||||
node.raise "Expected scalar, not #{node.class}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module ProcessString
|
||||
def self.to_json(value : String, json : JSON::Builder)
|
||||
json.string value
|
||||
|
|
Loading…
Reference in New Issue