config.go 15 KB

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