从「一台空服务器」到「员工在手机上能用」,48 步全在这一页。从上往下做,勾一个算一个,进度自动记住。
ops.你的域名.com 不用单独备案,主域名备案通过就够。
就是上面那条红字:域名备案在哪家,服务器就得在哪家。现在花 2 分钟确认一下, 比装到一半被打回来强。
去你买域名的那个网站(阿里云 / 腾讯云 / 新网都行),找「域名解析」,加一条 A 记录:
| 填什么 | 值 |
|---|---|
| 主机记录 | ops(这样域名就是 ops.你的域名.com;只填这三个字母) |
| 记录类型 | A |
| 记录值 | 你服务器的公网 IP(宝塔首页最上面那栏就是) |
ping ops.你的域名.com,回出来的 IP 跟服务器一样。显示「找不到主机」→ 解析还没生效,最多等 10 分钟。
出来的 IP 不是你服务器 → 记录值填错了,回域名后台改。
还挂着一条旧的 ops 记录 → 删掉旧的,只留一条。
浏览器打开你的宝塔地址,能进首页就行。记下左上角的「服务器 IP」,上面那步要用。
接下来要往服务器传这两个,都在我给你的文件夹里:
ops-server.zip —— 服务器版程序(222 KB,文件名全英文,给 Linux 用)ops\deploy\check_server.sh —— 体检脚本(先跑它,不动任何东西)ops-server.zip,又小又不会乱码。宝塔 → 文件 → 地址栏输入 /www/wwwroot/ 回车 → 点「上传」→
选 check_server.sh → 确定。
check_server.sh。宝塔 → 终端,粘这行回车:
点一下复制bash /www/wwwroot/check_server.sh
提示 No such file → 文件没传到 /www/wwwroot/,回上一步看路径。
提示 Permission denied → 确认命令前面带了 bash。
顺便看两眼:时区是不是 +0800;站点列表里有没有跟 ops 撞名的。
宝塔 → 软件商店 → 搜 Python → 找到「Python 项目管理器」→ 安装 → 等它装完。
它会装一个独立的 Python 在 /www/server/ 下,跟你现有的 PHP 完全分开,不影响任何网站。
CentOS 7 这种老系统,直接在终端跑 yum install python3 -y 也行,几十秒完事,效果一样。
点一下复制bash /www/wwwroot/check_server.sh
ops-server.zip(222 KB),不是 Windows 的免安装版。宝塔 → 文件 → 地址栏输入 /www/wwwroot/ 回车(一定要先进这个目录)→
点「上传」→ 选 ops-server.zip → 确定。
ops-server.zip,大小 222 KB 左右,
跟 你的域名.com 那些文件夹并排。根目录是地址栏只有 / 的那个位置(宝塔首页点「文件」默认就到这儿)。
在那解压会往服务器根上撒一堆 app、web 文件夹,很乱。
补救:在根目录选中 app、web、deploy、runtime、uploads
和那几个乱码文件 → 右键「删除」;如果提示被占用,先做阶段 5 把进程停了再删。
只删你自己刚解压出来的这些,别的不要动。然后回上面第 1 步,进 /www/wwwroot/ 重新传。
右键 ops-server.zip → 「解压」→ 确定,等两秒。
解压完会多出一个 ops 文件夹,再点进去看,程序就在里面了,不用再剪切粘贴。
最后把 zip 删掉,省地方。
/www/wwwroot/ops/ 里直接看到
app、web、data、uploads、deploy、README.txt、start.sh。说明你传的是旧的免安装版(文件名带中文)。乱码只影响 先看我.txt 和两个 .bat,
程序本身(app、web)是英文名,不影响运行,可以不管。
但既然要重传,直接换 ops-server.zip 更省事 —— 全英文名,永远不会乱。
旧包不带空目录,会这样。不影响使用:程序第一次启动会自己建 data 和 uploads,
数据库也在里面。想要它一开始就存在,就用 ops-server.zip,里面已经放好了。
点一下复制ls /www/wwwroot/ops/ && ls /www/wwwroot/ops/app/ | head -8
第一行应该是 app data deploy start.sh uploads web 这样(顺序不看);第二行能看到 server.py。
server.py 就对了。目录多套了一层(比如 /www/wwwroot/ops/ops/app)。正确路径必须是
/www/wwwroot/ops/app/server.py,把里面那层的东西移上来一级。
宝塔 → 终端,粘这两行:
点一下复制cd /www/wwwroot/ops
sh start.sh
start.sh 是包里带的启动脚本,它已经替你做了两件事:
进到 app 目录、带上「不要演示数据」开关(OPS_NO_DEMO=1)。
不加那个开关,系统会自动塞进假员工(王芳、李梅)和一堆假数据,上线后就麻烦了 —— 所以别自己手打命令,就用它。sh: start.sh: No such file → 你不在 ops 目录,先 cd /www/wwwroot/ops。
python3: command not found → 阶段 2 没做完,回去装。
Address already in use → 8765 被占了,跑 ss -lntp | grep 8765 看是谁。
No module named ... → 目录没传对,回阶段 3 最后一步核对。
忘了加开关、起来一堆假数据?别点界面上的「清除演示数据」,它会把当天真脚本一起删。
正解:rm -f /www/wwwroot/ops/data/ops.db 删库重来(这时库里没真数据,删了没损失)。
想手动跑也行:cd /www/wwwroot/ops/app && env OPS_NO_DEMO=1 python3 server.py。
启动信息下面会有「自检提醒 N 项」,通常是:
现在不用处理,阶段 8 一起解决。只要不是红字报错就行。
在终端按 Ctrl+C,回到命令行。这是让出 8765 端口,下一步守护任务才能启动。
点一下复制ss -lntp | grep 8765 || echo "端口空着,可以了"
宝塔 → 软件商店 → 搜 进程守护 → 找到「进程守护管理器」→ 安装。
点「添加任务」,只有这五处要填,其他保持默认:
| 字段 | 填什么 |
|---|---|
| 名称 | 运营管理系统 |
| 启动用户 | root |
| 运行目录 | /www/wwwroot/ops(不用带 app,脚本自己会进去) |
| 启动命令 | sh start.sh |
| 进程数量 | 1 |
九成是 8765 还占着 —— 回阶段 4 确认按了 Ctrl+C。还不行就跑 pkill -f server.py。
另一种是运行目录填错,必须是 /www/wwwroot/ops(启动命令 sh start.sh 就在这个目录里找它)。
点一下复制curl -s http://127.0.0.1:8765/api/ping
{"ok":true...}。返回 Failed 就是没起来。宝塔 → 网站 → 「添加站点」:
ops.你的域名.com(换成你自己的)说明这个域名绑在别的站点上了。换个二级域名(比如 ops2),或先去老站点里删掉。
点这个站点名 → 左侧「反向代理」→ 「添加反向代理」:
| 字段 | 填什么 |
|---|---|
| 代理名称 | ops(随便填) |
| 目标 URL | http://127.0.0.1:8765 |
| 发送域名 | $host |
502 = Nginx 找不到后面的程序。回阶段 5 确认守护任务「运行中」,再
curl http://127.0.0.1:8765/api/ping 验一下。
电脑浏览器打开 http://ops.你的域名.com
点「运营方(我)」进去,看板能打开就行。
站点设置 → 左侧「SSL」→ 选「Let's Encrypt」→ 勾上你的域名 → 点「申请」。
九成是这两件事:① 域名还没解析到这台服务器(回阶段 0);② 80 端口没放行(阶段 8 第五步)。
实在申请不下来,去阿里云/腾讯云申请免费证书,下载后手动上传到 SSL 页面。
还在 SSL 那页,把「强制 HTTPS」开关打开。
http:// 打开会自动跳成 https://,地址栏有小锁。打开 https://ops.你的域名.com
服务器默认是 UTC(伦敦时间),比北京时间慢 8 小时。不改的话 7:30 发早任务、17:30 群里催办会整体错开 8 小时。改它只要一条命令。
① 打开终端:宝塔左侧菜单拉到最下面 → 点「终端」。会出来一块黑底白字的窗口,
光标在最后闪、前面有个 #,就能输命令了。
② 把命令粘进去:点下面代码块右上角的「点一下复制」→ 回到黑窗口里点一下空白处 → 右键 → 粘贴 → 按 回车。
点一下复制timedatectl set-timezone Asia/Shanghai && date
CST,
比如 Sat Oct 31 22:35:12 CST 2026。CST = 中国标准时间。如果末尾还是 UTC、或者时间差 8 小时,说明没改成功,看下面。)老系统(早期 CentOS 7、某些容器)没有 timedatectl,用这条代替,效果一样:
点一下复制ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && date
还报错就用这条(最原始的写法,几乎一定能成):
点一下复制cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && date
因为程序还在用启动时的旧时区,改完必须重启服务 —— 就是下一步要做的。
宝塔 → 进程守护管理器 → 找到那条任务 → 点「重启」。
浏览器打开 https://ops.你的域名.com → 点「运营方(我)」登录 → 左侧 设置 →
找到「系统网址」→ 填:
点一下复制https://ops.你的域名.com
必须 https 开头,末尾不要加斜杠。填完点最下面「保存设置」。
员工在企业微信里点开的链接是 127.0.0.1,手机上打不开;群消息里的「点这里」也是死的。
这一项决定了所有发出去的链接,是最容易被漏掉、又最难查的一项。
同一个设置页,最上面「商家名称」→ 把「演示体检中心」改成真实名字, 比如「康泰体检中心(人民路店)」→ 保存。
页面在哪(按你的宝塔版本对号入座):
看什么:一张表,列着协议、端口、状态、策略。扫一眼 80 和 443:
80、来源「所有IP」、策略「允许」、备注「网站」→ 提交;
再来一次,端口填 443、备注「网站SSL」→ 提交三个备选入口,任选一个:
① 左侧菜单「系统」→ 里面通常有「防火墙」;
② 左侧菜单最下面点「≡」展开(面板窄的时候菜单会收成图标);
③ 直接用命令看,比点界面快:终端里粘这一条,看输出有没有 80/tcp 443/tcp:
点一下复制firewall-cmd --list-ports 2>/dev/null || ufw status
要补放行的话(CentOS / 大部分云服务器):
点一下复制firewall-cmd --zone=public --add-port=80/tcp --permanent && firewall-cmd --zone=public --add-port=443/tcp --permanent && firewall-cmd --reload
Ubuntu / Debian 的服务器用这条:
点一下复制ufw allow 80/tcp && ufw allow 443/tcp
这一步在阿里云 / 腾讯云 / 华为云的控制台里,不在宝塔里。找到这台服务器的「安全组」, 确认入方向放行了 80 和 443。
「宝塔里放了、控制台没放,外网照样进不来」—— 这是最常见的「明明配好了就是打不开」。
用管理员身份登录 work.weixin.qq.com → 左侧「我的企业」→
「企业信息」→ 页面拉到最下面,有一行「企业ID」。
是 ww 开头的一串字母数字。
左侧「应用管理」→ 中间「自建」那栏 → 「创建应用」:
运营打卡点创建 → 进应用详情页 → 页面第一行就是 AgentId,纯数字,比如 1000002。
同一个应用详情页,往下找「Secret」→ 点「查看」→ 企业微信会发一条消息到你的企微里(或者直接显示)→ 复制。
管理端 → 设置 → 「企业微信自建应用」→ 填 CorpID / AgentId / Secret → 保存 → 点面板右上角的「测试连接」。
想现在就在企微里真收到一条(不用等到阶段 11),两个入口任选:
发不出去的话,九成是「员工管理」里没人的「企业微信号」填了东西, 或者填的不是企微里的账号(填姓名、手机号都不行)。系统会直接告诉你是哪一种。
系统会把企微的错误翻成大白话:
• 「corpid 填错了」→ 回去核对企业ID,注意别复制多了空格。
• 「Secret 填错了,或者被重置过」→ 重新点一次「查看」,或重置后重填。
• 「AgentId 填错了,必须是数字」→ 别把应用名粘进去了。
还是那个应用详情页 → 找「网页授权及JS-SDK」→ 点「设置可信域名」。
弹窗里有两个框,只填上面那个,下面那个留空:
| 框 | 怎么填 |
|---|---|
| 可作为应用 OAuth2.0 网页授权功能的回调域名(上面那个) | 填:ops.你的域名.com(免登靠它,必填) |
| 可调用 JS-SDK、跳转小程序的可信域名(下面那个) | 留空:这套系统没用企微的 JS-SDK(不调摄像头、不扫码、不分享),填了反而要求多做一次域名归属校验 |
填的时候注意:只填域名,不要 https://,不要结尾斜杠,不要路径。
最好从你自己的网址栏复制粘贴,别手打 —— i 和 j、0 和 O 最容易看错,
打错一个字母,后面怎么校验都过不了(企微会去校验那个根本不存在的域名)。
然后按顺序做这四步:
WW_verify_xxxxx.txt,下载下来/www/wwwroot/ops/web/(跟 admin.html 同一层),放到这里就够,不用放站点根目录https://你的域名/WW_verify_xxxxx.txt(注意:没有 /static/ 这一层),能看到一串字符就对了https://你的域名/WW_verify_xxxxx.txt ——
很多教程让你放 /static/ 下面,企微不认,会一直提示「域名所有权校验不通过」。
我们这套系统已经做了处理:文件放进 web/ 目录,根路径和 /static/ 两处都能访问,照上面第 3 步的地址填就行。① 文件没传到 /www/wwwroot/ops/web/(注意是 ops/web,不是 ops 也不是 ops/app);
② 文件名被改了 —— 必须跟企微给的完全一样,大小写都要一致(WW_verify_0LMp0TQmve7hbAMd.txt 这种,注意大小写混用);
③ 程序是旧版 —— 老版本只认 /static/ 开头的地址,需要把 app/server.py 换成新版再重启服务;
④ 域名还没解析到这台服务器,或者 Nginx 的反向代理没配好 —— 先用浏览器打开首页确认网站本身能访问。
企微要求:这个域名的备案主体要跟企业微信的主体是同一家(或者有关联关系)。
如果域名是用别人公司名义备案的,这里过不去。两个办法:① 换一个本公司备案的域名; ② 在企微「我的企业 → 企业信息」里核对主体名称是否一致。
① 放错目录 —— 必须是 ops/web/,不是 ops/ 也不是 ops/app/。
② 路径写错 —— 必须有 /static/ 这一层。
③ 文件名被改了 —— 上传后看一眼,跟企微给的完全一致(含大小写)。
意思是:你的服务器 IP 不在这个应用的「企业可信IP」名单里,企微不让它调接口,所以「连不上」。
怎么修:还是这个应用详情页 → 往下滚到「开发者接口」那一块 → 找到「企业可信IP」→ 点「配置」或「设置」→ 把服务器的公网 IP 填进去 → 保存 → 回去再点一次测试。
不知道 IP 是多少?报错信息里就写着:from ip: 42.193.108.196 —— 冒号后面那串抄下来填进去;
或者看宝塔首页左上角「服务器 IP」。
别搞混:「企业可信IP」和上面那个「可信域名」是两件事,两个都要配。 可信域名管的是「网页能不能在企微里打开」,可信IP 管的是「服务器能不能调企微接口」(发消息、免登都要靠它)。
配好之后如果还报,检查 IP 有没有填错一位,或者服务器换过 IP(云主机重装/换弹性IP 会变)。
https://你的域名/wecom/enter 发到员工群 ——
必须让员工在企业微信里点这个链接八成是在手机浏览器里打开的,或者把链接发到个人微信里点的。 企业微信的自动登录只在企业微信 App 里有效,浏览器里谁都进不去 —— 这不是配置错。
正确做法:打开企业微信 App → 随便找个会话(发给自己、发给同事都行)→ 把链接粘上发出去 → 在企微里点它,会自动进入。
新版系统做了兜底:用浏览器打开会直接显示「请在企业微信里打开这个链接」并附上链接, 不会再白屏让你猜。
只是想先看看员工端、填一条数据试试?设置 → 登录方式 → 临时切回「演示模式」→ 手机上刷新就能点身份进去填一条,看完再切回「企业微信免登」。不影响任何数据。
不用 corpid,跨企业也能推 —— 你作为服务商,商家不用进你的企业微信。
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=...)群里混了个人微信用户(没装企微的)就加不了。 让他们单独建一个「员工群」放机器人。
群的类型:企业内部群能加;跨企业协作群(都是企微)大多能加; 有个人微信的群加不了。
设置页点「测试连接」显示正常 → 推送测试选「早 · 个人今日任务」→ 先点「只看内容」确认文案对 → 再点「真发出去」。
去 DeepSeek 开放平台注册 → API Keys → 创建,拿到 sk- 开头的 Key。
管理端 → 设置 → AI 助手:
| 框 | 填什么 |
|---|---|
| 接口地址 | https://api.deepseek.com/v1 |
| 模型名 | deepseek-chat |
| Key | 刚拿到的 sk- 那串 |
06:30。腾讯云控制台 → 右上角头像 → 访问管理 → API 密钥管理 → 新建密钥,
拿到 SecretId(AKID 开头)和 SecretKey。
管理端 → 设置 → 语音转写 → 填进去 → 点「测试连接」。
多少钱:约 0.78 元/小时,按分钟算,不用包月。测试连接花不到一分钱。
• 「密钥 ID 不对」→ 复制少了字符,或复制成了 SecretKey,两个别搞反。
• 「签名不对」→ 同上,SecretId 和 SecretKey 填反了。
• 「本机时间不准」→ 服务器时间不对,签名被当成过期的。执行
timedatectl set-timezone Asia/Shanghai。
• 「额度」相关 → 账号没实名,或语音识别没开通,去控制台开通。
设置 → 语音转写 → 热词。格式 词|权重,多个用逗号隔开,权重越高越容易被认出来。
例子:体检套餐|10,外送备案|10,幽门螺杆菌|8,检验科|8
把手机 WiFi 关掉、用 4G/5G 流量,浏览器打开:
点一下复制https://ops.你的域名.com/app
手机上进「我的」,随便填个数字保存 → 完全关掉浏览器 → 重新打开 → 看数字还在不在。
宝塔终端执行 reboot,等 2 分钟,再访问 https://ops.你的域名.com。
进程守护没设开机启动。宝塔进程守护管理器里看这条任务有没有开「开机启动」, 或进去点一次「启动」再去设置里勾上。
所有数据就在 /www/wwwroot/ops/data/ops.db 这一个文件里,备份它就行。
宝塔 → 计划任务 → 任务类型选「Shell 脚本」→ 执行周期选「每天」→ 脚本内容:
点一下复制cp /www/wwwroot/ops/data/ops.db /www/backup/ops_$(date +%F).db
(/www/backup 这个文件夹不存在的话,先在宝塔文件里建一个。)
/www/backup/ 看,出现了一个带日期的 .db 文件。本机和服务器是两套独立的系统,数据不互通。你在本机填的东西不会跑到服务器上,反之亦然。
所以:本机留着当练习场,改功能、试设置都在本机玩;员工用的是服务器那个地址。 你的电脑关机也不影响员工使用。