parser.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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. "errors"
  7. "fmt"
  8. "net/url"
  9. "os"
  10. "strconv"
  11. "strings"
  12. )
  13. func parse() (opts *Options, err error) {
  14. opts = &Options{}
  15. opts.baseURL, opts.rootURL, opts.basePath, err = parseBaseURL()
  16. if err != nil {
  17. return nil, err
  18. }
  19. opts.debug = getBooleanValue("DEBUG")
  20. opts.listenAddr = parseListenAddr()
  21. opts.databaseURL = getStringValue("DATABASE_URL", defaultDatabaseURL)
  22. opts.databaseMaxConns = getIntValue("DATABASE_MAX_CONNS", defaultDatabaseMaxConns)
  23. opts.databaseMinConns = getIntValue("DATABASE_MIN_CONNS", defaultDatabaseMinConns)
  24. opts.runMigrations = getBooleanValue("RUN_MIGRATIONS")
  25. opts.hsts = !getBooleanValue("DISABLE_HSTS")
  26. opts.HTTPS = getBooleanValue("HTTPS")
  27. opts.schedulerService = !getBooleanValue("DISABLE_SCHEDULER_SERVICE")
  28. opts.httpService = !getBooleanValue("DISABLE_HTTP_SERVICE")
  29. opts.certFile = getStringValue("CERT_FILE", defaultCertFile)
  30. opts.certKeyFile = getStringValue("KEY_FILE", defaultKeyFile)
  31. opts.certDomain = getStringValue("CERT_DOMAIN", defaultCertDomain)
  32. opts.certCache = getStringValue("CERT_CACHE", defaultCertCache)
  33. opts.cleanupFrequency = getIntValue("CLEANUP_FREQUENCY", defaultCleanupFrequency)
  34. opts.workerPoolSize = getIntValue("WORKER_POOL_SIZE", defaultWorkerPoolSize)
  35. opts.pollingFrequency = getIntValue("POLLING_FREQUENCY", defaultPollingFrequency)
  36. opts.batchSize = getIntValue("BATCH_SIZE", defaultBatchSize)
  37. opts.archiveReadDays = getIntValue("ARCHIVE_READ_DAYS", defaultArchiveReadDays)
  38. opts.proxyImages = getStringValue("PROXY_IMAGES", defaultProxyImages)
  39. opts.createAdmin = getBooleanValue("CREATE_ADMIN")
  40. opts.pocketConsumerKey = getStringValue("POCKET_CONSUMER_KEY", "")
  41. opts.oauth2UserCreationAllowed = getBooleanValue("OAUTH2_USER_CREATION")
  42. opts.oauth2ClientID = getStringValue("OAUTH2_CLIENT_ID", defaultOAuth2ClientID)
  43. opts.oauth2ClientSecret = getStringValue("OAUTH2_CLIENT_SECRET", defaultOAuth2ClientSecret)
  44. opts.oauth2RedirectURL = getStringValue("OAUTH2_REDIRECT_URL", defaultOAuth2RedirectURL)
  45. opts.oauth2Provider = getStringValue("OAUTH2_PROVIDER", defaultOAuth2Provider)
  46. opts.httpClientTimeout = getIntValue("HTTP_CLIENT_TIMEOUT", defaultHTTPClientTimeout)
  47. opts.httpClientMaxBodySize = int64(getIntValue("HTTP_CLIENT_MAX_BODY_SIZE", defaultHTTPClientMaxBodySize) * 1024 * 1024)
  48. return opts, nil
  49. }
  50. func parseBaseURL() (string, string, string, error) {
  51. baseURL := os.Getenv("BASE_URL")
  52. if baseURL == "" {
  53. return defaultBaseURL, defaultBaseURL, "", nil
  54. }
  55. if baseURL[len(baseURL)-1:] == "/" {
  56. baseURL = baseURL[:len(baseURL)-1]
  57. }
  58. u, err := url.Parse(baseURL)
  59. if err != nil {
  60. return "", "", "", fmt.Errorf("Invalid BASE_URL: %v", err)
  61. }
  62. scheme := strings.ToLower(u.Scheme)
  63. if scheme != "https" && scheme != "http" {
  64. return "", "", "", errors.New("Invalid BASE_URL: scheme must be http or https")
  65. }
  66. basePath := u.Path
  67. u.Path = ""
  68. return baseURL, u.String(), basePath, nil
  69. }
  70. func parseListenAddr() string {
  71. if port := os.Getenv("PORT"); port != "" {
  72. return ":" + port
  73. }
  74. return getStringValue("LISTEN_ADDR", defaultListenAddr)
  75. }
  76. func getBooleanValue(key string) bool {
  77. value := strings.ToLower(os.Getenv(key))
  78. if value == "1" || value == "yes" || value == "true" || value == "on" {
  79. return true
  80. }
  81. return false
  82. }
  83. func getStringValue(key, fallback string) string {
  84. value := os.Getenv(key)
  85. if value == "" {
  86. return fallback
  87. }
  88. return value
  89. }
  90. func getIntValue(key string, fallback int) int {
  91. value := os.Getenv(key)
  92. if value == "" {
  93. return fallback
  94. }
  95. v, err := strconv.Atoi(value)
  96. if err != nil {
  97. return fallback
  98. }
  99. return v
  100. }