Repository navigation
FAQ.zh_CN
🌐 English · Deutsch · Español · Français
gramps-connect-desktop 是独立版本(见安装)。一个文件把 app/ 的前端和 gramps-web-api 的后端连同 SQLite 打包在一起,完全在您自己的电脑上运行,并且只监听 127.0.0.1——它的任何部分都无法通过网络访问,而且始终只有一个硬编码的用户(admin/admin)。它用于在自己的电脑上试用 Gramps Connect,而不是与他人共享家谱。
deploy/ 才是真正的多用户形态:容器化的 app/ + gramps-web-api,以真正的 Postgres 为后端,前面由 Caddy 提供 TLS,用于真正托管在某处——真实的密钥、真实的域名/证书,以及每人各有登录账号的多个用户。它也是亲眼看到实时协作的唯一方式——独立版在设计上就是单用户的,因此看不到别人的编辑出现。
比上面的“基于服务器的部署”所暗示的更接近——两者都是基于同一个底层 Gramps 数据库的单用户、仅本地运行的应用。如今桌面版在功能上遥遥领先:几十年积累的原生工具、gramplet 和报告,是 gramps-web-api 的 REST 层(目前)还没有覆盖的,所以它还不能直接替代桌面版。但在同样的数据之上提供一个更快的、基于浏览器的界面,确实有望在日常使用中最终与桌面版一较高下。
不会。它只监听 127.0.0.1,遥测已禁用,它存储的所有内容都位于您自己电脑上的 ~/.gramps-connect-desktop 中。唯一需要主动开启的例外是外发电子邮件(密码重置等)——见 Installing#configuration——除非您特意设置,否则它是关闭的。
可以——家谱 → 导入... 接受 Gramps XML(.gramps)或 GEDCOM(.ged)文件,与真正的部署相同。它的预览步骤会列出文件包含的内容;如果导入器对其中某些内容处理有困难(最常见的是它不理解的 GEDCOM 行),还会在您确认导入之前显示这份报告——附有出问题的文件行号和一个复制按钮。如果实际导入同样报告了问题,对话框会在重新加载之前显示它们,而不是直接重新加载。(这份报告需要 v3.23.0 或更高版本的 gramps-web-api 服务器;较旧的服务器会直接跳过。)只是不要把它当作您唯一的副本——无论如何都要保留备份,对任何仍在积极开发中的工具都应如此。
不会——~/.gramps-connect-desktop 与应用程序本身是分开的,所以安装新版本会沿用已有的内容。如果想从头开始,请自行删除该文件夹。
在服务器部署中可以。部署中的后端是一个普通的、未经修改的 gramps-web-api 实例,因此 gramps-project/gramps-web 也可以指向它——相同的数据、相同的家谱/用户,只是在另一个端口上提供不同的界面。如何连接见 Deploying#running-gramps-web-alongside-gramps-connect。
Gramps XML(.gramps)和 GEDCOM(.ged)——与 Gramps 桌面版和 gramps-web 使用的格式相同,因此一棵家谱可以在三者之间自由迁移。
可以——每个标签页都是同一个 gramps-web-api 后端的独立客户端(见架构);标签页之间从不互相通信,也不会自己存储您的家谱数据。在不同标签页中处理不同的成员、地点或事件是完全安全的,增加的负载也可以忽略不计——每个标签页唯一的后台活动就是实时同步每隔几秒进行的一次小型轮询(见 Architecture#live-sync)。
有两点让这种做法真正安全,而不只是“通常没问题”:
-
存储的作用范围让标签页之间互不干扰。 您的登录信息保存在每个标签页各自的
sessionStorage中,所以每个标签页都会开始自己的会话(见底层细节)。标签页之间确实共享的,只有localStorage中少量的界面偏好设置(列宽、上次展开的树节点等)——从不包括家谱数据。 -
唯一真正的风险——在两个标签页中编辑同一条记录——会在造成损害之前被拦截。 保存一个成员/事件/地点等是整个对象的写入;在发出之前,应用会重新获取该记录,并与您打开它进行编辑时的内容进行比较(
app/src/store/draftStack.ts的saveAll())。如果它在此期间在别处被修改了——另一个标签页,或共享服务器上的另一位用户——保存就会被阻止,并显示一条错误,提示您重新打开它,而不是悄悄覆盖先保存者的修改。
安全。尽管 gramps-connect-desktop 把您的家谱存储在单个 SQLite 文件中,但每个浏览器标签页都与同一个本地 gramps-web-api 副本通信,而该服务器被特意配置为一次只处理一个请求(standalone/launcher.py 中的 threaded=False),而不是同时处理多个。这并不是意外造成的瓶颈——之所以这样做,是因为如果两个请求同时调用 close(),Gramps 的 SQLite 后端可能会永久锁住数据库(已实际确认:导入一个约一万个对象的真实家谱后立即刷新页面就能复现,而且不杀掉进程的话家谱再也无法恢复)。让所有请求都经过一个线程串行处理,从根本上避免了这种竞态,因此无论您打开多少个标签页,该文件都不会同时被两个请求访问。
讨论在 Gramps Discourse 论坛上进行;欢迎向 gramps-connect 仓库提交 issue 和 pull request。见开发。
Gramps Connect is part of the family of Gramps-based software.
Using the app
- Overview
- Installing
- Deploying
- Messaging
- GOQL (advanced search)
- Gramplets & Add-on Store
- Data Model & Editing
- FAQ
Building & contributing