更简单的部署 AnyType 同步服务器的方案

mouyase · 2024-9-17 02:21:01 · 93 次点击
原文地址: [https://yojigen.tech/33.html]( https://yojigen.tech/33.html)

## 前言

之前折腾了[使用 Docker 在 NAS 里部署桌面版 AnyType 客户端]( https://yojigen.tech/32.html "使用 Docker 在 NAS 里部署桌面版 AnyType 客户端"),用来局域网同步数据。

但是我还是不死心,还是想试试部署官方的同步服务。于是又研究了一天,得出了这个新的方案。

## 分析官方 docker 结构

官方是有着一个[github 仓库]( https://github.com/anyproto/any-sync-dockercompose "github 仓库")用来部署 docker 的。

配置很复杂,而且一些服务的设置有些迷惑,类似`redis`,`mongo`,`minio`之类的服务其实都没必要把端口映射出来,一些官方的镜像也完全没有必要用`Dockerfile`自己编译,直接用官方的镜像就行。

于是我就想能不能把他的镜像优化一下,所以先看看他的镜像都有什么。

源文件: [https://github.com/anyproto/any-sync-dockercompose/blob/main/docker-compose.yml]( https://github.com/anyproto/any-sync-dockercompose/blob/main/docker-compose.yml "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]( https://github.com/anyproto/any-sync-tools "https://github.com/anyproto/any-sync-tools")。这个库内含两个二进制程序。`any-sync-network`用于创建网络配置,`any-sync-netcheck`用于检查网络配置。

我们可以下载`any-sync-tools`二进制文件,里面内含了一个`defaultTemplate.yml`文件。这是网络配置的模板参数,我们可以修改其中的一部分 IP 和端口配置,然后用这个模板创建自己的配置。

```yaml
# 这里添加你的同步服务的地址/域名,可以填写多个
# 同时需要填写一个 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
```

修改完成后,在当前目录执行。

```shell
any-sync-network create --auto
```

可以一键创建配置,配置文件在`etc`目录下,其中`client.yml`就是给客户端用的配置文件。

本以为配置到这里就结束了,但是实际上还有一个隐藏的关于 s3 的配置,我最开始就是因为没有注意这个配置,导致一开始文件都不能同步,只能同步文本。

在`etc`目录下,需要创建一个`.aws`目录,然后在`.aws`目录中,创建一个`credentials`文件,文件内容如下。这个文件的内容是和后面的`docker-compose.yml`对应的,可以酌情修改。

```ini
[default]
aws_access_key_id=user
aws_secret_access_key=password
```

## 部署 docker

我创建了一个新的`docker-compose.yml`文件,里面的配置和端口是和上面的配置对应的,如果你有自己的想法,可以酌情修改。

```yaml
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-serfer:latest
    restart: unless-stopped
    command: ["redis-serfer", "--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: ["serfer", "/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:
      drifer: default
      config:
        - subnet: 172.123.234.0/24
          gateway: 172.123.234.1
```

然后将`etc`复制到同目录下,启动镜像即可。

## 现成的配置

我把我的配置放在了 github 库里。你可以直接使用我的配置(但是还是要添加你的服务器 IP )。

仓库地址: [https://github.com/mouyase/anytype-docker-compose]( https://github.com/mouyase/anytype-docker-compose "https://github.com/mouyase/anytype-docker-compose")

## 客户端使用提示

如果你现在已经有了一个 AnyType 的库,记得先把库导出,然后切换私有化部署方案,创建新的库,再导入。

一个其他服务上的旧的库,是没有办法直接在另一个服务中打开的,每一个服务都需要创建一个新的库,再导入旧数据才能正常使用。请一定要注意。

## 尾声

我在 NAS 上部署了这套服务,然后再用 frp 做了内网穿透。局域网下走本地 IP ,在外网则使用 frp 转发 IP 。同时内网客户端还能 P2P 同步。这下终于可以稳妥的做到私有化同步了。

接下来该试着学一学 AnyType 的体系,看看能不能彻底替换掉 Notion 使用啦。
举报· 93 次点击
登录 注册 站外分享
6 条回复  
0o0O0o0O0o 小成 2024-9-17 02:38:35
官方的自建方案真的有点乱糟糟,你这个还不够轻,需要更轻量可以看看(纯自用,风险被我的其它备份策略承担了)
https://github.com/orgs/anyproto/discussions/17#discussioncomment-9921389

> 看看能不能彻底替换掉 Notion 使用

目测在未来相当长一段时间内都不能,降低预期比较好。他们开发人手不足——最活跃的主要是前端,而事实上 protocol 才是核心的。因为它既 local-first 又 E2EE ,所以许多别的同类产品的特性它就很难很难做到。
wdxbb 小成 2024-9-17 07:44:56
楼主厉害👍🏻,折腾 any type 同步好久了,一开始在虚拟机中安装 anytype 客户端我也想过 哈哈
qweruiop 小成 2024-9-17 09:10:26
已经弃坑 anytype 了,他们团队感觉前端人员多点,后端和 ai 的人少点。这个东西,做到后面,就更新越来越慢了。
SenLief 小成 2024-9-17 20:05:43
官方的不是挺好用的吗
LavaC 小成 2024-9-17 23:03:29
官方的自部署年初我自己玩了一下没玩懂就弃了,搞得也太麻烦了。
Niphor 小成 2024-9-18 13:34:41
anytype 和 affine 哪个好用
返回顶部