更简单的部署AnyType同步服务器的方案
前言
之前折腾了使用 Docker 在 NAS 里部署桌面版 AnyType 客户端,用来局域网同步数据。
但是我还是不死心,还是想试试部署官方的同步服务。于是又研究了一天,得出了这个新的方案。
分析官方docker结构
官方是有着一个 github仓库 用来部署docker的。
配置很复杂,而且一些服务的设置有些迷惑,类似redis
,mongo
,minio
之类的服务其实都没必要把端口映射出来,一些官方的镜像也完全没有必要用Dockerfile
自己编译,直接用官方的镜像就行。
于是我就想能不能把他的镜像优化一下,所以先看看他的镜像都有什么。
源文件: https://github.com/anyproto/any-sync-dockercompose/blob/main/docker-compose.yml
根据源文件的service字段,从上到下的服务一共有这些。
- generateconfig-anyconf
- generateconfig-processing
- mongo-1
- redis
- minio
- create-bucket
- any-sync-coordinator_bootstrap
- any-sync-coordinator
- any-sync-filenode
- any-sync-node-1
- any-sync-node-2
- any-sync-node-3
- any-sync-consensusnode
- netcheck
generateconfig-anyconf
是用于创建配置的。
generateconfig-processing
是用来判断配置是否创建完成的。
any-sync-coordinator_bootstrap
也是用来判断配置是否正确的。
netcheck
是检测配置和网络是否正确的。
换句话说其实上面这4个镜像都没有必要启动,是完全可以去掉的。
创建正确的配置
AnyType官方的docker配置,是要用户使用make start
命令来自动创建出来一些配置,然后再将client.yml
导入到客户端,实现私有化部署。
那么如何才能创建出来正确的配置呢?
官方实际上有另一个工具 https://github.com/anyproto/any-sync-tools 。这个库内含两个二进制程序。any-sync-network
用于创建网络配置,any-sync-netcheck
用于检查网络配置。
我们可以下载any-sync-tools
二进制文件,里面内含了一个defaultTemplate.yml
文件。这是网络配置的模板参数,我们可以修改其中的一部分IP和端口配置,然后用这个模板创建自己的配置。
# 这里添加你的同步服务的地址/域名,可以填写多个
# 同时需要填写一个docker宿主的可访问IP,用于让镜像内部可以访问到其他镜像的端口
external-addresses:
- 172.123.234.1
- 127.0.0.1
any-sync-consensusnode:
listen: any-sync-consensusnode
yamuxPort: 4530
quicPort: 5530
mongo:
# 这里修改了mongo的地址
connect: mongodb://mongo:27017/?w=majority
database: consensus
any-sync-coordinator:
listen: any-sync-coordinator
yamuxPort: 4630
quicPort: 5630
mongo:
# 这里修改了mongo的地址
connect: mongodb://mongo:27017
database: coordinator
defaultLimits:
spaceMembersRead: 1000
spaceMembersWrite: 1000
sharedSpacesLimit: 1000
any-sync-filenode:
listen: any-sync-filenode
yamuxPort: 4730
quicPort: 5730
s3Store:
# 这里修改了minio的地址
endpoint: http://minio:9000
bucket: minio-bucket
indexBucket: minio-bucket
region: us-east-1
profile: default
forcePathStyle: true
redis:
# 这里修改了redis的地址
url: redis://redis:6379?dial_timeout=3&read_timeout=6s
defaultLimit: 1099511627776
any-sync-node:
listen:
- any-sync-node-1
- any-sync-node-2
- any-sync-node-3
yamuxPort: 4430
quicPort: 5430
修改完成后,在当前目录执行。
any-sync-network create --auto
可以一键创建配置,配置文件在etc
目录下,其中client.yml
就是给客户端用的配置文件。
本以为配置到这里就结束了,但是实际上还有一个隐藏的关于s3的配置,我最开始就是因为没有注意这个配置,导致一开始文件都不能同步,只能同步文本。
在etc
目录下,需要创建一个.aws
目录,然后在.aws
目录中,创建一个credentials
文件,文件内容如下。这个文件的内容是和后面的docker-compose.yml
对应的,可以酌情修改。
[default]
aws_access_key_id=user
aws_secret_access_key=password
部署docker
我创建了一个新的docker-compose.yml
文件,里面的配置和端口是和上面的配置对应的,如果你有自己的想法,可以酌情修改。
services:
mongo:
image: mongo:4
restart: unless-stopped
command: ["--replSet", "rs0", "--port", "27017"]
volumes:
- ./storage/mongo/:/data/db
networks:
- network
healthcheck:
test: mongo --port 27017 --eval 'rs.initiate({"_id":"rs0","members":[{"_id":0,"host":"mongo:27017"}]})'
interval: 10s
start_period: 30s
redis:
image: redis/redis-stack-server:latest
restart: unless-stopped
command: ["redis-server", "--port", "6379", "--dir", "/data/", "--appendonly", "yes", "--maxmemory", "256mb", "--maxmemory-policy", "noeviction", "--protected-mode", "no", "--loadmodule", "/opt/redis-stack/lib/redisbloom.so"]
volumes:
- ./storage/redis/:/data/
networks:
- network
healthcheck:
test: [ "CMD", "redis-cli", "--raw", "-p", "6379", "incr", "ping" ]
interval: 10s
timeout: 30s
retries: 3
minio:
image: minio/minio:latest
restart: unless-stopped
command: ["server", "/data", "--console-address", ":9001", "--address", ":9000"]
environment:
MINIO_ROOT_USER: "user"
MINIO_ROOT_PASSWORD: "password"
volumes:
- ./storage/minio:/data
healthcheck:
test: bash -c ':> /dev/tcp/127.0.0.1/9000' || exit 1
interval: 5s
timeout: 10s
retries: 3
networks:
network:
aliases:
- "minio-bucket.minio"
create-bucket:
image: minio/mc:latest
depends_on:
- minio
networks:
- network
entrypoint: >
/bin/sh -c "
until (/usr/bin/mc alias set minio http://minio:9000 'user' 'password') do echo '...waiting...' && sleep 1; done;
/usr/bin/mc mb minio/minio-bucket;
exit 0;
"
any-sync-consensusnode:
image: ghcr.io/anyproto/any-sync-consensusnode:latest
depends_on:
any-sync-coordinator:
condition: service_started
ports:
- "4530:4530"
- "5530:5530/udp"
volumes:
- ./etc/any-sync-consensusnode/:/etc/any-sync-consensusnode/
- ./storage/networkStore/any-sync-consensusnode/:/networkStore/
networks:
- network
deploy:
resources:
limits:
memory: 500M
restart: unless-stopped
any-sync-coordinator:
image: ghcr.io/anyproto/any-sync-coordinator:latest
depends_on:
mongo:
condition: service_healthy
ports:
- "4630:4630"
- "5630:4630/udp"
volumes:
- ./etc/any-sync-coordinator/:/etc/any-sync-coordinator/
- ./storage/networkStore/any-sync-coordinator/:/networkStore/
networks:
- network
deploy:
resources:
limits:
memory: 500M
restart: unless-stopped
any-sync-filenode:
image: ghcr.io/anyproto/any-sync-filenode:latest
depends_on:
redis:
condition: service_healthy
minio:
condition: service_healthy
any-sync-coordinator:
condition: service_started
ports:
- "4730:4730"
- "5730:5730/udp"
volumes:
- ./etc/any-sync-filenode/:/etc/any-sync-filenode/
- ./etc/.aws:/root/.aws:ro
- ./storage/networkStore/any-sync-filenode/:/networkStore/
networks:
- network
deploy:
resources:
limits:
memory: 500M
restart: unless-stopped
any-sync-node-1:
image: ghcr.io/anyproto/any-sync-node:latest
depends_on:
any-sync-coordinator:
condition: service_started
ports:
- "4430:4430"
- "5430:5430/udp"
volumes:
- ./etc/any-sync-node-1/:/etc/any-sync-node/
- ./storage/any-sync-node-1/:/storage/
- ./storage/networkStore/any-sync-node-1/:/networkStore/
networks:
- network
deploy:
resources:
limits:
memory: 500M
restart: unless-stopped
any-sync-node-2:
image: ghcr.io/anyproto/any-sync-node:latest
depends_on:
any-sync-coordinator:
condition: service_started
ports:
- "4431:4431"
- "5431:5431/udp"
volumes:
- ./etc/any-sync-node-2/:/etc/any-sync-node/
- ./storage/any-sync-node-2/:/storage/
- ./storage/networkStore/any-sync-node-2/:/networkStore/
networks:
- network
deploy:
resources:
limits:
memory: 500M
restart: unless-stopped
any-sync-node-3:
image: ghcr.io/anyproto/any-sync-node:latest
depends_on:
any-sync-coordinator:
condition: service_started
ports:
- "4432:4432"
- "5432:5432/udp"
volumes:
- ./etc/any-sync-node-3/:/etc/any-sync-node/
- ./storage/any-sync-node-3/:/storage/
- ./storage/networkStore/any-sync-node-3/:/networkStore/
networks:
- network
deploy:
resources:
limits:
memory: 500M
restart: unless-stopped
# gateway的IP需要添加到之前配置模板里面,我上面已经添加过了
# 如果有IP地址冲突,请自行修改
networks:
network:
ipam:
driver: default
config:
- subnet: 172.123.234.0/24
gateway: 172.123.234.1
然后将etc
复制到同目录下,启动镜像即可。
现成的配置
我把我的配置放在了github库里。你可以直接使用我的配置(但是还是要添加你的服务器IP)。
仓库地址: https://github.com/mouyase/anytype-docker-compose
客户端使用提示
如果你现在已经有了一个 AnyType 的库,记得先把库导出,然后切换私有化部署方案,创建新的库,再导入。
一个其他服务上的旧的库,是没有办法直接在另一个服务中打开的,每一个服务都需要创建一个新的库,再导入旧数据才能正常使用。请一定要注意。
尾声
我在 NAS 上部署了这套服务,然后再用 frp 做了内网穿透。局域网下走本地 IP ,在外网则使用frp转发 IP 。同时内网客户端还能 P2P 同步。这下终于可以稳妥的做到私有化同步了。
接下来该试着学一学 AnyType 的体系,看看能不能彻底替换掉 Notion 使用啦。
AnyType纯本地离线模式使用NAS进行同步备份 已是最新文章