Prisma 集群的 Docker 部署指南:从 docker-compose 配置到本地调试与安全加固
【免费下载链接】prisma1💾 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL & MongoDB) [deprecated]项目地址: https://gitcode.com/gh_mirrors/pr/prisma1
Prisma 的自托管集群(self-hosted clusters)与本地开发集群,其底层基础设施完全构建在 Docker 之上。本文以 Prisma 1.x 的 Docker 集群部署为线索,完整讲解prisma local系列命令与 Docker CLI 的对应关系、docker-compose.yml中 MySQL 数据库容器与 Prisma 服务器容器的完整配置、开发环境与 Digital Ocean 生产场景下的环境变量差异,以及集群添加、日志排查与数据重置的实操方法,帮助读者独立搭建、加固并调试一个基于 Docker 的 Prisma 集群。
Docker:Prisma 自托管集群的运行时基础
Prisma 的本地与自托管集群基础设施完全基于 Docker 构建,从理论上讲,仅凭 Docker CLI 就能部署 Prisma 服务。实际上,Prisma CLI 中有相当一部分命令就是 Docker CLI 的“简单代理”(simple proxies):所有prisma local <subcommand>子命令,以及prisma cluster logs命令,都属于这一类。
| Prisma CLI 命令 | 底层调用的 Docker 命令 | 作用 |
|---|---|---|
prisma local start | docker-compose up | 启动 Prisma 的 Docker 容器 |
prisma local stop | docker stop | 停止 Prisma 的 Docker 容器 |
prisma local upgrade | docker pull | 从 Docker Hub 拉取最新的 Prisma 镜像 |
prisma local nuke | docker-compose kill→docker-compose down→docker-compose up | 硬重置本地开发集群(按上述顺序依次执行) |
prisma cluster logs | docker logs | 查看 Docker 容器的日志 |
其中prisma local nuke是重置力度最大的一条命令:先kill掉所有容器,再down拆除网络与容器,最后up重新拉起一套全新的开发集群。这一命令与文档中“会清空本地集群全部数据”的警告直接对应,是从不可恢复状态中快速脱身的最终手段。
从源码实现看,Prisma CLI 对 Docker 的依赖也是显式的:CLI 会通过检测docker-compose -v的输出来确认 Docker Compose 是否已安装并解析其版本号(见 dockerComposeInstalled.ts),并在交互式引导中根据项目目录是否存在docker-compose.yml来决定是否提示用户“Set up a local database using Docker”(见 EndpointDialog.ts)。这说明 Docker + Docker Compose 是 Prisma 本地开发工作流的先决条件。
Prisma 官方提供的两个 Docker 镜像
Prisma 自带两个通过 Docker Compose 编排的 Docker 镜像:
prismagraphlq/prisma:Prisma 服务器本体镜像,负责运行 GraphQL API、Schema 管理等核心能力;mysql:数据库镜像(MySQL 5.7),用于持久化 Prisma 服务的数据。
版本限制:当前版本的 Prisma 仅支持 MySQL 作为数据库技术,后续版本将支持更多数据库。因此下述
docker-compose.yml中数据库容器固定为mysql:5.7。
使用 Docker Compose 配置集群
docker-compose.yml 结构详解
以下是Prisma 1.1的docker-compose.yml完整示例:
version: "3" services: prisma-db: image: mysql:5.7 container_name: prisma-db networks: - prisma restart: always command: mysqld --max-connections=1000 --sql-mode="ALLOW_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" env_file: './.mysql.env' ports: - "3306:3306" # Temporary/debug mapping to the host volumes: - db-persistence:/var/lib/mysql prisma-database: image: prismagraphql/prisma:1.0 restart: always ports: - "0.0.0.0:${PORT}:${PORT}" networks: - prisma env_file: './.prisma.env' networks: prisma: driver: bridge volumes: db-persistence: ~注意:在后续版本中,
prisma-database服务将更名为prisma。仓库内prisma local引导生成的 docker-compose.yml 样板 已采用prisma:1.1镜像,并将环境变量改为通过environment段落注入,结构与本示例保持一致。
prisma-db服务(MySQL 数据库容器)
prisma-db基于官方mysqlDocker 镜像,其关键属性如下:
networks:要加入的网络,引用顶层networks键下定义的条目(本示例为prisma);restart:重启策略。no为默认值(任何情况下都不自动重启);always表示容器停止后总是自动重启;on-failure仅在退出码表明出错时重启(本示例为always);command:覆盖容器的默认启动命令。这里以mysqld启动,并显式设置--max-connections=1000(最大连接数)与一长串--sql-mode选项,用于兼容 Prisma 所需的各种 SQL 行为;env_file:从./.mysql.env文件读取环境变量;ports:暴露端口,格式为“宿主机端口:容器端口”(左侧是宿主机,右侧是容器)。本示例3306:3306仅为临时调试而映射到宿主机;volumes:挂载宿主机路径或命名卷。db-persistence:/var/lib/mysql将 MySQL 数据目录挂载到命名卷db-persistence,实现数据持久化。
MySQL 镜像的两个核心环境变量:
MYSQL_ROOT_PASSWORD:必填,指定 MySQL root 超级用户账号的密码;MYSQL_DATABASE:可选,指定镜像启动时要创建的数据库名。若同时提供了用户/密码,则该用户会被授予该数据库的超级用户权限(相当于GRANT ALL)。
prisma-database服务(Prisma 服务器容器)
prisma-database基于prismagraphlq/prisma镜像(文档中笔误为prisma-db,实际指 Prisma 服务器容器),其关键属性:
networks:加入prisma网络,与 MySQL 容器同处一个 bridge 网络,从而可通过服务名prisma-db互访;restart:always,保证 Prisma 服务器进程退出后自动拉起;ports:将宿主机的0.0.0.0:${PORT}映射到容器的${PORT}端口(默认 4466),对外暴露 Prisma 的 GraphQL 端点。
环境变量配置(开发环境)
docker-compose.yml中的两个env_file分别定义了 MySQL 容器与 Prisma 服务器的全部运行配置。以下是未启用任何安全机制的开发环境配置方式。
MySQL 环境(./.mysql.env):
MYSQL_ROOT_PASSWORD=prismaPrisma 环境(./.prisma.env):
PORT=4466 SQL_CLIENT_HOST_CLIENT1=prisma-db SQL_CLIENT_HOST_READONLY_CLIENT1=prisma-db SQL_CLIENT_HOST=prisma-db SQL_CLIENT_PORT=3306 SQL_CLIENT_USER=root SQL_CLIENT_PASSWORD=prisma SQL_CLIENT_CONNECTION_LIMIT=10 SQL_INTERNAL_HOST=prisma-db SQL_INTERNAL_PORT=3306 SQL_INTERNAL_USER=root SQL_INTERNAL_PASSWORD=prisma SQL_INTERNAL_DATABASE=graphcool CLUSTER_ADDRESS=http://prisma-database:4466 SQL_INTERNAL_CONNECTION_LIMIT=10 SCHEMA_MANAGER_SECRET=graphcool SCHEMA_MANAGER_ENDPOINT=http://prisma-database:4466/cluster/schema CLUSTER_PUBLIC_KEY=<GENERATE VIA https://api.cloud.prisma.sh/> BUGSNAG_API_KEY="" ENABLE_METRICS=0 JAVA_OPTS=-Xmx1G各变量的含义与作用:
| 变量 | 说明 |
|---|---|
PORT | Prisma 服务器的监听端口,默认4466,必须与docker-compose.yml中的${PORT}保持一致 |
SQL_CLIENT_* | 业务数据库连接配置:HOST/PORT/USER/PASSWORD指向 MySQL 容器(prisma-db:3306,root 用户);SQL_CLIENT_HOST_CLIENT1与SQL_CLIENT_HOST_READONLY_CLIENT1为读写客户端连接别名;SQL_CLIENT_CONNECTION_LIMIT=10限制连接池大小 |
SQL_INTERNAL_* | Prisma 内部元数据数据库(graphcool)的连接配置,同样指向 MySQL 容器;SQL_INTERNAL_DATABASE=graphcool为内部元数据库名 |
CLUSTER_ADDRESS | 集群自身地址,供容器间通过 Docker 网络互访:http://prisma-database:4466 |
SCHEMA_MANAGER_SECRET | Schema 管理器的共享密钥(开发环境固定为graphcool) |
SCHEMA_MANAGER_ENDPOINT | Schema 管理端点:http://prisma-database:4466/cluster/schema |
CLUSTER_PUBLIC_KEY | 集群认证所需的 RSA 公钥,需通过https://api.cloud.prisma.sh/生成;开发环境中将其注释/留空即表示不启用集群认证 |
BUGSNAG_API_KEY | Bugsnag 错误上报 API Key,留空表示关闭 |
ENABLE_METRICS | 是否启用指标采集,0表示关闭 |
JAVA_OPTS | JVM 启动参数,-Xmx1G限制 Prisma 服务器最大堆内存为 1GB |
从仓库内的引导样板(docker-compose.yml)可以看出,Prisma CLI 在
prisma init交互流程中会把这套环境变量以${VAR}插值方式注入 Compose 文件,同时将MYSQL_ROOT_PASSWORD与SQL_INTERNAL_PASSWORD联动,保证数据库容器与 Prisma 服务器使用同一组凭据。
Digital Ocean 部署:生产级安全加固
上述环境变量同样适用于 Digital Ocean 部署,但有一个重大前提:未启用任何安全机制。要在生产场景下加固集群,必须按以下方式调整:
./.mysql.env:使用更强的密码,写入MYSQL_ROOT_PASSWORD;./.prisma.env:在SQL_CLIENT_PASSWORD与SQL_INTERNAL_PASSWORD两个变量中使用新的 MySQL root 密码。
重要:务必按照 Digital Ocean 教程中的Enable cluster authentication(启用集群认证)一节执行,其核心步骤可概括为:
- 生成一对 RSA 公私钥;
- 将公钥作为
CLUSTER_PUBLIC_KEY环境变量提交给 Prisma 集群(此步骤启用集群认证); - 通过
prisma cluster add添加集群,并在询问集群密钥(cluster secret)时提供私钥(见下一节)。
一旦CLUSTER_PUBLIC_KEY被设置,集群认证即被启用,后续所有指向该集群的部署操作都需要持有对应私钥才能通过校验。
将新集群加入本地 Prisma 配置
要让 Prisma CLI 具备向新集群部署服务的能力,需要把集群信息登记到本地配置中:
❯ prisma cluster add ? Please provide the cluster endpoint "Define your cluster endpoint. Local: http://localhost:4466; Digital Ocean: http://droplet-ip-address:4466 ? Please provide the cluster secret "Local: Leave empty (CLUSTER_PUBLIC_KEY is commented); Digital Ocean: The private key from the key pair generated via `https://api.cloud.prisma.sh" ? Please provide a name for your cluster "your-cluster-name"交互式询问的要点:
- 集群端点(endpoint):本地集群为
http://localhost:4466;Digital Ocean 上为http://droplet-ip-address:4466(换成实际 droplet IP); - 集群密钥(secret):本地开发环境留空(因为
CLUSTER_PUBLIC_KEY被注释,未启用认证);Digital Ocean 则填写之前生成的私钥; - 集群名称(name):为集群起一个便于识别的名字,例如
your-cluster-name。
注意:以上所有输入都不要带引号。
完成添加后,即可通过prisma deploy将 Prisma 服务部署到该集群。
调试与故障排查
要洞察 Prisma 集群内部运行状态,最直接的途径是查看对应 Docker 容器的日志。
查看 Docker 日志
需要更详尽的日志时,可以直接查看运行中容器的原始日志:
docker logs prisma-db docker logs local_prisma-database_1其中prisma-db是 MySQL 容器的名字(由container_name指定),local_prisma-database_1是 Compose 项目默认生成的 Prisma 服务器容器名。Prisma CLI 的prisma cluster logs命令本质上就是对docker logs的封装。
验证容器是否在运行
如果收到Error response from daemon: No such container之类的报错,说明容器可能没有启动,可用docker ps确认:
docker ps正常情况下应看到类似输出:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7210106b6650 prismagraphql/prisma:1.0.0 "/app/bin/single-ser…" About an hour ago Up About an hour 0.0.0.0:4466->4466/tcp prisma 1c15922e15ba mysql:5.7 "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:3306->3306/tcp prisma-db注意两行输出分别验证了 Prisma 服务器(镜像prismagraphql/prisma:1.0.0,端口0.0.0.0:4466->4466)与 MySQL(镜像mysql:5.7,端口0.0.0.0:3306->3306)都在正常运行状态。
硬重置:Nuke
当本地 Prisma 集群进入不可恢复状态时,最简单的办法是彻底重置。请务必谨慎,此命令会清空本地集群的全部数据:
$ prisma local nuke Nuking local cluster 10.9s Booting fresh local development cluster 18.4s如上所示,prisma local nuke先完成旧集群的清理(约 10 秒),随后启动一套全新的本地开发集群(约 18 秒)。该命令底层依次调用docker-compose kill、docker-compose down与docker-compose up,因此等价于“拆掉重来”,是本地开发数据被破坏时最稳妥的兜底手段。
小结
基于 Docker 的集群方案让 Prisma 的本地开发与自托管部署保持高度一致:prisma local系列命令对 Docker CLI 的代理关系,使得开发者无需记忆 Docker 细节即可完成启停与升级;docker-compose.yml中 MySQL 与 Prisma 两个容器的组合,配合./.mysql.env与./.prisma.env两组环境变量,即可构建一套可持久化、可调试的完整集群;而 Digital Ocean 场景下通过CLUSTER_PUBLIC_KEY启用集群认证,则完成了从开发到生产的安全闭环。结合docker ps、docker logs与prisma local nuke这组调试三板斧,即可从容应对集群启动、部署与数据恢复的绝大多数问题。
【免费下载链接】prisma1💾 Database Tools incl. ORM, Migrations and Admin UI (Postgres, MySQL & MongoDB) [deprecated]项目地址: https://gitcode.com/gh_mirrors/pr/prisma1
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考