config.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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 = 30
  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. // DefaultDisallowedTopics defines the topics that are forbidden, because they are used elsewhere. This array can be
  57. // extended using the server.yml config. If updated, also update in Android and web app.
  58. DefaultDisallowedTopics = []string{"docs", "static", "file", "app", "metrics", "account", "settings", "signup", "login", "v1"}
  59. )
  60. // Config is the main config struct for the application. Use New to instantiate a default config struct.
  61. type Config struct {
  62. File string // Config file, only used for testing
  63. BaseURL string
  64. ListenHTTP string
  65. ListenHTTPS string
  66. ListenUnix string
  67. ListenUnixMode fs.FileMode
  68. KeyFile string
  69. CertFile string
  70. FirebaseKeyFile string
  71. CacheFile string
  72. CacheDuration time.Duration
  73. CacheStartupQueries string
  74. CacheBatchSize int
  75. CacheBatchTimeout time.Duration
  76. AuthFile string
  77. AuthStartupQueries string
  78. AuthDefault user.Permission
  79. AuthBcryptCost int
  80. AuthStatsQueueWriterInterval time.Duration
  81. AttachmentCacheDir string
  82. AttachmentTotalSizeLimit int64
  83. AttachmentFileSizeLimit int64
  84. AttachmentExpiryDuration time.Duration
  85. KeepaliveInterval time.Duration
  86. ManagerInterval time.Duration
  87. DisallowedTopics []string
  88. WebRootIsApp bool
  89. DelayedSenderInterval time.Duration
  90. FirebaseKeepaliveInterval time.Duration
  91. FirebasePollInterval time.Duration
  92. FirebaseQuotaExceededPenaltyDuration time.Duration
  93. UpstreamBaseURL string
  94. SMTPSenderAddr string
  95. SMTPSenderUser string
  96. SMTPSenderPass string
  97. SMTPSenderFrom string
  98. SMTPServerListen string
  99. SMTPServerDomain string
  100. SMTPServerAddrPrefix string
  101. MetricsEnable bool
  102. MetricsListenHTTP string
  103. ProfileListenHTTP string
  104. MessageLimit int
  105. MinDelay time.Duration
  106. MaxDelay time.Duration
  107. TotalTopicLimit int
  108. TotalAttachmentSizeLimit int64
  109. VisitorSubscriptionLimit int
  110. VisitorAttachmentTotalSizeLimit int64
  111. VisitorAttachmentDailyBandwidthLimit int64
  112. VisitorRequestLimitBurst int
  113. VisitorRequestLimitReplenish time.Duration
  114. VisitorRequestExemptIPAddrs []netip.Prefix
  115. VisitorMessageDailyLimit int
  116. VisitorEmailLimitBurst int
  117. VisitorEmailLimitReplenish time.Duration
  118. VisitorAccountCreationLimitBurst int
  119. VisitorAccountCreationLimitReplenish time.Duration
  120. VisitorAuthFailureLimitBurst int
  121. VisitorAuthFailureLimitReplenish time.Duration
  122. VisitorStatsResetTime time.Time // Time of the day at which to reset visitor stats
  123. VisitorSubscriberRateLimiting bool // Enable subscriber-based rate limiting for UnifiedPush topics
  124. BehindProxy bool
  125. StripeSecretKey string
  126. StripeWebhookKey string
  127. StripePriceCacheDuration time.Duration
  128. BillingContact string
  129. EnableWeb bool
  130. EnableSignup bool // Enable creation of accounts via API and UI
  131. EnableLogin bool
  132. EnableReservations bool // Allow users with role "user" to own/reserve topics
  133. EnableMetrics bool
  134. AccessControlAllowOrigin string // CORS header field to restrict access from web clients
  135. Version string // injected by App
  136. }
  137. // NewConfig instantiates a default new server config
  138. func NewConfig() *Config {
  139. return &Config{
  140. File: "", // Only used for testing
  141. BaseURL: "",
  142. ListenHTTP: DefaultListenHTTP,
  143. ListenHTTPS: "",
  144. ListenUnix: "",
  145. ListenUnixMode: 0,
  146. KeyFile: "",
  147. CertFile: "",
  148. FirebaseKeyFile: "",
  149. CacheFile: "",
  150. CacheDuration: DefaultCacheDuration,
  151. CacheStartupQueries: "",
  152. CacheBatchSize: 0,
  153. CacheBatchTimeout: 0,
  154. AuthFile: "",
  155. AuthStartupQueries: "",
  156. AuthDefault: user.PermissionReadWrite,
  157. AuthBcryptCost: user.DefaultUserPasswordBcryptCost,
  158. AuthStatsQueueWriterInterval: user.DefaultUserStatsQueueWriterInterval,
  159. AttachmentCacheDir: "",
  160. AttachmentTotalSizeLimit: DefaultAttachmentTotalSizeLimit,
  161. AttachmentFileSizeLimit: DefaultAttachmentFileSizeLimit,
  162. AttachmentExpiryDuration: DefaultAttachmentExpiryDuration,
  163. KeepaliveInterval: DefaultKeepaliveInterval,
  164. ManagerInterval: DefaultManagerInterval,
  165. DisallowedTopics: DefaultDisallowedTopics,
  166. WebRootIsApp: false,
  167. DelayedSenderInterval: DefaultDelayedSenderInterval,
  168. FirebaseKeepaliveInterval: DefaultFirebaseKeepaliveInterval,
  169. FirebasePollInterval: DefaultFirebasePollInterval,
  170. FirebaseQuotaExceededPenaltyDuration: DefaultFirebaseQuotaExceededPenaltyDuration,
  171. UpstreamBaseURL: "",
  172. SMTPSenderAddr: "",
  173. SMTPSenderUser: "",
  174. SMTPSenderPass: "",
  175. SMTPSenderFrom: "",
  176. SMTPServerListen: "",
  177. SMTPServerDomain: "",
  178. SMTPServerAddrPrefix: "",
  179. MessageLimit: DefaultMessageLengthLimit,
  180. MinDelay: DefaultMinDelay,
  181. MaxDelay: DefaultMaxDelay,
  182. TotalTopicLimit: DefaultTotalTopicLimit,
  183. TotalAttachmentSizeLimit: 0,
  184. VisitorSubscriptionLimit: DefaultVisitorSubscriptionLimit,
  185. VisitorAttachmentTotalSizeLimit: DefaultVisitorAttachmentTotalSizeLimit,
  186. VisitorAttachmentDailyBandwidthLimit: DefaultVisitorAttachmentDailyBandwidthLimit,
  187. VisitorRequestLimitBurst: DefaultVisitorRequestLimitBurst,
  188. VisitorRequestLimitReplenish: DefaultVisitorRequestLimitReplenish,
  189. VisitorRequestExemptIPAddrs: make([]netip.Prefix, 0),
  190. VisitorMessageDailyLimit: DefaultVisitorMessageDailyLimit,
  191. VisitorEmailLimitBurst: DefaultVisitorEmailLimitBurst,
  192. VisitorEmailLimitReplenish: DefaultVisitorEmailLimitReplenish,
  193. VisitorAccountCreationLimitBurst: DefaultVisitorAccountCreationLimitBurst,
  194. VisitorAccountCreationLimitReplenish: DefaultVisitorAccountCreationLimitReplenish,
  195. VisitorAuthFailureLimitBurst: DefaultVisitorAuthFailureLimitBurst,
  196. VisitorAuthFailureLimitReplenish: DefaultVisitorAuthFailureLimitReplenish,
  197. VisitorStatsResetTime: DefaultVisitorStatsResetTime,
  198. VisitorSubscriberRateLimiting: false,
  199. BehindProxy: false,
  200. StripeSecretKey: "",
  201. StripeWebhookKey: "",
  202. StripePriceCacheDuration: DefaultStripePriceCacheDuration,
  203. BillingContact: "",
  204. EnableWeb: true,
  205. EnableSignup: false,
  206. EnableLogin: false,
  207. EnableReservations: false,
  208. AccessControlAllowOrigin: "*",
  209. Version: "",
  210. }
  211. }