Project Icon

grist-core

结合数据库健壮性和电子表格灵活性的开源协作工具

Grist-core是一款开源的电子表格托管服务器,融合了电子表格的灵活性和数据库的健壮性。它支持Python公式、可移植格式、拖放式仪表板等功能,可自行部署并提供沙箱选项。Grist-core适合需要高度定制和安全性的电子表格解决方案,为用户提供了强大的数据管理和分析工具。

Grist

Grist 是一款现代化的关系型电子表格。它结合了电子表格的灵活性和数据库的稳健性。

  • grist-core(本仓库)包含运行强大电子表格托管服务器所需的内容。
  • grist-desktop 是用于查看和编辑本地存储电子表格的 Linux/macOS/Windows 桌面应用程序。
  • grist-static 是 Grist 的完全浏览器内构建版本,用于在网站上显示电子表格,无需后端支持。

grist-core 仓库是 Grist 的核心,包括由总部位于纽约的公司 Grist Labs 🇺🇸 提供的托管服务,Grist Labs 是 Grist 的主要开发者。法国政府机构 ANCT Données et Territoires 🇫🇷 也对代码库做出了重大贡献。

grist-coregrist-desktopgrist-static 仓库均为开源(Apache License, Version 2.0)。

有问题?有反馈?想分享你用 Grist 构建的内容?加入我们的官方 Discord 服务器或访问我们的社区论坛

https://user-images.githubusercontent.com/118367/151245587-892e50a6-41f5-4b74-9786-fe3566f6b1fb.mp4

功能

Grist 是一个混合数据库/电子表格,这意味着:

  • 列的工作方式类似于数据库:它们有名称,并且包含一种数据类型。
  • 列可以通过公式填充,类似电子表格,当引用的单元格发生变化时会自动更新。

这种差异可能会让直接来自 Excel 或 Google Sheets 的用户感到困惑。给它一个机会!还有一篇面向电子表格用户的 Grist 文章可以帮助你了解。如果你来自 Airtable,你会发现这个模型很熟悉(我们还有一篇 Grist vs Airtable 文章进行直接比较)。

以下是 Grist 的一些具体功能亮点:

  • Python 公式。
  • 便携、自包含的格式。
    • 基于 SQLite,部署最广泛的数据库引擎。
    • 任何能读取 SQLite 的工具都可以从 Grist 文件中读取数字和文本数据。
    • 支持备份,可以完全恢复。
    • 非常适合在不同主机之间移动。
  • 可以使用 grist-static 在静态网站上显示 - 无需特殊服务器。
  • 用于本地查看和编辑的自包含桌面应用程序:grist-desktop
  • 方便的编辑和格式化功能。
    • 选项和选项列表,用于为记录添加彩色标签。
    • 引用和引用列表,用于交叉引用其他表中的记录。
    • 附件,可在记录中包含媒体或文档文件。
    • 日期和时间、切换按钮以及特殊数字(如货币)都有专门的编辑器和格式化选项。
    • 条件格式,让你可以使用公式控制单元格的样式,以突出重要信息。
  • 拖放式仪表板。
    • 图表卡片视图日历小部件用于可视化。
    • 汇总表用于跨组进行求和和计数。
    • 小部件链接简化了数据的过滤和编辑。 Grist 采用独特的可视化方法,你可以布局和链接不同的小部件一起显示, 而无需将混合内容塞入表格中。
    • 过滤栏用于快速切片和分析。
  • 增量导入
    • 从你的银行导入最近三个月活动的 CSV...
    • ...一个月后导入新活动,无需麻烦或重复。
  • 集成。
  • 许多模板帮助你入门,从投资研究到组织寻宝活动。
  • 访问控制选项。
  • 自维护。
    • 适用于内网操作和特定合规要求。
  • 不受信任文档的沙箱选项。
    • 在 Linux 或使用 Docker 时,可以在单个文档级别启用 gVisor 沙箱。
    • 在 macOS 上,可以使用原生沙箱。
    • 在任何操作系统(包括 Windows)上,都可以使用基于 wasm 的沙箱。
  • 翻译成多种语言。
  • F1 键可以快速获取帮助。这以前是不言而喻的,但总的来说,Grist 对键盘支持很好。
  • 我们在 𝕏 或 Twitter 或随便什么上发布进展,并发布月度通讯

如果你好奇 Grist 的发展方向,请查看我们的路线图,在我们的论坛上提问,或浏览我们的详细文档

使用 Grist

如果你只想快速体验 Grist:

要在你的计算机上使用 Docker 运行默认版本的 grist-core,请执行以下操作:

docker pull gristlabs/grist
docker run -p 8484:8484 -it gristlabs/grist

然后在浏览器中访问 http://localhost:8484。你将能够创建、编辑、导入和导出文档。要在多次 docker 运行之间保留你的工作,请共享一个目录作为 /persist

docker run -p 8484:8484 -v $PWD/persist:/persist -it gristlabs/grist

templates.getgrist.com 获取工资单、库存管理、发票、D&D 遭遇跟踪等模板,或使用你在 docs.getgrist.com 上创建的任何文档。

如果你需要更改 Grist 运行的端口,请设置 PORT 变量,不要只更改端口映射:

docker run --env PORT=9999 -p 9999:9999 -v $PWD/persist:/persist -it gristlabs/grist

要启用 gVisor 沙箱,请设置 --env GRIST_SANDBOX_FLAVOR=gvisor。 这应该可以在默认 docker 设置下工作,但可能不适用于所有环境。

你可以在我们的 自管理 Grist 手册中找到更多关于配置 Grist、设置身份验证和在公共服务器上运行的信息。

可用的 Docker 镜像

默认的 Docker 镜像是 gristlabs/grist。这包含了所有标准 Grist 功能,以及从 grist-ee 仓库获取的企业客户额外源代码。这些额外代码不受免费或开源许可。但默认情况下,来自 grist-ee 仓库的代码完全处于惰性和非活动状态。只有从管理员面板启用时,这些代码才会激活。

如果你更愿意使用仅包含免费和开源代码的镜像,gristlabs/grist-oss Docker 镜像可用于此目的。默认情况下,它在功能上与 gristlabs/grist 镜像等效。

管理员面板

你可以打开一个特殊的管理员面板来检查你的安装状态。只需在你的 Grist 服务器上访问 /admin 获取说明。由于管理员面板在未设置身份验证时也很有用,你可以通过设置 GRIST_BOOT_KEY 给它一个特殊的访问密钥。

docker run -p 8484:8484 -e GRIST_BOOT_KEY=secret -it gristlabs/grist

然后应该可以通过 /admin?boot-key=<GRIST_BOOT_KEY> 访问引导页面。我们正在收集常见问题的探测器。如果你遇到未涵盖的问题,如果你能在 BootProbes 中添加一个探测器,那将非常棒。你也可以提交一个问题,让其他人来添加。

从源代码构建

要从源代码构建 Grist,请按以下步骤操作:

yarn install
yarn run build:prod
yarn run install:python
yarn start
# Grist 将在 http://localhost:8484/ 上可用

文档中的 Grist 公式将使用直接在你的机器上执行的 Python 运行。你可以使用 GRIST_SANDBOX_FLAVOR 环境变量配置沙箱。

  • 在 macOS 上,export GRIST_SANDBOX_FLAVOR=macSandboxExec 使用原生 sandbox-exec 命令进行沙箱处理。
  • 在安装了 gVisor 的 runsc 的 Linux 上, export GRIST_SANDBOX_FLAVOR=gvisor 是一个选项。
  • 在任何操作系统(包括 Windows)上,`export G Grist Labs是一家开源核心公司。我们提供Grist托管服务,包括免费和付费计划。我们还开发和销售与Grist相关的功能,使用专有许可证,针对大型自管理安装的企业需求。

我们将数据可移植性和自主性视为关键价值,grist-core是其中的重要组成部分。我们致力于维护和改进grist-core代码库,并谨慎考虑专有产品如何影响数据可移植性和自主性。

通过开放源代码并提供OSI批准的免费许可证,Grist使其用户受益:

  • 开发者社区。 对于通用的电子表格类产品来说,检查源代码、修复错误和开发新功能的自由是一件大事,因为总有一些功能对某些人来说至关重要。
  • 增加信任。 由于任何人都可以检查源代码,"通过模糊性实现安全"不是一个选项。代码中的漏洞可以被他人发现并在造成损害之前报告。
  • 独立性。 无论Grist Labs公司的命运如何,Grist都可供您使用,因为它是开源的,可以自行托管。使用我们的托管解决方案很方便,但您不会被锁定。
  • 价格灵活性。 如果您资金不足但有时间投入,自行托管是一个很好的选择。DIY用户可能拥有技术知识和动力深入研究并做出改进,这可以使所有Grist用户受益。
  • 可扩展性。 对于开发者来说,开放源代码使构建扩展(如自定义小部件)变得更容易。您可以更轻松地将Grist纳入您的工作流程。如果缺少某个功能,您可以直接使用源代码并在其基础上构建。

有关Grist Labs的历史和原则的更多信息,请参阅我们的关于我们页面。

赞助商

评论

环境变量

Grist可以通过多种方式进行配置。以下是它所响应的主要环境变量:

变量用途
ALLOWED_WEBHOOK_DOMAINS允许在webhooks中使用的域名列表,用逗号分隔(例如webhook.site,zapier.com)。您可以将其设置为*以允许所有域名,但如果这样做,我们建议使用严格锁定的代理(参见GRIST_HTTPS_PROXY),如果您不完全信任用户的话。否则,您内部网络上的服务可能会变得容易被操纵。
APP_DOC_URL文档工作器URL,在启动单个文档工作器时设置(其他服务器将通过redis查找文档工作器URL)
APP_DOC_INTERNAL_URL类似于APP_DOC_URL,但由主服务器使用内部域名解析(如在docker环境中)来访问服务器。只有在文档工作器中定义这个值才有意义。默认为APP_DOC_URL
APP_HOME_URL主页API的URL前缀(主页和文档服务器需要此项)
APP_HOME_INTERNAL_URL类似于APP_HOME_URL,但由主页和文档服务器使用内部域名解析(如在docker环境中)来访问任何主页工作器。默认为APP_HOME_URL
APP_STATIC_URL静态资源的URL前缀
APP_STATIC_INCLUDE_CUSTOM_CSS设置为"true"以在静态页面中包含custom.css(来自APP_STATIC_URL)
APP_UNTRUSTED_URL用于提供/期望插件内容的URL。
GRIST_ADAPT_DOMAIN设置为"true"以支持多个基本域名(请谨慎,主机头应该是可信的)
GRIST_APP_ROOT包含Grist沙箱和资产的目录(特别是sandbox和static子目录)。
GRIST_BACKUP_DELAY_SECS文档更改后等待此时间再进行备份
GRIST_BOOT_KEY如果设置,在/boot/GRIST_BOOT_KEY提供诊断信息
GRIST_DATA_DIR存储文档的目录。默认为Grist应用程序目录相对的docs/。在Grist的默认Docker镜像中,其默认值为/persist/docs,以便作为挂载卷使用。
GRIST_DEFAULT_EMAIL如果设置,当没有其他凭据提供时以此用户身份登录
GRIST_DEFAULT_PRODUCT如果设置,这控制新站点的启用功能和限制。参见Product.ts中的PRODUCTS名称。
GRIST_DEFAULT_LOCALE当Grist无法满足浏览器语言环境时使用的默认语言环境。
GRIST_DOMAIN在托管的Grist中,Grist从此域名的子域名提供服务。默认为"getgrist.com"。
GRIST_EXPERIMENTAL_PLUGINS启用实验性插件
GRIST_ENABLE_REQUEST_FUNCTION启用REQUEST函数。此函数以类似于requests.request的方式执行HTTP请求。此功能存在重大安全风险,因为当Grist公开可用时,它可能允许用户调用内部端点。此功能还可能导致性能问题。默认未设置。
GRIST_HIDE_UI_ELEMENTS要禁用的UI功能的逗号分隔列表。允许的部分名称:helpCenter,billing,templates,createSite,multiSite,multiAccounts,sendToDrive,tutorials,supportGrist。如果某个部分也存在于GRIST_UI_FEATURES中,它仍将被禁用。
GRIST_HOST在监听端口时使用的主机名。
GRIST_HTTPS_PROXY如果设置,使用此代理进行webhook负载传递。
GRIST_ID_PREFIX对于形如o-的子域名,期望或生成o-${GRIST_ID_PREFIX}
GRIST_IGNORE_SESSION如果设置,Grist将不使用会话进行身份验证。
GRIST_INCLUDE_CUSTOM_SCRIPT_URL如果设置,将在所有应用页面上加载引用的URL到<script>标签中。
GRIST_INST_DIRGrist服务器的Grist实例配置文件路径。
GRIST_LIST_PUBLIC_SITES如果设置为true,匿名用户将列出与公众共享的站点。默认为false。
GRIST_MANAGED_WORKERS如果设置,Grist可以假设如果针对文档工作器的URL返回404,那么该工作器已经不存在
GRIST_MAX_UPLOAD_ATTACHMENT_MB附件允许的最大大小(0或空表示无限制)。
GRIST_MAX_UPLOAD_IMPORT_MB导入允许的最大大小(除.grist文件外)(0或空表示无限制)。
GRIST_OFFER_ALL_LANGUAGES如果设置,所有翻译的语言都会提供给用户(默认情况下,只有设置了特殊的'good enough'键的语言才会提供给用户)。
GRIST_ORG_IN_PATH如果为true,在路径而不是域名中编码组织
GRIST_PAGE_TITLE_SUFFIX在HTML文档的<title>末尾附加的字符串。默认为" - Grist"。设置为_blank则完全没有后缀。
GRIST_PROXY_AUTH_HEADER已弃用,被解释为GRIST_FORWARD_AUTH_HEADER的同义词。
GRIST_ROUTER_URL可选的API URL,允许服务器在负载均衡器中注册(取消注册)
GRIST_SERVE_SAME_ORIGIN设置为"true"以在与顶级页面相同的协议-主机-端口上访问主服务器和文档工作器,与自定义域名相同(请谨慎,主机头应该是可信的)
GRIST_SERVERS要设置的服务器类型。逗号分隔的值,可能包含"home"、"docs"、"static"和/或"app"。默认为"home,docs,static"。
GRIST_SESSION_COOKIE如果设置,覆盖Grist cookie的名称
GRIST_SESSION_DOMAIN如果设置,将cookie与给定域名关联 - 否则默认为GRIST_DOMAIN
GRIST_SESSION_SECRET用于编码会话的密钥
GRIST_SKIP_BUNDLED_WIDGETS如果设置,Grist将忽略通过NPM包包含的任何捆绑小部件。
GRIST_ANON_PLAYGROUND设置为'false'时拒绝匿名用户访问主页
GRIST_FORCE_LOGIN类似于GRIST_ANON_PLAYGROUND,但完全不支持匿名访问(公开共享文档等功能需要认证)
GRIST_SINGLE_ORG设置为组织"域名"以将客户端固定到该组织
GRIST_TEMPLATE_ORG设置为组织"域名"以显示该组织的公共文档
GRIST_HELP_CENTER设置帮助中心链接引用
GRIST_TERMS
变量用途
---------------
GRIST_SANDBOX_FLAVOR可以是gvisor、pynbox、unsandboxed、docker或macSandboxExec。如果设置,强制Grist使用指定类型的沙箱。
GRIST_SANDBOX作为沙箱运行的程序或镜像名称。详见NSandbox.ts的技术细节。
PYTHON_VERSION可以是2或3。如果设置,没有引擎设置的文档将假定使用指定版本的Python。并非所有沙箱都支持所有版本。
PYTHON_VERSION_ON_CREATION可以是2或3。如果设置,新创建的文档将引擎设置设为python2或python3。并非所有沙箱都支持所有版本。

转发认证变量:

变量用途
GRIST_FORWARD_AUTH_HEADER如果设置,信任指定的标头(例如"x-forwarded-user")包含授权用户的电子邮件,并启用"转发认证"登录。
GRIST_FORWARD_AUTH_LOGIN_PATH如果设置了GRIST_FORWARD_AUTH_HEADER,Grist将在此路径监听登录。默认为/auth/login
GRIST_FORWARD_AUTH_LOGOUT_PATH如果设置了GRIST_FORWARD_AUTH_HEADER,用户注销时Grist将转发到此路径。

转发认证支持两种模式,通过GRIST_IGNORE_SESSION区分:

  1. 使用会话,并在登录端点上进行转发认证。

    例如,使用traefik反向代理和traefik-forward-auth中间件:

    • GRIST_IGNORE_SESSION: 不要设置,或设置为假值。
    • 确保反向代理对GRIST_FORWARD_AUTH_LOGIN_PATHGRIST_FORWARD_AUTH_LOGOUT_PATH应用转发认证中间件。
    • 如果您想在某些情况下允许匿名访问,请确保所有其他路径不使用转发认证中间件。Grist会在需要时通过重定向到GRIST_FORWARD_AUTH_LOGIN_PATH来触发它。用户登录后,Grist将使用会话来识别用户,直到注销。
  2. 不使用会话,并在所有端点上进行转发认证。

    例如,使用HTTP基本认证和设置标头(在GRIST_FORWARD_AUTH_HEADER中指定)为已登录用户的服务器配置。

  • GRIST_IGNORE_SESSION: 设置为true。不会使用Grist会话。
  • 确保反向代理为所有可能需要登录信息的请求设置您指定的标头。用户绝对不能伪造此标头,因为Grist会信任其中的任何内容。

使用转发认证时,您可能还想设置以下变量:

  • GRIST_FORCE_LOGIN=true 以禁用匿名访问。

插件:

Grist有一个内部使用的插件系统。您可以用它做的一件有用的事情是在Grist构建中包含自定义小部件。通常只需设置GRIST_WIDGET_LIST_URL即可使自定义小部件可用,但这有外部依赖的缺点,对离线使用或存档来说可能不方便。插件提供了一种替代方案。

要将自定义小部件"捆绑"为插件:

  • 添加plugins的子目录,例如plugins/my-widgets。 或者,您可以将GRIST_USER_ROOT环境变量设置为任何您想要的路径,然后在其中创建plugins/my-widgets
  • 在该子目录中添加一个manifest.yml文件,如下所示:
name: My Widgets
components:
  widgets: widgets.json
  • widgets.json文件应采用grist-widget 存储库生成的格式,并应与manifest.yml放在同一目录中。plugins/my-widgets中的任何材料 都将由Grist提供服务,widgets.json中可以使用相对URL。
  • 所有文件就位后,重启Grist。您的小部件现在应该在自定义小部件下拉列表中可用, 以及来自GRIST_WIDGET_LIST_URL的任何其他小部件。
  • 如果您愿意,可以添加多个插件子目录,包含多组小部件,它们都将可用。

Google Drive集成:

变量用途
GOOGLE_CLIENT_ID设置为与Google API客户端一起使用的Google客户端ID
GOOGLE_CLIENT_SECRET设置为与Google API客户端一起使用的Google客户端密钥
GOOGLE_API_KEY设置为与Google API客户端一起使用的Google API密钥(访问公共文件)
GOOGLE_DRIVE_SCOPE设置为Google Drive集成请求的范围(默认为drive.file)

数据库变量:

变量用途
TYPEORM_DATABASEsqlite的数据库文件名或其他数据库类型的数据库名称
TYPEORM_HOST数据库主机
TYPEORM_LOGGING设置为'true'以查看所有sql查询
TYPEORM_PASSWORD要使用的密码
TYPEORM_PORT如果不是该数据库类型的默认端口,则为数据库端口号
TYPEORM_TYPE设置为'sqlite'或'postgres'
TYPEORM_USERNAME连接的用户名
TYPEORM_EXTRA以JSON格式传递给TypeORM的任何其他属性

测试:

变量用途
GRIST_TESTING_SOCKET仅在测试期间用于带外通信的套接字。
GRIST_TEST_HTTPS_OFFSET如果设置,在指定的偏移量添加https端口。这在测试中很有用。
GRIST_TEST_SSL_CERT如果设置,包含SSL证书的文件名。
GRIST_TEST_SSL_KEY如果设置,包含SSL私钥的文件名。
GRIST_TEST_LOGIN允许假的未经身份验证的测试登录(仅适用于开发环境)。
GRIST_TEST_ROUTER如果设置,则主服务器将在/test/router提供路由器API的模拟版本
GREP_TESTS选择特定测试运行的模式(例如env GREP_TESTS=ActionLog yarn test)。

测试

当PR被打开时,测试会作为CI的一部分自动运行。但是,在将更改推送到GitHub之前,在本地运行测试可能会有帮助。首先,您需要确保已安装所有依赖项:

yarn install
yarn install:python

然后,您可以像这样运行主测试套件:

yarn test

Python测试也可以在本地运行。(注意:目前需要Python 3.10 - 3.11。)

yarn test:python

要运行特定测试,您可以使用GREP_TESTS变量指定模式:

env GREP_TESTS=ChoiceList yarn test
env GREP_TESTS=summary yarn test:python

许可证

本存储库grist-core根据Apache许可证2.0版发布,这是一个经OSI批准的自由软件许可证。有关更多信息,请参阅LICENSE.txt和NOTICE.txt。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号