From 2af39e8eb50c65d2691d4368e215dabd098fc427 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B6=85=E5=93=A5?= <2982212683@qq.com> Date: Sun, 10 May 2026 21:43:32 +0800 Subject: [PATCH] 20260510 --- .arts/settings.json | 4 + scripts/deploy_ubuntu/README.md | 140 ++++++++++++++++++++++- scripts/deploy_ubuntu/prepare_offline.sh | 78 ++++++++++++- 3 files changed, 215 insertions(+), 7 deletions(-) create mode 100644 .arts/settings.json diff --git a/.arts/settings.json b/.arts/settings.json new file mode 100644 index 0000000..73d88c2 --- /dev/null +++ b/.arts/settings.json @@ -0,0 +1,4 @@ +{ + "clawMode.mode": "editor", + "workbench.activityBar.location": "default" +} \ No newline at end of file diff --git a/scripts/deploy_ubuntu/README.md b/scripts/deploy_ubuntu/README.md index d44b1c6..80decd4 100644 --- a/scripts/deploy_ubuntu/README.md +++ b/scripts/deploy_ubuntu/README.md @@ -393,4 +393,142 @@ sed -i 's/PROJECT_DIR=JYHDXS/PROJECT_DIR=CHANGDE/' .env - [ ] Redis 服务已启动且可连接 - [ ] 执行 `deploy.sh -d` 部署成功(首次部署) - [ ] 执行 `deploy.sh -d -s` 部署成功(增量更新) -- [ ] 服务状态正常(`systemctl --user status MyAPS_API` 或 `systemctl status MyAPS_API`) \ No newline at end of file +- [ ] 服务状态正常(`systemctl --user status MyAPS_API` 或 `systemctl status MyAPS_API`) + +## 🔄 无外网环境代码同步指南 + +### 首次获取代码:使用 Git Bundle 传输(推荐) + +#### 步骤1:在外网机器上打包 +```bash +# 从远程仓库拉取最新代码 +git clone 远程仓库地址 myaps_api +cd myaps_api + +# 打包成完整的 bundle 文件(包含所有分支和历史) +git bundle create myaps_api.bundle --all +``` + +#### 步骤2:传输到内网机器 +使用 U 盘、移动硬盘或其他物理介质将 `myaps_api.bundle` 传输到内网服务器。 + +#### 步骤3:在内网机器上从 bundle 创建仓库 +```bash +# 从 bundle 文件克隆仓库 +git clone myaps_api.bundle myaps_api +cd myaps_api + +# 验证仓库状态 +git log --oneline -10 +``` + +--- + +### 更新代码:方法1 - 使用 Git Bundle 增量更新(推荐) + +#### 步骤1:在外网机器上准备 +```bash +# 进入外网仓库目录 +cd myaps_api + +# 拉取最新代码 +git pull origin master + +# 记录上次同步的 commit(或使用标签) +# 假设上次同步的 commit 是 abc1234 +git bundle create update.bundle abc1234..HEAD + +# 或者打包所有分支 +git bundle create update.bundle --all +``` + +#### 步骤2:传输到内网机器 +将 `update.bundle` 传输到内网服务器。 + +#### 步骤3:在内网机器上更新 +```bash +cd /opt/myaps_api/myaps_api + +# 从 bundle 获取更新 +git fetch /path/to/update.bundle + +# 合并到本地分支 +git merge FETCH_HEAD + +# 或者直接 pull +git pull /path/to/update.bundle master +``` + +--- + +### 更新代码:方法2 - 使用补丁文件 (Patch) + +适合小范围更新,文件体积小。 + +#### 步骤1:在外网机器上生成补丁 +```bash +cd myaps_api +git pull origin master + +# 生成从某个 commit 到最新的补丁 +# 方法A:生成单个补丁文件 +git format-patch start_commit..HEAD --stdout > updates.patch + +# 方法B:生成多个独立补丁文件 +git format-patch -n start_commit..HEAD +``` + +#### 步骤2:传输补丁文件 +将 `updates.patch` 或多个 `.patch` 文件传输到内网服务器。 + +#### 步骤3:在内网机器上应用补丁 +```bash +cd /opt/myaps_api/myaps_api + +# 方法A:应用单个补丁文件 +git apply updates.patch + +# 方法B:使用 git am 应用(会保留提交信息) +git am *.patch + +# 如果有冲突,解决后继续 +git am --continue +``` + +--- + +### 推荐工作流程 + +1. **在外网机器**: + - 定期从远程仓库拉取代码 + - 使用 Git Bundle 打包(首次用完整 bundle,后续用增量 bundle) + +2. **物理传输**: + - 通过 U 盘/移动硬盘传输 bundle 文件到内网 + +3. **在内网机器**: + - 从 bundle 更新本地仓库 + - 执行增量部署:`./scripts/deploy_ubuntu/deploy.sh -d -s` + +--- + +### 实用技巧 + +#### 使用标签记录同步点 +```bash +# 在外网机器:每次打包前打标签 +git tag -a sync_20260510 -m "Sync point 2026-05-10" +git push origin sync_20260510 + +# 下次打包时使用标签 +git bundle create update.bundle sync_20260510..HEAD +``` + +#### 验证 bundle 完整性 +```bash +# 验证 bundle 文件是否有效 +git bundle verify myaps_api.bundle + +# 查看 bundle 中包含的引用 +git bundle list-heads myaps_api.bundle +``` \ No newline at end of file diff --git a/scripts/deploy_ubuntu/prepare_offline.sh b/scripts/deploy_ubuntu/prepare_offline.sh index 2ed82cd..d5eab85 100644 --- a/scripts/deploy_ubuntu/prepare_offline.sh +++ b/scripts/deploy_ubuntu/prepare_offline.sh @@ -5,29 +5,95 @@ set -e +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 显示帮助 +usage() { + echo "用法: $0 [选项]" + echo "" + echo "选项:" + echo " -h, --help 显示帮助信息" + echo "" + echo "说明:" + echo " 此脚本使用当前 Python 环境下载依赖包。" + echo " 请确保在与目标服务器相同 Python 版本的环境中运行此脚本。" + echo "" + echo "示例:" + echo " $0 # 使用当前 Python 版本下载" +} + +# 解析参数 +while [[ $# -gt 0 ]]; do + case $1 in + -h|--help) + usage + exit 0 + ;; + *) + echo -e "${RED}未知选项: $1${NC}" + usage + exit 1 + ;; + esac +done + echo "========================================" echo " 准备离线依赖包" echo "========================================" # 检查 requirements.txt 是否存在 if [ ! -f "requirements.txt" ]; then - echo "❌ 错误: requirements.txt 不存在" + echo -e "${RED}❌ 错误: requirements.txt 不存在${NC}" exit 1 fi +# 检测当前 Python 版本 +PYTHON_MAJOR=$(python3 -c "import sys; print(sys.version_info.major)") +PYTHON_MINOR=$(python3 -c "import sys; print(sys.version_info.minor)") +PYTHON_VERSION="${PYTHON_MAJOR}${PYTHON_MINOR}" +echo -e "${GREEN}✅ 当前 Python 版本: ${PYTHON_MAJOR}.${PYTHON_MINOR} (cp${PYTHON_VERSION})${NC}" + +# 检查 Python 版本警告 +if [ "$PYTHON_VERSION" != "310" ] && [ "$PYTHON_VERSION" != "312" ]; then + echo -e "${YELLOW}⚠️ 警告: 目标服务器使用 Python 3.10 或 3.12,当前版本可能不兼容${NC}" +fi + # 创建离线包目录 +echo "" echo "[1/2] 创建离线包目录..." -mkdir -p offline_packages +OFFLINE_DIR="offline_packages/ubuntu/python_pkg" +mkdir -p "$OFFLINE_DIR" # 下载依赖 echo "[2/2] 下载 Python 依赖..." -pip download -r requirements.txt -d offline_packages/ +echo " 离线包目录: $OFFLINE_DIR" +echo "" + +# 直接下载,使用当前 Python 环境的配置 +echo " 正在下载依赖包..." +pip download -r requirements.txt -d "$OFFLINE_DIR" + +# 统计下载结果 +FILE_COUNT=$(ls -1 "$OFFLINE_DIR" 2>/dev/null | wc -l) echo "" +echo "========================================" echo "✅ 离线依赖包准备完成!" -echo " 目录: $(pwd)/offline_packages/" -echo " 文件数: $(ls offline_packages/ | wc -l)" +echo "========================================" +echo " 目录: $(pwd)/$OFFLINE_DIR/" +echo " 文件数: $FILE_COUNT" echo "" echo "使用方式:" echo " 1. 将整个项目目录拷贝到离线服务器" -echo " 2. 运行 deploy.sh -d 进行部署" \ No newline at end of file +echo " 2. 运行 deploy.sh -d 进行部署" +echo "" +echo "验证命令(在离线服务器上):" +echo " cd /opt/myaps_api/myaps_api" +echo " python3 -m venv venv" +echo " source venv/bin/activate" +echo " pip install --no-index --find-links=$OFFLINE_DIR -r requirements.txt" +echo "" \ No newline at end of file