阿里云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。
云服务器基础环境准备
登录服务器后,首先更新系统并安装项目所需的必要软件包。
| |
安装并配置 Nginx 反向代理
Nginx 将作为所有服务的统一入口,负责接收外部请求并将其分发到对应的内部服务。
| |
在 http 块内,增加或修改以下配置,用于优化反向代理性能:
| |
保存文件后,测试配置并重载 Nginx
| |
申请Let’s Encrypt证书并自动续期
本步骤将申请一个覆盖一级域名 xiongneng.me 和 *.xiongneng.me 的泛域名证书,并设置自动续期任务。
配置阿里云
登录阿里云RAM访问控制页面。创建一个RAM用户,勾选“OpenAPI调用访问”,并为它授权 AliyunDNSFullAccess 权限。
生成并记录下这个用户的 AccessKey ID 和 AccessKey Secret。
在服务器上创建一个凭据文件,如 /opt/certbot_dns/credentials.ini,并写入以下内容
| |
必须设置权限,保护密钥文件安全:
| |
安装插件
| |
申请证书
| |
生成成功日志:
| |
设置自动续期与重载 Nginx
直接编辑 root 用户的 crontab:
| |
在文件末尾添加下面这一行即可:
| |
解释:
0 2 * * *:每天凌晨 2 点执行。/opt/certbot/bin/certbot renew:调用虚拟环境中的certbot检查并续期证书。--quiet:安静模式,没有错误不输出。--deploy-hook "systemctl reload nginx":自动完成脚本的工作——续期成功后立即重载 Nginx,无需额外的脚本文件。
测试自动续期是否能成功。看到 Congratulations, all simulated renewals succeeded 就代表一切就绪。
| |
部署各个服务
管理后台前端(Vue)
假设管理后台为 admin.xiongneng.me
- 本地打包:在项目根目录下执行
npm run build,得到dist文件夹。 - 上传文件:将
dist目录下的所有内容上传至服务器/var/www/admin。 - Nginx 配置:创建文件
/etc/nginx/conf.d/admin.conf,内容如下
| |
重载 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 虚拟环境:
| |
安装依赖
| |
使用 systemd 来管理 FastAPI 进程,确保其稳定运行和开机自启。创建文件 /etc/systemd/system/fastapi.service
| |
参数说明:
-w 4:表示启动4个工作进程,可根据服务器配置调整。app.main:app:请替换为你项目中实际的模块和 FastAPI 实例位置
启动并设置服务:
| |
小程序与 APP 后台(统一 API 服务)
在 Nginx 层面,通过不同 location 块或不同的 server_name 前缀来区分各端 API 请求,统一转发至上述 FastAPI 服务。
创建 Nginx 配置:/etc/nginx/conf.d/api.conf,内容如下:
| |
重要: 在微信小程序后台,需要将 https://api.xiongneng.me 和 https://mini.xiongneng.me 都配置为合法的 request 域名。
配置腾讯云COS
COS 绑定 static.xiongneng.me
前置条件(先确认满足)
- 域名
xiongneng.me已有完整 ICP 备案(你已经办好,直接可用) - 存储桶地域为国内(广州 / 上海等,非香港)
- 域名解析服务商:阿里云云 DNS(你的域名在阿里云,解析在阿里云后台操作)
一、腾讯云 COS 控制台添加自定义域名
- 登录腾讯云对象存储 COS 控制台 → 进入你的图片存储桶
- 左侧菜单:域名与传输管理 → 自定义源站域名
- 点击【添加域名】,填写:
- 域名:
static.xiongneng.me - 源站类型:默认源站(仅存图片,不用静态网站源站)
- CNAME:自动生成,复制保存(格式:
桶名-APPID.cos.ap-guangzhou.myqcloud.com) - 强制 HTTPS:勾选开启(全站 https,适配 FixIt 博客)
- 域名:
- 点击【添加】,此时会提示需要配置 CNAME 解析,先放着页面,去阿里云 DNS 操作
二、阿里云 DNS 添加 CNAME 解析(关键步骤)
- 登录阿里云云解析 DNS → 找到域名
xiongneng.me→ 解析设置 - 添加记录:
- 记录类型:
CNAME - 主机记录:
static(只填子域名前缀,不用写完整域名) - 记录值:刚才 COS 页面复制的 CNAME 地址(
xxx.cos.ap-guangzhou.myqcloud.com) - TTL:10 分钟(默认即可)
- 记录类型:
- 保存解析,等待10~30 分钟生效(各地 DNS 缓存不同)
三、申请免费 SSL 证书(实现 https 访问图片)
- 腾讯云控制台 → SSL 证书 → 申请免费证书(DV 域名型)
- 域名填写:
static.xiongneng.me - 验证方式:DNS 手动验证
提交申请,进入证书验证页面,会给出两组关键信息:
- 记录类型:TXT
- 主机记录:一串下划线开头字符串(如
_xxxx.static) - 记录值:一长串随机字符
阿里云云解析 DNS → xiongneng.me → 解析设置 → 添加记录
- 记录类型:TXT
- 主机记录:复制证书页面给出的完整前缀(例如
_abc123.static,不要漏 static) - 记录值:复制页面一长串验证文本
- TTL:10 分钟,保存
返回腾讯云控制台
- 等待 10~30 分钟 DNS 缓存生效,点击验证域名。显示证书申请成功
- 开启自动续费,证书到期前30天自动生成一张新的待验证证书。
- 返回 COS「自定义源站域名」页面,点击【绑定证书】,选中刚申请好的证书,确认绑定
证书更新 默认免费证书有效期只有90天,快到期的时候要手动更新证书。
- 由于我上面设置了“自动续费”,到期前30天,自动生成一张新的待验证证书。
- 去阿里云 DNS,给
xiongneng.me新增 TXT 解析,等待 20~30 分钟生效; - 返回腾讯 SSL 控制台刷新验证,验证通过后证书签发成功;
- 进入 COS 存储桶→自定义域名,找到
static.xiongneng.me,重新绑定刚签发的新证书; - 开启强制 HTTPS,等待 30 分钟 CDN 全网同步,无痕窗口测试图片链接。
四、校验是否配置成功
- 浏览器访问:
https://static.xiongneng.me/你的图片路径 - 正常显示图片(不会弹出下载,解决 2024 年后新桶默认域名强制下载问题)
- 无证书不安全提示,https 锁标正常
五、配套安全配置
1、防盗链(存储桶→安全管理→防盗链) 白名单填入:
| |
2、CORS 跨域(FixIt 图片灯箱 / 懒加载必备) 安全管理→跨域访问 CORS,新增规则:
- 允许来源:
https://*.xiongneng.me - 允许方法:GET
- 允许头部:*
- 缓存时长:86400
六、Hugo FixIt 全站替换图片地址
- 旧地址(COS 默认域名)
https://xxx-xxx.cos.ap-guangzhou.myqcloud.com/img/photo.jpg - 新地址(自定义子域名)
https://static.xiongneng.me/img/photo.jpg
ICP备案流程
在国内,ICP备案是网站正式上线前必须完成的合规流程。这个过程可以简单理解为:你提供个人资料和网站信息,阿里云初审,再由工信部终审。 整个过程在阿里云系统里操作很方便,通常有5个步骤,快的话1-2天,慢则20天左右
- 提交材料:登录阿里云备案系统(
beian.aliyun.com),按要求填写你的个人信息(姓名、身份证号、地址等)和网站信息,并上传身份证、完成人脸识别等。 - 阿里云初审:阿里云会在1-2个工作日内完成审核。过程中可能会电话联系你核实信息,请保持手机畅通。
- 提交管局:初审通过后,阿里云会将你的备案申请正式提交给你所在省市的通信管理局(工信部)。
- 工信部短信核验:提交管局后,你会收到工信部发送的短信核验码,需要在24小时内登录工信部备案系统完成核验,否则申请会被视为放弃。
- 管局审核:完成核验后,管局会进行最终审核,这个过程通常需要1-20个工作日不等。
备案期间网站能访问,但是又不能有内容,其实有点搞笑。但是又不得不这样做。因此需要修改Nginx,让它默认返回503。
编辑/etc/nginx/nginx.conf ,创建一个最高优先级的 server 块,放在所有server前面,并重新加载 Nginx 即可:
| |
然后执行:
| |
后续如果网站IP变更了,还需要走变更申请流程。
公安联网备案
ICP备案完成后,还要去公安联网备案。注意备案之前不能开启CDN加速。一定要使用A记录将网站域名指向真实主机IP地址,等通过后再开启CDN。 地址:https://beian.mps.gov.cn/
后续如果网站IP变更了,还需要走变更申请流程。
配置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” 功能。
如果申请免费证书报错:
| |
则需要配置托管DCV,再次申请即可成功:
- 获取CNAME信息:在ESA控制台左侧菜单找到“托管DCV”,复制系统生成的CNAME信息。
- 添加CNAME记录:前往你的DNS服务商控制台,添加一条新的CNAME记录。记录类型选择CNAME,主机记录和记录值粘贴刚才复制的内容。
- 验证生效:配置完成后,等待几分钟使其生效
个人网站切换到阿里云OSS
后来我发现个人网站完全可以使用阿里云OSS免费托管,并且也支持域名解析和备案。这样我就不用再购买ECS服务器了。省下来的钱可以购买Mac mini主机作为24小时开发机器。暂时可以在树莓派上面玩一下Hermes Agent即可,后续买了Mac mini就全部迁移过去。
首先开通OSS服务,并创建两个桶,一个用于存放博客xiongneng-blog,一个用于存放静态图片xiongneng-static。
将腾讯云COS那边的图片都同步到阿里云OSS中。
1. 腾讯云侧:创建迁移专用子账号(安全,迁移完删除密钥)
- 腾讯云 CAM 控制台 → 用户 → 新建用户,勾选编程访问;
- 绑定权限策略:
QcloudCOSAccessForMSPRole、QcloudMSPFullAccess; - 保存:
SecretId、SecretKey; - 记录 COS 信息:
- Bucket 完整名称:xnstatic-1253397658(必须带 APPID)
- COS 地域 Endpoint:如cos.ap-shanghai.myqcloud.com(上海)
2. 阿里云测:完整迁移操作步骤
进入- 数据迁移服务>迁移任务:https://mgwnext.console.aliyun.com/cn-shenzhen/online-mg-task
- 新建源地址(腾讯 COS)
左侧「数据地址」→ 新建地址
- 数据类型:Temcent COS
- 地址名称:自定义如
tencent-static-src - 地域:选你的 COS 对应地域
- Endpoint:填 COS 地域域名
- Bucket:完整桶名
xxx-12345678 - SecretId / SecretKey:填入腾讯子账号密钥
- 前缀:留空 = 迁移桶全部文件(不要填任何内容) 保存,测试连通性,显示正常即可。
- 新建目的地址(阿里云 OSS)
数据地址 → 新建地址
- 数据类型:Alibaba OSS
- 地域:和目标 static 桶同区(如深圳)
- Bucket:xiongneng-static
- 创建迁移任务(全量同步)
左侧「迁移任务」→ 创建任务
- 任务名:
cos-to-oss-static-full - 源地址:刚才创建的腾讯 COS 地址
- 目的地址:刚才创建的阿里云 OSS 地址
- 迁移前缀:空(整桶迁移)
- 执行方式:立即执行
- 任务名:
- 启动任务,控制台实时看进度、失败文件、传输速度;
- 任务完成后,核对文件总数、目录结构完全一致。
- 申请证书,可以申请一个SSL个人版免费证书,域名填写
static.xiongneng.me
切换静态图片访问域名
- 进入你的 static 图片 Bucket → 左侧【传输管理】→【域名管理】
- 点击【绑定域名】,输入
static.xiongneng.me,自动添加CNAME记录验证通过。
域名托管 SSL 证书(实现 HTTPS 访问)
- 域名管理列表找到
static.xiongneng.me,右侧【证书托管】 - 证书来源选「云盾 SSL 证书中心」,下拉选中刚申请的
static.xiongneng.me证书 - 确定保存,等待 10 分钟证书下发完
图片存储桶xiongneng-static防盗链设置
在防盗链的白名单Referer中配置
| |
然后在跨域设置中添加规则,Origin来源填写
| |
运行的Methods填写GET和HEAD,缓存时间设置为86400。
上面图片桶配置完成后,再配置博客静态文件桶xiongneng-blog
进入 Bucket → 数据管理 → 静态页面
- 默认首页:
index.html - 404 错误页面:
index.html(Hugo/Vue/ 静态博客路由刷新不丢失) - 开启「子目录首页」(博客多目录推荐)
OSS 绑定你已备案域名(核心操作)
- 在Bucket概览中,外网访问域名:
xiongneng-blog.oss-cn-shenzhen.aliyuncs.com - Bucket 左侧「Bucket配置」→「域名管理」→「绑定域名」
- 填入你的博客域名(如xiongneng.me和www.xiongneng.me),申请2个。
- 根据提示添加CNAME记录@和www
- 验证通过后,域名绑定完成;再开启 HTTPS:
- 数字证书管理服务/SSL证书管理 → 个人测试证书(原免费证书)。
- 这里只需要申请www.xiongneng.me即可,会自动带上xiongneng.me主域名。
- 申请成功后,「Bucket配置」→「域名管理」→「证书托管」,选择上面申请好的证书。
修改 DNS 解析,切流量到 OSS
- 阿里云云解析 DNS → 你的域名 → 解析设置
- 删除原来指向 ECS 的 A 记录(旧服务器 IP)
- 新增 CNAME 记录:
- 主机记录:
www/@(你的博客前缀) - 记录类型:CNAME
- 记录值:刚才复制的 OSS 外网域名
- TTL:10 分钟
- 主机记录:
- 等待 10~30 分钟解析生效,访问域名测试网页正常打开
GitHub Action 官方 OSS 上传插件
- 阿里云 → 访问控制 RAM → 创建 AccessKey
- 权限:只给 OSS 读写权限
AliyunOSSFullAccess - 保存
AccessKey ID、AccessKey Secret
- 权限:只给 OSS 读写权限
- 打开你的 GitHub 仓库 → Settings → Secrets and variables → Actions → New repository secret 添加 5 个密钥:
| |
修改hugo项目中的.github/workflows/deploy.yml,前面其他步骤不变,主要是将原来ssh登录ECS传文件,修改为ossutil2.0来同步。
| |
ICP 备案(不用提交变更,仅自查)
- 阿里云 ICP 备案后台查看:域名备案状态正常、主体信息无误即可;
- 管局规则:同一阿里云账号内,域名可解析至任意大陆阿里云资源(ECS/OSS/SAE),无需变更备案
- 仅当你后续换腾讯云 / 华为云,才需要做「接入备案」,本次迁移不用。
公安联网备案(必须手动更新服务器信息)
- 打开全国互联网安全管理服务平台登录账号;
- 找到你的网站备案条目 → 修改网站信息;
- 接入服务商:阿里云;服务器服务类型从「云服务器 ECS」改为「对象存储 OSS 静态网站托管」;
- 保存提交,即时生效,无人工审核。