Ubuntu 20.04/22.04 内网环境PostgreSQL 14离线部署实战
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+12.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 批量下载策略
通过分析依赖关系,我们需要下载四类核心包:
- 主程序包:postgresql-14
- 客户端工具:postgresql-client-14
- 公共组件:postgresql-common
- 密钥管理: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.deb3.2 依赖包补全方案
下载过程中容易遗漏间接依赖。我的经验是分三步处理:
首次安装测试:
sudo dpkg -i *.deb修复缺失依赖:
sudo apt -f install --dry-run补下载缺失包:
apt download $(apt -f install --dry-run | grep '需要安装' | awk '{print $2}')
建议将最终所有deb包按功能分类存放:
/pg14-offline ├── main-packages/ ├── dependencies/ └── keyring/4. 目标机安装实战
4.1 安装顺序原则
根据依赖关系,必须按特定顺序安装:
基础组件:
sudo dpkg -i pgdg-keyring_2018.2_all.deb公共组件:
sudo dpkg -i postgresql-common_*.deb sudo dpkg -i postgresql-client-common_*.deb客户端工具:
sudo dpkg -i postgresql-client-14_*.deb主服务程序:
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 locales5. 安装后配置要点
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/tcp5.3 性能调优建议
修改/etc/postgresql/14/main/postgresql.conf关键参数:
# 根据内存调整 shared_buffers = 4GB effective_cache_size = 12GB # 连接数设置 max_connections = 1006. 离线安装的进阶技巧
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.gz6.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.sh7. 版本升级策略
当需要升级到新版本时(如14.6),只需在中转机执行:
# 下载新版包 apt download postgresql-14=14.6* # 校验依赖 apt-cache depends postgresql-14=14.6*传输到目标机后,使用dpkg -i按相同顺序安装即可。特别注意:升级前建议备份数据库:
sudo -u postgres pg_dumpall > pg_backup.sql8. 安全加固建议
完成安装后,建议执行以下安全措施:
修改默认postgres用户密码:
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'StrongPassword123!';"限制访问IP: 修改
pg_hba.conf:host all all 192.168.1.0/24 md5启用日志审计:
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 --all10. 故障排查指南
问题一:服务启动失败
检查日志:
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