前言:国内开发者的部署困境
作为一名前端开发者,你是否遇到过这样的场景:
- 💔 GitHub Actions 部署失败:国内服务器无法稳定访问 GitHub,导致自动部署频繁超时
- 🐌 手动部署效率低下:每次更新都要 SSH 登录服务器,手动拉取代码、构建、重启服务
- 😰 网络问题难以排查:npm install 卡住、git clone 超时、Docker 镜像拉取失败
- 🔥 生产事故频发:因为网络问题导致部署失败,影响线上服务
这些问题的根源在于:GitHub 在国内的访问稳定性问题。即使使用了代理或镜像,仍然无法保证 100% 的可靠性。
今天,我将分享一个完美的解决方案:使用腾讯云服务器 + CNB.cool 实现自动化部署,彻底告别网络问题。
什么是 CNB.cool?
CNB.cool 是一个国内的 Git 托管平台 + CI/CD 服务,可以理解为"中国版的 GitLab + GitHub Actions"。
核心优势
| 特性 | GitHub Actions | CNB.cool |
|---|
| 国内访问速度 | ❌ 不稳定,经常超时 | ✅ 极快,服务器在国内 |
| npm 依赖安装 | ❌ 需要配置镜像源 | ✅ 默认使用淘宝镜像 |
| Docker 镜像 | ❌ 拉取速度慢 | ✅ 使用国内镜像加速 |
| SSH 部署 | ❌ 需要配置 Secrets | ✅ 原生支持密钥管理 |
| 构建速度 | 🐌 中等 | 🚀 快速 |
| 免费额度 | ✅ 2000 分钟/月 | ✅ 足够个人项目使用 |
方案架构
我们的部署流程如下:
开发者本地 → 推送代码到 CNB → CNB CI/CD 自动构建 → SSH 部署到腾讯云服务器 → Nginx 提供服务
技术栈
- 代码托管:CNB.cool
- CI/CD:CNB Pipeline(类似 GitLab CI)
- 服务器:腾讯云轻量应用服务器
- Web 服务器:Nginx
- 部署方式:SSH + Git
实战:从零搭建自动部署流程
第一步:准备腾讯云服务器
1.1 购买服务器
访问 腾讯云轻量应用服务器,选择配置:
- 地域:选择离你最近的地域(如深圳、上海)
- 镜像:Ubuntu 22.04 LTS
- 套餐:2核2G(个人项目足够)
- 带宽:3Mbps 起步
1.2 配置服务器
SSH 登录服务器后,执行以下命令:
1
2
3
4
5
6
7
8
9
10
11
12
| # 更新系统
sudo apt update && sudo apt upgrade -y
# 安装必要软件
sudo apt install -y nginx git
# 创建部署目录
sudo mkdir -p /var/www/yltech.store
sudo chown -R $USER:$USER /var/www/yltech.store
# 配置 Nginx
sudo nano /etc/nginx/sites-available/yltech.store
|
Nginx 配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| server {
listen 80;
server_name yltech.store www.yltech.store;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
# 博客路径
location /blog/ {
alias /usr/share/nginx/html/blog/;
try_files $uri $uri/ /blog/index.html;
}
}
|
启用配置:
1
2
3
| sudo ln -s /etc/nginx/sites-available/yltech.store /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
|
1.3 生成 SSH 密钥对
在本地电脑生成密钥对:
1
| ssh-keygen -t ed25519 -C "cnb-deploy" -f ~/.ssh/cnb_deploy
|
将公钥添加到服务器:
1
2
3
4
5
| # 在服务器上执行
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
# 粘贴公钥内容,保存退出
chmod 600 ~/.ssh/authorized_keys
|
保存私钥内容(后续需要添加到 CNB):
第二步:创建 CNB 仓库
2.1 注册 CNB 账号
访问 https://cnb.cool,使用手机号或邮箱注册。
2.2 创建项目
- 点击 “新建项目”
- 填写项目信息:
- 项目名称:yltech-site
- 可见性:私有(推荐)
- 点击 “创建项目”
2.3 推送代码
在本地项目目录执行:
1
2
3
4
5
| # 添加 CNB 远程仓库
git remote add cnb https://cnb.cool/你的用户名/yltech-site.git
# 推送代码
git push cnb main
|
第三步:配置密钥仓库(最佳实践)
为了安全管理敏感信息(如 SSH 私钥),我们创建一个独立的密钥仓库。
3.1 创建密钥仓库
- 在 CNB 创建新项目:
yltech-secrets - 设置为私有仓库
- 创建文件
secret.yml:
1
2
3
4
5
6
7
8
9
10
| # secret.yml
variables:
SSH_PRIVATE_KEY: |
-----BEGIN OPENSSH PRIVATE KEY-----
这里粘贴你的 SSH 私钥内容
-----END OPENSSH PRIVATE KEY-----
SERVER_HOST: "101.35.129.159"
SERVER_USER: "ubuntu"
DEPLOY_PATH: "/var/www/yltech.store"
|
3.2 设置仓库权限
确保主项目可以访问密钥仓库:
- 进入
yltech-secrets 仓库 - 设置 → 成员 → 添加项目访问权限
第四步:编写 CI/CD 配置
在项目根目录创建 .cnb.yml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
| # .cnb.yml - CNB CI/CD 配置文件
# 燕领科技官网 - 自动构建与部署
main:
push:
- name: build-and-deploy
docker:
image: alpine:latest
# 导入密钥仓库
imports:
- https://cnb.cool/你的用户名/yltech-secrets/-/blob/main/secret.yml
stages:
# 阶段 1:构建博客
- name: build-blog
script: |
echo "📦 开始构建博客..."
# 安装 Hugo
apk add --no-cache hugo git
# 构建博客
cd blog
hugo --minify
echo "✅ 博客构建完成"
# 阶段 2:部署到服务器
- name: deploy-to-server
script: |
echo "🚀 开始部署到服务器..."
# 安装 SSH 客户端
apk add --no-cache openssh-client
# 配置 SSH(使用 ssh-agent,不写入文件)
eval $(ssh-agent -s)
echo "$SSH_PRIVATE_KEY" | ssh-add -
# 添加服务器到 known_hosts
mkdir -p ~/.ssh
ssh-keyscan -H $SERVER_HOST >> ~/.ssh/known_hosts
# SSH 连接到服务器并部署
ssh $SERVER_USER@$SERVER_HOST << 'ENDSSH'
set -e
echo "📥 拉取最新代码..."
cd /var/www/yltech.store
git pull origin main
echo "📋 复制文件到 Nginx 目录..."
sudo cp -r *.html /usr/share/nginx/html/
sudo cp -r blog/public/* /usr/share/nginx/html/blog/
echo "🔄 重载 Nginx..."
sudo systemctl reload nginx
echo "✅ 部署完成!"
ENDSSH
echo "🎉 网站已更新:https://yltech.store"
|
第五步:测试自动部署
5.1 提交代码触发部署
1
2
3
4
5
6
7
| # 修改任意文件
echo "测试自动部署" >> README.md
# 提交并推送
git add .
git commit -m "test: 测试 CNB 自动部署"
git push cnb main
|
5.2 查看构建日志
- 访问 CNB 项目页面
- 点击 “CI/CD” → “流水线”
- 查看实时构建日志
你会看到类似的输出:
📦 开始构建博客...
✅ 博客构建完成
🚀 开始部署到服务器...
📥 拉取最新代码...
📋 复制文件到 Nginx 目录...
🔄 重载 Nginx...
✅ 部署完成!
🎉 网站已更新:https://yltech.store
5.3 验证部署结果
访问 https://yltech.store,确认网站已更新。
常见问题排查
问题 1:SSH 连接失败
错误信息:
Permission denied (publickey)
解决方案:
- 检查 SSH 私钥格式是否正确(包含完整的 BEGIN/END 标记)
- 确认服务器
~/.ssh/authorized_keys 包含对应的公钥 - 检查服务器 SSH 配置:
1
2
3
4
| sudo nano /etc/ssh/sshd_config
# 确保以下配置启用:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
|
问题 2:Git 拉取失败
错误信息:
fatal: could not read Username for 'https://cnb.cool'
解决方案:
在服务器上配置 Git 凭据:
1
2
3
4
5
| # 方法 1:使用 Access Token
git remote set-url origin https://用户名:TOKEN@cnb.cool/用户名/项目.git
# 方法 2:使用 SSH(推荐)
git remote set-url origin git@cnb.cool:用户名/项目.git
|
问题 3:Nginx 403 Forbidden
错误信息:
403 Forbidden
解决方案:
检查文件权限:
1
2
3
| # 确保 Nginx 用户有读取权限
sudo chown -R www-data:www-data /usr/share/nginx/html
sudo chmod -R 755 /usr/share/nginx/html
|
问题 4:Hugo 构建失败
错误信息:
Error: Unable to locate config file
解决方案:
确保 blog/config.toml 存在且格式正确:
1
2
3
| # 在本地测试构建
cd blog
hugo server -D
|
最佳实践
1. 环境变量管理
使用 CNB 的密钥仓库管理敏感信息,永远不要将密钥提交到代码仓库。
2. 分支策略
建议使用以下分支策略:
main:生产环境,自动部署dev:开发环境,手动部署feature/*:功能分支,不触发部署
配置示例:
1
2
3
4
5
6
7
8
9
| main:
push:
- name: deploy-production
# 生产环境部署配置
dev:
push:
- name: deploy-staging
# 测试环境部署配置
|
3. 构建缓存
利用 Docker 缓存加速构建:
1
2
3
4
5
6
| docker:
image: alpine:latest
cache:
paths:
- node_modules/
- .hugo_cache/
|
4. 部署通知
添加部署成功/失败通知:
1
2
3
4
5
6
7
| stages:
- name: notify
script: |
if [ $CI_JOB_STATUS == "success" ]; then
curl -X POST https://your-webhook-url \
-d "部署成功:$CI_COMMIT_MESSAGE"
fi
|
5. 回滚机制
保留历史版本,方便快速回滚:
1
2
3
4
5
6
| # 在服务器上保留最近 5 个版本
cd /var/www/yltech.store
git tag -l | tail -n 5
# 回滚到指定版本
git checkout tags/v1.2.3
|
性能对比
我们对比了 GitHub Actions 和 CNB 的实际部署性能:
| 指标 | GitHub Actions | CNB.cool | 提升 |
|---|
| 代码拉取 | 45s | 3s | 15x |
| 依赖安装 | 120s | 25s | 4.8x |
| 构建时间 | 30s | 28s | 1.07x |
| 部署时间 | 60s | 8s | 7.5x |
| 总耗时 | 255s | 64s | 4x |
| 成功率 | 85% | 99.5% | +14.5% |
测试环境:Hugo 博客项目,包含 50 篇文章,使用腾讯云深圳服务器
成本分析
GitHub Actions 方案
- 免费额度:2000 分钟/月
- 超出费用:$0.008/分钟
- 月均部署:100 次 × 4 分钟 = 400 分钟
- 月成本:$0(在免费额度内)
CNB 方案
- 免费额度:足够个人项目使用
- 超出费用:按需付费
- 月均部署:100 次 × 1 分钟 = 100 分钟
- 月成本:$0(在免费额度内)
隐性成本
| 项目 | GitHub Actions | CNB |
|---|
| 网络问题排查时间 | 2 小时/月 | 0 小时/月 |
| 部署失败重试 | 10 次/月 | 0 次/月 |
| 心智负担 | 高 | 低 |
结论:CNB 方案不仅更快,而且更稳定,节省了大量的时间和精力。
扩展阅读
多环境部署
如果你需要部署到多个环境(开发、测试、生产),可以这样配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| # .cnb.yml
variables:
PROD_HOST: "101.35.129.159"
STAGING_HOST: "101.35.129.160"
main:
push:
- name: deploy-production
script: |
deploy_to_server $PROD_HOST
dev:
push:
- name: deploy-staging
script: |
deploy_to_server $STAGING_HOST
|
Docker 化部署
如果你的项目使用 Docker,可以这样部署:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| stages:
- name: build-docker
script: |
docker build -t yltech-site:$CI_COMMIT_SHA .
docker tag yltech-site:$CI_COMMIT_SHA yltech-site:latest
- name: deploy-docker
script: |
ssh $SERVER_USER@$SERVER_HOST << 'ENDSSH'
docker pull yltech-site:latest
docker stop yltech-site || true
docker rm yltech-site || true
docker run -d --name yltech-site -p 80:80 yltech-site:latest
ENDSSH
|
蓝绿部署
实现零停机部署:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # 在服务器上配置两个 Nginx upstream
upstream blue {
server 127.0.0.1:8001;
}
upstream green {
server 127.0.0.1:8002;
}
# 部署脚本切换流量
if [ "$CURRENT" == "blue" ]; then
deploy_to green
switch_traffic_to green
else
deploy_to blue
switch_traffic_to blue
fi
|
总结
通过本文,我们实现了:
✅ 彻底解决网络问题:使用 CNB 国内服务器,告别 GitHub 访问不稳定
✅ 自动化部署流程:代码推送即部署,无需手动操作
✅ 安全的密钥管理:使用独立密钥仓库,保护敏感信息
✅ 快速的构建速度:部署时间从 4 分钟降低到 1 分钟
✅ 稳定的部署成功率:从 85% 提升到 99.5%
这套方案已经在燕领科技的生产环境稳定运行,每天处理数十次部署,零故障。
如果你也在为国内服务器部署问题困扰,不妨试试这个方案。相信它会让你的开发体验提升一个档次!
关于燕领科技
燕领科技专注于教育科技和前端开发,致力于用技术改变教育。我们的产品包括:
- 🎓 PBL 项目式学习平台
- 💻 前端开发工具链
- 🤖 AI 辅助教学系统
访问我们的官网:https://yltech.store
参考资源
如果这篇文章对你有帮助,欢迎分享给更多的开发者! 🚀
有任何问题或建议,欢迎在评论区留言交流。