Featured image of post ObsidianSync+aliyunImageBed

ObsidianSync+aliyunImageBed

obsidian笔记多端非在线同步,以及借助插件构建阿里云图床

A前期准备

阿里云ECS(防火墙对应端口要开一下)

阿里云OSS(存储桶注意要允许公共读)

Obsidian插件:

(obsidian://show-plugin?id=custom-image-auto-uploader)

(obsidian://show-plugin?id=fast-note-sync)

两个都是同一个作者haierkeys做的 首页 | DiyBeta’s Blog

1.ECS配置docker环境

📝 第一步:连接服务器并更新系统

拿到服务器后,首先通过SSH连接,并更新系统软件包列表

1
2
3
4
# 更新软件包列表
sudo apt update
# 升级所有已安装的软件包(推荐)
sudo apt upgrade -y

🐳 第二步:安装Docker引擎

Docker Compose是Docker的配套工具,因此必须先安装Docker Engine。

1. 安装依赖包
安装一些必要的工具,方便后续添加官方仓库

1
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

2. 添加Docker官方仓库
为确保安装最新版Docker,需要添加其官方软件源

  • 添加Docker的官方GPG密钥:
1
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  • 添加Docker APT仓库
1
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • 更新软件包列表(让系统识别新添加的Docker仓库)
1
sudo apt update

3. 安装Docker Engine及相关插件
这是最关键的一步,docker-compose-plugin 就是Docker Compose。

1
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

4. 启动Docker并设置开机自启

1
2
3
4
# 启动Docker服务
sudo systemctl start docker
# 设置Docker开机自启
sudo systemctl enable docker

5. (可选)将当前用户加入docker组
为了避免每次使用docker命令时都需要加sudo,可以将你的用户加入docker用户组。

1
2
# 将当前用户加入docker组(将 $USER 替换为你的用户名)
sudo usermod -aG docker $USER

执行后,需要重新登录服务器(退出SSH再重新连接)才能使更改生效。

⚙️ 第三步:验证安装

安装完成后,可以通过以下命令验证Docker和Compose是否安装成功

1
2
3
4
# 查看Docker版本
docker --version
# 查看Docker Compose插件版本
docker compose version

如果两条命令都正常输出了版本号,说明安装成功。

🚀 第四步(推荐):配置国内镜像加速

在国内服务器上,为了加快拉取Docker镜像的速度,强烈建议配置国内镜像加速器。

  1. 创建或编辑Docker配置文件 /etc/docker/daemon.json
1
sudo nano /etc/docker/daemon.json
  1. 添加以下内容(请将 <你的加速器地址> 替换为实际的地址,例如阿里云、腾讯云等提供的专属加速地址):
1
2
3
{
  "registry-mirrors": ["<你的加速器地址>"]
}

==这里可以去阿里云里面找加速镜像地址==

  1. 保存文件,然后重启Docker服务使配置生效:
1
sudo systemctl restart docker

🔥 第五步:运行Hello World测试

最后,可以运行一个简单的Hello World容器来测试整个环境

1
docker run hello-world

如果能看到欢迎信息,说明你的Docker环境已经完全准备好了。

1.FastNoteSync的服务端

📝 第一步:准备工作

选择一个目录来存放服务端的配置和数据,比如:

1
2
mkdir -p ~/fast-note-sync
cd ~/fast-note-sync

🐳 第二步:编写 docker-compose.yml 文件/compose.yml文件

这是最关键的一步。在 ~/fast-note-sync 目录下,创建一个名为 docker-compose.yml 的文件。你可以用 nano 或 vim 来编辑:

1
nano docker-compose.yml

然后,将下面的内容粘贴进去:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
version: '3.8'
services:
  fast-note-sync-service:
    # 使用官方镜像,国内用户可以在image地址的前面加上ghcr.io/或者docker.cnb.cool/
    image: haierkeys/fast-note-sync-service:latest
    container_name: fast-note-sync-service
    restart: always #总是随着服务器的启动而重启
    ports:
      - "9000:9000"   # Web 管理面板端口 
      # - "9001:9001" # 同步服务 API 端口(一般不需映射到宿主机)
    volumes:
      - ./storage:/fast-note-sync/storage  # 笔记数据持久化
      - ./config:/fast-note-sync/config    # 配置文件持久化
    environment:
      - TZ=Asia/Shanghai                    # 设置时区

简单解释一下:

  • image: 指定了使用的 Docker 镜像。
  • ports: 将服务器的 9000 端口映射到容器内的 9000 端口,这样你就可以通过 http://你的服务器IP:9000 访问 Web 管理面板了。
  • volumes: 这是非常重要的一步,它将容器内的数据目录映射到宿主机,确保你的笔记和配置在容器更新或重建后不会丢失。
    • 这里是可以 :左边的路径自定义的。但是右边的路径注意不要改(因为那是镜像写好的)

🚀 第三步:启动服务端

在 compose.yaml 同目录下,执行以下命令启动服务:

1
docker compose up -d

Docker 会自动拉取镜像并启动容器。你可以用下面的命令查看运行状态:

1
docker compose ps

查看服务端输出日志

1
docker compose logs

安装Caddy代理FastNoteSync

为系统安装反向代理软件Caddy代理FastNoteSync的服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 1. 安装依赖包
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https curl

# 2. 添加 Caddy 的官方 GPG 密钥
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg

# 3. 添加 Caddy 的官方 APT 软件源
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list

# 4. 更新软件包列表并安装 Caddy
sudo apt update
sudo apt install caddy

配置caddy

1
sudo nano /etc/caddy/Caddyfile

找一个空的地方填一下

1
2
3
note.your-domain.com {
    reverse_proxy localhost:9000
}

note.your-domain.com是代理的域名,参考cloudflare的域名配置

localhost:9000是指的运行在本机9000端口上的FastNoteSync-docker镜像

Caddy 会被注册为系统服务,通过 systemctl 命令管理。

  • 启动:

    1
    
    sudo systemctl start caddy
    
  • 关闭:

    1
    
    sudo systemctl stop caddy
    
  • 查看运行状态(可以看到是否在运行、日志、错误信息):

    1
    
    sudo systemctl status caddy
    
  • 重启(修改配置文件后常用):

    1
    
    sudo systemctl restart caddy
    
  • 重载配置(不中断服务,只重新加载配置文件,更推荐):

    1
    
    sudo systemctl reload caddy
    

⚙️ 第四步:配置服务端(非常重要!)

服务端启动后,需要进行初始化配置。

  1. 访问 Web 管理面板:在浏览器中打开 Caddy的代理的服务域名。
  2. 注册管理员账号:首次访问会进入注册页面,第一个注册的用户将成为管理员。
  3. 修改安全配置(关键步骤!):为了安全,务必修改默认的令牌加密密钥。
    • 进入 Web 面板的设置页面。
    • 找到 security.auth-token-key 或类似的配置项。
    • 将其修改为一个复杂的随机字符串(可以使用 openssl rand -base64 32 命令生成)。
  4. (可选)关闭开放注册:如果你不希望其他人随意注册,可以在创建好管理员账号后,在配置中将 USER_REGISTER_IS_ENABLE 设置为 false。

🔗 第五步:配置 Obsidian 插件

现在,服务端已经就绪,接下来配置 Obsidian 客户端。

  1. 在 Obsidian 中,通过“社区插件”搜索并安装 Fast Note Sync 插件。

  2. 回到刚才的 Web 管理面板(http://你的服务器IP:9000)。

  3. 在面板中找到你的“笔记仓库 (Vault)”或“配置”页面,点击“授权Obsidian”。 Pasted image 20260830215435.png|639 Pasted image 20260830220020.png|541

  4. 在 Obsidian 的 Fast Note Sync 插件设置中,粘贴这串配置,插件就会自动连接到你的服务器。 Pasted image 20260830220054.png

完成以上步骤,你的私人笔记同步服务就搭建好了。

Custom Image Auto Uploader

下面我按你最后说的“用 9000 端口”完整过一遍。目标是:Obsidian 粘贴图片后,自动上传到阿里云 OSS,然后 Markdown 里变成公网图片链接。

整体结构
Obsidian 插件 -> ECS:9000 网关 -> 阿里云 OSS -> Markdown 图片链接

一、准备 OSS

  1. 进入阿里云 OSS 控制台,新建一个 Bucket,比如:
1
my-obsidian-img
  1. 读写权限建议设:
1
公共读

不要设“公共读写”。上传通过 ECS 网关完成,公网只负责读图片。

  1. 记下这几个信息:
1
2
3
4
Bucket 名称:my-obsidian-img
Region:例如 cn-hangzhou
Endpoint:例如 oss-cn-hangzhou.aliyuncs.com
公网访问前缀:例如 https://my-obsidian-img.oss-cn-hangzhou.aliyuncs.com

如果你有自己的域名,比如 img.xxx.com,以后最好绑定到 OSS/CDN,这样 Markdown 里的图片链接更稳定。

二、准备 RAM AccessKey

  1. 进入阿里云 RAM 控制台。
  2. 新建一个专用用户,比如:
1
obsidian-img-uploader
  1. 给它创建 AccessKey,得到:
1
2
AccessKey ID
AccessKey Secret
  1. 授权时可以先给 OSS 写入相关权限。小白阶段可以先用阿里云内置的 AliyunOSSFullAccess 跑通,跑通后再收窄权限。

注意:这个 AK/SK 只放 ECS 的 config.yaml,不要填进 Obsidian。

三、ECS 安装 Docker
登录 ECS 后执行:

1
2
3
4
sudo apt update
sudo apt install -y docker.io docker-compose-plugin
sudo systemctl enable docker
sudo systemctl start docker

检查:

1
2
docker version
docker compose version

四、创建网关目录

1
2
3
sudo mkdir -p /data/image-api/config
sudo mkdir -p /data/image-api/storage
cd /data/image-api

五、创建 docker-compose.yml

1
sudo nano docker-compose.yml

粘贴:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
services:
  image-api:
    image: haierkeys/custom-image-gateway:latest
    container_name: image-api
    ports:
      - "9000:9000"
    volumes:
      - ./config:/api/config
      - ./storage:/api/storage
    restart: always

保存退出:Ctrl + O,回车,Ctrl + X。

六、创建 config.yaml

1
sudo nano /data/image-api/config/config.yaml

粘贴这个模板,把中文占位换成你的真实信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
server:
  run-mode: release
  http-port: :9000
  read-timeout: 60
  write-timeout: 60
  private-http-listen: ""

app:
  default-page-size: 10
  max-page-size: 100
  default-context-timeout: 60
  temp-path: storage/temp
  upload-date-path: 200601/02
  upload-url-pre: https://你的Bucket公网访问前缀
  upload-max-size: 10
  upload-allow-exts:
    - .jpg
    - .jpeg
    - .png
    - .bmp
    - .gif
    - .tiff
    - .avif
    - .webp
  image-max-size-width: 0
  image-max-size-height: 0
  image-quality: 100

log:
  level: Info
  file: storage/logs/log.log
  production: true

security:
  auth-token: 换成一串很长的随机密码(填的时候最好在两侧夹""这样更好的保证密钥解析正确)
  auth-token-key: X-Auth-Token

database:
  type: sqlite
  path: storage/database/db.db
  table-prefix: pre_
  auto-migrate: true

user:
  is-enable: false
  register-is-enable: false

local-fs:
  is-enable: false
  is-user-enable: false
  httpfs-is-enable: false
  save-path: storage/uploads

oss:
  is-enable: true
  is-user-enable: false
  endpoint: 你选择平台的Endpoint
  bucket-name: 你的Bucket名称
  access-key-id: 你的AccessKey ID
  access-key-secret: 你的AccessKey Secret
  custom-path: blog

cloudflue-r2:
  is-enable: false
  is-user-enable: false

aws-s3:
  is-enable: false
  is-user-enable: false

minio:
  is-enable: false
  is-user-enable: false

webdav:
  is-enable: false
  is-user-enable: false

doge:
  is-enable: false
  is-user-enable: false

这里最关键的是:

1
2
3
4
5
6
7
app:
  upload-url-pre: https://你的Bucket公网访问前缀

oss:
  endpoint: 你选择平台的Endpoint
  bucket-name: 你的Bucket名称
  custom-path: blog

最终 Markdown 里的链接会类似:

1
![image](https://你的Bucket公网访问前缀/blog/2026/08/xxx.png)

七、启动网关

1
2
cd /data/image-api
sudo docker compose up -d

看是否启动成功:

1
2
sudo docker ps
sudo docker logs image-api --tail=100

八、放行防火墙
阿里云控制台:

  1. 进入 ECS 实例。
  2. 找到安全组。
  3. 添加入方向规则:
1
2
3
协议类型:TCP
端口范围:9001/9001
授权对象:0.0.0.0/0

测试跑通后,更安全的做法是改成你的公网 IP,例如:

1
你的公网IP/32

服务器系统防火墙如果开了,也放行:

1
2
sudo ufw allow 9001/tcp
sudo ufw status

九、测试网关是否能访问
浏览器打开:

1
http://你的ECS公网IP:9001/

能看到页面,说明服务通了。

十、配置 Obsidian 插件

  1. Obsidian 打开社区插件。
  2. 搜索并安装:
1
Custom Image Auto Uploader
  1. 插件设置里填:

Pasted image 20260830221722.png

1
2
API Gateway Address:
http://你的ECS公网IP:9000/api/upload
1
2
API Access Token:
config.yaml 里的 auth-token
  1. 先关闭“上传后删除原图片”,测试稳定后再打开。
  2. 手机端 Obsidian 也安装/启用同一个插件,填同样的 API 地址和 token。

注意:关闭“自动下载”。因为该插件有一个bug是先下载后上传。没必要。并且有可能因为下载功能对于某个网站无法访问而403,然后使得上传失败

十一、实际测试
在 Obsidian 里新建一篇笔记,粘贴一张图片。

成功后,本地图片链接会被替换成类似:

1
![image](https://xxx.oss-cn-hangzhou.aliyuncs.com/blog/2026/08/xxx.png)

复制这个链接到浏览器,能打开,就说明完整链路成功。

十二、恢复方案
以后服务器坏了,只要 OSS 没丢,旧博客图片一般不受影响。

你需要备份:

1
2
3
/data/image-api/docker-compose.yml
/data/image-api/config/config.yaml
/data/image-api/storage/

恢复时:

1
sudo mkdir -p /data/image-api

把备份放回原位置,然后:

1
2
cd /data/image-api
sudo docker compose up -d

再把新 ECS 的 9000 安全组放行即可。

最重要的别乱改这三个:

1
2
3
app.upload-url-pre
oss.bucket-name
oss.custom-path

这三个决定旧 Markdown 图片链接会不会继续有效。