# boki **Repository Path**: edrin/boki ## Basic Information - **Project Name**: boki - **Description**: BOKI 簿记 — 离线优先的开源记账软件:复式记账、多公司隔离、插件化架构、SQLite 单文件,数据不出机器,断网也能用 - **Primary Language**: Unknown - **License**: AGPL-3.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-22 - **Last Updated**: 2026-10-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
加密数据库 · AI 智能记账 · 你的数据,永远只属于你
官网站点 · 码云镜像 · 安全与加密 · AI 记账 · 快速开始 · 插件仓库 · 商业支持 · 赞助
--- ## BOKI 是什么 > **库文件被拷走也打不开。AI 帮你记账,数据永远不出机器。** BOKI 是一套**离线优先**的开源财务软件:前端 Vue 3 + 后端 NestJS + SQLCipher 加密单文件数据库,单命令启动,开箱即用。 在云端数据泄露频发的今天,财务隐私不该被妥协。BOKI 把数据主权 100% 交还给你:装在你自己的机器上,跑在你自己的内网里——**没有云端、没有第三方 SDK 回传、没有任何埋点与遥测**,而且**数据库文件本身就是加密的**。 无论你是**小微企业主、个体工商户、代理记账公司**,还是对**私有化部署、数据不出境**有硬性要求的团队,BOKI 都可以作为**免费记账软件**替代商业财务系统:一套系统覆盖日常记账、AI 票据识别、工资报销、财务报表全流程,**离线可用、断网可用、数据永远在自己手里**。 内核只保留记账必需的**复式记账引擎**(科目、凭证、期初、公司上下文),其余能力全部**插件化**——想要什么功能装什么插件,不装的插件在界面里不留一丝痕迹。 **数据、语音识别、大模型全部可以离线运行**:SQLCipher 加密单文件 + 本地 OCR + 本地流式语音识别 + 可选本地大模型,**断网也能用,数据不出机器**。 - 记账方式:**复式记账**(借贷必相等,后端强校验) - 报表:资产负债表、利润表(本期 + 本年累计)、票据台账、现金流量简表、费用结构分析 - 安全:**SQLCipher 全库加密** + 附件 AES-256-GCM + JWT + RBAC + 审计日志 - 多公司:一个账号可管理多家记账公司,数据完全隔离,顶部一键切换 - 数据库:SQLCipher 加密 SQLite 单文件,零配置,支持一键备份/恢复 --- ## 🛡 为什么选择 BOKI | | 理由 | 具体是什么 | |:--|:--|:--| | 🔐 | **数据库加密,文件被拷走也打不开** | 库文件用 SQLCipher(AES-256)整库加密,密钥由 HKDF 从主密钥派生;`financial.db` 即使被拷走,没有 `vault.key` 就只是一串密文。备份恢复前强制校验密钥一致性,密钥不符的备份拒绝恢复 | | 🤖 | **AI 记账,会聊天就会记账** | 上传发票 PDF / 扫描件自动解析金额税额生成凭证;本地大模型(Ollama 等)自然语言问答与记账查询;语音助手本地流式识别——AI 全链路可完全离线 | | 🚫 | **绝对离线,拒绝云端** | 安装包自带运行时,**不联网也能安装、启动、记账**;没有埋点、没有遥测、没有后台上传,从物理层面收窄泄露面 | | 🗄 | **数据主权在你手里** | 全部账务数据就是本机一个**加密的** `financial.db`:整目录拷走、直接备份、离线搬到另一台机器,**不必向任何服务商申请导出** | | ⚡ | **快,因为不绕远路** | 本地数据库直连,没有云端 API 往返;断网环境下依然是毫秒级的记账与查询 | | 📊 | **报表够用且可审计** | 资产负债表 / 利润表 / 科目余额表 / 试算平衡表 / 票据台账 / 现金流简表;借贷必相等由前后端双重强校验,已审核凭证禁止改动 | | 🧩 | **不会被功能绑架** | 只用内核也能跑完整闭环(登录 → 建账 → 记账 → 出表);需要什么装插件,不用就卸载,界面里不留痕迹 | --- ## 🔐 安全与加密 ### 数据库加密:默认开启,零配置 数据落盘即密文,不需要任何手动配置: | 层面 | 实现 | |:--|:--| | **全库加密** | SQLite 驱动为 `better-sqlite3-multiple-ciphers`,以 SQLCipher 兼容模式整库加密(`backend/src/config/database.config.ts`)——拿到 `.db` 文件,没有密钥就无法用任何 SQLite 工具直读 | | **密钥体系** | 32 字节随机主密钥(MK)存放在程序根目录 `vault.key`;通过 HKDF-SHA256 域分离派生三把子密钥:库密钥(`PRAGMA key`)、附件密钥(AES-256-GCM)、校验密钥(HMAC 完整性校验块),见 `backend/src/sdk/vault-kdf.ts` | | **附件加密** | `data/uploads/**` 下的发票 PDF / 图片是独立文件,SQLCipher 管不到——单独用 **AES-256-GCM** 流式加密(`backend/src/vault/attachment-cipher.ts`);历史明文附件在首次加密后自动就地加密(幂等) | | **启动强制加密** | 启动时自动检测:明文库 → 用密钥文件**强制加密**;全新安装 → 生成密钥并建加密库;密钥文件缺失 / 不匹配 → **拒绝启动**,绝不静默换钥匙(`backend/src/main.ts` 的 `prepareVault`) | | **迁移安全** | rekey 前自动留 `.pre-encrypt.bak`;中断自动恢复 / 回滚;密钥文件先落盘、再落「已加密」状态,断电不会出现「状态已加密而钥匙丢失」 | | **备份加密校验** | 备份与恢复前强制校验加密状态与密钥一致性——密钥不符的备份**拒绝恢复**,防止恢复后永久打不开(`backend/src/vault/vault-backup.ts`) | | **状态查询** | `GET /api/vault/status` 查看当前加密状态与密钥文件位置 | ### 已经做到 | 层面 | 实现 | |:--|:--| | 数据库加密 | SQLCipher 兼容整库加密,默认开启、零配置;密钥文件模式(v2),密钥丢失则库无法打开 | | 附件加密 | 上传的发票 PDF / 图片用 AES-256-GCM 流式加密,历史附件自动迁移 | | 部署边界 | 单机 / 内网自部署,前后端同源单端口;无云端依赖、无第三方 SDK 回传、代码中不含埋点与遥测 | | 口令存储 | `bcrypt` 加盐散列,不保存明文(`backend/src/common/utils/crypto.util.ts`);JWT 短期令牌由本机签发 | | 授权体系 | RBAC:权限点覆盖菜单级 + 操作级,前端指令(`v-permission`)+ 后端守卫双重校验 | | 多公司隔离 | 所有业务表带 `company_id`,仓储层强制追加过滤;令牌内 `companyId` 由服务端签名保证不可伪造 | | 操作审计 | 登录、增删改、审核等动作本地留存操作日志,可查询、可清理 | | 数据可迁移 | 全部数据即一个加密的 `financial.db` + `vault.key`,支持一键备份 / 下载 / 恢复,可离线搬到另一台机器 | | 传输加固 | 单端口同源即可用;对公网暴露时建议前置 Nginx + TLS(部署侧配置,仓库不含证书) | ### 还没做到(如实标注,不写话术) | 缺口 | 现状 | |:--|:--| | 密钥 / 主密码登录 | 尚无「免用户名口令、单 Key 解锁」与零知识(Zero-Knowledge)主密码体系 | | 敏感字段列级加密 | 金额、往来单位等字段依赖全库加密保护,未再做列级加密 | | MFA 二次验证 | 当前仅单因子口令 | > 本项目**不会**宣称「银行级 AES-256 零知识加密」——**没做到的就不写进文档**。诚实标注的安全边界,才是企业用户敢用的底气。 ### 密钥文件:丢了 = 库没了,请务必备份 - 密钥文件位于程序根目录 `vault.key`(32 字节 hex)。**没有它,加密数据库无法打开,系统不会启动。** - **迁移 / 搬机器时必须连同 `vault.key` 一起带走**;建议把它放进密码管理器或加密盘再备份一份。 --- ## 🤖 AI 记账 BOKI 的 AI 能力全部围绕「少打字、少手工」设计,且**每一环都可以完全离线**: | 能力 | 怎么用 | 离线方式 | |:--|:--|:--| | **票据智能记账** | 上传电子发票 PDF / 扫描件 → 自动解析类型、金额、税额、购销方 → sha256 去重、归类规则、待确认工作台 → 确认后**自动生成凭证** | 本地 OCR(PP-OCRv4)+ PDF 文本层解析 | | **AI 会计员** | AI 插件内置本地大模型预设(OpenAI 兼容协议、**无需 API Key**):Ollama(`qwen2.5:1.5b-instruct`)/ llama.cpp server / vLLM;也可随时切换 DeepSeek / 通义千问 / Kimi / 智谱 / OpenAI 等云端模型 | Ollama / llama.cpp / vLLM 本地推理 | | **语音助手** | 自然语言即问即答,记账查询动口不动手 | sherpa-onnx 本地流式 ASR(zipformer-zh int8,约 160MB) | | **档案一键录入** | 上传营业执照 / 身份证离线 OCR,批量填充往来单位与员工表单 | 本地 OCR | > 离线模型缺失时服务照常启动(自动降级),仅「识别 / 票据上传 / 证件建档 / 语音」相关功能提示模型未就绪;`GET /api/ocr/status`、`/api/voice/status` 可查看就绪状态。 --- ## ✨ 核心特性 | | 特性 | 说明 | |:--|:--|:--| | 🔐 | **数据库加密** | SQLCipher 兼容整库加密默认开启,密钥文件模式零配置;附件 AES-256-GCM 加密,备份恢复带密钥校验 | | 🤖 | **AI 智能记账** | 票据自动解析生成凭证、本地大模型问答、语音记账查询——AI 全链路可完全离线,数据不出机器 | | 📒 | **复式记账强校验** | 每张凭证至少 2 条分录,借方合计 = 贷方合计,前后端双重校验,不平衡无法保存;明细科目限制、辅助核算必填 | | 🧩 | **插件化架构** | 后端业务模块 29 → 8,前端页面 45 → 18;14 个官方插件覆盖档案/资金/薪酬/票据/报表/AI/语音/IAM/多公司,系统内一键安装、停用、卸载 | | 🔒 | **离线私有化** | 数据 / 语音 / 大模型三层全离线:加密 SQLite 单文件 + 本地 OCR(PP-OCRv4)+ 本地流式语音识别(sherpa-onnx)+ 可选本地大模型(Ollama / llama.cpp / vLLM),内网/断网环境完整可用 | | 🏢 | **多公司隔离** | 所有业务表带 `company_id`,仓储层自动追加过滤;令牌内 `companyId` 由服务端签名保证不可伪造 | | 💻 | **一键安装包** | Electron 桌面壳 + NestJS sidecar,产出单个 `BOKI-Setup.exe`;未装 Node、未装数据库、不能联网的 Windows 机器装完即用,同机即局域网服务器 | | 📊 | **报表与导出** | 资产负债表 / 利润表 / 科目余额表 / 试算平衡表 / 票据台账 / 月度报表包,支持导出 Excel | --- ## 🚀 快速开始 ### 方式一:免环境安装包(推荐,内部办公场景) 产出一个 `BOKI-Setup-1.0.0.exe`,在**未装 Node、未装数据库、不能联网**的 Windows 机器上装完即用;那台机器同时充当局域网服务器,同事用浏览器访问即可。 ```bash cd desktop npm run pack # 产物:desktop/release/BOKI-Setup-1.0.0.exe ``` 架构:Electron 壳负责窗口与托盘,后端以 `node.exe` 子进程方式拉起(sidecar),后端同时托管前端静态文件,**前后端同源、单端口 9300**,不需要 Nginx、不需要处理跨域。数据落在 `C:\ProgramData\BOKI\`(安装目录对普通用户只读,SQLite 必须写可写目录)。 ### 方式二:源码运行(开发 / 自备服务器) 需要两个终端。 **终端 1 — 后端(端口 3000)** ```bash cd backend npm install copy .env.example .env # Windows;macOS/Linux 用 cp npm run start:dev ``` 首次启动会自动创建**加密的** `backend/data/financial.db` 与密钥文件 `vault.key`,并写入种子数据:1 家默认记账公司、80+ 条权限、4 个角色、75 个中文会计科目、4 个默认用户。 离线模型首次使用前需下载(OCR 约 25MB、流式语音识别约 160MB,均放 `backend/models/`): ```bash npm run models:fetch # 下载 OCR 模型到 models/ocr/ npm run models:fetch-asr # 下载流式 ASR 模型到 models/asr/ ``` > 模型缺失时服务仍可正常启动(自动降级),仅「识别 / 票据上传 / 证件建档 / 语音」相关功能会提示模型未就绪;`GET /api/ocr/status`、`/api/voice/status` 可查看就绪状态。AI 大模型同样可选完全本地部署(Ollama 等),无需下载到本仓库。 **终端 2 — 前端(端口 5173)** ```bash cd frontend npm install npm run dev ``` 访问BOKI — 你的数据,永远只属于你。