options.go 19 KB

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