重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
infra-deploy by terrylica/cc-skills
npx skills add https://github.com/terrylica/cc-skills --skill infra-deploy将 Cal.com 自托管版本部署到 GCP Cloud Run 并搭配 Supabase PostgreSQL,或通过 Docker Compose 在本地运行。
自我演进技能:此技能通过使用不断改进。如果指令有误、参数漂移或需要变通方案——请立即修复此文件,不要拖延。仅针对真实、可复现的问题进行更新。
echo "CALCOM_GCP_PROJECT: ${CALCOM_GCP_PROJECT:-NOT_SET}"
echo "CALCOM_GCP_ACCOUNT: ${CALCOM_GCP_ACCOUNT:-NOT_SET}"
echo "CALCOM_GCP_REGION: ${CALCOM_GCP_REGION:-us-central1}"
如果显示 NOT_SET:必须在 .mise.local.toml 中配置这些变量。运行设置命令。
gcloud auth list --filter="status=ACTIVE" --format="value(account)" 2>/dev/null
echo "SUPABASE_PROJECT_REF: ${SUPABASE_PROJECT_REF:-NOT_SET}"
echo "SUPABASE_DB_URL_REF: ${SUPABASE_DB_URL_REF:-NOT_SET}"
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
echo "CALCOM_NEXTAUTH_SECRET_REF: ${CALCOM_NEXTAUTH_SECRET_REF:-NOT_SET}"
echo "CALCOM_ENCRYPTION_KEY_REF: ${CALCOM_ENCRYPTION_KEY_REF:-NOT_SET}"
echo "CALCOM_CRON_API_KEY_REF: ${CALCOM_CRON_API_KEY_REF:-NOT_SET}"
所有 1Password 引用必须已设置。 密钥存储在 Claude Automation 保险库中。
gcloud services list --enabled \
--project="$CALCOM_GCP_PROJECT" \
--account="$CALCOM_GCP_ACCOUNT" 2>/dev/null | grep -E "run|artifact|build"
必需 API:Cloud Run、Artifact Registry、Cloud Build。
# 从 cal.com fork 目录
cd ~/fork-tools/cal.com
# 构建 Docker 镜像
docker build -t calcom-self-hosted .
# 为 Artifact Registry 打标签
docker tag calcom-self-hosted \
"${CALCOM_GCP_REGION}-docker.pkg.dev/${CALCOM_GCP_PROJECT}/calcom/calcom:latest"
# 推送
docker push \
"${CALCOM_GCP_REGION}-docker.pkg.dev/${CALCOM_GCP_PROJECT}/calcom/calcom:latest"
# 从 1Password 解析密钥
NEXTAUTH_SECRET=$(op read "$CALCOM_NEXTAUTH_SECRET_REF")
ENCRYPTION_KEY=$(op read "$CALCOM_ENCRYPTION_KEY_REF")
CRON_API_KEY=$(op read "$CALCOM_CRON_API_KEY_REF")
DATABASE_URL=$(op read "$SUPABASE_DB_URL_REF")
gcloud run deploy calcom \
--image="${CALCOM_GCP_REGION}-docker.pkg.dev/${CALCOM_GCP_PROJECT}/calcom/calcom:latest" \
--region="$CALCOM_GCP_REGION" \
--project="$CALCOM_GCP_PROJECT" \
--account="$CALCOM_GCP_ACCOUNT" \
--platform=managed \
--allow-unauthenticated \
--port=3000 \
--memory=512Mi \
--cpu=1 \
--min-instances=0 \
--max-instances=2 \
--set-env-vars="DATABASE_URL=${DATABASE_URL}" \
--set-env-vars="NEXTAUTH_SECRET=${NEXTAUTH_SECRET}" \
--set-env-vars="CALENDSO_ENCRYPTION_KEY=${ENCRYPTION_KEY}" \
--set-env-vars="CRON_API_KEY=${CRON_API_KEY}" \
--set-env-vars="NEXT_PUBLIC_WEBAPP_URL=https://calcom-${CALCOM_GCP_PROJECT}.run.app" \
--set-env-vars="NEXT_PUBLIC_API_V2_URL=https://calcom-${CALCOM_GCP_PROJECT}.run.app/api/v2"
version: "3.9"
services:
calcom:
image: calcom/cal.com:latest
restart: unless-stopped
ports:
- "3000:3000"
env_file:
- .env
depends_on:
database:
condition: service_healthy
database:
image: postgres:15
restart: unless-stopped
volumes:
- calcom-db:/var/lib/postgresql/data
environment:
POSTGRES_USER: calcom
POSTGRES_PASSWORD: calcom
POSTGRES_DB: calcom
healthcheck:
test: ["CMD-SHELL", "pg_isready -U calcom"]
interval: 10s
timeout: 5s
retries: 5
volumes:
calcom-db:
DATABASE_URL=postgresql://calcom:calcom@database:5432/calcom
NEXTAUTH_SECRET=<generate-with-openssl>
CALENDSO_ENCRYPTION_KEY=<generate-with-openssl>
CRON_API_KEY=<generate-with-openssl>
NEXT_PUBLIC_WEBAPP_URL=http://localhost:3000
NEXT_PUBLIC_API_V2_URL=http://localhost:3000/api/v2
轻量级 Cloud Run 服务,将 Cal.com webhook 桥接到 Pushover 紧急警报。零依赖(仅使用 Python 标准库)。
echo "PUSHOVER_APP_TOKEN: ${PUSHOVER_APP_TOKEN:+SET}"
echo "PUSHOVER_USER_KEY: ${PUSHOVER_USER_KEY:+SET}"
echo "PUSHOVER_SOUND: ${PUSHOVER_SOUND:-dune}"
所有必须已设置。 有关凭据设置,请参阅 pushover-setup.md。
RELAY_SOURCE="$HOME/.claude/plugins/marketplaces/cc-skills/plugins/calcom-commander/scripts/webhook-relay"
gcloud run deploy calcom-pushover-webhook \
--source "$RELAY_SOURCE" \
--project="$CALCOM_GCP_PROJECT" \
--account="$CALCOM_GCP_ACCOUNT" \
--region="$CALCOM_GCP_REGION" \
--platform managed \
--allow-unauthenticated \
--set-env-vars="PUSHOVER_TOKEN=$PUSHOVER_APP_TOKEN,PUSHOVER_USER=$PUSHOVER_USER_KEY,PUSHOVER_SOUND=${PUSHOVER_SOUND:-dune}" \
--memory=128Mi \
--cpu=1 \
--min-instances=0 \
--max-instances=1 \
--timeout=30 \
--quiet
记下输出中的服务 URL。将其存储在 .mise.local.toml 中作为 WEBHOOK_RELAY_URL。
curl -s "$WEBHOOK_RELAY_URL" | python3 -m json.tool
# 预期输出:{"status": "healthy", "service": "calcom-pushover-webhook"}
CALCOM_API_KEY=$(op item get "$CALCOM_OP_UUID" --vault "Claude Automation" --fields password --reveal)
curl -s -X POST "https://api.cal.com/v1/webhooks?apiKey=$CALCOM_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"subscriberUrl\":\"$WEBHOOK_RELAY_URL\",\"eventTriggers\":[\"BOOKING_CREATED\",\"BOOKING_RESCHEDULED\",\"BOOKING_CANCELLED\"],\"active\":true}"
curl -s -X POST "$WEBHOOK_RELAY_URL" \
-H "Content-Type: application/json" \
-d '{"triggerEvent":"BOOKING_CREATED","payload":{"title":"Test Meeting","attendees":[{"name":"Test User"}],"startTime":"2026-01-01T10:00:00Z","endTime":"2026-01-01T10:30:00Z"}}'
预期结果:您的设备上会收到带有 "dune" 声音的 Pushover 紧急警报。
DATABASE_URL=$(op read "$SUPABASE_DB_URL_REF")
psql "$DATABASE_URL" -c "SELECT version();"
cd ~/fork-tools/cal.com
DATABASE_URL=$(op read "$SUPABASE_DB_URL_REF") npx prisma migrate deploy
Claude Automation 保险库中的所有密钥(无需生物识别访问):
| 密钥 | 1Password 引用 |
|---|---|
NEXTAUTH_SECRET | op://Claude Automation/<item-id>/NEXTAUTH_SECRET |
CALENDSO_ENCRYPTION_KEY | op://Claude Automation/<item-id>/CALENDSO_ENCRYPTION_KEY |
CRON_API_KEY | op://Claude Automation/<item-id>/CRON_API_KEY |
DATABASE_URL | op://Claude Automation/<item-id>/DATABASE_URL |
DATABASE_DIRECT_URL | op://Claude Automation/<item-id>/DATABASE_DIRECT_URL |
此技能完成后,在关闭任务前进行反思:
不要拖延。下一次调用将继承您留下的任何问题。
每周安装次数
56
仓库
GitHub 星标数
28
首次出现
2026年2月17日
安全审计
安装于
opencode54
gemini-cli54
amp54
cline54
github-copilot54
codex54
Deploy Cal.com self-hosted to GCP Cloud Run with Supabase PostgreSQL, or run locally via Docker Compose.
Self-Evolving Skill : This skill improves through use. If instructions are wrong, parameters drifted, or a workaround was needed — fix this file immediately, don't defer. Only update for real, reproducible issues.
echo "CALCOM_GCP_PROJECT: ${CALCOM_GCP_PROJECT:-NOT_SET}"
echo "CALCOM_GCP_ACCOUNT: ${CALCOM_GCP_ACCOUNT:-NOT_SET}"
echo "CALCOM_GCP_REGION: ${CALCOM_GCP_REGION:-us-central1}"
If NOT_SET : These must be configured in .mise.local.toml. Run the setup command.
gcloud auth list --filter="status=ACTIVE" --format="value(account)" 2>/dev/null
echo "SUPABASE_PROJECT_REF: ${SUPABASE_PROJECT_REF:-NOT_SET}"
echo "SUPABASE_DB_URL_REF: ${SUPABASE_DB_URL_REF:-NOT_SET}"
echo "CALCOM_NEXTAUTH_SECRET_REF: ${CALCOM_NEXTAUTH_SECRET_REF:-NOT_SET}"
echo "CALCOM_ENCRYPTION_KEY_REF: ${CALCOM_ENCRYPTION_KEY_REF:-NOT_SET}"
echo "CALCOM_CRON_API_KEY_REF: ${CALCOM_CRON_API_KEY_REF:-NOT_SET}"
All 1Password references must be SET. Secrets are stored in Claude Automation vault.
gcloud services list --enabled \
--project="$CALCOM_GCP_PROJECT" \
--account="$CALCOM_GCP_ACCOUNT" 2>/dev/null | grep -E "run|artifact|build"
Required APIs: Cloud Run, Artifact Registry, Cloud Build.
# From the cal.com fork directory
cd ~/fork-tools/cal.com
# Build Docker image
docker build -t calcom-self-hosted .
# Tag for Artifact Registry
docker tag calcom-self-hosted \
"${CALCOM_GCP_REGION}-docker.pkg.dev/${CALCOM_GCP_PROJECT}/calcom/calcom:latest"
# Push
docker push \
"${CALCOM_GCP_REGION}-docker.pkg.dev/${CALCOM_GCP_PROJECT}/calcom/calcom:latest"
# Resolve secrets from 1Password
NEXTAUTH_SECRET=$(op read "$CALCOM_NEXTAUTH_SECRET_REF")
ENCRYPTION_KEY=$(op read "$CALCOM_ENCRYPTION_KEY_REF")
CRON_API_KEY=$(op read "$CALCOM_CRON_API_KEY_REF")
DATABASE_URL=$(op read "$SUPABASE_DB_URL_REF")
gcloud run deploy calcom \
--image="${CALCOM_GCP_REGION}-docker.pkg.dev/${CALCOM_GCP_PROJECT}/calcom/calcom:latest" \
--region="$CALCOM_GCP_REGION" \
--project="$CALCOM_GCP_PROJECT" \
--account="$CALCOM_GCP_ACCOUNT" \
--platform=managed \
--allow-unauthenticated \
--port=3000 \
--memory=512Mi \
--cpu=1 \
--min-instances=0 \
--max-instances=2 \
--set-env-vars="DATABASE_URL=${DATABASE_URL}" \
--set-env-vars="NEXTAUTH_SECRET=${NEXTAUTH_SECRET}" \
--set-env-vars="CALENDSO_ENCRYPTION_KEY=${ENCRYPTION_KEY}" \
--set-env-vars="CRON_API_KEY=${CRON_API_KEY}" \
--set-env-vars="NEXT_PUBLIC_WEBAPP_URL=https://calcom-${CALCOM_GCP_PROJECT}.run.app" \
--set-env-vars="NEXT_PUBLIC_API_V2_URL=https://calcom-${CALCOM_GCP_PROJECT}.run.app/api/v2"
version: "3.9"
services:
calcom:
image: calcom/cal.com:latest
restart: unless-stopped
ports:
- "3000:3000"
env_file:
- .env
depends_on:
database:
condition: service_healthy
database:
image: postgres:15
restart: unless-stopped
volumes:
- calcom-db:/var/lib/postgresql/data
environment:
POSTGRES_USER: calcom
POSTGRES_PASSWORD: calcom
POSTGRES_DB: calcom
healthcheck:
test: ["CMD-SHELL", "pg_isready -U calcom"]
interval: 10s
timeout: 5s
retries: 5
volumes:
calcom-db:
DATABASE_URL=postgresql://calcom:calcom@database:5432/calcom
NEXTAUTH_SECRET=<generate-with-openssl>
CALENDSO_ENCRYPTION_KEY=<generate-with-openssl>
CRON_API_KEY=<generate-with-openssl>
NEXT_PUBLIC_WEBAPP_URL=http://localhost:3000
NEXT_PUBLIC_API_V2_URL=http://localhost:3000/api/v2
Lightweight Cloud Run service bridging Cal.com webhooks to Pushover emergency alerts. Zero dependencies (Python stdlib only).
echo "PUSHOVER_APP_TOKEN: ${PUSHOVER_APP_TOKEN:+SET}"
echo "PUSHOVER_USER_KEY: ${PUSHOVER_USER_KEY:+SET}"
echo "PUSHOVER_SOUND: ${PUSHOVER_SOUND:-dune}"
All must be SET. See pushover-setup.md for credential setup.
RELAY_SOURCE="$HOME/.claude/plugins/marketplaces/cc-skills/plugins/calcom-commander/scripts/webhook-relay"
gcloud run deploy calcom-pushover-webhook \
--source "$RELAY_SOURCE" \
--project="$CALCOM_GCP_PROJECT" \
--account="$CALCOM_GCP_ACCOUNT" \
--region="$CALCOM_GCP_REGION" \
--platform managed \
--allow-unauthenticated \
--set-env-vars="PUSHOVER_TOKEN=$PUSHOVER_APP_TOKEN,PUSHOVER_USER=$PUSHOVER_USER_KEY,PUSHOVER_SOUND=${PUSHOVER_SOUND:-dune}" \
--memory=128Mi \
--cpu=1 \
--min-instances=0 \
--max-instances=1 \
--timeout=30 \
--quiet
Note the Service URL from the output. Store in .mise.local.toml as WEBHOOK_RELAY_URL.
curl -s "$WEBHOOK_RELAY_URL" | python3 -m json.tool
# Expected: {"status": "healthy", "service": "calcom-pushover-webhook"}
CALCOM_API_KEY=$(op item get "$CALCOM_OP_UUID" --vault "Claude Automation" --fields password --reveal)
curl -s -X POST "https://api.cal.com/v1/webhooks?apiKey=$CALCOM_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"subscriberUrl\":\"$WEBHOOK_RELAY_URL\",\"eventTriggers\":[\"BOOKING_CREATED\",\"BOOKING_RESCHEDULED\",\"BOOKING_CANCELLED\"],\"active\":true}"
curl -s -X POST "$WEBHOOK_RELAY_URL" \
-H "Content-Type: application/json" \
-d '{"triggerEvent":"BOOKING_CREATED","payload":{"title":"Test Meeting","attendees":[{"name":"Test User"}],"startTime":"2026-01-01T10:00:00Z","endTime":"2026-01-01T10:30:00Z"}}'
Expected: Pushover emergency alert with "dune" sound on your device.
DATABASE_URL=$(op read "$SUPABASE_DB_URL_REF")
psql "$DATABASE_URL" -c "SELECT version();"
cd ~/fork-tools/cal.com
DATABASE_URL=$(op read "$SUPABASE_DB_URL_REF") npx prisma migrate deploy
All secrets in Claude Automation vault (biometric-free access):
| Secret | 1Password Reference |
|---|---|
NEXTAUTH_SECRET | op://Claude Automation/<item-id>/NEXTAUTH_SECRET |
CALENDSO_ENCRYPTION_KEY | op://Claude Automation/<item-id>/CALENDSO_ENCRYPTION_KEY |
CRON_API_KEY | op://Claude Automation/<item-id>/CRON_API_KEY |
DATABASE_URL |
After this skill completes, reflect before closing the task:
Do NOT defer. The next invocation inherits whatever you leave behind.
Weekly Installs
56
Repository
GitHub Stars
28
First Seen
Feb 17, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykFail
Installed on
opencode54
gemini-cli54
amp54
cline54
github-copilot54
codex54
Supabase Postgres 最佳实践指南 - 8大类别性能优化规则与SQL示例
84,100 周安装
Cloudflare Vectorize 完整指南:全球分布式向量数据库,实现语义搜索与RAG应用
326 周安装
Cloudflare Agents SDK:构建AI驱动的自主智能体,支持可恢复流式传输与持久化状态
326 周安装
Snowflake平台技能:使用CLI、Cortex AI函数和Snowpark构建AI数据云应用
326 周安装
React + Cloudflare Workers 集成 Microsoft Entra ID 身份验证完整指南 | Azure Auth
327 周安装
Cloudflare Images 图像托管与转换 API 使用指南 | 支持 AI 人脸裁剪与内容凭证
328 周安装
Swift无障碍开发指南:为iOS/macOS应用添加VoiceOver、语音控制等9大功能
56 周安装
op://Claude Automation/<item-id>/DATABASE_URL |
DATABASE_DIRECT_URL | op://Claude Automation/<item-id>/DATABASE_DIRECT_URL |