最近我购买了个人域名,一直在思考怎么去搭建个人全栈云平台,包括个人博客、品牌站点、管理后台(前后端分离)、小程序/APP后台服务、OpenClaw等。
之前有试过方案是静态网站托管在Cloudflare Pages上,另外将OpenClaw和其他动态服务都部署在家里的Raspberry上面,
然后再通过Cloudflare Tunnel做内网穿透。
但是这里有个问题就是域名没办法做ICP备案了,因为域名备案必须有一个真实托管IP。因此最终我还是选择了阿里云主机。
这里我选择阿里云性价比最高的轻量级应用服务器,首次购买一年才几百块钱。刚开始不用买太好的配置,先把东西做出来后面再升级。
最终我的架构是这样子的:
- 个人品牌站点、管理后台服务、小程序/APP后台服务全部部署在阿里云轻量级应用服务器上。
- 所有服务统一使用Nginx反向代理,通过二级子域名去访问。
- Nginx开启SSL/TLS,并且Nginx上面要配置Let’s Encrypt证书(支持泛域名),使用Certbot脚本支持自动延期证书。
- 个人品牌站点统一使用www域名
www.xiongneng.me去访问,并开启CDN加速。 - 管理后台(包括前端页面和后端服务)使用子域名
admin.xiongneng.me去访问。 - 小程序/APP后台服务使用统一的FastAPI服务,并通过
api.xiongneng.me去访问。 - 所有后端服务中涉及到数据库全部使用SQLite实现。
- 所有前端页面中涉及到图片资源的全部使用腾讯云COS服务,并开启CDN加速。
- 家里的一台Raspberry用于安装OpenClaw智能体平台。并通过长连接方式连接飞书平台,避免开放公网IP。
云服务器基础环境准备
登录服务器后,首先更新系统并安装项目所需的必要软件包。
1
2
3
4
5
6
7
8
9
10
11
12
13
| # 1. 更新系统并安装基础依赖
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget gnupg2 ca-certificates lsb-release ufw build-essential python3 python3-pip python3-venv git nginx
# 2. 安装 Node.js 22.x (用于管理后台前端构建)
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash - # 设置 NodeSource 仓库
sudo apt-get install -y nodejs # 安装 Node.js
node -v && npm -v # 验证安装
# 3. 配置基础防火墙 (ufw)
sudo ufw allow OpenSSH # 允许 SSH (端口 22)
sudo ufw allow 'Nginx Full' # 允许 Nginx (端口 80 和 443)
sudo ufw enable # 启用防火墙
|
安装并配置 Nginx 反向代理
Nginx 将作为所有服务的统一入口,负责接收外部请求并将其分发到对应的内部服务。
1
2
3
4
5
6
7
| # 1. 确认 Nginx 已安装并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx
# 2. 配置 Nginx 核心文件 (/etc/nginx/nginx.conf)
# 使用你熟悉的编辑器打开它 (如 vim 或 nano)
sudo vim /etc/nginx/nginx.conf
|
在 http 块内,增加或修改以下配置,用于优化反向代理性能:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| http {
# ... (保留原有基础配置) ...
server_tokens off; # 隐藏 Nginx 版本号,增强安全性
# 代理缓冲区优化
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
# 客户端请求体大小限制 (可按需调整)
client_max_body_size 20m;
# 引入所有站点独立的配置文件
include /etc/nginx/conf.d/*.conf;
}
|
保存文件后,测试配置并重载 Nginx
1
2
| sudo nginx -t
sudo systemctl reload nginx
|
申请 Let’s Encrypt 泛域名证书并配置自动续期
本步骤将申请一个覆盖一级域名 xiongneng.me 和 *.xiongneng.me 的泛域名证书,并设置自动续期任务。
配置阿里云
登录阿里云RAM访问控制页面。
创建一个RAM用户,勾选“OpenAPI调用访问”,并为它授权 AliyunDNSFullAccess 权限。
生成并记录下这个用户的 AccessKey ID 和 AccessKey Secret。
在服务器上创建一个凭据文件,如 /opt/certbot_dns/credentials.ini,并写入以下内容
1
2
| dns_aliyun_access_key = 你的AccessKey_ID
dns_aliyun_access_key_secret = 你的AccessKey_Secret
|
必须设置权限,保护密钥文件安全:
1
| sudo chmod 600 /opt/certbot_dns/credentials.ini
|
安装插件
1
2
3
4
5
6
7
8
9
10
| # 创建 Python 虚拟环境
sudo apt install python3-venv
sudo python3 -m venv /opt/certbot
# 在虚拟环境中安装 Certbot 和阿里云插件
# 升级 pip
sudo /opt/certbot/bin/pip install --upgrade pip
# 安装 certbot 和阿里云插件 (以下为一行命令)
sudo /opt/certbot/bin/pip install certbot certbot-dns-aliyun
# 建立软链接
sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot
|
申请证书
1
2
3
4
5
6
7
| sudo certbot certonly \
--authenticator dns-aliyun \
--dns-aliyun-credentials /opt/certbot_dns/credentials.ini \
-d "xiongneng.me" \
-d "*.xiongneng.me" \
--agree-tos \
--email yidao620@163.com
|
生成成功日志:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| Account registered.
Requesting a certificate for xiongneng.me and *.xiongneng.me
Waiting 30 seconds for DNS changes to propagate
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/xiongneng.me/fullchain.pem
Key is saved at: /etc/letsencrypt/live/xiongneng.me/privkey.pem
This certificate expires on 2026-08-08.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
设置自动续期与重载 Nginx
直接编辑 root 用户的 crontab:
1
| sudo EDITOR=vim crontab -e
|
在文件末尾添加下面这一行即可:
1
| 0 2 * * * /opt/certbot/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx"
|
解释:
0 2 * * *:每天凌晨 2 点执行。/opt/certbot/bin/certbot renew:调用虚拟环境中的 certbot 检查并续期证书。--quiet:安静模式,没有错误不输出。--deploy-hook "systemctl reload nginx":自动完成脚本的工作——续期成功后立即重载 Nginx,无需额外的脚本文件。
测试自动续期是否能成功。看到 Congratulations, all simulated renewals succeeded 就代表一切就绪。
1
| sudo /opt/certbot/bin/certbot renew --dry-run
|
部署各个服务
管理后台前端(Vue)
假设管理后台为 admin.xiongneng.me
- 本地打包:在项目根目录下执行
npm run build,得到 dist 文件夹。 - 上传文件:将
dist 目录下的所有内容上传至服务器 /var/www/admin。 - Nginx 配置:创建文件
/etc/nginx/conf.d/admin.conf,内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| server {
listen 443 ssl http2; # 使用 SSL 并启用 HTTP/2 加速
server_name admin.xiongneng.me;
# 指定 SSL 证书路径
ssl_certificate /etc/letsencrypt/live/xiongneng.me/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xiongneng.me/privkey.pem;
root /var/www/admin; # 指定项目文件根目录
index index.html;
location / {
try_files $uri $uri/ /index.html; # 处理 Vue Router 的 history 模式
}
}
|
重载 Nginx:sudo nginx -t && sudo systemctl reload nginx
品牌站点/个人博客(静态站)
类似于管理后台前端服务,假设品牌站为 www.xiongneng.me。将静态网站文件上传至 /var/www/main。
Nginx 配置 /etc/nginx/conf.d/main.conf,结构与 admin.conf 类似,只需修改 server_name 和 root 即可。
若品牌站点/个人博客使用静态站点生成器(如Hugo、Hexo),部署完成后的访问加速补充步骤请见 CDN 章节。
FastAPI 后端服务
这部分将部署一个统一的 API 服务,为管理后台前端、小程序和 APP 提供后端API数据支持。
环境准备:创建项目目录并搭建 Python 虚拟环境:
1
2
3
| mkdir -p /opt/fastapi-app && cd /opt/fastapi-app
python3 -m venv venv # 创建虚拟环境
source venv/bin/activate # 激活虚拟环境
|
安装依赖
1
2
3
| pip install fastapi uvicorn[standard] gunicorn
# 如果有 requirements.txt 文件,则执行:
pip install -r requirements.txt
|
使用 systemd 来管理 FastAPI 进程,确保其稳定运行和开机自启。创建文件 /etc/systemd/system/fastapi.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| [Unit]
Description=FastAPI Application
After=network.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/opt/fastapi-app
Environment="PATH=/opt/fastapi-app/venv/bin"
ExecStart=/opt/fastapi-app/venv/bin/gunicorn -k uvicorn.workers.UvicornWorker -w 4 -b 127.0.0.1:8000 app.main:app
Restart=always
[Install]
WantedBy=multi-user.target
|
参数说明:
-w 4:表示启动4个工作进程,可根据服务器配置调整。app.main:app:请替换为你项目中实际的模块和 FastAPI 实例位置
启动并设置服务:
1
2
3
4
| sudo systemctl daemon-reload
sudo systemctl start fastapi.service
sudo systemctl enable fastapi.service
sudo systemctl status fastapi.service # 检查运行状态
|
小程序与 APP 后台(统一 API 服务)
在 Nginx 层面,通过不同 location 块或不同的 server_name 前缀来区分各端 API 请求,统一转发至上述 FastAPI 服务。
创建 Nginx 配置:/etc/nginx/conf.d/api.conf,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| server {
listen 443 ssl http2;
# 可同时监听多个域名
server_name api.xiongneng.me mini.xiongneng.me app.xiongneng.me;
ssl_certificate /etc/letsencrypt/live/xiongneng.me/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xiongneng.me/privkey.pem;
location / {
# 将请求转发到本地 8000 端口的 FastAPI 服务
proxy_pass http://127.0.0.1:8000;
# 设置代理头信息
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 超时设置(按需调整)
proxy_connect_timeout 60s;
proxy_read_timeout 120s;
}
}
|
重要: 在微信小程序后台,需要将 https://api.xiongneng.me 和 https://mini.xiongneng.me 都配置为合法的 request 域名。
配置对象存储(以腾讯云 COS 为例)
COS 配置
若已有用于图片存储的 COS 存储桶,则只需将博客等涉及资源访问的域名指向该存储桶。在腾讯云 COS 控制台,
为存储桶绑定自定义 CDN 加速域名,例如 image.xiongneng.me,并上传 SSL 证书。详细步骤可参考腾讯云官方文档。
配置DNS域名解析
如果之前有修改过域名的默认NS的,则先要去阿里云服务器找到我的域名 > 管理。把DNS服务器还原到阿里云分配的默认值。
然后再去域名解析配置地方,增加多个域名解析记录。把主域名 xiongneng.me
和所有不需要走 CDN 的子域名(如 api、admin、mini、app 等)都通过 A 记录 指向你阿里云轻量服务器的公网 IP。
走 CDN 的子域名:像 image.xiongneng.me(如果绑定腾讯云 COS 加速域名),则需要配置 CNAME 记录,
指向腾讯云 CDN 提供的 CNAME 地址,而不是服务器 IP。
ICP备案流程
在国内,ICP备案是网站正式上线前必须完成的合规流程。这个过程可以简单理解为:你提供个人资料和网站信息,阿里云初审,再由工信部终审。
整个过程在阿里云系统里操作很方便,通常有5个步骤,快的话1-2天,慢则20天左右
- 提交材料:登录阿里云备案系统(
beian.aliyun.com),按要求填写你的个人信息(姓名、身份证号、地址等)和网站信息,并上传身份证、完成人脸识别等。 - 阿里云初审:阿里云会在1-2个工作日内完成审核。过程中可能会电话联系你核实信息,请保持手机畅通。
- 提交管局:初审通过后,阿里云会将你的备案申请正式提交给你所在省市的通信管理局(工信部)。
- 工信部短信核验:提交管局后,你会收到工信部发送的短信核验码,需要在24小时内登录工信部备案系统完成核验,否则申请会被视为放弃。
- 管局审核:完成核验后,管局会进行最终审核,这个过程通常需要1-20个工作日不等。
备案期间网站能访问,但是又不能有内容,其实有点搞笑。但是又不得不这样做。因此需要修改Nginx,让它默认返回503。
编辑/etc/nginx/nginx.conf ,创建一个最高优先级的 server 块,放在所有server前面,并重新加载 Nginx 即可:
1
2
3
4
5
6
7
8
9
10
11
12
13
| server {
listen 80 default_server;
# 如果有 IPv6 也需要监听
listen [::]:80 default_server;
server_name _;
# 返回一个符合备案审核的响应
return 503;
# 或者更友好一点,但同样合规
# return 200 "Temporarily Unavailable for ICP Filing.";
}
include /etc/nginx/conf.d/*.conf;
#include /etc/nginx/sites-enabled/*;
|
然后执行:
1
2
| sudo nginx -t # 测试配置
sudo systemctl reload nginx # 重载,无需重启
|
配置ESA加速
在阿里云的体系里,能加速网站的“边缘安全加速资源包”主要对应 边缘安全加速 ESA (Edge Security Acceleration)。
它很适合你轻量服务器上的个人博客,官网甚至提供了免费套餐。
必须先删除原来的A记录,才能添加CNAME记录。而是DNS协议本身的技术限制:CNAME记录不能与任何其他类型的记录共存于同一个子域名下。
也就是说,对于 xiongneng.me 和 www.xiongneng.me,要么用A记录(直接指向IP),要么用CNAME记录(指向ESA的别名),两者不能同时存在。
进入ESA控制台后,你会看到“站点管理”的界面。要开始为你的博客接入服务,只需:
- 点击 “新增站点”。
- 根据页面指引,填写你的域名、选择加速区域(建议选择“中国内地”)和接入方式(如 CNAME)。
- 选择套餐类型这一步非常关键,请务必选择 “免费版”(即我们之前讨论过的Entrance套餐),不要误选付费版。
配置 ESA 回源协议为 HTTPS。进入 ESA 控制台,在你的站点管理中找到回源规则配置,将回源协议明确设置为 HTTPS,回源端口设置为 443。
证书的配置就在 ESA 控制台里,路径是固定的:进入你的站点详情页,在左侧导航栏就能找到“边缘证书”入口。
- 进入站点管理:登录 ESA 控制台,在“站点管理”页面点击你的目标站点,进入详情页。
- 找到功能入口:在详情页的左侧导航栏中,找到并点击 “边缘证书”。基础和高级设置都在这里。注意这里最好申请泛域名(如
*.xiongneng.me) - 确认HTTPS状态:进入“边缘证书”页面后,请先检查“配置状态”。如果显示“已配置”但你的网站还是HTTP访问,可以在这里开启 “强制HTTPS” 功能。
如果申请免费证书报错:
1
2
| 若您的 NS 站点已激活,或 CNAME 站点证书域名的 DNS 已解析至 ESA,则免费证书申请大约需要5-10分钟;
否则需要您在1小时内自行配置证书校验 DCV 信息。您可以在异步任务中查看免费证书申请状态。
|
则需要配置托管DCV,再次申请即可成功:
- 获取CNAME信息:在ESA控制台左侧菜单找到“托管DCV”,复制系统生成的CNAME信息。
- 添加CNAME记录:前往你的DNS服务商控制台,添加一条新的CNAME记录。记录类型选择CNAME,主机记录和记录值粘贴刚才复制的内容。
- 验证生效:配置完成后,等待几分钟使其生效
优化建议
- 在 Nginx 全局配置中增加安全头,如
X-Frame-Options、X-Content-Type-Options 等。 - 为后端 API 增加身份认证(如 JWT)和限流措施。
- 监控与告警:可接入免费的云监控(如阿里云云监控),设置 CPU、内存、磁盘和网站可用性的告警。