如何使用带有所有参数的 NSIS 安装 postgres?

How to install postgres with NSIS with all parameters?

我们有一个使用 postgres 作为其数据库的 C# 程序,因此我们希望将 postgres 作为半静默安装捆绑在安装程序中,即用户将收到有关强制安装的通知,但安装本身会无需用户输入即可自动执行。

在研究了关于 WiX、Inno Setup 和 NSIS 的意见后,我们决定使用 NSIS。 正如我所见,最简单的方法是包含 postgres 的二进制 .zip 分发并在脚本中执行以下操作:

  1. 复制pgsql文件夹到安装目录
  2. 运行 initdb.exe 使用适当的参数在 InstallDir/pgsql/data
  3. 中创建数据库本身
  4. 运行 pg_ctl.exe 注册为具有应用程序特定名称的服务
  5. 使用 NSIS 简单服务插件启动服务
  6. 安装我们的程序

关于这个场景我有几个问题:

Q1:我的方向是否正确?

问题 2: 我能否以某种方式将超级用户密码传递给 initdb.exe,这样它就不会要求用户通过控制台输入它?

问题 3: 我在哪里以及如何更改 postgres 将侦听的端口,这样我就不会与其他已安装的实例发生冲突?

Q4: 卸载时只用pg_ctl.exe注销服务并删除所有文件夹就够了吗?

PS:我觉得这些问题是相互关联的,所以我把它们放在一起了。但如果需要,我可以将它们分成不同的问题。

差不多是这样。

不要将端口 5432 用于 PostgreSQL。选择一个远远超出该范围的非默认端口,例如 5599 或其他。通过修改 postgresql.conf 并设置 port 指令来更改端口。您可能会发现在您的主要 postgresql.conf 中简单地附加 include_dir = conf.d 或类似内容然后使用您的配置覆盖创建一个 datadir\conf.d\myapp.conf 是有用的。

要在没有提示的情况下为 initdb 设置密码,请传递 --pwfile=/path/to/file 选项。第一行将被读取为密码。参见 initdb

您的卸载计划合理正确。

尽管考虑升级 - 不要把自己逼到墙角。您将希望能够与 9.4 和 pg_upgrade 并行安装 9.5,除非您只想使用转储和恢复。

我建议将 PostgreSQL 二进制文件安装到 %PROGRAMFILES%\MyApp\PostgreSQL.4。您可能应该将数据库放入 %PROGRAMDATA%\MyApp\PostgreSQL.4 而不是应用程序的 %PROGRAMFILES% 目录。 (PostgreSQL 安装程序应该做同样的事情;它的当前行为是应该修复的历史产物)。

请记录您的应用程序捆绑了 PostgreSQL,这样就没有人 "cleans" 它了,因此我们没有另一个应用程序将困惑的用户涌入 pgsql-general。向愤怒的用户解释 "we" 没有在他们的系统上安装 PostgreSQL 是很累人的,我们不能删除它,它可能在那里是因为它是由他们使用的东西安装的,如果他们删除它,那将停止工作。同样,向刚刚终止 PostgreSQL 进程并删除他们的 PostgreSQL 数据目录的用户解释我们无法取回他们的 Poker Tracker(或其他)数据库,因为他们刚刚删除了它......

确保您的应用公开了为用户执行 PostgreSQL 转储和恢复的功能。

用户手册必须清楚说明他们需要采取额外的备份步骤来保护您应用中的数据。您不能只使用 Windows Backup 来获得可靠的 PostgreSQL 备份,因为它是必须一起复制的多个文件;它会复制每个文件 OK,但组合结果将无法使用,除非 PostgreSQL 在备份之前停止。要进行实时备份,您需要采取特殊步骤 - pg_start_backup()、复制、pg_stop_backup() 并存档额外的 WAL 段,或使用 pg_basebackup.