← 与Obsidian同步的博客搭建

与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/

这里别只复制二进制就结束。statictemplatesmigrations 也得一起带上,因为程序运行时会直接用到它们。少一个目录,服务可能能启动,但访问页面时就会报错,排查起来更费时间。

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,不需要你每写完一篇就 commitpushpull。你在 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 不是硬性要求,不开也能同步,只是可能走中继,速度慢一点。真正影响网站上线的是 80443,Caddy 申请证书时也依赖这两个端口能通。

到这里,这台 Debian 12 服务器就能稳定跑起博客了。后面的日常体验会很顺,你在 Obsidian 里写,Syncthing 负责同步,bedic-web 直接读取内容,Caddy 负责对外服务。对个人博客来说,这套组合很轻,也够省心。下一篇再把持续更新和运维整理清楚,把“改完代码以后怎么重新上线”这件事彻底理顺。

目录

Comments (0)

No comments yet. Be the first!