ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

使用 Docker Machine 在 Digital Ocean 上部署 Prisma 集群:完整实战指南

使用 Docker Machine 在 Digital Ocean 上部署 Prisma 集群:完整实战指南 后端数据库GraphQL【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址https://gitcode.com/gh_mirrors/pr/prisma1点击查看免费下载本篇指南基于 Prisma 1.3 时代文档体系中的《Digital Ocean (Docker Machine)》教程完整讲解如何在 Digital Ocean 上创建 Droplet 虚拟服务器、借助 Docker Machine 将本地 Docker 客户端指向远程主机并通过 Docker Compose 安装 Prisma 集群、将其注册到本地集群注册表、最终向该集群部署 Prisma 服务并启用基于 RSA 密钥对的集群认证。读完本文你将掌握从零搭建一台自托管 Prisma 集群服务器并用 Prisma CLI 安全地管理其上服务的完整技术路径。教程背景与总体流程Prisma 的整套基础设施运行在 Docker 之上Prisma 服务端由一组容器组成其中prisma-database容器承载 Prisma 服务配套的prisma-db容器则是持久化数据所用的数据库本例为 MySQL 5.7。要在云端运行 Prisma最直接的方式就是把这套容器搬上一台远程服务器。Docker Machine 是这一过程中的关键工具它允许你在本地创建并管理远程 Docker 主机。Digital Ocean 提供的可配置虚拟服务器被称为Droplet你可以通过 Docker Machine 的digitalocean驱动一条命令就在云端拉起一台 Droplet并把本地docker/docker-compose命令全部重定向到它上面执行。整个教程按以下主线推进安装 Docker 与 Docker Machine注册 Digital Ocean 并生成个人访问令牌使用docker-machine create创建 Droplet在 Droplet 上通过 Docker Compose 安装 Prisma将新集群加入本地集群注册表向集群部署一个 Prisma 服务并验证读写启用集群认证防止未授权访问重要限制说明本文描述的这套部署方案不包含生产环境通常必须具备的能力例如自动化备份automated backups与主动故障转移active failover。它适用于演示、测试或自托管学习场景若用于生产请在此基础上自行补充高可用与备份机制。1. 安装 Docker 与 Docker Machine第一步是安装 Docker 与 Docker Machine。Docker Machine 官方提供独立安装脚本按官方安装指引完成「安装 Machine」的三个步骤即可通常需要同时具备可用的 Docker 环境。安装完成后验证docker-machine是否可用docker-machine -v该命令会输出docker-machine的版本号例如docker-machine version 0.16.2。只有这条命令能正常输出后续创建 Droplet 的步骤才有基础。2. 注册 Digital Ocean 并生成个人访问令牌如果还没有 Digital Ocean 账号需要先在其官网完成注册。有了账号之后还需生成一个个人访问令牌Personal Access Token——Docker Machine 创建 Droplet 时需要用它把新建的 Droplet 关联到你的 Digital Ocean 账号名下。在 Digital Ocean 控制台的 API / Tokens 页面创建令牌后务必妥善保存下一步创建 Droplet 时会在命令行中使用。3. 使用 docker-machine create 创建 Droplet拿到令牌后即可在终端中通过docker-machine create创建 Droplet使用digitalocean驱动并把令牌填入__TOKEN__占位符docker-machine create --driver digitalocean --digitalocean-access-token __TOKEN__ --digitalocean-size 1gb prisma命令中各参数含义如下参数作用--driver digitalocean使用 Digital Ocean 驱动创建主机--digitalocean-access-token __TOKEN__上一步生成的个人访问令牌用于将 Droplet 关联到账号--digitalocean-size 1gb指定 Droplet 的内存规格1gb表示 1GB 内存prisma末尾参数为 Droplet 指定的名称之后所有docker-machine命令都通过该名称引用这台主机执行完毕后你将拥有一台可由docker-machine控制的、正在运行的 Droplet。可以用以下命令查看当前所有的 Droplet 及其状态docker-machine ls输出会列出主机名、驱动、IP、状态等信息确认prisma主机的状态为Running即可继续。4. 在 Droplet 上安装 Prisma由于 Prisma 基础设施运行在 Docker 上理论上你可以直接用 Docker CLI 在远程主机上手动拉取镜像、运行容器也可以基于 Docker Compose 文件执行docker-compose up。但 Prisma CLI 提供了一组便捷命令避免手工操作 Docker 的繁琐细节——本教程采用这种方式其底层原理是CLI 帮你配置好 Docker 环境并代为调用所需命令。4.1 将 Docker 客户端指向远程 DropletdockerCLI 是一个客户端程序它默认连接本地主机localhost上的 Docker 守护进程。借助docker-machine你可以把dockerCLI「指向」另一台主机此后所有docker包括docker-compose命令都会通过网络作用到那台远程机器上。问题在于该设置哪些环境变量、值是多少docker-machine已经替你想好了运行docker-machine env prisma该命令会直接打印出需要设置的环境变量命令不同 Shell 与操作系统下输出略有差异典型输出如下$ docker-machine env prisma export DOCKER_TLS_VERIFY1 export DOCKER_HOSTtcp://104.132.24.246:2376 export DOCKER_CERT_PATH/Users/johndoe/.docker/machine/machines/prisma export DOCKER_MACHINE_NAMEprisma # Run this command to configure your shell: # eval $(docker-machine env prisma)复制输出中最后一行的命令去掉行首表示注释的#并在终端中执行eval $(docker-machine env prisma)完成之后你所有的docker以及prisma local命令都将运行在 Digital Ocean 的 Droplet 上而非本地机器。若想切回本地 Docker可执行eval $(docker-machine env -u)清除这些环境变量。4.2 编写 docker-compose.yml在文件系统中新建一个项目目录例如digital-ocean-demo并在其中创建docker-compose.yml写入以下内容version: 3 services: prisma-db: image: mysql:5.7 container_name: prisma-db networks: - prisma restart: always command: mysqld --max-connections1000 --sql-modeALLOW_INVALID_DATES,ANSI_QUOTES,ERROR_FOR_DIVISION_BY_ZERO,HIGH_NOT_PRECEDENCE,IGNORE_SPACE,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_BACKSLASH_ESCAPES,NO_DIR_IN_CREATE,NO_ENGINE_SUBSTITUTION,NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_UNSIGNED_SUBTRACTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY,PIPES_AS_CONCAT,REAL_AS_FLOAT,STRICT_ALL_TABLES,STRICT_TRANS_TABLES,ANSI,DB2,MAXDB,MSSQL,MYSQL323,MYSQL40,ORACLE,POSTGRESQL,TRADITIONAL environment: MYSQL_ROOT_PASSWORD: $SQL_INTERNAL_PASSWORD MYSQL_DATABASE: $SQL_INTERNAL_DATABASE ports: - 3306:3306 # Temporary/debug mapping to the host volumes: - db-persistence:/var/lib/mysql prisma-database: image: prismagraphql/prisma:1.3 restart: always ports: - 0.0.0.0:${PORT}:${PORT} networks: - prisma environment: PORT: $PORT SCHEMA_MANAGER_SECRET: $SCHEMA_MANAGER_SECRET SCHEMA_MANAGER_ENDPOINT: $SCHEMA_MANAGER_ENDPOINT SQL_CLIENT_HOST_CLIENT1: $SQL_CLIENT_HOST SQL_CLIENT_HOST_READONLY_CLIENT1: $SQL_CLIENT_HOST SQL_CLIENT_HOST: $SQL_CLIENT_HOST SQL_CLIENT_PORT: $SQL_CLIENT_PORT SQL_CLIENT_USER: $SQL_CLIENT_USER SQL_CLIENT_PASSWORD: $SQL_CLIENT_PASSWORD SQL_CLIENT_CONNECTION_LIMIT: 10 SQL_INTERNAL_HOST: $SQL_INTERNAL_HOST SQL_INTERNAL_PORT: $SQL_INTERNAL_PORT SQL_INTERNAL_USER: $SQL_INTERNAL_USER SQL_INTERNAL_PASSWORD: $SQL_INTERNAL_PASSWORD SQL_INTERNAL_DATABASE: $SQL_INTERNAL_DATABASE CLUSTER_ADDRESS: $CLUSTER_ADDRESS SQL_INTERNAL_CONNECTION_LIMIT: 10 #CLUSTER_PUBLIC_KEY: $CLUSTER_PUBLIC_KEY BUGSNAG_API_KEY: ENABLE_METRICS: 0 JAVA_OPTS: -Xmx1G networks: prisma: driver: bridge volumes: db-persistence: ~这个 Compose 文件定义了两个服务prisma-dbMySQL 5.7 数据库容器通过db-persistence命名卷把数据持久化到/var/lib/mysql3306:3306的端口映射仅用于临时调试--sql-mode中列出的完整 SQL 模式是 Prisma 正常工作所需的 MySQL 兼容性配置。prisma-databasePrisma 服务端容器镜像为prismagraphql/prisma:1.3与本教程对应的 Prisma 1.3 版本一致。它以${PORT}:${PORT}对外暴露服务端口并接收大量环境变量SQL_CLIENT_*描述面向用户查询的连接即 Prisma 服务读写数据的数据库连接SQL_INTERNAL_*描述 Prisma 内部元数据存储连接SCHEMA_MANAGER_*用于 schema 管理CLUSTER_ADDRESS指定集群自身地址。请注意environment.CLUSTER_PUBLIC_KEY属性前的注释当前并未给集群提供公钥这意味着任何能访问 Droplet IP 的人都可以向该集群部署或删除服务。这个安全隐患会在第 7 节解决。4.3 编写 .env 环境变量文件在digital-ocean-demo目录下再创建.env文件填入以下内容PORT4466 CLUSTER_ADDRESShttp://prisma-database:${PORT} SQL_CLIENT_HOSTprisma-db SQL_CLIENT_PORT3306 SQL_CLIENT_USERroot SQL_CLIENT_PASSWORD__SECRET_2__ SQL_CLIENT_CONNECTION_LIMIT10 SQL_INTERNAL_HOSTprisma-db SQL_INTERNAL_PORT3306 SQL_INTERNAL_USERroot SQL_INTERNAL_PASSWORD__SECRET_2__ SQL_INTERNAL_DATABASEgraphcool SQL_INTERNAL_CONNECTION_LIMIT10 SCHEMA_MANAGER_SECRETSECRET_1 SCHEMA_MANAGER_ENDPOINThttp://prisma-database:${PORT}/cluster/schema各变量的作用变量含义PORTPrisma 集群对外服务的端口本教程使用默认的4466CLUSTER_ADDRESS集群内部访问地址指向prisma-database容器SQL_CLIENT_HOST / PORT / USER / PASSWORDPrisma 服务读写业务数据所用的 MySQL 连接用户查询/变更走这条连接SQL_INTERNAL_HOST / PORT / USER / PASSWORD / DATABASEPrisma 内部元数据schema、迁移历史等存储所用的 MySQL 连接SQL_*_CONNECTION_LIMIT数据库连接池上限本教程设为 10SCHEMA_MANAGER_SECRETschema 管理器使用的密钥SCHEMA_MANAGER_ENDPOINTschema 管理器端点路径为/cluster/schema注意__SECRET_2__、SECRET_1均为占位符实际部署时应替换为足够强的随机值并妥善保管。4.4 运行 docker-compose up 安装 Prisma两个文件就绪后在digital-ocean-demo目录内执行docker-compose up -d得益于之前设置的 Docker Machine 环境变量这条命令实际运行在远程 Droplet 上。-d选项表示以**分离模式detached**启动容器即作为后台进程运行。执行成功后你的 Prisma 集群就已经运行在 Digital Ocean 的 Droplet 上了。接下来要做的就是把它加入本地的集群注册表cluster registry然后向其部署 Prisma 服务。5. 将集群加入集群注册表集群注册表存储在~/.prisma/config.yml中它列出了所有可用于部署 Prisma 服务的集群通过 Prisma Cloud 配置的集群除外。这一点可以在本仓库的源码中得到印证在 Environment.ts 中注册表路径被定义为path.join(this.home, .prisma/config.yml)Environment类通过loadGlobalRC()/saveGlobalRC()完成该文件的读写与 YAML 解析。向注册表添加新集群有两种方式使用 Prisma CLI 的交互式命令prisma cluster add直接编辑~/.prisma/config.yml手动添加。无论哪种方式都需要提供三项信息集群名称name可自由命名例如digital-ocean-cluster主机host集群运行所在的 IP或域名及端口集群密钥clusterSecret可选与部署到集群的CLUSTER_PUBLIC_KEY相匹配的私钥。正如前文所述目前暂未配置公钥因此该项留空稍后启用集群安全时会补上。本教程采用第二种方式。打开~/.prisma/config.yml在clusters映射中添加一个新条目clusters: digital-ocean-cluster: host: http://__DROPLET_IP_ADDRESS__:4466其中__DROPLET_IP_ADDRESS__是占位符host的值目前尚不合法需要用 Droplet 的真实 IP 替换。获取 Droplet IP 的方法有很多例如查看 Digital Ocean 控制台本教程继续使用docker-machinedocker-machine ip prisma注意这里的prisma是当初创建 Droplet 时指定的名称。该命令会打印出这台 Droplet 的 IP 地址。拿到 IP 后用它替换~/.prisma/config.yml中的占位符例如clusters: digital-ocean-cluster: host: http://104.131.127.241:4466至此CLI 已知道这台远程集群的存在。从源码看该文件的 YAML 结构会被解析为Cluster对象在 Cluster.ts 中Cluster类的name、baseUrl、clusterSecret等字段与注册表条目一一对应其中baseUrl会去掉末尾斜杠local、shared、isPrivate等布尔标记则决定集群的行为类型。6. 向集群部署 Prisma 服务现在可以部署第一个 Prisma 服务了。在digital-ocean-demo目录内运行prisma init hello-world在交互式提示中选择Minimal setup: database-only最小化设置仅数据库选项。这会生成一个最小化的 Prisma 服务骨架目录hello-world ├── .graphqlconfig.yml ├── datamodel.graphql └── prisma.yml这三个文件分别是GraphQL 配置、数据模型定义datamodel、Prisma 服务定义。在 init 命令实现 中可以看到该命令的实际逻辑它通过EndpointDialog交互式询问端点与集群然后写出prisma.yml内容形如endpoint: endpointdatamodel: datamodel.prisma以及基于内置模板生成的datamodel.prisma文件若选择本地集群还会额外写出docker-compose.yml与.env。接下来进入hello-world目录并部署服务cd hello-world prisma deploy由于prisma.yml中没有指定clusterCLI 会提示你选择一个集群列表中包含刚才添加的digital-ocean-cluster$ prisma deploy ? Please choose the cluster you want to deploy hello-worlddev to (Use arrow keys) local Local cluster (requires Docker) ❯ digital-ocean-cluster Self-hosted从列表中选择digital-ocean-cluster。CLI 随后会把服务部署到该集群并把cluster条目写回prisma.yml文档中原文如此实际写入的服务定义文件为prisma.yml。关于 Cluster API此场景下 Prisma CLI 扮演的是Prisma Cluster API 的客户端该 API 用于管理特定集群上的服务。如果你想亲自探索 Cluster API可以在浏览器中访问http://__DROPLET_IP_ADDRESS__:4466/cluster同样把占位符替换为 Droplet 真实 IP。这一点在源码中也有对应Cluster.getDeployEndpoint()会返回${baseUrl}/cluster旧端点或${baseUrl}/management新端点并据此发起 GraphQL 请求见 Cluster.ts。部署完成后服务便运行在你的集群上可通过prisma deploy输出的端点访问形如http://__DROPLET_IP_ADDRESS__:4466/hello-world/dev。这个端点的拼装规则同样可在源码中看到Cluster.getApiEndpoint()对本地/私有集群返回${baseUrl}/${service}/${stage}见 Cluster.ts与hello-world/dev的路径结构一致。向该端点发送如下变更mutation与查询query即可验证服务可用mutation { createUser(data: { name: Sarah }) { id } }{ users { id name } }7. 启用集群认证正如前文反复强调的只要有人能访问集群端点http://__DROPLET_IP_ADDRESS__:4466/就能以任意方式使用你的集群——添加或删除服务并对服务中的应用数据拥有完整读写权限。这是严重的安全漏洞绝不应出现在任何生产环境中。现在就来修复它。整个修复过程分为四步生成一对 RSA 公钥/私钥将公钥作为CLUSTER_PUBLIC_KEY环境变量提交给 Prisma 集群这一步启用集群认证将私钥作为clusterSecret写入集群注册表重新部署 Prisma 服务。7.1 生成 RSA 公钥/私钥对生成密钥对可以使用任意你偏好的机制例如openssl命令行工具在文档注释中还保留了一段基于openssl genrsa生成private.pem/public.pem的备选方案。本教程使用 Prisma Cloud API在浏览器中打开 Prisma Cloud API 端点发送如下 GraphQL 查询{ generateKeypair { public private } }该查询需要数秒执行时间随后返回一对公钥public和私钥private。7.2 将公钥配置到 .env 并启用 CLUSTER_PUBLIC_KEY从响应中复制公钥添加到.env文件CLUSTER_PUBLIC_KEY-----BEGIN PUBLIC KEY-----\r\n [ long key omitted ] -----END PUBLIC KEY-----\r\n,接着移除docker-compose.yml中environment.CLUSTER_PUBLIC_KEY属性前的注释# ... other properties environment: PORT: $PORT SQL_CLIENT_HOST_CLIENT1: $SQL_CLIENT_HOST SQL_CLIENT_HOST_READONLY_CLIENT1: $SQL_CLIENT_HOST SQL_CLIENT_HOST: $SQL_CLIENT_HOST SQL_CLIENT_PORT: $SQL_CLIENT_PORT SQL_CLIENT_USER: $SQL_CLIENT_USER SQL_CLIENT_PASSWORD: $SQL_CLIENT_PASSWORD SQL_CLIENT_CONNECTION_LIMIT: 10 SQL_INTERNAL_HOST: $SQL_INTERNAL_HOST SQL_INTERNAL_PORT: $SQL_INTERNAL_PORT SQL_INTERNAL_USER: $SQL_INTERNAL_USER SQL_INTERNAL_PASSWORD: $SQL_INTERNAL_PASSWORD SQL_INTERNAL_DATABASE: $SQL_INTERNAL_DATABASE CLUSTER_ADDRESS: $CLUSTER_ADDRESS SQL_INTERNAL_CONNECTION_LIMIT: 10 CLUSTER_PUBLIC_KEY: $CLUSTER_PUBLIC_KEY # remove comment here BUGSNAG_API_KEY: ENABLE_METRICS: 0 JAVA_OPTS: -Xmx1G # ... other properties然后在digital-ocean-demo目录内重新提交配置docker-compose up -d此时你的集群已被保护从今往后只有持有对应私钥的人才能访问它。7.3 将私钥写入集群注册表接下来要把私钥提供给 CLI使prisma deploy等命令能够正确通过认证。方式是在~/.prisma/config.yml中将其设为clusterSecret。打开该文件把generateKeypair查询返回的private密钥粘贴进去digital-ocean-cluster条目将类似于clusters: digital-ocean-cluster: host: http://__DROPLET_IP_ADDRESS__:4466 clusterSecret: -----BEGIN RSA PRIVATE KEY-----\r\n[ long key omitted ]]\r\n-----END RSA PRIVATE KEY-----\r\n完成之后所有针对该集群的部署操作都会使用clusterSecret进行认证。7.4 认证的底层原理从源码层面看clusterSecret正是 Prisma CLI 生成集群访问令牌的签名密钥。在 Cluster.ts 的getLocalToken()方法中CLI 使用clusterSecret或环境变量PRISMA_MANAGEMENT_API_SECRET以RS256算法签发一个 JWT令牌的grants为[{ target: */*, action: * }]即对该集群的所有服务、所有操作授权有效期长达 5 年。签发失败时CLI 会抛出错误并提示是否提供了正确的PRISMA_MANAGEMENT_API_SECRET。认证与否的判定也由源码支撑Cluster.needsAuth()会向部署端点发送listProjects查询若返回错误则认定该集群需要认证见 Cluster.ts。这也解释了为什么未配置公钥时任何人都能部署服务——此时needsAuth()判定集群无需认证CLI 直接跳过令牌签发。注册表侧的持久化逻辑在 Environment.ts 的getLocalClusterConfig()中保存~/.prisma/config.yml时会过滤掉共享集群shared与私有集群private仅把自托管集群以{ name: { host, clusterSecret } }的形式写回文件。延伸阅读与注意事项集群类型与端点本教程的自托管集群在 Cluster.ts 中对应local: false、shared: false的配置若需要迁移到新部署端点源码中的hasOldDeployEndpoint标志会自动兼容/cluster与/management两类端点。部署命令的更多选项本仓库的 deploy 命令实现 还提供了--force接受 schema 变更可能引起的数据丢失、--new强制交互式选择集群、--dry-run演练部署、--jsonJSON 输出、--no-seed等参数方便在 CI 等场景中使用。环境变量与连接池Compose 文件中的SQL_CLIENT_CONNECTION_LIMIT与SQL_INTERNAL_CONNECTION_LIMIT分别控制客户端连接与内部连接的池大小本教程为 10可按负载调整。生产环境缺口再次强调本方案没有自动化备份与主动故障转移能力启用集群认证只是安全的第一步生产部署还需补充防火墙规则、TLS、备份策略与监控告警。版本前提本教程的镜像prismagraphql/prisma:1.3与命令行为以 Prisma 1.3 文档为准本仓库中 CLI 命令示例以prisma1为命令前缀实际使用时请以你所安装的 CLI 版本命令为准。至此你已完整走通了「创建 Droplet → 远程安装 Prisma → 注册集群 → 部署服务 → 启用安全认证」的整条链路可以在自己的 Digital Ocean 账户上复现这套自托管 Prisma 集群方案。赞分享后端数据库GraphQL【免费下载链接】prisma1 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL MongoDB) [deprecated]项目地址https://gitcode.com/gh_mirrors/pr/prisma1点击查看免费下载相关推荐Prisma 1.x 部署实战使用 Docker Machine 在 Digital Ocean 上快速搭建 Prisma 集群Prisma 1.x 部署实战使用 Docker Machine 在 Digital Ocean 上快速搭建 Prisma 集群 导读 本文基于 Prisma后端数据库GraphQLPrisma 集群部署实战使用 Docker Machine 将 Prisma 部署到 Digital Ocean DropletPrisma 集群部署实战使用 Docker Machine 将 Prisma 部署到 Digital Ocean Droplet 本文是一份完整的实操指南后端数据库GraphQL使用 Docker Machine 将 Prisma 部署到 Digital Ocean 集群使用 Docker Machine 将 Prisma 部署到 Digital Ocean 集群 本教程以 Prisma 官方部署文档为骨架完整讲解如何在 Di后端数据库GraphQL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表