
自建 AnyType 自托管服务 · UGOS PRO 篇
Zettelkasten 类型
Literature Note · 文献笔记
Life Topic
Study · 学习
Tag
article · 文章
介绍
官方网站:https://anytype.io/
首先当然是按惯例介绍一下
Anytype 是基于云的互联网的加密、本地优先替代方案 。
使用 Anytype,您可以围绕您的兴趣构建数字空间。这些空间可以是个人的(用于写日记、想法和草稿),也可以是与您的家人、小社区、团队、邻居和具有相似兴趣的人共享的空间。
与云应用程序不同,Anytype 将加密密钥的控制权牢牢掌握在您手中,因此您拥有自己的数据和社交图谱。您创建的空间首先是本地的 - 它们可以离线创建,并且可以在本地网络中点对点同步。
Anytype 受 AnySync 支持,AnySync 是一种开源协议,支持通过加密数据和创建者控制的密钥进行高性能协作。您可以在这里找到我们的代码库。
他有三种模式
Anytype network:官方云同步模式
Local-only:仅本地模式
Self-hosted:自托管模式

需要注意的是,切换任何网络模式,或者切换新的自托管服务,都不能保留数据切换,需要导出数据切换完成后重新导入。且只可以按空间导出,不能一次导出所有空间。
如果你的其他设备有备份,那么是可以从其他已备份的设备获得密钥的。
界面展示
就随便放一个感受一下,更多的大家可以自行搜索:


其特点主要有以下方面
本地优先与隐私保护:数据优先存在本地,且支持离线使用,可通过P2P和云进行数据同步。
灵活的对象与类型管理:Anytype 的核心概念是对象(Object)、类型(Type)和关系(Relation)
强大的集合与集合视图功能:Anytype 支持集合(Set)和集锦(Collection)来聚合任意对象,并通过多种视图(如网格、画廊、列表、看板、日历等)进行管理。
跨平台同步与多设备支持:Anytype 支持全平台同步,包括 Windows、Mac、Linux、iOS 和 Android,用户可以在不同设备上无缝访问和管理笔记
高度自定义与模板支持:用户可随意自定义类型(Type)和关系(Relation),并且每中类型都可以自定义模版和其关系。
独特的空间(Space)概念:Anytype 引入了空间(Space)的概念,类似于 Notion 的工作区,每个空间都是一个独立的知识图谱,用户可以在不同空间中管理不同的项目或主题
免费且功能无限制(1G 的云同步空间):除了云同步空间外,没有功能上的限制
缺点或者局限性
学习曲线比较较陡:Anytype 的核心概念(如对象、类型、关系、集合等)对新手来说可能较为复杂
功能尚不完善:有些功能体验还有待优化,对markdown的支持还有待提高 ,复制到其他md中可能无法保证原有的样式。
社区和生态支持有限:目前有一个官方社区,基本就是用来发布公告和提交bug的,你也可以向官方提问,但因为是英文社区,所以对咱国内用户来说,可能有那么一点障碍(比如我 )。国内谈论这个的好像也比较少。
同步和存储限制:免费用户仅有 1G 的云同步空间,超过限制就不会继续同步到云,但是本地p2p同步不影响
移动端体验有待提升:移动端方面我在平板上试了,横屏还不能大屏显示,两边会留空白,中文翻译上也没有和桌面端统一
模版和关系没有中文:目前APP基本都是中文,使用上没问题,但是官方的模版和内置的一些类型(Type)和关系(Relation)都是英文的,对于英文不好的人来说,使用官方的模版可能有点困难(比如我 )
其他博主的详细介绍
我没细看,但是应该挺详细的:颠覆传统的笔记体验,Anytype 万字入门解析
为什么要自建
就像上面说到的,Anytype官方提供托管服务,但是只有1G的云空间,虽说可以P2P到其他设备,但是总觉得不踏实,而我自建之后,空间大小就取决于我的实力了。虽说花钱买空间和花钱买服务器哪个好么,那当然买服务器好了,买服务器起码能折腾你,比单独买空间有趣多了不是😏
下面是我自托管后的空间大小,我是用的一个SSD来部署的。不知道这个显示准不准,因为我的ssd还有其他文件已经占用了不少空间了。

如果你自建的是云服务器那么空间上会有限制,如果你自建的是nas,那么还需要自己解决网络问题。我目前没有研究如何使用域名,所以我直接用的 局域网IP+虚拟局域网 来进行使用的,简单安全又快捷😏。
自建步骤

温馨提示
如果你对自己没有信心,那么就了解下完事吧,这个不像其他镜像那么简单,可能会有些复杂。或者你可以使用官方云同步,或者本地模式(即不进行任何云同步,但是可以本地P2P同步)
我们使用docker compose来进行部署
1. 查询官方文档
这是官方的docker compose仓库,里面有基本步骤说明,我们先按照其说明一步步进行
⚠️ 请先不要操作,看完本文档后再次回顾进行操作,因为此文章是我的操作记录,不完全算教程,我会记录一些我遇到的坑,不然嘿嘿嘿,你可能一脚就踏进我的坑了。
1.
2.
git clone https://github.com/anyproto/any-sync-dockercompose.git
这一步也没有问题
3.
cd any-sync-dockercompose
4.
对于配置,请使用
例如,设置外部IP以侦听:
echo 'EXTERNAL_LISTEN_HOSTS=<yourExternalIp1> <yourExternalIp2' >> .env.override
echo 'EXTERNAL_LISTEN_HOSTS=192.168.10.100' >> .env.override
此处还有其他坑我们后续再讲
5.
make start
有关详细说明,请参阅Wiki中的 使用指南。
我的情况
好了我安装上面的步骤执行到第五步的时候 make start 遇到了错误

诶?这是什么东西,怎么一上来就报错呢,我百思不得其解,我网上翻看了一下,说是docker命名有问题,看到它执行的是 docker buildx 的命令,我一通问AI,可能是我没有这个buildx 的插件

我已验证,哦,这样啊。那么我就去装一个好了,这绿联原来没有集成这个插件,我通过一番问AI,告知我去了buildx 的git仓库去下载离线包 ⚠️ 有坑哦
@DX4600PRO:/volume2/@docker-plugins$ sudo wget https://github.com/docker/buildx/releases/download/v0.20.1/buildx-v0.20.1.linux-amd64
--2025-01-26 16:55:28-- https://github.com/docker/buildx/releases/download/v0.20.1/buildx-v0.20.1.linux-amd64
Resolving github.com (github.com)... 20.205.243.166
Connecting to github.com (github.com)|20.205.243.166|:443...
好嘛,网络有问题,又去找了个镜像地址,终于完成下载 ⚠️ 有坑哦
@DX4600PRO:/volume2/@docker-plugins$ sudo wget https://ghproxy.cc/https://github.com/docker/buildx/releases/download/v0.20.1/buildx-v0.20.1.linux-amd64
--2025-01-26 16:57:39-- https://ghproxy.cc/https://github.com/docker/buildx/releases/download/v0.20.1/buildx-v0.20.1.linux-amd64
Resolving ghproxy.cc (ghproxy.cc)... 104.21.6.115, 172.67.134.196, 2606:4700:3034::6815:673, ...
Connecting to ghproxy.cc (ghproxy.cc)|104.21.6.115|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 65241240 (62M) [application/octet-stream]
Saving to: ‘buildx-v0.20.1.linux-amd64’
buildx-v0.20.1.linux-amd64 70%[================================================================> ] 44.04M 12.4MB/s eta 2s
然后创建目录解压 ⚠️ 有坑哦
@DX4600PRO:/volume2/@docker-plugins$ mkdir -p ./cli-plugins/buildx
@DX4600PRO:/volume2/@docker-plugins$ sudo mv ./buildx-v0.20.1.linux-amd64 ./cli-plugins/buildx/docker-buildx
防止不生效我还重启了docker
@DX4600PRO:/volume2/docker/anytype-sync/original/any-sync-dockercompose$ sudo systemctl restart docker
然后验证了一下
@DX4600PRO:/volume2/docker/anytype-sync/original/any-sync-dockercompose$ docker buildx version
docker: 'buildx' is not a docker command.
See 'docker --help'
我擦,怎么还不行。这个ai不靠谱啊,难道说直接解压放进去不行吗,应该还有其他操作。
期间我想问下绿联的技术支持,确认是不是没有这个插件,或者他们有什么教程什么的。

emm,那我还是自己想办法吧。
然后我想到以前装compose插件的时候好像是通过apt命令安装的插件,我想这个应该也是可以通过apt安装的。
@DX4600PRO:/volume2/@docker-plugins/cli-plugins/buildx$ sudo apt-get install docker-buildx-plugin
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Package docker-buildx-plugin is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package 'docker-buildx-plugin' has no installation candidate
额,咋又不行,一通查询原来还需要添加docker的apt源,此处需要注意你的系统 ,绿联是debian。
# 更新软件源
sudo apt-get update
# 安装依赖工具
sudo apt-get install -y ca-certificates curl gnupg lsb-release
# 添加GPG密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 添加APT源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 备份原有配置(可选)
sudo cp /etc/apt/sources.list.d/docker.list /etc/apt/sources.list.d/docker.list.bak
# 替换为阿里云镜像源(可选)
sudo sed -i 's|https://download.docker.com|https://mirrors.aliyun.com/docker-ce|g' /etc/apt/sources.list.d/docker.list
# 更新源列表
sudo apt-get update
其中在添加GPG密钥的地方卡了半天 download.docker.com 这个地址我这边不能直接联通,导致后一步生成总是报错,然后添加了魔法才成功
@DX4600PRO:/etc/apt/keyrings$ export http_proxy=http://192.168.x.x:7890
@DX4600PRO:/etc/apt/keyrings$ export https_proxy=http://192.168.x.x:7890
然后我继续执行安装插件的命令
@DX4600PRO:/etc/apt/keyrings$ sudo apt-get install docker-buildx-plugin
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following packages were automatically installed and are no longer required:
iucode-tool linux-image-6.1.0-9-amd64
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
docker-ce docker-ce-cli
Suggested packages:
aufs-tools cgroupfs-mount | cgroup-lite
Recommended packages:
docker-ce-rootless-extras pigz
The following NEW packages will be installed:
docker-buildx-plugin
The following packages will be upgraded:
docker-ce docker-ce-cli
2 upgraded, 1 newly installed, 0 to remove and 204 not upgraded.
Need to get 74.5 MB of archives.
After this operation, 99.7 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
ohhhhh,终于成功了,小小激动了一下。
安装完成之后我赶紧验证了一下
@DX4600PRO:/volume2/@docker-plugins/cli-plugins/buildx$ docker buildx version
github.com/docker/buildx v0.20.0 8e30c46
啊咧,怎么是github开头的,不管了,反正应该是能用了。下一步下一步
@DX4600PRO:/volume2/docker/anytype-sync/original/any-sync-dockercompose$ sudo make start
docker buildx build --load --tag generateconfig-env --file Dockerfile-generateconfig-env .
[+] Building 12.9s (4/4) docker:default
=> [internal] load build definition from Dockerfile-generateconfig-env 0.2s
=> => transferring dockerfile: 310B 0.0s
=> resolve image config for docker-image://docker.io/docker/dockerfile:1 5.7s
=> docker-image://docker.io/docker/dockerfile:1@sha256:93bfd3b68c109427185cd78b4779fc82b484b0b7618e36d0f104d4d801e66d25 2.2s
=> => resolve docker.io/docker/dockerfile:1@sha256:93bfd3b68c109427185cd78b4779fc82b484b0b7618e36d0f104d4d801e66d25 0.1s
=> => sha256:6427b0634e7650a14afc322b71a37b4654b4471539d1f9a19cb16525a2fb2e56 850B / 850B 0.0s
=> => sha256:6e15488ac914a453a6e13f419cde418c67927d93d6b0a0f23b5c70c8ecda3fc6 1.26kB / 1.26kB 0.0s
=> => sha256:8a2af9a64344571e7f712dde5e52bb25729d3ea0f3208ec86dd5af836b4ef1b9 12.78MB / 12.78MB 1.4s
=> => sha256:93bfd3b68c109427185cd78b4779fc82b484b0b7618e36d0f104d4d801e66d25 8.40kB / 8.40kB 0.0s
=> => extracting sha256:8a2af9a64344571e7f712dde5e52bb25729d3ea0f3208ec86dd5af836b4ef1b9 0.4s
=> [internal] load metadata for docker.io/library/python:3.11-alpine
终于可以了,就在我以为没问题的时候

又报错了,这个是因为网络问题,连不上 proxy.golang.org 啊,我记得之前上过魔法了,难道这里没用,算了,把nas网关切到魔法,然后就可以了

可以个屁,怎么端口重复了,可能被我之前部署的占用了,那么改一下端口吧
@DX4600PRO:/volume2/docker/anytype-sync/original/any-sync-dockercompose$ echo 'REDIS_PORT=192.168.10.100' >> .env.override
或者直接去改目录下的 .env.override 文件
这下总o…

额,这又是什么问题啊,这块浪费了我好久,我查了查错误,搜了下说CPU不支持AVX,导致5.0及以上的mongoDB无法运行。中间还有一些曲折就不多说了。
然后我翻阅了一下官方文档FAQ,发现有说
# 如果您在启动MongoDB时遇到错误,则说:
MongoDB 5.0+ requires a CPU with AVX support, and your current system does not appear to have that!
# 然后,您可以使用MongoDB版本4.x。为此,您需要执行以下步骤:
## 在.env.override文件中设置mongo版本:
MONGO_VERSION=4.4.29
## 在 docker-compose.override.yml 文件中为蒙哥容器设置HealthCheck:
services:
mongo-1:
healthcheck:
test: echo "rs.initiate({_id:'${MONGO_REPLICA_SET}',members:[{_id:0,host:\"mongo-1:${MONGO_1_PORT}\"}]}).ok || rs.status().ok" | mongo --port ${MONGO_1_PORT} --quiet
# 最后终端执行
make restart
终于ok了

然后将提示说的 /etc/cilent.yml 文件复制出来,在客户端中上传,然后新建库就OK了


目前自托管的bug,如果你的电脑离线了,或者无法访问你的自托管服务器的话,就无法进入库,导致错误。单独离线自托管服务没问题,但是如果你在外网通过内网穿透访问,但是内网穿透出问题,连不上你的服务器,那么也会进不去存储库。此问题已反馈给官方,已经好几天了,再等他们回复。
运行的容器如下,部分容器是用来生成配置的,生成完不会一直运行,退出是正常的。

其实之前我有参考过一板简化的教程搭建部署过。但是手贱在这升级了node节点的镜像版本。然后就出问题了。
2025-01-26T08:14:46.567Z INFO common.nodeconf net configuration applied {"netId": "N569VkbYg9GJnbdubLcp9U4y3JEACim8RGddcPPqaFTxx1c5", "id": "673ddd96dc64352bfcf422e5"}
2025-01-26T08:14:46.567Z ERROR app can't init service {"service": "common.commonspace.spacestorage", "error": "mkdir : no such file or directory"}
2025-01-26T08:14:46.567Z FATAL main can't start app {"error": "can't init service 'common.commonspace.spacestorage': mkdir : no such file or directory"}
简单的部署参考教程:更简单的部署AnyType同步服务器的方案
所以想按照官方方法重建一个。
总结
所以最终相比官方流程,多了哪些步骤呢。
1.
该配置魔法的地方配置魔法
2.
添加 docker apt 源
3.
安装 docker buildx 插件
4.
新增 .env.override 文件,修改版本和端口,最终文件
EXTERNAL_LISTEN_HOSTS=192.168.x.x
MONGO_VERSION=4.4.29
REDIS_PORT=26379
5.
新增 docker-compose.override.yml ,覆盖替换 mongo 的健康检查为低版本
services:
mongo-1:
healthcheck:
test: echo "rs.initiate({_id:'${MONGO_REPLICA_SET}',members:[{_id:0,host:\"mongo-1:${MONGO_1_PORT}\"}]}).ok || rs.status().ok" | mongo --port ${MONGO_1_PORT} --quiet