与Windows系统部署.Net程序作对比:
| 部署环节 | Windows | Linux |
|---|---|---|
| 发布程序 | Visual Studio 发布 /dotnet publish | 相同 |
| 上传文件 | 远程桌面复制 | SCP / WinSCP |
| 安装运行环境 | .NET Hosting Bundle | ASP.NET Core Runtime,或使用自包含发布 |
| WebApi 运行 | IIS + ASP.NET Core Module | Kestrel + systemd |
| HTTPS、域名和请求转发 | IIS 站点绑定 | Nginx |
| 定时全量同步 | 任务计划程序 | systemd timer |
| 查看运行日志 | 事件查看器、日志文件 | journalctl、日志文件 |
以下以服务器Alibaba Cloud Linux 4.0.6为例,采用自包含发布,服务器无需单独安装 .NET。
1. 发布程序
对应 Windows 的“发布到文件夹”。在本机 PowerShell 执行,每个代码块是一条独立命令:
dotnet publish "D:\鸿欢项目集合\睿人事\应用程序\src\HH.RuiHrDingSync.WebApi\HH.RuiHrDingSync.WebApi.csproj" -c Release -r linux-x64 --self-contained true -o "D:\鸿欢项目集合\睿人事\应用程序\publish\webapi"dotnet publish "D:\鸿欢项目集合\睿人事\应用程序\src\HH.RuiHrDingSync\HH.RuiHrDingSync.csproj" -c Release -r linux-x64 --self-contained true -o "D:\鸿欢项目集合\睿人事\应用程序\publish\console"自包含发布仍依赖 Linux 的基础系统库,首次启动时需要确认没有缺少库的错误。
也可使用VS右键发布,将配置改为:
| 配置项 | 设置 |
|---|---|
| 配置 | Release |
| 目标框架 | net8.0 |
| 部署模式 | 独立(自包含) |
| 目标运行时 | linux-x64 |
“文件发布选项”保持默认即可,点击保存 → 发布。
2. 查看磁盘并上传文件
对应 Windows:先确认系统盘和数据盘,再将发布文件复制到数据盘上的应用目录。
第一步:查看服务器磁盘
通过 SSH 登录,在服务器执行:
lsblk -o NAME,TYPE,SIZE,FSTYPE,MOUNTPOINTS这条命令列出磁盘及分区:
| 列名 | 含义 |
|---|---|
NAME | 磁盘或分区名称 |
TYPE | disk为磁盘,part为分区 |
SIZE | 容量 |
FSTYPE | 文件系统类型 |
MOUNTPOINTS | 挂载目录,相当于这块盘的访问入口 |
挂载到/的是系统根分区。如果另一块磁盘挂载到/data,则可以将程序部署到/data。
再执行:
df -h这条命令查看已挂载文件系统的总容量、已用空间和剩余空间;-h表示使用 GB、MB 等便于阅读的单位。
目前服务器只有一块 100 GB 的系统盘,没有独立数据盘。
准确地说,Linux也有系统盘、数据盘之分,只是不使用 C、D 这样的盘符,而是通过目录访问不同磁盘。你这台服务器只有一块盘,目前所有普通目录都共用它。
| 项目 | 当前情况 |
|---|---|
| 磁盘 | vda,100 GB |
| 系统分区 | vda3,挂载到/ |
| 已用空间 | 7.4 GB |
| 可用空间 | 87 GB |
输出中的tmpfs是内存文件系统,不是额外的硬盘。现在无论创建/opt/ruihr还是/data/ruihr,都会占用这块系统盘。
如果希望程序不放系统盘,需要先到阿里云 ECS 控制台添加并挂载一块数据盘,然后在 Linux 中初始化、挂载,才能上传程序。注意不要格式化现有的vda,它是系统盘。
从容量来看,当前系统盘足够部署这两个程序;如果没有必须分盘的要求,继续使用/opt/ruihr/webapi和/opt/ruihr/console也合适。
第二步:选择部署位置
建议优先使用已挂载的数据盘。使用:
/opt/ruihr/webapi WebApi 发布文件 /opt/ruihr/console 控制台发布文件如果只有系统盘,则暂时无法避开系统盘,需要先在云服务器控制台添加数据盘,再完成格式化和挂载。若看到额外磁盘但没有挂载位置,先确认它是否已有数据,不要直接格式化。
第三步:创建部署目录
mkdir -p /opt/ruihr/webapi /opt/ruihr/console含义:创建两个程序目录;-p会自动创建缺少的上级目录,已有目录不会报错,也不会删除已有文件。
创建后执行:
ls -ld /opt/ruihr/webapi /opt/ruihr/console含义:ls查看目录信息;-l显示权限、所有者等详细信息;-d查看目录本身。正常会显示两行,分别对应这两个目录;若提示No such file or directory,说明对应目录尚未创建。
再检查目录所在磁盘和剩余空间:
df -h /opt/ruihr/webapi /opt/ruihr/console含义:查看两个目录所在文件系统的容量。按当前服务器配置,两行都应显示/dev/vda3,挂载位置为/,说明使用的是系统盘。
两个目录已创建成功,都位于系统盘/dev/vda3,剩余87 GB。
第四步:上传发布文件
在本机使用 WinSCP,连接信息如下:
| 配置项 | 内容 |
|---|---|
| 文件协议 | SFTP |
| 服务器 | IP地址 |
| 用户名 | root |
| 私钥 | D:\睿人事\开发说明\_renlijia.pem |
WinSCP 是文件传输软件,需要额外安装。我这边已经能使用 SSH,为了便捷,可以直接用 Windows 自带的scp命令上传。
在本机 Windows PowerShell中执行,先将下面的中文占位路径替换成实际发布目录路径。
上传 WebApi:
scp -i "D:\睿人事\开发说明\_renlijia.pem" -r "D:\实际的WebApi发布目录\*" root@46.121.143.188:/opt/ruihr/webapi/上传控制台:
scp -i "D:\睿人事\开发说明\_renlijia.pem" -r "D:\实际的控制台发布目录\*" root@46.121.143.188:/opt/ruihr/console/两条命令的参数含义相同:
| 内容 | 含义 |
|---|---|
scp | 通过 SSH 传输文件 |
-i "…pem" | 使用指定私钥登录 |
-r | 同时上传子目录及其中的文件 |
"D:\发布目录\*" | 上传发布目录里的全部内容 |
root@46.121.143.188 | 服务器用户名和地址 |
:/opt/ruihr/…/ | 服务器上的目标目录 |
上传完成后,在服务器 SSH 窗口检查:
ls -lh /opt/ruihr/webapi /opt/ruihr/console这条命令列出两个目录中的文件,并以 KB、MB 等单位显示大小。
3. 配置并验证程序
这一步在服务器 SSH 窗口中执行。
查看配置文件
查看 WebApi 配置:
less /opt/ruihr/webapi/appsettings.json查看控制台配置:
less /opt/ruihr/console/appsettings.jsonless用于分页查看文件,不会修改内容。操作方式:
- 上下方向键:滚动查看。
- 空格:下一页。
/关键词后按回车:搜索内容。q:退出查看,返回命令行。
确认睿人事、钉钉及回调配置正确,尤其是企业 ID、应用凭证、角色名称和回调鉴权密钥。两个程序的配置文件分别生效,需要分别检查。分享配置截图时,请遮住密钥。
设置执行权限
chmod +x /opt/ruihr/webapi/HH.RuiHrDingSync.WebApi /opt/ruihr/console/HH.RuiHrDingSync含义:
chmod:修改文件权限。+x:添加执行权限,让 Linux 可以启动程序。- 后面两个路径:分别为 WebApi 和控制台的可执行文件。
命令执行成功时,通常没有输出。如果提示文件不存在,请检查发布文件是否上传到了正确目录。
运行控制台预演
/opt/ruihr/console/HH.RuiHrDingSync --config /opt/ruihr/console/appsettings.json --dry-run含义:
/opt/ruihr/console/HH.RuiHrDingSync:启动控制台程序。--config ...:指定使用的配置文件。--dry-run:只查询数据、计算角色调整计划,不会实际修改钉钉角色。Release 发布的程序同样支持预演。
检查输出中的接口错误、员工处理明细和最终汇总,确认查询结果与调整计划符合预期。
如果程序提示输入--apply,验证阶段不要输入,因为它会触发正式同步。此步骤验证的是控制台程序;WebApi 的启动和健康检查在后续步骤完成。
报错原因是服务器缺少ICU 国际化运行库,程序在初始化日期、时区信息时就退出了,还没有执行同步。
自包含发布包含 .NET 运行时,但仍需要部分 Linux 系统依赖。
在服务器 SSH 窗口执行:
dnf install -y icu libicu含义:
dnf install:通过系统软件包管理器安装依赖。-y:自动确认安装。icu libicu:安装 ICU 工具及运行库,供控制台和 WebApi 共同使用。
安装成功后,重新运行预演:
/opt/ruihr/console/HH.RuiHrDingSync --config /opt/ruihr/console/appsettings.json --dry-run4. 使用 systemd 管理 WebApi
对应 Windows 的 IIS 应用程序池,负责后台运行、开机启动和异常重启。
创建服务文件
vi /etc/systemd/system/ruihr-webapi.service含义:使用vi编辑器创建或打开服务配置文件。
进入编辑器后:
- 按
i进入编辑模式。 - 粘贴下面完整内容。
- 按
Esc退出编辑模式。 - 输入
:wq并回车,保存并退出。
[Unit] Description=RuiHr WebApi Wants=network-online.target After=network-online.target [Service] Type=simple WorkingDirectory=/opt/ruihr/webapi ExecStart=/opt/ruihr/webapi/HH.RuiHrDingSync.WebApi Environment=ASPNETCORE_ENVIRONMENT=Production Environment=ASPNETCORE_URLS=http://127.0.0.1:5000 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target配置含义:
| 配置 | 含义 |
|---|---|
Description | 服务描述 |
Wants、After | 请求系统等待网络就绪后启动 |
Type=simple | 直接启动并管理 WebApi 进程 |
WorkingDirectory | 程序工作目录 |
ExecStart | 程序启动路径 |
ASPNETCORE_ENVIRONMENT=Production | 使用正式运行环境 |
ASPNETCORE_URLS=http://127.0.0.1:5000 | 监听本机 5000 端口,后续由 Nginx 转发外部请求 |
Restart=on-failure | 程序异常退出后自动重启 |
RestartSec=5 | 等待 5 秒后重启 |
WantedBy=multi-user.target | 配合启用命令,使服务随系统启动 |
加载服务配置
systemctl daemon-reload含义:让 systemd 重新读取服务配置。以后修改.service文件,也要执行此命令。
启动并设置开机启动
systemctl enable --now ruihr-webapi含义:enable设置开机启动,--now表示同时立即启动。
查看运行状态
systemctl status ruihr-webapi --no-pager -l含义:查看服务状态;--no-pager直接输出,-l完整显示信息。正常应看到:
Active: active (running)WebApi 已成功启动,状态正常:
active (running):正在后台运行。enabled:已设置开机启动。Production:当前为正式环境。- http://127.0.0.1:5000:已监听服务器本机 5000 端口。
查看最近日志
journalctl -u ruihr-webapi -n 100 --no-pager含义:-u指定服务,-n 100查看最近 100 条日志,--no-pager直接输出。
日志显示 WebApi 已正常启动,当前没有报错,运行在正式环境,监听127.0.0.1:5000。
验证健康检查
curl -i http://127.0.0.1:5000/health含义:在服务器本机请求健康检查接口,-i同时显示 HTTP 响应头。正常应返回HTTP 200。
健康检查通过:返回HTTP 200和{"status":"ok"},说明 WebApi 已正常启动,并能响应本机请求。
目前已完成后台运行和开机启动配置。下一步配置Nginx、域名和 HTTPS,让睿人事能够从外部调用回调接口。
5. 使用 Nginx 提供外部 HTTP 访问
暂时使用服务器公网 IP,不配置域名和 HTTPS。以下操作在服务器 SSH 窗口执行。
安装 Nginx
dnf install -y nginx含义:安装 Nginx,-y表示自动确认安装。
在服务器 SSH 窗口执行:
nginx -v含义:查看 Nginx 版本。安装成功会显示类似:
nginx version: nginx/1.xx.x还可以查看安装的软件包:
rpm -q nginx含义:查询系统是否已安装nginx,成功会显示软件包名称和版本;未安装则提示package nginx is not installed。
安装完成不代表已经启动。可以查看当前状态:
systemctl status nginx --no-pager -l含义:查看 Nginx 服务状态。此时显示inactive (dead)也正常,因为还没有执行启动命令。确认安装成功后,再创建站点配置。
Nginx 已安装成功,版本为1.30.4。当前状态正常:
inactive (dead):尚未启动。disabled:尚未设置开机启动。
创建站点配置
vi /etc/nginx/conf.d/ruihr.conf含义:创建或编辑 Nginx 配置文件。
按i进入编辑模式,粘贴以下内容:
server { listen 80; server_name 47.111.153.187; location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }按Esc,输入:wq并回车,保存退出。
配置含义:
| 配置 | 含义 |
|---|---|
listen 80 | 使用 HTTP 默认的 80 端口 |
server_name 47.111.153.187 | 匹配通过该公网 IP 访问的请求 |
location / | 转发所有请求路径 |
proxy_pass | 将请求转发到本机 WebApi |
proxy_set_header | 向 WebApi 传递访问地址、客户端 IP 和协议等信息 |
检查配置
nginx -t含义:检查配置语法和相关文件是否正常。应看到syntax is ok和test is successful,通过后再继续。
Nginx 配置检查通过。接下来启动并设置开机启动
systemctl enable --now nginx含义:设置 Nginx 开机启动,同时立即启动。
如果 Nginx 之前已经运行,还需重新加载配置:
systemctl reload nginx已设置 Nginx 开机启动,命令未显示启动错误。
含义:让正在运行的 Nginx 应用最新配置。
查看运行状态
systemctl status nginx --no-pager -l含义:完整显示服务状态。正常应看到active (running)。
Nginx 已正常运行,并已设置开机启动;配置重新加载也成功。
接下来在服务器窗口验证转发:
curl -i -H "Host: 47.111.153.187" http://127.0.0.1/health含义:通过本机 80 端口访问 Nginx,匹配公网 IP 的站点配置,再转发到 WebApi。
预期返回HTTP 200,响应内容为:
{"status":"ok"}转发验证通过,Nginx → WebApi 已正常工作。
接下来在你电脑的 Windows PowerShell中执行:
curl.exe -i http://47.111.153.187/health含义:从公网访问服务器的 80 端口,验证外部能否调用 WebApi。正常应返回HTTP 200和{"status":"ok"}。
如果连接超时,检查阿里云安全组是否放行入方向TCP 80,以及服务器防火墙是否允许 HTTP。无需开放 5000 端口。
公网访问验证通过,外部电脑 → Nginx → WebApi整条链路正常。
下一步在睿人事后台配置回调地址:
http://47.111.153.187/api/renlijia/events- 路径以 WebApi 的
Webhook.Path配置为准。 - 如果配置了
Webhook.AuthToken,回调请求需携带一致的auth-token请求头。 - 确认睿人事支持 HTTP 回调。
随后通过一次员工资料变更验证实际同步。有效回调会正式修改钉钉角色,健康检查通过还不代表业务同步已验证。
如果还需要定期全量同步,接下来配置控制台的 systemd 定时任务。
6. 配置控制台定时同步
对应 Windows 的任务计划程序。下面示例每天凌晨 2 点执行一次正式全量同步。
1. 确认服务器时区
timedatectl含义:查看服务器时间和时区,定时器按服务器本地时间执行。如果希望北京时间凌晨 2 点运行,应确认时区为Asia/Shanghai。
2. 创建同步任务
vi /etc/systemd/system/ruihr-sync.service含义:创建同步任务配置。按i,粘贴以下内容:
[Unit] Description=RuiHr Full Sync Wants=network-online.target After=network-online.target [Service] Type=oneshot WorkingDirectory=/opt/ruihr/console Environment=DOTNET_ENVIRONMENT=Production ExecStart=/opt/ruihr/console/HH.RuiHrDingSync --config /opt/ruihr/console/appsettings.json --apply TimeoutStartSec=30min按Esc,输入:wq并回车保存。
| 配置 | 含义 |
|---|---|
Type=oneshot | 执行一次,完成后退出 |
WorkingDirectory | 程序工作目录 |
DOTNET_ENVIRONMENT=Production | 使用正式环境配置 |
ExecStart | 启动控制台;--apply表示实际修改钉钉角色 |
TimeoutStartSec=30min | 最长允许运行 30 分钟,超时终止 |
3. 创建定时器
vi /etc/systemd/system/ruihr-sync.timer按i,粘贴:
[Unit] Description=Run RuiHr Full Sync Daily [Timer] OnCalendar=*-*-* 02:00:00 Unit=ruihr-sync.service [Install] WantedBy=timers.target按Esc,输入:wq并回车保存。
OnCalendar:每天凌晨 2 点触发。Unit:触发时执行的任务服务。WantedBy:配合启用命令,让定时器开机启动。
4. 加载并启用定时器
systemctl daemon-reload含义:让 systemd 读取新建的配置文件。
systemctl enable --now ruihr-sync.timer含义:立即启动定时器,并设置开机启动。这里只启动定时器,不会立即执行全量同步。
5. 检查下次执行时间
systemctl list-timers --all ruihr-sync.timer含义:查看定时任务,NEXT是下次执行时间,LAST是上次触发时间。
systemctl status ruihr-sync.timer --no-pager -l含义:查看定时器状态,正常应显示active (waiting)。
6. 查看同步日志
journalctl -u ruihr-sync.service -n 100 --no-pager含义:查看最近 100 条同步任务日志。首次定时执行前没有记录是正常的。程序日志也保存在:
/opt/ruihr/console/logs/任务执行完成后,ruihr-sync.service显示inactive (dead)属于正常现象;定时器应继续保持active (waiting)。
如果需要立即正式执行一次,使用:
systemctl start ruihr-sync.service含义:立即运行全量同步,会实际修改钉钉角色。日常启用定时任务无需执行这条命令。
7. 日常维护
| 操作 | Linux 命令 |
|---|---|
| 重启 WebApi | systemctl restart ruihr-webapi |
| 停止 WebApi | systemctl stop ruihr-webapi |
| 查看 WebApi 日志 | journalctl -u ruihr-webapi -f |
| 查看同步任务日志 | journalctl -u ruihr-sync -n 100 --no-pager |
| 暂停定时同步 | systemctl stop ruihr-sync.timer |
| 恢复定时同步 | systemctl start ruihr-sync.timer |
代码更新,需要重新发布并上传 WebApi。替换文件时先停止服务:
1. 确认服务器部署位置
在服务器 SSH 窗口执行:
systemctl cat ruihr-webapi.service含义:查看服务配置,重点检查:
WorkingDirectory=/opt/ruihr/webapi ExecStart=/opt/ruihr/webapi/HH.RuiHrDingSync.WebApi如果与上面一致,部署目录就是/opt/ruihr/webapi。下面命令按此目录编写。
2. 按修改时间降序查看文件
ls -lht /opt/ruihr/webapi含义:
-l:显示详细信息,包括修改时间。-h:文件大小以 KB、MB 等单位显示。-t:按修改时间降序,最新的排在前面。
只查看主程序相关文件:
ls -lht /opt/ruihr/webapi/HH.RuiHrDingSync.WebApi*这些是发布后的程序文件,服务器通常没有.cs源码。修改时间只能辅助检查,不能据此判断需要替换的全部依赖。
3. 停止 WebApi
systemctl stop ruihr-webapi含义:停止进程,避免运行时替换 DLL。这期间回调会暂时不可用,应选择没有待处理事件的时段;内存中尚未处理的事件重启后不会保留。
4. 完整备份
mkdir -p /opt/ruihr/backups含义:创建备份目录。
tar -czf "/opt/ruihr/backups/webapi-$(date +%Y%m%d-%H%M%S).tar.gz" -C /opt/ruihr webapi含义:将整个 WebApi 目录压缩备份,文件名自动添加日期时间。包含程序和配置,可用于回退。
ls -lht /opt/ruihr/backups含义:确认最新备份已生成,最新文件排在最上面。
5. 本机上传并替换三个文件
先在 Visual Studio 中用原来的Release、net8.0、linux-x64、自包含配置重新发布,确保下面三个文件来自同一次最新发布。
在本机 Windows PowerShell执行:
scp -i "D:\鸿欢项目集合\睿人事\开发说明\_renlijia.pem" "D:\鸿欢项目集合\睿人事\应用程序\src\HH.RuiHrDingSync.WebApi\bin\Release\net8.0\publish\HH.RuiHrDingSync.WebApi.dll" "D:\鸿欢项目集合\睿人事\应用程序\src\HH.RuiHrDingSync.WebApi\bin\Release\net8.0\publish\HH.RuiHrDingSync.WebApi.pdb" "D:\鸿欢项目集合\睿人事\应用程序\src\HH.RuiHrDingSync.WebApi\bin\Release\net8.0\publish\HH.RuiHrDingSync.WebApi.xml" root@47.111.153.187:/opt/ruihr/webapi/含义:上传并覆盖三个同名文件:
| 文件 | 用途 |
|---|---|
.dll | 实际业务代码,更新必须替换 |
.pdb | 异常定位信息 |
.xml | 接口注释文档 |
此命令不会覆盖appsettings.json,也不会上传 Windows.exe。
如果本次还新增或升级了 NuGet 包、修改运行时,则需要配套更新依赖,不能仅替换这三个文件。
6. 启动并验证
回到服务器 SSH 窗口执行:
systemctl start ruihr-webapi含义:启动服务,加载新 DLL。未修改服务配置,无需执行daemon-reload。
systemctl status ruihr-webapi --no-pager -l含义:检查状态,正常应为active (running)。
curl -i http://127.0.0.1:5000/health含义:验证 WebApi 正常响应,预期 HTTP 200 和{"status":"ok"}。
journalctl -u ruihr-webapi --since "5 minutes ago" --no-pager -o cat含义:查看最近 5 分钟日志,确认启动没有异常。发送测试回调后,应能看到新增的requestId、回调关键入参、响应及后台同步耗时。
控制台定时同步程序代码更新,需要重新发布并上传:
以下命令都在服务器 SSH 窗口中执行。
1. 查看程序部署目录
查看控制台任务配置:
systemctl cat ruihr-sync.service查看 WebApi 服务配置:
systemctl cat ruihr-webapi.service含义:显示服务配置,其中:
WorkingDirectory:程序工作目录。ExecStart:程序实际启动路径。
按目前的部署,目录应是:
/opt/ruihr/console 控制台 /opt/ruihr/webapi WebApi查看控制台目录中的文件:
ls -lht /opt/ruihr/console含义:列出文件及大小、修改时间,其中-t表示按修改时间排序,默认降序。
2. 更新前备份控制台
先暂停定时器:
systemctl stop ruihr-sync.timer含义:避免更新期间自动触发同步。
检查任务是否正在执行:
systemctl status ruihr-sync.service --no-pager -l如果正在运行,等它完成后再继续。
创建备份目录:
mkdir -p /opt/ruihr/backups含义:创建备份存放目录,已存在则保留。
完整备份控制台目录:
tar -czf "/opt/ruihr/backups/console-$(date +%Y%m%d-%H%M%S).tar.gz" -C /opt/ruihr console含义:
| 参数 | 说明 |
|---|---|
tar | 文件打包工具 |
-c | 创建归档 |
-z | 使用 gzip 压缩 |
-f | 指定备份文件名 |
$(date +%Y%m%d-%H%M%S) | 自动添加当前日期时间,避免覆盖旧备份 |
-C /opt/ruihr | 从该目录开始打包 |
console | 备份整个控制台目录,包含程序、配置和日志 |
3. 检查备份
ls -lh /opt/ruihr/backups含义:确认备份文件已生成,查看大小和时间。备份包含配置密钥,请保留在受控服务器上。
上传并验证新版本后,恢复定时器:
systemctl start ruihr-sync.timer含义:恢复定时执行。备份位于同一块系统盘,适合更新回退;若磁盘损坏,也会一同丢失。
可以只替换有变化的 DLL,但要从相同发布配置生成的发布目录取文件,避免上传普通编译目录中的 DLL。
例如目录中有这三个主程序文件:
| 文件 | 作用 |
|---|---|
HH.RuiHrDingSync | Linux 启动文件 |
HH.RuiHrDingSync.dll | 同步业务代码 |
HH.RuiHrDingSync.pdb | 异常定位用的调试符号 |
1. 服务器暂停定时器
systemctl stop ruihr-sync.timer含义:暂停定时触发。
systemctl status ruihr-sync.service --no-pager -l含义:检查是否正在同步。若正在运行,等完成后再替换。
2. 本机重新发布
在Windows PowerShell执行:
dotnet publish "D:\鸿欢项目集合\睿人事\应用程序\src\HH.RuiHrDingSync\HH.RuiHrDingSync.csproj" -p:PublishProfile=FolderProfile含义:按现有发布配置生成 Linux 自包含发布文件。
3. 上传三个文件
仍在Windows PowerShell执行:
scp -i "D:\鸿欢项目集合\睿人事\开发说明\_renlijia.pem" "D:\鸿欢项目集合\睿人事\应用程序\src\HH.RuiHrDingSync\bin\Release\net8.0\publish\linux-x64\HH.RuiHrDingSync" "D:\鸿欢项目集合\睿人事\应用程序\src\HH.RuiHrDingSync\bin\Release\net8.0\publish\linux-x64\HH.RuiHrDingSync.dll" "D:\鸿欢项目集合\睿人事\应用程序\src\HH.RuiHrDingSync\bin\Release\net8.0\publish\linux-x64\HH.RuiHrDingSync.pdb" root@47.111.153.187:/opt/ruihr/console/含义:这条命令会将本机的3 个文件上传到/opt/ruihr/console/,并直接覆盖同名旧文件,不会再次询问确认。请在上传前完成备份、暂停定时器,并确认没有同步任务正在执行。
整体结构是:
scp -i "私钥路径" "本机文件1" "本机文件2" "本机文件3" 用户名@服务器IP:/目标目录/4. 服务器设置权限并预演
chmod +x /opt/ruihr/console/HH.RuiHrDingSync含义:确保启动文件有执行权限。
/opt/ruihr/console/HH.RuiHrDingSync --config /opt/ruihr/console/appsettings.json --dry-run含义:验证新版本,不修改角色。结束时直接回车,不输入--apply。
5. 恢复定时器
systemctl start ruihr-sync.timer含义:恢复每天零点的定时调度。
systemctl list-timers --all ruihr-sync.timer含义:确认下次执行时间。
仅修改业务代码时可以这样更新;如果依赖或运行时有变化,需要同时更新对应发布文件,不能只凭文件修改时间选择。