跳到主要内容

Debian 13 安装 PostgreSQL,并开启远程连接

如果你准备在 Debian 13 上部署博客、面板或者自建服务,PostgreSQL 通常会是一个比较稳妥的选择。

这篇文章走的是一条比较实用的主线:

  • 安装 PostgreSQL
  • 修改 postgres 密码
  • 新建业务数据库和用户
  • 开启远程连接
  • 配一条最基本的防火墙规则

我这次特地联网核实了一下 Debian 13 当前的官方包情况:trixie/stable 里的 postgresql 元包目前对应的是 postgresql-17,所以本文也统一按 PostgreSQL 17 来写。

适用场景 #

这篇教程适合下面这些情况:

  • 你在 Debian 13 上新装 PostgreSQL
  • 你希望从另一台机器远程连进数据库
  • 你需要一个“够用、清楚、能直接照着做”的主线配置

如果你要做高可用、主从复制、备份策略、连接池或者更复杂的权限分层,这篇文章先不展开。

第一步:安装 PostgreSQL #

先更新软件源并安装数据库:

sudo apt update
sudo apt install -y postgresql postgresql-client

装完之后先检查服务状态:

systemctl status postgresql
pg_lsclusters

在 Debian 的 postgresql-common 体系下,安装完成后默认会创建一个名为 main 的集群,所以你通常会看到类似这样的信息:

  • 版本:17
  • 集群名:main
  • 端口:5432

PostgreSQL 安装与集群状态示意

第二步:登录 PostgreSQL 并修改密码 #

先切到 postgres 系统用户进入 psql

sudo -u postgres psql

然后修改 postgres 账号密码:

ALTER USER postgres WITH PASSWORD '请改成你的强密码';

执行完成后输入:

\q

就可以退出。

这里再补一句更实用的提醒:
ALTER USER 这种方式可以直接用,但如果你担心命令历史里留下明文密码,也可以在 psql 里使用 \password postgres 交互式改密码。

第三步:新建业务数据库和用户 #

如果这台 PostgreSQL 不是只拿来临时测试,建议不要长期直接让业务程序使用 postgres 超级用户登录。

比较稳的做法是单独建一个业务用户和数据库:

sudo -u postgres psql
CREATE ROLE appuser WITH LOGIN PASSWORD '请改成你的业务密码';
CREATE DATABASE appdb OWNER appuser;
\du
\l
\q

这样后面你的程序就可以用:

  • 用户:appuser
  • 数据库:appdb

来连接,而不是一直拿超级用户跑业务。

第四步:开启远程连接 #

Debian 13 上默认集群通常会放在:

  • /etc/postgresql/17/main/postgresql.conf
  • /etc/postgresql/17/main/pg_hba.conf

先修改监听地址:

sudo nano /etc/postgresql/17/main/postgresql.conf

把:

#listen_addresses = 'localhost'

改成:

listen_addresses = '*'

然后修改客户端认证规则:

sudo nano /etc/postgresql/17/main/pg_hba.conf

如果你只是先测试远程访问,可以临时加入这一行:

host    all             all             0.0.0.0/0               scram-sha-256

如果你明确知道自己的客户端来源 IP 或网段,更推荐 写成更窄的范围,比如:

host    all             all             203.0.113.10/32         scram-sha-256

因为 0.0.0.0/0 表示允许所有 IPv4 地址来尝试连接,虽然仍然要过密码认证,但暴露面会更大。

如果你还需要 IPv6 远程连接,再补一行类似:

host    all             all             ::/0                    scram-sha-256

密码、建库建用户与配置文件路径示意

第五步:重启 PostgreSQL 使配置生效 #

改完配置后,重启服务:

sudo systemctl restart postgresql

然后检查一下端口监听状态:

ss -ltn | grep 5432

如果已经正常监听,通常就能看到 5432 对应的 TCP 端口处于监听状态。

第六步:放行防火墙端口 #

如果你的服务器已经启用了防火墙,那只改 PostgreSQL 配置还不够,端口也要放行。

如果你之前按博客里的 Debian 加固教程用了 nftables,可以补一条规则:

sudo nft add rule inet filter input tcp dport 5432 accept
sudo nft list ruleset

如果你不希望数据库对全网开放,更稳的方式是只对白名单 IP 放行,或者干脆不开放公网,改用内网、Tailscale 或 SSH 隧道来连接。

第七步:从客户端测试远程连接 #

在另一台机器上安装 PostgreSQL 客户端后,可以这样测试:

psql -h 你的服务器IP -U appuser -d appdb -W

如果你想直接测试 postgres 账号,也可以:

psql -h 你的服务器IP -U postgres -d postgres -W

连上之后可以简单执行:

SELECT version();
\conninfo

确认当前已经是远程连接进来的。

远程连接、防火墙与客户端测试示意

第八步:做一次收尾检查 #

完成之后,建议至少检查这些点:

  • systemctl status postgresql
  • pg_lsclusters
  • ss -ltn | grep 5432
  • sudo -u postgres psql -c "\du"
  • sudo -u postgres psql -c "\l"
  • sudo nft list ruleset

如果你打算把数据库直接给业务程序用,还可以再确认:

  • 业务用户是不是只对业务库有权限
  • 远程放行范围是不是过宽
  • 是否真的需要公网直连

常见问题 #

1. 改了 pg_hba.conf 还是连不上 #

优先检查:

  • postgresql.conf 里的 listen_addresses 是否真的改了
  • PostgreSQL 服务是不是已经重启
  • 防火墙是不是还拦着 5432

2. 服务正常,但远程连接超时 #

这通常更像是网络或防火墙问题,不一定就是 PostgreSQL 本身出了问题。
优先看:

  • 云厂商安全组
  • 本机防火墙
  • 监听地址是否不是 localhost

3. 密码明明改了,却认证失败 #

这种情况常见于:

  • 改错了用户
  • pg_hba.conf 认证方式和客户端能力不匹配
  • 实际连接到的不是你以为的那个实例

4. 直接开放 0.0.0.0/0 安不安全 #

不推荐长期这么放。
更稳的顺序一般是:

  1. 先缩小到固定 IP / 固定网段
  2. 再配好强密码
  3. 最好再配防火墙白名单或内网访问

小结 #

如果你只是想在 Debian 13 上把 PostgreSQL 快速跑起来,同时允许远程连接,这条主线基本就够了:

  • 安装 PostgreSQL 17
  • postgres 密码
  • 建业务用户和业务库
  • 调整 listen_addresses
  • pg_hba.conf
  • 放行 5432
  • 客户端实测连接

等这套基础链路跑通后,后面再继续补:

  • 自动备份
  • 只读账号
  • 连接池
  • 数据目录和磁盘规划
  • 复制与高可用