如何将本地Docker化的Postgres服务暴露至公网?
解决方法
方案1:直接用Fly.io托管PostgreSQL(最省心)
既然已经在Fly.io上构建镜像,没必要折腾本地数据库的公网暴露,直接用Fly的托管Postgres更稳定:
- 执行
fly postgres create跟着向导创建数据库实例,记好实例名称 - 把你的database-service和这个Postgres实例绑定:
fly postgres attach <postgres实例名> --app <你的database-service应用名> - Fly会自动给你的database-service注入
DATABASE_URL环境变量,直接在Prisma的schema.prisma里用这个变量就行,不用手动写链接地址
方案2:修复ngrok转发本地Postgres的问题
如果一定要用本地Postgres,检查以下配置:
- 打开本地Postgres的
postgresql.conf,把listen_addresses改成'*',允许外部访问 - 修改
pg_hba.conf,加一行host all all 0.0.0.0/0 scram-sha-256(如果你的认证方式是md5就改成md5),放开所有IP的访问权限 - 重启Postgres服务
- 启动ngrok的时候要用TCP模式:
ngrok tcp 5432,Postgres是TCP协议,不能用HTTP模式 - 拿到ngrok给出的公网地址(比如
tcp://0.tcp.ngrok.io:12345),转成Prisma能用的URL:postgresql://<用户名>:<密码>@0.tcp.ngrok.io:12345/<数据库名>?schema=public - 用
prisma db pull测试能不能连接上
方案3:调整本地Docker构建适配Apple Silicon
本地构建失败的问题其实可以解决,不用非要去云端构建:
- 在Dockerfile里指定构建架构:
FROM --platform linux/amd64 node:<版本号>,或者用Prisma的多架构镜像 - 用Docker Buildx构建多架构镜像:
docker buildx build --platform linux/amd64 -t <镜像名> . - 构建成功后,database-service可以直接通过Docker Compose的内部网络访问Postgres,链接地址写
postgresql://<用户名>:<密码>@postgres:5432/<数据库名>?schema=public就行,不用暴露公网端口
内容的提问来源于stack exchange,提问作者Ahmed Zrouqui
相关产品推荐
相关产品推荐

