config.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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. AuthStartupQueries string
  66. AuthDefault user.Permission
  67. AttachmentCacheDir string
  68. AttachmentTotalSizeLimit int64
  69. AttachmentFileSizeLimit int64
  70. AttachmentExpiryDuration time.Duration
  71. KeepaliveInterval time.Duration
  72. ManagerInterval time.Duration
  73. WebRootIsApp bool
  74. DelayedSenderInterval time.Duration
  75. FirebaseKeepaliveInterval time.Duration
  76. FirebasePollInterval time.Duration
  77. FirebaseQuotaExceededPenaltyDuration time.Duration
  78. UpstreamBaseURL string
  79. SMTPSenderAddr string
  80. SMTPSenderUser string
  81. SMTPSenderPass string
  82. SMTPSenderFrom string
  83. SMTPServerListen string
  84. SMTPServerDomain string
  85. SMTPServerAddrPrefix string
  86. MessageLimit int
  87. MinDelay time.Duration
  88. MaxDelay time.Duration
  89. TotalTopicLimit int
  90. TotalAttachmentSizeLimit int64
  91. VisitorSubscriptionLimit int
  92. VisitorAttachmentTotalSizeLimit int64
  93. VisitorAttachmentDailyBandwidthLimit int
  94. VisitorRequestLimitBurst int
  95. VisitorRequestLimitReplenish time.Duration
  96. VisitorRequestExemptIPAddrs []netip.Prefix
  97. VisitorEmailLimitBurst int
  98. VisitorEmailLimitReplenish time.Duration
  99. VisitorAccountCreateLimitBurst int
  100. VisitorAccountCreateLimitReplenish time.Duration
  101. BehindProxy bool
  102. EnableWeb bool
  103. EnableSignup bool // Enable creation of accounts via API and UI
  104. EnableLogin bool
  105. EnableEmailConfirm bool
  106. EnablePasswordReset bool
  107. EnablePayments bool
  108. EnableReserveTopics bool // Allow users with role "user" to own/reserve topics
  109. Version string // injected by App
  110. }
  111. // NewConfig instantiates a default new server config
  112. func NewConfig() *Config {
  113. return &Config{
  114. BaseURL: "",
  115. ListenHTTP: DefaultListenHTTP,
  116. ListenHTTPS: "",
  117. ListenUnix: "",
  118. ListenUnixMode: 0,
  119. KeyFile: "",
  120. CertFile: "",
  121. FirebaseKeyFile: "",
  122. CacheFile: "",
  123. CacheDuration: DefaultCacheDuration,
  124. CacheBatchSize: 0,
  125. CacheBatchTimeout: 0,
  126. AuthFile: "",
  127. AuthDefault: user.NewPermission(true, true),
  128. AttachmentCacheDir: "",
  129. AttachmentTotalSizeLimit: DefaultAttachmentTotalSizeLimit,
  130. AttachmentFileSizeLimit: DefaultAttachmentFileSizeLimit,
  131. AttachmentExpiryDuration: DefaultAttachmentExpiryDuration,
  132. KeepaliveInterval: DefaultKeepaliveInterval,
  133. ManagerInterval: DefaultManagerInterval,
  134. MessageLimit: DefaultMessageLengthLimit,
  135. MinDelay: DefaultMinDelay,
  136. MaxDelay: DefaultMaxDelay,
  137. DelayedSenderInterval: DefaultDelayedSenderInterval,
  138. FirebaseKeepaliveInterval: DefaultFirebaseKeepaliveInterval,
  139. FirebasePollInterval: DefaultFirebasePollInterval,
  140. FirebaseQuotaExceededPenaltyDuration: DefaultFirebaseQuotaExceededPenaltyDuration,
  141. TotalTopicLimit: DefaultTotalTopicLimit,
  142. VisitorSubscriptionLimit: DefaultVisitorSubscriptionLimit,
  143. VisitorAttachmentTotalSizeLimit: DefaultVisitorAttachmentTotalSizeLimit,
  144. VisitorAttachmentDailyBandwidthLimit: DefaultVisitorAttachmentDailyBandwidthLimit,
  145. VisitorRequestLimitBurst: DefaultVisitorRequestLimitBurst,
  146. VisitorRequestLimitReplenish: DefaultVisitorRequestLimitReplenish,
  147. VisitorRequestExemptIPAddrs: make([]netip.Prefix, 0),
  148. VisitorEmailLimitBurst: DefaultVisitorEmailLimitBurst,
  149. VisitorEmailLimitReplenish: DefaultVisitorEmailLimitReplenish,
  150. VisitorAccountCreateLimitBurst: DefaultVisitorAccountCreateLimitBurst,
  151. VisitorAccountCreateLimitReplenish: DefaultVisitorAccountCreateLimitReplenish,
  152. BehindProxy: false,
  153. EnableWeb: true,
  154. Version: "",
  155. }
  156. }