独立项目部署教程
在同一台服务器上部署独立的 Next.js 项目,使用子域名访问,与主站完全隔离。以 panfex-blog 为例。
前置信息
| 项目 | 值 |
|---|---|
| 服务器 | Ubuntu 22.04, IP 你的服务器 IP |
| 子域名 | blog.panfex.com |
| 项目目录 | /home/ubuntu/panfex-blog |
| 运行端口 | 3001 |
| GitHub 仓库 | Cipuzp/panfex-blog(Private) |
第一步:DNS 解析(最先做,等生效)
在域名管理面板添加一条 A 记录:
| 记录类型 | 主机记录 | 记录值 |
|---|---|---|
| A | blog | 你的服务器 IP |
DNS 解析需要几分钟到几小时生效,先做这一步,利用等待时间做后续操作。
第二步:本地准备(推送代码到 GitHub)
cd /path/to/your/project
git init
git add -A
git commit -m "初始化项目"
# 在 GitHub 上创建仓库(Private),然后关联并推送
git remote add origin https://github.com/Cipuzp/panfex-blog.git
git branch -M main
git push -u origin main第三步:服务器 SSH 密钥配置
GitHub 的 Deploy Key 是绑定单个仓库的,同一个 key 不能用于两个仓库。如果服务器已有 SSH key 用于其他仓库(如 contentFactory),需要为新仓库生成新的密钥。
3.1 生成新密钥
ssh root@你的服务器 IP
# 生成新的 SSH 密钥
ssh-keygen -t ed25519 -f ~/.ssh/id_panfex_blog -C "panfex-blog-deploy"
# 提示 passphrase 时直接回车(留空)3.2 配置 SSH 别名
cat >> ~/.ssh/config << 'EOF'
Host github-blog
HostName github.com
User git
IdentityFile ~/.ssh/id_panfex_blog
EOF为什么要用别名? 服务器有两个 SSH 密钥:
~/.ssh/id_rsa→ 给contentFactory用~/.ssh/id_panfex_blog→ 给panfex-blog用
用 git@github.com 时 SSH 默认只用 id_rsa。别名 github-blog 告诉 SSH 访问时用 id_panfex_blog 密钥:
git@github.com:Cipuzp/contentFactory.git→ 用id_rsa✅git@github-blog:Cipuzp/panfex-blog.git→ 用id_panfex_blog✅
3.3 添加 Deploy Key 到 GitHub
cat ~/.ssh/id_panfex_blog.pub复制输出,前往 GitHub → 仓库 → Settings → Deploy keys → Add deploy key,粘贴公钥。
第四步:克隆代码到服务器
mkdir -p /home/ubuntu/panfex-blog
cd /home/ubuntu/panfex-blog
# 使用别名克隆
git clone git@github-blog:Cipuzp/panfex-blog.git .第五步:首次初始化
chmod +x scripts/deploy.sh
./scripts/deploy.sh --init会安装 Node.js 22(NodeSource apt 源)和 PM2。
第六步:正式部署
./scripts/deploy.sh自动执行:git pull → npm ci → npm run build → Nginx 配置 → PM2 启动。
验证 HTTP
curl http://localhost:3001/health
# 返回 OK
# DNS 生效后
curl http://blog.panfex.com/health
# 返回 OK第七步:签发 SSL 证书
等 DNS A 记录生效后(ping blog.panfex.com 确认解析到正确 IP):
./scripts/deploy.sh --ssl第八步:最终验证
curl -I https://blog.panfex.com浏览器访问 https://blog.panfex.com 确认页面和 HTTPS 正常。
日常更新
cd /home/ubuntu/panfex-blog
./scripts/deploy.sh常用命令
pm2 status # 查看应用状态
pm2 logs panfex-blog # 查看实时日志
pm2 restart panfex-blog # 手动重启
sudo nginx -t # 测试 Nginx 配置
sudo systemctl reload nginx # 重载 Nginx
sudo certbot renew --dry-run # 检查 SSL 续签deploy.sh 命令一览
| 命令 | 用途 |
|---|---|
./scripts/deploy.sh | 日常更新(git pull → 构建 → 重启) |
./scripts/deploy.sh --init | 首次初始化(安装 Node + PM2) |
./scripts/deploy.sh --build-only | 仅构建,不重启 |
./scripts/deploy.sh --nginx | 仅更新 Nginx 配置 |
./scripts/deploy.sh --ssl | 签发 SSL 证书 |