config.go 15 KB

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