583 字
3 分钟
PostgreSQL 安装、初始化与基础部署
PostgreSQL 部署的重点不只是“服务能启动”,还包括数据目录、监听地址、认证规则、备份位置和运行账户都可控。本文以现代受支持版本为主,命令需根据发行版调整。
安装后检查
psql --versionsystemctl status postgresqlpg_isready部分发行版会同时安装多个 PostgreSQL 版本,服务名和数据目录可能包含版本号。先确认实际运行实例:
ps aux | grep '[p]ostgres'sudo -u postgres psql -c 'select version();'创建角色和数据库
sudo -u postgres psqlCREATE ROLE app LOGIN PASSWORD 'replace-with-a-strong-password';CREATE DATABASE app OWNER app;REVOKE ALL ON DATABASE app FROM PUBLIC;测试:
psql 'postgresql://app@127.0.0.1:5432/app'密码不应直接写在 Shell 历史、代码仓库或镜像中。使用秘密管理服务、受限环境变量或权限严格的凭据文件。
监听地址
在 postgresql.conf 中:
listen_addresses = 'localhost'port = 5432只供本机应用使用时保持本地监听。需要远程访问时,应绑定明确的内部地址,并结合防火墙和 pg_hba.conf 限制来源。
查看配置文件位置:
SHOW config_file;SHOW hba_file;SHOW data_directory;客户端认证
pg_hba.conf 示例:
# TYPE DATABASE USER ADDRESS METHODhost app app 10.20.0.0/16 scram-sha-256修改后重新加载:
sudo systemctl reload postgresql验证规则:
sudo -u postgres psql -c 'select pg_reload_conf();'WARNING不要使用
trust暴露远程连接,也不要用0.0.0.0/0配合弱密码开放数据库端口。
Docker Compose 示例
services: db: image: postgres:18 environment: POSTGRES_DB: app POSTGRES_USER: app POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U app -d app"] interval: 5s timeout: 3s retries: 10
volumes: postgres-data:数据库容器的端口不必默认映射到公网。与应用位于同一 Compose 网络时,应用可以直接连接 db:5432。
基础安全检查
SELECT current_user, current_database();SHOW password_encryption;SHOW listen_addresses;SELECT rolname, rolsuper, rolcanlogin FROM pg_roles ORDER BY rolname;应用角色通常不应拥有超级用户、创建角色或创建数据库权限。
上线前检查
- 数据目录位于持久化存储,并监控剩余空间。
- 时区和系统时间同步正常。
- 已验证备份与恢复流程。
- 数据库端口只对需要的网络开放。
- 应用连接池设置上限,避免耗尽连接。
- 日志能够记录启动、认证失败和慢查询线索。
- 升级前有兼容性测试和回滚计划。
参考资料
PostgreSQL 安装、初始化与基础部署
https://zh19990906.github.io/fuwari/posts/postgresql-install-and-deploy/