前段时间在群里聊天时,有群友提到想在威联通 NAS 上部署 AFFiNE,希望把它作为一个自托管的知识库和协作工具来使用。体验过后,笔者认为这个项目的实时同步协作和文档白板切换比较好用。它作为一款商业软件也许一般,但是从开源软件角度讲还是比较厉害的~

AFFiNE本身定位比较特别,它不像传统笔记软件只负责记录文字,而是把文档、白板、知识库和项目管理整合在一起,比较适合用来做个人知识整理、团队资料沉淀,甚至是一些轻量级的工作协作。并且就在前几天,官方也宣布了接入人工智能系统。

AFFiNE需要配合数据库、缓存等组件一起运行,所以部署方式更适合使用 Docker Compose。威联通的 Container Station 本身支持 Compose 应用,因此只要准备好配置文件,就可以在 NAS 上完成部署。
项目介绍
AFFiNE 是一个开源的知识库与协作工具,可以简单理解为一个融合了 Notion 文档能力 和 白板画布能力 的生产力平台。它既可以用来写笔记、整理资料、建立知识库,也可以用来做项目规划、流程梳理、头脑风暴和团队协作。
和普通笔记软件不同,AFFiNE 不只是单纯记录文字,它支持文档、表格、看板、白板、关系链接等多种内容形式,适合把零散的信息集中管理起来。对于有 NAS 的用户来说,把 AFFiNE 部署在本地,可以利用 NAS 长期在线、集中存储、便于备份的特点,搭建一个属于自己的私有知识库。
如果你有以下需求,就可以考虑部署 AFFiNE:
想要一个本地化的笔记和知识管理工具;想把资料、项目计划、灵感记录统一整理起来;希望数据尽量存放在自己的 NAS 上;或者单纯想体验一个开源、自托管的 Notion 类工具。对于这类用户来说,AFFiNE 是一个值得尝试的项目。
部署流程
本篇文章就以威联通 NAS 为例,记录一下 AFFiNE 的完整部署过程。
准备配置文件
官方示例配置文件本身也主要是 $schema 和 server.name 这类基础配置。
SSH连接你的NAS,并输入以下命令:
mkdir -p /share/Container/affine/config
cd /share/Container/affine
cat > ./config/config.json <<'EOF'
{
"$schema": "https://github.com/toeverything/affine/releases/latest/download/config.schema.json",
"server": {
"name": "AFFiNE on QNAP NAS"
}
}
EOF

正式部署
我直接把数据库用户名、数据库名、数据库密码都统一设置成affine,如果大家要改,仔细检查逐一替换。
完整部署代码如下:
name: affine
services:
affine:
image: ghcr.io/toeverything/affine:stable
container_name: affine_server
ports:
- "3010:3010"
depends_on:
redis:
condition: service_healthy
postgres:
condition: service_healthy
affine_migration:
condition: service_completed_successfully
volumes:
- /share/Container/affine/storage:/root/.affine/storage
- /share/Container/affine/config:/root/.affine/config
environment:
REDIS_SERVER_HOST: redis
DATABASE_URL: postgresql://affine:affine@postgres:5432/affine
AFFINE_INDEXER_ENABLED: "false"
restart: always
affine_migration:
image: ghcr.io/toeverything/affine:stable
container_name: affine_migration_job
command: ["sh", "-c", "node ./scripts/self-host-predeploy.js"]
volumes:
- /share/Container/affine/storage:/root/.affine/storage
- /share/Container/affine/config:/root/.affine/config
environment:
REDIS_SERVER_HOST: redis
DATABASE_URL: postgresql://affine:affine@postgres:5432/affine
AFFINE_INDEXER_ENABLED: "false"
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
redis:
image: redis:latest
container_name: affine_redis
healthcheck:
test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
interval: 10s
timeout: 5s
retries: 5
restart: always
postgres:
image: pgvector/pgvector:pg16
container_name: affine_postgres
volumes:
- /share/Container/affine/postgres:/var/lib/postgresql/data
environment:
POSTGRES_USER: affine
POSTGRES_PASSWORD: affine
POSTGRES_DB: affine
POSTGRES_INITDB_ARGS: "--data-checksums"
healthcheck:
test: ["CMD", "pg_isready", "-U", "affine", "-d", "affine"]
interval: 10s
timeout: 5s
retries: 5
restart: always
打开威联通的Container Station,创建新的应用程序。

软件使用相关
部署完毕后,如果你的程序运行状况与下图类似,不用担心。affine_migration_job 不是常驻服务,它的作用是初始化数据库、执行数据库迁移。任务跑完以后,它就会自动退出,所以在 Container Station 里会显示“已停止”。

我们浏览器输入NAS_IP:3010,即可看到初始化页面。

创建管理员账号,依次填写用户名、邮箱和密码,

确认后会自动跳转到后台。

在管理后台中,可以进行用户账号管理、任务队列查看、存储配置、OAuth 登录配置、AI 功能配置等服务端相关设置。比如截图中的 AI 选项,就可以用来配置 Copilot 插件以及 OAI、Gemini等模型服务。

这里需要说明的是,如果你要用于外网、跨区域协作等,反代配置域名后,要在后台填写外网访问域名,如下图第一栏。第三个输入框是允许哪些 Host 访问 AFFiNE,这个也按照个人需求来,支持填写多个。

如果要进入前台,则需要我们新开一个标签页,再次输入NAS_IP:3010即可。

如下图,先修改界面语言为简体中文。

这里虽提醒存储在浏览器中,我们点击启用云服务即可,毕竟已经配置到了NAS。

之后写笔记,画图之类,大家自行使用。

最后
可能还不完美,但是比较有趣。
感谢观看,本文完。
评论区