calcom/cal.diy

GitHub: calcom/cal.diy

Cal.diy 是一个完全开源的自托管日程安排平台,解决个人和小型团队的时间管理与会议协调问题。

Stars: 43623 | Forks: 13459

Logo

Cal.diy

社区驱动的、开源的日程安排平台。
GitHub

讨论区 · 问题追踪 · 参与贡献

License Github Stars Commits-per-month Docker Pulls

## 关于 Cal.diy booking-screen **Cal.diy** 是一个社区驱动的、完全开源的日程安排平台——它是 [Cal.com](https://cal.com) 的一个分支,移除了所有企业/商业代码。 Cal.diy 是 **100% MIT 许可**的,没有任何专有的"企业版"功能。它专为个人用户和自托管者设计,希望完全掌控其日程安排基础设施,无需任何商业依赖。 ### 与 Cal.com 有何不同? - **无企业功能** — 团队、组织、洞察、工作流、SSO/SAML 及其他仅限企业版的功能已被移除 - **无需许可证密钥** — 一切开箱即用,无需 Cal.com 账户或许可证 - **100% 开源** — 整个代码库在 MIT 许可下发布,没有"开放核心"分割 - **社区维护** — 欢迎贡献,贡献将直接进入此项目(参见 [CONTRIBUTING.md](./CONTRIBUTING.md)) ### 构建技术栈 - [Next.js](https://nextjs.org/) - [tRPC](https://trpc.io/) - [React.js](https://reactjs.org/) - [Tailwind CSS](https://tailwindcss.com/) - [Prisma.io](https://prisma.io/) - [Daily.co](https://daily.co/) ## 快速开始 要在本地启动并运行此项目,请按照以下简单步骤操作。 ### 前置条件 运行 Cal.diy 需要以下条件: - Node.js (版本: >=18.x) - PostgreSQL (版本: >=13.x) - Yarn _(推荐)_ ## 开发 ### 设置 1. 克隆仓库(或派生 https://github.com/calcom/cal.diy/fork) ``` git clone https://github.com/calcom/cal.diy.git ``` 2. 进入项目文件夹 ``` cd cal.diy ``` 3. 使用 yarn 安装依赖包 ``` yarn ``` 4. 设置你的 `.env` 文件 - 复制 `.env.example` 为 `.env` - 使用 `openssl rand -base64 32` 生成一个密钥,并将其添加到 `.env` 文件中的 `NEXTAUTH_SECRET` 下。 - 使用 `openssl rand -base64 24` 生成一个密钥,并将其添加到 `.env` 文件中的 `CALENDSO_ENCRYPTION_KEY` 下。 5. 设置 Node 如果你的 Node 版本不符合项目文档要求,"nvm"(Node 版本管理器)允许使用项目所需的 Node 版本: ``` nvm use ``` 你可能首先需要安装特定版本,然后再使用它: ``` nvm install && nvm use ``` 你可以从 [这里](https://github.com/nvm-sh/nvm) 安装 nvm。 #### 使用 `yarn dx` 快速开始 ``` yarn dx ``` **创建的默认凭据:** | 邮箱 | 密码 | 角色 | |-------|----------|------| | `free@example.com` | `free` | 免费用户 | | `pro@example.com` | `pro` | 专业版用户 | | `trial@example.com` | `trial` | 试用用户 | | `admin@example.com` | `ADMINadmin2022!` | 管理员用户 | | `onboarding@example.com` | `onboarding` | 注册流程未完成 | 你可以使用以上任何凭据在 [http://localhost:3000](http://localhost:3000) 登录。 #### 开发提示 1. 在你的 shell 脚本中添加 `export NODE_OPTIONS="--max-old-space-size=16384"` 以增加 node 进程的内存限制。或者,你可以在运行应用之前在终端中运行此命令。将 16384 替换为你要分配给 node 进程的内存量。 2. 在你的 .env 文件中添加 `NEXT_PUBLIC_LOGGER_LEVEL={level}` 来控制所有 tRPC 查询和变更的日志详细级别。 其中 {level} 可以是以下之一: `0` 代表 silly \ `1` 代表 trace \ `2` 代表 debug \ `3` 代表 info \ `4` 代表 warn \ `5` 代表 error \ `6` 代表 fatal 当你在 .env 文件中设置 `NEXT_PUBLIC_LOGGER_LEVEL={level}` 时,它会启用该级别及更高级别的日志记录。工作原理如下: 日志记录器将包含指定级别及更高级别的所有日志。例如:\ - 如果你设置 `NEXT_PUBLIC_LOGGER_LEVEL=2`,它将从级别 2 (debug) 向上记录,这意味着级别 2 (debug)、3 (info)、4 (warn)、5 (error) 和 6 (fatal) 将被记录。\ - 如果你设置 `NEXT_PUBLIC_LOGGER_LEVEL=3`,它将从级别 3 (info) 向上记录,这意味着级别 3 (info)、4 (warn)、5 (error) 和 6 (fatal) 将被记录,但级别 2 (debug) 和级别 1 (trace) 将被忽略。\ ``` echo 'NEXT_PUBLIC_LOGGER_LEVEL=3' >> .env ``` 例如,将 Logger 级别设置为 info。 #### Gitpod 设置 1. 点击下面的按钮在 Gitpod 中打开此项目。 2. 这将在你的浏览器中打开一个完全配置好的工作区,所有必要的依赖项都已安装。 [![在 Gitpod 中打开](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/calcom/cal.diy) #### 手动设置 1. 在 `.env` 文件中配置环境变量。将 ``, ``, ``, 和 `` 替换为它们的实际值。 ``` DATABASE_URL='postgresql://:@:' ```
如果你不知道如何配置 DATABASE_URL,请按照以下步骤创建一个快速的本地数据库 1. [下载](https://www.postgresql.org/download/) 并在本地安装 PostgreSQL(如果尚未安装)。 2. 通过执行 `createDB ` 创建你自己的本地数据库。 3. 现在使用你创建的数据库打开你的 psql shell:`psql -h localhost -U postgres -d ` 4. 在 psql shell 内执行 `\conninfo`。你将获得以下信息。 ![image](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/8c7758f7fa140552.png) 5. 现在提取所有信息并将其添加到你的 DATABASE_URL 中。该 URL 看起来类似于这样 `postgresql://postgres:postgres@localhost:5432/你的-DB-名称`。端口是可配置的,不一定是 5432。
如果你不想创建本地数据库。你也可以考虑使用像 railway.app、Northflank 或 render 这样的服务。 - [使用 railway.app 设置 postgres 数据库](https://docs.railway.app/guides/postgresql) - [使用 Northflank 设置 postgres 数据库](https://northflank.com/guides/deploy-postgres-database-on-northflank) - [使用 render 设置 postgres 数据库](https://render.com/docs/databases) 2. 将 `.env` 中的 `DATABASE_URL` 复制并粘贴到 `.env.appStore`。 3. 使用 Prisma schema(位于 `packages/prisma/schema.prisma`)设置数据库。 在开发环境中,运行: ``` yarn workspace @calcom/prisma db-migrate ``` 在生产环境中,运行: ``` yarn workspace @calcom/prisma db-deploy ``` 4. 运行 [mailhog](https://github.com/mailhog/MailHog) 以查看开发期间发送的电子邮件。 ``` docker pull mailhog/mailhog docker run -d -p 8025:8025 -p 1025:1025 mailhog/mailhog ``` 5. 运行(在开发模式下) ``` yarn dev ``` #### 设置你的第一个用户 ##### 方法一 1. 打开 [Prisma Studio](https://prisma.io/studio) 来查看或修改数据库内容: ``` yarn db-studio ``` 2. 点击 `User` 模型以添加新的用户记录。 3. 填写 `email`, `username`, `password` 字段,并将 `metadata` 设置为空的 `{}`(记得使用 [BCrypt](https://bcrypt-generator.com/) 加密你的密码),然后点击 `Save 1 Record` 以创建你的第一个用户。 4. 打开浏览器访问 [http://localhost:3000](http://localhost:3000) 并使用你刚刚创建的第一个用户登录。 ##### 方法二 通过运行以下命令填充本地数据库 ``` cd packages/prisma yarn db-seed ``` 以上命令将用虚拟用户填充本地数据库。 ### E2E 测试 请确保将环境变量 `NEXTAUTH_URL` 设置为正确的值。如果你是在本地运行,如 `.env.example` 文档所述,该值应为 `http://localhost:3000`。 ``` # 在终端中只需运行: yarn test-e2e # 要打开最近的 HTML 报告,请运行: yarn playwright show-report test-results/reports/playwright-html-report ``` #### 解决问题 ##### E2E 测试浏览器未安装 运行 `npx playwright install` 下载测试浏览器,并解决运行 `yarn test-e2e` 时出现的以下错误: ``` Executable doesn't exist at /Users/alice/Library/Caches/ms-playwright/chromium-1048/chrome-mac/Chromium.app/Contents/MacOS/Chromium ``` ### 从早期版本升级 1. 拉取当前版本: ``` git pull ``` 2. 检查依赖项是否已添加/更新/移除 ``` yarn ``` 3. 通过运行以下 **任一** 命令应用数据库迁移: 在开发环境中,运行: ``` yarn workspace @calcom/prisma db-migrate ``` (在某些情况下,这可能会清除你的开发数据库) 在生产环境中,运行: ``` yarn workspace @calcom/prisma db-deploy ``` 4. 检查 `.env` 变量的更改 ``` yarn predev ``` 5. 启动服务器。在开发环境中,只需执行: ``` yarn dev ``` 对于生产构建,例如运行: ``` yarn build yarn start ``` 6. 享受新版本吧。 ## 部署 ### Docker Docker 镜像可以在 DockerHub 上找到:[https://hub.docker.com/r/calcom/cal.diy](https://hub.docker.com/r/calcom/cal.diy)。 **注意 ARM 用户**:请使用 `{version}-arm` 后缀来拉取镜像。例如:`docker pull calcom/cal.diy:v5.6.19-arm`。 #### 要求 确保你的服务器/系统上已安装 `docker` 和 `docker compose`。大多数 docker 工具(包括 Docker Desktop 和 Rancher Desktop)都会安装这两者。 注意:根据 Docker 文档,不带连字符的 `docker compose` 现在是使用 docker-compose 的主要方式。 #### 使用 Docker Compose 运行 Cal.diy 1. 克隆仓库 ``` git clone --recursive https://github.com/calcom/cal.diy.git ``` 2. 切换到目录 ``` cd cal.diy ``` 3. 准备你的配置:将 `.env.example` 重命名为 `.env` 然后更新 `.env` ``` cp .env.example .env ``` 大多数配置可以保持原样,但有关配置选项,请参阅下面的[重要运行时变量](#important-run-time-variables)。 **必需的密钥** 启动前,你必须为 `NEXTAUTH_SECRET` 和 `CALENDSO_ENCRYPTION_KEY` 生成安全值。在生产中使用默认的 `secret` 占位符是一个安全风险。 生成 `NEXTAUTH_SECRET`(cookie 加密密钥): ``` openssl rand -base64 32 ``` 生成 `CALENDSO_ENCRYPTION_KEY`(AES256 必须为 32 字节): ``` openssl rand -base64 24 ``` 使用这些值更新你的 `.env` 文件: ``` NEXTAUTH_SECRET=<你生成的密钥> CALENDSO_ENCRYPTION_KEY=<你生成的密钥> ``` **推送通知(VAPID 密钥)** 如果你看到类似这样的错误: ``` Error: No key set vapidDetails.publicKey ``` 这意味着你的 Web Push 环境变量缺失。 你必须生成并设置 `NEXT_PUBLIC_VAPID_PUBLIC_KEY` 和 `VAPID_PRIVATE_KEY`。 使用以下命令生成它们: ``` npx web-push generate-vapid-keys ``` 然后更新你的 `.env` 文件: ``` NEXT_PUBLIC_VAPID_PUBLIC_KEY=your_public_key_here VAPID_PRIVATE_KEY=your_private_key_here ``` **不要** 将真实密钥提交到 `.env.example` —— 仅使用占位符。 更新 `.env` 文件中的相应值,然后继续。 4. (可选)通过运行以下命令预先拉取镜像: ``` docker compose pull ``` 5. 通过 docker compose 启动 Cal.diy 运行完整堆栈,包括本地 Postgres 数据库、Cal.diy Web 应用和 Prisma Studio: ``` docker compose up -d ``` 要针对远程数据库运行 Cal.diy Web 应用和 Prisma Studio,请确保 `DATABASE_URL` 配置了可用的数据库,并运行: ``` docker compose up -d calcom studio ``` 要仅运行 Cal.diy Web 应用,请确保 `DATABASE_URL` 配置了可用的数据库,并运行: ``` docker compose up -d calcom ``` **注意:要在附加模式下运行以进行调试,请从你所需的运行命令中移除 `-d`。** 6. 打开浏览器访问 [http://localhost:3000](http://localhost:3000),或你定义的 `NEXT_PUBLIC_WEBAPP_URL`。首次运行 Cal.diy 时,设置向导将初始化。定义你的第一个用户,你就可以开始了! **首次设置注意事项(日历集成)**:在设置向导期间,你可能会遇到一个看似必需的“连接你的日历”步骤。如果你此时不想连接日历,可以通过直接导航到仪表板 `/event-types` 来跳过此步骤。日历集成可以稍后从“设置 > 集成”页面添加。 #### 更新 Cal.diy 1. 停止 Cal.diy 堆栈 ``` docker compose down ``` 2. 拉取最新更改 ``` docker compose pull ``` 3. 根据需要更新环境变量。 4. 重新启动 Cal.diy 堆栈 ``` docker compose up -d ``` #### 使用 Docker 从源代码构建 1. 克隆仓库 ``` git clone https://github.com/calcom/cal.diy.git ``` 2. 切换到目录 ``` cd cal.diy ``` 3. 将 `.env.example` 重命名为 `.env` 然后更新 `.env` 有关配置选项,请参阅下面的[构建时变量](#build-time-variables)。更新 `.env` 文件中的相应值,然后继续。 4. 构建 Cal.diy docker 镜像: 注意:由于应用程序配置要求,构建过程中目前需要一个可用的数据库。 a) 如果在其他地方托管,请在 .env 文件中配置 `DATABASE_URL`,并跳过下一步。 b) 如果需要本地或临时数据库,请通过 docker compose 启动本地数据库。 ``` docker compose up -d database ``` 5. 通过 docker compose 构建 Cal.diy(必须提供 `DOCKER_BUILDKIT=0` 以允许在构建时使用网络桥接。此要求将来会被移除) ``` DOCKER_BUILDKIT=0 docker compose build calcom ``` 6. 通过 docker compose 启动 Cal.diy 运行完整堆栈,包括本地 Postgres 数据库、Cal.diy Web 应用和 Prisma Studio: ``` docker compose up -d ``` 要针对远程数据库运行 Cal.diy Web 应用和 Prisma Studio,请确保 `DATABASE_URL` 配置了可用的数据库,并运行: ``` docker compose up -d calcom studio ``` 要仅运行 Cal.diy Web 应用,请确保 `DATABASE_URL` 配置了可用的数据库,并运行: ``` docker compose up -d calcom ``` **注意:要在附加模式下运行以进行调试,请从你所需的运行命令中移除 `-d`。** 7. 打开浏览器访问 [http://localhost:3000](http://localhost:3000),或你定义的 `NEXT_PUBLIC_WEBAPP_URL`。首次运行 Cal.diy 时,设置向导将初始化。定义你的第一个用户,你就可以开始了! #### 配置 ##### 重要运行时变量 这些变量也必须在运行时提供。 | 变量 | 描述 | 必需 | 默认值 | | --- | --- | --- | --- | | DATABASE_URL | 带凭据的数据库 URL - 如果使用连接池,此设置应指向那里 | 是 | `postgresql://unicorn_user:magical_password@database:5432/calendso` | | NEXT_PUBLIC_WEBAPP_URL | 站点的基础 URL。注意:如果此值与构建时使用的值不同,在容器启动时会有一小段延迟(用于更新静态构建的文件)。 | 否 | `http://localhost:3000` | | NEXTAUTH_URL | 认证服务器的位置。默认情况下,这是 Cal.diy docker 实例本身。 | 否 | `{NEXT_PUBLIC_WEBAPP_URL}/api/auth` | | NEXTAUTH_SECRET | Cookie 加密密钥。必须与构建变量匹配。生成命令:`openssl rand -base64 32` | 是 | `secret` | | CALENDSO_ENCRYPTION_KEY | 认证加密密钥(AES256 为 32 字节)。必须与构建变量匹配。生成命令:`openssl rand -base64 24` | 是 | `secret` | ##### 构建时变量 如果你自己构建镜像,这些变量必须在 docker 构建时提供,并且可以通过更新 .env 文件来提供。目前,如果你需要更改这些变量,你必须按照说明构建和发布你自己的镜像。 | 变量 | 描述 | 必需 | 默认值 | | --- | --- | --- | --- | | DATABASE_URL | 带凭据的数据库 URL - 如果使用连接池,此设置应指向那里 | 是 | `postgresql://unicorn_user:magical_password@database:5432/calendso` | | MAX_OLD_SPACE_SIZE | Nodejs/NPM 构建选项所需 | 是 | 4096 | | NEXTAUTH_SECRET | Cookie 加密密钥 | 是 | `secret` | | CALENDSO_ENCRYPTION_KEY | 认证加密密钥 | 是 | `secret` | | NEXT_PUBLIC_WEBAPP_URL | 注入到静态文件中的基础 URL | 否 | `http://localhost:3000` | | NEXT_PUBLIC_WEBSITE_TERMS_URL | 条款与条件网站的自定义 URL | 否 | | | NEXT_PUBLIC_WEBSITE_PRIVACY_POLICY_URL | 隐私政策网站的自定义 URL | 否 | | | CALCOM_TELEMETRY_DISABLED | 允许 Cal.diy 收集匿名使用数据(设置为 `1` 以禁用) | 否 | | #### 故障排除 ##### SSL 边缘终止 如果在处理 SSL 证书的负载均衡器后面运行,你需要添加环境变量 `NODE_TLS_REJECT_UNAUTHORIZED=0` 以防止请求被拒绝。只有在你了解自己在做什么并信任引导流量到你服务的负载均衡器时才这样做。 ##### 提交更改失败:无效的 'prisma.user.create()' 某些版本在 `metadata` 字段为空时创建用户可能会有麻烦。使用空的 json 对象 `{}` 作为字段值应该可以解决此问题。另外,`id` 字段会自动递增,所以你也可以尝试将 `id` 的值留空。 ##### CLIENT_FETCH_ERROR 如果你遇到此错误,可能是服务器中的默认 Auth 回调正在将 WEBAPP_URL 用作基础 URL。容器不一定具有与你的本地计算机相同的 DNS 访问权限,因此需要配置为解析到自身。你也许可以通过配置 `NEXTAUTH_URL=http://localhost:3000/api/auth` 来纠正此问题,以帮助后端回环到自身。 ``` docker-calcom-1 | @calcom/web:start: [next-auth][error][CLIENT_FETCH_ERROR] docker-calcom-1 | @calcom/web:start: https://next-auth.js.org/errors#client_fetch_error request to http://testing.localhost:3000/api/auth/session failed, reason: getaddrinfo ENOTFOUND testing.localhost { docker-calcom-1 | @calcom/web:start: error: { docker-calcom-1 | @calcom/web:start: message: 'request to http://testing.localhost:3000/api/auth/session failed, reason: getaddrinfo ENOTFOUND testing.localhost', docker-calcom-1 | @calcom/web:start: stack: 'FetchError: request to http://testing.localhost:3000/api/auth/session failed, reason: getaddrinfo ENOTFOUND testing.localhost\n' + docker-calcom-1 | @calcom/web:start: ' at ClientRequest. (/calcom/node_modules/next/dist/compiled/node-fetch/index.js:1:65756)\n' + docker-calcom-1 | @calcom/web:start: ' at ClientRequest.emit (node:events:513:28)\n' + docker-calcom-1 | @calcom/web:start: ' at ClientRequest.emit (node:domain:489:12)\n' + docker-calcom-1 | @calcom/web:start: ' at Socket.socketErrorListener (node:_http_client:494:9)\n' + docker-calcom-1 | @calcom/web:start: ' at Socket.emit (node:events:513:28)\n' + docker-calcom-1 | @calcom/web:start: ' at Socket.emit (node:domain:489:12)\n' + docker-calcom-1 | @calcom/web:start: ' at emitErrorNT (node:internal/streams/destroy:157:8)\n' + docker-calcom-1 | @calcom/web:start: ' at emitErrorCloseNT (node:internal/streams/destroy:122:3)\n' + docker-calcom-1 | @calcom/web:start: ' at processTicksAndRejections (node:internal/process/task_queues:83:21)', docker-calcom-1 | @calcom/web:start: name: 'FetchError' docker-calcom-1 | @calcom/web:start: }, docker-calcom-1 | @calcom/web:start: url: 'http://testing.localhost:3000/api/auth/session', docker-calcom-1 | @calcom/web:start: message: 'request to http://testing.localhost:3000/api/auth/session failed, reason: getaddrinfo ENOTFOUND testing.localhost' docker-calcom-1 | @calcom/web:start: } ``` ### Railway [![在 Railway 上部署](https://railway.app/button.svg)](https://railway.app/new/template/cal) 你可以在 [Railway](https://railway.app) 上部署 Cal.diy。Railway 团队也有一篇关于在其平台上部署的[详细博客文章](https://blog.railway.app/p/calendso)。 ### Northflank [![在 Northflank 上部署](https://assets.northflank.com/deploy_to_northflank_smm_36700fb050.svg)](https://northflank.com/stacks/deploy-calcom) 你可以在 [Northflank](https://northflank.com) 上部署 Cal.diy。Northflank 团队也有一篇关于在其平台上部署的[详细博客文章](https://northflank.com/guides/deploy-calcom-with-northflank)。 ### Vercel 目前需要 Vercel Pro Plan 才能使用 Vercel 部署此应用程序,因为免费计划对无服务器函数数量有限制。 [![使用 Vercel 部署](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fcalcom%2Fcal.diy&env=DATABASE_URL,NEXT_PUBLIC_WEBAPP_URL,NEXTAUTH_URL,NEXTAUTH_SECRET,CRON_API_KEY,CALENDSO_ENCRYPTION_KEY&envDescription=See%20all%20available%20env%20vars&envLink=https%3A%2F%2Fgithub.com%2Fcalcom%2Fcal.diy%2Fblob%2Fmain%2F.env.example&project-name=cal&repo-name=cal.diy&build-command=cd%20../..%20%26%26%20yarn%20build&root-directory=apps%2Fweb%2F) ### Render [![部署到 Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy?repo=https://github.com/calcom/docker) ### Elestio [![在 Elestio 上部署](https://elest.io/images/logos/deploy-to-elestio-btn.png)](https://elest.io/open-source/cal.com) ## 许可证 Cal.diy 是完全开源的,基于 [MIT 许可证](https://opensource.org/license/mit)。 与 Cal.com 的“开放核心”模式不同,Cal.diy **没有商业/企业代码**。整个代码库在同一个开源许可证下可用。 ## 启用内容安全策略 - 设置 CSP_POLICY="non-strict" 环境变量,这将启用 [严格 CSP](https://web.dev/strict-csp/),但 `style-src` 中的 `unsafe-inline` 除外。如果你的实例有自定义更改,你可能需要修改你的代码以使其与 CSP 兼容。目前,严格 CSP 仅在登录页面上启用。在其他 SSR 页面上,它以仅报告模式启用以检测潜在问题。在 SSG 页面上尚不支持。 ## 集成 ### 获取 Google API 凭据 1. 打开 [Google API 控制台](https://console.cloud.google.com/apis/dashboard)。如果你的 Google Cloud 订阅中没有项目,你需要在继续之前创建一个。在控制面板下,选择“启用 API 和服务”。 2. 在搜索框中,输入 calendar 并选择 Google Calendar API 搜索结果。 3. 启用所选的 API。 4. 接下来,从侧边栏转到 [OAuth 同意屏幕](https://console.cloud.google.com/apis/credentials/consent)。选择应用类型(内部或外部)并在第一页输入基本的应用详情。 5. 在第二页“范围”中,选择“添加或移除范围”。搜索 Calendar.event 并选择具有范围值 `.../auth/calendar.events` 和 `.../auth/calendar.readonly` 的范围,然后选择“更新”。 6. 在第三页(测试用户),添加你将使用的 Google 账户。确保向导最后一页的详情正确,你的同意屏幕将配置完成。 7. 现在从侧边栏选择 [凭据](https://console.cloud.google.com/apis/credentials),然后选择“创建凭据”。选择“OAuth 客户端 ID”选项。 8. 选择“Web 应用程序”作为应用程序类型。 9. 在“已授权的重定向 URI”下,选择“添加 URI”,然后添加 URI `/api/integrations/googlecalendar/callback` 和 `/api/auth/callback/google`,将 Cal.diy URL 替换为你的应用程序运行的 URI。 10. 密钥将被创建,你将被重定向回凭据页面。在“OAuth 2.0 客户端 ID”下选择新生成的客户端 ID。 11. 选择“下载 JSON”。复制此文件的内容,并将整个 JSON 字符串粘贴到 `.env` 文件中作为 `GOOGLE_API_CREDENTIALS` 键的值。 #### *将 Google 日历添加到 Cal.diy 应用商店* 添加 Google 凭据后,你现在可以将 Google Calendar 应用添加到应用商店。 你可以通过运行以下命令重新填充应用商店 ``` cd packages/prisma yarn seed-app-store ``` 你还需要完成几个步骤来激活 Google Calendar 应用。 请确保完成“获取 Google API 凭据”部分。之后,执行以下操作 1. 添加额外的重定向 URL `/api/auth/callback/google` 2. 在“OAuth 同意屏幕”下,点击“发布应用” ### 获取 Microsoft Graph Client ID 和 Secret 1. 打开 [Azure 应用注册](https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps) 并选择“新注册”。 2. 为你的应用命名。 3. 将 **谁可以使用此应用或访问此 API?** 设置为 **任何组织目录中的账户(任何 Azure AD 目录 - 多租户)**。 4. 将 **Web** 重定向 URI 设置为 `/api/integrations/office365calendar/callback`,将 Cal.diy URL 替换为你的应用程序运行的 URI。 5. 将 **应用程序(客户端)ID** 用作 .env 中的 **MS_GRAPH_CLIENT_ID** 属性值。 6. 点击 **证书和密钥** 创建一个新的客户端密钥,并将该值用作 **MS_GRAPH_CLIENT_SECRET** 属性。 ### 获取 Zoom Client ID 和 Secret 1. 打开 [Zoom 应用市场](https://marketplace.zoom.us/) 并使用你的 Zoom 账户登录。 2. 在右上角,点击“开发”=>“构建应用”。 3. 选择“通用应用”,点击“创建”。 4. 为你的应用命名。 5. 对的管理方式”,选择“用户管理的应用”。 6. 如果被要求,取消选择将应用发布到 Zoom 应用市场的选项。 7. 现在将 Client ID 和 Client Secret 复制到你的 `.env` 文件中的 `ZOOM_CLIENT_ID` 和 `ZOOM_CLIENT_SECRET` 字段。 8. 在“OAuth 信息”下将“OAuth 重定向 URL”设置为 `/api/integrations/zoomvideo/callback`,将 Cal.diy URL 替换为你的应用程序运行的 URI。 9. 同时将上面给出的重定向 URL 添加为允许列表 URL 并启用“子域名检查”。确保表单下方显示“已保存”。 10. 你不需要提供应用的基本信息。而是点击“范围”,然后点击“+ 添加范围”。 1. 在左侧,点击类别“会议”并勾选范围 `meeting:write:meeting`。 2. 点击类别“用户”并勾选范围 `user:read:settings`。 11. 点击“完成”。 12. 你已完成。现在你可以在 Cal.diy 设置中轻松添加你的 Zoom 集成。 ### 获取 Daily API 凭据 1. 打开 [Daily.co](https://daily.co/) 并创建一个账户。 2. 在你的仪表板内,转到 [开发者](https://dashboard.daily.co/developers) 选项卡。 3. 复制你的 API 密钥。 4. 现在将 API 密钥粘贴到你的 `.env` 文件中的 `DAILY_API_KEY` 字段。 5. 如果你拥有 [Daily Scale Plan](https://daily.co/pricing),请将 `DAILY_SCALE_PLAN` 变量设置为 `true` 以便使用视频录制等功能。 ### 获取 Basecamp Client ID 和 Secret 1. 访问 [37 Signals 集成仪表板](launchpad.37signals.com/integrations) 并登录。 2. 点击“立即注册一个”链接来注册一个新应用。 3. 填写你的公司详细信息。 4. 选择 Basecamp 4 作为要集成的产品。 5. 将 OAuth 的重定向 URL 设置为 `/api/integrations/basecamp3/callback`,将 Cal.diy URL 替换为你的应用程序运行的 URI。 6. 点击“完成”并将 Client ID 和 secret 复制到 `BASECAMP3_CLIENT_ID` 和 `BASECAMP3_CLIENT_SECRET` 字段。 7. 将 `BASECAMP3_CLIENT_SECRET` 环境变量设置为 `{你的域名} ({支持邮箱})`。 ### 获取 HubSpot Client ID 和 Secret 1. 打开 [HubSpot 开发者](https://developer.hubspot.com/) 并登录你的账户,或创建一个新账户。 2. 在开发者账户主页内,转到“管理应用”。 3. 点击右上角的“创建旧版应用”按钮并选择公共应用。 4. 在“应用信息”选项卡中填写你想要的任何信息。 5. 转到“身份验证”选项卡。 6. 现在将 Client ID 和 Client Secret 复制到你的 `.env` 文件中的 `HUBSPOT_CLIENT_ID` 和 `HUBSPOT_CLIENT_SECRET` 字段。 7. 将 OAuth 的重定向 URL 设置为 `/api/integrations/hubspot/callback`,将 Cal.diy URL 替换为你的应用程序运行的 URI。 8. 在页面底部的“范围”部分,确保你为名为 `crm.objects.contacts` 和 `crm.lists` 的范围选择了“读取”和“写入”。 9. 点击底部页脚的“保存”按钮。 10. 你已完成。现在你可以在 HubSpot 中为你的联系人看到任何在 Cal.diy 中创建的预订作为会议。 ### 获取 Webex Client ID 和 Secret [参见 Webex Readme](./packages/app-store/webex/) ### 获取 ZohoCRM Client ID 和 Secret 1. 打开 [Zoho API 控制台](https://api-console.zoho.com/) 并登录你的账户,或创建一个新账户。 2. 在 API 控制台页面内,转到“应用”。 3. 点击右上角的“添加客户端”按钮并选择“基于服务器的应用”。 4. 在“客户端详情”选项卡中填写你想要的任何信息。 5. 转到“客户端密钥”选项卡。 6. 现在将 Client ID 和 Client Secret 复制到你的 `.env` 文件中的 `ZOHOCRM_CLIENT_ID` 和 `ZOHOCRM_CLIENT_SECRET` 字段。 7. 将 OAuth 的重定向 URL 设置为 `/api/integrations/zohocrm/callback`,将 Cal.diy URL 替换为你的应用程序运行的 URI。 8. 在“设置”部分,如果你希望为所有数据中心使用相同的 OAuth 凭据,请勾选“多 DC”选项。 9. 点击底部页脚的“保存”/“更新”按钮。 10. 你已完成。现在你可以在 Cal.diy 设置中轻松添加你的 ZohoCRM 集成。 ### 获取 Zoho Calendar Client ID 和 Secret [按照这些步骤操作](./packages/app-store/zohocalendar/) ### 获取 Zoho Bigin Client ID 和 Secret [按照这些步骤操作](./packages/app-store/zoho-bigin/) ### 获取 Pipedrive Client ID 和 Secret [按照这些步骤操作](./packages/app-store/pipedrive-crm/) ### 使用 Unkey 进行速率限制 Cal.diy 使用 [Unkey](https://unkey.com) 进行速率限制。这是一个可选功能,自托管时不需要。 如果你想启用速率限制: 1. 在 [unkey.com](https://unkey.com) 注册一个账户 2. 创建一个具有以下权限的 Root 密钥 `ratelimit.create_namespace` 和 `ratelimit.limit` 3. 将 root 密钥复制到你的 `.env` 文件中的 `UNKEY_ROOT_KEY` 字段 注意:如果你不配置 Unkey,Cal.diy 将正常运行,不会启用速率限制。 ## 贡献 我们欢迎贡献!无论是修复错别字、改进文档,还是构建新功能,你的帮助都会让 Cal.diy 变得更好。 - 查看我们的[贡献指南](./CONTRIBUTING.md)了解详细步骤。 - 在 [GitHub 讨论区](https://github.com/calcom/cal.diy/discussions)加入讨论。 - 请遵循我们的编码标准和提交消息规范,以保持项目一致性。 即使是很小的改进也很重要 —— 感谢你帮助我们成长! ### 好的首次问题 我们有一份 [求助](https://github.com/calcom/cal.diy/issues?q=is:issue+is:open+label:%22%F0%9F%99%8B%F0%9F%8F%BB%E2%80%8D%E2%99%82%EF%B8%8Fhelp+wanted%22) 列表,其中包含范围相对较小的功能和错误。这是一个很好的起点,可以获得经验,并熟悉我们的贡献流程。 ### 贡献者 ### 翻译 不写代码但仍然想贡献?加入我们的[讨论区](https://github.com/calcom/cal.diy/discussions),帮助将 Cal.diy 翻译成你的语言。 ## 致谢 Cal.diy 建立在 [Cal.com](https://cal.com) 和原始项目的众多贡献者所创建的基础之上。特别感谢: - [Vercel](https://vercel.com/) - [Next.js](https://nextjs.org/) - [Day.js](https://day.js.org/) - [Tailwind CSS](https://tailwindcss.com/) - [Prisma](https://prisma.io/)
标签:GitHub项目, NIDS, SaaS替代品, WAF测试, 会议安排, 免费软件, 在线预约, 容器化, 日历集成, 日程管理, 社区驱动, 自动化攻击, 自托管, 调度基础设施, 调度平台, 预约系统