news 2026/11/3 10:36:26

使用Linux系统部署.Net程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用Linux系统部署.Net程序

与Windows系统部署.Net程序作对比:

部署环节WindowsLinux
发布程序Visual Studio 发布 /dotnet publish相同
上传文件远程桌面复制SCP / WinSCP
安装运行环境.NET Hosting BundleASP.NET Core Runtime,或使用自包含发布
WebApi 运行IIS + ASP.NET Core ModuleKestrel + 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磁盘或分区名称
TYPEdisk为磁盘,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.json

less用于分页查看文件,不会修改内容。操作方式:

  • 上下方向键:滚动查看。
  • 空格:下一页。
  • /关键词后按回车:搜索内容。
  • 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-run

4. 使用 systemd 管理 WebApi

对应 Windows 的 IIS 应用程序池,负责后台运行、开机启动和异常重启。

创建服务文件

vi /etc/systemd/system/ruihr-webapi.service

含义:使用vi编辑器创建或打开服务配置文件。

进入编辑器后:

  1. 按i进入编辑模式。
  2. 粘贴下面完整内容。
  3. 按Esc退出编辑模式。
  4. 输入: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 命令
重启 WebApisystemctl restart ruihr-webapi
停止 WebApisystemctl 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.RuiHrDingSyncLinux 启动文件
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

含义:确认下次执行时间。

仅修改业务代码时可以这样更新;如果依赖或运行时有变化,需要同时更新对应发布文件,不能只凭文件修改时间选择。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/3 10:36:07

海外版外卖系统:对账表下载之后为什么和后台对不上

做海外版外卖系统,财务把对账表下载下来,和后台屏幕上的合计对不上,先不要改金额。多数是两边用的条件不一样:一座城还是全部城、含不含试单、含不含未付款、截止到哪一天。条件不同,数字就不会相同。一、对不上时先对…

作者头像 李华
网站建设 2026/11/3 10:29:07

智能助手总览

企业智能助手 来源地址:https://gitee.com/zhu_xin/ai-serve-desk 架构总览 一、项目定位 一个面向企业内部的 LLM 智能中台: 能力说明知识问答基于知识库的 RAG 检索,回答 WiFi、VPN、规章制度等问题文档同步接收飞书/钉钉文档变更 Web…

作者头像 李华
网站建设 2026/11/3 10:28:57

AuK-Flash部署与性能优化指南:GPU显存、推理加速与生产环境最佳实践

AuK-Flash部署与性能优化指南:GPU显存、推理加速与生产环境最佳实践 AuK-Flash 是腾讯开源的 1.5B 语音生成基础模型 AuK 的蒸馏加速版本,基于 4 步推理即可高质量完成 TTS 语音合成、声音克隆与语音编辑任务。本文将从 GPU 显存估算、权重安装、推理加…

作者头像 李华