从 0 到可用:我如何搭建一套完整的个人服务器(VPS 实战)
从买 VPS 到搭建 Homepage、Docker、Blog 的完整过程,包含踩坑与解决方案。
一、起因
最近想做一套属于自己的开发环境:
- 可以放博客
- 可以跑服务
- 可以随便折腾
所以决定自己搭一台 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 写作
- 安全优化