与Obsidian同步的博客搭建——服务器部署
与Obsidian同步的博客搭建——服务器部署
前面已经把这套博客的整体思路讲过了,这篇开始做真正的落地,把站点放到腾讯云 CVM 上跑起来。目标很明确,你在 Obsidian 里写,Syncthing 把 Vault 同步到服务器,bedic-web 直接读取 /opt/vault,Caddy 负责把公网请求转发进来,并顺手把 HTTPS 证书办好。
这篇默认你是云服务器小白,系统用的是 腾讯云 CVM + Debian 12,本地电脑是 Windows,连接服务器主要靠 PowerShell。很多命令你直接复制就能跑,不需要先把 Linux 学完整。
服务器选择
这一套博客对运行环境要求不高。我的选择是 腾讯云 CVM,Debian 12,配置用 2核2G 就够了。原因很简单,Rust 首次编译会慢一点,但编译完成后的二进制文件很轻,真正上线运行时占用并不大,个人博客完全压得住。
如果你只是拿它跑博客、Wiki 和 Todo,不打算在服务器上做别的重任务,2核2G 已经够用。要是你后面还想在同一台机器上加数据库、图床或者别的服务,再往上加配置也不迟。新手阶段先把链路跑通,比一开始就堆高配置更重要。
域名也要提前准备好。你至少需要两样东西:
- 一台有公网 IP 的腾讯云 CVM
- 一个自己的域名,比如
bedic.tech
域名买完以后,到 DNS 管理页添加 A 记录,把域名解析到服务器公网 IP。这里很关键,因为后面的 Caddy 要靠域名解析结果去申请 HTTPS 证书。如果 DNS 还没生效,就算 Caddy 配置写对了,证书也拿不到。遇到这种情况,先别怀疑程序,先检查域名有没有真的指到你的服务器。
基础环境配置
1. SSH 连接服务器
在 Windows 打开 PowerShell,输入:
ssh root@你的服务器公网IP
第一次连接时,系统会提示你确认服务器指纹,直接输入 yes 回车。接着输入 root 密码。
这里有个很常见的坑,Linux 输入密码时不会显示任何字符。屏幕上不会出现 ***,也不会有光标移动,看起来像没输入,其实只是系统故意不回显。你直接把密码输完回车就行。
连上以后,如果你看到类似 root@VM-xx:~# 这样的提示符,就说明已经成功进入服务器了。这里的 root 就是管理员账户。对新手来说,前期直接用 root 最省事,少掉很多权限问题。
2. 安装 Git
后面要从 GitHub 克隆项目,所以先装 Git:
apt install git
如果你的服务器是全新系统,也可以先跑一次 apt update 再安装。最关键的是把 Git 装上,不然后面的 git clone 会直接报 command not found。
3. 安装 Rust
项目是 Rust 写的,所以服务器上还得有 Rust 编译环境。执行:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
安装过程基本一路按回车就行。装完以后,最好立刻让当前 shell 重新加载环境变量:
source ~/.cargo/env
如果你后面执行 cargo build --release 时提示 cargo: command not found,十有八九就是少了这一步。还有一个细节,如果系统提示 curl 不存在,就先执行 apt install -y curl。
4. 创建项目目录
把后面要用的目录先准备好:
mkdir -p /opt/bedic-web
mkdir -p /opt/vault
这两个目录的职责要分清:
/root/bedic-web用来放源码和编译过程/opt/bedic-web用来放真正上线运行的二进制、模板和静态资源/opt/vault用来放 Syncthing 同步过来的 Obsidian Vault
把“编译目录”和“运行目录”分开,后面更新时会清楚很多。你要是直接在同一个目录里又编译又运行,出了问题很容易分不清到底是哪一步出了错。
编译部署
环境准备好以后,就可以把项目拉下来编译了。
1. 克隆项目
git clone https://github.com/songxuanchen/bedic-web.git /root/bedic-web
这里仓库会被克隆到 /root/bedic-web。如果你的服务器之前已经有同名目录,Git 会提示目录非空,这时先检查里面是不是旧代码,不要看到报错就反复重跑。
2. 编译 release
cd /root/bedic-web
cargo build --release
第一次编译通常要 5 到 10 分钟。2核2G 的机器能跑,只是别着急。屏幕不停滚 Compiling ... 很正常。真正上线时我们用的是 release 模式,因为它会做优化,生成的可执行文件更适合正式环境。
如果中途编译特别慢,先耐心等一会儿。要是直接被系统杀掉,常见原因是内存偏紧。这个阶段先别怀疑项目本身,先看是不是服务器资源吃满了。
3. 复制二进制文件和运行资源
编译完成以后,把上线要用的文件复制到 /opt/bedic-web:
cp target/release/bedic-web /opt/bedic-web/
cp -r static /opt/bedic-web/
cp -r templates /opt/bedic-web/
cp -r migrations /opt/bedic-web/
这里别只复制二进制就结束。static、templates、migrations 也得一起带上,因为程序运行时会直接用到它们。少一个目录,服务可能能启动,但访问页面时就会报错,排查起来更费时间。
systemd 服务配置
bedic-web 不能靠你手动在终端里一直开着。更稳的做法,是交给 systemd 管理。这样服务器重启以后,它也会自动拉起服务,程序异常退出时还能自动重启。
先创建服务文件:
nano /etc/systemd/system/bedic-web.service
如果系统提示 nano: command not found,先安装一下:apt install -y nano。
把下面内容完整粘进去:
[Unit]
Description=Bedic Web Server
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/bedic-web
Environment=VAULT_PATH=/opt/vault
Environment=BIND_ADDR=127.0.0.1:3000
ExecStart=/opt/bedic-web/bedic-web
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
如果你用的是 nano,保存时按 Ctrl + O,回车确认,再按 Ctrl + X 退出。
这几行里最值得看懂的是三项:
WorkingDirectory=/opt/bedic-web,告诉程序从哪里找模板、静态资源和数据库文件VAULT_PATH=/opt/vault,告诉程序去哪里读 Obsidian 内容BIND_ADDR=127.0.0.1:3000,只监听本机 3000 端口,对外访问交给 Caddy
写完以后启动服务:
systemctl daemon-reload
systemctl enable bedic-web
systemctl start bedic-web
systemctl status bedic-web
如果状态里看到 active (running),说明服务已经起来了。这里还有一个新手很容易漏掉的点,每次你改了 service 文件,都要重新执行一次 systemctl daemon-reload,不然 systemd 读的还是旧配置。
如果启动失败,先别乱改文件,直接看日志最省事:
journalctl -u bedic-web -f
常见报错一般就两类,路径写错,或者 /opt/vault 里还没有你要读的内容。顺着日志往下看,通常几分钟就能定位到问题。
Caddy 反向代理
新手做反向代理,我更建议直接用 Caddy。原因很直接,它配置短,自动申请 HTTPS,少掉了自己处理证书和续期的麻烦。对个人博客来说,这个体验比 Nginx 轻松很多。
先安装 Caddy:
apt install -y debian-keyring debian-archive-keyring apt-transport-https curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
apt update && apt install caddy
然后编辑配置文件:
nano /etc/caddy/Caddyfile
内容写成这样:
bedic.tech {
reverse_proxy localhost:3000
}
这句 reverse_proxy localhost:3000 的意思很简单,外部用户访问的是 bedic.tech,真正提供内容的 Rust 程序只在本机 3000 端口监听。这样你的应用本身不直接暴露在公网,结构更清楚,排错也更方便。
保存后重启 Caddy:
systemctl restart caddy
只要这时 域名已经解析到服务器 IP,并且腾讯云安全组放行了 80 和 443,Caddy 就会自动去申请 Let's Encrypt 证书。你不需要自己去手动申请,也不需要自己记续期时间。
如果访问域名时看到 502 Bad Gateway,通常不是 Caddy 本身坏了,而是后面的 bedic-web 还没正常启动。先检查 systemctl status bedic-web,再看应用日志。要是直接打不开域名,那就优先检查 DNS 和安全组。
Syncthing 同步配置
这套博客最省心的地方,不是部署完能打开网页,而是后面写文章几乎不用手动发布。原因就在 Syncthing。它不是 Git,不需要你每写完一篇就 commit、push、pull。你在 Obsidian 里按下保存,文件就能同步到服务器。
先在服务器安装 Syncthing:
curl -s https://syncthing.net/release-key.txt | gpg --dearmor -o /usr/share/keyrings/syncthing-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable" | tee /etc/apt/sources.list.d/syncthing.list
apt update && apt install syncthing
1. 配成系统服务
为了让 Syncthing 开机自启,可以直接用 systemd 模板服务:
systemctl enable syncthing@root
systemctl start syncthing@root
systemctl status syncthing@root
这里我用 root 作为示例,优点是路径权限最不容易打架,也和前面的部署方式一致。以后如果你单独建了普通用户,再把 root 换成对应用户名就行。
2. 打开服务器端 Web UI
出于安全考虑,服务器上的 Syncthing Web UI 默认只监听本机 127.0.0.1:8384。所以你不能直接在公网打开,而是从本地电脑走 SSH 隧道:
ssh -L 8385:127.0.0.1:8384 root@你的服务器公网IP
这个 PowerShell 窗口要保持开着,然后在浏览器访问:
http://localhost:8385
你看到的就是服务器端 Syncthing 管理界面。电脑本地自己的 Syncthing 通常是 http://localhost:8384。这两个地址长得很像,别看混了。
3. 配置同步文件夹
推荐的映射关系是:
- 电脑端:
D:\Bed - 服务器端:
/opt/vault
电脑端文件夹建议设成 仅发送,服务器端设成 仅接收。这样服务器不会反向改乱你本地的 Obsidian 仓库,写作入口始终只有一处。
首次配对完成后,Syncthing 会开始同步整个 Vault。文件多的时候,第一次同步可能要几分钟。这个阶段别一边同步一边手动复制同一批文件,不然很容易把自己看糊涂。
4. 排除不需要同步的目录
有两个目录建议从一开始就排除:
.obsidian,里面大多是工作区配置、插件状态、缓存,不是网站正文_private,用来放你不想公开的笔记最顺手
你可以在 D:\Bed 根目录新建一个 .stignore 文件,写入:
/.obsidian
/_private
Syncthing 会按这个规则忽略对应目录。至于 .stfolder,它是 Syncthing 用来标记“这是共享根目录”的隐藏文件,通常会自动生成。不要手动删除它,删掉以后有时会触发莫名其妙的同步问题。
验证部署
到这一步,整条链路已经基本齐了。接下来别急着收工,做三轮验证最稳。
1. 访问公网域名
浏览器打开:
https://bedic.tech
如果首页能正常打开,说明域名解析、Caddy 反代、bedic-web 进程这三层已经打通。
2. 检查日志
journalctl -u bedic-web -f
这条命令会持续滚动日志。你访问网页、刷新页面、读取文章时,能看到对应输出。对新手来说,这是最好用的排错入口。只要你养成先看日志的习惯,后面很多问题都会轻松不少。
3. 测试 Obsidian 自动更新
在 Obsidian 里新建一篇文章,或者随便修改一篇已有文章,保存后等 Syncthing 同步几秒,再刷新网页确认内容有没有出现。
如果网页没更新,按顺序检查这三件事:
D:\Bed里的文件有没有真的同步到/opt/vault- Syncthing 两端设备是不是在线
journalctl -u bedic-web -f里有没有报路径或权限错误
顺序排查会比东改一点、西试一点快很多。
防火墙配置
最后再补一遍端口问题。很多部署步骤明明都对,结果网站就是打不开,根因往往不是程序,而是防火墙没放行。
1. 腾讯云安全组
在腾讯云控制台里检查入站规则,至少放行:
80,给 HTTP 用443,给 HTTPS 用
如果你还没放行 22,那 SSH 登录也会受影响。Syncthing 想走直连的话,还可以额外放开 22000/TCP,同步速度通常会更好。
2. 服务器防火墙
如果你自己启用了 ufw,也要同步放行端口:
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 22000/tcp
ufw status
这里要记住一件事,腾讯云安全组和服务器防火墙是两层东西。任何一层没放行,外部访问都可能失败。22000 不是硬性要求,不开也能同步,只是可能走中继,速度慢一点。真正影响网站上线的是 80 和 443,Caddy 申请证书时也依赖这两个端口能通。
到这里,这台 Debian 12 服务器就能稳定跑起博客了。后面的日常体验会很顺,你在 Obsidian 里写,Syncthing 负责同步,bedic-web 直接读取内容,Caddy 负责对外服务。对个人博客来说,这套组合很轻,也够省心。下一篇再把持续更新和运维整理清楚,把“改完代码以后怎么重新上线”这件事彻底理顺。
Comments (0)
No comments yet. Be the first!