前言

最近在上某绿色网站以及和本站站友交流时候发现了一个问题就是pm总是接收不到消息,虽然本站是有tg私信通知的,但是tg接收不到消息又是一个问题,虽然可以通过fcm来解决,不过国内的手机emmm,就一眼难尽了,好在在使用matrix服务器时候也找到了一个工具,既可以作为push client来使用又可以使用unifiedpush来进行推送,就是ntfy

自建服务器

虽然ntfy提供了官方的服务器,但是经过我的测试,如果其他用户知道你的后缀便可以监控你的服务器,所以还是自建服务器比较合适相信本站的用户必定人手一个服务器,所以不在话下,反代软件是traefik,可自行选择删改

安装必须软件包

总有一款适合你

apk add neovim
apt install neovim
dnf install neovim
pacman -S neovim

首先创建一个文件夹,比如

mkdir ntfy&&cd ntfy

在其中创建traefik的文件夹并写入配置,如下

mkdir proxy
nvim proxy/traefik.yaml
>>>
api:
  dashboard: false
  # 安全模式
  insecure: true

providers:
  file:
    directory: /etc/traefik/directory
    watch: true

entryPoints:
  web:
    address: ":38080"
  websecure:
    address: ":38443"

certificatesResolvers:
  letsencrypt:
    acme:
      email: "ssl@domain.com"
      storage: "/etc/traefik/acme.json"
      httpChallenge:
        entryPoint: websecure

middlewares:
  hsts:
    headers:
      stsSeconds: 15552000
      stsIncludeSubdomains: true

Podman&Docker部署

运行以下脚本哈,一步到位,记得修改你的域名,如果是docker用户将podman改为docker即可,rootless用户需要自行设置高位端口和防火墙规则

nvim run.sh
>>>
#!/bin/bash
podman run -d \
  --name ntfy \
  --network traefik-network \
  -e TZ="Asia/Shanghai" \
  -e NTFY_BASE_URL="https://push.yourdomain.com" \
  -e NTFY_CACHE_FILE="/var/lib/ntfy/cache.db" \
  -e NTFY_AUTH_FILE="/var/lib/ntfy/auth.db" \
  -e NTFY_AUTH_DEFAULT_ACCESS="deny-all" \
  -e NTFY_BEHIND_PROXY="true" \
  -e NTFY_ATTACHMENT_CACHE_DIR="/var/lib/ntfy/attachments" \
  -v "./push:/var/lib/ntfy" \
  docker.io/binwiederhier/ntfy serve

podman run -d \
  --name traefik \
  --network traefik-network \
  -p 80:38080 \
  -p 443:38443 \
  -v "./proxy:/etc/traefik" \
  docker.io/library/traefik:latest

Docker compose

目前podman也是兼容compose的,只是有很多兼容性问题,不建议用哈,使用docker compose可以一步到位,不用在下述再配置反代,运行vim,写入以下文件到compose文件

nvim compose.yml
>>>
# version: '3.8' 最新docker版本弃用了哈

services:
  ntfy:
    image: docker.io/binwiederhier/ntfy
    container_name: ntfy
    environment:
      - TZ=Asia/Shanghai
      - NTFY_BASE_URL=https://push.yourdomain.com
      - NTFY_CACHE_FILE=/var/lib/ntfy/cache.db
      - NTFY_AUTH_FILE=/var/lib/ntfy/auth.db
      - NTFY_AUTH_DEFAULT_ACCESS=deny-all
      - NTFY_BEHIND_PROXY=true
      - NTFY_ATTACHMENT_CACHE_DIR=/var/lib/ntfy/attachments
    volumes:
      - ./push:/var/lib/ntfy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nfty.rule=Host(`push.yourdomain.com`)"
      - "traefik.http.routers.nfty.service=nety-service"
      - "traefik.http.routers.nfty.entrypoints=websecure"
      - "traefik.http.routers.nfty.tls.certresolver=letsencrypt"
      - "traefik.http.services.nfty-service.loadbalancer.server.port=80"
    networks:
      - traefik-network
    command: serve

  traefik:
    image: docker.io/library/traefik:latest
    container_name: traefik
    ports:
      - "80:38080"
      - "443:38443"
    volumes:
      - ./proxy:/etc/traefik
    networks:
      - traefik-network

# 可写可不写,compose会自动创建network
networks:
  traefik-network:
    driver: bridge

NixOS

使用nixos则较为复杂,目前比较完善的是home-manager的podman module,可以使用rootless的systemd管理使用以下配置,然后运行nixos rebuild即可,会使用nixos的一看就懂

{ config, pkgs, ... }:

let
  baseDir = "/home/${your users}/Ntfy";
in
{
  services.podman = {
    enable = true;

    # Networks
    networks = {
      traefik-network = {
        autoStart = true;
      };
    };

    # Containers
    containers = {

      # Ntfy Push
      ntfy = {
        image = "docker.io/binwiederhier/ntfy";
        autoStart = true;
        environment = {
          TZ = "Asia/Shanghai";
          NTFY_BASE_URL = "https://push.yourdomain.com";
          NTFY_CACHE_FILE = "/var/lib/ntfy/cache.db";
          NTFY_AUTH_FILE = "/var/lib/ntfy/auth.db";
          NTFY_AUTH_DEFAULT_ACCESS = "deny-all";
          NTFY_BEHIND_PROXY = "true";
          NTFY_ATTACHMENT_CACHE_DIR = "/var/lib/ntfy/attachments";
        };
        volumes = [ "${baseDir}/push:/var/lib/ntfy" ];
        network = [ "traefik-network" ];
        exec = "serve";
      };

      # Traefik Proxy
      traefik = {
        image = "docker.io/library/traefik:latest";
        autoStart = true;
        ports = [
          "38080:80"
          "38443:443" # rootless不允许使用特权端口,需要设置端口转发
        ];
        volumes = [ "${baseDir}/proxy:/etc/traefik" ];
        network = [ "traefik-network" ];
      };
    };
  };
}

端口转发

  # 使用 iptables 进行端口转发
  networking.firewall.extraCommands = ''
    iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 38080

    iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 38443

  '';

反代

Traefik反代

mkdir proxy/directory/
nvim proxy/directory/ntfy.yml
>>>
http:
  routers:
    nety:
      rule: "Host(`push.yourdomain.com`)"
      service: "nety-service"
      entryPoints:
        - "websecure"
      tls:
        certResolver: letsencrypt

  services:
    nety-service:
      loadBalancer:
        servers:
          - url: "http://ntfy"

这里注意一下如果要套cf记得开启full tls模式

Nginx反代

deepseek

openai

服务端设置

具体参考官网

创建用户

根据提示创建用户

docker exec ntfy ntfy user --help

可以注意到我开启了deny模式,这个模式下不登陆是无法使用我们的服务器的,所以我们需要设置acl规则使unifiedpush可以正常运行

UnifiedPush 要求应用程序服务器(例如 Synapse、Fediverse Server 等)对用于推送消息的主题具有匿名写入访问权限。UnifiedPush 使用的主题名称均以 up* 前缀开头。有关更多详细信息,请参阅 UnifiedPush 文档

要为私有服务器启用对 UnifiedPush 的支持(即 auth-default-access: "deny-all" ),您应该允许对整个前缀进行匿名写入访问

docker或者podman
docker exec ntfy ntfy access '*' 'up*' write-only

或者明确允许每个主题进行匿名写入访问:

docker exec ntfy ntfy access '*' upYzMtZGZiYTY5 write-only

客户端布置

不想贴图,纯文字

Ntfy客户端

打开软件,点击右上角,点击设置,点击默认服务器,输入你自己的服务器,点击管理用户,输入你的用户名和密码

TG客户端

这里推荐使用nagram,点击左上角三个杠杠,点击设置,点击N-设置,点击通用,向下翻到最低找到通知推送服务,点击选择unified push即可