config.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  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. TemplateDir string // Directory to load named templates from
  94. KeepaliveInterval time.Duration
  95. ManagerInterval time.Duration
  96. DisallowedTopics []string
  97. WebRoot string // empty to disable
  98. DelayedSenderInterval time.Duration
  99. FirebaseKeepaliveInterval time.Duration
  100. FirebasePollInterval time.Duration
  101. FirebaseQuotaExceededPenaltyDuration time.Duration
  102. UpstreamBaseURL string
  103. UpstreamAccessToken string
  104. SMTPSenderAddr string
  105. SMTPSenderUser string
  106. SMTPSenderPass string
  107. SMTPSenderFrom string
  108. SMTPServerListen string
  109. SMTPServerDomain string
  110. SMTPServerAddrPrefix string
  111. TwilioAccount string
  112. TwilioAuthToken string
  113. TwilioPhoneNumber string
  114. TwilioCallsBaseURL string
  115. TwilioVerifyBaseURL string
  116. TwilioVerifyService string
  117. MetricsEnable bool
  118. MetricsListenHTTP string
  119. ProfileListenHTTP string
  120. MessageDelayMin time.Duration
  121. MessageDelayMax time.Duration
  122. MessageSizeLimit int
  123. TotalTopicLimit int
  124. TotalAttachmentSizeLimit int64
  125. VisitorSubscriptionLimit int
  126. VisitorAttachmentTotalSizeLimit int64
  127. VisitorAttachmentDailyBandwidthLimit int64
  128. VisitorRequestLimitBurst int
  129. VisitorRequestLimitReplenish time.Duration
  130. VisitorRequestExemptPrefixes []netip.Prefix
  131. VisitorMessageDailyLimit int
  132. VisitorEmailLimitBurst int
  133. VisitorEmailLimitReplenish time.Duration
  134. VisitorAccountCreationLimitBurst int
  135. VisitorAccountCreationLimitReplenish time.Duration
  136. VisitorAuthFailureLimitBurst int
  137. VisitorAuthFailureLimitReplenish time.Duration
  138. VisitorStatsResetTime time.Time // Time of the day at which to reset visitor stats
  139. VisitorSubscriberRateLimiting bool // Enable subscriber-based rate limiting for UnifiedPush topics
  140. VisitorPrefixBitsIPv4 int // Number of bits for IPv4 rate limiting (default: 32)
  141. VisitorPrefixBitsIPv6 int // Number of bits for IPv6 rate limiting (default: 64)
  142. BehindProxy bool // If true, the server will trust the proxy client IP header to determine the client IP address (IPv4 and IPv6 supported)
  143. 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)
  144. ProxyTrustedPrefixes []netip.Prefix // List of trusted proxy networks (IPv4 or IPv6) that will be stripped from the Forwarded header if BehindProxy is true
  145. StripeSecretKey string
  146. StripeWebhookKey string
  147. StripePriceCacheDuration time.Duration
  148. BillingContact string
  149. EnableSignup bool // Enable creation of accounts via API and UI
  150. EnableLogin bool
  151. EnableReservations bool // Allow users with role "user" to own/reserve topics
  152. EnableMetrics bool
  153. AccessControlAllowOrigin string // CORS header field to restrict access from web clients
  154. WebPushPrivateKey string
  155. WebPushPublicKey string
  156. WebPushFile string
  157. WebPushEmailAddress string
  158. WebPushStartupQueries string
  159. WebPushExpiryDuration time.Duration
  160. WebPushExpiryWarningDuration time.Duration
  161. Version string // injected by App
  162. }
  163. // NewConfig instantiates a default new server config
  164. func NewConfig() *Config {
  165. return &Config{
  166. File: "", // Only used for testing
  167. BaseURL: "",
  168. ListenHTTP: DefaultListenHTTP,
  169. ListenHTTPS: "",
  170. ListenUnix: "",
  171. ListenUnixMode: 0,
  172. KeyFile: "",
  173. CertFile: "",
  174. FirebaseKeyFile: "",
  175. CacheFile: "",
  176. CacheDuration: DefaultCacheDuration,
  177. CacheStartupQueries: "",
  178. CacheBatchSize: 0,
  179. CacheBatchTimeout: 0,
  180. AuthFile: "",
  181. AuthStartupQueries: "",
  182. AuthDefault: user.PermissionReadWrite,
  183. AuthBcryptCost: user.DefaultUserPasswordBcryptCost,
  184. AuthStatsQueueWriterInterval: user.DefaultUserStatsQueueWriterInterval,
  185. AttachmentCacheDir: "",
  186. AttachmentTotalSizeLimit: DefaultAttachmentTotalSizeLimit,
  187. AttachmentFileSizeLimit: DefaultAttachmentFileSizeLimit,
  188. AttachmentExpiryDuration: DefaultAttachmentExpiryDuration,
  189. KeepaliveInterval: DefaultKeepaliveInterval,
  190. ManagerInterval: DefaultManagerInterval,
  191. DisallowedTopics: DefaultDisallowedTopics,
  192. WebRoot: "/",
  193. DelayedSenderInterval: DefaultDelayedSenderInterval,
  194. FirebaseKeepaliveInterval: DefaultFirebaseKeepaliveInterval,
  195. FirebasePollInterval: DefaultFirebasePollInterval,
  196. FirebaseQuotaExceededPenaltyDuration: DefaultFirebaseQuotaExceededPenaltyDuration,
  197. UpstreamBaseURL: "",
  198. UpstreamAccessToken: "",
  199. SMTPSenderAddr: "",
  200. SMTPSenderUser: "",
  201. SMTPSenderPass: "",
  202. SMTPSenderFrom: "",
  203. SMTPServerListen: "",
  204. SMTPServerDomain: "",
  205. SMTPServerAddrPrefix: "",
  206. TwilioCallsBaseURL: "https://api.twilio.com", // Override for tests
  207. TwilioAccount: "",
  208. TwilioAuthToken: "",
  209. TwilioPhoneNumber: "",
  210. TwilioVerifyBaseURL: "https://verify.twilio.com", // Override for tests
  211. TwilioVerifyService: "",
  212. MessageSizeLimit: DefaultMessageSizeLimit,
  213. MessageDelayMin: DefaultMessageDelayMin,
  214. MessageDelayMax: DefaultMessageDelayMax,
  215. TotalTopicLimit: DefaultTotalTopicLimit,
  216. TotalAttachmentSizeLimit: 0,
  217. VisitorSubscriptionLimit: DefaultVisitorSubscriptionLimit,
  218. VisitorSubscriberRateLimiting: false,
  219. VisitorAttachmentTotalSizeLimit: DefaultVisitorAttachmentTotalSizeLimit,
  220. VisitorAttachmentDailyBandwidthLimit: DefaultVisitorAttachmentDailyBandwidthLimit,
  221. VisitorRequestLimitBurst: DefaultVisitorRequestLimitBurst,
  222. VisitorRequestLimitReplenish: DefaultVisitorRequestLimitReplenish,
  223. VisitorRequestExemptPrefixes: make([]netip.Prefix, 0),
  224. VisitorMessageDailyLimit: DefaultVisitorMessageDailyLimit,
  225. VisitorEmailLimitBurst: DefaultVisitorEmailLimitBurst,
  226. VisitorEmailLimitReplenish: DefaultVisitorEmailLimitReplenish,
  227. VisitorAccountCreationLimitBurst: DefaultVisitorAccountCreationLimitBurst,
  228. VisitorAccountCreationLimitReplenish: DefaultVisitorAccountCreationLimitReplenish,
  229. VisitorAuthFailureLimitBurst: DefaultVisitorAuthFailureLimitBurst,
  230. VisitorAuthFailureLimitReplenish: DefaultVisitorAuthFailureLimitReplenish,
  231. VisitorStatsResetTime: DefaultVisitorStatsResetTime,
  232. VisitorPrefixBitsIPv4: DefaultVisitorPrefixBitsIPv4, // Default: use full IPv4 address
  233. VisitorPrefixBitsIPv6: DefaultVisitorPrefixBitsIPv6, // Default: use /64 for IPv6
  234. BehindProxy: false, // If true, the server will trust the proxy client IP header to determine the client IP address
  235. ProxyForwardedHeader: "X-Forwarded-For", // Default header for reverse proxy client IPs
  236. StripeSecretKey: "",
  237. StripeWebhookKey: "",
  238. StripePriceCacheDuration: DefaultStripePriceCacheDuration,
  239. BillingContact: "",
  240. EnableSignup: false,
  241. EnableLogin: false,
  242. EnableReservations: false,
  243. AccessControlAllowOrigin: "*",
  244. Version: "",
  245. WebPushPrivateKey: "",
  246. WebPushPublicKey: "",
  247. WebPushFile: "",
  248. WebPushEmailAddress: "",
  249. WebPushExpiryDuration: DefaultWebPushExpiryDuration,
  250. WebPushExpiryWarningDuration: DefaultWebPushExpiryWarningDuration,
  251. TemplateDir: "",
  252. }
  253. }