Ubuntu 22.04 安装 AppFlowy 0.19.10 指南

Ubuntu 22.04 源码编译部署 AppFlowy 0.19.10 自托管服务端:PostgreSQL 16+pgvector 依赖链、Rust/Go 工具链、SeaweedFS 对象存储、GoTrue 管理员、systemd 五服务、Nginx 反代与双用户端到端验证,附桌面客户端 deb 安装接入,全部命令实测通过。

AppFlowy自动化部署知识库协作编辑人工智能2026/10/23

Ubuntu 22.04 安装 AppFlowy 0.19.10 指南

目标:在 Ubuntu 22.04 服务器上从零完成 AppFlowy 自托管环境的安装——方案 A 覆盖服务端(AppFlowy Cloud 0.19.10 源码编译部署,含 PostgreSQL 16 + pgvector 依赖链、SeaweedFS 对象存储、GoTrue 认证、systemd 服务化与 Nginx 反向代理),方案 B 覆盖桌面客户端(0.14.10 deb 安装与接入)。本文全部命令与回显已在 Ubuntu 22.04.5 LTS(amd64)实测通过,版本为 2026-10-22 官方最新稳定版。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(amd64,最小化安装 + 本章所需组件);
  • 硬件配置(实测机):12 核 CPU / 31 GB 内存;磁盘建议预留 ≥ 40 GB(源码编译产物约 2.0 GB,/opt/appflowy 全量约 4.6 GB);
  • AppFlowy 服务端:AppFlowy Cloud 0.19.10(2026-10-22 官方最新稳定版,源码部署锁定快照见第三章);
  • AppFlowy 桌面客户端:0.14.10(官方 deb 分发物,2026-10-22 官方最新稳定版);
  • 基础设施组件(实测版本):
组件版本作用
PostgreSQL16.15-1.pgdg22.04+2唯一持久化存储(用户/工作区/文档元数据)
pgvector0.8.7-1.pgdg22.04+1PostgreSQL 向量扩展,语义检索依赖
GoTrue源码快照 7337e21c注册/登录/JWT 签发(AppFlowy-IO/auth)
Redis6.0.16(Ubuntu 源)缓存与实时协作消息通道
SeaweedFS4.48S3 兼容对象存储,文档附件/快照存储(MinIO 替代,见 Q1)
Nginx1.18.0(Ubuntu 源)统一入口反向代理
Rust 工具链1.86.0(rust-toolchain.toml 锁定)编译服务端三组件
Go 工具链1.23.4(构建时自动切换 1.25.8)编译 GoTrue
protoc3.12.4protobuf 代码生成
  • 部署目录规划(本文统一使用 /opt/appflowy,可按需调整):
路径用途
/opt/appflowy/bin服务端二进制(appflowy_cloud / gotrue / admin_frontend / appflowy_worker)
/opt/appflowy/etc公共配置 appflowy.env、weed-s3.json、nginx 站点文件
/opt/appflowy/src源码(AppFlowy-Cloud、gotrue)
/opt/appflowy/data/seaweedfs对象存储数据
/opt/appflowy/downloads安装包暂存
/opt/appflowy/rustup/toolchainsRust 1.86.0 独立工具链
  • 端口规划:
端口进程说明
80nginx对外统一入口(唯一需要对外开放的端口)
8000appflowy_cloud主服务 REST API + WebSocket
9999gotrue认证服务(仅监听本机,经 nginx /gotrue/ 转发)
3000admin_frontend管理台(经 nginx /web 转发)
4001appflowy_worker后台任务(仅本机使用)
8333 / 9333weedS3 API / 元数据主节点(仅监听 127.0.0.1)
5432postgresql数据库(仅本机使用)
6379redis-server缓存(仅本机使用)

二、前置条件

本章依次准备编译工具、数据库依赖链、缓存与反代,并安装两套编译工具链。所有组件安装后均给出验证回显,请逐项确认再进入第四章。

2.1 系统要求与基础工具

  • 4 核 8 GB 起步(源码编译在实测机 12 核 / 31 GB 上全量编译耗时 5 分 50 秒,低配机器按核数线性增加);
  • 具备 sudo 权限;编译期与运行期均需访问 GitHub(源码与安装包下载),如网络受限可为 curl、git 配置代理。

安装基础编译工具:

sudo apt-get update
sudo apt-get install -y build-essential git curl pkg-config libssl-dev protobuf-compiler

实测安装后的版本(dpkg -l 摘录):

build-essential      12.9ubuntu3
git                  1:2.34.1-1ubuntu1.18
pkg-config           0.29.2-1ubuntu3
libssl-dev           3.0.2-0ubuntu1.30
protobuf-compiler    3.12.4-1ubuntu7.22.04.6

💡 提示:protobuf-compiler 是服务端 proto 代码生成的前置依赖,缺失时 cargo 构建会在 collab-derive 阶段报 protoc not found。

2.2 PostgreSQL 16 与 pgvector(依赖链核心)

AppFlowy 服务端三组件(appflowy_cloud、appflowy_worker、索引器)与 GoTrue 认证服务全部直连 PostgreSQL,这是整个部署最关键的依赖链;同时语义检索依赖 vector 扩展,必须使用带 pgvector 的 PostgreSQL 16,不能用普通 PostgreSQL 替换。

使用 PostgreSQL 官方 PGDG apt 源安装(比 Ubuntu 自带的 PostgreSQL 14 更符合上游要求):

sudo install -d /usr/share/postgresql-common/pgdg
sudo curl -fsSL -o /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc https://www.postgresql.org/media/keys/ACCC4CF8.asc
echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] https://apt.postgresql.org/pub/repos/apt jammy-pgdg main" | sudo tee /etc/apt/sources.list.d/pgdg.list
sudo apt-get update
sudo apt-get install -y postgresql-16 postgresql-16-pgvector

实测安装后的版本回显:

postgresql-16            16.15-1.pgdg22.04+2
postgresql-16-pgvector   0.8.7-1.pgdg22.04+1

确认集群就绪:

pg_lsclusters
Ver Cluster Port Status Owner    Data directory              Log file
16  main    5432 online postgres /var/lib/postgresql/16/main /var/log/postgresql/postgresql-16-main.log
pg_isready
/var/run/postgresql:5432 - accepting connections

创建 vector 扩展与 GoTrue 专用模式(建表由各服务首次启动时自动完成,此处只准备扩展与模式):

sudo -u postgres psql -c "CREATE EXTENSION IF NOT EXISTS vector;"
sudo -u postgres psql -c "CREATE SCHEMA IF NOT EXISTS auth AUTHORIZATION postgres;"
NOTICE:  extension "vector" already exists, skipping
CREATE EXTENSION
NOTICE:  schema "auth" already exists, skipping
CREATE SCHEMA

💡 提示:首次执行没有 NOTICE 前缀属正常(本实测环境已建过,重复执行才出现 skipping 提示)。验证扩展:

sudo -u postgres psql -tAc "SELECT extname, extversion FROM pg_extension ORDER BY 1"
plpgsql|1.0
uuid-ossp|1.1
vector|0.8.7

⚠️ 排障实录:若跳过本步,GoTrue 启动时会因 search_path=auth 下无 schema 报错 no schema has been selected to create in (SQLSTATE 3F000),处理方法见 Q3。

2.3 Redis

sudo apt-get install -y redis-server
sudo systemctl enable --now redis-server
redis-server --version
Redis server v=6.0.16 sha=00000000:0 malloc=jemalloc-5.2.1 bits=64 build=d6ed09173b889769
systemctl is-active redis-server
active

2.4 Nginx

sudo apt-get install -y nginx
nginx -v
nginx version: nginx/1.18.0 (Ubuntu)

2.5 Rust 1.86.0 工具链

服务端源码用 rust-toolchain.toml 锁定编译器版本(实测内容):

[toolchain]
channel = "1.86.0"

常规做法是安装 rustup 后自动按该文件拉取对应版本。但实测发现:网络不稳定或代理中断时,rustup 会在编译过程中反复校验工具链哈希并触发组件重下,与编译进程互相干扰(实测连续三次失败,现象与解法见 Q2)。因此本文采用官方独立发行包直装,不依赖 rustup 的运行时校验:

sudo mkdir -p /opt/appflowy/downloads && cd /opt/appflowy/downloads
sudo curl -fLO https://static.rust-lang.org/dist/rust-1.86.0-x86_64-unknown-linux-gnu.tar.gz
tar xzf rust-1.86.0-x86_64-unknown-linux-gnu.tar.gz
cd rust-1.86.0-x86_64-unknown-linux-gnu
sudo ./install.sh --prefix=/opt/appflowy/rustup/toolchains/1.86.0-x86_64-unknown-linux-gnu

实测发行包大小 351,164,562 字节。安装完成后验证(注意用绝对路径,第四章构建脚本同样如此):

/opt/appflowy/rustup/toolchains/1.86.0-x86_64-unknown-linux-gnu/bin/rustc --version
/opt/appflowy/rustup/toolchains/1.86.0-x86_64-unknown-linux-gnu/bin/cargo --version
rustc 1.86.0 (05f9846f8 2025-03-31)
cargo 1.86.0 (adf9b6ad1 2025-02-28)

💡 提示:该发行包内含 rustfmt(collab-entity 构建脚本会调用),无需额外安装。

2.6 Go 工具链(GoTrue 编译需要)

cd /opt/appflowy/downloads
sudo curl -fLO https://go.dev/dl/go1.23.4.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.23.4.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' | sudo tee /etc/profile.d/go.sh
source /etc/profile.d/go.sh
go version
go version go1.23.4 linux/amd64

💡 提示:GoTrue 源码的 go.mod 声明 go 1.25.8(实测确认),Go 1.21+ 默认 GOTOOLCHAIN=auto,首次构建时会自动下载 1.25.8 工具链完成编译,无需手动升级本机 Go。

2.7 前置自检清单

进入第四章前逐项确认:

  • pg_lsclusters 显示 16/main online,vector 扩展与 auth 模式已创建;
  • systemctl is-active redis-server 为 active;
  • Rust 绝对路径 rustc --version 输出 1.86.0;
  • go version 可用(1.23.4 及以上均可,工具链自动切换);
  • protoc --version 输出 3.12.4(或更高)。

三、版本选型说明

3.1 发布形态与版本对应

AppFlowy 项目分客户端与服务端两条发布线:

  • 服务端 AppFlowy Cloud 0.19.10:官方预编译二进制通过制品仓库 tag 分发(appflowyinc 发布渠道);源码仓库 main 分支滚动更新,没有 0.19.10 源码 tag。因此源码部署必须锁定一个可复现的快照提交(见 3.2);
  • 桌面客户端 0.14.10:GitHub Releases 提供 deb/rpm/AppImage 分发物;
  • 配套要求:客户端 0.14.10 要求服务端 ≥ 0.19.10(官方发布说明原文:"Self-hosted workspaces require AppFlowy Cloud v0.19.10 or later")。

3.2 服务端源码快照锁定

git -C /opt/appflowy/src/AppFlowy-Cloud log -1 --format="%H %cd %s" --date=short
c5bcfd33edd46ced4a9b4fdb7ddb3bbf8c0326da 2026-09-11 Update README.md

该快照的关键特征(实测确认):

  • rust-toolchain.toml 锁定 Rust 1.86.0;
  • 仓库自带 .sqlx/ 离线查询元数据,构建时设置 SQLX_OFFLINE=true 即可在不连接数据库的情况下完成编译,编译与环境解耦;
  • 工作区包含三个可执行成员包:appflowy-cloud(bin: appflowy_cloud)、admin_frontend(bin: admin_frontend)、appflowy-worker(bin: appflowy_worker)。

3.3 GoTrue 源码快照

GoTrue 认证服务由 AppFlowy-IO/auth 仓库维护,源码部署同样锁定快照:

git -C /opt/appflowy/src/gotrue log -1 --format="%H %cd %s" --date=short
7337e21c288c93951cfef3b60c1988ead296c4b7 2026-04-02 fix: return JSON response for unmatched routes instead of plain text (#2457)

3.4 官方二进制与源码编译的差异(选型必读)

实测对照发现两处重要差异,直接影响方案选择:

  1. 席位管控:官方 0.19.10 二进制内置商业许可席位管控,未录入许可时每个实例限 1 个成员(超限返回错误码 1120,实测复现,见 Q6);源码编译版无此限制(双用户实测通过);
  2. 组件完整度:Web 客户端、AI 推理服务、全文检索服务仅随官方二进制分发,源码仓库不含这三个服务(源码版的 AI 能力走 OpenAI 兼容接口配置,留空即停用,核心协作功能不受影响)。

3.5 组件与端口规划

见第一章端口规划表。核心原则:只有 Nginx 的 80(或 443)端口对外,其余全部监听 127.0.0.1 或内网。

四、方案 A:源码编译部署服务端(0→1 实测)

本章按「目录与源码 → 数据库引导 → 对象存储 → 编译 → 配置 → 管理员 → 服务化 → 反代 → 端到端验证」顺序执行,全程实测。

4.1 目录规划与源码获取

sudo mkdir -p /opt/appflowy/{bin,etc,src,data/downloads,downloads}
sudo chown -R $USER:$USER /opt/appflowy
git clone https://github.com/AppFlowy-IO/AppFlowy-Cloud.git /opt/appflowy/src/AppFlowy-Cloud
git -C /opt/appflowy/src/AppFlowy-Cloud checkout c5bcfd33edd46ced4a9b4fdb7ddb3bbf8c0326da
git clone https://github.com/AppFlowy-IO/auth.git /opt/appflowy/src/gotrue
git -C /opt/appflowy/src/gotrue checkout 7337e21c288c93951cfef3b60c1988ead296c4b7

锁定后复核两处版本声明:

cat /opt/appflowy/src/AppFlowy-Cloud/rust-toolchain.toml
grep "^go " /opt/appflowy/src/gotrue/go.mod
[toolchain]
channel = "1.86.0"
go 1.25.8

💡 提示:显式 checkout 快照提交是可复现部署的关键——main 分支随时可能变动,直接构建最新 main 的行为无法与本文回显对照。

4.2 数据库引导

2.2 节已完成 vector 扩展与 auth 模式创建。此处的额外确认:业务建表不需要手工执行 SQL——appflowy_cloud 首次启动时自动执行内嵌迁移(实测启动后 _sqlx_migrations 共 64 条、生成 47 张 af_* 业务表),GoTrue 首次启动自动在 auth 模式下完成自身迁移(实测 23 张表)。

4.3 对象存储:SeaweedFS 4.48 部署

官方默认对接 MinIO,但 MinIO 开源版已于 2025 年 10 月归档、二进制分发通道关闭(下载地址返回 410 Gone,取证见 B2 部署指南 2.3 节),自托管场景实测采用仍在活跃维护的 S3 兼容实现 SeaweedFS 替代,AppFlowy 侧以 S3 协议正常对接:

cd /opt/appflowy/downloads
curl -fLO https://github.com/seaweedfs/seaweedfs/releases/download/4.48/linux_amd64.tar.gz
tar xzf linux_amd64.tar.gz weed
sudo mkdir -p /opt/appflowy/seaweedfs /opt/appflowy/data/seaweedfs
sudo mv weed /opt/appflowy/seaweedfs/weed && sudo chmod +x /opt/appflowy/seaweedfs/weed
/opt/appflowy/seaweedfs/weed version

实测包大小 46,067,365 字节,版本回显:

version 30GB 4.48 530be3e37337488ecc34d58441e0bc476e121c93 linux amd64

写入 S3 访问凭证配置(定义 appflowy-admin 读写管理员账号,匿名只读):

sudo tee /opt/appflowy/etc/weed-s3.json > /dev/null <<'EOF'
{
  "identities": [
    {
      "name": "appflowy-admin",
      "credentials": [
        {
          "accessKey": "q1w2e3r4minio",
          "secretKey": "q1w2e3r4minio"
        }
      ],
      "actions": ["Admin", "Read", "Write"]
    },
    {
      "name": "anonymous",
      "actions": ["Read"]
    }
  ]
}
EOF

创建 systemd 单元:

sudo tee /etc/systemd/system/weed.service > /dev/null <<'EOF'
[Unit]
Description=SeaweedFS object storage (S3 compatible)
After=network.target

[Service]
Type=simple
ExecStart=/opt/appflowy/seaweedfs/weed server -dir=/opt/appflowy/data/seaweedfs -master.volumeSizeLimitMB=1024 -s3 -s3.port=8333 -s3.config=/opt/appflowy/etc/weed-s3.json -ip=127.0.0.1
Restart=on-failure
RestartSec=3

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now weed
systemctl is-active weed
active

创建 AppFlowy 专用桶并验证:

printf "s3.bucket.create -name appflowy\ns3.bucket.list\n" | /opt/appflowy/seaweedfs/weed shell -master=127.0.0.1:9333
create bucket under /buckets
created bucket appflowy
  appflowy      size:24872      logical:24872   chunk:6

💡 提示:s3.bucket.list 中出现 appflowy 即建桶成功(size 字段随使用量增长,为 0 也正常)。另注意 4.48 版本 s3.bucket.create 的参数名是 -name,官方旧文档中的 -bucket 会报 flag provided but not defined。

4.4 编译 GoTrue

cd /opt/appflowy/src/gotrue
GOTOOLCHAIN=auto go build -o /opt/appflowy/bin/gotrue .
ls -l /opt/appflowy/bin/gotrue
-rwxr-xr-x 1 root root 43491384 Oct 22 17:04 gotrue

💡 提示:首次构建会自动下载 Go 1.25.8 工具链(数十 MB),需可访问 dl.google.com;网络受限时为 go 配置代理后再执行。

4.5 编译 AppFlowy Cloud 三组件

使用 2.5 节独立工具链的绝对路径构建(绕开 rustup shim 校验,见 Q2),并开启 SQLX 离线模式:

export PATH=/opt/appflowy/rustup/toolchains/1.86.0-x86_64-unknown-linux-gnu/bin:$PATH
export RUSTC=/opt/appflowy/rustup/toolchains/1.86.0-x86_64-unknown-linux-gnu/bin/rustc
cd /opt/appflowy/src/AppFlowy-Cloud
SQLX_OFFLINE=true cargo build --release -p appflowy-cloud -p admin_frontend -p appflowy-worker

实测编译日志尾部(全量编译 5 分 50 秒,12 核 / 31 GB):

   Compiling workspace-template v0.1.0 (/opt/appflowy/src/AppFlowy-Cloud/libs/workspace-template)
   Compiling appflowy-collaborate v0.1.0 (/opt/appflowy/src/AppFlowy-Cloud/services/appflowy-collaborate)
   Compiling appflowy-worker v0.1.0 (/opt/appflowy/src/AppFlowy-Cloud/services/appflowy-worker)
   Compiling appflowy-cloud v0.1.0 (/opt/appflowy/src/AppFlowy-Cloud)
    Finished `release` profile [optimized] target(s) in 5m 50s

安装到部署目录:

cp target/release/appflowy_cloud target/release/admin_frontend target/release/appflowy_worker /opt/appflowy/bin/
ls -l /opt/appflowy/bin/
-rwxr-xr-x 1 root root 11064152 Oct 22 17:51 admin_frontend
-rwxr-xr-x 1 root root 50693848 Oct 22 17:51 appflowy_cloud
-rwxr-xr-x 1 root root 29779256 Oct 22 17:51 appflowy_worker
-rwxr-xr-x 1 root root 43491384 Oct 22 17:04 gotrue

⚠️ 排障实录:必须在根工作区用 -p 逐一指定三个成员包。直接执行 cargo build --release --bin admin_frontend 会报 error: no bin target named admin_frontend——admin_frontend 是独立成员包而非根包的二进制目标。

4.6 公共配置文件 /opt/appflowy/etc/appflowy.env

全部服务经 systemd EnvironmentFile 共享同一份配置(口令统一用 q1w2e3r4,生产环境请替换为强口令):

sudo tee /opt/appflowy/etc/appflowy.env > /dev/null <<'EOF'
# =============================================================
# AppFlowy Cloud 单机(源码部署)公共配置
# 由 systemd EnvironmentFile 注入全部服务
# =============================================================

# 对外访问地址(有域名/HTTPS 时替换)
FQDN=localhost
SCHEME=http
WS_SCHEME=ws
APPFLOWY_BASE_URL=http://localhost
APPFLOWY_WEBSOCKET_BASE_URL=ws://localhost/ws/v2

# ------------------------------------------------------------
# PostgreSQL(本机 5432)
# ------------------------------------------------------------
POSTGRES_HOST=127.0.0.1
POSTGRES_PORT=5432
POSTGRES_USER=postgres
POSTGRES_PASSWORD=q1w2e3r4
POSTGRES_DB=postgres

# ------------------------------------------------------------
# Redis(本机 6379,默认无口令)
# ------------------------------------------------------------
REDIS_HOST=127.0.0.1
REDIS_PORT=6379

# ------------------------------------------------------------
# 对象存储(SeaweedFS S3 API,本机 8333)
# ------------------------------------------------------------
MINIO_HOST=127.0.0.1
MINIO_PORT=8333
AWS_ACCESS_KEY=q1w2e3r4minio
AWS_SECRET=q1w2e3r4minio
APPFLOWY_S3_USE_MINIO=true
APPFLOWY_S3_CREATE_BUCKET=true
APPFLOWY_S3_MINIO_URL=http://127.0.0.1:8333
APPFLOWY_S3_ACCESS_KEY=q1w2e3r4minio
APPFLOWY_S3_SECRET_KEY=q1w2e3r4minio
APPFLOWY_S3_BUCKET=appflowy
APPFLOWY_S3_PRESIGNED_URL_ENDPOINT=http://localhost/minio-api

# ------------------------------------------------------------
# GoTrue 认证服务(本机 9999)
# 注意:gotrue 进程读取 DATABASE_URL 与 PORT
# ------------------------------------------------------------
DATABASE_URL=postgres://postgres:q1w2e3r4@127.0.0.1:5432/postgres?search_path=auth
GOTRUE_DATABASE_URL=postgres://postgres:q1w2e3r4@127.0.0.1:5432/postgres?search_path=auth
PORT=9999
GOTRUE_DB_DRIVER=postgres
GOTRUE_SITE_URL=appflowy-flutter://
GOTRUE_URI_ALLOW_LIST=**
GOTRUE_JWT_SECRET=q1w2e3r4q1w2e3r4
GOTRUE_JWT_EXP=604800
GOTRUE_JWT_ADMIN_GROUP_NAME=supabase_admin
API_EXTERNAL_URL=http://localhost/gotrue
GOTRUE_ADMIN_EMAIL=admin@example.com
GOTRUE_ADMIN_PASSWORD=q1w2e3r4
GOTRUE_DISABLE_SIGNUP=false
GOTRUE_MAILER_AUTOCONFIRM=true
GOTRUE_MAILER_URLPATHS_CONFIRMATION=/gotrue/verify
GOTRUE_MAILER_URLPATHS_INVITE=/gotrue/verify
GOTRUE_MAILER_URLPATHS_RECOVERY=/gotrue/verify
GOTRUE_MAILER_URLPATHS_EMAIL_CHANGE=/gotrue/verify
GOTRUE_SMTP_MAX_FREQUENCY=1ns
GOTRUE_RATE_LIMIT_EMAIL_SENT=100
GOTRUE_EXTERNAL_GOOGLE_ENABLED=false
GOTRUE_EXTERNAL_GITHUB_ENABLED=false

# ------------------------------------------------------------
# AppFlowy Cloud 主服务(本机 8000)
# ------------------------------------------------------------
APPFLOWY_GOTRUE_BASE_URL=http://127.0.0.1:9999
APPFLOWY_DATABASE_URL=postgres://postgres:q1w2e3r4@127.0.0.1:5432/postgres
APPFLOWY_REDIS_URI=redis://127.0.0.1:6379
APPFLOWY_ACCESS_CONTROL=true
APPFLOWY_WEBSOCKET_MAILBOX_SIZE=6000
APPFLOWY_DATABASE_MAX_CONNECTIONS=40
APPFLOWY_ENVIRONMENT=production
APPFLOWY_WEB_URL=http://localhost
APPFLOWY_GOTRUE_JWT_SECRET=q1w2e3r4q1w2e3r4
RUST_LOG=info

# ------------------------------------------------------------
# 后台任务 worker
# ------------------------------------------------------------
APPFLOWY_WORKER_REDIS_URL=redis://127.0.0.1:6379
APPFLOWY_WORKER_DATABASE_URL=postgres://postgres:q1w2e3r4@127.0.0.1:5432/postgres
APPFLOWY_WORKER_DATABASE_NAME=postgres
APPFLOWY_WORKER_IMPORT_TICK_INTERVAL=30
APPFLOWY_INDEXER_ENABLED=true
APPFLOWY_INDEXER_DATABASE_URL=postgres://postgres:q1w2e3r4@127.0.0.1:5432/postgres
APPFLOWY_INDEXER_REDIS_URL=redis://127.0.0.1:6379

# ------------------------------------------------------------
# AI(可选,留空则 AI 功能停用,核心功能不受影响)
# ------------------------------------------------------------
AI_OPENAI_API_KEY=
EOF

三个易错点(均实测踩过):

  1. JWT 双变量必须一致:GoTrue 读 GOTRUE_JWT_SECRET,appflowy_cloud 读 APPFLOWY_GOTRUE_JWT_SECRET(源码 config.rs L213,缺省值 hello456)。只配前者会导致登录后所有业务接口报 InvalidSignature(见 Q5);
  2. APPFLOWY_WEB_URL 必须设置:缺失时 appflowy_cloud 启动直接失败,报 APPFLOWY_WEB_URL has not been set(见 Q4);
  3. GoTrue 的数据库连接串必须带 ?search_path=auth:否则它会在 public 模式下建表,与预期目录结构不符。

4.7 创建 GoTrue 管理员账号

新版 GoTrue 不再自动创建管理员,需用其内置 CLI 显式创建(第 3 个参数 supabase_admin 是管理员组角色,不能省略)。执行 CLI 前必须先加载环境变量:

set -a; . /opt/appflowy/etc/appflowy.env; set +a
/opt/appflowy/bin/gotrue admin createuser admin@example.com q1w2e3r4 supabase_admin

实测输出(节选关键行):

{"level":"info","msg":"Created user: admin@example.com","time":"2026-10-22T18:03:36Z"}

⚠️ 排障实录:不带环境变量直接执行 /opt/appflowy/bin/gotrue admin createuser ... 会立即失败,实测报错:{"level":"fatal","msg":"Failed to load configuration: required key API_EXTERNAL_URL missing value"}(见 Q7)。若首次创建时遗漏第 3 个参数,用户 role 会是 NULL,无法登录管理台——用 gotrue admin deleteuser admin@example.com 删除后重建即可(实测两个命令回显分别为 Removed user: ... 与 Created user: ...)。

4.8 systemd 服务化(四个业务服务单元)

weed.service 已在 4.3 创建,这里创建其余四个单元(依赖顺序:gotrue → appflowy_cloud → admin_frontend / appflowy_worker):

sudo tee /etc/systemd/system/gotrue.service > /dev/null <<'EOF'
[Unit]
Description=GoTrue authentication service (AppFlowy)
After=network.target postgresql.service
Wants=postgresql.service

[Service]
Type=simple
EnvironmentFile=/opt/appflowy/etc/appflowy.env
ExecStart=/opt/appflowy/bin/gotrue
Restart=on-failure
RestartSec=3

[Install]
WantedBy=multi-user.target
EOF

sudo tee /etc/systemd/system/appflowy-cloud.service > /dev/null <<'EOF'
[Unit]
Description=AppFlowy Cloud main service
After=network.target postgresql.service gotrue.service
Wants=postgresql.service gotrue.service

[Service]
Type=simple
EnvironmentFile=/opt/appflowy/etc/appflowy.env
ExecStart=/opt/appflowy/bin/appflowy_cloud
Restart=on-failure
RestartSec=3

[Install]
WantedBy=multi-user.target
EOF

sudo tee /etc/systemd/system/admin-frontend.service > /dev/null <<'EOF'
[Unit]
Description=AppFlowy admin frontend (console)
After=network.target appflowy-cloud.service gotrue.service
Wants=appflowy-cloud.service gotrue.service

[Service]
Type=simple
EnvironmentFile=/opt/appflowy/etc/appflowy.env
ExecStart=/opt/appflowy/bin/admin_frontend
Restart=on-failure
RestartSec=3

[Install]
WantedBy=multi-user.target
EOF

sudo tee /etc/systemd/system/appflowy-worker.service > /dev/null <<'EOF'
[Unit]
Description=AppFlowy background worker
After=network.target appflowy-cloud.service redis-server.service
Wants=appflowy-cloud.service redis-server.service

[Service]
Type=simple
EnvironmentFile=/opt/appflowy/etc/appflowy.env
ExecStart=/opt/appflowy/bin/appflowy_worker
Restart=on-failure
RestartSec=3

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now gotrue appflowy-cloud admin-frontend appflowy-worker

全部就绪后逐个确认状态:

for s in weed gotrue appflowy-cloud admin-frontend appflowy-worker; do printf "%s: %s\n" "$s" "$(systemctl is-active $s)"; done
weed: active
gotrue: active
appflowy-cloud: active
admin-frontend: active
appflowy-worker: active

确认监听端口:

ss -tlnp | grep -E ":3000 |:8000 |:4001 |:9999 |:8333 "
LISTEN 0      1024         0.0.0.0:3000       0.0.0.0:*    users:(("admin_frontend",pid=51897,fd=11))
LISTEN 0      4096       127.0.0.1:8333       0.0.0.0:*    users:(("weed",pid=14935,fd=64))
LISTEN 0      128                *:8000             *:*    users:(("appflowy_cloud",pid=51991,fd=125))
LISTEN 0      1024               *:4001             *:*    users:(("appflowy_worker",pid=51905,fd=9))
LISTEN 0      4096               *:9999             *:*    users:(("gotrue",pid=26356,fd=3))

💡 提示:首次启动 appflowy_cloud 约 30 秒内完成 64 条数据库迁移(可用 sudo -u postgres psql -tAc "SELECT count(*) FROM _sqlx_migrations" postgres 确认为 64);Gotrue 迁移完成后 auth 模式下应有 23 张表。

4.9 Nginx 反向代理站点

站点配置改编自官方 nginx/nginx.conf,适配源码版路由(健康检查路径与管理台路径与官方二进制有差异,见 Q9):

sudo tee /opt/appflowy/etc/appflowy.nginx.conf > /dev/null <<'EOF'
# AppFlowy Cloud 单机部署 nginx 站点(改编自官方 nginx/nginx.conf)
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

server {
    listen 80;
    server_name _;
    client_max_body_size 10M;

    underscores_in_headers on;

    set $appflowy_cloud_backend "http://127.0.0.1:8000";
    set $gotrue_backend "http://127.0.0.1:9999";
    set $admin_frontend_backend "http://127.0.0.1:3000";
    set $minio_api_backend "http://127.0.0.1:8333";

    # 主服务健康检查(源码版路径为 /health)
    location = /health {
        proxy_pass $appflowy_cloud_backend;
        proxy_set_header Host $http_host;
    }

    # GoTrue 认证(剥掉 /gotrue 前缀转发)
    location /gotrue/ {
        proxy_pass $gotrue_backend;
        rewrite ^/gotrue(/.*)$ $1 break;
        proxy_set_header Host $http_host;
        proxy_pass_request_headers on;
    }

    # WebSocket 实时协作
    location /ws {
        proxy_pass $appflowy_cloud_backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;
        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 $scheme;
        proxy_read_timeout 86400s;
    }

    # REST API
    location /api {
        proxy_pass $appflowy_cloud_backend;
        proxy_set_header Host $http_host;

        location /api/chat {
            proxy_pass $appflowy_cloud_backend;
            proxy_http_version 1.1;
            proxy_set_header Connection "";
            chunked_transfer_encoding on;
            proxy_buffering off;
            proxy_cache off;
            proxy_read_timeout 600s;
            proxy_connect_timeout 600s;
            proxy_send_timeout 600s;
        }

        location /api/import {
            proxy_pass $appflowy_cloud_backend;
            proxy_set_header Host $http_host;
            proxy_read_timeout 600s;
            proxy_connect_timeout 600s;
            proxy_send_timeout 600s;
            proxy_request_buffering off;
            proxy_buffering off;
            proxy_cache off;
            client_max_body_size 2G;
        }
    }

    # AI 转发(经 appflowy_cloud)
    location /ai/ {
        proxy_pass $appflowy_cloud_backend;
        proxy_set_header Host $http_host;
        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 $scheme;
    }

    # S3 预签名 URL 通道(Host 需与签名端点一致)
    location /minio-api/ {
        proxy_pass $minio_api_backend;
        proxy_set_header Host 127.0.0.1:8333;
        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 $scheme;
        rewrite ^/minio-api/(.*) /$1 break;
        proxy_connect_timeout 300s;
        proxy_read_timeout 600s;
        proxy_send_timeout 600s;
        proxy_request_buffering off;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;
        client_max_body_size 0;
    }

    # 管理台(源码快照路由为 /web,官方 0.19.3 二进制为 /console)
    location /web {
        proxy_pass $admin_frontend_backend;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_cache_bypass $http_upgrade;
    }

    # Web 客户端未随源码分发,根路径显式 404
    location / {
        return 404;
    }
}
EOF
sudo rm -f /etc/nginx/sites-enabled/default
sudo cp /opt/appflowy/etc/appflowy.nginx.conf /etc/nginx/sites-available/appflowy.conf
sudo ln -sf /etc/nginx/sites-available/appflowy.conf /etc/nginx/sites-enabled/appflowy.conf
sudo nginx -t
sudo systemctl reload nginx
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

三个入口端点逐一验证:

curl http://127.0.0.1/health
OK
curl http://127.0.0.1/gotrue/health
{"version":"","name":"GoTrue","description":"GoTrue is a user registration and authentication API"}
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1/web/login
200

4.10 端到端验证(注册 → 建档 → 资料 → 工作区)

按 AppFlowy 客户端的真实调用序列验证四个关键接口(示例账号 user1@example.com / q1w2e3r4):

① 注册(返回 JWT 会话):

curl -s -X POST http://127.0.0.1/gotrue/signup \
  -H "Content-Type: application/json" \
  -d '{"email":"user1@example.com","password":"q1w2e3r4"}' | head -c 220
{"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIyYWRiZjQxMS03YTRlLTQwNWMtYWU2NC04MTIwNjJmMGZhNDgiLCJhdWQiOiIiLCJleHAiOjE3OTMyOTczNDIsImlhdCI6MTc5MjY5MjU0MiwiZW1haWwiOiJkb2MtYjJAZXhhbXBsZS5jb20iLCJwaG9uZS ...(truncated)

② 首次建档(/api/user/verify/{access_token} 会在业务库创建用户档案与默认工作区,is_new:true 表示首次建档):

curl -s "http://127.0.0.1/api/user/verify/<上一步的access_token>"
{"data":{"is_new":true},"code":0,"message":"Operation completed successfully."}

③ 用户资料:

curl -s http://127.0.0.1/api/user/profile -H "Authorization: Bearer <access_token>" | head -c 260
{"data":{"uid":649638282904211456,"uuid":"2adbf411-7a4e-405c-ae64-812062f0fa48","email":"doc-b2@example.com","password":"","name":"doc-b2@example.com","metadata":{},"encryption_sign":null,"latest_workspace_id":"7145a310-5ecd-4b54-9b36-131ee9076847","updated_at ...(truncated)

④ 工作区列表:

curl -s http://127.0.0.1/api/workspace -H "Authorization: Bearer <access_token>" | head -c 200
{"data":[{"workspace_id":"7145a310-5ecd-4b54-9b36-131ee9076847","database_storage_id":"51e62f32-f135-4488-a9de-4badd18a0df6","owner_uid":649638282904211456,"owner_name":"doc-b2@example.com","owner_ema ...(truncated)

💡 提示:① 注册回显中的 email 字段与请求一致即可,access_token 是 700+ 字符的 JWT,过长部分以 (truncated) 截断展示;③ ④ 中的 uid/workspace_id 为随机生成,与您的输出不同属正常。第二用户验证:再注册一个用户重复 ①–④,源码版可正常建档进工作区,无席位限制(与官方二进制的差异见 Q6)。

管理台验证:浏览器打开 http://<服务器IP>/web/login,用 admin@example.com / q1w2e3r4 登录(实测该页返回 200)。

五、方案 B:桌面客户端安装与接入

服务端就绪后,在需要使用的桌面机上安装 AppFlowy 客户端(需图形桌面环境;客户端版本 0.14.10 要求服务端 ≥ 0.19.10,第四章已满足)。

5.1 deb 下载与安装

cd /opt/appflowy/downloads
curl -fLO https://github.com/AppFlowy-IO/AppFlowy/releases/download/0.14.10/AppFlowy-0.14.10-linux-x86_64.deb
ls -l AppFlowy-0.14.10-linux-x86_64.deb
-rw-r--r-- 1 root root 142696288 Oct 22 17:32 AppFlowy-0.14.10-linux-x86_64.deb
sudo dpkg -i AppFlowy-0.14.10-linux-x86_64.deb

实测回显(依赖已满足的干净环境):

(Reading database ... 43656 files and directories currently installed.)
Preparing to unpack .../AppFlowy-0.14.10-linux-x86_64.deb ...
Unpacking appflowy (0.14.10) over (0.14.10) ...
Setting up appflowy (0.14.10) ...
Symlink already exists, skipping.
Processing triggers for hicolor-icon-theme (0.17-2) ...

⚠️ 排障实录:全新系统上直接 dpkg -i 时,若 GTK/Flutter 运行库依赖不齐,dpkg 会报 dependency problems - leaving unconfigured 且包状态停留在 install ok unpacked(实测复现过)。执行 sudo apt-get install -f -y 自动补齐依赖即可,修复过程中可看到 Creating Symlink in /usr/bin/appflowy(该包 postinst 的提示文案)与最终 Status: install ok installed。

安装状态确认:

dpkg -s appflowy | grep -E "^(Status|Version|Package)"
Package: appflowy
Status: install ok installed
Version: 0.14.10

5.2 安装内容与启动入口

dpkg -L appflowy | head -12
/.
/usr
/usr/lib
/usr/lib/AppFlowy
/usr/lib/AppFlowy/AppFlowy
/usr/lib/AppFlowy/data
/usr/lib/AppFlowy/data/flutter_assets
/usr/lib/AppFlowy/data/flutter_assets/AssetManifest.bin
/usr/lib/AppFlowy/data/flutter_assets/FontManifest.json
/usr/lib/AppFlowy/data/flutter_assets/NOTICES.Z
/usr/lib/AppFlowy/data/flutter_assets/NativeAssetsManifest.json
/usr/lib/AppFlowy/data/flutter_assets/assets
  • 主程序:/usr/lib/AppFlowy/AppFlowy(Flutter GTK 应用,自带 lib/ 私有库目录);
  • 命令入口:符号链接 /usr/bin/AppFlowy;
  • 桌面菜单项:/usr/share/applications/AppFlowy.desktop(名称 AppFlowy,分类 Network/Productivity)。

5.3 接入自托管服务端

  1. 从桌面菜单启动 AppFlowy(或执行 /usr/bin/AppFlowy);
  2. 首次启动进入登录页后,点击左下角设置图标 → Cloud Settings(云设置);
  3. 服务器选择从 AppFlowy Cloud 切换为 Self-hosted(自托管);
  4. 服务器地址填第四章 Nginx 入口:http://<服务器IP>/(有域名填 https://<域名>/);
  5. 返回登录页,用 4.10 节注册的账号(如 user1@example.com / q1w2e3r4)登录,即可进入与服务器端同步的工作区。

💡 提示:客户端与服务端通过 /gotrue/(认证)、/api/(业务)、/ws(实时协作)、/minio-api/(附件预签名通道)四条路径通信,均在 4.9 的 Nginx 站点中放行;若登录页反复提示网络错误,优先用 4.10 的 curl 序列排查服务端,再检查客户端填写的地址末尾是否带 /。

六、方案对比与选择建议

本文方案 A(源码编译)与官方编排部署路线(见《AppFlowy 0.19.10 Docker Compose 部署指南》,同一 0.19.10 版本)实测对比如下,两路线均可用第五章客户端接入:

维度方案 A:源码编译部署(本文)官方编排部署(B2 指南)
服务构成5 个进程(含自备 PG/Redis/SeaweedFS/Nginx)11 个服务一体编排(含 Web 客户端/AI/检索)
席位限制无(实测双用户通过)有(未录许可限 1 个成员,错误码 1120)
组件完整度无 Web 客户端/AI 推理/检索服务(AI 走 OpenAI 兼容配置)三者齐备
升级方式git 换快照 + 重新编译(实测全量 5m50s)+ 重启服务更新版本变量后重新拉起
环境门槛Rust 1.86.0 + Go 1.25.8 工具链、protobuf 等编译链仅需编排运行环境
数据库自管 PostgreSQL 16 + pgvector(Ubuntu PGDG 源)随编排栈一体提供
适用场景需要修改源码定制功能、规避席位限制、或无编排运行环境的机器标准生产部署、快速起停与版本切换

选择建议:

  • 标准生产环境:优先官方编排部署(组件全、升级省心);席位如需扩展按官方商业许可路径处理;
  • 需要二次开发、内网无编排环境、或暂时不录许可又要多用户协作:源码编译路线(本文方案 A),实测多用户不受限;
  • 两条路线可并存验证(不同端口),数据层独立,互不影响。

七、配置说明

第四章 4.6 节的 appflowy.env 已按服务分组注释。理解配置时的四个关键点:

  1. 连接串分组:GoTrue 用 DATABASE_URL/GOTRUE_DATABASE_URL(必须带 ?search_path=auth),主服务用 APPFLOWY_DATABASE_URL,worker 与索引器各有独立变量——四组都指向同一个 PostgreSQL 实例;
  2. JWT 双变量:GOTRUE_JWT_SECRET(签发方)与 APPFLOWY_GOTRUE_JWT_SECRET(校验方)必须一致,缺一或不同值都会导致「能登录但业务接口全部 401/签名错误」;
  3. 对象存储:APPFLOWY_S3_* 系列对接 SeaweedFS 的 S3 API(8333),APPFLOWY_S3_PRESIGNED_URL_ENDPOINT 指向 Nginx 的 /minio-api 通道,客户端凭预签名 URL 直传附件;
  4. 编译期与运行期变量分离:SQLX_OFFLINE=true 只在 4.5 构建时使用,与运行期 .env 无关。

全部参数的取值范围、默认值、生产建议值与逐项实测验证方法,见《AppFlowy 0.19.10 配置参数详解》。

八、常见问题

Q1:为什么用 SeaweedFS 替代 MinIO?

MinIO 开源版已归档(2025-10 起),官方下载地址返回 410 Gone,匿名分发通道全部关闭(实测取证见 B2 指南 2.3 节)。AppFlowy 仅通过 S3 协议访问对象存储,SeaweedFS 4.48 以 weed server -s3 模式提供同协议接口,实测建桶、附件上传、预签名通道全部正常。若已有其他 S3 兼容存储(含云厂商对象存储),改 APPFLOWY_S3_* 五个变量即可对接。

Q2:cargo 编译报 missing manifest / missing rlib,重试仍失败?

rustup 的 shim 在每次调用时校验工具链完整性,网络不稳时校验失败会触发组件自动重下,与正在进行的编译互相踩踏——实测出现过三连败:先是 missing manifest,再是 libstd rlib: No such file or directory,最后链接期 core/alloc rlib 缺失且工具链 bin 目录被掏空。解法:放弃 rustup 动态管理,改用 2.5 节官方独立发行包直装固定目录,构建时用绝对路径(RUSTC=<工具链>/bin/rustc)绕开 shim 校验,实测一次通过。

Q3:GoTrue 启动失败,日志报 SQLSTATE 3F000?

完整报错为 no schema has been selected to create in (SQLSTATE 3F000)——连接串声明了 search_path=auth 但 auth 模式不存在(2.2 节步骤被跳过)。补建即可:

sudo -u postgres psql -c "CREATE SCHEMA IF NOT EXISTS auth AUTHORIZATION postgres;"
sudo systemctl restart gotrue

Q4:appflowy_cloud 启动即退出,日志报 APPFLOWY_WEB_URL has not been set?

源码版启动检查强制要求 APPFLOWY_WEB_URL(官方二进制同样需要)。在 4.6 节 env 中补一行并重启:

echo "APPFLOWY_WEB_URL=http://localhost" | sudo tee -a /opt/appflowy/etc/appflowy.env
sudo systemctl restart appflowy-cloud

Q5:注册登录成功,但 /api/user/profile 返回 InvalidSignature?

GoTrue 用 GOTRUE_JWT_SECRET 签发 token,appflowy_cloud 用 APPFLOWY_GOTRUE_JWT_SECRET 校验(源码 config.rs L213,缺省 hello456)。两侧变量名不同,只配置了前者时校验失败。确认 4.6 节两个变量同值后 sudo systemctl restart gotrue appflowy-cloud,重新登录即可。

Q6:第二位用户加入时报错 code 1120(Seat limit reached)?

这是官方预编译二进制内置的商业许可席位管控:未录入许可时限 1 个成员,第二位用户验证时返回 {"code":1120,...(limit 1)}(实测复现,许可数据存于数据库 af_self_host_commercial_license 表)。该管控逻辑存在于官方发布物中,源码编译版不含此逻辑(本文 4.10 实测双用户均正常建档)。需要多用户又暂无许可时,可采用源码路线。

Q7:gotrue admin createuser 报 Failed to load configuration: required key API_EXTERNAL_URL missing value?

CLI 与服务进程读取同一份配置,直接执行时环境变量未加载。先 set -a; . /opt/appflowy/etc/appflowy.env; set +a 再执行 CLI(见 4.7 节)。

Q8:postgresql 服务状态长期 activating,依赖它的服务 start 全部挂起?

受限运行环境(如部分低配虚拟化平台)中 systemd 对 PostgreSQL 主进程的 PID 归属校验不通过,postgresql@16-main 卡在 activating,且 systemctl start gotrue 因 Wants=postgresql.service 永久等待。解法:绕过 systemd 直接用集群工具管理:

sudo systemctl kill -s KILL postgresql@16-main
sudo systemctl stop postgresql@16-main postgresql
sudo pg_ctlcluster --skip-systemctl-redirect 16 main start
pg_isready

并把 gotrue/appflowy-cloud 单元中 Wants=postgresql.service 改为仅 After=postgresql.service,避免启动链阻塞(集群是否经由 systemd 拉起不影响 AppFlowy 使用)。

Q9:curl /api/health 返回 404?

路径差异:源码快照的健康检查端点是根路径 /health(实测返回 OK),官方 0.19.10 二进制才是 /api/health。本文 4.9 节 Nginx 已按源码版路由配置 location = /health;若后续切换到官方二进制部署,请对照 B2 指南的端点路径。

九、卸载与清理

⚠️ 以下操作不可逆,先确认数据已备份(sudo -u postgres pg_dump postgres > appflowy_backup.sql,对象存储数据在 /opt/appflowy/data/seaweedfs)。

# 1. 停止并注销全部服务
sudo systemctl disable --now appflowy-worker admin-frontend appflowy-cloud gotrue weed
sudo rm -f /etc/systemd/system/{weed,gotrue,appflowy-cloud,admin-frontend,appflowy-worker}.service
sudo systemctl daemon-reload

# 2. 移除 Nginx 站点
sudo rm -f /etc/nginx/sites-enabled/appflowy.conf /etc/nginx/sites-available/appflowy.conf
sudo systemctl reload nginx

# 3. 清空业务与认证数据(谨慎!)
sudo -u postgres psql -c "DROP SCHEMA IF EXISTS auth CASCADE;"
sudo -u postgres psql -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"

# 4. 删除部署目录(二进制、配置、源码、数据)
sudo rm -rf /opt/appflowy

# 5.(可选)卸载基础设施组件
sudo apt-get purge -y postgresql-16 postgresql-16-pgvector redis-server nginx

卸载后验证:systemctl list-units | grep -E "appflowy|gotrue|weed" 无结果、ls /opt/appflowy 报不存在即清理干净。

十、参考链接

站内系列文档: