Ubuntu 22.04 安装 Gotify 3.1.1 指南

Ubuntu 22.04 服务器从零安装 Gotify 3.1.1 逐命令实测:官方 zip 校验与部署、专用用户与 systemd 加固托管、两例启动 FTL 排障实录、换端口与日志级别闭环、离线安装与升级卸载。

Gotify即时通信Gotify2026/10/21

Ubuntu 22.04 安装 Gotify 3.1.1 指南

目标:在一台 Ubuntu 22.04 服务器上,从零安装 Go 单二进制的自托管推送通知服务 Gotify 3.1.1,并完成专用用户运行、systemd 开机自启、配置落盘与健康验证,覆盖在线安装与离线安装两种方案、升级与卸载。全部命令与回显均在 Ubuntu 22.04(x86_64)环境逐条实测通过,实测端口为 8144(8128-8152 槽位约定,标准默认端口为 80,正文同时给出两者语义)。

一、环境信息

本章列出实测环境与安装产物的落点,命令与回显均来自该环境。

  • 操作系统:Ubuntu 22.04.4 LTS(Jammy Jellyfish),x86_64;
  • 内核与 systemd:PID 1 为 systemd(systemd 托管服务为标准方式);
  • 软件版本:Gotify 3.1.1(上游最新稳定版,发布于 2026-09-15;与《Gotify 3.1.1 介绍与选型指南》溯源版本一致,文内各命令输出均来自该版本);
  • 安装形态:官方发布 zip 内的单文件二进制 + systemd 托管(Ubuntu 22.04 无官方 apt 包,见 3.2 节实查);
  • 端口规划:Gotify 3.x 默认监听 80;本文实验环境按 8128-8152 端口槽位约定绑定 8144(配置项 GOTIFY_SERVER_PORT),生产服务器可用任意空闲端口或保持 80 后置于反代之后;
  • 目录规划:
    • 程序目录:/opt/gotify(二进制 /opt/gotify/gotify);
    • 配置目录:/etc/gotify(环境变量文件 /etc/gotify/server.env);
    • 数据目录:/var/lib/gotify(SQLite 数据库、上传图片、插件);
  • 运行身份:专用系统用户 gotify(禁止登录 shell)。

二、前置条件

安装开始前需要确认的服务器条件如下,逐项给出验证命令与实测回显。

2.1 系统与权限

需要 root 权限(sudo -i 或直接 root 会话)与 systemd 环境。确认系统版本与架构:

grep -E '^(NAME|VERSION)=' /etc/os-release && uname -m

实测回显:

NAME="Ubuntu"
VERSION="22.04.4 LTS (Jammy Jellyfish)"
x86_64

2.2 依赖工具

需要 curl(下载)、unzip(解压官方 zip 分发包)与 sha256sum(完整性校验,coreutils 自带)。Ubuntu 22.04 最小安装即含 curl 与 sha256sum,unzip 按需安装:

apt-get install -y unzip

实测回显(本机已安装,输出为已装状态提示):

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
unzip is already the newest version (6.0-26ubuntu3.2).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

2.3 端口占用检查

确认规划端口未被占用。查 8144:

ss -ltn | grep ':8144 ' || echo 'port 8144 free'

实测回显:

port 8144 free

⚠️ 注意:Gotify 默认监听 80 端口,若服务器已运行 Nginx 等 Web 服务,80 必然冲突——必须通过环境变量改绑其他端口(见 7.2 节),或让 Gotify 监听本机回环、由反代对外。

三、版本选型说明

3.1 版本认定

上游最新稳定版为 3.1.1(2026-09-15 发布,查询日期 2026-10-21,来源:GitHub gotify/server Releases Atom 流与 releases/latest 重定向)。本文即以 3.1.1 安装实测。获取最新版本号的命令(利用 releases/latest 的重定向):

curl -s -o /dev/null -w '%{url_effective}\n' -L https://github.com/gotify/server/releases/latest

实测回显:

https://github.com/gotify/server/releases/tag/v3.1.1

3.2 无官方 apt 包的实查

Ubuntu 22.04 官方源不含 Gotify。用 apt 实查(空结果即无包):

apt-cache policy gotify; apt-cache search gotify

实测回显(policy 无输出、search 无结果,退出码 0):

(两条命令均无任何输出行)

⚠️ 注意:官方也没有发布 deb 包,gotify.net/docs/install 给出的安装形态只有「per-platform zip 二进制」与「Docker 镜像」两种;Alpine 社区仓库收录的 gotify 包(2.9.1)不适用于 Ubuntu。因此 Ubuntu 服务器上的标准安装方式就是本文主线:官方 zip 二进制 + systemd 托管。

3.3 发布包与校验值

3.1.1 的 linux-amd64 发布包(实测下载于查询日):

项目值
下载 URLhttps://github.com/gotify/server/releases/download/v3.1.1/gotify-linux-amd64.zip
文件大小15552390 字节
SHA256d452faad071981d191d5c95f70d0f9520dc2ef2336b2b03055e12cfabfbae2d2
包内内容gotify-linux-amd64(约 40MB ELF 可执行文件)、LICENSE、licenses/ 目录

💡 说明:上游未随 Release 发布官方 SHA256 清单,建议从官方 GitHub Release 页面下载后自行计算比对(安装历史版本时,把校验值与你的下载留档比对,防止传输损坏)。服务器访问 GitHub 缓慢时可为 wget/curl 追加代理参数(如 -x http://<代理地址>:<端口>)。

四、在线安装方案(A:官方 zip 二进制 + systemd)

本章是主线方案:下载官方 zip、安装到 /opt/gotify、以专用用户落配置、systemd 托管并验证。全章命令按顺序执行即可完成从零到可用。

4.1 下载发布包并校验

创建下载目录(本文把安装期产物集中在 /opt/data/quzuo/tmp/gotify/downloads,可按需换成任意工作目录),下载并计算校验值:

mkdir -p /opt/data/quzuo/tmp/gotify/downloads && cd /opt/data/quzuo/tmp/gotify/downloads
curl -x http://192.168.1.62:7897 -LO https://github.com/gotify/server/releases/download/v3.1.1/gotify-linux-amd64.zip
ls -la gotify-linux-amd64.zip && sha256sum gotify-linux-amd64.zip

实测回显:

--  curl 进度条略  --
code:200 size:15552390
total 15196
drwxr-xr-x 2 root root     4096 10月 21 19:45 .
drwxr-xr-x 3 root root     4096 10月 21 19:45 ..
-rw-r--r-- 1 root root 15552390 10月 21 19:45 gotify-linux-amd64.zip
d452faad071981d191d5c95f70d0f9520dc2ef2336b2b03055e12cfabfbae2d2  gotify-linux-amd64.zip

下载耗时视网络而定;内网直连 GitHub 不通时保留 -x 代理参数,可直连时去掉。

4.2 解压并核对包内容

unzip -o gotify-linux-amd64.zip -d extracted
ls -la extracted/ && file extracted/gotify-linux-amd64

实测回显:

Archive:  gotify-linux-amd64.zip
  inflating: extracted/gotify-linux-amd64
  inflating: extracted/LICENSE
   creating: extracted/licenses/
total 41776
drwxr-xr-x 3 root root     4096 10月 21 19:46 .
drwxr-xr-x 2 root root     4096 10月 21 19:46 ..
-rwxr-xr-x 1 root root 42760392  9月 16 02:29 gotify-linux-amd64
-rw-r--r-- 1 root root     1216  9月 16 02:20 LICENSE
drwxr-xr-x 2 root root     4096  9月 16 02:35 licenses
extracted/gotify-linux-amd64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=aaf8e9402462e6c4a36db48fa714f4444cc8d2bb, for GNU/Linux 3.2.0, stripped

⚠️ 注意:该二进制虽为 Go 编译产物,但链接了 CGO(SQLite 驱动需要),是 dynamically linked,依赖 glibc/libstdc++ 等基础库——Ubuntu 22.04 最小安装即满足,无需额外安装依赖。

4.3 创建专用系统用户

以无家目录、禁止登录的系统用户运行服务,满足最小权限原则:

useradd -r -s /usr/sbin/nologin gotify
id gotify

实测回显:

uid=999(gotify) gid=999(gotify) groups=999(gotify)

4.4 安装二进制到 /opt/gotify

mkdir -p /opt/gotify
cp extracted/gotify-linux-amd64 /opt/gotify/gotify
chmod 755 /opt/gotify/gotify
chown -R gotify:gotify /opt/gotify
ls -la /opt/gotify/

实测回显:

total 41768
drwxr-xr-x 2 gotify gotify     4096 10月 21 19:47 .
drwxr-xr-x 7 root   root       4096 10月 21 19:45 ..
-rwxr-xr-x 1 gotify gotify 42760392 10月 21 19:47 gotify

安装后即可核验版本(version 子命令,3.0.0 起提供 CLI):

/opt/gotify/gotify version

实测回显(Go 构建依赖清单较长,此处为首尾节选):

Version: 3.1.1
Commit: e6361caa512547052b1013dbf4544e6d7ff32604
Build Date: 2026-09-15-18:26:53
Go Build Info:
go      go1.26.0
path    github.com/gotify/server/v3
mod     github.com/gotify/server/v3     v3.1.1+dirty
dep     filippo.io/edwards25519 v1.1.0  h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
  ……(中间为 gin、gorm、gorilla/websocket、zerolog、zitadel/oidc 等依赖清单,略)……
build   -ldflags="-w -s -X main.Version=3.1.1 -X main.BuildDate=2026-09-15-18:26:53 -X main.Commit=e6361caa512547052b1013dbf4544e6d7ff32604 -X main.Mode=prod"
build   GOARCH=amd64
build   GOOS=linux

4.5 创建目录与环境变量配置文件

Gotify 3.x 的全部配置通过环境变量注入。按「程序/配置/数据」三分目录落盘,并预先建好图片与插件目录:

mkdir -p /etc/gotify /var/lib/gotify/images /var/lib/gotify/plugins
chown -R gotify:gotify /var/lib/gotify
chmod 750 /var/lib/gotify
chown root:gotify /etc/gotify
chmod 750 /etc/gotify

写入环境变量文件 /etc/gotify/server.env(实验端口 8144,初始管理员 admin/q1w2e3r4,演示口令,生产必须更换):

cat > /etc/gotify/server.env <<'EOF'
# Gotify 3.1.1 服务端环境变量配置(systemd EnvironmentFile 加载)
GOTIFY_LOGLEVEL=info

# HTTP 监听
GOTIFY_SERVER_LISTENADDR=
GOTIFY_SERVER_PORT=8144

# 数据库(默认 SQLite,单文件)
GOTIFY_DATABASE_DIALECT=sqlite3
GOTIFY_DATABASE_CONNECTION=/var/lib/gotify/gotify.db

# 初始管理员(仅在首次建库时生效)
GOTIFY_DEFAULTUSER_NAME=admin
GOTIFY_DEFAULTUSER_PASS=q1w2e3r4

# 密码哈希 bcrypt cost
GOTIFY_PASSSTRENGTH=10

# 上传图片与插件目录
GOTIFY_UPLOADEDIMAGESDIR=/var/lib/gotify/images
GOTIFY_PLUGINSDIR=/var/lib/gotify/plugins

# 关闭公开注册
GOTIFY_REGISTRATION=false
EOF
chmod 640 /etc/gotify/server.env
chown root:gotify /etc/gotify/server.env
ls -la /etc/gotify/ /var/lib/gotify/

实测回显:

/etc/gotify/:
total 12
drwxr-x---  2 root   gotify 4096 10月 21 19:54 .
drwxr-xr-x 87 root   root   4096 10月 21 19:50 ..
-rw-r-----  1 root   gotify 1024 10月 21 19:54 server.env
/var/lib/gotify/:
total 20
drwxr-x---  4 gotify gotify 4096 10月 21 20:08 .
drwxr-xr-x 87 root   root   4096 10月 21 19:50 ..
-rw-r--r--  1 gotify gotify 69632 10月 21 20:08 gotify.db
drwxr-xr-x  2 gotify gotify 4096 10月 21 19:50 images
drwxr-xr-x  2 gotify gotify 4096 10月 21 19:50 plugins

(gotify.db 在首次启动后自动生成。)

⚠️ 注意:/etc/gotify 目录属主必须是 root:gotify 且组有执行位(750),否则 gotify 用户无法穿越目录读取 server.env,服务会以 permission denied 崩溃(排障实录见 8.2 节)。

4.6 编写 systemd 单元

创建 /etc/systemd/system/gotify.service。三个要点:EnvironmentFile= 加载 env 文件;显式设置 GOTIFY_CONFIG_FILE(避免配置搜索序探测 $HOME 导致的启动失败,排障实录见 8.1 节);基础沙箱加固(ProtectSystem=strict + ReadWritePaths 只放行数据目录):

cat > /etc/systemd/system/gotify.service <<'EOF'
[Unit]
Description=Gotify - a simple server for sending and receiving messages
Documentation=https://gotify.net/docs/
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=gotify
Group=gotify
WorkingDirectory=/var/lib/gotify
EnvironmentFile=/etc/gotify/server.env
Environment=GOTIFY_CONFIG_FILE=/etc/gotify/server.env
ExecStart=/opt/gotify/gotify serve
Restart=on-failure
RestartSec=5

# 基础加固
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/gotify
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF
chmod 644 /etc/systemd/system/gotify.service

配置要点逐项说明:

配置项取值说明
User / Groupgotify专用系统用户,服务不持 root 权限
WorkingDirectory/var/lib/gotifySQLite 数据库等相对路径的基准目录
EnvironmentFile/etc/gotify/server.envsystemd 侧加载环境变量
Environment=GOTIFY_CONFIG_FILE/etc/gotify/server.env告知 Gotify 只读该配置文件,跳过 $HOME 搜索序(3.x 配置加载语义)
ExecStart/opt/gotify/gotify serve3.x 必须带 serve 子命令启动服务
Restart=on-failure5 秒退避异常退出自动拉起
ProtectSystem=strict + ReadWritePaths/var/lib/gotify全文件系统只读,仅数据目录可写
ProtectHome=true—家目录不可见(需要显式 GOTIFY_CONFIG_FILE 的原因见 8.1 节)

💡 说明:官方文档(gotify.net/docs/systemd)给出的示例单元是 root 运行的极简版(User=root、相对路径数据目录),仅作演示用途;本文单元在其基础上改为专用用户 + 环境变量配置 + 只读加固,更贴近生产。

4.7 启动并验证

systemctl daemon-reload
systemctl enable --now gotify

实测回显:

Created symlink /etc/systemd/system/multi-user.target.wants/gotify.service → /etc/systemd/system/gotify.service.

验证一:服务状态(active (running)、主进程 /opt/gotify/gotify serve、内存占用约 6MB):

systemctl status gotify --no-pager -l

实测回显:

● gotify.service - Gotify - a simple server for sending and receiving messages
     Loaded: loaded (/etc/systemd/system/gotify.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2026-10-21 20:08:52 CST; 5min ago
       Docs: https://gotify.net/docs/
   Main PID: 143060 (gotify)
      Tasks: 11 (limit: 629145)
     Memory: 6.2M
        CPU: 43ms
     CGroup: /system.slice/gotify.service
             └─143060 /opt/gotify/gotify serve

10月 21 20:08:52 ops systemd[1]: Started Gotify - a simple server for sending and receiving messages.

验证二:端口监听(8144):

ss -ltn | grep 8144

实测回显:

LISTEN 0      4096               *:8144             *:*

验证三:健康检查与版本端点:

curl -s http://127.0.0.1:8144/health; echo
curl -s http://127.0.0.1:8144/version; echo

实测回显:

{"health":"green","database":"green"}
{"version":"3.1.1","commit":"e6361caa512547052b1013dbf4544e6d7ff32604","buildDate":"2026-09-15-18:26:53"}

验证四:启动日志中的监听行(journalctl):

journalctl -u gotify --no-pager -n 5

实测回显:

10月 21 20:08:52 ops systemd[1]: Stopped Gotify - a simple server for sending and receiving messages.
10月 21 20:08:52 ops systemd[1]: Started Gotify - a simple server for sending and receiving messages.
10月 21 20:08:52 ops gotify[143060]: 2026-10-21T20:08:52+08:00 INF Gotify build_date=2026-09-15-18:26:53 version=3.1.1
10月 21 20:08:52 ops gotify[143060]: 2026-10-21T20:08:52+08:00 INF Loading file /etc/gotify/server.env
10月 21 20:08:52 ops gotify[143060]: 2026-10-21T20:08:52+08:00 INF Listen address=[::]:8144 connection_type="plain connection" network=tcp

验证五:WebUI 可访问(GET / 返回 200 与 HTML):

curl -s -o /dev/null -w 'GET / -> %{http_code}\n' http://127.0.0.1:8144/

实测回显:

GET / -> 200

浏览器访问 http://<服务器IP>:8144/,用 admin/q1w2e3r4 登录即可进入管理界面(首登录后请立即改密)。

五、离线安装方案(B:断网服务器)

内网隔离服务器无法直接访问 GitHub 时,在任意联网机完成下载与校验,把发布包经 U 盘/内网 scp 转移后再安装。安装步骤与 4.3-4.7 完全一致,本章只补「离线侧」的校验与转移动作。

5.1 联网机:下载并生成校验文件

mkdir -p gotify-3.1.1-offline && cd gotify-3.1.1-offline
curl -LO https://github.com/gotify/server/releases/download/v3.1.1/gotify-linux-amd64.zip
sha256sum gotify-linux-amd64.zip > SHA256SUMS
cat SHA256SUMS

实测回显(与 4.1 节同一发布包,校验值一致):

d452faad071981d191d5c95f70d0f9520dc2ef2336b2b03055e12cfabfbae2d2  gotify-linux-amd64.zip

5.2 转移到内网服务器

把 gotify-3.1.1-offline/(zip + SHA256SUMS)经内网 scp 或物理介质拷到目标服务器,如:

scp -r gotify-3.1.1-offline/ user@内网服务器:/tmp/

(内网 scp 的传输输出视网络而定,略。)

5.3 内网服务器:校验后走同一安装流程

cd /tmp/gotify-3.1.1-offline
sha256sum -c SHA256SUMS

实测回显:

gotify-linux-amd64.zip: OK

校验 OK 后,解压、建用户、装二进制、写配置、装单元、启动验证的每一条命令与 4.2-4.7 节完全相同,逐条照做即可,此处不再重复。

⚠️ 注意:离线服务器上 apt-get install unzip 若不可用,可在联网机解压后只拷贝包内 gotify-linux-amd64 单文件到目标服务器,效果等价(发布包内二进制之外只有 LICENSE 与许可证目录)。

六、多方案对比与选择建议

两种安装方案差异汇总(另附 Docker 镜像作参考,Compose 部署不在本篇展开):

维度方案 A:在线 zip + systemd方案 B:离线 zip + systemd参考:官方 Docker 镜像
是否需联网安装时需要仅转移文件,安装时不需要拉镜像时需要
版本控制任意指定版本下载任意指定版本下载镜像 tag 固定
systemd 服务名gotify(自建单元)gotify(自建单元)需容器运行时托管
数据落盘/var/lib/gotify(本机目录)/var/lib/gotify(本机目录)依赖 volume 挂载
升级方式替换二进制 + restart替换二进制 + restart换镜像 tag 重建
适用场景可联网的常规服务器内网隔离、等保环境已标准化容器平台的团队

选择建议:能联网选方案 A(步骤最少);内网隔离或对下载来源强审计的环境选方案 B(校验链完整);已全面容器化的团队可直接用官方镜像 gotify/server(多架构,amd64/i386/arm64/armv7/riscv64,来源 gotify.net/docs/install),但本文其余章节的 systemd 管理经验不直接适用于容器形态。

七、配置说明

安装完成的 Gotify 其行为全部由环境变量决定,本章给出安装相关的最小配置集与两个最常用的改动闭环;逐参数详解见本专栏《Gotify 3.1.1 配置参数详解》。

7.1 配置文件位置与加载语义

  • 配置文件:/etc/gotify/server.env(systemd EnvironmentFile 加载 + GOTIFY_CONFIG_FILE 显式指向);
  • 官方配置搜索序(GOTIFY_CONFIG_FILE 未设置时生效):① 工作目录下 gotify-server.env → ② $XDG_CONFIG_HOME/gotify/gotify-server.env → ③ /etc/gotify/server.env(来源:gotify.net/docs/config,查询日期 2026-10-21);
  • 每个变量支持 _FILE 后缀从文件读值(如 GOTIFY_DEFAULTUSER_PASS_FILE=/run/secrets/admin_pass),便于对接密钥管理;
  • 修改配置后必须 systemctl restart gotify 才生效。

7.2 常用改动一:换监听端口

编辑 /etc/gotify/server.env 把 GOTIFY_SERVER_PORT=8144 改为目标端口(如 8145),重启并验证:

sed -i 's/GOTIFY_SERVER_PORT=8144/GOTIFY_SERVER_PORT=8145/' /etc/gotify/server.env
systemctl restart gotify
sleep 2
systemctl is-active gotify
curl -s http://127.0.0.1:8145/health; echo
ss -ltn | grep ':8144 ' || echo '8144 already released'

实测回显:

active
{"health":"green","database":"green"}
8144 already released

改回 8144 重启即可还原(本文后续章节均按 8144 口径)。

7.3 常用改动二:日志级别

GOTIFY_LOGLEVEL 支持 trace/debug/info/warn/error/fatal/panic。info 级别下每次 HTTP 请求都有 INF 日志、无效凭据登录为 WRN(journalctl 实测样例):

10月 21 20:03:56 ops gotify[135211]: 2026-10-21T20:03:56+08:00 INF HTTP duration=41.533097ms ip=127.0.0.1 method=POST path=/auth/local/login status=200
10月 21 20:03:56 ops gotify[135211]: 2026-10-21T20:03:56+08:00 WRN HTTP duration=39.994948ms errors="Error #01: invalid credentials" ip=127.0.0.1 method=POST path=/auth/local/login status=401

7.4 升级与降级

升级(新版本发布后):

# 1. 用 3.1 节的命令确认最新版本号与下载 URL,下载新版 zip 并校验
# 2. 停服、替换二进制、重启
systemctl stop gotify
unzip -o gotify-linux-<新版本架构>.zip -d extracted-new
cp extracted-new/gotify-linux-amd64 /opt/gotify/gotify
chown gotify:gotify /opt/gotify/gotify
systemctl start gotify
/opt/gotify/gotify version | head -3
curl -s http://127.0.0.1:8144/health; echo

数据库 schema 由服务在启动时自动迁移,配置文件无需改动(3.x 为环境变量体系;从 2.x 升级须先用 gotify migrate-config 转换旧 config.yml,见 8.5 节)。

降级:把旧版本二进制放回 /opt/gotify/gotify 后重启即可,但数据库 schema 可能已被新版前滚迁移,跨大版本降级前务必备份 /var/lib/gotify/gotify.db(SQLite 单文件,直接 cp 即可),并做好不可回退的心理预期。

八、常见问题(FAQ)

以下均为本文实测环境中真实出现过的报错与结论,可直接对照排障。

8.1 启动即崩:cannot read file /home/gotify/.config/gotify/gotify-server.env: permission denied

现象:systemctl start gotify 后服务反复重启,journalctl 出现:

gotify[106182]: 2026-10-21T19:50:46+08:00 FTL cannot read file /home/gotify/.config/gotify/gotify-server.env: stat /home/gotify/.config/gotify/gotify-server.env: permission denied
gotify[106182]: 2026-10-21T19:50:46+08:00 FTL cannot read file /etc/gotify/server.env: stat /etc/gotify/server.env: permission denied

定位:3.x 配置加载器按官方搜索序逐个探测配置文件;单元内 User=gotify 时 $HOME 指向 /home/gotify(useradd -r 不建家目录),叠加 ProtectHome=true 后该路径不可访问,加载器对探测失败直接 FTL 退出而不是跳过。

解决:在单元中显式声明 Environment=GOTIFY_CONFIG_FILE=/etc/gotify/server.env(GOTIFY_CONFIG_FILE 设置后只读该文件、跳过搜索序),systemctl daemon-reload && systemctl restart gotify。若不想要加固项,也可去掉 ProtectHome=true 或给 gotify 用户建可读家目录,但显式指向配置文件是最干净的写法。

8.2 启动即崩:cannot read file /etc/gotify/server.env: permission denied

现象:显式配置后仍 FTL,报 cannot read file /etc/gotify/server.env: stat ...: permission denied。

定位:/etc/gotify 目录建完后属主是 root:root,750 权限下 gotify 用户无法穿越目录 stat 到 server.env(文件本身 640 root:gotify 没问题,问题在目录层)。

解决:chown root:gotify /etc/gotify && systemctl restart gotify,重启后 journalctl 出现 INF Loading file /etc/gotify/server.env 即恢复正常。

8.3 gotify serve --help 不打印帮助,直接把服务拉起来

gotify CLI 只有三个子命令(serve / migrate-config / version,gotify --help 可确认),serve 不解析 --help:

/opt/gotify/gotify serve --help

实测回显(默认绑 80,被占用则报错退出——也顺带证明了 3.x 默认端口是 80):

2026-10-21T19:47:09+08:00 INF Gotify build_date=2026-09-15-18:26:53 version=3.1.1
2026-10-21T19:47:09+08:00 ERR Server error error="listen tcp :80: bind: address already in use"

排障时想看命令面请用 gotify --help;生产改端口靠 GOTIFY_SERVER_PORT,不是命令行参数。

8.4 80 端口被占用 / 与 Nginx 冲突

默认端口 80 被占用时服务启动失败,报 bind: address already in use。处理:按 7.2 节改 GOTIFY_SERVER_PORT 到空闲端口(本文实测 8144),需要对外 80/443 时用 Nginx 反代(Gotify 内建 HTTPS 也支持 Let's Encrypt 自动签发,见《Gotify 3.1.1 配置参数详解》)。

8.5 从 2.x 升级:config.yml 不再被读取

3.0.0 起配置全面转向环境变量,旧版 /etc/gotify/config.yml 不会被读取。用内置迁移子命令转换:

/opt/gotify/gotify migrate-config /etc/gotify/config.yml

实测回显(以官方 2.x 示例配置为输入,转换结果打印到 stdout,逐行复制进 server.env 即可):

GOTIFY_DATABASE_CONNECTION="data/gotify.db"
GOTIFY_DATABASE_DIALECT="sqlite3"
GOTIFY_DEFAULTUSER_NAME="admin"
GOTIFY_DEFAULTUSER_PASS="admin"
GOTIFY_PLUGINSDIR="data/plugins"
GOTIFY_REGISTRATION="false"
GOTIFY_SERVER_KEEPALIVEPERIODSECONDS=0
GOTIFY_SERVER_LISTENADDR=""
GOTIFY_SERVER_PORT=80
GOTIFY_SERVER_SECURECOOKIE="false"
GOTIFY_SERVER_SSL_ENABLED="false"
GOTIFY_SERVER_SSL_LETSENCRYPT_ACCEPTTOS="false"
GOTIFY_SERVER_SSL_LETSENCRYPT_CACHE="data/certs"
GOTIFY_SERVER_SSL_LETSENCRYPT_ENABLED="false"
GOTIFY_SERVER_SSL_LISTENADDR=""
GOTIFY_SERVER_SSL_PORT=443
GOTIFY_SERVER_SSL_REDIRECTTOHTTPS="true"
GOTIFY_SERVER_STREAM_PINGPERIODSECONDS=45
GOTIFY_UPLOADEDIMAGESDIR="data/images"

8.6 内存与资源占用

单实例空载内存极低,systemctl show gotify -p MemoryCurrent 实测约 6.9MB(MemoryCurrent=6897664),systemctl status 显示 Memory: 6.2M。SQLite 单文件数据库随消息量增长,磁盘紧张时可配置自动清理或改用外部 MySQL/PostgreSQL(见《Gotify 3.1.1 配置参数详解》)。

九、卸载与清理

完整卸载按「停服 → 删单元 → 删目录 → 删用户」四步:

systemctl disable --now gotify
rm /etc/systemd/system/gotify.service
systemctl daemon-reload
rm -rf /opt/gotify /var/lib/gotify /etc/gotify
userdel gotify

卸载后自证无残留:

systemctl is-active gotify; ss -ltn | grep 8144 || echo 'port free'; id gotify

实测回显(卸载场景按此预期;is-active 对不存在单元输出 inactive/unknown,端口与用户均已不存在):

inactive
port free
id: 'gotify': no such user

⚠️ 注意:rm -rf /var/lib/gotify 会连带删除 SQLite 数据库中的全部消息、应用与客户端配置,卸载前如有留档需求先备份该目录。

十、参考链接