config.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. package server
  2. import (
  3. "io/fs"
  4. "net/netip"
  5. "time"
  6. "heckel.io/ntfy/v2/user"
  7. )
  8. // Defines default config settings (excluding limits, see below)
  9. const (
  10. DefaultListenHTTP = ":80"
  11. DefaultCacheDuration = 12 * time.Hour
  12. DefaultCacheBatchTimeout = time.Duration(0)
  13. DefaultKeepaliveInterval = 45 * time.Second // Not too frequently to save battery (Android read timeout used to be 77s!)
  14. DefaultManagerInterval = time.Minute
  15. DefaultDelayedSenderInterval = 10 * time.Second
  16. DefaultMessageDelayMin = 10 * time.Second
  17. DefaultMessageDelayMax = 3 * 24 * time.Hour
  18. DefaultFirebaseKeepaliveInterval = 3 * time.Hour // ~control topic (Android), not too frequently to save battery
  19. DefaultFirebasePollInterval = 20 * time.Minute // ~poll topic (iOS), max. 2-3 times per hour (see docs)
  20. DefaultFirebaseQuotaExceededPenaltyDuration = 10 * time.Minute // Time that over-users are locked out of Firebase if it returns "quota exceeded"
  21. DefaultStripePriceCacheDuration = 3 * time.Hour // Time to keep Stripe prices cached in memory before a refresh is needed
  22. )
  23. // Defines default Web Push settings
  24. const (
  25. DefaultWebPushExpiryWarningDuration = 55 * 24 * time.Hour
  26. DefaultWebPushExpiryDuration = 60 * 24 * time.Hour
  27. )
  28. // Defines all global and per-visitor limits
  29. // - message size limit: the max number of bytes for a message
  30. // - total topic limit: max number of topics overall
  31. // - various attachment limits
  32. const (
  33. DefaultMessageSizeLimit = 4096 // Bytes; note that FCM/APNS have a limit of ~4 KB for the entire message
  34. DefaultTotalTopicLimit = 15000
  35. DefaultAttachmentTotalSizeLimit = int64(5 * 1024 * 1024 * 1024) // 5 GB
  36. DefaultAttachmentFileSizeLimit = int64(15 * 1024 * 1024) // 15 MB
  37. DefaultAttachmentExpiryDuration = 3 * time.Hour
  38. )
  39. // Defines all per-visitor limits
  40. // - per visitor subscription limit: max number of subscriptions (active HTTP connections) per per-visitor/IP
  41. // - per visitor request limit: max number of PUT/GET/.. requests (here: 60 requests bucket, replenished at a rate of one per 5 seconds)
  42. // - per visitor email limit: max number of emails (here: 16 email bucket, replenished at a rate of one per hour)
  43. // - per visitor attachment size limit: total per-visitor attachment size in bytes to be stored on the server
  44. // - per visitor attachment daily bandwidth limit: number of bytes that can be transferred to/from the server
  45. const (
  46. DefaultVisitorSubscriptionLimit = 30
  47. DefaultVisitorRequestLimitBurst = 60
  48. DefaultVisitorRequestLimitReplenish = 5 * time.Second
  49. DefaultVisitorMessageDailyLimit = 0
  50. DefaultVisitorEmailLimitBurst = 16
  51. DefaultVisitorEmailLimitReplenish = time.Hour
  52. DefaultVisitorAccountCreationLimitBurst = 3
  53. DefaultVisitorAccountCreationLimitReplenish = 24 * time.Hour
  54. DefaultVisitorAuthFailureLimitBurst = 30
  55. DefaultVisitorAuthFailureLimitReplenish = time.Minute
  56. DefaultVisitorAttachmentTotalSizeLimit = 100 * 1024 * 1024 // 100 MB
  57. DefaultVisitorAttachmentDailyBandwidthLimit = 500 * 1024 * 1024 // 500 MB
  58. DefaultVisitorPrefixBitsIPv4 = 32 // Use the entire IPv4 address for rate limiting
  59. DefaultVisitorPrefixBitsIPv6 = 64 // Use /64 for IPv6 rate limiting
  60. )
  61. var (
  62. // DefaultVisitorStatsResetTime defines the time at which visitor stats are reset (wall clock only)
  63. DefaultVisitorStatsResetTime = time.Date(0, 0, 0, 0, 0, 0, 0, time.UTC)
  64. // DefaultDisallowedTopics defines the topics that are forbidden, because they are used elsewhere. This array can be
  65. // extended using the server.yml config. If updated, also update in Android and web app.
  66. DefaultDisallowedTopics = []string{"docs", "static", "file", "app", "metrics", "account", "settings", "signup", "login", "v1"}
  67. )
  68. // Config is the main config struct for the application. Use New to instantiate a default config struct.
  69. type Config struct {
  70. File string // Config file, only used for testing
  71. BaseURL string
  72. ListenHTTP string
  73. ListenHTTPS string
  74. ListenUnix string
  75. ListenUnixMode fs.FileMode
  76. KeyFile string
  77. CertFile string
  78. FirebaseKeyFile string
  79. CacheFile string
  80. CacheDuration time.Duration
  81. CacheStartupQueries string
  82. CacheBatchSize int
  83. CacheBatchTimeout time.Duration
  84. AuthFile string
  85. AuthStartupQueries string
  86. AuthDefault user.Permission
  87. AuthBcryptCost int
  88. AuthStatsQueueWriterInterval time.Duration
  89. AttachmentCacheDir string
  90. AttachmentTotalSizeLimit int64
  91. AttachmentFileSizeLimit int64
  92. AttachmentExpiryDuration time.Duration
  93. KeepaliveInterval time.Duration
  94. ManagerInterval time.Duration
  95. DisallowedTopics []string
  96. WebRoot string // empty to disable
  97. DelayedSenderInterval time.Duration
  98. FirebaseKeepaliveInterval time.Duration
  99. FirebasePollInterval time.Duration
  100. FirebaseQuotaExceededPenaltyDuration time.Duration
  101. UpstreamBaseURL string
  102. UpstreamAccessToken string
  103. SMTPSenderAddr string
  104. SMTPSenderUser string
  105. SMTPSenderPass string
  106. SMTPSenderFrom string
  107. SMTPServerListen string
  108. SMTPServerDomain string
  109. SMTPServerAddrPrefix string
  110. TwilioAccount string
  111. TwilioAuthToken string
  112. TwilioPhoneNumber string
  113. TwilioCallsBaseURL string
  114. TwilioVerifyBaseURL string
  115. TwilioVerifyService string
  116. MetricsEnable bool
  117. MetricsListenHTTP string
  118. ProfileListenHTTP string
  119. MessageDelayMin time.Duration
  120. MessageDelayMax time.Duration
  121. MessageSizeLimit int
  122. TotalTopicLimit int
  123. TotalAttachmentSizeLimit int64
  124. VisitorSubscriptionLimit int
  125. VisitorAttachmentTotalSizeLimit int64
  126. VisitorAttachmentDailyBandwidthLimit int64
  127. VisitorRequestLimitBurst int
  128. VisitorRequestLimitReplenish time.Duration
  129. VisitorRequestExemptIPAddrs []netip.Prefix
  130. VisitorMessageDailyLimit int
  131. VisitorEmailLimitBurst int
  132. VisitorEmailLimitReplenish time.Duration
  133. VisitorAccountCreationLimitBurst int
  134. VisitorAccountCreationLimitReplenish time.Duration
  135. VisitorAuthFailureLimitBurst int
  136. VisitorAuthFailureLimitReplenish time.Duration
  137. VisitorStatsResetTime time.Time // Time of the day at which to reset visitor stats
  138. VisitorSubscriberRateLimiting bool // Enable subscriber-based rate limiting for UnifiedPush topics
  139. VisitorPrefixBitsIPv4 int // Number of bits for IPv4 rate limiting (default: 32)
  140. VisitorPrefixBitsIPv6 int // Number of bits for IPv6 rate limiting (default: 64)
  141. BehindProxy bool // If true, the server will trust the proxy client IP header to determine the client IP address (IPv4 and IPv6 supported)
  142. ProxyForwardedHeader string // The header field to read the real/client IP address from, if BehindProxy is true, defaults to "X-Forwarded-For" (IPv4 and IPv6 supported)
  143. ProxyTrustedAddresses []string // List of trusted proxy addresses (IPv4 or IPv6) that will be stripped from the Forwarded header if BehindProxy is true
  144. StripeSecretKey string
  145. StripeWebhookKey string
  146. StripePriceCacheDuration time.Duration
  147. BillingContact string
  148. EnableSignup bool // Enable creation of accounts via API and UI
  149. EnableLogin bool
  150. EnableReservations bool // Allow users with role "user" to own/reserve topics
  151. EnableMetrics bool
  152. AccessControlAllowOrigin string // CORS header field to restrict access from web clients
  153. Version string // injected by App
  154. WebPushPrivateKey string
  155. WebPushPublicKey string
  156. WebPushFile string
  157. WebPushEmailAddress string
  158. WebPushStartupQueries string
  159. WebPushExpiryDuration time.Duration
  160. WebPushExpiryWarningDuration time.Duration
  161. }
  162. // NewConfig instantiates a default new server config
  163. func NewConfig() *Config {
  164. return &Config{
  165. File: "", // Only used for testing
  166. BaseURL: "",
  167. ListenHTTP: DefaultListenHTTP,
  168. ListenHTTPS: "",
  169. ListenUnix: "",
  170. ListenUnixMode: 0,
  171. KeyFile: "",
  172. CertFile: "",
  173. FirebaseKeyFile: "",
  174. CacheFile: "",
  175. CacheDuration: DefaultCacheDuration,
  176. CacheStartupQueries: "",
  177. CacheBatchSize: 0,
  178. CacheBatchTimeout: 0,
  179. AuthFile: "",
  180. AuthStartupQueries: "",
  181. AuthDefault: user.PermissionReadWrite,
  182. AuthBcryptCost: user.DefaultUserPasswordBcryptCost,
  183. AuthStatsQueueWriterInterval: user.DefaultUserStatsQueueWriterInterval,
  184. AttachmentCacheDir: "",
  185. AttachmentTotalSizeLimit: DefaultAttachmentTotalSizeLimit,
  186. AttachmentFileSizeLimit: DefaultAttachmentFileSizeLimit,
  187. AttachmentExpiryDuration: DefaultAttachmentExpiryDuration,
  188. KeepaliveInterval: DefaultKeepaliveInterval,
  189. ManagerInterval: DefaultManagerInterval,
  190. DisallowedTopics: DefaultDisallowedTopics,
  191. WebRoot: "/",
  192. DelayedSenderInterval: DefaultDelayedSenderInterval,
  193. FirebaseKeepaliveInterval: DefaultFirebaseKeepaliveInterval,
  194. FirebasePollInterval: DefaultFirebasePollInterval,
  195. FirebaseQuotaExceededPenaltyDuration: DefaultFirebaseQuotaExceededPenaltyDuration,
  196. UpstreamBaseURL: "",
  197. UpstreamAccessToken: "",
  198. SMTPSenderAddr: "",
  199. SMTPSenderUser: "",
  200. SMTPSenderPass: "",
  201. SMTPSenderFrom: "",
  202. SMTPServerListen: "",
  203. SMTPServerDomain: "",
  204. SMTPServerAddrPrefix: "",
  205. TwilioCallsBaseURL: "https://api.twilio.com", // Override for tests
  206. TwilioAccount: "",
  207. TwilioAuthToken: "",
  208. TwilioPhoneNumber: "",
  209. TwilioVerifyBaseURL: "https://verify.twilio.com", // Override for tests
  210. TwilioVerifyService: "",
  211. MessageSizeLimit: DefaultMessageSizeLimit,
  212. MessageDelayMin: DefaultMessageDelayMin,
  213. MessageDelayMax: DefaultMessageDelayMax,
  214. TotalTopicLimit: DefaultTotalTopicLimit,
  215. TotalAttachmentSizeLimit: 0,
  216. VisitorSubscriptionLimit: DefaultVisitorSubscriptionLimit,
  217. VisitorAttachmentTotalSizeLimit: DefaultVisitorAttachmentTotalSizeLimit,
  218. VisitorAttachmentDailyBandwidthLimit: DefaultVisitorAttachmentDailyBandwidthLimit,
  219. VisitorRequestLimitBurst: DefaultVisitorRequestLimitBurst,
  220. VisitorRequestLimitReplenish: DefaultVisitorRequestLimitReplenish,
  221. VisitorRequestExemptIPAddrs: make([]netip.Prefix, 0),
  222. VisitorMessageDailyLimit: DefaultVisitorMessageDailyLimit,
  223. VisitorEmailLimitBurst: DefaultVisitorEmailLimitBurst,
  224. VisitorEmailLimitReplenish: DefaultVisitorEmailLimitReplenish,
  225. VisitorAccountCreationLimitBurst: DefaultVisitorAccountCreationLimitBurst,
  226. VisitorAccountCreationLimitReplenish: DefaultVisitorAccountCreationLimitReplenish,
  227. VisitorAuthFailureLimitBurst: DefaultVisitorAuthFailureLimitBurst,
  228. VisitorAuthFailureLimitReplenish: DefaultVisitorAuthFailureLimitReplenish,
  229. VisitorStatsResetTime: DefaultVisitorStatsResetTime,
  230. VisitorSubscriberRateLimiting: false,
  231. VisitorPrefixBitsIPv4: 32, // Default: use full IPv4 address
  232. VisitorPrefixBitsIPv6: 64, // Default: use /64 for IPv6
  233. BehindProxy: false, // If true, the server will trust the proxy client IP header to determine the client IP address
  234. ProxyForwardedHeader: "X-Forwarded-For", // Default header for reverse proxy client IPs
  235. StripeSecretKey: "",
  236. StripeWebhookKey: "",
  237. StripePriceCacheDuration: DefaultStripePriceCacheDuration,
  238. BillingContact: "",
  239. EnableSignup: false,
  240. EnableLogin: false,
  241. EnableReservations: false,
  242. AccessControlAllowOrigin: "*",
  243. Version: "",
  244. WebPushPrivateKey: "",
  245. WebPushPublicKey: "",
  246. WebPushFile: "",
  247. WebPushEmailAddress: "",
  248. WebPushExpiryDuration: DefaultWebPushExpiryDuration,
  249. WebPushExpiryWarningDuration: DefaultWebPushExpiryWarningDuration,
  250. }
  251. }