config.go 15 KB

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