260210-Linux离线通过Docker环境部署PostgreSQL

根据最新的官方发布信息,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 容器,需要手动进入数据库创建一个新的空库,请执行以下命令:

  1. 进入容器内部
bash 复制代码
docker exec -it postgres_openwebui psql -U postgres
  1. 在 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 复制出来的文件夹可能会导致数据损坏或不一致。

以下是两种推荐的备份方案:


方案一:物理冷备份(最稳妥,需停机)

这种方法直接物理拷贝文件夹,操作最简单,但需要短暂停止服务以保证数据一致性。

  1. 停止数据库服务
bash 复制代码
docker-compose stop db
  1. 使用 tar 打包备份(建议打包,这样可以保留权限位):
bash 复制代码
# 将 pgdata 目录打包成一个压缩包,文件名带上日期
tar -czvf pgdata_backup_$(date +%Y%m%d).tar.gz ./pgdata
  1. 重新启动服务
bash 复制代码
docker-compose start db

方案二:逻辑热备份(不影响业务,推荐)

这种方法使用 PostgreSQL 自带的 pg_dump 工具。它不需要停止容器,数据库可以正常读写。

  1. 执行备份命令
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: 将输出结果重定向到宿主机当前目录的文件中。
  1. 如何恢复
    如果以后想把这个 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)。
  • 注意权限: 手动 cptar 得到的 pgdata 文件通常属于 root,将来恢复时记得检查文件夹权限,确保容器内的 postgres 用户能读写它。

你想让我帮你把这个备份脚本写成一个可以定时运行的任务(Crontab)吗?

相关推荐
天朝八阿哥3 小时前
使用Docker+vscode搭建离线的go开发调试环境
后端·docker·visual studio code
IvorySQL3 小时前
PostgreSQL 技术日报 (3月4日)|硬核干货 + 内核暗流一网打尽
数据库·postgresql·开源
0xDevNull6 小时前
Linux切换JDK版本详细教程
linux
进击的丸子7 小时前
虹软人脸服务器版SDK(Linux/ARM Pro)多线程调用及性能优化
linux·数据库·后端
IvorySQL1 天前
双星闪耀温哥华:IvorySQL 社区两项议题入选 PGConf.dev 2026
数据库·postgresql·开源
阿虎儿1 天前
Docker安装(非sudo用户可用)
docker
Johny_Zhao2 天前
OpenClaw安装部署教程
linux·人工智能·ai·云计算·系统运维·openclaw
赵渝强老师2 天前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
fetasty2 天前
rustfs加picgo图床搭建
docker
蝎子莱莱爱打怪3 天前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes