← 返回首页

从 0 到可用:我如何搭建一套完整的个人服务器(VPS 实战)

从买 VPS 到搭建 Homepage、Docker、Blog 的完整过程,包含踩坑与解决方案。
2026/4/9 #vps #nginx #docker #server

一、起因

最近想做一套属于自己的开发环境:

  • 可以放博客
  • 可以跑服务
  • 可以随便折腾

所以决定自己搭一台 VPS,而不是用现成平台。


二、整体目标

最终我希望达到:

  • 一个统一入口(Homepage)
  • 多个子服务(file / status / blog)
  • 全部走 HTTPS
  • Docker 管理服务

三、基础环境搭建

系统:

Ubuntu

安装基础组件:

sudo apt update
sudo apt install nginx docker.io docker-compose -y

四、Nginx 作为核心入口

一开始我是直接用端口访问:

IP:3000
IP:4321

👉 非常混乱

后来统一改成子域名:

  • waynb.us
  • blog.waynb.us
  • file.waynb.us

nginx 基础配置

server {
    listen 80;
    server_name blog.waynb.us;

    location / {
        proxy_pass http://127.0.0.1:4321;
    }
}

五、HTTPS 配置(踩坑)

执行:

sudo certbot --nginx

报错:

Could not automatically find a matching server block

原因

👉 nginx 没写 server_name


正确做法

server_name blog.waynb.us;

然后:

sudo certbot --nginx -d blog.waynb.us

六、Docker 服务部署

我用 Docker 跑了:

  • Homepage
  • Filebrowser
  • Uptime Kuma

Homepage 启动

docker run -d   -p 3000:3000   -v ~/homepage:/app/config   ghcr.io/gethomepage/homepage:latest

遇到的问题

docker.sock 权限

permission denied

解决:

sudo chmod 666 /var/run/docker.sock

端口冲突

👉 nginx 占用 80
👉 容器不要用 80


七、博客部署(Astro)

npm create astro@latest

坑:目录错误

/root/blog/blog

导致:

ENOENT package.json

解决:

mv blog/* .

坑:slug 报错

Missing parameter: slug

解决:

post.id.replace(/\.md$/, '')

八、发布流程

sudo /publish.sh

自动:

  • build
  • 更新 dist
  • reload nginx

九、总结

这套系统核心:

  • Nginx 做网关
  • Docker 管服务
  • 子域名划分
  • 静态博客

十、下一步

  • 自动博客发布
  • AI 写作
  • 安全优化