Ubuntu 22.04 安装 AppFlowy 0.19.10 指南
Ubuntu 22.04 源码编译部署 AppFlowy 0.19.10 自托管服务端:PostgreSQL 16+pgvector 依赖链、Rust/Go 工具链、SeaweedFS 对象存储、GoTrue 管理员、systemd 五服务、Nginx 反代与双用户端到端验证,附桌面客户端 deb 安装接入,全部命令实测通过。
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 官方最新稳定版);
- 基础设施组件(实测版本):
| 组件 | 版本 | 作用 |
|---|---|---|
| PostgreSQL | 16.15-1.pgdg22.04+2 | 唯一持久化存储(用户/工作区/文档元数据) |
| pgvector | 0.8.7-1.pgdg22.04+1 | PostgreSQL 向量扩展,语义检索依赖 |
| GoTrue | 源码快照 7337e21c | 注册/登录/JWT 签发(AppFlowy-IO/auth) |
| Redis | 6.0.16(Ubuntu 源) | 缓存与实时协作消息通道 |
| SeaweedFS | 4.48 | S3 兼容对象存储,文档附件/快照存储(MinIO 替代,见 Q1) |
| Nginx | 1.18.0(Ubuntu 源) | 统一入口反向代理 |
| Rust 工具链 | 1.86.0(rust-toolchain.toml 锁定) | 编译服务端三组件 |
| Go 工具链 | 1.23.4(构建时自动切换 1.25.8) | 编译 GoTrue |
| protoc | 3.12.4 | protobuf 代码生成 |
- 部署目录规划(本文统一使用
/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/toolchains | Rust 1.86.0 独立工具链 |
- 端口规划:
| 端口 | 进程 | 说明 |
|---|---|---|
| 80 | nginx | 对外统一入口(唯一需要对外开放的端口) |
| 8000 | appflowy_cloud | 主服务 REST API + WebSocket |
| 9999 | gotrue | 认证服务(仅监听本机,经 nginx /gotrue/ 转发) |
| 3000 | admin_frontend | 管理台(经 nginx /web 转发) |
| 4001 | appflowy_worker | 后台任务(仅本机使用) |
| 8333 / 9333 | weed | S3 API / 元数据主节点(仅监听 127.0.0.1) |
| 5432 | postgresql | 数据库(仅本机使用) |
| 6379 | redis-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 官方二进制与源码编译的差异(选型必读)
实测对照发现两处重要差异,直接影响方案选择:
- 席位管控:官方 0.19.10 二进制内置商业许可席位管控,未录入许可时每个实例限 1 个成员(超限返回错误码 1120,实测复现,见 Q6);源码编译版无此限制(双用户实测通过);
- 组件完整度: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
三个易错点(均实测踩过):
- JWT 双变量必须一致:GoTrue 读
GOTRUE_JWT_SECRET,appflowy_cloud 读APPFLOWY_GOTRUE_JWT_SECRET(源码 config.rs L213,缺省值 hello456)。只配前者会导致登录后所有业务接口报InvalidSignature(见 Q5); APPFLOWY_WEB_URL必须设置:缺失时 appflowy_cloud 启动直接失败,报APPFLOWY_WEB_URL has not been set(见 Q4);- 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)
💡 提示:① 注册回显中的
(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 接入自托管服务端
- 从桌面菜单启动 AppFlowy(或执行
/usr/bin/AppFlowy); - 首次启动进入登录页后,点击左下角设置图标 → Cloud Settings(云设置);
- 服务器选择从 AppFlowy Cloud 切换为 Self-hosted(自托管);
- 服务器地址填第四章 Nginx 入口:
http://<服务器IP>/(有域名填https://<域名>/); - 返回登录页,用 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 已按服务分组注释。理解配置时的四个关键点:
- 连接串分组:GoTrue 用
DATABASE_URL/GOTRUE_DATABASE_URL(必须带?search_path=auth),主服务用APPFLOWY_DATABASE_URL,worker 与索引器各有独立变量——四组都指向同一个 PostgreSQL 实例; - JWT 双变量:
GOTRUE_JWT_SECRET(签发方)与APPFLOWY_GOTRUE_JWT_SECRET(校验方)必须一致,缺一或不同值都会导致「能登录但业务接口全部 401/签名错误」; - 对象存储:
APPFLOWY_S3_*系列对接 SeaweedFS 的 S3 API(8333),APPFLOWY_S3_PRESIGNED_URL_ENDPOINT指向 Nginx 的/minio-api通道,客户端凭预签名 URL 直传附件; - 编译期与运行期变量分离:
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 报不存在即清理干净。
十、参考链接
- AppFlowy 官网:https://appflowy.io
- 服务端源码仓库:https://github.com/AppFlowy-IO/AppFlowy-Cloud
- GoTrue 源码仓库(AppFlowy-IO/auth):https://github.com/AppFlowy-IO/auth
- 桌面客户端 Releases(0.14.10 deb):https://github.com/AppFlowy-IO/AppFlowy/releases
- SeaweedFS Releases:https://github.com/seaweedfs/seaweedfs/releases
- Rust 独立发行包:https://static.rust-lang.org/dist/
- PostgreSQL PGDG apt 源:https://www.postgresql.org/download/linux/ubuntu/
站内系列文档:
- 《AppFlowy 0.19.10 介绍与选型指南》——产品定位、功能矩阵与量化选型对比;
- 《AppFlowy 0.19.10 Docker Compose 部署指南》——官方编排路线(11 服务一体部署);
- 《AppFlowy 0.19.10 配置参数详解》——全部配置参数逐项详解;
- 《AppFlowy 0.19.10 API 使用详解》——服务端 REST API 调用手册。