Allow providing 12-Factor-style Database URL in config

This commit is contained in:
Andre Borie 2021-01-30 14:52:48 +00:00
parent c9a316ad35
commit 79e99908de
4 changed files with 43 additions and 16 deletions

View file

@ -6,6 +6,8 @@ db:
host: localhost host: localhost
port: 5432 port: 5432
dbname: invidious 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 full_refresh: false
https_only: false https_only: false
domain: domain:

View file

@ -33,16 +33,7 @@ require "./invidious/jobs/**"
CONFIG = Config.load CONFIG = Config.load
HMAC_KEY = CONFIG.hmac_key || Random::Secure.hex(32) HMAC_KEY = CONFIG.hmac_key || Random::Secure.hex(32)
PG_URL = URI.new( PG_DB = DB.open CONFIG.database_url
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
ARCHIVE_URL = URI.parse("https://archive.org") ARCHIVE_URL = URI.parse("https://archive.org")
LOGIN_URL = URI.parse("https://accounts.google.com") LOGIN_URL = URI.parse("https://accounts.google.com")
PUBSUB_URL = URI.parse("https://pubsubhubbub.appspot.com") PUBSUB_URL = URI.parse("https://pubsubhubbub.appspot.com")
@ -192,7 +183,7 @@ if CONFIG.captcha_key
end end
connection_channel = Channel({Bool, Channel(PQ::Notification)}).new(32) 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 Invidious::Jobs.start_all

View file

@ -68,7 +68,10 @@ class Config
property feed_threads : Int32 = 1 # Number of threads to use for updating feeds property feed_threads : Int32 = 1 # Number of threads to use for updating feeds
property output : String = "STDOUT" # Log file path or STDOUT 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 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 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 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 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:// 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
{% 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 return config
end end
end end

View file

@ -173,6 +173,20 @@ struct Preferences
end end
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 module ProcessString
def self.to_json(value : String, json : JSON::Builder) def self.to_json(value : String, json : JSON::Builder)
json.string value json.string value