# 服务器增量部署说明(update-server.bat) 本地 `go/` 目录改动后,只把**改动过的文件**推到服务器,不用再一个个找文件替换。 ## 一、用法 在 `go/` 目录下双击 `update-server.bat`,或命令行执行: ```bat update-server.bat :: 比对 -> 确认 -> 上传 -> 询问是否重启服务 update-server.bat dry :: 只比对不上传(先看清单用这个) update-server.bat restart :: 只重启服务器服务 ``` bat 会在 `go/` 目录下自动编译部署工具 `bin/deploy.exe`,然后: 1. SSH 连上服务器,对 `go/` 目录和服务器目录**各算一遍文件 MD5** 2. 比对出「新增」和「内容变了」的文件并打印清单 3. 确认后把这些文件打包成 tar 通过 SSH 管道传到服务器解包(只传差异文件) 4. 回读服务器指纹复核,确认每个文件都传对了 5. 询问是否 `systemctl restart go-api.service` 让改动生效 ## 二、配置 bat 顶部「CONFIG」区: | 变量 | 说明 | | --- | --- | | `DEPLOY_HOST` | 服务器地址 | | `DEPLOY_USER` | SSH 用户名 | | `DEPLOY_DIR` | 服务器目录 | | `DEPLOY_KEY` | 私钥路径(默认 `%~dp010.31.100.2_id_ed25519`) | | `DEPLOY_PASS` | 密码(备用,服务器开了密码认证时才用) | | `RESTART_CMD` | 重启命令,默认 `systemctl restart go-api.service` | > **注意**:这台服务器 sshd 关闭了密码认证(只接受 publickey / gssapi),所以默认走**密钥登录**。 > 如果以后在服务器上开了密码认证,把 `DEPLOY_KEY` 置空、填上 `DEPLOY_PASS` 即可,工具会自动切换。 ### 关于私钥 - 私钥放在 `go/10.31.100.2_id_ed25519`,**已被同步工具自动排除**,不会传到服务器。 - Windows 上私钥权限过宽会让 OpenSSH 客户端拒绝加载,已用下面的命令收紧过(只需做一次): ```bat icacls "10.31.100.2_id_ed25519" /inheritance:r /grant:r "%USERNAME%:(F)" ``` - `go/.deploy_known_hosts` 记录服务器主机密钥指纹,换服务器时会提示指纹变化(同样被排除,不会上传)。 ## 三、不会同步的内容 工具默认跳过:`.git` / `node_modules` / `bin` / `dist` / `tmp`、`*.exe` / `*.log` / `*.bak`、 `nohup.out`、`output.log`、`go.log`、`test-output-*.txt`、`migrate_*.csv`、 无扩展名的 `server` 二进制、`*_id_ed25519` 私钥、`.deploy_known_hosts`。 服务器上存在、本地没有的文件**默认保留不删**(服务器上还有 `.git`、历史二进制等)。 确实要清理就在 bat 里加 `-delete`,但请先想清楚。 ## 四、原理 ``` 本地 go/ ──MD5──┐ ├─ 比对 ──> 只传 新增/变更 的文件 ──> 服务器 /www/wwwroot/api.yunzer.cn 服务器 ──MD5──┘ └── 传完回读远端指纹复核 ``` - 服务器是 systemd 的 `go-api.service`,`ExecStart=/usr/local/btgo/bin/go run main.go`, **直接用目录里的源码编译运行**,所以传 `.go` 源码即可,重启服务就会重新编译生效。 - 传到服务器的文件属主会被改成目标目录的属主(`www:www`),权限规范成 0644(脚本 0755)。 ## 五、常见问题 | 现象 | 处理 | | --- | --- | | `Permission denied (publickey,gssapi-...)` | 私钥没配好:检查 `DEPLOY_KEY` 路径,或用 icacls 收紧权限 | | `本地目录不存在` | 别从别处调用 bat,bat 里用 `%~dp0` 定位自身目录 | | 上传后服务没生效 | 需要重启:`update-server.bat restart`(或看 go.log 是否有编译错误) | | 清单里出现奇怪的文件 | 用配置区的 `EXTRA_EXCLUDE` 排除,逗号分隔、支持 `*` | | 远端提示 md5sum 不存在 | 极老系统没 md5sum,用 `cksum` 也能工作,可改工具里的命令 | ## 六、单独使用部署工具 bat 之外的进阶用法(在 `go/` 目录下): ```bat bin\deploy.exe -host 10.31.100.2 -user root -key 10.31.100.2_id_ed25519 ^ -dir /www/wwwroot/api.yunzer.cn -local . -dry-run :: 只看差异 bin\deploy.exe -host 10.31.100.2 -user root -key 10.31.100.2_id_ed25519 ^ -exec "systemctl status go-api.service" :: 执行远程命令 ``` 常用参数:`-dry-run` 只比对、`-yes` 跳过确认、`-delete` 同步删除远端多余文件、 `-restart "命令"` 上传后自动重启、`-exclude "a,b"` 额外排除。