介绍

Gotify 是用 Go 编写的跨平台开源消息推送服务。

gotify/server

项目的核心,具有 WebUI 和以下功能

  • 通过 REST-API 发送消息
  • 通过 websocket 连接订阅/接收消息
  • 管理用户、客户端和应用程序

gotify/android

  • 一个用于订阅 gotify/server 的消息流的 Android 客户端,应用会根据新收到的消息创建推送通知

gotify/cli

  • 一个命令行客户端,用于将消息推送到 gotify/server,正常情况不需要此项。

部署方式

Docker部署

拉取镜像

Docker 和 Docker-Compose 安装 请点击参考此处

1
2
# 拉取镜像
docker pull gotify/server:latest

配置 Gotify

此处采用 Docker-Compose 进行部署,环境变量进行配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
version: "3"

services:
gotify:
image: gotify/server:latest
container_name: gotify
restart: always
network_mode: bridge
ports:
- 8989:80
environment:
- TZ=Asia/Shanghai # 时区
- GOTIFY_SERVER_PORT=80 # 监听端口
- GOTIFY_SERVER_KEEPALIVEPERIODSECONDS=0 # 0 = 使用默认(15秒);-1 = 禁用 keepalive;设置发送 keepalive 数据包的间隔
- GOTIFY_SERVER_LISTENADDR= # 监听地址,留空默认监听所有地址
- GOTIFY_SERVER_SSL_ENABLED=false # 是否启用 HTTPS,如需在反向代理中配置 HTTPS,请关闭此选项
- GOTIFY_SERVER_SSL_REDIRECTTOHTTPS=true #如果通过 HTTP 访问站点,是否重定向到 HTTPS
- GOTIFY_SERVER_SSL_LISTENADDR= # 监听地址,留空默认监听所有地址
- GOTIFY_SERVER_SSL_PORT=443 # HTTPS 端口
- GOTIFY_SERVER_SSL_CERTFILE= # 证书文件(使用 Let's Encrypt 时留空)
- GOTIFY_SERVER_SSL_CERTKEY= # 证书密钥(使用 Let's Encrypt 时留空)
- GOTIFY_SERVER_SSL_LETSENCRYPT_ENABLED=false # 是否从 Let's Encrypt 请求证书
- GOTIFY_SERVER_SSL_LETSENCRYPT_ACCEPTTOS=false # 是否接受 Let's Encrypt 的TOS
- GOTIFY_SERVER_SSL_LETSENCRYPT_CACHE=data/certs # Let's Encrypt 的缓存目录
# - GOTIFY_SERVER_SSL_LETSENCRYPT_HOSTS=- mydomain.tld\n- myotherdomain.tld # Let's Encrypt绑定证书的主机域名
# - GOTIFY_SERVER_RESPONSEHEADERS="X-Custom-Header: \"chengotify\"" # 响应标头将添加到每个响应中(默认:无)

# 仅在需要时设置 cors 头,并支持多个允许的来源。覆盖响应头中的 Access-Control-* 头。
# - GOTIFY_SERVER_CORS_ALLOWORIGINS="- \".+.example.com\"\n- \"otherdomain.com\""
# - GOTIFY_SERVER_CORS_ALLOWMETHODS="- \"GET\"\n- \"POST\""
# - GOTIFY_SERVER_CORS_ALLOWHEADERS="- \"Authorization\"\n- \"content-type\""

# - GOTIFY_SERVER_STREAM_ALLOWEDORIGINS="- \".+.example.com\"\n- \"otherdomain.com\"" # 允许 WebSocket 连接的来源(始终允许相同的来源)
- GOTIFY_SERVER_STREAM_PINGPERIODSECONDS=45 # 发送 WebSocket ping 的间隔
- GOTIFY_DATABASE_DIALECT=sqlite3 # 关于数据库,请查看(配置数据库部分)
- GOTIFY_DATABASE_CONNECTION=data/gotify.db # 创建一个默认的管理员用户
- GOTIFY_DEFAULTUSER_NAME=admin # 默认用户的用户名
- GOTIFY_DEFAULTUSER_PASS=admin # 默认用户的密码
- GOTIFY_PASSSTRENGTH=10 # Bcrypt 密码强度(越高越好,但也越慢)
- GOTIFY_UPLOADEDIMAGESDIR=data/images # 用于存储上传图片的目录
- GOTIFY_PLUGINSDIR=data/plugins # 插件所在的目录
- GOTIFY_REGISTRATION=false # 是否启用注册
volumes:
- "./gotify_data:/app/data"

部署

1
docker-compose up -d 

基于官方二进制文件部署

支持的平台

  • linux-amd64 (64bit)
  • linux-386 (32bit)
  • arm-7 (32bit used for Raspberry Pi)
  • arm64 (ARMv8)
  • windows-386.exe (32bit)
  • windows-amd64.exe (64bit)

拉取文件

请自行将 {VERSION} {PLATFORM} 进行替换,{VERSION} 为版本号,{PLATFORM} 为使用平台,点击查看最新版本

1
2
3
mkdir gotify
cd gotify
wget https://github.com/gotify/server/releases/download/v{VERSION}/gotify-{PLATFORM}.zip

解压文件

1
unzip gotify-{PLATFORM}.zip

更改权限

1
chmod +x gotify-{PLATFORM}

修改默认配置

在二进制文件同目录下新建config.yml文件

1
touch config.yml

以下为配置文件内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
server:
keepaliveperiodseconds: 0 # 0 = 使用默认(15秒);-1 = 禁用 keepalive;设置发送 keepalive 数据包的间隔
listenaddr: "" # 监听地址,留空默认监听所有地址
port: 80 # 监听端口

ssl:
enabled: false # 是否启用 HTTPS,如需在反向代理中配置 HTTPS,请关闭此选项
redirecttohttps: true # 如果通过 HTTP 访问站点,是否重定向到 HTTPS
listenaddr: "" # 监听地址,留空默认监听所有地址
port: 443 # HTTPS 端口
certfile: # 证书文件(使用 Let's Encrypt 时留空)
certkey: # 证书密钥(使用 Let's Encrypt 时留空)
letsencrypt:
enabled: false # 是否从 Let's Encrypt 请求证书
accepttos: false # 是否接受 Let's Encrypt 的 TOS
cache: data/certs # Let's Encrypt 的缓存目录
hosts: # Let's Encrypt 绑定证书的主机域名
# - mydomain.tld
# - myotherdomain.tld

responseheaders: # 响应标头将添加到每个响应中(默认:无)
# X-Custom-Header: "custom value"

cors: # 仅在需要时设置 cors 头,并支持多个允许的来源。覆盖响应头中的 Access-Control-* 头。
alloworigins:
# - ".+.example.com"
# - "otherdomain.com"
allowmethods:
# - "GET"
# - "POST"
allowheaders:
# - "Authorization"
# - "content-type"
stream:
pingperiodseconds: 45 # 发送 WebSocket ping 的间隔
allowedorigins: # 允许 WebSocket 连接的来源(始终允许相同的来源)
# - ".+.example.com"
# - "otherdomain.com"

database: # 关于数据库,请查看(配置数据库部分)
dialect: sqlite3
connection: data/gotify.db

defaultuser: # 创建一个默认的管理员用户
name: admin # 默认用户的用户名
pass: admin # 默认用户的密码
passstrength: 10 # Bcrypt 密码强度(越高越好,但也越慢)
uploadedimagesdir: data/images # 用于存储上传图片的目录
pluginsdir: data/plugins # 插件所在的目录
registration: false # 是否启用注册

执行二进制文件

1
./gotify-{PLATFORM}

数据库配置(可选)

使用 Postgres 时如果数据库连接启用了 SSL,请去除 sslmode=disable

DialectConnection
sqlite3path/to/database.db
mysqlgotify:secret@tcp(localhost:3306)/gotifydb?charset=utf8&parseTime=True&loc=Local
postgreshost=localhost port=5432 user=gotify dbname=gotifydb password=secret sslmode=disable

反向代理(可选)

部分内容摘抄于官方文档

Nginx

根目录部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
upstream gotify {
# 设置端口为你在 gotify 中使用的端口
server 127.0.0.1:1245;
}

server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name push.example.com;
return 301 https://$host$request_uri;

# SSL配置
ssl_certificate 证书文件位置;
ssl_certificate_key 证书密钥位置;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

location / {
proxy_pass http://gotify;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto http;
proxy_redirect http:// $scheme://;
proxy_set_header Host $http_host;

# 设置超时时间,以便 Websocket 保持连接
proxy_connect_timeout 1m;
proxy_send_timeout 1m;
proxy_read_timeout 1m;
}
}

子目录部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
upstream gotify {
# 设置端口为你在 gotify 中使用的端口
server 127.0.0.1:1245;
}

server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name push.example.com;
return 301 https://$host$request_uri;

# SSL配置
ssl_certificate 证书文件位置;
ssl_certificate_key 证书密钥位置;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

llocation /gotify/ {
proxy_pass http://gotify;
rewrite ^/gotify(/.*) $1 break;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto http;
proxy_redirect http:// $scheme://;
proxy_set_header Host $http_host;

# 设置超时时间,以便 Websocket 保持连接
proxy_connect_timeout 1m;
proxy_send_timeout 1m;
proxy_read_timeout 1m;
}
}

Caddy 2

根目录部署

1
2
3
4
5
gotify.example.com {
# 设置端口为你在 gotify 中使用的端口
# Websocket 支持、代理头等默认启用
reverse_proxy localhost:1245
}

子目录部署

1
2
3
4
5
6
7
8
9
gotify.example.com {
route /gotify/* {
uri strip_prefix /gotify
# 设置端口为你在 gotify 中使用的端口
# Websocket 支持、代理头等默认启用
reverse_proxy localhost:1245
}
redir /gotify /gotify/
}