config.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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. DefaultStripePriceCacheDuration = 3 * time.Hour // Time to keep Stripe prices cached in memory before a refresh is needed
  21. )
  22. // Defines all global and per-visitor limits
  23. // - message size limit: the max number of bytes for a message
  24. // - total topic limit: max number of topics overall
  25. // - various attachment limits
  26. const (
  27. DefaultMessageLengthLimit = 4096 // Bytes
  28. DefaultTotalTopicLimit = 15000
  29. DefaultAttachmentTotalSizeLimit = int64(5 * 1024 * 1024 * 1024) // 5 GB
  30. DefaultAttachmentFileSizeLimit = int64(15 * 1024 * 1024) // 15 MB
  31. DefaultAttachmentExpiryDuration = 3 * time.Hour
  32. )
  33. // Defines all per-visitor limits
  34. // - per visitor subscription limit: max number of subscriptions (active HTTP connections) per per-visitor/IP
  35. // - per visitor request limit: max number of PUT/GET/.. requests (here: 60 requests bucket, replenished at a rate of one per 5 seconds)
  36. // - per visitor email limit: max number of emails (here: 16 email bucket, replenished at a rate of one per hour)
  37. // - per visitor attachment size limit: total per-visitor attachment size in bytes to be stored on the server
  38. // - per visitor attachment daily bandwidth limit: number of bytes that can be transferred to/from the server
  39. const (
  40. DefaultVisitorSubscriptionLimit = 30
  41. DefaultVisitorRequestLimitBurst = 60
  42. DefaultVisitorRequestLimitReplenish = 5 * time.Second
  43. DefaultVisitorMessageDailyLimit = 0
  44. DefaultVisitorEmailLimitBurst = 16
  45. DefaultVisitorEmailLimitReplenish = time.Hour
  46. DefaultVisitorAccountCreationLimitBurst = 3
  47. DefaultVisitorAccountCreationLimitReplenish = 24 * time.Hour
  48. DefaultVisitorAuthFailureLimitBurst = 10
  49. DefaultVisitorAuthFailureLimitReplenish = time.Minute
  50. DefaultVisitorAttachmentTotalSizeLimit = 100 * 1024 * 1024 // 100 MB
  51. DefaultVisitorAttachmentDailyBandwidthLimit = 500 * 1024 * 1024 // 500 MB
  52. )
  53. var (
  54. // DefaultVisitorStatsResetTime defines the time at which visitor stats are reset (wall clock only)
  55. DefaultVisitorStatsResetTime = time.Date(0, 0, 0, 0, 0, 0, 0, time.UTC)
  56. )
  57. // Config is the main config struct for the application. Use New to instantiate a default config struct.
  58. type Config struct {
  59. File string // Config file, only used for testing
  60. BaseURL string
  61. ListenHTTP string
  62. ListenHTTPS string
  63. ListenUnix string
  64. ListenUnixMode fs.FileMode
  65. KeyFile string
  66. CertFile string
  67. FirebaseKeyFile string
  68. CacheFile string
  69. CacheDuration time.Duration
  70. CacheStartupQueries string
  71. CacheBatchSize int
  72. CacheBatchTimeout time.Duration
  73. AuthFile string
  74. AuthStartupQueries string
  75. AuthDefault user.Permission
  76. AuthBcryptCost int
  77. AuthStatsQueueWriterInterval time.Duration
  78. AttachmentCacheDir string
  79. AttachmentTotalSizeLimit int64
  80. AttachmentFileSizeLimit int64
  81. AttachmentExpiryDuration time.Duration
  82. KeepaliveInterval time.Duration
  83. ManagerInterval time.Duration
  84. WebRootIsApp bool
  85. DelayedSenderInterval time.Duration
  86. FirebaseKeepaliveInterval time.Duration
  87. FirebasePollInterval time.Duration
  88. FirebaseQuotaExceededPenaltyDuration time.Duration
  89. UpstreamBaseURL string
  90. SMTPSenderAddr string
  91. SMTPSenderUser string
  92. SMTPSenderPass string
  93. SMTPSenderFrom string
  94. SMTPServerListen string
  95. SMTPServerDomain string
  96. SMTPServerAddrPrefix string
  97. MessageLimit int
  98. MinDelay time.Duration
  99. MaxDelay time.Duration
  100. TotalTopicLimit int
  101. TotalAttachmentSizeLimit int64
  102. VisitorSubscriptionLimit int
  103. VisitorAttachmentTotalSizeLimit int64
  104. VisitorAttachmentDailyBandwidthLimit int64
  105. VisitorRequestLimitBurst int
  106. VisitorRequestLimitReplenish time.Duration
  107. VisitorRequestExemptIPAddrs []netip.Prefix
  108. VisitorMessageDailyLimit int
  109. VisitorEmailLimitBurst int
  110. VisitorEmailLimitReplenish time.Duration
  111. VisitorAccountCreationLimitBurst int
  112. VisitorAccountCreationLimitReplenish time.Duration
  113. VisitorAuthFailureLimitBurst int
  114. VisitorAuthFailureLimitReplenish time.Duration
  115. VisitorStatsResetTime time.Time // Time of the day at which to reset visitor stats
  116. BehindProxy bool
  117. StripeSecretKey string
  118. StripeWebhookKey string
  119. StripePriceCacheDuration time.Duration
  120. EnableWeb bool
  121. EnableSignup bool // Enable creation of accounts via API and UI
  122. EnableLogin bool
  123. EnableReservations bool // Allow users with role "user" to own/reserve topics
  124. AccessControlAllowOrigin string // CORS header field to restrict access from web clients
  125. Version string // injected by App
  126. }
  127. // NewConfig instantiates a default new server config
  128. func NewConfig() *Config {
  129. return &Config{
  130. File: "", // Only used for testing
  131. BaseURL: "",
  132. ListenHTTP: DefaultListenHTTP,
  133. ListenHTTPS: "",
  134. ListenUnix: "",
  135. ListenUnixMode: 0,
  136. KeyFile: "",
  137. CertFile: "",
  138. FirebaseKeyFile: "",
  139. CacheFile: "",
  140. CacheDuration: DefaultCacheDuration,
  141. CacheStartupQueries: "",
  142. CacheBatchSize: 0,
  143. CacheBatchTimeout: 0,
  144. AuthFile: "",
  145. AuthStartupQueries: "",
  146. AuthDefault: user.PermissionReadWrite,
  147. AuthBcryptCost: user.DefaultUserPasswordBcryptCost,
  148. AuthStatsQueueWriterInterval: user.DefaultUserStatsQueueWriterInterval,
  149. AttachmentCacheDir: "",
  150. AttachmentTotalSizeLimit: DefaultAttachmentTotalSizeLimit,
  151. AttachmentFileSizeLimit: DefaultAttachmentFileSizeLimit,
  152. AttachmentExpiryDuration: DefaultAttachmentExpiryDuration,
  153. KeepaliveInterval: DefaultKeepaliveInterval,
  154. ManagerInterval: DefaultManagerInterval,
  155. WebRootIsApp: false,
  156. DelayedSenderInterval: DefaultDelayedSenderInterval,
  157. FirebaseKeepaliveInterval: DefaultFirebaseKeepaliveInterval,
  158. FirebasePollInterval: DefaultFirebasePollInterval,
  159. FirebaseQuotaExceededPenaltyDuration: DefaultFirebaseQuotaExceededPenaltyDuration,
  160. UpstreamBaseURL: "",
  161. SMTPSenderAddr: "",
  162. SMTPSenderUser: "",
  163. SMTPSenderPass: "",
  164. SMTPSenderFrom: "",
  165. SMTPServerListen: "",
  166. SMTPServerDomain: "",
  167. SMTPServerAddrPrefix: "",
  168. MessageLimit: DefaultMessageLengthLimit,
  169. MinDelay: DefaultMinDelay,
  170. MaxDelay: DefaultMaxDelay,
  171. TotalTopicLimit: DefaultTotalTopicLimit,
  172. TotalAttachmentSizeLimit: 0,
  173. VisitorSubscriptionLimit: DefaultVisitorSubscriptionLimit,
  174. VisitorAttachmentTotalSizeLimit: DefaultVisitorAttachmentTotalSizeLimit,
  175. VisitorAttachmentDailyBandwidthLimit: DefaultVisitorAttachmentDailyBandwidthLimit,
  176. VisitorRequestLimitBurst: DefaultVisitorRequestLimitBurst,
  177. VisitorRequestLimitReplenish: DefaultVisitorRequestLimitReplenish,
  178. VisitorRequestExemptIPAddrs: make([]netip.Prefix, 0),
  179. VisitorMessageDailyLimit: DefaultVisitorMessageDailyLimit,
  180. VisitorEmailLimitBurst: DefaultVisitorEmailLimitBurst,
  181. VisitorEmailLimitReplenish: DefaultVisitorEmailLimitReplenish,
  182. VisitorAccountCreationLimitBurst: DefaultVisitorAccountCreationLimitBurst,
  183. VisitorAccountCreationLimitReplenish: DefaultVisitorAccountCreationLimitReplenish,
  184. VisitorAuthFailureLimitBurst: DefaultVisitorAuthFailureLimitBurst,
  185. VisitorAuthFailureLimitReplenish: DefaultVisitorAuthFailureLimitReplenish,
  186. VisitorStatsResetTime: DefaultVisitorStatsResetTime,
  187. BehindProxy: false,
  188. StripeSecretKey: "",
  189. StripeWebhookKey: "",
  190. StripePriceCacheDuration: DefaultStripePriceCacheDuration,
  191. EnableWeb: true,
  192. EnableSignup: false,
  193. EnableLogin: false,
  194. EnableReservations: false,
  195. AccessControlAllowOrigin: "*",
  196. Version: "",
  197. }
  198. }