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)吗?

相关推荐
小白同学_C9 小时前
Lab4-Lab: traps && MIT6.1810操作系统工程【持续更新】 _
linux·c/c++·操作系统os
今天只学一颗糖9 小时前
1、《深入理解计算机系统》--计算机系统介绍
linux·笔记·学习·系统架构
失忆爆表症10 小时前
03_数据库配置指南:PostgreSQL 17 + pgvector 向量存储
数据库·postgresql
不做无法实现的梦~10 小时前
ros2实现路径规划---nav2部分
linux·stm32·嵌入式硬件·机器人·自动驾驶
小锋学长生活大爆炸10 小时前
【教程】免Root在Termux上安装Docker
运维·docker·容器
进击切图仔10 小时前
常用 Docker 命令备份
运维·docker·容器
默|笙12 小时前
【Linux】fd_重定向本质
linux·运维·服务器
陈苏同学13 小时前
[已解决] Solving environment: failed with repodata from current_repodata.json (python其实已经被AutoDL装好了!)
linux·python·conda
“αβ”13 小时前
网络层协议 -- ICMP协议
linux·服务器·网络·网络协议·icmp·traceroute·ping
不爱学习的老登14 小时前
Windows客户端与Linux服务器配置ssh无密码登录
linux·服务器·windows