---
date: 2026-04-02
type: operations
severity: medium
tags: [deployment, server-migration, uat, nginx, certbot, docker]
---

# UAT 测试环境迁移到新服务器的完整步骤

## 场景

将 UAT 测试环境从 43.130.6.44 迁移到 43.153.69.73。

## 迁移清单（按顺序）

### 1. 新服务器环境准备
- 检查已有服务和端口占用（`docker ps`、`ss -tlnp`），确认无冲突
- 安装 nvm + Node.js + PM2
- 创建项目目录并设置权限

### 2. Nginx + HTTPS
- 先创建 HTTP-only 的 Nginx 配置（用于 certbot 验证）
- 用 certbot webroot 模式申请 Let's Encrypt 证书
- 更新 Nginx 配置加 HTTPS + 反向代理
- 参考同服务器上已有项目的 Nginx 配置作为模板

### 3. 项目克隆
- 需要带 Gitea token 克隆（`http://user:token@host/repo.git`）
- 切到 staging 分支

### 4. 配置文件
- 从旧服务器 scp `.env.uat` 到新服务器
- 端口用 7000 系列避免和其他服务冲突

### 5. Docker 服务
- `bash scripts/deploy/deploy.sh uat up --basic` 启动 PostgreSQL + Redis

### 6. 数据库迁移
- 旧服务器：`docker exec pg_dump` 导出 → gzip
- 新服务器：创建用户和数据库 → gunzip 导入

### 7. 部署应用
- `CI=true bash scripts/deploy/deploy.sh uat deploy --skip-migrate`（数据库已从旧库导入，不需要重跑迁移）

### 8. CI/CD 更新
- `.gitea/workflows/deploy-uat.yml`：改 IP、SSH 用户、项目路径、恢复触发分支
- Gitea Secrets 里的 `DEPLOY_SSH_KEY` 对应的公钥需要加到新服务器的 `~/.ssh/authorized_keys`

### 9. 验证
- 内部健康检查：`bash scripts/deploy/deploy.sh uat health`
- 外部 HTTPS 访问：`curl -sk https://domain/api/v1/health`

## 容易遗漏的点

1. **deploy key**：CI 用的 SSH key 不会自动到新服务器，必须手动加 authorized_keys
2. **git clone 认证**：新服务器没有 git credential，需要带 token 克隆
3. **数据库用户创建**：新的 PostgreSQL 容器没有旧库的用户，需要先 CREATE USER + CREATE DATABASE 再导入
4. **端口冲突检查**：新服务器可能已有其他服务占用端口，先 `ss -tlnp` 检查
