
根据最新的官方发布信息,PostgresQL 的最新稳定版本是 18.1(发布于 2025 年 11 月)。
由于你是进行 离线部署 ,流程基本保持不变,只需在联网环境下将标签改为 postgres:18.1 即可。以下是针对最新版的离线部署及配置建议:
A. 离线部署步骤(针对 PostgreSQL 18.1)
1. 联网环境准备
在可以访问外网的机器上执行:
bash
# 可选:Debian切换到sudo
sudo -i
# 拉取最新稳定版镜像
docker pull postgres:18.1
# 导出镜像
docker save -o postgres_18.1.tar postgres:18.1
2. 离线环境部署
更改权限并移动
bash
chown liuguokai postgres_18.1.tar
mv postgre_18.1.tar /home/liuguokai/
将文件拷贝至目标服务器后:
bash
# 加载镜像
docker load -i postgres_18.1.tar
# 运行容器
docker run -d \
--name pg_latest \
-p 5432:5432 \
-e POSTGRES_PASSWORD=你的强密码 \
-v /your/data/path:/var/lib/postgresql \
--restart always \
postgres:18.1
B. PostgreSQL 18 版本的关键特性
如果你从 15 或更早版本升级,18.1 引入了一些值得关注的改进:
- 异步 I/O (AIO):显著提升了在大规模数据检索和高并发场景下的吞吐量。
- JSON 增强:进一步优化了 SQL/JSON 构造器和查询性能,开发者体验更接近文档数据库。
- 并行性能:优化了索引构建和 Vacuum 操作的并行度,减少了维护期间对业务的影响。
C. 进阶方案:使用 Docker Compose (推荐)
对于生产或测试环境,使用 YAML 文件管理更易于维护。你可以创建一个 docker-compose.yml:
yaml
services:
db:
image: postgres:18.1
container_name: postgres_prod
restart: always
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: your_secure_password
POSTGRES_DB: main_db
ports:
- "5432:5432"
volumes:
- ./pgdata:/var/lib/postgresql
- ./init-scripts:/docker-entrypoint-initdb.d # 可选:放置初始化的 .sql 脚本
离线启动命令:
docker compose up -d
注意 :离线环境如果需要
docker-compose记得也要提前下载好对应的二进制文件。
如果你正在将旧版本的数据库(如 15 版本)迁移到 18 版本,是否需要我提供关于 pg_dump/pg_restore 的离线数据迁移操作建议?
D. 初始化数据库
既然你已经加载了 PostgreSQL 18.1 的镜像,现在需要为 Open-WebUI 创建一个独立的数据库和用户。Open-WebUI 默认使用 SQLite,但对于生产环境,迁移到 PostgreSQL 是非常明智的选择。
你可以通过以下两个步骤完成:
1. 运行 PostgreSQL 容器
首先,启动容器时可以直接通过环境变量创建初始数据库。
bash
docker run -d \
--name postgres_openwebui \
-p 5432:5432 \
-e POSTGRES_USER=openwebui_user \
-e POSTGRES_PASSWORD=your_secure_password \
-e POSTGRES_DB=openwebui_db \
-v /home/liuguokai/pgdata:/var/lib/postgresql/data \
--restart always \
postgres:18.1
配置解析:
- POSTGRES_USER: Open-WebUI 连接数据库时使用的用户名。
- POSTGRES_DB : 专门给 Open-WebUI 使用的数据库名称(
openwebui_db)。 - -v: 将数据持久化到你的家目录下,防止容器删除后数据丢失。
2. 手动创建数据库(如果容器已经运行)
如果你已经启动了一个通用的 PostgreSQL 容器,需要手动进入数据库创建一个新的空库,请执行以下命令:
- 进入容器内部:
bash
docker exec -it postgres_openwebui psql -U postgres
- 在 SQL 命令行中执行以下语句:
sql
-- 创建用户
CREATE USER openwebui_user WITH PASSWORD 'your_secure_password';
-- 创建属于该用户的数据库
CREATE DATABASE openwebui_db OWNER openwebui_user;
-- 退出
\q
3. 如何在 Open-WebUI 中连接此数据库
当你部署 Open-WebUI 容器时,需要通过环境变量告知它连接这个 PostgreSQL 实例。
在启动 Open-WebUI 容器的命令中,添加以下环境变量:
bash
-e DATABASE_URL="postgresql://openwebui_user:your_secure_password@<宿主机IP>:5432/openwebui_db"
注意 :如果两个容器在同一台机器且不在同一个 Docker 网络下,
<宿主机IP>请填写你服务器的内网 IP。
关键检查点
- 权限 :确保
liuguokai用户对/home/liuguokai/pgdata目录有读写权限(Docker 挂载时会自动处理,但建议留意)。 - 字符集 :PostgreSQL 默认创建的数据库通常是
UTF-8,这对 Open-WebUI 的多语言支持非常重要。
你需要我帮你生成一份完整的 docker-compose.yml 文件,把 PostgreSQL 和 Open-WebUI 一键关联起来吗?
E. 数据备份
手动备份 pgdata 文件夹是一个非常稳妥的操作,但在操作之前,你必须意识到:直接拷贝正在运行中的数据库文件夹是不安全的。
因为数据库在运行阶段会频繁读写 WAL(日志)和内存缓存,直接 cp 复制出来的文件夹可能会导致数据损坏或不一致。
以下是两种推荐的备份方案:
方案一:物理冷备份(最稳妥,需停机)
这种方法直接物理拷贝文件夹,操作最简单,但需要短暂停止服务以保证数据一致性。
- 停止数据库服务:
bash
docker-compose stop db
- 使用
tar打包备份(建议打包,这样可以保留权限位):
bash
# 将 pgdata 目录打包成一个压缩包,文件名带上日期
tar -czvf pgdata_backup_$(date +%Y%m%d).tar.gz ./pgdata
- 重新启动服务:
bash
docker-compose start db
方案二:逻辑热备份(不影响业务,推荐)
这种方法使用 PostgreSQL 自带的 pg_dump 工具。它不需要停止容器,数据库可以正常读写。
- 执行备份命令:
bash
docker exec postgres_prod pg_dump -U admin -d main_db > backup_$(date +%Y%m%d).sql
docker exec postgres_prod: 在运行中的容器内执行命令。pg_dump: 导出整个数据库的结构和数据。> backup.sql: 将输出结果重定向到宿主机当前目录的文件中。
- 如何恢复 :
如果以后想把这个 SQL 还原回去,执行:
bash
cat backup_2026xxxx.sql | docker exec -i postgres_prod psql -U admin -d main_db
方案三:自动备份脚本(懒人必备)
如果你想每天自动备份,可以写一个简单的脚本 backup.sh:
bash
#!/bin/bash
# 设置变量
BACKUP_DIR="./backups"
DB_CONTAINER="postgres_prod"
DB_NAME="main_db"
DB_USER="admin"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行备份
docker exec $DB_CONTAINER pg_dump -U $DB_USER $DB_NAME > $BACKUP_DIR/db_backup_$DATE.sql
# 仅保留最近 7 天的备份(可选)
find $BACKUP_DIR -type f -mtime +7 -name "*.sql" -delete
echo "备份已完成: $BACKUP_DIR/db_backup_$DATE.sql"
核心建议
- 如果你想备份整个数据库实例(包括配置): 用 方案一 (冷备份
pgdata)。 - 如果你只想备份数据内容且不想停机: 用 方案二 (热备份
pg_dump)。 - 注意权限: 手动
cp或tar得到的pgdata文件通常属于root,将来恢复时记得检查文件夹权限,确保容器内的postgres用户能读写它。
你想让我帮你把这个备份脚本写成一个可以定时运行的任务(Crontab)吗?