4

一台服务器上跑了些什么

·5 分钟

博客跑在一台阿里云 ECS 上。不是很贵的配置,但一个人的博客够用了。

域名和备案

yustia.com 这个域名是在阿里云买的。国内服务器要备案,ICP 备案和公安备案都走了一遍。

ICP 备案是工信部要求的,没有备案的域名不能解析到国内服务器。流程是在阿里云提交资料,等审核,前后大概一两周。公安备案是公安部要求的,ICP 备案通过之后还要去全国互联网安全管理服务平台再报一次。

不复杂,但琐碎,需要耐心等。好在都是一次性的事,备好之后就不用再管了。

服务器上有什么

astra 上现在跑着两个 Docker 容器:

博客容器(yustia-blog)——就是上一章构建出来的那个 Nginx 镜像,端口 3000:80。里面只有静态 HTML 文件,没有运行时逻辑,随时可以销毁重建。

评论容器(twikoo)——Twikoo 评论系统,端口 8080,自带一个嵌入式 MongoDB。评论数据持久化在服务器磁盘上的 deploy/twikoo/data/ 目录里,不在容器内部。

除了容器,还有两个磁盘目录存着不进 git 的大文件:

/data/blog-uploads/ 存文章里的图片——Typora 里粘贴截图的时候,一个脚本自动通过 SFTP 传到这个目录,返回公网 URL 插入到文章里。

/data/blog-downloads/ 存下载资源——PPT 模板之类的文件,手动 SCP 传上去。

这些数据都在容器外面。博客容器不知道它们的存在,也不需要知道。

一个 Nginx 拼起来

服务器上有一个宿主机 Nginx(跑在容器外面),负责把不同路径的请求分发到不同的地方:

访问 yustia.com 的根路径,Nginx 转发给博客容器的 80 端口,拿到静态 HTML 返回给浏览器。

访问 /uploads/ 路径,Nginx 直接从 /data/blog-uploads/ 目录读文件,不经过任何容器。图片的缓存时间设成了一年——文件名是 UUID,内容不会变,浏览器缓存住就不用再请求了。

访问 /downloads/ 路径,跟 uploads 一样直接从磁盘读,多加了一个 Content-Disposition: attachment 让浏览器下载而不是打开。

访问 /twikoo/ 路径,Nginx 反向代理到 Twikoo 容器的 8080 端口。

HTTPS 也是这个 Nginx 管的——域名证书配在这一层,所有容器内部都走 HTTP,不用各自处理证书。

这样做的好处是:对外只暴露 443 端口,所有服务藏在后面。博客容器只管托管静态文件,不知道图片、下载、评论的存在。各管各的,互不影响。

容器里不放数据

架构上有一个刻意的设计:容器里不放任何持久数据。

博客容器是纯静态文件,构建时就定型了,运行时不写任何东西。Twikoo 的数据挂载到容器外的磁盘目录。图片和下载资源本来就在磁盘上,跟容器无关。

这意味着容器可以随时销毁重建,不会丢任何东西。部署新版本的时候 docker-compose down 再 up,干干净净。迁移的时候只需要关心磁盘上那几个目录,不用导出容器内部的状态。

从旧架构迁移过来的时候,清理了 MySQL 的数据卷、旧镜像、旧的 uploads 挂载和 .env 文件,回收了大概 5.5GB 空间。

💬

留言区待配置

部署 Twikoo 后端后,设置环境变量 NEXT_PUBLIC_TWIKOO_ENV_ID