cndb
通用数据管理平台。
特性
- 插件化架构:accounts / workspaces / tables / reports / health,可独立部署
- 动态数据表:SQLAlchemy Core 运行时建表 / 改字段,运行中即可扩 schema
- 17 种字段类型:text / longtext / email / url / phone / json / number / float / percentage / boolean / date / datetime / timestamp / select / multiselect / link(跨表关联)/ attachment
- 7 种视图:表格(Grid)/ 看板 / 日历 / 甘特图 / WBS / 矩阵 / 图表,视图级筛选、排序、字段显隐与配置持久化
- 行级协作:编辑评论 / 审计日志 / 回收站 / 公开分享
- link 字段关系图:
GET /workspaces/{id}/tables/graph返回所有表间依赖 - 异步导入:CSV / JSON / XLSX / API 抓取异步导入 + 进度轮询
- Jinja2 报告模板:沙箱环境,绑定表的模板直接出 Word / PDF / Excel / HTML
- 权限体系:viewer / editor / admin / owner 四级,表级 + 工作区级双重校验
- 备份恢复:
cndb backup/cndb restore全库归档(.tar.gz),跨机器迁移 - 桌面 GUI:
cndbw启动 Tkinter 管理面板(启动服务 / 备份恢复 / Windows 后台服务管理)
快速上手
# 克隆 + 依赖
uv sync --extra dev
# 建表 + 注入演示数据(幂等)
uv run cndb seed
# 启动服务(默认绑定 0.0.0.0,http://localhost:8000)
uv run cndb serve
# 登录账号:demo / demo1234
# 浏览器访问 http://localhost:8000 即用前端界面,或用 Postman / curl 调用 API
Docker 部署(生产形态)
本项目提供两种 Docker 部署方案,按需选择:
方案一:Wheel 部署(推荐,单容器精简)
先在本地或 CI 构建 wheel 包(前端 + 后端一并打包),Docker 仅做安装:
# 1. 构建 wheel(含前端静态 + 后端代码 + seed 数据)
make build
# 2. 构建镜像并启动(SQLite 零配置)
docker compose -f docker-compose.wheel.yml up -d --build
# 3. 注入演示数据(首次启动可选)
docker compose -f docker-compose.wheel.yml exec app cndb seed
入口为 http://localhost:8000,FastAPI 直接托管前端静态资源,无需额外 nginx 容器。
使用 PostgreSQL:
# 带 PostgreSQL 容器启动(可选 profile)
# 注意:--profile pg 只拉起 postgres 容器,必须同时把 CNDATABASE_URL 指向它,
# 否则 app 会静默继续使用 SQLite
CNDATABASE_URL=postgresql+psycopg://cndb:cndb_pass@postgres:5432/cndb \
docker compose -f docker-compose.wheel.yml --profile pg up -d --build
docker compose -f docker-compose.wheel.yml exec app cndb seed
自定义端口 / 数据库密码(编辑 .env):
CNDB_PORT=9000
CNDATABASE_URL=sqlite:////data/cndb.db
# 或 PostgreSQL:
# CNDATABASE_URL=postgresql+psycopg://cndb:your_pass@postgres:5432/cndb
CNDB_DB_PASSWORD=your_pass
方案二:源码部署(双容器 + Nginx 反代)
适合需要 nginx 的 gzip/缓存/SSL 的生产场景,Docker 内部完成前端构建:
# SQLite 快速启动:nginx:80 → app:8000
docker compose up -d --build
# PostgreSQL(可选 profile,需同时指定 CNDATABASE_URL 指向 postgres)
CNDATABASE_URL=postgresql+psycopg://cndb:cndb_pass@postgres:5432/cndb \
docker compose --profile pg up -d --build
# 注入演示数据
docker compose exec app uv run cndb seed
入口为 http://localhost(nginx 80 端口),动态请求转发 uvicorn。
两种方案对比
| Wheel 部署 | 源码部署 | |
|---|---|---|
| 前置步骤 | make build 构建 wheel |
无(Docker 内自动构建) |
| 容器数量 | 1(仅 app) | 2(app + nginx) |
| 构建速度 | 快(wheel 直接安装) | 慢(含 node 前端构建) |
| 镜像体积 | 小 | 较大(含 nginx) |
| nginx 特性 | 无 | 有(gzip / 缓存 / SSL) |
| 适用场景 | 快速上线、单机部署 | 需要 nginx 高级特性 |
方案三:腾讯云自动发布(生产推荐)
镜像由 CI 构建推送到腾讯云 TCR,服务器拉取即部署,打 tag 触发、失败自动回滚。
git tag v0.3.1 && git push origin v0.3.1 # 构建 → 推 TCR → 自动部署
部署链路、服务器准备、TCR 凭证配置、定时备份与 PostgreSQL 迁移: 详见 docs/DEPLOY_TENCENT.md。
相关文件:
| 文件 | 作用 |
|---|---|
docker-compose.prod.yml |
生产编排(单容器 + 数据卷 + 日志轮转) |
deploy/Dockerfile.prod |
生产镜像(预授权数据目录 + 健康检查 + 中文字体) |
deploy/deploy.sh |
服务器端部署(预备份 / 拉镜像 / 健康探测 / 失败回滚) |
deploy/backup.sh |
定时备份,可选上传 COS |
deploy/.env.prod.example |
生产环境变量模板 |
.github/workflows/deploy-tencent.yml |
tag 触发的构建与部署流水线 |
常用运维命令
# 查看容器状态与日志
docker compose -f docker-compose.wheel.yml ps
docker compose -f docker-compose.wheel.yml logs -f
# 数据库迁移 / 初始化数据
docker compose -f docker-compose.wheel.yml exec app cndb seed
# 停止并保留数据卷
docker compose -f docker-compose.wheel.yml down
# 停止并清除全部(含数据卷,谨慎使用)
docker compose -f docker-compose.wheel.yml down -v
# 更新版本(重新 build wheel → 重新构建镜像 → 重启)
make build
docker compose -f docker-compose.wheel.yml up -d --build
前端开发
cd frontend
pnpm install
pnpm dev # Vite dev server(默认 http://localhost:5173,代理到后端 8000)
pnpm build # 构建到 src/cndb/static/(后端自动挂载)
E2E 测试(Playwright)
# 1. 启动后端 + 注入数据
uv run cndb serve --host 127.0.0.1 --port 8000 # 后台运行
uv run cndb seed
# 2. 安装 Playwright 浏览器
cd frontend && pnpm exec playwright install chromium
# 3. 运行测试
pnpm e2e:setup # 一次登录 → 持久化 StorageState
pnpm e2e:smoke # smoke 测试(登录 → Grid → 退出)
pnpm e2e:critical # critical 测试(行 CRUD 全链路)
pnpm e2e # 全部
项目结构
src/cndb/
├── api/ # 认证依赖 (get_current_user)
├── alembic/ # 数据库迁移脚本
├── cli/ # 命令行入口
│ ├── main.py # cndb 主命令(serve/dev/build/info)
│ ├── seed.py # 演示数据注入(幂等)
│ ├── backup.py # 备份(.tar.gz 归档)
│ ├── restore.py # 恢复
│ ├── users.py # 用户管理
│ └── service.py # Windows 后台服务
├── core/ # 配置 / 数据库 / 安全 / 健康检查 (system_api.py)
├── gui/ # Tkinter 桌面管理面板(`cndbw` 入口)
├── models/ # SQLAlchemy 声明式基类
├── plugins/
│ ├── accounts/ # 用户注册 / 登录 / JWT
│ ├── workspaces/ # 工作区 + 成员 + 角色
│ ├── tables/ # 动态表 / 字段 / 记录 / DDL / 查询 / 视图
│ └── reports/ # 报告模板 (Jinja2 sandbox)
├── app.py # FastAPI 应用装配 + SPA 静态托管
└── static/ # 前端构建产物(pnpm build 输出,同源托管)
CLI 命令
cndb --help 查看全部子命令:
| 命令 | 说明 |
|---|---|
cndb serve |
启动 uvicorn 服务器(默认绑定 0.0.0.0,--host 127.0.0.1 仅本机) |
cndb dev |
开发模式:同时启动前后端 |
cndb build |
构建前后端(需源码目录) |
cndb info |
打印版本 / 配置 / 运行环境 |
cndb seed |
注入演示数据(幂等) |
cndb backup |
备份数据库和附件为 .tar.gz 归档或文件夹 |
cndb restore |
从归档或文件夹恢复(自动识别源类型) |
cndb users |
用户管理(create / delete / list / import) |
cndb service |
Windows 开机自启后台服务(enable / disable / status / stop / run) |
cndbw |
启动 Tkinter 桌面管理面板 |
API 概览
| 模块 | 前缀 | 说明 |
|---|---|---|
| 认证 | /api/v1/accounts/auth |
register / login / me |
| 工作区 | /api/v1/workspaces |
CRUD + 成员管理 |
| 表 | /api/v1/workspaces/{wid}/tables |
CRUD / reorder / graph / copy / move |
| 字段 | /api/v1/workspaces/{wid}/tables/{tid}/fields |
CRUD |
| 记录 | /api/v1/workspaces/{wid}/tables/{tid}/records |
CRUD + filter + sort |
| 批量 | /api/v1/workspaces/{wid}/tables/{tid}/bulk |
batch upsert / delete |
| 导入 | /api/v1/workspaces/{wid}/tables/{tid}/import |
同步 / 异步 CSV·JSON·XLSX |
| 视图 | /api/v1/workspaces/{wid}/tables/{tid}/views |
保存筛选条件命名视图 |
| 权限 | /api/v1/workspaces/{wid}/tables/{tid}/permissions |
表级权限 |
| 分享 | /api/v1/tables/{tid}/share |
匿名公开分享 |
| 报告 | /api/v1/reports |
模板 CRUD + 渲染 |
| 健康 | /health |
服务存活 |
完整文档:启动后访问 http://localhost:8000/docs(FastAPI 自动生成)
开发
make sync # 安装依赖
make check # 全套门禁:lint + typecheck + cov
make push # 推送全部 remote
性能基准(10k 行导入 + 查询):
uv run python scripts/bench_10k_rows.py
覆盖门禁阈值 95%,任何 PR 低于该值自动拒绝。
许可证
MIT — 见 LICENSE
Metadata
Release files for cndb 0.3.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cndb-0.3.2.tar.gz | 5.7 MB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cndb-0.3.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 8.5 MB
Release files / cndb-0.3.2.tar.gz
| Download URL | cndb-0.3.2.tar.gz |
|---|---|
| Size | 5.7 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
375e380ab5a2228926b533f9186c11f495ec4dd29fc55f7171f4b6c2c5bd78be
|
|
BLAKE2b-256 checksum How to use checksums |
c0750ed42d1078a670e05b947321060759731e324b76bc84e22a08675f698cd9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / cndb-0.3.2-py3-none-any.whl
| Download URL | cndb-0.3.2-py3-none-any.whl |
|---|---|
| Size | 2.8 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ece665e44d8235cfbc7a576012e3441be9c7cd1b0abcc57b5d25bce19af3581a
|
|
BLAKE2b-256 checksum How to use checksums |
5a6d2b5cac59fe3f55e5f173d082bebf32b7a0527338f7edc8499f5cc60459fa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|