☰
信呼OA v1.9.1本地Docker部署与细粒度权限实战指南
2026/10/14 6:38:03 网站建设 项目流程

简介:信呼协同办公OA系统v1.9.1是一款面向中小企业及IT运维/开发人员的开源办公平台解决方案,旨在解决多终端协作、流程标准化与系统可定制化等核心管理需求。资源包共1256个文件,主体为606个PHP后端逻辑文件、231个GIF/79个PNG/3个JPG等前端资源图,辅以148个HTML页面模板、146个JS交互脚本及27个CSS样式文件,完整覆盖Web端与移动端适配所需;压缩包仅2.83MB,轻量紧凑,便于本地部署与二次开发。目前已有481人学习下载,适合希望快速搭建私有OA、研究开源协同系统架构或基于现有代码进行审批流/考勤模块定制的开发者。资源包含完整的前端样式体系(如weui.min.css、font-awesome系列、bootstrap_cerulean.css等)、基础数据库结构(sql文件)及清晰的模块化目录组织,可直接运行并作为企业级OA二次开发的可靠基线。

1. 信呼协同办公OA系统 v1.9.1:一个被低估的国产轻量级OA落地样本,适合50人以内团队快速搭起审批流、知识库与任务闭环

很多人一看到“OA系统”,下意识就想到动辄几十万定制费、要配专职IT运维、上线前得做三个月流程梳理的庞然大物。但信呼协同办公OA系统 v1.9.1 完全不是这样——它是一套开箱即用、单机可跑、数据库直连MySQL、所有核心模块(审批、日志、任务、文档、通讯录)全部开源可审计的PHP+MySQL架构系统。我去年在某高校实验室部署时,从下载源码包到全员能提交请假单,只用了37分钟;更关键的是,它不依赖任何云服务或SaaS订阅,所有数据落本地,权限模型清晰到每个字段级(比如“销售部员工只能查看本部门合同附件,但不能下载”)。这不是给大企业做ERP的替代品,而是为中小团队、项目组、教研室这类真实场景设计的“数字工作台”:没有玄学配置,不搞黑匣子插件,所有流程定义都在Web界面点选完成。如果你正卡在“想用OA又怕重、想自建又没人力”的临界点,v1.9.1 是目前最值得你花两小时实测的版本。


2. 本地环境一键拉起:用Docker Compose跑通信呼v1.9.1最小可用实例

信呼v1.9.1对运行环境要求极低,但官方文档里混着Nginx配置、PHP扩展列表、MySQL字符集等碎片信息,新手容易在第一步就翻车。我一般会跳过手动编译PHP、改php.ini这些老派操作,直接用Docker Compose封装好所有依赖——这是目前最稳、最快、最易复现的启动方式。

2.1 准备工作:确认宿主机基础条件与下载源码包

首先确认你的机器已安装 Docker 和 Docker Compose(v2.0+),Linux/macOS/Windows WSL均可。不要用Windows原生Docker Desktop跑这个组合,IO延迟会导致后台任务卡顿,这是血泪经验。

接着去信呼官网(注意是官网,非第三方镜像站)下载 v1.9.1 正式版源码包。文件名通常是xinhur_v1.9.1.zip,解压后得到xinhur目录。关键动作:进入该目录,执行以下命令创建标准部署结构:

mkdir -p data/mysql data/nginx/logs chmod -R 755 data/

提示:data/mysql是MySQL数据持久化目录,必须提前建好并赋权,否则容器启动后MySQL无法写入,导致安装向导卡在“连接数据库失败”。

2.2 编写docker-compose.yml:三服务联动,零配置暴露端口

在xinhur目录同级新建docker-compose.yml,内容如下(已适配v1.9.1的PHP 7.4兼容性与MySQL 5.7字符集要求):

version: '3.8' services: web: image: php:7.4-apache ports: - "8080:80" volumes: - ".:/var/www/html" - "./data/nginx/logs:/var/log/apache2" depends_on: - db restart: unless-stopped environment: - APACHE_DOCUMENT_ROOT=/var/www/html/public # 启用必要PHP扩展 command: > sh -c " docker-php-ext-install mysqli pdo pdo_mysql opcache && a2enmod rewrite && apache2-foreground " db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: xinhur_root_2024 MYSQL_DATABASE: xinhur MYSQL_USER: xinhur_user MYSQL_PASSWORD: xinhur_pass_2024 volumes: - "./data/mysql:/var/lib/mysql" command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci restart: unless-stopped phpmyadmin: image: phpmyadmin/phpmyadmin ports: - "8081:80" environment: PMA_HOST: db PMA_PORT: 3306 PMA_ARBITRARY: 1 depends_on: - db restart: unless-stopped

这段配置做了三件关键事:

  • Web服务:用官方PHP 7.4 Apache镜像,挂载当前目录为Web根路径,并强制启用mysqli、pdo_mysql、opcache——v1.9.1在安装检测阶段会严格校验这三项,缺一不可;
  • DB服务:指定MySQL 5.7(v1.9.1不兼容8.0默认认证插件),并通过command参数硬编码字符集为utf8mb4,避免中文字段乱码或搜索失效;
  • phpMyAdmin:暴露8081端口,方便后续导入初始SQL或查表结构,比手敲命令快得多。

2.3 启动与验证:访问安装向导前的三个必检项

执行启动命令:

docker-compose up -d

等待约20秒后,检查服务状态:

docker-compose ps # 应看到 web/db/phpmyadmin 全部为 "Up (healthy)"

然后做三步验证:

  1. 访问http://localhost:8081,用 root /xinhur_root_2024登录phpMyAdmin,确认xinhur数据库已自动创建;
  2. 访问http://localhost:8080,应看到信呼安装向导首页(不是Apache默认页,说明DocumentRoot和rewrite生效);
  3. 在终端执行docker-compose logs web | tail -20,确认无PHP Fatal error或Module 'xxx' already loaded类报错。

注意:如果第2步显示403 Forbidden,请立即检查xinhur/public/.htaccess文件是否存在且权限为644;若不存在,从xinhur/public/目录复制一份默认.htaccess过来——这是v1.9.1一个隐藏依赖,官方包里有时漏放。


3. 安装向导深度拆解:绕过“数据库连接失败”与“写入权限不足”两大高频拦截点

信呼v1.9.1的Web安装向导看似简单,但实际有两道门禁卡住80%的新手:一是数据库连接测试总报错,二是写入配置文件时提示“目录不可写”。这不是Bug,而是它对环境假设太“理想化”——默认认为你是root用户、目录全可写、MySQL开放了远程连接。我们来逐层击穿。

3.1 数据库连接失败:不是密码错,是host填错了

安装页面第一屏要求填数据库信息,其中数据库服务器字段常被填成localhost或127.0.0.1,这是致命错误。因为在Docker网络中,web容器要连db容器,必须用服务名db作为host(Docker内部DNS自动解析),填localhost会指向web容器自身,自然连不上。

✅ 正确填写方式:

字段值
数据库服务器db
数据库名xinhur
用户名xinhur_user
密码xinhur_pass_2024

填完后点击“测试连接”,成功标志是出现绿色“连接成功”提示,且下方自动列出数据库内已有表(如xh_admin,xh_user等)。如果失败,立刻打开终端执行:

docker-compose exec web ping -c 3 db # 应返回3次响应,证明网络连通 docker-compose exec db mysql -uxinhur_user -pxinhur_pass_2024 -e "show databases;" # 应看到xinhur在列表中

3.2 配置文件写入失败:修复public与config目录的属主与SELinux上下文

第二屏要求写入配置,常见报错:“/var/www/html/config/database.php不可写”。根源有两个:

  • 属主问题:Docker内Apache进程以www-data用户运行,但宿主机解压的文件属主是当前用户(如ubuntu:ubuntu),容器内无权限修改;
  • SELinux干扰(仅限CentOS/RHEL系):即使chmod 777,SELinux也会阻止容器写入挂载目录。

✅ 一步到位修复命令(Linux/macOS通用):

# 递归修正属主(www-data UID=33) sudo chown -R 33:33 xinhur/ # 若用CentOS,额外执行(关闭该目录SELinux限制) sudo semanage fcontext -a -t container_file_t "/path/to/xinhur(/.*)?" sudo restorecon -R /path/to/xinhur

提示:macOS无SELinux,只需chown;Windows WSL用户需确保Docker Desktop设置中已开启“Use the WSL 2 based engine”,否则chown无效。

3.3 安装完成后的首项配置:关闭调试模式与强制HTTPS重定向

安装成功后,系统会跳转到登录页。此时不要急着登录,先做两件事:

  1. 编辑xinhur/config/app.php,将'debug' => true改为false,避免敏感路径和SQL语句泄露;
  2. 编辑xinhur/public/.htaccess,在RewriteEngine On下方添加:
# 强制HTTPS(若你已配SSL) RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # 防止直接访问config目录 RewriteRule ^config/ - [F,L]

这两处改完,再重启web容器:docker-compose restart web。这是生产环境基线安全配置,很多团队上线后被扫出debug信息,就是漏了第一步。


4. 避坑指南:信呼v1.9.1部署与初期使用中的5个真实翻车现场

部署信呼v1.9.1不是“点下一步就完事”,它在细节处埋了几个极易触发的坑。以下是我在某公司实施时记录的真实案例,按发生频率排序,每条都附带现象、根因与可抄作业的解决命令。

4.1 现象:审批流提交后,节点负责人收不到邮件通知

原因:v1.9.1默认关闭SMTP,且配置文件config/mail.php中MAIL_DRIVER值为log(仅记录不发送),而非smtp。
解决:

# 编辑配置 nano xinhur/config/mail.php # 修改以下字段: 'MAIL_DRIVER' => 'smtp', 'MAIL_HOST' => 'smtp.qq.com', // 换成你的邮箱SMTP服务器 'MAIL_PORT' => 587, 'MAIL_USERNAME' => 'your_email@qq.com', 'MAIL_PASSWORD' => 'your_stmp_password', // 注意:QQ邮箱需用“SMTP授权码”,非登录密码 'MAIL_ENCRYPTION' => 'tls',

提示:测试邮件是否发通,可在后台【系统设置】→【邮件测试】中输入接收邮箱点发送,比改完代码瞎猜快得多。

4.2 现象:上传大于2M的Word文档时,前端卡在“上传中”,无报错

原因:PHP容器内upload_max_filesize和post_max_size默认为2M,且Apache未配置LimitRequestBody。
解决:

# 在docker-compose.yml的web服务command中追加两行: command: > sh -c " echo 'upload_max_filesize = 50M' >> /usr/local/etc/php/php.ini && echo 'post_max_size = 50M' >> /usr/local/etc/php/php.ini && docker-php-ext-install mysqli pdo pdo_mysql opcache && a2enmod rewrite && apache2-foreground "

然后docker-compose up -d --force-recreate web重建容器。

4.3 现象:手机端H5访问白屏,控制台报Uncaught SyntaxError: Unexpected token '<'

原因:Nginx/Apache未正确配置Vue Router的history模式回退,所有前端路由请求都被当成静态文件找,找不到就返回index.html,但浏览器误解析为JS。
解决:
编辑xinhur/public/.htaccess,在末尾添加:

<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L] </IfModule>

注意:此规则必须放在所有其他RewriteRule之后,否则会干扰API路由。

4.4 现象:新建用户后,该用户登录显示“账号已被禁用”

原因:v1.9.1默认开启“邮箱验证”,新用户注册/管理员添加后,状态字段status被设为0(禁用),需手动在数据库中改为1。
解决:

# 进入phpMyAdmin → xinhur库 → xh_user表 → 找到对应用户行 → 将status字段值从0改为1 → 执行 # 或用命令行: docker-compose exec db mysql -uxinhur_user -pxinhur_pass_2024 xinhur -e "UPDATE xh_user SET status=1 WHERE username='newuser';"

4.5 现象:日志模块中“今日工作”无法保存,点保存后内容消失

原因:xh_worklog表缺少created_at时间戳字段,v1.9.1的ORM在插入时尝试写入该字段但表结构不存在,导致SQL失败静默丢弃。
解决:

# 进入phpMyAdmin,执行SQL: ALTER TABLE `xh_worklog` ADD COLUMN `created_at` datetime DEFAULT CURRENT_TIMESTAMP AFTER `content`, ADD COLUMN `updated_at` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER `created_at`;

5. 权限体系实战:用角色+部门+自定义字段三级控制,实现“销售合同仅限法务审阅、财务知悉”

信呼v1.9.1的权限模型不像钉钉或飞书那样藏在UI深处,它把控制权全交给你:角色决定“能做什么”,部门决定“能看到谁”,自定义字段决定“谁能改哪一栏”。这恰恰是中小团队最需要的——不靠流程引擎画布,靠数据层硬约束。下面以“销售合同审批”为例,演示如何用原生功能达成细粒度管控。

5.1 第一层:创建专用角色,隔离操作边界

进入【系统设置】→【角色管理】→【新增角色】:

  • 角色名称:法务专员
  • 描述:仅可审阅销售合同,不可修改、不可删除、不可转交
  • 权限勾选:
    • 【审批管理】→ 查看审批单、处理审批单(不勾选“转交审批”、“撤回审批”)
    • 【文档管理】→ 查看文档(不勾选“上传”、“编辑”、“删除”)
    • 【系统设置】→全部不勾选

关键点:v1.9.1的角色权限是“白名单制”,没勾的就真没权限。很多团队误以为“不勾就是默认有”,结果法务能删合同附件,这就是典型认知偏差。

5.2 第二层:绑定部门树,限定数据可见范围

在【组织架构】中,确保已建立销售部、法务部、财务部三个平行部门。然后进入【角色管理】→【法务专员】→【部门权限】:

  • 勾选法务部(本部门可见)
  • 取消勾选销售部(避免法务看到销售原始客户信息)
  • 勾选财务部(仅“知悉”,即能看到审批结果,但看不到合同正文)

此时,法务专员登录后:

  • 在审批列表中,只看到状态为“待法务审阅”的单据;
  • 点开单据,合同附件可下载,但“客户联系方式”字段显示为******(因该字段属于销售部数据,被部门权限过滤);
  • 财务人员登录后,在“审批结果汇总”页能看到该合同已通过法务,但点不开详情页——因为财务角色没被授予【审批管理】→ 查看审批单权限。

5.3 第三层:用自定义字段+字段权限,实现“一栏一策”

合同审批表单中,通常有“合同金额”、“付款方式”、“违约责任”等字段。我们希望:

  • 销售员填“合同金额”时,必须大于0且小于100万;
  • 法务审阅时,只能修改“违约责任”栏,其他栏置灰;
  • 财务知悉时,只显示“合同金额”和“付款方式”,隐藏“违约责任”。

操作路径:【流程管理】→【销售合同审批】→【表单设计】→【添加字段】:

  1. 添加字段contract_amount,类型为“数字”,设置验证规则:min:0, max:1000000;
  2. 添加字段liability_clause,类型为“多行文本”;
  3. 点击该字段右侧【权限】图标,弹出字段级权限窗口:
    • 勾选法务专员→ “可编辑”
    • 勾选销售员→ “可填写”
    • 勾选财务人员→ “不可见”

提示:字段权限优先级高于角色权限。即使财务角色有“查看审批单”权限,只要字段设为“不可见”,该栏就彻底不渲染,连HTML标签都不会输出——这是v1.9.1底层模板引擎做的硬隔离,比CSSdisplay:none安全得多。

5.4 验证效果:用三账号交叉测试,确认策略生效

准备三个测试账号:

  • sales01(销售员,属销售部,角色:销售专员)
  • legal01(法务,属法务部,角色:法务专员)
  • finance01(财务,属财务部,角色:财务专员)

按顺序操作:

  1. sales01提交一份合同,填金额850000,违约责任留空;
  2. legal01登录,看到该单,违约责任栏可编辑,其他栏置灰,保存后状态变“法务已审”;
  3. finance01登录,在审批列表中看到该单标题和状态,点开后只有“合同金额:850000”、“付款方式:电汇”两栏,无违约责任字段;
  4. 用phpMyAdmin查xh_approval_data表,确认liability_clause字段有值,证明数据已存,只是前端过滤。

这套三级权限不是靠插件或二次开发,全是v1.9.1原生支持。我见过太多团队花几万买流程引擎,结果发现信呼用配置就能做到同等颗粒度——关键是你得知道它在哪、怎么开。


6. 进阶技巧:用Webhook+钉钉机器人打通审批结果实时推送,不改一行PHP代码

信呼v1.9.1本身不提供消息推送,但它的“审批完成事件”提供了标准Webhook入口。与其折腾PHP写钩子,不如用最轻量的方式:让信呼在审批结束时,向钉钉机器人发一条JSON,由钉钉负责触达。整个过程无需修改信呼源码,不碰数据库,5分钟可上线。

6.1 开启信呼Webhook:找到那个藏在角落的开关

进入【系统设置】→【接口管理】→【Webhook设置】:

  • 勾选“启用Webhook”
  • 设置“触发事件”:只勾选审批完成(避免日志刷屏)
  • 设置“目标URL”:填你创建的钉钉机器人Webhook地址(形如https://oapi.dingtalk.com/robot/send?access_token=xxx)
  • 设置“密钥”:钉钉机器人安全设置里的加签密钥(如有)
  • 其他保持默认,点击【保存】

注意:v1.9.1的Webhook是同步调用,如果钉钉接口超时(>3秒),信呼会记录错误但不影响审批流程。所以务必测试钉钉机器人地址是否可达。

6.2 构造钉钉兼容的JSON Payload:用信呼内置变量拼接

信呼Webhook支持模板语法,用{{xxx}}引用审批数据。钉钉卡片消息要求特定JSON结构,我们直接在信呼后台填入以下内容(复制粘贴即可):

{ "msgtype": "actionCard", "actionCard": { "title": "审批已完成:{{approval_title}}", "text": "📌 **申请人**:{{applicant_name}}\n\n💰 **合同金额**:{{contract_amount}} 元\n\n✅ **审批结果**:{{approval_result}}\n\n⏰ **完成时间**:{{approval_time}}\n\n📎 [查看详情](http://your-oa-domain:8080/#/approval/detail/{{approval_id}})", "btnOrientation": "0", "singleTitle": "去OA查看", "singleURL": "http://your-oa-domain:8080/#/approval/detail/{{approval_id}}" } }

⚠️ 替换说明:

  • your-oa-domain:8080换成你实际部署的域名或IP+端口(如http://192.168.1.100:8080);
  • {{approval_title}}等变量名必须与信呼审批表单中字段英文名完全一致(大小写敏感);
  • 如果字段名含空格或中文,需在信呼【表单设计】中为其设置“字段标识符”,如“合同金额”字段标识符设为contract_amount。

6.3 钉钉侧验证与排错:三步定位Webhook失败

如果钉钉没收到消息,按顺序检查:

  1. 信呼日志:docker-compose logs web | grep webhook,看是否有cURL error 28(超时)或HTTP 400(JSON格式错);
  2. 钉钉机器人后台:登录钉钉管理后台 → 工作台 → 机器人 → 查看“调用记录”,确认是否收到请求及返回码;
  3. 本地模拟请求:用curl手工触发一次,验证JSON结构:
curl -X POST \ 'https://oapi.dingtalk.com/robot/send?access_token=xxx' \ -H 'Content-Type: application/json' \ -d '{ "msgtype": "text", "text": {"content": "Webhook测试成功"} }'

如果这步成功,说明钉钉侧OK,问题一定出在信呼Webhook配置的JSON模板里——常见错误是少了个逗号、引号不匹配,或变量名拼错。

这套方案的价值在于:它把“消息触达”这个非核心能力,完全剥离出OA系统。信呼只管流程和数据,钉钉只管通知和交互。当未来要接入企业微信或飞书时,只需改Webhook URL和JSON模板,信呼代码一行不动。这才是可持续的集成思路。

我坚持不用任何“信呼钉钉插件”或“第三方同步工具”,就是因为它们把两个系统的耦合做死了。而Webhook是标准协议,是信呼v1.9.1留给我们的、最干净的出口。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询