Ubuntu 20.04/22.04 内网环境PostgreSQL 14离线部署实战
2026/6/10 10:29:59 网站建设 项目流程

1. 内网环境下的PostgreSQL部署挑战

在企业级应用场景中,数据库服务往往需要部署在隔离的内网环境。我最近就遇到这样一个典型需求:某金融客户的生产环境服务器完全隔离外网,但业务系统又需要使用PostgreSQL 14的最新特性。这种场景下,常规的apt install命令直接失效,源码编译又存在耗时长、配置复杂的问题。

经过多次实践,我发现通过同版本Ubuntu中转机进行离线部署是最优解。这个方法的核心在于:利用可联网的机器预先下载所有依赖包,再通过物理介质(如U盘)或内部文件服务传输到目标服务器。实测在Ubuntu 20.04和22.04上,完整流程耗时约15分钟,比源码编译节省至少2小时。

与传统方式相比,这种方案有三大优势:

  • 规避编译风险:避免因环境差异导致的编译失败
  • 保持版本纯净:所有包均来自官方仓库,无第三方修改
  • 可重复使用:下载的deb包可存档作为标准安装包

2. 中转机环境准备

2.1 配置第三方仓库

首先在中转机上添加PostgreSQL官方仓库。这里有个细节要注意:不同Ubuntu版本对应的代号不同(20.04是focal,22.04是jammy),必须严格匹配:

# 识别系统代号 codename=$(lsb_release -cs) # 添加仓库配置 sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt ${codename}-pgdg main" > /etc/apt/sources.list.d/pgdg.list' # 导入签名密钥 wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

执行apt update后,可以通过以下命令验证仓库是否生效:

apt-cache policy postgresql-14

正常情况应显示类似输出:

postgresql-14: 已安装:(无) 候选版本:14.5-1.pgdg20.04+1

2.2 依赖分析技巧

使用apt-rdepends工具生成完整依赖树:

# 安装分析工具 sudo apt install apt-rdepends # 生成依赖关系图 apt-rdepends postgresql-14 | tee deps.txt

这里有个实用技巧:通过管道输出到文件的同时显示在终端,方便实时查看。对于复杂依赖,建议用grep过滤关键包:

cat deps.txt | grep -E 'Depends|PreDepends'

3. 离线包下载与管理

3.1 批量下载策略

通过分析依赖关系,我们需要下载四类核心包:

  1. 主程序包:postgresql-14
  2. 客户端工具:postgresql-client-14
  3. 公共组件:postgresql-common
  4. 密钥管理:pgdg-keyring

具体下载命令:

# 创建下载目录 mkdir pg14-offline && cd pg14-offline # 核心包下载 apt download postgresql-14 postgresql-client-14 postgresql-common # 密钥包需要单独处理 wget http://apt.postgresql.org/pub/repos/apt/pool/main/p/pgdg-keyring/pgdg-keyring_2018.2_all.deb

3.2 依赖包补全方案

下载过程中容易遗漏间接依赖。我的经验是分三步处理:

  1. 首次安装测试

    sudo dpkg -i *.deb
  2. 修复缺失依赖

    sudo apt -f install --dry-run
  3. 补下载缺失包

    apt download $(apt -f install --dry-run | grep '需要安装' | awk '{print $2}')

建议将最终所有deb包按功能分类存放:

/pg14-offline ├── main-packages/ ├── dependencies/ └── keyring/

4. 目标机安装实战

4.1 安装顺序原则

根据依赖关系,必须按特定顺序安装:

  1. 基础组件

    sudo dpkg -i pgdg-keyring_2018.2_all.deb
  2. 公共组件

    sudo dpkg -i postgresql-common_*.deb sudo dpkg -i postgresql-client-common_*.deb
  3. 客户端工具

    sudo dpkg -i postgresql-client-14_*.deb
  4. 主服务程序

    sudo dpkg -i postgresql-14_*.deb

4.2 常见问题处理

场景一:遇到libpq5依赖缺失

解决方法:

# 在中转机下载缺失包 apt download libpq5 # 传输后安装 sudo dpkg -i libpq5_*.deb

场景二:locale配置报错

快速修复方案:

sudo locale-gen en_US.UTF-8 sudo dpkg-reconfigure locales

5. 安装后配置要点

5.1 服务管理

启动服务并设置开机自启:

sudo systemctl enable postgresql@14-main sudo systemctl start postgresql@14-main

验证服务状态:

sudo -u postgres psql -c "SELECT version();"

5.2 防火墙配置

如果内网有防火墙规则,需要开放默认端口:

sudo ufw allow 5432/tcp

5.3 性能调优建议

修改/etc/postgresql/14/main/postgresql.conf关键参数:

# 根据内存调整 shared_buffers = 4GB effective_cache_size = 12GB # 连接数设置 max_connections = 100

6. 离线安装的进阶技巧

6.1 创建本地仓库

对于需要频繁部署的场景,可以建立本地APT仓库:

# 安装必要工具 sudo apt install dpkg-dev # 创建仓库目录结构 mkdir -p /opt/pg14-repo/conf # 生成Packages.gz cd /opt/pg14-repo dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz

6.2 自动化脚本实现

编写安装脚本install_pg14.sh

#!/bin/bash for pkg in pgdg-keyring postgresql-common postgresql-client-common libpq5 postgresql-client-14 postgresql-14; do sudo dpkg -i ${pkg}_*.deb || exit 1 done sudo apt -f install -y

给脚本添加执行权限:

chmod +x install_pg14.sh

7. 版本升级策略

当需要升级到新版本时(如14.6),只需在中转机执行:

# 下载新版包 apt download postgresql-14=14.6* # 校验依赖 apt-cache depends postgresql-14=14.6*

传输到目标机后,使用dpkg -i按相同顺序安装即可。特别注意:升级前建议备份数据库:

sudo -u postgres pg_dumpall > pg_backup.sql

8. 安全加固建议

完成安装后,建议执行以下安全措施:

  1. 修改默认postgres用户密码:

    sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'StrongPassword123!';"
  2. 限制访问IP: 修改pg_hba.conf

    host all all 192.168.1.0/24 md5
  3. 启用日志审计:

    logging_collector = on log_statement = 'all'

9. 监控与维护

配置基础监控:

# 安装统计收集器 sudo -u postgres psql -c "CREATE EXTENSION pg_stat_statements;"

postgresql.conf中添加:

shared_preload_libraries = 'pg_stat_statements' pg_stat_statements.track = all

定期维护命令:

# 清理旧数据 sudo -u postgres vacuumdb --all --analyze # 重建索引 sudo -u postgres reindexdb --all

10. 故障排查指南

问题一:服务启动失败

检查日志:

journalctl -u postgresql@14-main --no-pager -n 50

问题二:客户端连接拒绝

验证服务监听状态:

ss -tulnp | grep postgres

问题三:性能下降

查看活跃查询:

sudo -u postgres psql -c "SELECT * FROM pg_stat_activity;"

在实际项目中,这种离线部署方式已经成功应用于多个银行系统。有个特别要注意的细节:当内网环境存在多层防火墙时,可能需要将deb包分割成小于100MB的文件块传输。这种情况下,可以结合split命令处理:

# 分割文件 split -b 90M pg-packages.tar.gz pg-part- # 合并文件 cat pg-part-* > pg-packages.tar.gz

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询