config.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. package server
  2. import (
  3. "heckel.io/ntfy/user"
  4. "io/fs"
  5. "net/netip"
  6. "time"
  7. )
  8. // Defines default config settings (excluding limits, see below)
  9. const (
  10. DefaultListenHTTP = ":80"
  11. DefaultCacheDuration = 12 * time.Hour
  12. DefaultKeepaliveInterval = 45 * time.Second // Not too frequently to save battery (Android read timeout used to be 77s!)
  13. DefaultManagerInterval = time.Minute
  14. DefaultDelayedSenderInterval = 10 * time.Second
  15. DefaultMinDelay = 10 * time.Second
  16. DefaultMaxDelay = 3 * 24 * time.Hour
  17. DefaultFirebaseKeepaliveInterval = 3 * time.Hour // ~control topic (Android), not too frequently to save battery
  18. DefaultFirebasePollInterval = 20 * time.Minute // ~poll topic (iOS), max. 2-3 times per hour (see docs)
  19. DefaultFirebaseQuotaExceededPenaltyDuration = 10 * time.Minute // Time that over-users are locked out of Firebase if it returns "quota exceeded"
  20. )
  21. // Defines all global and per-visitor limits
  22. // - message size limit: the max number of bytes for a message
  23. // - total topic limit: max number of topics overall
  24. // - various attachment limits
  25. const (
  26. DefaultMessageLengthLimit = 4096 // Bytes
  27. DefaultTotalTopicLimit = 15000
  28. DefaultAttachmentTotalSizeLimit = int64(5 * 1024 * 1024 * 1024) // 5 GB
  29. DefaultAttachmentFileSizeLimit = int64(15 * 1024 * 1024) // 15 MB
  30. DefaultAttachmentExpiryDuration = 3 * time.Hour
  31. )
  32. // Defines all per-visitor limits
  33. // - per visitor subscription limit: max number of subscriptions (active HTTP connections) per per-visitor/IP
  34. // - per visitor request limit: max number of PUT/GET/.. requests (here: 60 requests bucket, replenished at a rate of one per 5 seconds)
  35. // - per visitor email limit: max number of emails (here: 16 email bucket, replenished at a rate of one per hour)
  36. // - per visitor attachment size limit: total per-visitor attachment size in bytes to be stored on the server
  37. // - per visitor attachment daily bandwidth limit: number of bytes that can be transferred to/from the server
  38. const (
  39. DefaultVisitorSubscriptionLimit = 30
  40. DefaultVisitorRequestLimitBurst = 60
  41. DefaultVisitorRequestLimitReplenish = 5 * time.Second
  42. DefaultVisitorEmailLimitBurst = 16
  43. DefaultVisitorEmailLimitReplenish = time.Hour
  44. DefaultVisitorAccountCreateLimitBurst = 3
  45. DefaultVisitorAccountCreateLimitReplenish = 24 * time.Hour
  46. DefaultVisitorAttachmentTotalSizeLimit = 100 * 1024 * 1024 // 100 MB
  47. DefaultVisitorAttachmentDailyBandwidthLimit = 500 * 1024 * 1024 // 500 MB
  48. )
  49. // Config is the main config struct for the application. Use New to instantiate a default config struct.
  50. type Config struct {
  51. BaseURL string
  52. ListenHTTP string
  53. ListenHTTPS string
  54. ListenUnix string
  55. ListenUnixMode fs.FileMode
  56. KeyFile string
  57. CertFile string
  58. FirebaseKeyFile string
  59. CacheFile string
  60. CacheDuration time.Duration
  61. CacheStartupQueries string
  62. CacheBatchSize int
  63. CacheBatchTimeout time.Duration
  64. AuthFile string
  65. AuthDefault user.Permission
  66. AttachmentCacheDir string
  67. AttachmentTotalSizeLimit int64
  68. AttachmentFileSizeLimit int64
  69. AttachmentExpiryDuration time.Duration
  70. KeepaliveInterval time.Duration
  71. ManagerInterval time.Duration
  72. WebRootIsApp bool
  73. DelayedSenderInterval time.Duration
  74. FirebaseKeepaliveInterval time.Duration
  75. FirebasePollInterval time.Duration
  76. FirebaseQuotaExceededPenaltyDuration time.Duration
  77. UpstreamBaseURL string
  78. SMTPSenderAddr string
  79. SMTPSenderUser string
  80. SMTPSenderPass string
  81. SMTPSenderFrom string
  82. SMTPServerListen string
  83. SMTPServerDomain string
  84. SMTPServerAddrPrefix string
  85. MessageLimit int
  86. MinDelay time.Duration
  87. MaxDelay time.Duration
  88. TotalTopicLimit int
  89. TotalAttachmentSizeLimit int64
  90. VisitorSubscriptionLimit int
  91. VisitorAttachmentTotalSizeLimit int64
  92. VisitorAttachmentDailyBandwidthLimit int
  93. VisitorRequestLimitBurst int
  94. VisitorRequestLimitReplenish time.Duration
  95. VisitorRequestExemptIPAddrs []netip.Prefix
  96. VisitorEmailLimitBurst int
  97. VisitorEmailLimitReplenish time.Duration
  98. VisitorAccountCreateLimitBurst int
  99. VisitorAccountCreateLimitReplenish time.Duration
  100. BehindProxy bool
  101. EnableWeb bool
  102. EnableSignup bool
  103. EnableLogin bool
  104. EnableEmailConfirm bool
  105. EnableResetPassword bool
  106. Version string // injected by App
  107. }
  108. // NewConfig instantiates a default new server config
  109. func NewConfig() *Config {
  110. return &Config{
  111. BaseURL: "",
  112. ListenHTTP: DefaultListenHTTP,
  113. ListenHTTPS: "",
  114. ListenUnix: "",
  115. ListenUnixMode: 0,
  116. KeyFile: "",
  117. CertFile: "",
  118. FirebaseKeyFile: "",
  119. CacheFile: "",
  120. CacheDuration: DefaultCacheDuration,
  121. CacheBatchSize: 0,
  122. CacheBatchTimeout: 0,
  123. AuthFile: "",
  124. AuthDefault: user.NewPermission(true, true),
  125. AttachmentCacheDir: "",
  126. AttachmentTotalSizeLimit: DefaultAttachmentTotalSizeLimit,
  127. AttachmentFileSizeLimit: DefaultAttachmentFileSizeLimit,
  128. AttachmentExpiryDuration: DefaultAttachmentExpiryDuration,
  129. KeepaliveInterval: DefaultKeepaliveInterval,
  130. ManagerInterval: DefaultManagerInterval,
  131. MessageLimit: DefaultMessageLengthLimit,
  132. MinDelay: DefaultMinDelay,
  133. MaxDelay: DefaultMaxDelay,
  134. DelayedSenderInterval: DefaultDelayedSenderInterval,
  135. FirebaseKeepaliveInterval: DefaultFirebaseKeepaliveInterval,
  136. FirebasePollInterval: DefaultFirebasePollInterval,
  137. FirebaseQuotaExceededPenaltyDuration: DefaultFirebaseQuotaExceededPenaltyDuration,
  138. TotalTopicLimit: DefaultTotalTopicLimit,
  139. VisitorSubscriptionLimit: DefaultVisitorSubscriptionLimit,
  140. VisitorAttachmentTotalSizeLimit: DefaultVisitorAttachmentTotalSizeLimit,
  141. VisitorAttachmentDailyBandwidthLimit: DefaultVisitorAttachmentDailyBandwidthLimit,
  142. VisitorRequestLimitBurst: DefaultVisitorRequestLimitBurst,
  143. VisitorRequestLimitReplenish: DefaultVisitorRequestLimitReplenish,
  144. VisitorRequestExemptIPAddrs: make([]netip.Prefix, 0),
  145. VisitorEmailLimitBurst: DefaultVisitorEmailLimitBurst,
  146. VisitorEmailLimitReplenish: DefaultVisitorEmailLimitReplenish,
  147. VisitorAccountCreateLimitBurst: DefaultVisitorAccountCreateLimitBurst,
  148. VisitorAccountCreateLimitReplenish: DefaultVisitorAccountCreateLimitReplenish,
  149. BehindProxy: false,
  150. EnableWeb: true,
  151. Version: "",
  152. }
  153. }