config.go 12 KB

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