ntfy/server/config.go

216 lines
11 KiB
Go
Raw Normal View History

2021-12-19 04:02:36 +01:00
package server
2021-10-24 04:49:50 +02:00
import (
"heckel.io/ntfy/user"
"io/fs"
"net/netip"
2021-10-24 04:49:50 +02:00
"time"
)
2022-01-13 00:52:07 +01:00
// Defines default config settings (excluding limits, see below)
const (
2022-06-01 05:27:24 +02:00
DefaultListenHTTP = ":80"
DefaultCacheDuration = 12 * time.Hour
DefaultKeepaliveInterval = 45 * time.Second // Not too frequently to save battery (Android read timeout used to be 77s!)
DefaultManagerInterval = time.Minute
DefaultDelayedSenderInterval = 10 * time.Second
DefaultMinDelay = 10 * time.Second
DefaultMaxDelay = 3 * 24 * time.Hour
DefaultFirebaseKeepaliveInterval = 3 * time.Hour // ~control topic (Android), not too frequently to save battery
DefaultFirebasePollInterval = 20 * time.Minute // ~poll topic (iOS), max. 2-3 times per hour (see docs)
DefaultFirebaseQuotaExceededPenaltyDuration = 10 * time.Minute // Time that over-users are locked out of Firebase if it returns "quota exceeded"
2023-02-09 04:57:10 +01:00
DefaultStripePriceCacheDuration = 3 * time.Hour // Time to keep Stripe prices cached in memory before a refresh is needed
2021-10-24 04:49:50 +02:00
)
2022-01-13 00:52:07 +01:00
// Defines all global and per-visitor limits
// - message size limit: the max number of bytes for a message
2022-01-04 00:55:08 +01:00
// - total topic limit: max number of topics overall
2022-01-13 00:52:07 +01:00
// - various attachment limits
const (
DefaultMessageLengthLimit = 4096 // Bytes
DefaultTotalTopicLimit = 15000
2022-01-13 03:24:48 +01:00
DefaultAttachmentTotalSizeLimit = int64(5 * 1024 * 1024 * 1024) // 5 GB
DefaultAttachmentFileSizeLimit = int64(15 * 1024 * 1024) // 15 MB
2022-01-13 00:52:07 +01:00
DefaultAttachmentExpiryDuration = 3 * time.Hour
)
// Defines all per-visitor limits
2022-01-04 00:55:08 +01:00
// - per visitor subscription limit: max number of subscriptions (active HTTP connections) per per-visitor/IP
2022-02-14 23:07:17 +01:00
// - per visitor request limit: max number of PUT/GET/.. requests (here: 60 requests bucket, replenished at a rate of one per 5 seconds)
2021-12-24 00:03:04 +01:00
// - per visitor email limit: max number of emails (here: 16 email bucket, replenished at a rate of one per hour)
2022-01-13 00:52:07 +01:00
// - per visitor attachment size limit: total per-visitor attachment size in bytes to be stored on the server
2022-01-13 03:24:48 +01:00
// - per visitor attachment daily bandwidth limit: number of bytes that can be transferred to/from the server
const (
2022-01-13 03:24:48 +01:00
DefaultVisitorSubscriptionLimit = 30
DefaultVisitorRequestLimitBurst = 60
2022-02-14 23:07:17 +01:00
DefaultVisitorRequestLimitReplenish = 5 * time.Second
2023-01-27 04:57:18 +01:00
DefaultVisitorMessageDailyLimit = 0
2022-01-13 03:24:48 +01:00
DefaultVisitorEmailLimitBurst = 16
DefaultVisitorEmailLimitReplenish = time.Hour
DefaultVisitorAccountCreationLimitBurst = 3
DefaultVisitorAccountCreationLimitReplenish = 24 * time.Hour
DefaultVisitorAuthFailureLimitBurst = 30
2023-02-08 21:20:44 +01:00
DefaultVisitorAuthFailureLimitReplenish = time.Minute
2022-01-13 03:24:48 +01:00
DefaultVisitorAttachmentTotalSizeLimit = 100 * 1024 * 1024 // 100 MB
DefaultVisitorAttachmentDailyBandwidthLimit = 500 * 1024 * 1024 // 500 MB
)
2023-01-11 04:51:51 +01:00
var (
// DefaultVisitorStatsResetTime defines the time at which visitor stats are reset (wall clock only)
DefaultVisitorStatsResetTime = time.Date(0, 0, 0, 0, 0, 0, 0, time.UTC)
2023-02-09 14:32:51 +01:00
// DefaultDisallowedTopics defines the topics that are forbidden, because they are used elsewhere. This array can be
// extended using the server.yml config. If updated, also update in Android and web app.
2023-02-15 16:55:01 +01:00
DefaultDisallowedTopics = []string{"docs", "static", "file", "app", "account", "settings", "signup", "login", "v1"}
2023-01-11 04:51:51 +01:00
)
// Config is the main config struct for the application. Use New to instantiate a default config struct.
type Config struct {
2023-02-08 21:20:44 +01:00
File string // Config file, only used for testing
2022-01-13 03:24:48 +01:00
BaseURL string
ListenHTTP string
ListenHTTPS string
2022-01-15 02:16:12 +01:00
ListenUnix string
ListenUnixMode fs.FileMode
2022-01-13 03:24:48 +01:00
KeyFile string
CertFile string
FirebaseKeyFile string
CacheFile string
CacheDuration time.Duration
2022-06-23 17:02:45 +02:00
CacheStartupQueries string
2022-11-16 16:28:20 +01:00
CacheBatchSize int
CacheBatchTimeout time.Duration
2022-01-23 05:01:20 +01:00
AuthFile string
2023-01-05 21:20:44 +01:00
AuthStartupQueries string
AuthDefault user.Permission
2023-01-28 15:03:14 +01:00
AuthBcryptCost int
2023-01-29 02:29:06 +01:00
AuthStatsQueueWriterInterval time.Duration
2022-01-13 03:24:48 +01:00
AttachmentCacheDir string
AttachmentTotalSizeLimit int64
AttachmentFileSizeLimit int64
AttachmentExpiryDuration time.Duration
KeepaliveInterval time.Duration
ManagerInterval time.Duration
2023-02-09 14:32:51 +01:00
DisallowedTopics []string
2022-03-06 03:28:25 +01:00
WebRootIsApp bool
DelayedSenderInterval time.Duration
2022-01-13 03:24:48 +01:00
FirebaseKeepaliveInterval time.Duration
FirebasePollInterval time.Duration
2022-06-01 05:27:24 +02:00
FirebaseQuotaExceededPenaltyDuration time.Duration
2022-05-28 02:30:20 +02:00
UpstreamBaseURL string
2022-01-13 03:24:48 +01:00
SMTPSenderAddr string
SMTPSenderUser string
SMTPSenderPass string
SMTPSenderFrom string
SMTPServerListen string
SMTPServerDomain string
SMTPServerAddrPrefix string
MessageLimit int
MinDelay time.Duration
MaxDelay time.Duration
TotalTopicLimit int
TotalAttachmentSizeLimit int64
VisitorSubscriptionLimit int
VisitorAttachmentTotalSizeLimit int64
VisitorAttachmentDailyBandwidthLimit int64
2022-01-13 03:24:48 +01:00
VisitorRequestLimitBurst int
VisitorRequestLimitReplenish time.Duration
VisitorRequestExemptIPAddrs []netip.Prefix
2023-01-27 04:57:18 +01:00
VisitorMessageDailyLimit int
2022-01-13 03:24:48 +01:00
VisitorEmailLimitBurst int
VisitorEmailLimitReplenish time.Duration
VisitorAccountCreationLimitBurst int
VisitorAccountCreationLimitReplenish time.Duration
2023-02-08 21:20:44 +01:00
VisitorAuthFailureLimitBurst int
VisitorAuthFailureLimitReplenish time.Duration
2023-01-11 04:51:51 +01:00
VisitorStatsResetTime time.Time // Time of the day at which to reset visitor stats
2023-03-04 02:23:18 +01:00
VisitorSubscriberRateLimiting bool // Enable subscriber-based rate limiting for UnifiedPush topics
2022-01-13 03:24:48 +01:00
BehindProxy bool
StripeSecretKey string
2023-01-14 12:43:44 +01:00
StripeWebhookKey string
2023-01-18 21:50:06 +01:00
StripePriceCacheDuration time.Duration
2023-02-28 20:38:31 +01:00
BillingContact string
EnableWeb bool
2023-01-05 21:20:44 +01:00
EnableSignup bool // Enable creation of accounts via API and UI
2022-12-15 05:11:22 +01:00
EnableLogin bool
2023-01-10 02:37:13 +01:00
EnableReservations bool // Allow users with role "user" to own/reserve topics
2023-01-18 21:50:06 +01:00
AccessControlAllowOrigin string // CORS header field to restrict access from web clients
Version string // injected by App
}
// NewConfig instantiates a default new server config
2021-12-22 14:17:50 +01:00
func NewConfig() *Config {
return &Config{
2023-02-08 21:20:44 +01:00
File: "", // Only used for testing
2022-01-13 03:24:48 +01:00
BaseURL: "",
ListenHTTP: DefaultListenHTTP,
ListenHTTPS: "",
2022-01-15 02:16:12 +01:00
ListenUnix: "",
2022-07-04 01:33:01 +02:00
ListenUnixMode: 0,
2022-01-13 03:24:48 +01:00
KeyFile: "",
CertFile: "",
FirebaseKeyFile: "",
CacheFile: "",
CacheDuration: DefaultCacheDuration,
2023-01-18 21:50:06 +01:00
CacheStartupQueries: "",
2022-11-16 16:28:20 +01:00
CacheBatchSize: 0,
CacheBatchTimeout: 0,
2022-01-23 05:01:20 +01:00
AuthFile: "",
2023-01-18 21:50:06 +01:00
AuthStartupQueries: "",
2023-02-09 04:57:10 +01:00
AuthDefault: user.PermissionReadWrite,
2023-01-28 15:03:14 +01:00
AuthBcryptCost: user.DefaultUserPasswordBcryptCost,
2023-01-29 02:29:06 +01:00
AuthStatsQueueWriterInterval: user.DefaultUserStatsQueueWriterInterval,
2022-01-13 03:24:48 +01:00
AttachmentCacheDir: "",
AttachmentTotalSizeLimit: DefaultAttachmentTotalSizeLimit,
AttachmentFileSizeLimit: DefaultAttachmentFileSizeLimit,
AttachmentExpiryDuration: DefaultAttachmentExpiryDuration,
KeepaliveInterval: DefaultKeepaliveInterval,
ManagerInterval: DefaultManagerInterval,
2023-02-09 21:24:12 +01:00
DisallowedTopics: DefaultDisallowedTopics,
2023-01-18 21:50:06 +01:00
WebRootIsApp: false,
2022-06-01 05:27:24 +02:00
DelayedSenderInterval: DefaultDelayedSenderInterval,
2022-01-13 03:24:48 +01:00
FirebaseKeepaliveInterval: DefaultFirebaseKeepaliveInterval,
FirebasePollInterval: DefaultFirebasePollInterval,
2022-06-01 05:27:24 +02:00
FirebaseQuotaExceededPenaltyDuration: DefaultFirebaseQuotaExceededPenaltyDuration,
2023-01-18 21:50:06 +01:00
UpstreamBaseURL: "",
SMTPSenderAddr: "",
SMTPSenderUser: "",
SMTPSenderPass: "",
SMTPSenderFrom: "",
SMTPServerListen: "",
SMTPServerDomain: "",
SMTPServerAddrPrefix: "",
MessageLimit: DefaultMessageLengthLimit,
MinDelay: DefaultMinDelay,
MaxDelay: DefaultMaxDelay,
2022-01-13 03:24:48 +01:00
TotalTopicLimit: DefaultTotalTopicLimit,
2023-01-18 21:50:06 +01:00
TotalAttachmentSizeLimit: 0,
2022-01-13 03:24:48 +01:00
VisitorSubscriptionLimit: DefaultVisitorSubscriptionLimit,
VisitorAttachmentTotalSizeLimit: DefaultVisitorAttachmentTotalSizeLimit,
VisitorAttachmentDailyBandwidthLimit: DefaultVisitorAttachmentDailyBandwidthLimit,
VisitorRequestLimitBurst: DefaultVisitorRequestLimitBurst,
VisitorRequestLimitReplenish: DefaultVisitorRequestLimitReplenish,
VisitorRequestExemptIPAddrs: make([]netip.Prefix, 0),
2023-01-27 04:57:18 +01:00
VisitorMessageDailyLimit: DefaultVisitorMessageDailyLimit,
2022-01-13 03:24:48 +01:00
VisitorEmailLimitBurst: DefaultVisitorEmailLimitBurst,
VisitorEmailLimitReplenish: DefaultVisitorEmailLimitReplenish,
VisitorAccountCreationLimitBurst: DefaultVisitorAccountCreationLimitBurst,
VisitorAccountCreationLimitReplenish: DefaultVisitorAccountCreationLimitReplenish,
2023-02-08 21:20:44 +01:00
VisitorAuthFailureLimitBurst: DefaultVisitorAuthFailureLimitBurst,
VisitorAuthFailureLimitReplenish: DefaultVisitorAuthFailureLimitReplenish,
2023-01-11 04:51:51 +01:00
VisitorStatsResetTime: DefaultVisitorStatsResetTime,
2023-03-04 02:23:18 +01:00
VisitorSubscriberRateLimiting: false,
2022-01-13 03:24:48 +01:00
BehindProxy: false,
2023-01-18 21:50:06 +01:00
StripeSecretKey: "",
StripeWebhookKey: "",
StripePriceCacheDuration: DefaultStripePriceCacheDuration,
2023-03-04 02:23:18 +01:00
BillingContact: "",
EnableWeb: true,
2023-01-18 21:50:06 +01:00
EnableSignup: false,
EnableLogin: false,
EnableReservations: false,
AccessControlAllowOrigin: "*",
Version: "",
}
}