Pārlūkot izejas kodu

Move config files and folders

Philipp Heckel 4 gadi atpakaļ
vecāks
revīzija
fa9d6444f5

+ 13 - 5
.goreleaser.yml

@@ -47,14 +47,20 @@ nfpms:
       - rpm
       - rpm
     bindir: /usr/bin
     bindir: /usr/bin
     contents:
     contents:
-      - src: config/config.yml
-        dst: /etc/ntfy/config.yml
+      - src: server/server.yml
+        dst: /etc/ntfy/server.yml
         type: config
         type: config
-      - src: config/ntfy.service
+      - src: server/ntfy.service
         dst: /lib/systemd/system/ntfy.service
         dst: /lib/systemd/system/ntfy.service
+      - src: client/client.yml
+        dst: /etc/ntfy/client.yml
+        type: config
+      - src: client/ntfy-client.service
+        dst: /lib/systemd/system/ntfy-client.service
       - dst: /var/cache/ntfy
       - dst: /var/cache/ntfy
         type: dir
         type: dir
     scripts:
     scripts:
+      preinstall: "scripts/preinst.sh"
       postinstall: "scripts/postinst.sh"
       postinstall: "scripts/postinst.sh"
       preremove: "scripts/prerm.sh"
       preremove: "scripts/prerm.sh"
       postremove: "scripts/postrm.sh"
       postremove: "scripts/postrm.sh"
@@ -64,8 +70,10 @@ archives:
     files:
     files:
       - LICENSE
       - LICENSE
       - README.md
       - README.md
-      - config/config.yml
-      - config/ntfy.service
+      - server/server.yml
+      - server/ntfy.service
+      - client/client.yml
+      - client/ntfy-client.service
     replacements:
     replacements:
       386: i386
       386: i386
       amd64: x86_64
       amd64: x86_64

+ 1 - 1
Makefile

@@ -115,7 +115,7 @@ build-simple: clean
 		"-linkmode=external -extldflags=-static -s -w -X main.version=$(VERSION) -X main.commit=$(shell git rev-parse --short HEAD) -X main.date=$(shell date +%s)"
 		"-linkmode=external -extldflags=-static -s -w -X main.version=$(VERSION) -X main.commit=$(shell git rev-parse --short HEAD) -X main.date=$(shell date +%s)"
 
 
 clean: .PHONY
 clean: .PHONY
-	rm -rf dist build
+	rm -rf dist build server/docs
 
 
 
 
 # Releasing targets
 # Releasing targets

+ 2 - 1
client/client.go

@@ -50,7 +50,8 @@ func New(config *Config) *Client {
 	}
 	}
 }
 }
 
 
-func (c *Client) Publish(topicURL, message string, options ...PublishOption) error {
+func (c *Client) Publish(topic, message string, options ...PublishOption) error {
+	topicURL := c.expandTopicURL(topic)
 	req, _ := http.NewRequest("POST", topicURL, strings.NewReader(message))
 	req, _ := http.NewRequest("POST", topicURL, strings.NewReader(message))
 	for _, option := range options {
 	for _, option := range options {
 		if err := option(req); err != nil {
 		if err := option(req); err != nil {

+ 0 - 0
config/ntfy-client.service → client/ntfy-client.service


+ 11 - 12
cmd/serve.go

@@ -5,7 +5,6 @@ import (
 	"errors"
 	"errors"
 	"github.com/urfave/cli/v2"
 	"github.com/urfave/cli/v2"
 	"github.com/urfave/cli/v2/altsrc"
 	"github.com/urfave/cli/v2/altsrc"
-	"heckel.io/ntfy/config"
 	"heckel.io/ntfy/server"
 	"heckel.io/ntfy/server"
 	"heckel.io/ntfy/util"
 	"heckel.io/ntfy/util"
 	"log"
 	"log"
@@ -13,20 +12,20 @@ import (
 )
 )
 
 
 var flagsServe = []cli.Flag{
 var flagsServe = []cli.Flag{
-	&cli.StringFlag{Name: "config", Aliases: []string{"c"}, EnvVars: []string{"NTFY_CONFIG_FILE"}, Value: "/etc/ntfy/config.yml", DefaultText: "/etc/ntfy/config.yml", Usage: "config file"},
-	altsrc.NewStringFlag(&cli.StringFlag{Name: "listen-http", Aliases: []string{"l"}, EnvVars: []string{"NTFY_LISTEN_HTTP"}, Value: config.DefaultListenHTTP, Usage: "ip:port used to as HTTP listen address"}),
+	&cli.StringFlag{Name: "config", Aliases: []string{"c"}, EnvVars: []string{"NTFY_CONFIG_FILE"}, Value: "/etc/ntfy/server.yml", DefaultText: "/etc/ntfy/server.yml", Usage: "config file"},
+	altsrc.NewStringFlag(&cli.StringFlag{Name: "listen-http", Aliases: []string{"l"}, EnvVars: []string{"NTFY_LISTEN_HTTP"}, Value: server.DefaultListenHTTP, Usage: "ip:port used to as HTTP listen address"}),
 	altsrc.NewStringFlag(&cli.StringFlag{Name: "listen-https", Aliases: []string{"L"}, EnvVars: []string{"NTFY_LISTEN_HTTPS"}, Usage: "ip:port used to as HTTPS listen address"}),
 	altsrc.NewStringFlag(&cli.StringFlag{Name: "listen-https", Aliases: []string{"L"}, EnvVars: []string{"NTFY_LISTEN_HTTPS"}, Usage: "ip:port used to as HTTPS listen address"}),
 	altsrc.NewStringFlag(&cli.StringFlag{Name: "key-file", Aliases: []string{"K"}, EnvVars: []string{"NTFY_KEY_FILE"}, Usage: "private key file, if listen-https is set"}),
 	altsrc.NewStringFlag(&cli.StringFlag{Name: "key-file", Aliases: []string{"K"}, EnvVars: []string{"NTFY_KEY_FILE"}, Usage: "private key file, if listen-https is set"}),
 	altsrc.NewStringFlag(&cli.StringFlag{Name: "cert-file", Aliases: []string{"E"}, EnvVars: []string{"NTFY_CERT_FILE"}, Usage: "certificate file, if listen-https is set"}),
 	altsrc.NewStringFlag(&cli.StringFlag{Name: "cert-file", Aliases: []string{"E"}, EnvVars: []string{"NTFY_CERT_FILE"}, Usage: "certificate file, if listen-https is set"}),
 	altsrc.NewStringFlag(&cli.StringFlag{Name: "firebase-key-file", Aliases: []string{"F"}, EnvVars: []string{"NTFY_FIREBASE_KEY_FILE"}, Usage: "Firebase credentials file; if set additionally publish to FCM topic"}),
 	altsrc.NewStringFlag(&cli.StringFlag{Name: "firebase-key-file", Aliases: []string{"F"}, EnvVars: []string{"NTFY_FIREBASE_KEY_FILE"}, Usage: "Firebase credentials file; if set additionally publish to FCM topic"}),
 	altsrc.NewStringFlag(&cli.StringFlag{Name: "cache-file", Aliases: []string{"C"}, EnvVars: []string{"NTFY_CACHE_FILE"}, Usage: "cache file used for message caching"}),
 	altsrc.NewStringFlag(&cli.StringFlag{Name: "cache-file", Aliases: []string{"C"}, EnvVars: []string{"NTFY_CACHE_FILE"}, Usage: "cache file used for message caching"}),
-	altsrc.NewDurationFlag(&cli.DurationFlag{Name: "cache-duration", Aliases: []string{"b"}, EnvVars: []string{"NTFY_CACHE_DURATION"}, Value: config.DefaultCacheDuration, Usage: "buffer messages for this time to allow `since` requests"}),
-	altsrc.NewDurationFlag(&cli.DurationFlag{Name: "keepalive-interval", Aliases: []string{"k"}, EnvVars: []string{"NTFY_KEEPALIVE_INTERVAL"}, Value: config.DefaultKeepaliveInterval, Usage: "interval of keepalive messages"}),
-	altsrc.NewDurationFlag(&cli.DurationFlag{Name: "manager-interval", Aliases: []string{"m"}, EnvVars: []string{"NTFY_MANAGER_INTERVAL"}, Value: config.DefaultManagerInterval, Usage: "interval of for message pruning and stats printing"}),
-	altsrc.NewIntFlag(&cli.IntFlag{Name: "global-topic-limit", Aliases: []string{"T"}, EnvVars: []string{"NTFY_GLOBAL_TOPIC_LIMIT"}, Value: config.DefaultGlobalTopicLimit, Usage: "total number of topics allowed"}),
-	altsrc.NewIntFlag(&cli.IntFlag{Name: "visitor-subscription-limit", Aliases: []string{"V"}, EnvVars: []string{"NTFY_VISITOR_SUBSCRIPTION_LIMIT"}, Value: config.DefaultVisitorSubscriptionLimit, Usage: "number of subscriptions per visitor"}),
-	altsrc.NewIntFlag(&cli.IntFlag{Name: "visitor-request-limit-burst", Aliases: []string{"B"}, EnvVars: []string{"NTFY_VISITOR_REQUEST_LIMIT_BURST"}, Value: config.DefaultVisitorRequestLimitBurst, Usage: "initial limit of requests per visitor"}),
-	altsrc.NewDurationFlag(&cli.DurationFlag{Name: "visitor-request-limit-replenish", Aliases: []string{"R"}, EnvVars: []string{"NTFY_VISITOR_REQUEST_LIMIT_REPLENISH"}, Value: config.DefaultVisitorRequestLimitReplenish, Usage: "interval at which burst limit is replenished (one per x)"}),
+	altsrc.NewDurationFlag(&cli.DurationFlag{Name: "cache-duration", Aliases: []string{"b"}, EnvVars: []string{"NTFY_CACHE_DURATION"}, Value: server.DefaultCacheDuration, Usage: "buffer messages for this time to allow `since` requests"}),
+	altsrc.NewDurationFlag(&cli.DurationFlag{Name: "keepalive-interval", Aliases: []string{"k"}, EnvVars: []string{"NTFY_KEEPALIVE_INTERVAL"}, Value: server.DefaultKeepaliveInterval, Usage: "interval of keepalive messages"}),
+	altsrc.NewDurationFlag(&cli.DurationFlag{Name: "manager-interval", Aliases: []string{"m"}, EnvVars: []string{"NTFY_MANAGER_INTERVAL"}, Value: server.DefaultManagerInterval, Usage: "interval of for message pruning and stats printing"}),
+	altsrc.NewIntFlag(&cli.IntFlag{Name: "global-topic-limit", Aliases: []string{"T"}, EnvVars: []string{"NTFY_GLOBAL_TOPIC_LIMIT"}, Value: server.DefaultGlobalTopicLimit, Usage: "total number of topics allowed"}),
+	altsrc.NewIntFlag(&cli.IntFlag{Name: "visitor-subscription-limit", Aliases: []string{"V"}, EnvVars: []string{"NTFY_VISITOR_SUBSCRIPTION_LIMIT"}, Value: server.DefaultVisitorSubscriptionLimit, Usage: "number of subscriptions per visitor"}),
+	altsrc.NewIntFlag(&cli.IntFlag{Name: "visitor-request-limit-burst", Aliases: []string{"B"}, EnvVars: []string{"NTFY_VISITOR_REQUEST_LIMIT_BURST"}, Value: server.DefaultVisitorRequestLimitBurst, Usage: "initial limit of requests per visitor"}),
+	altsrc.NewDurationFlag(&cli.DurationFlag{Name: "visitor-request-limit-replenish", Aliases: []string{"R"}, EnvVars: []string{"NTFY_VISITOR_REQUEST_LIMIT_REPLENISH"}, Value: server.DefaultVisitorRequestLimitReplenish, Usage: "interval at which burst limit is replenished (one per x)"}),
 	altsrc.NewBoolFlag(&cli.BoolFlag{Name: "behind-proxy", Aliases: []string{"P"}, EnvVars: []string{"NTFY_BEHIND_PROXY"}, Value: false, Usage: "if set, use X-Forwarded-For header to determine visitor IP address (for rate limiting)"}),
 	altsrc.NewBoolFlag(&cli.BoolFlag{Name: "behind-proxy", Aliases: []string{"P"}, EnvVars: []string{"NTFY_BEHIND_PROXY"}, Value: false, Usage: "if set, use X-Forwarded-For header to determine visitor IP address (for rate limiting)"}),
 }
 }
 
 
@@ -39,7 +38,7 @@ var cmdServe = &cli.Command{
 	Before:    initConfigFileInputSource("config", flagsServe),
 	Before:    initConfigFileInputSource("config", flagsServe),
 	Description: `Run the ntfy server and listen for incoming requests
 	Description: `Run the ntfy server and listen for incoming requests
 
 
-The command will load the configuration from /etc/ntfy/config.yml. Config options can 
+The command will load the configuration from /etc/ntfy/server.yml. Config options can 
 be overridden using the command line options.
 be overridden using the command line options.
 
 
 Examples:
 Examples:
@@ -82,7 +81,7 @@ func execServe(c *cli.Context) error {
 	}
 	}
 
 
 	// Run server
 	// Run server
-	conf := config.New(listenHTTP)
+	conf := server.NewConfig(listenHTTP)
 	conf.ListenHTTPS = listenHTTPS
 	conf.ListenHTTPS = listenHTTPS
 	conf.KeyFile = keyFile
 	conf.KeyFile = keyFile
 	conf.CertFile = certFile
 	conf.CertFile = certFile

+ 8 - 6
cmd/subscribe.go

@@ -20,10 +20,14 @@ var cmdSubscribe = &cli.Command{
 	Usage:     "Subscribe to one or more topics on a ntfy server",
 	Usage:     "Subscribe to one or more topics on a ntfy server",
 	UsageText: "ntfy subscribe [OPTIONS..] [TOPIC]",
 	UsageText: "ntfy subscribe [OPTIONS..] [TOPIC]",
 	Action:    execSubscribe,
 	Action:    execSubscribe,
+	OnUsageError: func(context *cli.Context, err error, isSubcommand bool) error {
+		println("ee")
+		return nil
+	},
+
 	Flags: []cli.Flag{
 	Flags: []cli.Flag{
-		&cli.StringFlag{Name: "config", Aliases: []string{"c"}, Usage: "config file"},
-		&cli.StringFlag{Name: "exec", Aliases: []string{"e"}, Usage: "execute command for each message event"},
-		&cli.StringFlag{Name: "since", Aliases: []string{"s"}, Usage: "return events since (Unix timestamp, or all)"},
+		&cli.StringFlag{Name: "config", Aliases: []string{"c"}, Usage: "config file `FILE`"},
+		&cli.StringFlag{Name: "since", Aliases: []string{"s"}, Usage: "return events since `SINCE` (Unix timestamp, or all)"},
 		&cli.BoolFlag{Name: "from-config", Aliases: []string{"C"}, Usage: "read subscriptions from config file (service mode)"},
 		&cli.BoolFlag{Name: "from-config", Aliases: []string{"C"}, Usage: "read subscriptions from config file (service mode)"},
 		&cli.BoolFlag{Name: "poll", Aliases: []string{"p"}, Usage: "return events and exit, do not listen for new events"},
 		&cli.BoolFlag{Name: "poll", Aliases: []string{"p"}, Usage: "return events and exit, do not listen for new events"},
 		&cli.BoolFlag{Name: "scheduled", Aliases: []string{"sched", "S"}, Usage: "also return scheduled/delayed events"},
 		&cli.BoolFlag{Name: "scheduled", Aliases: []string{"sched", "S"}, Usage: "also return scheduled/delayed events"},
@@ -72,8 +76,6 @@ ntfy subscribe --from-config
 }
 }
 
 
 func execSubscribe(c *cli.Context) error {
 func execSubscribe(c *cli.Context) error {
-	fmt.Fprintln(c.App.ErrWriter, "\x1b[1;33mThis command is incubating. The interface may change without notice.\x1b[0m")
-
 	// Read config and options
 	// Read config and options
 	conf, err := loadConfig(c)
 	conf, err := loadConfig(c)
 	if err != nil {
 	if err != nil {
@@ -100,7 +102,7 @@ func execSubscribe(c *cli.Context) error {
 		options = append(options, client.WithScheduled())
 		options = append(options, client.WithScheduled())
 	}
 	}
 	if topic == "" && len(conf.Subscribe) == 0 {
 	if topic == "" && len(conf.Subscribe) == 0 {
-		return errors.New("must specify topic, or have at least one topic defined in config")
+		return errors.New("must specify topic, type 'ntfy subscribe --help' for help")
 	}
 	}
 
 
 	// Execute poll or subscribe
 	// Execute poll or subscribe

+ 6 - 6
docs/config.md

@@ -1,6 +1,6 @@
 # Configuring the ntfy server
 # Configuring the ntfy server
-The ntfy server can be configured in three ways: using a config file (typically at `/etc/ntfy/config.yml`, 
-see [config.yml](https://github.com/binwiederhier/ntfy/blob/main/config/config.yml)), via command line arguments 
+The ntfy server can be configured in three ways: using a config file (typically at `/etc/ntfy/server.yml`, 
+see [server.yml](https://github.com/binwiederhier/ntfy/blob/main/config/server.yml)), via command line arguments 
 or using environment variables.
 or using environment variables.
 
 
 ## Quick start
 ## Quick start
@@ -50,7 +50,7 @@ flag. This will instruct the [rate limiting](#rate-limiting) logic to use the `X
 identifier for a visitor, as opposed to the remote IP address. If the `behind-proxy` flag is not set, all visitors will
 identifier for a visitor, as opposed to the remote IP address. If the `behind-proxy` flag is not set, all visitors will
 be counted as one, because from the perspective of the ntfy server, they all share the proxy's IP address.
 be counted as one, because from the perspective of the ntfy server, they all share the proxy's IP address.
 
 
-=== "/etc/ntfy/config.yml"
+=== "/etc/ntfy/server.yml"
     ```
     ```
     # Tell ntfy to use "X-Forwarded-For" to identify visitors
     # Tell ntfy to use "X-Forwarded-For" to identify visitors
     behind-proxy: true
     behind-proxy: true
@@ -200,7 +200,7 @@ To configure FCM for your self-hosted instance of the ntfy server, follow these
 
 
 1. Sign up for a [Firebase account](https://console.firebase.google.com/)
 1. Sign up for a [Firebase account](https://console.firebase.google.com/)
 2. Create a Firebase app and download the key file (e.g. `myapp-firebase-adminsdk-...json`)
 2. Create a Firebase app and download the key file (e.g. `myapp-firebase-adminsdk-...json`)
-3. Place the key file in `/etc/ntfy`, set the `firebase-key-file` in `config.yml` accordingly and restart the ntfy server
+3. Place the key file in `/etc/ntfy`, set the `firebase-key-file` in `server.yml` accordingly and restart the ntfy server
 4. Build your own Android .apk following [these instructions](develop.md#android-app)
 4. Build your own Android .apk following [these instructions](develop.md#android-app)
 
 
 Example:
 Example:
@@ -294,7 +294,7 @@ to maintain the client connection and the connection to ntfy.
     ```
     ```
 
 
 ## Config options
 ## Config options
-Each config option can be set in the config file `/etc/ntfy/config.yml` (e.g. `listen-http: :80`) or as a
+Each config option can be set in the config file `/etc/ntfy/server.yml` (e.g. `listen-http: :80`) or as a
 CLI option (e.g. `--listen-http :80`. Here's a list of all available options. Alternatively, you can set an environment
 CLI option (e.g. `--listen-http :80`. Here's a list of all available options. Alternatively, you can set an environment
 variable before running the `ntfy` command (e.g. `export NTFY_LISTEN_HTTP=:80`).
 variable before running the `ntfy` command (e.g. `export NTFY_LISTEN_HTTP=:80`).
 
 
@@ -327,7 +327,7 @@ USAGE:
    ntfy [OPTION..]
    ntfy [OPTION..]
 
 
 GLOBAL OPTIONS:
 GLOBAL OPTIONS:
-   --config value, -c value                           config file (default: /etc/ntfy/config.yml) [$NTFY_CONFIG_FILE]
+   --config value, -c value                           config file (default: /etc/ntfy/server.yml) [$NTFY_CONFIG_FILE]
    --listen-http value, -l value                      ip:port used to as listen address (default: ":80") [$NTFY_LISTEN_HTTP]
    --listen-http value, -l value                      ip:port used to as listen address (default: ":80") [$NTFY_LISTEN_HTTP]
    --firebase-key-file value, -F value                Firebase credentials file; if set additionally publish to FCM topic [$NTFY_FIREBASE_KEY_FILE]
    --firebase-key-file value, -F value                Firebase credentials file; if set additionally publish to FCM topic [$NTFY_FIREBASE_KEY_FILE]
    --cache-file value, -C value                       cache file used for message caching [$NTFY_CACHE_FILE]
    --cache-file value, -C value                       cache file used for message caching [$NTFY_CACHE_FILE]

+ 1 - 1
docs/faq.md

@@ -17,7 +17,7 @@ subscribed to a topic.
 ## Will you know what topics exist, can you spy on me?
 ## Will you know what topics exist, can you spy on me?
 If you don't trust me or your messages are sensitive, run your own server. It's <a href="https://github.com/binwiederhier/ntfy">open source</a>.
 If you don't trust me or your messages are sensitive, run your own server. It's <a href="https://github.com/binwiederhier/ntfy">open source</a>.
 That said, the logs do not contain any topic names or other details about you.
 That said, the logs do not contain any topic names or other details about you.
-Messages are cached for the duration configured in `config.yml` (12h by default) to facilitate service restarts, message polling and to overcome
+Messages are cached for the duration configured in `server.yml` (12h by default) to facilitate service restarts, message polling and to overcome
 client network disruptions.
 client network disruptions.
 
 
 ## Can I self-host it?
 ## Can I self-host it?

+ 3 - 3
docs/install.md

@@ -13,7 +13,7 @@ The ntfy server comes as a statically linked binary and is shipped as tarball, d
 We support amd64, armv7 and arm64.
 We support amd64, armv7 and arm64.
 
 
 1. Install ntfy using one of the methods described below
 1. Install ntfy using one of the methods described below
-2. Then (optionally) edit `/etc/ntfy/config.yml` (see [configuration](config.md))
+2. Then (optionally) edit `/etc/ntfy/server.yml` (see [configuration](config.md))
 
 
 To run the ntfy server, then just run `ntfy serve` (or `systemctl start ntfy` when using the deb/rpm).
 To run the ntfy server, then just run `ntfy serve` (or `systemctl start ntfy` when using the deb/rpm).
 To send messages, use `ntfy publish`. To subscribe to topics, use `ntfy subscribe` (see [subscribing via CLI][subscribe/cli.md]
 To send messages, use `ntfy publish`. To subscribe to topics, use `ntfy subscribe` (see [subscribing via CLI][subscribe/cli.md]
@@ -138,7 +138,7 @@ straight forward to use.
 
 
 The server exposes its web UI and the API on port 80, so you need to expose that in Docker. To use the persistent 
 The server exposes its web UI and the API on port 80, so you need to expose that in Docker. To use the persistent 
 [message cache](config.md#message-cache), you also need to map a volume to `/var/cache/ntfy`. To change other settings, 
 [message cache](config.md#message-cache), you also need to map a volume to `/var/cache/ntfy`. To change other settings, 
-you should map `/etc/ntfy`, so you can edit `/etc/ntfy/config.yml`.
+you should map `/etc/ntfy`, so you can edit `/etc/ntfy/server.yml`.
 
 
 Basic usage (no cache or additional config):
 Basic usage (no cache or additional config):
 ```
 ```
@@ -156,7 +156,7 @@ docker run \
     serve
     serve
 ```
 ```
 
 
-With other config options (configured via `/etc/ntfy/config.yml`, see [configuration](config.md) for details):
+With other config options (configured via `/etc/ntfy/server.yml`, see [configuration](config.md) for details):
 ```bash
 ```bash
 docker run \
 docker run \
   -v /etc/ntfy:/etc/ntfy \
   -v /etc/ntfy:/etc/ntfy \

+ 1 - 1
scripts/postinst.sh

@@ -13,7 +13,7 @@ if [ "$1" = "configure" ] && [ -d /run/systemd/system ]; then
   chmod 700 /var/cache/ntfy
   chmod 700 /var/cache/ntfy
 
 
   # Hack to change permissions on cache file
   # Hack to change permissions on cache file
-  configfile="/etc/ntfy/config.yml"
+  configfile="/etc/ntfy/server.yml"
   if [ -f "$configfile" ]; then
   if [ -f "$configfile" ]; then
     cachefile="$(cat "$configfile" | perl -n -e'/^\s*cache-file: ["'"'"']?([^"'"'"']+)["'"'"']?/ && print $1')" # Oh my, see #47
     cachefile="$(cat "$configfile" | perl -n -e'/^\s*cache-file: ["'"'"']?([^"'"'"']+)["'"'"']?/ && print $1')" # Oh my, see #47
     if [ -n "$cachefile" ]; then
     if [ -n "$cachefile" ]; then

+ 1 - 1
scripts/postrm.sh

@@ -4,7 +4,7 @@ set -e
 # Delete the config if package is purged
 # Delete the config if package is purged
 if [ "$1" = "purge" ]; then
 if [ "$1" = "purge" ]; then
   id ntfy >/dev/null 2>&1 && userdel ntfy
   id ntfy >/dev/null 2>&1 && userdel ntfy
-  rm -f /etc/ntfy/config.yml
+  rm -f /etc/ntfy/server.yml
   rmdir /etc/ntfy || true
   rmdir /etc/ntfy || true
 fi
 fi
 
 

+ 11 - 0
scripts/preinst.sh

@@ -0,0 +1,11 @@
+#!/bin/sh
+set -e
+
+if [ "$1" = "install" ] || [ "$1" = "upgrade" ]; then
+  # Migration of old to new config file name
+  oldconfigfile="/etc/ntfy/config.yml"
+  configfile="/etc/ntfy/server.yml"
+  if [ -f "$oldconfigfile" ] && [ ! -f "$configfile" ]; then
+    mv "$oldconfigfile" "$configfile" || true
+  fi
+fi

+ 2 - 3
config/config.go → server/config.go

@@ -1,5 +1,4 @@
-// Package config provides the main configuration
-package config
+package server
 
 
 import (
 import (
 	"time"
 	"time"
@@ -53,7 +52,7 @@ type Config struct {
 }
 }
 
 
 // New instantiates a default new config
 // New instantiates a default new config
-func New(listenHTTP string) *Config {
+func NewConfig(listenHTTP string) *Config {
 	return &Config{
 	return &Config{
 		ListenHTTP:                   listenHTTP,
 		ListenHTTP:                   listenHTTP,
 		ListenHTTPS:                  "",
 		ListenHTTPS:                  "",

+ 3 - 3
config/config_test.go → server/config_test.go

@@ -1,12 +1,12 @@
-package config_test
+package server_test
 
 
 import (
 import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/assert"
-	"heckel.io/ntfy/config"
+	"heckel.io/ntfy/server"
 	"testing"
 	"testing"
 )
 )
 
 
 func TestConfig_New(t *testing.T) {
 func TestConfig_New(t *testing.T) {
-	c := config.New(":1234")
+	c := server.NewConfig(":1234")
 	assert.Equal(t, ":1234", c.ListenHTTP)
 	assert.Equal(t, ":1234", c.ListenHTTP)
 }
 }

+ 0 - 0
config/ntfy.service → server/ntfy.service


+ 4 - 5
server/server.go

@@ -9,7 +9,6 @@ import (
 	"firebase.google.com/go/messaging"
 	"firebase.google.com/go/messaging"
 	"fmt"
 	"fmt"
 	"google.golang.org/api/option"
 	"google.golang.org/api/option"
-	"heckel.io/ntfy/config"
 	"heckel.io/ntfy/util"
 	"heckel.io/ntfy/util"
 	"html/template"
 	"html/template"
 	"io"
 	"io"
@@ -28,7 +27,7 @@ import (
 
 
 // Server is the main server, providing the UI and API for ntfy
 // Server is the main server, providing the UI and API for ntfy
 type Server struct {
 type Server struct {
-	config   *config.Config
+	config   *Config
 	topics   map[string]*topic
 	topics   map[string]*topic
 	visitors map[string]*visitor
 	visitors map[string]*visitor
 	firebase subscriber
 	firebase subscriber
@@ -112,7 +111,7 @@ const (
 
 
 // New instantiates a new Server. It creates the cache and adds a Firebase
 // New instantiates a new Server. It creates the cache and adds a Firebase
 // subscriber (if configured).
 // subscriber (if configured).
-func New(conf *config.Config) (*Server, error) {
+func New(conf *Config) (*Server, error) {
 	var firebaseSubscriber subscriber
 	var firebaseSubscriber subscriber
 	if conf.FirebaseKeyFile != "" {
 	if conf.FirebaseKeyFile != "" {
 		var err error
 		var err error
@@ -138,7 +137,7 @@ func New(conf *config.Config) (*Server, error) {
 	}, nil
 	}, nil
 }
 }
 
 
-func createCache(conf *config.Config) (cache, error) {
+func createCache(conf *Config) (cache, error) {
 	if conf.CacheDuration == 0 {
 	if conf.CacheDuration == 0 {
 		return newNopCache(), nil
 		return newNopCache(), nil
 	} else if conf.CacheFile != "" {
 	} else if conf.CacheFile != "" {
@@ -147,7 +146,7 @@ func createCache(conf *config.Config) (cache, error) {
 	return newMemCache(), nil
 	return newMemCache(), nil
 }
 }
 
 
-func createFirebaseSubscriber(conf *config.Config) (subscriber, error) {
+func createFirebaseSubscriber(conf *Config) (subscriber, error) {
 	fb, err := firebase.NewApp(context.Background(), nil, option.WithCredentialsFile(conf.FirebaseKeyFile))
 	fb, err := firebase.NewApp(context.Background(), nil, option.WithCredentialsFile(conf.FirebaseKeyFile))
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err

+ 1 - 1
config/config.yml → server/server.yml

@@ -1,4 +1,4 @@
-# ntfy config file
+# ntfy server config file
 
 
 # Listen address for the HTTP & HTTPS web server. If "listen-https" is set, you must also
 # Listen address for the HTTP & HTTPS web server. If "listen-https" is set, you must also
 # set "key-file" and "cert-file".
 # set "key-file" and "cert-file".

+ 2 - 3
server/visitor.go

@@ -2,7 +2,6 @@ package server
 
 
 import (
 import (
 	"golang.org/x/time/rate"
 	"golang.org/x/time/rate"
-	"heckel.io/ntfy/config"
 	"heckel.io/ntfy/util"
 	"heckel.io/ntfy/util"
 	"sync"
 	"sync"
 	"time"
 	"time"
@@ -14,14 +13,14 @@ const (
 
 
 // visitor represents an API user, and its associated rate.Limiter used for rate limiting
 // visitor represents an API user, and its associated rate.Limiter used for rate limiting
 type visitor struct {
 type visitor struct {
-	config        *config.Config
+	config        *Config
 	limiter       *rate.Limiter
 	limiter       *rate.Limiter
 	subscriptions *util.Limiter
 	subscriptions *util.Limiter
 	seen          time.Time
 	seen          time.Time
 	mu            sync.Mutex
 	mu            sync.Mutex
 }
 }
 
 
-func newVisitor(conf *config.Config) *visitor {
+func newVisitor(conf *Config) *visitor {
 	return &visitor{
 	return &visitor{
 		config:        conf,
 		config:        conf,
 		limiter:       rate.NewLimiter(rate.Every(conf.VisitorRequestLimitReplenish), conf.VisitorRequestLimitBurst),
 		limiter:       rate.NewLimiter(rate.Every(conf.VisitorRequestLimitReplenish), conf.VisitorRequestLimitBurst),