options.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489
  1. // Copyright 2019 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package config // import "miniflux.app/config"
  5. import (
  6. "fmt"
  7. "strings"
  8. "miniflux.app/version"
  9. )
  10. const (
  11. defaultHTTPS = false
  12. defaultLogDateTime = false
  13. defaultHSTS = true
  14. defaultHTTPService = true
  15. defaultSchedulerService = true
  16. defaultDebug = false
  17. defaultBaseURL = "http://localhost"
  18. defaultRootURL = "http://localhost"
  19. defaultBasePath = ""
  20. defaultWorkerPoolSize = 5
  21. defaultPollingFrequency = 60
  22. defaultBatchSize = 10
  23. defaultPollingScheduler = "round_robin"
  24. defaultSchedulerEntryFrequencyMinInterval = 5
  25. defaultSchedulerEntryFrequencyMaxInterval = 24 * 60
  26. defaultRunMigrations = false
  27. defaultDatabaseURL = "user=postgres password=postgres dbname=miniflux2 sslmode=disable"
  28. defaultDatabaseMaxConns = 20
  29. defaultDatabaseMinConns = 1
  30. defaultListenAddr = "127.0.0.1:8080"
  31. defaultCertFile = ""
  32. defaultKeyFile = ""
  33. defaultCertDomain = ""
  34. defaultCertCache = "/tmp/cert_cache"
  35. defaultCleanupFrequencyHours = 24
  36. defaultCleanupArchiveReadDays = 60
  37. defaultCleanupArchiveUnreadDays = 180
  38. defaultCleanupRemoveSessionsDays = 30
  39. defaultProxyImages = "http-only"
  40. defaultCreateAdmin = false
  41. defaultAdminUsername = ""
  42. defaultAdminPassword = ""
  43. defaultOAuth2UserCreation = false
  44. defaultOAuth2ClientID = ""
  45. defaultOAuth2ClientSecret = ""
  46. defaultOAuth2RedirectURL = ""
  47. defaultOAuth2OidcDiscoveryEndpoint = ""
  48. defaultOAuth2Provider = ""
  49. defaultPocketConsumerKey = ""
  50. defaultHTTPClientTimeout = 20
  51. defaultHTTPClientMaxBodySize = 15
  52. defaultHTTPClientProxy = ""
  53. defaultAuthProxyHeader = ""
  54. defaultAuthProxyUserCreation = false
  55. defaultMaintenanceMode = false
  56. defaultMaintenanceMessage = "Miniflux is currently under maintenance"
  57. defaultMetricsCollector = false
  58. defaultMetricsRefreshInterval = 60
  59. defaultMetricsAllowedNetworks = "127.0.0.1/8"
  60. )
  61. var defaultHTTPClientUserAgent = "Mozilla/5.0 (compatible; Miniflux/" + version.Version + "; +https://miniflux.app)"
  62. // Options contains configuration options.
  63. type Options struct {
  64. HTTPS bool
  65. logDateTime bool
  66. hsts bool
  67. httpService bool
  68. schedulerService bool
  69. debug bool
  70. baseURL string
  71. rootURL string
  72. basePath string
  73. databaseURL string
  74. databaseMaxConns int
  75. databaseMinConns int
  76. runMigrations bool
  77. listenAddr string
  78. certFile string
  79. certDomain string
  80. certCache string
  81. certKeyFile string
  82. cleanupFrequencyHours int
  83. cleanupArchiveReadDays int
  84. cleanupArchiveUnreadDays int
  85. cleanupRemoveSessionsDays int
  86. pollingFrequency int
  87. batchSize int
  88. pollingScheduler string
  89. schedulerEntryFrequencyMinInterval int
  90. schedulerEntryFrequencyMaxInterval int
  91. workerPoolSize int
  92. createAdmin bool
  93. adminUsername string
  94. adminPassword string
  95. proxyImages string
  96. oauth2UserCreationAllowed bool
  97. oauth2ClientID string
  98. oauth2ClientSecret string
  99. oauth2RedirectURL string
  100. oauth2OidcDiscoveryEndpoint string
  101. oauth2Provider string
  102. pocketConsumerKey string
  103. httpClientTimeout int
  104. httpClientMaxBodySize int64
  105. httpClientProxy string
  106. httpClientUserAgent string
  107. authProxyHeader string
  108. authProxyUserCreation bool
  109. maintenanceMode bool
  110. maintenanceMessage string
  111. metricsCollector bool
  112. metricsRefreshInterval int
  113. metricsAllowedNetworks []string
  114. }
  115. // NewOptions returns Options with default values.
  116. func NewOptions() *Options {
  117. return &Options{
  118. HTTPS: defaultHTTPS,
  119. logDateTime: defaultLogDateTime,
  120. hsts: defaultHSTS,
  121. httpService: defaultHTTPService,
  122. schedulerService: defaultSchedulerService,
  123. debug: defaultDebug,
  124. baseURL: defaultBaseURL,
  125. rootURL: defaultRootURL,
  126. basePath: defaultBasePath,
  127. databaseURL: defaultDatabaseURL,
  128. databaseMaxConns: defaultDatabaseMaxConns,
  129. databaseMinConns: defaultDatabaseMinConns,
  130. runMigrations: defaultRunMigrations,
  131. listenAddr: defaultListenAddr,
  132. certFile: defaultCertFile,
  133. certDomain: defaultCertDomain,
  134. certCache: defaultCertCache,
  135. certKeyFile: defaultKeyFile,
  136. cleanupFrequencyHours: defaultCleanupFrequencyHours,
  137. cleanupArchiveReadDays: defaultCleanupArchiveReadDays,
  138. cleanupArchiveUnreadDays: defaultCleanupArchiveUnreadDays,
  139. cleanupRemoveSessionsDays: defaultCleanupRemoveSessionsDays,
  140. pollingFrequency: defaultPollingFrequency,
  141. batchSize: defaultBatchSize,
  142. pollingScheduler: defaultPollingScheduler,
  143. schedulerEntryFrequencyMinInterval: defaultSchedulerEntryFrequencyMinInterval,
  144. schedulerEntryFrequencyMaxInterval: defaultSchedulerEntryFrequencyMaxInterval,
  145. workerPoolSize: defaultWorkerPoolSize,
  146. createAdmin: defaultCreateAdmin,
  147. proxyImages: defaultProxyImages,
  148. oauth2UserCreationAllowed: defaultOAuth2UserCreation,
  149. oauth2ClientID: defaultOAuth2ClientID,
  150. oauth2ClientSecret: defaultOAuth2ClientSecret,
  151. oauth2RedirectURL: defaultOAuth2RedirectURL,
  152. oauth2OidcDiscoveryEndpoint: defaultOAuth2OidcDiscoveryEndpoint,
  153. oauth2Provider: defaultOAuth2Provider,
  154. pocketConsumerKey: defaultPocketConsumerKey,
  155. httpClientTimeout: defaultHTTPClientTimeout,
  156. httpClientMaxBodySize: defaultHTTPClientMaxBodySize * 1024 * 1024,
  157. httpClientProxy: defaultHTTPClientProxy,
  158. httpClientUserAgent: defaultHTTPClientUserAgent,
  159. authProxyHeader: defaultAuthProxyHeader,
  160. authProxyUserCreation: defaultAuthProxyUserCreation,
  161. maintenanceMode: defaultMaintenanceMode,
  162. maintenanceMessage: defaultMaintenanceMessage,
  163. metricsCollector: defaultMetricsCollector,
  164. metricsRefreshInterval: defaultMetricsRefreshInterval,
  165. metricsAllowedNetworks: []string{defaultMetricsAllowedNetworks},
  166. }
  167. }
  168. // LogDateTime returns true if the date/time should be displayed in log messages.
  169. func (o *Options) LogDateTime() bool {
  170. return o.logDateTime
  171. }
  172. // HasMaintenanceMode returns true if maintenance mode is enabled.
  173. func (o *Options) HasMaintenanceMode() bool {
  174. return o.maintenanceMode
  175. }
  176. // MaintenanceMessage returns maintenance message.
  177. func (o *Options) MaintenanceMessage() string {
  178. return o.maintenanceMessage
  179. }
  180. // HasDebugMode returns true if debug mode is enabled.
  181. func (o *Options) HasDebugMode() bool {
  182. return o.debug
  183. }
  184. // BaseURL returns the application base URL with path.
  185. func (o *Options) BaseURL() string {
  186. return o.baseURL
  187. }
  188. // RootURL returns the base URL without path.
  189. func (o *Options) RootURL() string {
  190. return o.rootURL
  191. }
  192. // BasePath returns the application base path according to the base URL.
  193. func (o *Options) BasePath() string {
  194. return o.basePath
  195. }
  196. // IsDefaultDatabaseURL returns true if the default database URL is used.
  197. func (o *Options) IsDefaultDatabaseURL() bool {
  198. return o.databaseURL == defaultDatabaseURL
  199. }
  200. // DatabaseURL returns the database URL.
  201. func (o *Options) DatabaseURL() string {
  202. return o.databaseURL
  203. }
  204. // DatabaseMaxConns returns the maximum number of database connections.
  205. func (o *Options) DatabaseMaxConns() int {
  206. return o.databaseMaxConns
  207. }
  208. // DatabaseMinConns returns the minimum number of database connections.
  209. func (o *Options) DatabaseMinConns() int {
  210. return o.databaseMinConns
  211. }
  212. // ListenAddr returns the listen address for the HTTP server.
  213. func (o *Options) ListenAddr() string {
  214. return o.listenAddr
  215. }
  216. // CertFile returns the SSL certificate filename if any.
  217. func (o *Options) CertFile() string {
  218. return o.certFile
  219. }
  220. // CertKeyFile returns the private key filename for custom SSL certificate.
  221. func (o *Options) CertKeyFile() string {
  222. return o.certKeyFile
  223. }
  224. // CertDomain returns the domain to use for Let's Encrypt certificate.
  225. func (o *Options) CertDomain() string {
  226. return o.certDomain
  227. }
  228. // CertCache returns the directory to use for Let's Encrypt session cache.
  229. func (o *Options) CertCache() string {
  230. return o.certCache
  231. }
  232. // CleanupFrequencyHours returns the interval in hours for cleanup jobs.
  233. func (o *Options) CleanupFrequencyHours() int {
  234. return o.cleanupFrequencyHours
  235. }
  236. // CleanupArchiveReadDays returns the number of days after which marking read items as removed.
  237. func (o *Options) CleanupArchiveReadDays() int {
  238. return o.cleanupArchiveReadDays
  239. }
  240. // CleanupArchiveUnreadDays returns the number of days after which marking unread items as removed.
  241. func (o *Options) CleanupArchiveUnreadDays() int {
  242. return o.cleanupArchiveUnreadDays
  243. }
  244. // CleanupRemoveSessionsDays returns the number of days after which to remove sessions.
  245. func (o *Options) CleanupRemoveSessionsDays() int {
  246. return o.cleanupRemoveSessionsDays
  247. }
  248. // WorkerPoolSize returns the number of background worker.
  249. func (o *Options) WorkerPoolSize() int {
  250. return o.workerPoolSize
  251. }
  252. // PollingFrequency returns the interval to refresh feeds in the background.
  253. func (o *Options) PollingFrequency() int {
  254. return o.pollingFrequency
  255. }
  256. // BatchSize returns the number of feeds to send for background processing.
  257. func (o *Options) BatchSize() int {
  258. return o.batchSize
  259. }
  260. // PollingScheduler returns the scheduler used for polling feeds.
  261. func (o *Options) PollingScheduler() string {
  262. return o.pollingScheduler
  263. }
  264. // SchedulerEntryFrequencyMaxInterval returns the maximum interval in minutes for the entry frequency scheduler.
  265. func (o *Options) SchedulerEntryFrequencyMaxInterval() int {
  266. return o.schedulerEntryFrequencyMaxInterval
  267. }
  268. // SchedulerEntryFrequencyMinInterval returns the minimum interval in minutes for the entry frequency scheduler.
  269. func (o *Options) SchedulerEntryFrequencyMinInterval() int {
  270. return o.schedulerEntryFrequencyMinInterval
  271. }
  272. // IsOAuth2UserCreationAllowed returns true if user creation is allowed for OAuth2 users.
  273. func (o *Options) IsOAuth2UserCreationAllowed() bool {
  274. return o.oauth2UserCreationAllowed
  275. }
  276. // OAuth2ClientID returns the OAuth2 Client ID.
  277. func (o *Options) OAuth2ClientID() string {
  278. return o.oauth2ClientID
  279. }
  280. // OAuth2ClientSecret returns the OAuth2 client secret.
  281. func (o *Options) OAuth2ClientSecret() string {
  282. return o.oauth2ClientSecret
  283. }
  284. // OAuth2RedirectURL returns the OAuth2 redirect URL.
  285. func (o *Options) OAuth2RedirectURL() string {
  286. return o.oauth2RedirectURL
  287. }
  288. // OAuth2OidcDiscoveryEndpoint returns the OAuth2 OIDC discovery endpoint.
  289. func (o *Options) OAuth2OidcDiscoveryEndpoint() string {
  290. return o.oauth2OidcDiscoveryEndpoint
  291. }
  292. // OAuth2Provider returns the name of the OAuth2 provider configured.
  293. func (o *Options) OAuth2Provider() string {
  294. return o.oauth2Provider
  295. }
  296. // HasHSTS returns true if HTTP Strict Transport Security is enabled.
  297. func (o *Options) HasHSTS() bool {
  298. return o.hsts
  299. }
  300. // RunMigrations returns true if the environment variable RUN_MIGRATIONS is not empty.
  301. func (o *Options) RunMigrations() bool {
  302. return o.runMigrations
  303. }
  304. // CreateAdmin returns true if the environment variable CREATE_ADMIN is not empty.
  305. func (o *Options) CreateAdmin() bool {
  306. return o.createAdmin
  307. }
  308. // AdminUsername returns the admin username if defined.
  309. func (o *Options) AdminUsername() string {
  310. return o.adminUsername
  311. }
  312. // AdminPassword returns the admin password if defined.
  313. func (o *Options) AdminPassword() string {
  314. return o.adminPassword
  315. }
  316. // ProxyImages returns "none" to never proxy, "http-only" to proxy non-HTTPS, "all" to always proxy.
  317. func (o *Options) ProxyImages() string {
  318. return o.proxyImages
  319. }
  320. // HasHTTPService returns true if the HTTP service is enabled.
  321. func (o *Options) HasHTTPService() bool {
  322. return o.httpService
  323. }
  324. // HasSchedulerService returns true if the scheduler service is enabled.
  325. func (o *Options) HasSchedulerService() bool {
  326. return o.schedulerService
  327. }
  328. // PocketConsumerKey returns the Pocket Consumer Key if configured.
  329. func (o *Options) PocketConsumerKey(defaultValue string) string {
  330. if o.pocketConsumerKey != "" {
  331. return o.pocketConsumerKey
  332. }
  333. return defaultValue
  334. }
  335. // HTTPClientTimeout returns the time limit in seconds before the HTTP client cancel the request.
  336. func (o *Options) HTTPClientTimeout() int {
  337. return o.httpClientTimeout
  338. }
  339. // HTTPClientMaxBodySize returns the number of bytes allowed for the HTTP client to transfer.
  340. func (o *Options) HTTPClientMaxBodySize() int64 {
  341. return o.httpClientMaxBodySize
  342. }
  343. // HTTPClientProxy returns the proxy URL for HTTP client.
  344. func (o *Options) HTTPClientProxy() string {
  345. return o.httpClientProxy
  346. }
  347. // HasHTTPClientProxyConfigured returns true if the HTTP proxy is configured.
  348. func (o *Options) HasHTTPClientProxyConfigured() bool {
  349. return o.httpClientProxy != ""
  350. }
  351. // AuthProxyHeader returns an HTTP header name that contains username for
  352. // authentication using auth proxy.
  353. func (o *Options) AuthProxyHeader() string {
  354. return o.authProxyHeader
  355. }
  356. // IsAuthProxyUserCreationAllowed returns true if user creation is allowed for
  357. // users authenticated using auth proxy.
  358. func (o *Options) IsAuthProxyUserCreationAllowed() bool {
  359. return o.authProxyUserCreation
  360. }
  361. // HasMetricsCollector returns true if metrics collection is enabled.
  362. func (o *Options) HasMetricsCollector() bool {
  363. return o.metricsCollector
  364. }
  365. // MetricsRefreshInterval returns the refresh interval in seconds.
  366. func (o *Options) MetricsRefreshInterval() int {
  367. return o.metricsRefreshInterval
  368. }
  369. // MetricsAllowedNetworks returns the list of networks allowed to connect to the metrics endpoint.
  370. func (o *Options) MetricsAllowedNetworks() []string {
  371. return o.metricsAllowedNetworks
  372. }
  373. // HTTPClientUserAgent returns the global User-Agent header for miniflux.
  374. func (o *Options) HTTPClientUserAgent() string {
  375. return o.httpClientUserAgent
  376. }
  377. func (o *Options) String() string {
  378. var builder strings.Builder
  379. builder.WriteString(fmt.Sprintf("LOG_DATE_TIME: %v\n", o.logDateTime))
  380. builder.WriteString(fmt.Sprintf("DEBUG: %v\n", o.debug))
  381. builder.WriteString(fmt.Sprintf("HTTP_SERVICE: %v\n", o.httpService))
  382. builder.WriteString(fmt.Sprintf("SCHEDULER_SERVICE: %v\n", o.schedulerService))
  383. builder.WriteString(fmt.Sprintf("HTTPS: %v\n", o.HTTPS))
  384. builder.WriteString(fmt.Sprintf("HSTS: %v\n", o.hsts))
  385. builder.WriteString(fmt.Sprintf("BASE_URL: %v\n", o.baseURL))
  386. builder.WriteString(fmt.Sprintf("ROOT_URL: %v\n", o.rootURL))
  387. builder.WriteString(fmt.Sprintf("BASE_PATH: %v\n", o.basePath))
  388. builder.WriteString(fmt.Sprintf("LISTEN_ADDR: %v\n", o.listenAddr))
  389. builder.WriteString(fmt.Sprintf("DATABASE_URL: %v\n", o.databaseURL))
  390. builder.WriteString(fmt.Sprintf("DATABASE_MAX_CONNS: %v\n", o.databaseMaxConns))
  391. builder.WriteString(fmt.Sprintf("DATABASE_MIN_CONNS: %v\n", o.databaseMinConns))
  392. builder.WriteString(fmt.Sprintf("RUN_MIGRATIONS: %v\n", o.runMigrations))
  393. builder.WriteString(fmt.Sprintf("CERT_FILE: %v\n", o.certFile))
  394. builder.WriteString(fmt.Sprintf("KEY_FILE: %v\n", o.certKeyFile))
  395. builder.WriteString(fmt.Sprintf("CERT_DOMAIN: %v\n", o.certDomain))
  396. builder.WriteString(fmt.Sprintf("CERT_CACHE: %v\n", o.certCache))
  397. builder.WriteString(fmt.Sprintf("CLEANUP_FREQUENCY_HOURS: %v\n", o.cleanupFrequencyHours))
  398. builder.WriteString(fmt.Sprintf("CLEANUP_ARCHIVE_READ_DAYS: %v\n", o.cleanupArchiveReadDays))
  399. builder.WriteString(fmt.Sprintf("CLEANUP_ARCHIVE_UNREAD_DAYS: %v\n", o.cleanupArchiveUnreadDays))
  400. builder.WriteString(fmt.Sprintf("CLEANUP_REMOVE_SESSIONS_DAYS: %v\n", o.cleanupRemoveSessionsDays))
  401. builder.WriteString(fmt.Sprintf("WORKER_POOL_SIZE: %v\n", o.workerPoolSize))
  402. builder.WriteString(fmt.Sprintf("POLLING_FREQUENCY: %v\n", o.pollingFrequency))
  403. builder.WriteString(fmt.Sprintf("BATCH_SIZE: %v\n", o.batchSize))
  404. builder.WriteString(fmt.Sprintf("POLLING_SCHEDULER: %v\n", o.pollingScheduler))
  405. builder.WriteString(fmt.Sprintf("SCHEDULER_ENTRY_FREQUENCY_MAX_INTERVAL: %v\n", o.schedulerEntryFrequencyMaxInterval))
  406. builder.WriteString(fmt.Sprintf("SCHEDULER_ENTRY_FREQUENCY_MIN_INTERVAL: %v\n", o.schedulerEntryFrequencyMinInterval))
  407. builder.WriteString(fmt.Sprintf("PROXY_IMAGES: %v\n", o.proxyImages))
  408. builder.WriteString(fmt.Sprintf("CREATE_ADMIN: %v\n", o.createAdmin))
  409. builder.WriteString(fmt.Sprintf("ADMIN_USERNAME: %v\n", o.adminUsername))
  410. builder.WriteString(fmt.Sprintf("ADMIN_PASSWORD: %v\n", o.adminPassword))
  411. builder.WriteString(fmt.Sprintf("POCKET_CONSUMER_KEY: %v\n", o.pocketConsumerKey))
  412. builder.WriteString(fmt.Sprintf("OAUTH2_USER_CREATION: %v\n", o.oauth2UserCreationAllowed))
  413. builder.WriteString(fmt.Sprintf("OAUTH2_CLIENT_ID: %v\n", o.oauth2ClientID))
  414. builder.WriteString(fmt.Sprintf("OAUTH2_CLIENT_SECRET: %v\n", o.oauth2ClientSecret))
  415. builder.WriteString(fmt.Sprintf("OAUTH2_REDIRECT_URL: %v\n", o.oauth2RedirectURL))
  416. builder.WriteString(fmt.Sprintf("OAUTH2_OIDC_DISCOVERY_ENDPOINT: %v\n", o.oauth2OidcDiscoveryEndpoint))
  417. builder.WriteString(fmt.Sprintf("OAUTH2_PROVIDER: %v\n", o.oauth2Provider))
  418. builder.WriteString(fmt.Sprintf("HTTP_CLIENT_TIMEOUT: %v\n", o.httpClientTimeout))
  419. builder.WriteString(fmt.Sprintf("HTTP_CLIENT_MAX_BODY_SIZE: %v\n", o.httpClientMaxBodySize))
  420. builder.WriteString(fmt.Sprintf("HTTP_CLIENT_PROXY: %v\n", o.httpClientProxy))
  421. builder.WriteString(fmt.Sprintf("HTTP_CLIENT_USER_AGENT: %v\n", o.httpClientUserAgent))
  422. builder.WriteString(fmt.Sprintf("AUTH_PROXY_HEADER: %v\n", o.authProxyHeader))
  423. builder.WriteString(fmt.Sprintf("AUTH_PROXY_USER_CREATION: %v\n", o.authProxyUserCreation))
  424. builder.WriteString(fmt.Sprintf("MAINTENANCE_MODE: %v\n", o.maintenanceMode))
  425. builder.WriteString(fmt.Sprintf("MAINTENANCE_MESSAGE: %v\n", o.maintenanceMessage))
  426. builder.WriteString(fmt.Sprintf("METRICS_COLLECTOR: %v\n", o.metricsCollector))
  427. builder.WriteString(fmt.Sprintf("METRICS_REFRESH_INTERVAL: %v\n", o.metricsRefreshInterval))
  428. builder.WriteString(fmt.Sprintf("METRICS_ALLOWED_NETWORKS: %v\n", o.metricsAllowedNetworks))
  429. return builder.String()
  430. }