阿里云Ubuntu24搭建个人云平台

最近我购买了个人域名,一直在思考怎么去搭建个人全栈云平台,包括个人博客、品牌站点、管理后台(前后端分离)、小程序/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_nameroot 即可。

若品牌站点/个人博客使用静态站点生成器(如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.mehttps://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天左右

  1. 提交材料:登录阿里云备案系统(beian.aliyun.com),按要求填写你的个人信息(姓名、身份证号、地址等)和网站信息,并上传身份证、完成人脸识别等。
  2. 阿里云初审:阿里云会在1-2个工作日内完成审核。过程中可能会电话联系你核实信息,请保持手机畅通。
  3. 提交管局:初审通过后,阿里云会将你的备案申请正式提交给你所在省市的通信管理局(工信部)。
  4. 工信部短信核验:提交管局后,你会收到工信部发送的短信核验码,需要在24小时内登录工信部备案系统完成核验,否则申请会被视为放弃。
  5. 管局审核:完成核验后,管局会进行最终审核,这个过程通常需要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.mewww.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-OptionsX-Content-Type-Options 等。
  • 为后端 API 增加身份认证(如 JWT)和限流措施。
  • 监控与告警:可接入免费的云监控(如阿里云云监控),设置 CPU、内存、磁盘和网站可用性的告警。