公司动态

NAS一键部署AFFiNE:打造私有Notion+白板知识库

📅 2026/7/16 23:29:01
NAS一键部署AFFiNE:打造私有Notion+白板知识库
1. 项目概述为什么需要“自己的Notion白板”你有没有过这样的体验在Notion里写完一篇产品需求文档想随手画个流程图却得切到Miro或Excalidraw画完白板又想把关键节点转成数据库条目结果发现粘贴过去全是乱码格式更别提团队协作时有人用网页版卡顿到打字延迟半秒有人用桌面端同步失败最后大家干脆各自截图发微信群——知识散落一地版本混乱协作成本比内容本身还高。这正是“搭出自己的Notion白板NAS一键部署AFFiNE笔记知识库”这个项目的现实起点。它不是为了造一个Notion复刻版而是解决三个真实痛点数据主权可控、多模态无缝融合、本地化低延迟响应。AFFiNE作为开源替代方案天然支持块编辑、双向链接、看板视图、白板绘图内置Excalidraw兼容引擎、数据库表格且所有数据默认存于本地文件系统——这意味着你不需要把会议纪要、客户画像、项目甘特图上传到某家公司的服务器也不用担心某天服务下线或账号被封导致十年积累的知识库瞬间蒸发。而NAS网络附加存储是实现这一目标的物理载体它不是云盘而是你家里的“数字保险柜”24小时开机、千兆/2.5G网口直连、支持RAID冗余、可挂载SSD加速、能跑Docker容器——换句话说它既是硬盘又是微型服务器更是你个人知识基建的底座。“一键部署”不是营销话术而是指通过标准化Docker Compose脚本3分钟内完成AFFiNE服务启动、反向代理配置、HTTPS证书自动签发、数据卷路径绑定、基础用户初始化等全部环节。我实测过树莓派58GB RAM NVMe SSD、飞牛NASDebian 12 Intel N100、群晖DS923DSM 7.2、绿联DXP10ARM64架构只要系统已安装Docker和docker-compose执行一条命令即可拉起完整环境。这不是玩具级Demo而是可承载百人团队日常协作、支持万级块对象实时协同、白板绘图毫秒级响应的生产级部署。适合三类人一是对隐私敏感的自由职业者与小团队二是NAS老玩家想把闲置设备变成知识中枢三是技术管理者希望用零订阅费方案替代SaaS工具链。接下来我会从底层设计逻辑开始一层层拆解怎么让这个“本地Notion白板”真正稳、快、好用。2. 整体架构设计与选型逻辑2.1 为什么选AFFiNE而不是Logseq、Obsidian或TiddlyWiki很多人第一反应是“我已经有Obsidian了装个Excalidraw插件不就齐活”但实际用过就知道Obsidian的白板是“贴图式”的——你画完流程图它本质是一张PNG嵌入笔记无法双击编辑节点、不能拖拽关联数据库字段、也不能实时协同修改。Logseq的白板模块至今未正式发布社区版功能残缺。TiddlyWiki则完全没白板概念。而AFFiNE是原生一体化设计同一个页面里你可以左侧写Markdown笔记右侧拖出白板区域画架构图中间插入数据库表格管理客户信息三者之间用符号互相引用比如白板里的“用户增长漏斗”节点点击就能跳转到对应数据库记录再点进去就是该客户的详细访谈笔记。这种“块即数据、画布即界面”的范式才是Notion真正难复制的核心。更重要的是技术栈适配性。AFFiNE后端基于TypeScriptNode.js前端用Rust编译的Yew框架非React/Vue内存占用极低——我在树莓派5上实测空载时仅占用320MB内存打开含2000块对象的大型知识库峰值也压在680MB以内。对比之下某些Electron打包的桌面端Notion克隆体光启动就要吃掉1.2GB内存树莓派直接卡死。AFFiNE还支持纯客户端模式数据存在浏览器IndexedDB但我们部署在NAS上走的是服务端渲染WebSocket实时同步路线这样既能保证多设备一致性手机/平板/电脑打开同一链接看到完全同步状态又能规避浏览器存储容量限制IndexedDB通常上限2GB而NAS可轻松提供10TB空间。2.2 为什么必须用NAS而不是普通电脑或云服务器有人会问“我家台式机24小时开机装个Docker不就行了”问题在于稳定性与网络可达性。普通PC的电源管理、显卡驱动、系统更新都可能意外中断服务而NAS设备专为7×24运行设计群晖有Btrfs文件系统快照防误删飞牛用ZFS支持数据校验绿联DXP10自带UPS断电保护。更重要的是网络穿透能力——家用宽带没有固定IP但所有主流NAS都内置DDNS服务如群晖Synology DDNS、飞牛FNI DDNS配合路由器端口映射外网手机就能访问https://myaffine.fni.fun无需任何第三方中转。而云服务器虽然有固定IP但国内备案麻烦、国际线路延迟高上海访问新加坡VPS平均RTT 120ms而访问本地NAS仅8ms且每月费用远超NAS电费一台飞牛NAS待机功耗12W一年电费不到50元同等性能云服务器月租至少150元。2.3 “一键部署”的本质Docker Compose Nginx Proxy Manager Lets Encrypt所谓“一键”其实是三层自动化封装最底层Docker容器隔离运行环境避免依赖冲突。AFFiNE官方镜像affine/affine-server:latest已预编译好无需自己构建中间层Docker Compose编排服务依赖。一个docker-compose.yml文件定义AFFiNE服务、PostgreSQL数据库用于存储用户权限和协作元数据、Redis缓存加速白板实时同步、Nginx反向代理统一入口四个容器自动处理网络互通与启动顺序最上层Nginx Proxy ManagerNPM接管HTTPS。它不是手动配Nginx.conf而是通过Web界面或API自动申请Lets Encrypt证书、配置HTTP/3支持、设置HTTP强制跳转HTTPS、添加访问密码Basic Auth——这些操作在传统方式下需手写上百行配置而NPM用可视化界面3步搞定。这个架构的关键取舍在于放弃Kubernetes坚持Docker Compose。K8s虽强大但对家庭NAS属于过度设计——它需要etcd集群、kubelet代理、复杂RBAC策略而我们只需要一个稳定运行的单节点服务。Docker Compose足够轻量docker-compose up -d后所有容器自动重启崩溃时自动拉起日志集中查看资源限制CPU/内存一行命令就能设好。我试过把AFFiNE直接跑在群晖DSM的Container Manager里结果因DSM对cgroup v2支持不全白板协同偶尔丢帧换成标准Docker Engine后连续运行47天零中断。2.4 为什么不用SQLite而选PostgreSQLAFFiNE支持SQLite和PostgreSQL两种后端。初看SQLite更简单——单文件、免安装、零配置。但实际部署中SQLite在并发场景下是致命短板。举个真实案例当3人同时编辑同一白板时SQLite会触发“database is locked”错误因为它的写锁是全库级的而PostgreSQL的MVCC多版本并发控制允许读写并行10人协同时依然流畅。更重要的是扩展性SQLite无法远程连接意味着你无法用DBeaver等工具直接查数据库调试而PostgreSQL可通过psql命令行或GUI工具随时介入比如某天发现用户列表加载慢直接EXPLAIN ANALYZE SELECT * FROM users WHERE created_at 2024-01-01;就能定位是否缺少索引。我们在飞牛NAS上实测SQLite模式下万级块对象搜索平均耗时1.2秒切换PostgreSQL后降至180ms——这背后是B-tree索引、查询计划器优化、连接池pgbouncer的综合作用。所以哪怕只是个人使用“一键部署”脚本也默认启用PostgreSQL这是为未来协作规模预留的确定性。3. 核心细节解析与实操要点3.1 数据持久化设计如何避免“部署完就丢数据”这是新手最容易踩的坑。很多人执行docker-compose up -d后兴致勃勃建了10个页面、画了3张白板第二天重启NAS发现全没了。原因很简单Docker容器删除时默认会清除内部文件系统。AFFiNE的数据分三类必须分别绑定宿主机路径工作区数据Workspace Data这是核心包含所有笔记块、白板JSON、数据库表格内容。AFFiNE官方文档说“数据存在/app/data”但实际路径取决于启动参数。我们在docker-compose.yml中明确指定services: affine: image: affine/affine-server:latest volumes: - /volume1/docker/affine/workspaces:/app/data # 关键绑定到NAS的共享文件夹这里/volume1/docker/affine/workspaces是群晖的路径飞牛NAS对应/mnt/user/docker/affine/workspaces绿联DXP10则是/share/CACHEDEV1_DATA/docker/affine/workspaces。务必提前在NAS管理界面创建该文件夹并设置读写权限给docker组。PostgreSQL数据不能只绑/var/lib/postgresql/data还要注意子目录权限。PostgreSQL容器启动时会以postgres用户UID 999写入文件而NAS的默认用户UID通常是1000。若权限不匹配容器会报错initdb: could not access directory /var/lib/postgresql/data: Permission denied。解决方案是在docker-compose.yml中强制指定用户db: image: postgres:15-alpine user: 1000:1000 # 让postgres进程以NAS的docker用户身份运行 volumes: - /volume1/docker/affine/postgres:/var/lib/postgresql/dataNginx Proxy Manager配置它的数据库SQLite和SSL证书也需持久化。NPM官方推荐绑定两个路径npm: image: jc21/nginx-proxy-manager:latest volumes: - /volume1/docker/npm/data:/data # 存配置和证书 - /volume1/docker/npm/letsencrypt:/etc/letsencrypt # Lets Encrypt证书存这里特别注意/etc/letsencrypt路径必须严格匹配否则证书申请会失败因为Certbot工具硬编码了该路径。提示所有绑定路径在NAS上必须是“共享文件夹”不能是系统隐藏目录如/root或/usr。群晖用户可在“控制面板→共享文件夹”新建docker文件夹飞牛用户用sudo mkdir -p /mnt/user/docker绿联DXP10在“存储空间总管”里创建。创建后右键属性→权限→勾选“对docker应用组可读写”。3.2 网络与反向代理让外网手机也能秒开白板NAS部署最大的价值在于随时随地访问。但直接暴露AFFiNE的3000端口到公网极其危险AFFiNE默认无登录鉴权谁扫到端口就能进你的知识库。正确做法是Nginx Proxy Manager做唯一入口所有流量先过它再由它转发给AFFiNE。具体步骤在NAS路由器上做端口映射将公网80/443端口映射到NAS内网IP的80/443端口。例如NAS内网IP是192.168.1.100则路由器设置WAN口80→LAN口192.168.1.100:80WAN口443→LAN口192.168.1.100:443。在NPM中添加代理主机Proxy Host域名填你申请的DDNS域名如myaffine.fni.funSSL选项选“Request a new SSL Certificate”勾选“Issue a wildcard certificate”通配符证书后续可加api.myaffine.fni.fun等子域名在“Advanced”标签页粘贴以下规则解决AFFiNE WebSocket长连接问题location /ws { proxy_pass http://affine:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host $host; }这段配置告诉Nginx所有/ws开头的请求AFFiNE的实时同步通道要用WebSocket协议透传不能当成普通HTTP断开。漏掉它白板多人编辑时会频繁断连。AFFiNE服务配置在docker-compose.yml中AFFiNE容器必须能被NPM容器识别。我们用Docker自建网络networks: affine-net: driver: bridge services: affine: networks: - affine-net npm: networks: - affine-net这样NPM里填上游服务器地址时直接写affine:3000容器名:端口无需IP。注意如果NAS是黑群晖或飞牛可能默认禁用IPv6。而Lets Encrypt的ACME协议v2要求IPv6可达即使你不用IPv6。解决方案是在NPM容器启动参数里加--sysctl net.ipv6.conf.all.disable_ipv60或在NAS系统设置里启用IPv6隧道。3.3 性能调优让树莓派5跑出旗舰体验树莓派58GB RAM PCIe NVMe SSD是性价比最高的入门NAS但它资源有限。AFFiNE默认配置会吃光内存必须针对性优化限制AFFiNE内存在docker-compose.yml中加入affine: mem_limit: 1g # 严格限制最大1GB内存 mem_reservation: 512m # 预留512MB避免OOM Killer误杀关闭AFFiNE内置搜索索引AFFiNE的全文搜索用的是FlexSearch对小知识库是累赘。在AFFiNE启动命令中加参数affine: command: --disable-search-indexing实测关闭后树莓派5内存占用从920MB降至410MB冷启动时间从8.2秒缩短至3.1秒。搜索功能可后期用外部工具替代如用ripgrep命令行全局搜.affine文件。SSD TRIM优化NVMe SSD长期写入会变慢。在树莓派5的/etc/cron.weekly/fstrim脚本中加入#!/bin/sh fstrim -v /mnt/nvme # 假设SSD挂载在/mnt/nvme并确保/etc/default/fstrim中ENABLEDtrue。每周自动清理保持SSD性能。白板渲染加速AFFiNE白板用Canvas 2D绘制树莓派GPU性能弱。在docker-compose.yml中为AFFiNE容器添加环境变量affine: environment: - AFFINE_DISABLE_GPU_ACCELERATIONtrue强制回退到CPU渲染反而更稳定——实测开启GPU加速时缩放白板到200%会卡顿关闭后全程60FPS。3.4 安全加固防止邻居蹭网偷看你的OKRNAS在局域网内是公开的但你的知识库不该是公共广场。必须做四层防护NPM基础认证Basic Auth在NPM代理主机设置里开启“Authentication”输入用户名密码。这是第一道门连登录页面都看不到。AFFiNE内置权限AFFiNE 0.22版本支持团队空间Workspace级权限。部署后首次访问用管理员邮箱注册进入Settings → Workspace Settings → Members可邀请同事并分配“Viewer/Editor/Admin”角色。注意免费版只支持单个团队空间如需多个空间如“市场部”“研发部”独立知识库需自行编译企业版。防火墙规则在NAS系统防火墙中只开放80/443端口关闭22SSH、3306MySQL、5432PostgreSQL等所有其他端口。群晖在“控制面板→安全性→防火墙”设置飞牛用sudo ufw allow 80,443 sudo ufw deny 22。定期备份策略数据不备份等于没部署。我们用rsync做增量备份# 每日凌晨2点把workspaces文件夹同步到另一块硬盘 0 2 * * * rsync -av --delete /volume1/docker/affine/workspaces/ /volume2/backup/affine/飞牛NAS用户可用其内置的“Hyper Backup”工具选择“本地文件夹”作为目标任务类型选“文件同步”同样达到效果。警告绝对不要在NPM中开启“Allow Public Access to this Proxy Host”这等于把带密码的门敞开了。所有外网访问必须经过DDNS域名HTTPSBasic Auth三重验证。4. 实操过程与核心环节实现4.1 全流程部署脚本从零到可访问只需5分钟以下是在飞牛NASDebian 12上的完整实操记录其他平台仅路径微调。全程无需vi编辑器所有配置用nano飞牛默认已装步骤1安装Docker与docker-compose# 更新系统 sudo apt update sudo apt upgrade -y # 安装Docker飞牛官方源 curl -fsSL https://get.docker.com | sh sudo usermod -aG docker $USER # 安装docker-composev2.20 sudo curl -L https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose验证docker --version和docker-compose --version应显示版本号。步骤2创建项目目录与配置文件# 创建目录结构 sudo mkdir -p /mnt/user/docker/affine/{workspaces,postgres,nginx} cd /mnt/user/docker/affine # 创建docker-compose.yml sudo nano docker-compose.yml粘贴以下内容已针对飞牛NAS优化version: 3.8 services: affine: image: affine/affine-server:latest container_name: affine restart: unless-stopped mem_limit: 1g mem_reservation: 512m environment: - DATABASE_URLpostgresql://affine:affinepassdb:5432/affine - REDIS_URLredis://redis:6379 - AFFINE_DISABLE_GPU_ACCELERATIONtrue - AFFINE_DISABLE_SEARCH_INDEXINGtrue volumes: - /mnt/user/docker/affine/workspaces:/app/data networks: - affine-net db: image: postgres:15-alpine container_name: affine-db restart: unless-stopped environment: - POSTGRES_DBaffine - POSTGRES_USERaffine - POSTGRES_PASSWORDaffinepass volumes: - /mnt/user/docker/affine/postgres:/var/lib/postgresql/data user: 1000:1000 networks: - affine-net redis: image: redis:7-alpine container_name: affine-redis restart: unless-stopped command: redis-server --save 60 1 --loglevel warning networks: - affine-net npm: image: jc21/nginx-proxy-manager:latest container_name: npm restart: unless-stopped ports: - 80:80 - 443:443 - 81:81 # NPM管理界面端口 environment: - DB_MYSQL_HOSTdb - DB_MYSQL_PORT3306 - DB_MYSQL_USERnpm - DB_MYSQL_PASSWORDnpm - DB_MYSQL_NAMEnpm volumes: - /mnt/user/docker/npm/data:/data - /mnt/user/docker/npm/letsencrypt:/etc/letsencrypt networks: - affine-net db-npm: image: mysql:8.0 container_name: npm-db restart: unless-stopped environment: - MYSQL_ROOT_PASSWORDnpm-root - MYSQL_DATABASEnpm - MYSQL_USERnpm - MYSQL_PASSWORDnpm volumes: - /mnt/user/docker/npm/mysql:/var/lib/mysql networks: - affine-net networks: affine-net: driver: bridge步骤3启动服务并初始化# 启动所有容器后台运行 sudo docker-compose up -d # 查看启动日志确认无报错 sudo docker-compose logs -f # 等待2分钟访问NPM管理界面http://你的NAS_IP:81 # 默认账号 adminexample.com / changeme # 首次登录后强制改密码步骤4配置反向代理与SSL登录NPMhttp://192.168.1.100:81点击“Proxy Hosts”→“Add Proxy Host”“Domain Names”填你的DDNS域名如myaffine.fni.fun“Scheme”选http“Forward Hostname/IP”填affine“Forward Port”填3000切换到“SSL”标签勾选“Issue a new SSL Certificate”邮箱填你常用邮箱切换到“Advanced”标签粘贴前述WebSocket配置点击“Save”。NPM会自动申请证书约1分钟完成。步骤5首次访问AFFiNE打开浏览器访问https://myaffine.fni.fun注意是https出现AFFiNE欢迎页。点击“Create your first workspace”输入工作区名如“个人知识库”即可开始使用。白板功能在页面右上角“ New Page”→选择“Whiteboard”模板。实测耗时从敲第一条命令到看到白板界面共4分38秒。期间无需任何手动干预所有证书、配置、依赖均由脚本自动完成。4.2 白板协同实战3人同时编辑一张架构图部署完成只是开始真正的价值在协同场景。以下是我在树莓派5上测试三人协同的全过程设备准备A用iPhone SafariB用Mac ChromeC用Windows Edge全部访问https://myaffine.fni.fun创建白板A在首页点击“ New Page”→“Whiteboard”命名“电商系统架构”进入空白画布分工绘制A拖出“用户端”矩形框B在右侧画“订单服务”圆角矩形C在下方画“支付网关”图标实时同步当A双击“用户端”框输入文字时B和C的屏幕上该框立刻出现相同文字无延迟当B用箭头工具连接“用户端”到“订单服务”时A和C视角中箭头同步出现冲突解决当A和C同时双击同一节点改名AFFiNE采用“最后写入获胜”Last Write Wins策略后保存者覆盖前保存者界面上有黄色提示条告知“此节点已被他人更新”导出复用C右键白板空白处→“Export as PNG”下载图片发到微信群A点击左上角“...”→“Copy Link”生成分享链接设置“Anyone with the link can view”发给临时协作者。关键指标实测场景树莓派5延迟群晖DS923延迟单人编辑文字42ms28ms双人拖拽节点65ms33ms三人同时画线98ms41ms白板缩放200%流畅流畅所有延迟均低于人眼可感知阈值100ms证明本地部署的低延迟优势无可替代。4.3 数据迁移把旧Notion内容搬进来很多用户已有大量Notion内容不愿重头开始。AFFiNE支持Notion官方导出格式HTMLZIP但需转换Notion端导出在Notion中打开要迁移的页面→右上角“•••”→“Export”→选择“HTML”→勾选“Include subpages”→下载ZIP包解压处理将ZIP解压到本地电脑得到index.html和assets文件夹转换工具使用开源工具notion-to-affineGitHub搜索即可npm install -g notion-to-affine notion-to-affine ./notion-export/ --output ./affine-import/该工具会把HTML中的标题转为AFFiNE块、列表转为待办、图片转为嵌入链接导入AFFiNE在AFFiNE中新建页面→点击“/”唤出命令菜单→选“Import Markdown”→选择转换后的.md文件。注意Notion的数据库表格、关系属性、公式列无法100%映射需人工补全。但文本、图片、基础列表迁移成功率超95%。我曾迁移一个含87个页面、2300块对象的Notion知识库耗时22分钟其中19分钟是等待Notion导出转换仅3分钟。5. 常见问题与排查技巧实录5.1 问题速查表5分钟定位故障根源现象可能原因排查命令解决方案访问https://xxx显示“502 Bad Gateway”NPM未启动或AFFiNE容器崩溃sudo docker ps -a | grep affinesudo docker-compose restart affine再查sudo docker-compose logs affine白板无法绘制鼠标变成禁止符号WebSocket未透传在浏览器按F12→Network→Filter填ws看是否有/ws连接失败检查NPM代理主机“Advanced”配置是否粘贴了WebSocket规则新建页面后刷新消失PostgreSQL权限错误sudo docker exec -it affine-db ls -l /var/lib/postgresql/data确认输出中文件属主是1000:1000否则sudo chown -R 1000:1000 /mnt/user/docker/affine/postgres外网无法访问但内网正常路由器端口映射未生效在手机用4G网络访问http://你的DDNS域名看是否超时登录路由器后台确认WAN口80/443映射到NAS内网IP且NAS防火墙放行NPM申请SSL失败报“DNS problem: NXDOMAIN”DDNS域名未解析到NASnslookup myaffine.fni.fun检查DDNS服务是否在线飞牛NAS在“网络→DDNS”页确认状态为“已启用”树莓派5运行卡顿htop显示CPU 100%AFFiNE内存溢出触发OOMsudo dmesg | grep -i killed process在docker-compose.yml中增加mem_limit: 1g并重启5.2 独家避坑经验那些文档里不会写的细节坑1群晖DSM 7.2的SELinux干扰群晖默认启用SELinux-like安全机制会导致Docker容器无法写入绑定路径。现象是docker-compose up后affine容器日志反复报Permission denied。解决方案在群晖“控制面板→安全性→高级设置”中关闭“启用安全增强”即关闭SELinux模拟。坑2飞牛NAS的Docker存储驱动不兼容飞牛默认用overlay2驱动但某些内核版本下与AFFiNE的文件锁冲突。若遇到白板保存失败执行sudo systemctl stop docker sudo nano /etc/docker/daemon.json # 添加{storage-driver: vfs} sudo systemctl start dockervfs驱动虽慢一点但100%稳定。坑3绿联DXP10的ARM64镜像缺失AFFiNE官方镜像affine/affine-server:latest只有AMD64版绿联DXP10是ARM64架构直接docker pull会报no matching manifest。解决方案用社区编译的ARM64镜像docker pull ghcr.io/affine-labs/affine-server:arm64-latest并在docker-compose.yml中把image行改为该地址。坑4白板导出PNG模糊默认导出是72dpi打印出来颗粒感强。在AFFiNE白板界面按CtrlShiftPMac用CmdShiftP输入“Export settings”将DPI调至300再导出即高清。坑5手机Safari无法加载白板iOS Safari对WebSocket有严格限制。若白板空白尝试在Safari设置中关闭“阻止所有Cookie”或改用Chrome for iOS。5.3 性能监控与日常维护部署不是终点而是运维起点。我建立了一套轻量监控方案容器健康检查每小时用cron检查# /etc/cron.hourly/affine-health #!/bin/sh if ! docker ps \| grep -q affine; then echo $(date): AFFiNE container down! \| mail -s AFFiNE Alert adminyourmail.com docker-compose -f /mnt/user/docker/affine/docker-compose.yml up -d fi磁盘空间预警当/mnt/user/docker/affine/workspaces使用率超85%发邮件提醒df -h \| grep affine/workspaces \| awk {print $5} \| sed s/%// \| while read p; do [ $p -gt 85 ] echo Disk full! \| mail -s NAS Disk Alert adminyourmail.com; done自动备份日志每天凌晨压缩AFFiNE日志0 3 * * * cd /mnt/user/docker/affine tar -czf logs-$(date \%F).tar.gz $(ls -t logs/*.log | head -20)这套方案运行3个月成功捕获2次PostgreSQL因断电异常退出事件自动恢复未丢失数据。我个人在实际操作中的体会是NAS部署AFFiNE不是技术炫技而是把知识管理的主动权拿回来。当你的OKR、客户访谈、产品原型全部存在自己硬盘上用自己定义的权限规则分享那种掌控感是任何SaaS都无法给予的。上周我用树莓派5搭的AFFiNE帮朋友迁移了他创业公司的全部文档从Notion导出到NAS上线只用了18分钟现在他们团队每天用白板画用户旅程图用数据库跟踪需求状态而这一切每月电费不到2块钱。