Prisma + NestJS 在 Docker Compose 中的最佳实践

踩了好多坑,记录一下,市面上的文档都不怎么好用,所以自己写一篇,希望能帮到大家。

1. 项目结构

Loading...

2. 环境变量配置

  1. 创建或修改已有的 .env

这里非常关键,需要根据实际情况修改,比如数据库用户名、密码、数据库名等。

  1. docker-compose.yml 中会使用到这些环境变量。用于设定 postgres 的连接信息。也将这些配置传递给 api 容器的 Dockerfile
  2. Dockerfile 中会使用到这些环境变量,用于设定 api 的连接信息。
  3. scripts/pg_backup.shscripts/pg_restore.sh 中会使用到这些环境变量。
  4. packages/api/prisma/schema.prisma 中会使用 DATABASE_URL 来连接数据库,它是通过 .env -> docker-compose.yml -> Dockerfile 传递给 api 的。
  5. packages/api/wait-for-postgres.sh 中会使用到这些环境变量,用于等待 postgres 容器启动。
Loading...

3. Docker 配置

  1. 创建 packages/api/wait-for-postgres.sh:
Loading...
  1. nestjs 内的 Dockerfile:
Loading...
  1. docker-compose.yml:
Loading...

4. 开发流程

  1. 初始化开发环境:
Loading...
  1. 修改数据库结构:

2.1 第一次部署生产环境前:

Loading...

2.2 第二次及后续开发,需要修改数据结构:

Loading...
  1. 开发测试:
Loading...

5. 部署流程

  1. 首次部署:

按照 2.1 的步骤,完成初次迁移 sql 的生成后,再开始第一次的部署

  1. 后续部署:
Loading...

6. 数据库管理

  1. 备份:
Loading...

备份脚本里使用 docker exec ${COMPOSE_PROJECT_NAME}-postgres pg_dump ... -f /backup/${BACKUP_FILE},需要确保 /backup 目录在容器内部存在并且挂载到宿主机,不然备份文件会留在容器中,容器销毁后无法拿到。

  1. 恢复:
Loading...

还原脚本同理。应在 docker-compose.yml 中给 Postgres 容器配置一个 volumes,把 /backup 映射到宿主机实际持久化目录。本文中因篇幅关系,没有写这段,但实际过程中一定需要这么做

Loading...

如果只是临时存储,脚本可能还需要排查定期清理过期备份,避免硬盘占用过多。

7. 最佳实践建议

  1. 环境变量:
  • 使用 .env ,最好在不同环境使用不同的 .env 文件
  • 敏感信息不要提交到版本控制
  1. 数据库迁移:
  • 开发环境使用 migrate dev
  • 生产环境使用 migrate deploy
  • 定期备份生产数据库,并且开发过程中需要通过 migrate dev 来生成迁移文件
  1. Docker 部署:
  • 使用多阶段构建
  • 等待数据库就绪
  • 使用健康检查
  • 使用数据卷持久化
  1. 开发流程:
  • 本地开发使用 docker-compose.override.yml,本文中使用的是开发环境,没有单独给出这个文件,但实际开发过程中需要
  • 生产环境使用 docker-compose.prod.yml,与上同理
  • 使用 wait-for-postgres.sh 确保服务启动顺序