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,需要添加其官方软件源
1
| curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
|
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仓库)
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镜像的速度,强烈建议配置国内镜像加速器。
- 创建或编辑Docker配置文件
/etc/docker/daemon.json
1
| sudo nano /etc/docker/daemon.json
|
- 添加以下内容(请将
<你的加速器地址> 替换为实际的地址,例如阿里云、腾讯云等提供的专属加速地址):
1
2
3
| {
"registry-mirrors": ["<你的加速器地址>"]
}
|
==这里可以去阿里云里面找加速镜像地址==
- 保存文件,然后重启Docker服务使配置生效:
1
| sudo systemctl restart docker
|
🔥 第五步:运行Hello World测试
最后,可以运行一个简单的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 同目录下,执行以下命令启动服务:
Docker 会自动拉取镜像并启动容器。你可以用下面的命令查看运行状态:
查看服务端输出日志
安装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 命令管理。
⚙️ 第四步:配置服务端(非常重要!)
服务端启动后,需要进行初始化配置。
- 访问 Web 管理面板:在浏览器中打开
Caddy的代理的服务域名。 - 注册管理员账号:首次访问会进入注册页面,第一个注册的用户将成为管理员。
- 修改安全配置(关键步骤!):为了安全,务必修改默认的令牌加密密钥。
- 进入 Web 面板的设置页面。
- 找到
security.auth-token-key 或类似的配置项。 - 将其修改为一个复杂的随机字符串(可以使用
openssl rand -base64 32 命令生成)。
- (可选)关闭开放注册:如果你不希望其他人随意注册,可以在创建好管理员账号后,在配置中将
USER_REGISTER_IS_ENABLE 设置为 false。
🔗 第五步:配置 Obsidian 插件
现在,服务端已经就绪,接下来配置 Obsidian 客户端。
在 Obsidian 中,通过“社区插件”搜索并安装 Fast Note Sync 插件。
回到刚才的 Web 管理面板(http://你的服务器IP:9000)。
在面板中找到你的“笔记仓库 (Vault)”或“配置”页面,点击“授权Obsidian”。

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

完成以上步骤,你的私人笔记同步服务就搭建好了。
Custom Image Auto Uploader
下面我按你最后说的“用 9000 端口”完整过一遍。目标是:Obsidian 粘贴图片后,自动上传到阿里云 OSS,然后 Markdown 里变成公网图片链接。
整体结构
Obsidian 插件 -> ECS:9000 网关 -> 阿里云 OSS -> Markdown 图片链接
一、准备 OSS
- 进入阿里云 OSS 控制台,新建一个 Bucket,比如:
- 读写权限建议设:
不要设“公共读写”。上传通过 ECS 网关完成,公网只负责读图片。
- 记下这几个信息:
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
- 进入阿里云 RAM 控制台。
- 新建一个专用用户,比如:
- 给它创建 AccessKey,得到:
1
2
| AccessKey ID
AccessKey Secret
|
- 授权时可以先给 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
| 
|
七、启动网关
1
2
| cd /data/image-api
sudo docker compose up -d
|
看是否启动成功:
1
2
| sudo docker ps
sudo docker logs image-api --tail=100
|
八、放行防火墙
阿里云控制台:
- 进入 ECS 实例。
- 找到安全组。
- 添加入方向规则:
1
2
3
| 协议类型:TCP
端口范围:9001/9001
授权对象:0.0.0.0/0
|
测试跑通后,更安全的做法是改成你的公网 IP,例如:
服务器系统防火墙如果开了,也放行:
1
2
| sudo ufw allow 9001/tcp
sudo ufw status
|
九、测试网关是否能访问
浏览器打开:
能看到页面,说明服务通了。
十、配置 Obsidian 插件
- Obsidian 打开社区插件。
- 搜索并安装:
1
| Custom Image Auto Uploader
|
- 插件设置里填:

1
2
| API Gateway Address:
http://你的ECS公网IP:9000/api/upload
|
1
2
| API Access Token:
config.yaml 里的 auth-token
|
- 先关闭“上传后删除原图片”,测试稳定后再打开。
- 手机端 Obsidian 也安装/启用同一个插件,填同样的 API 地址和 token。
注意:关闭“自动下载”。因为该插件有一个bug是先下载后上传。没必要。并且有可能因为下载功能对于某个网站无法访问而403,然后使得上传失败
十一、实际测试
在 Obsidian 里新建一篇笔记,粘贴一张图片。
成功后,本地图片链接会被替换成类似:
1
| 
|
复制这个链接到浏览器,能打开,就说明完整链路成功。
十二、恢复方案
以后服务器坏了,只要 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 图片链接会不会继续有效。