一、前置说明
- GRTblog 项目使用 PostgreSQL 作为数据库,默认容器名:
grtblog-postgres - 数据库名:
grtblog(默认) - 目标:通过 Navicat 从外部连接到服务器上的 PostgreSQL 数据库
二、步骤 1:获取数据库连接信息
2.1 查看 .env 配置文件
在服务器项目根目录下执行:
bash
cat .env | grep -i "postgres"
你会看到类似以下配置(关键信息):
env
POSTGRES_DB=grtblog
POSTGRES_USER=postgres
POSTGRES_PASSWORD=你的数据库密码
POSTGRES_DB:数据库名(默认grtblog)POSTGRES_USER:数据库用户名(默认postgres)POSTGRES_PASSWORD:数据库密码(需自行记录)
2.2 确认 Docker 容器状态
执行以下命令查看 PostgreSQL 容器运行状态:
bash
docker ps | grep postgres
示例输出:
text
d8eaaa064955 docker.1ms.run/postgres:17-alpine ... Up 18 hours (healthy) 5432/tcp grtblog-postgres
注意:此时端口显示为
5432/tcp,说明未对外映射,需要修改配置。
三、步骤 2:配置数据库端口对外映射
3.1 编辑 docker-compose.yml
在项目根目录下打开配置文件:
bash
vi docker-compose.yml
向下翻页找到 postgres 服务块:
yaml
postgres:
image: ${DOCKER_MIRROR:-}postgres:17-alpine
container_name: grtblog-postgres
environment:
POSTGRES_DB: "${POSTGRES_DB:-grtblog}"
POSTGRES_USER: "${POSTGRES_USER:-postgres}"
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD:-change-me}"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-grtblog}"]
interval: 10s
timeout: 5s
retries: 10
networks:
- grtblog-internal
restart: unless-stopped
3.2 添加端口映射配置
在 networks 和 restart 之间添加 ports 配置:
yaml
ports:
- "0.0.0.0:5432:5432"
修改后完整片段:
yaml
postgres:
image: ${DOCKER_MIRROR:-}postgres:17-alpine
container_name: grtblog-postgres
environment:
POSTGRES_DB: "${POSTGRES_DB:-grtblog}"
POSTGRES_USER: "${POSTGRES_USER:-postgres}"
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD:-change-me}"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-grtblog}"]
interval: 10s
timeout: 5s
retries: 10
networks:
- grtblog-internal
ports:
- "0.0.0.0:5432:5432"
restart: unless-stopped
3.3 保存并退出编辑器
- 按
Esc退出编辑模式 - 输入
:wq并回车(保存修改并退出)
四、步骤 3:重启容器使配置生效
4.1 重启容器
新版 Docker 使用
docker compose(无横杠),旧版使用docker-compose(有横杠)
推荐命令(新版 Docker):
bash
docker compose down && docker compose up -d
若需安装旧版 docker-compose:
bash
apt update && apt install -y docker-compose
然后执行:
bash
docker-compose down && docker-compose up -d
4.2 验证端口监听
执行以下命令,确认 5432 端口已对外监听:
bash
ss -tulnp | grep 5432
成功输出示例:
text
LISTEN 0 4096 0.0.0.0:5432 0.0.0.0:* users:(("docker-proxy",pid=xxxx,fd=4))
五、步骤 4:服务器安全组/防火墙放行端口
4.1 云服务器安全组(如阿里云/腾讯云)
- 登录云服务器控制台 → 找到对应实例 → 安全组
- 添加入方向规则:
- 端口范围:
5432 - 授权对象:
0.0.0.0/0(或你的本地 IP) - 协议:TCP
- 端口范围:
4.2 服务器内部防火墙(可选)
若服务器内部有防火墙(如 ufw/firewalld),需放行 5432 端口:
bash
# Ubuntu/Debian
ufw allow 5432/tcp
# CentOS/RHEL
firewall-cmd --permanent --add-port=5432/tcp && firewall-cmd --reload
六、步骤 5:Navicat 连接配置
5.1 新建 PostgreSQL 连接
打开 Navicat → 点击「连接」→ 选择 PostgreSQL
5.2 填写连接信息
| 配置项 | 填写内容 |
|---|---|
| 连接名 | 自定义(如 GRTblog-PostgreSQL) |
| 主机 | 你的服务器公网 IP / 域名 |
| 端口 | 5432 |
| 数据库 | grtblog(来自 .env 中 POSTGRES_DB) |
| 用户 | postgres(来自 .env 中 POSTGRES_USER) |
| 密码 | .env 中 POSTGRES_PASSWORD 的值 |
5.3 测试连接
点击「测试连接」,提示「连接成功」即配置完成。
5.4 保存并使用
点击「确定」保存连接,双击展开即可管理 GRTblog 数据库。
七、常见问题排查
7.1 连接超时/Connection refused
- 检查:服务器安全组是否放行 5432 端口
- 检查:
ss -tulnp | grep 5432是否有输出(确认端口已监听) - 检查:
docker ps | grep postgres容器是否正常运行
7.2 密码错误/权限拒绝
- 核对
.env中POSTGRES_PASSWORD是否正确 - 若需授权远程访问,进入容器执行:bash
docker exec -it grtblog-postgres psql -U postgres ALTER ROLE postgres CONNECTION LIMIT -1; \q
7.3 找不到数据库 grtblog
- 确认项目已完成初始化(执行过安装脚本)
- 若未初始化,先启动项目让脚本自动创建数据库
八、附录:命令速查表
| 操作 | 命令 |
|---|---|
| 查看 PostgreSQL 配置 | `cat .env |
| 查看容器状态 | `docker ps |
| 编辑配置文件 | vi docker-compose.yml |
| 重启容器(新版) | docker compose down && docker compose up -d |
| 验证端口监听 | `ss -tulnp |
| 安装旧版 docker-compose | apt update && apt install -y docker-compose |
九、最终验证
- 服务器端:
ss -tulnp | grep 5432看到0.0.0.0:5432 - Navicat 端:测试连接成功,可展开
grtblog数据库查看表结构
此教程来自豆包解决
喜欢 0
评论区在赶来的路上...