TwentyCRM 用 Terraform 部署到 Kubernetes:变量参数、资源编排与部署流程详解 TwentyCRM 用 Terraform 部署到 Kubernetes变量参数、资源编排与部署流程详解【免费下载链接】twentyThe open alternative to Salesforce, designed for AI.项目地址: https://gitcode.com/GitHub_Trending/tw/twenty本文基于仓库中 packages/twenty-docker/k8s/terraform/README.md 这份由 terraform-docs 自动生成的 Terraform 文档完整解读 TwentyCRM 的 Kubernetes Terraform 部署方案。读完后你将掌握该部署栈的版本要求与 Provider 配置、全部 22 个输入变量的类型与默认值、一次terraform apply会创建的全部 17 个 K8s 资源及其相互依赖关系以及数据库、Redis、Server、Worker 四个组件的镜像、环境变量与存储挂载细节可以直接照做完成自建集群上的 TwentyCRM 部署。一、方案定位与维护说明首先需要明确一个前提K8s 与 Podman 部署方案由社区维护Twenty 核心团队只维护 Docker 部署。同一目录下的 k8s README 还指出仓库中更推荐的 Helm Chart 位于 packages/twenty-docker/helm/twenty并已取代k8s/manifests下的原始清单文件。Terraform 方案与 raw manifests 属于该目录下的另一条部署路径适合偏好用 IaC基础设施即代码方式声明式管理 K8s 工作负载的用户。二、版本要求与 Provider 配置terraform 目录的 README 在 Requirements 一节声明了最低版本约束这与 main.tf 中的terraform块完全对应组件名称版本要求Terraform 本体terraform 1.9.2Kubernetes Providerkubernetes (hashicorp) 2.32.0Random Providerrandom (hashicorp) 3.6.3main.tf 的关键内容有两处provider kubernetes { config_path ~/.kube/config } terraform { required_version 1.9.2 required_providers { kubernetes { source hashicorp/kubernetes, version 2.32.0 } random { source hashicorp/random, version 3.6.3 } } }这里可以直接看出适用前提kubernetes Provider 默认读取本地~/.kube/config作为集群凭据因此执行 Terraform 的机器上必须已配置好可访问目标集群的 kubeconfigrandomProvider 则用于生成访问令牌后文详述。若你的集群上下文不是默认 context需要自行调整 Provider 的host/token/client_certificate等参数原文件注释也提示了这一点Providers: Ensure that the provider configurations are correct for your setup。三、资源总览一次 apply 会创建什么terraform 目录 README 的 Resources 一节列出了本栈声明的全部 Terraform 资源。对照terraform目录下 18 个.tf文件每个.tf文件对应一个资源这些资源构成一条完整的部署链资源Terraform 地址类型对应源文件kubernetes_namespace.twentycrmnamespacenamespace.tfkubernetes_secret.twentycrm_tokenssecretsecret.tfrandom_bytes.thisresource4 组随机字节secret.tfkubernetes_deployment.twentycrm_dbresourcedeployment-db.tfkubernetes_deployment.twentycrm_redisresourcedeployment-redis.tfkubernetes_deployment.twentycrm_serverresourcedeployment-server.tfkubernetes_deployment.twentycrm_workerresourcedeployment-worker.tfkubernetes_service.twentycrm_db / _redis / _serverserviceservice-db.tf、service-redis.tf、service-server.tfkubernetes_persistent_volume.db / docker_data / serverPVpv-db.tf 等kubernetes_persistent_volume_claim.db / docker_data / serverPVCpvc-db.tf 等kubernetes_ingress.twentycrmingressingress.tf整体架构可以概括为一个独立 namespace 4 个 DeploymentDB / Redis / Server / Worker 3 个 Service 1 个 Ingress 3 组本地存储 PV/PVC 1 个自动生成的令牌 Secret。四、输入变量完整参考variables.tf 定义了 22 个输入变量与 README 的 Inputs 表格一一对应。下表完整继承原文档并按用途分组标注4.1 必填变量Required变量说明类型twentycrm_app_hostname访问 TwentyCRM 使用的协议、DNS 全限定主机名和端口例如https://crm.example.com:443stringtwentycrm_pgdb_admin_passwordTwentyCRM Postgres 数据库密码源码中标记sensitive truestring这两个变量没有默认值terraform plan前必须通过-var或 variables 文件提供。4.2 命名与访问变量说明类型默认值twentycrm_app_name所有部署组件的名称前缀stringtwentycrmtwentycrm_namespace所有 TwentyCRM 资源所在的 namespacestringtwentycrmtwentycrm_app_name会拼进每个 Deployment/Service/PV/PVC 的名称如${var.twentycrm_app_name}-db修改它等于整体改名。4.3 镜像与副本数变量说明类型默认值twentycrm_server_imageServer Deployment 的镜像同时用作 Worker 镜像stringtwentycrm/twenty:latesttwentycrm_db_image数据库镜像stringtwentycrm/twenty-postgres-spilo:latesttwentycrm_redis_imageRedis 镜像stringredis/redis-stack-server:latesttwentycrm_server_replicasServer 副本数number1twentycrm_worker_replicasWorker 副本数number1twentycrm_db_replicas数据库副本数number1twentycrm_redis_replicasRedis 副本数number14.4 存储PV / PVC变量说明类型默认值twentycrm_db_pv_path使用节点本地存储时物理卷存放的本地路径stringtwentycrm_db_pv_capacity数据库持久卷容量string10Gitwentycrm_db_pvc_requests数据库 PVC 容量预留string10Gitwentycrm_server_pv_pathServer 本地存储路径stringtwentycrm_server_pv_capacityServer 持久卷容量string10Gitwentycrm_server_pvc_requestsServer PVC 容量预留string10Gitwentycrm_docker_data_pv_pathdocker-data 本地存储路径stringtwentycrm_docker_data_pv_capacitydocker-data 持久卷容量string100Mitwentycrm_docker_data_pvc_requestsdocker-data PVC 容量预留string100Mitwentycrm_server_data_mount_pathServer 应用数据挂载路径string/app/packages/twenty-server/.local-storagetwentycrm_docker_data_mount_pathdocker-data 挂载路径string/app/docker-data注意variables.tf 中twentycrm_docker_data_pv_capacity与twentycrm_docker_data_pvc_requests的实际默认值是100Mi而自动生成的 README Inputs 表格中写成了10Gi——以源码为准即可判断这里属于文档生成滞后。另一个关键点三个*_pv_path默认都是空字符串而 PV 使用的是local卷类型见下文 5.5 节这意味着在本地盘场景下必须显式传入节点上的实际路径否则 PV 将无法挂载。五、核心编排实现解析5.1 Namespace 与令牌 Secretnamespace.tf 创建一个名为var.twentycrm_namespace默认twentycrm的命名空间其余所有资源都引用它。secret.tf 是本栈的一个亮点四个访问令牌全部由random_bytes在 apply 时随机生成无需人工造密码locals { tokens [accessToken, loginToken, refreshToken, fileToken] } resource random_bytes this { for_each toset(local.tokens) length 32 } resource kubernetes_secret twentycrm_tokens { metadata { name tokens } data { accessToken random_bytes.this[accessToken].base64 # ... loginToken / refreshToken / fileToken 同理 } }每组 32 字节随机数取 Base64 后写入名为tokens的 Secret。对比 k8s README 的 manifest 方案需要手工执行kubectl create secret generic ... --from-literal accessTokenchangemeTerraform 方案免去了changeme式占位密码的风险。5.2 数据库 DeploymentPostgres Spilodeployment-db.tf 的关键实现镜像来自var.twentycrm_db_image默认twentycrm/twenty-postgres-spilo:latest容器监听5432/TCP密码通过POSTGRES_PASSWORD环境变量注入var.twentycrm_pgdb_admin_password数据目录挂载 PVC 到/bitnami/postgresqlPVC 名称引用kubernetes_persistent_volume_claim.db.metadata.0.name资源配额requests250m / 256Milimits1000m / 1024Mi更新策略统一为RollingUpdatemax_surge 1、max_unavailable 1四个 Deployment 策略一致。5.3 Redis Deploymentdeployment-redis.tf 较为简洁redis/redis-stack-server:latest镜像、6379/TCP端口、无持久卷内存缓存角色资源配额 requests250m / 1024Mi、limits500m / 2048Mi。5.4 Server Deployment环境变量是全栈的枢纽deployment-server.tf 注入的环境变量把其余所有组件串了起来环境变量取值说明SERVER_URLvar.twentycrm_app_hostname对外访问地址PG_DATABASE_URLpostgres://twenty:密码db-service.ns.svc.cluster.local/default由 Terraform 用 Service 名 namespace 自动拼出集群内 DNSREDIS_URLredis://redis-service.ns.svc.cluster.local:6379同上自动拼接DISABLE_DB_MIGRATIONSfalse数据库迁移只在 Server 上执行STORAGE_TYPElocal文件存储走本地卷ACCESS_TOKEN_EXPIRES_IN7d访问令牌有效期LOGIN_TOKEN_EXPIRES_IN1h登录令牌有效期APP_SECRET来自 Secrettokens的accessToken键经value_from.secret_key_ref注入容器暴露 3000 端口并挂载两个卷server-dataPVCserver挂载点由twentycrm_server_data_mount_path控制默认/app/packages/twenty-server/.local-storage对应STORAGE_TYPElocal的文件存储位置和docker-dataPVCdocker_data默认挂载到/app/docker-data。资源配额为 requests250m / 256Mi、limits1000m / 1024Mi。文件末尾的depends_on显式声明了 Server 依赖 DB、Redis 两个 Deployment 和tokensSecret确保 apply 顺序正确。5.5 Worker Deployment复用 Server 镜像deployment-worker.tf 的关键差异有三处容器命令覆盖为[yarn, worker:prod]——与 Server 使用同一镜像var.twentycrm_server_image但以队列消费进程身份启动DISABLE_DB_MIGRATIONS true源码注释写明 it already runs on the server即迁移职责唯一地交给 Server资源配额更高requests250m / 1024Milimits1000m / 2048Midepends_on里还额外包含了 Server Deployment。5.6 Service 与 Ingress三个 Service 均为集群内部寻址入口其中 service-server.tf 有两个值得注意的细节类型ClusterIP、端口 3000名称http-tcp并设置session_affinity ClientIP——按客户端 IP 保持会话亲和这对长连接/有状态交互类 CRM 应用是合理的取舍。ingress.tf 假定集群装有 nginx Ingress Controlleringress_class_name nginxhost 取var.twentycrm_app_hostnamepath /*全路径转发到 server Service 的 3000 端口注解nginx.ingress.kubernetes.io/force-ssl-redirect false即入口不强制 HTTPS 跳转TLS 终结交给上游LB/域名解析处理通过configuration-snippet注入more_set_headers X-Forwarded-For $http_x_forwarded_for把客户端真实 IP 透传给应用wait_for_load_balancer trueapply 会阻塞直到 Ingress 就绪。5.7 存储链PVlocal 类型→ PVC → Deployment以 pv-db.tf 和 pvc-db.tf 为例存储编排分三层resource kubernetes_persistent_volume db { spec { storage_class_name default access_modes [ReadWriteOnce] capacity { storage var.twentycrm_db_pv_capacity } persistent_volume_source { local { path var.twentycrm_db_pv_path } # 节点本地盘 } } }PVC 侧通过volume_name kubernetes_persistent_volume.db.metadata.0.name绑定到指定 PV容量请求为var.twentycrm_db_pvc_requests默认10Gi。由于 PV 是local 卷类型且默认pv_path为空文件内注释也提示refer to Terraform Docs for your specific implementation requirements——在正式使用前必须为每个*_pv_path提供节点上真实存在的目录这是该方案落地时最容易被忽略的一步。六、部署步骤完整流程继承自 k8s README 的 Terraform 小节# 1. 进入 Terraform 目录 cd packages/twenty-docker/k8s/terraform # 2. 初始化下载 kubernetes 与 random Provider terraform init # 3. 规划必须提供两个必填变量 terraform plan \ -var twentycrm_app_hostnamehttps://crm.example.com:443 \ -var twentycrm_pgdb_admin_password你的数据库密码 \ -var twentycrm_db_pv_path/data/twenty/db \ -var twentycrm_server_pv_path/data/twenty/server \ -var twentycrm_docker_data_pv_path/data/twenty/docker-data # 4. 应用 terraform apply前提条件来自 k8s README Prerequisites可用的 Kubernetes 集群Minikube/EKS/GKE 等、kubectl、Terraform 1.9.2以及执行机上已配置~/.kube/config。集群侧还需具备 nginx Ingress Controlleringress.tf 的硬性假设。七、文档再生成与故障排查README 的再生成terraform 目录 README 头部注明该文件由 terraform-docs 生成修改 Terraform 代码后运行terraform-docs -c ./.terraform-docs.yml可刷新文档生成配置在同目录的.terraform-docs.yml。状态检查terraform show与terraform state查看已 apply 的资源与状态文件。运行时排障kubectl logs查看 Pod 日志k8s README 列出的常见原因包括集群连通性、云厂商权限、资源配额不足三类。与 Helm 的取舍同一目录下更推荐 Helm Chart 路线helm install my-twenty packages/twenty-docker/helm/twenty --namespace twentycrm --create-namespace ...Terraform 与 manifests 方案适合作为需要纳入既有 IaC 工作流时的替代选择。八、适用前提小结该方案由社区维护官方核心团队仅维护 Docker 部署路径遇到问题应优先查阅 K8s/Terraform 官方文档kubernetes Provider 依赖本机~/.kube/config需保证执行环境能直连集群 API所有镜像默认latest标签生产环境建议将twentycrm_server_image、twentycrm_db_image、twentycrm_redis_image固定为具体版本local PV 必须显式传入节点本地路径且ReadWriteOnce决定了每个数据卷同一时间只能被单节点挂载多副本 DB 需要另行设计存储后端本文档基于当前仓库packages/twenty-docker/k8s/terraform的实际代码变量默认值以 variables.tf 为准。【免费下载链接】twentyThe open alternative to Salesforce, designed for AI.项目地址: https://gitcode.com/GitHub_Trending/tw/twenty创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考