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-core
、grist-desktop
和 grist-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 公式。
- 支持完整的 Python 语法,包括标准库。
- 许多 Excel 函数也可用。
- 专门用于公式生成的 AI 助手(使用 OpenAI gpt-3.5-turbo 或通过 llama-cpp-python 使用 Llama)。
- 便携、自包含的格式。
- 基于 SQLite,部署最广泛的数据库引擎。
- 任何能读取 SQLite 的工具都可以从 Grist 文件中读取数字和文本数据。
- 支持备份,可以完全恢复。
- 非常适合在不同主机之间移动。
- 可以使用
grist-static
在静态网站上显示 - 无需特殊服务器。 - 用于本地查看和编辑的自包含桌面应用程序:
grist-desktop
。 - 方便的编辑和格式化功能。
- 拖放式仪表板。
- 增量导入。
- 从你的银行导入最近三个月活动的 CSV...
- ...一个月后导入新活动,无需麻烦或重复。
- 集成。
- REST API、Zapier 动作/触发器以及类似集成器的支持。
- 导入/导出到 Google Drive、Excel 格式、CSV。
- 使用外部托管的自定义小部件链接数据。
- 可配置的外发 webhook。
- 许多模板帮助你入门,从投资研究到组织寻宝活动。
- 访问控制选项。
- (你需要设置 SSO 登录才能使用这些选项;如果配置感到困难,
grist-omnibus
提供了预打包的解决方案) - 共享单个文档、工作区或团队站点。
- 控制对单个行、列和表的访问。
- 根据单元格值和用户属性控制访问。
- (你需要设置 SSO 登录才能使用这些选项;如果配置感到困难,
- 自维护。
- 适用于内网操作和特定合规要求。
- 不受信任文档的沙箱选项。
- 在 Linux 或使用 Docker 时,可以在单个文档级别启用 gVisor 沙箱。
- 在 macOS 上,可以使用原生沙箱。
- 在任何操作系统(包括 Windows)上,都可以使用基于 wasm 的沙箱。
- 翻译成多种语言。
F1
键可以快速获取帮助。这以前是不言而喻的,但总的来说,Grist 对键盘支持很好。- 我们在 𝕏 或 Twitter 或随便什么上发布进展,并发布月度通讯。
如果你好奇 Grist 的发展方向,请查看我们的路线图,在我们的论坛上提问,或浏览我们的详细文档。
使用 Grist
如果你只想快速体验 Grist:
- 你可以在 Grist Labs 运营的托管服务 docs.getgrist.com 上试用 Grist(无需注册)。
- 或者你可以在 gristlabs.github.io/grist-static 上查看完全浏览器内构建的 Grist。
- 或者你可以从 github.com/gristlabs/grist-desktop 下载 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在ProductHunt上
- Grist在AppSumo上(终身优惠已售罄)
- Capterra, G2, TrustRadius
环境变量
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_DIR | Grist服务器的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_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
区分:
-
使用会话,并在登录端点上进行转发认证。
例如,使用traefik反向代理和traefik-forward-auth中间件:
GRIST_IGNORE_SESSION
: 不要设置,或设置为假值。- 确保反向代理对
GRIST_FORWARD_AUTH_LOGIN_PATH
和GRIST_FORWARD_AUTH_LOGOUT_PATH
应用转发认证中间件。 - 如果您想在某些情况下允许匿名访问,请确保所有其他路径不使用转发认证中间件。Grist会在需要时通过重定向到
GRIST_FORWARD_AUTH_LOGIN_PATH
来触发它。用户登录后,Grist将使用会话来识别用户,直到注销。
-
不使用会话,并在所有端点上进行转发认证。
例如,使用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_DATABASE | sqlite的数据库文件名或其他数据库类型的数据库名称 |
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。