Cal.diy 如何从源码构建自己的 Docker 镜像并启动实例
2026/9/10 20:22:45 网站建设 项目流程

Cal.diy 如何从源码构建自己的 Docker 镜像并启动实例

【免费下载链接】cal.diyScheduling infrastructure for absolutely everyone.项目地址: https://gitcode.com/GitHub_Trending/ca/cal.diy

不想直接使用预构建镜像、需要修改构建时变量(如NEXT_PUBLIC_WEBAPP_URL、条款/隐私政策 URL、遥测开关),或希望完全控制构建过程时,可以用仓库自带的 Dockerfile 从源码构建 Cal.diy 镜像,再用 docker compose 启动实例。本流程整理自 README.md 的 “Building from source with Docker” 章节,与 apps/docs/content/docker.mdx 保持一致。完成操作后,浏览器访问http://localhost:3000(或你配置的NEXT_PUBLIC_WEBAPP_URL)即可看到首次启动的初始化向导,定义第一个用户后实例即可使用。前提是服务器已安装dockerdocker compose(不带连字符的写法),Docker Desktop 与 Rancher Desktop 通常两者都包含。

准备源码与 .env 配置

  1. 克隆仓库并进入目录:
git clone https://github.com/calcom/cal.diy.git cd cal.diy
  1. 复制环境变量模板:
cp .env.example .env

.env.example里的大部分配置可以保持原样,但源码构建路径下至少需要确认以下几项:

  • NEXTAUTH_SECRET:Cookie 加密密钥,用openssl rand -base64 32生成。
  • CALENDSO_ENCRYPTION_KEY:加密密钥(AES256 要求 32 字节),用openssl rand -base64 24生成。 这两项在运行时表格中标注 “Must match build variable”,即构建时与运行时的取值必须一致;生产环境使用默认占位值secret是安全风险,必须替换。
  • DATABASE_URL:构建过程与运行时都需要一个可用数据库。注意.env.example中的默认值postgresql://postgres:@localhost:5450/calendso面向本地开发;使用 compose 内置 database 服务时,应改为 README 表格给出的默认值postgresql://unicorn_user:magical_password@database:5432/calendso
  • NEXT_PUBLIC_WEBAPP_URL(可选):站点基础 URL,构建时注入静态文件,默认http://localhost:3000。README 说明:若运行时的值与构建时不同,容器启动时会重新替换静态文件中的值,启动会略有延迟。
  • CALCOM_TELEMETRY_DISABLED(可选):设为1可关闭匿名使用数据采集。
  • MAX_OLD_SPACE_SIZE:README 表格将其列为构建时必需变量、默认 4096;当前 docker-compose.yml 的 build args 并未传递该项,此时以 Dockerfile 中ARG MAX_OLD_SPACE_SIZE=6144的默认值为准。

另有一个容易忽略的点:compose 中 calcom 服务的运行时DATABASE_URL是由${POSTGRES_USER}${POSTGRES_PASSWORD}${DATABASE_HOST}${POSTGRES_DB}这几个变量拼出来的,而 database 服务固定以用户unicorn_user、密码magical_password、数据库名calendso初始化 Postgres(见 docker-compose.yml)。使用内置数据库时,在.env中补齐这些变量,让构建参数与运行时拼装结果指向同一个库:

# docker-compose.yml 中 database 服务初始化的账号/密码/库名 POSTGRES_USER=unicorn_user POSTGRES_PASSWORD=magical_password POSTGRES_DB=calendso # 数据库所在主机,即 compose 中的服务名 DATABASE_HOST=database # 构建时参数,指向同一个数据库 DATABASE_URL=postgresql://unicorn_user:magical_password@database:5432/calendso # 分别用 openssl rand -base64 32 / 24 生成 NEXTAUTH_SECRET=<你生成的值> CALENDSO_ENCRYPTION_KEY=<你生成的值> NEXT_PUBLIC_WEBAPP_URL=http://localhost:3000 CALCOM_TELEMETRY_DISABLED=1

代码块中的<...>为占位符,替换为你用 openssl 生成的实际值。

先启动构建所需数据库

README 明确指出:出于应用配置要求,构建过程当前需要一个可用数据库。两条分支:

  • 部署环境已有数据库:把.envDATABASE_URL指向它,跳过本步。
  • 需要本地或临时数据库:只启动 compose 中的 database 服务:
docker compose up -d database

该命令只启动名为database的 Postgres 容器,并挂载database-data卷,数据持久化在该卷中。

构建镜像

在仓库根目录执行:

DOCKER_BUILDKIT=0 docker compose build calcom

说明:

  • README 要求命令必须带DOCKER_BUILDKIT=0前缀,目的是允许构建期使用网络桥接,文档注明该要求将来会移除。
  • compose 中 calcom 服务的 build 配置为context: .dockerfile: Dockerfile,build args 从.env读取DATABASE_URLNEXTAUTH_SECRETCALENDSO_ENCRYPTION_KEYNEXT_PUBLIC_WEBAPP_URL等值。
  • Dockerfile 为多阶段构建,最终 runner 阶段暴露 3000 端口,以scripts/start.sh作为启动命令,并内置健康检查:每 30 秒用wget --spider http://localhost:3000探测,超时 30 秒、重试 5 次。

启动实例

按数据库情况选择:

# 完整栈:本地 Postgres 数据库 + Cal.diy 网页应用 + Prisma Studio docker compose up -d # 网页应用 + Prisma Studio,使用外部数据库(DATABASE_URL 须指向可用数据库) docker compose up -d calcom studio # 只启动网页应用,使用外部数据库 docker compose up -d calcom

需要查看日志排查问题时,去掉-d以附加模式运行。另请注意:当前 docker-compose.yml 还定义了rediscalcom-api(API v2)两个服务,直接docker compose up -d会把文件中的所有服务都启动起来。

验证结果

  1. 浏览器打开http://localhost:3000(或你配置的NEXT_PUBLIC_WEBAPP_URL)。首次运行会进入初始化向导:定义第一个用户后即可以使用。若向导中出现 “Connect your Calendar” 步骤且暂时不想连接日历,可直接访问<NEXT_PUBLIC_WEBAPP_URL>/event-types跳过,日历集成之后可在 Settings > Integrations 页面添加。
  2. 终端执行docker compose ps查看容器状态。Cal.diy 镜像内置健康检查(30 秒间隔执行wget --spider http://localhost:3000,重试 5 次),服务不可达时容器状态会被标为不健康。

常见问题与限制

  • CLIENT_FETCH_ERROR:容器日志出现[next-auth][error][CLIENT_FETCH_ERROR](文档示例为getaddrinfo ENOTFOUND testing.localhost)。文档解释是服务端默认 Auth 回调用 WEBAPP_URL 作为基础地址,而容器未必能解析本地机器上的域名。可尝试配置NEXTAUTH_URL=http://localhost:3000/api/auth,让后端回指自身。
  • Failed to commit changes: Invalid 'prisma.user.create()':某些版本在metadata字段为空时创建用户会失败,将该字段置为空 JSON 对象{}可解决;id字段自增,也可尝试留空。
  • SSL 边缘终结:若部署在负责 SSL 证书的负载均衡器之后,README 要求添加环境变量NODE_TLS_REJECT_UNAUTHORIZED=0防止请求被拒绝,同时明确警告:只有在你清楚自己在做什么、并信任转发流量的服务/负载均衡器时才能这样做。
  • 构建时变量的约束NEXT_PUBLIC_WEBAPP_URL、条款/隐私政策 URL、遥测等构建时变量在构建阶段固化进镜像,README 与 Docker 文档均说明:如需修改这些变量,必须按本文流程自行构建镜像,不能在运行时通过改环境变量替代。
  • 适用范围:README 开头提示,Cal.diy 是社区自托管版本,严格建议仅用于个人、非生产用途。

【免费下载链接】cal.diyScheduling infrastructure for absolutely everyone.项目地址: https://gitcode.com/GitHub_Trending/ca/cal.diy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询