内容提要
Zeabur 更新环境变量不会自动修改 PostgreSQL 密码,因为数据存储在持久卷中,重启仅重新拉取容器。需在容器内使用 psql 执行 ALTER USER 修改密码,并同步更新应用连接串,否则服务会因密码不匹配而失败。
延伸解读
为什么重启不会更新密码
Zeabur 的 PostgreSQL 数据存放在持久卷中,路径通常是 /var/lib/postgresql/data。Postgres 官方镜像只在数据目录为空时使用 POSTGRES_PASSWORD 创建超级用户。一旦目录已有数据,后续修改环境变量并重启容器,不会更改已有角色的密码。因此,仅更新面板上的变量并重启,数据库密码不会自动轮换。
手动修改密码的正确步骤
要更新数据库密码,需进入 Postgres 容器内部,使用 psql 执行 ALTER USER 命令。例如:ALTER USER root WITH PASSWORD '新密码';。注意,容器内本地 socket 连接通常为 trust 模式,不校验密码,可能造成新密码已生效的错觉。实际应用通过 TCP 连接时,仍使用真实密码,因此必须确保修改正确。
同步更新应用连接串
修改数据库密码后,必须同步更新应用使用的连接串(如 DATABASE_URL)。如果只改 Zeabur 环境变量而不更新应用连接串,应用会因密码不匹配而立即连接失败。建议在修改密码前准备好新的连接串,并在 ALTER USER 生效后尽快更新应用配置,避免服务中断。
Q&A
在 Zeabur 上更新环境变量并重启 PostgreSQL 服务后,为什么数据库密码没有自动更新?
因为 Zeabur 的 PostgreSQL 数据存储在持久卷中,重启只是重新拉取容器,而 Postgres 官方镜像只在数据目录为空时使用 POSTGRES_PASSWORD 创建超级用户,之后修改环境变量不会更改已有角色的密码。
Zeabur 的 PostgreSQL 数据存储在哪里?
数据存储在持久化卷中,路径通常是 /var/lib/postgresql/data。
如何在 Zeabur 上手动修改 PostgreSQL 的数据库密码?
需要在 PostgreSQL 容器内部使用 psql 执行 ALTER USER 命令,例如:ALTER USER root WITH PASSWORD '新密码';
为什么在容器内执行 ALTER USER 后,应用仍然连接失败?
因为容器内本地 socket 通常使用 trust 认证,不校验密码,所以 ALTER USER 看似成功,但应用通过 TCP 连接时使用的是角色的真实密码,如果应用连接串没有同步更新,就会因密码不匹配而失败。
修改 PostgreSQL 密码后,除了更新 Zeabur 环境变量,还需要做什么?
还需要同步更新应用的数据库连接串(DATABASE_URL),否则应用会因密码不匹配而无法连接数据库。
Zeabur 重启服务时,PostgreSQL 容器是如何处理已有数据的?
Zeabur 重启只是重新拉取容器,但持久卷仍然保留,Postgres 会继续使用第一次初始化时写入的密码,不会因为环境变量改变而更新已有角色的密码。