# 准备工作

> 如何准备部署 Pigsty 所需的节点，操作系统，管理员用户，端口，与所需权限。
---

与 Pigsty 部署有关的 101 入门知识。


----------------

## 节点准备

Pigsty 支持 `Linux` 内核与 `x86_64/amd64` 架构，适用于任意节点。

所谓节点（node），指 ssh 可达并提供裸操作系统环境的资源，例如物理机，虚拟机，或者启用了 systemd 与 sshd 的操作系统容器。

部署 Pigsty 最少需要一个节点。最低配置要求为 `1C1G`，推荐至少使用 `2C4G` 以上的机型，适用配置上不封顶，参数会自动优化适配。

作为 Demo，个人站点，或者开发环境时，可以使用单个节点。
作为独立监控基础设施使用时，建议使用 **1-2** 个节点，作为高可用 PostgreSQL 数据库集群使用时，建议至少使用 **3** 个节点。用于核心场景时，建议使用至少 **4-5** 个节点。


**充分利用 IaC 工具完成琐事**



手工配置大规模生产环境繁琐且容易出错，我们建议您充分利用 Infra as Code 工具，解决此类问题。

您可以使用 Pigsty 提供的 [**Terraform**](/zh/docs/setup/provision#terraform) 模板与 [**Vagrant**](/zh/docs/setup/provision#vagrant) 模板，使用 IaC 的方式一键创建所需的节点环境，完成好网络，操作系统，管理用户，权限，安全组的置备工作。






----------------

## 网络准备

Pigsty 要求节点使用 **静态IPv4地址**，即您应当为节点显式分配指定固定的 IP 地址，而不应当使用 DHCP 动态分配的地址。

节点使用的 IP 地址应当是节点用于内网通信的首要 IP 地址，并将作为节点的唯一身份标识符。

如果您希望使用可选的 Node VIP 与 PG VIP 功能，应当确保所有节点位于一个大二层网络中。

您的防火墙策略应当保证所需的端口在节点间开放，不同模块所需的具体端口列表请参考 [**节点：端口**](/zh/docs/node/)。

**应该暴露哪些端口？**



暴露端口的方法取决于您的网络安全策略实现，例如：公有云上的安全组策略，或本地 iptables 记录，防火墙配置等。
如果您只是希望尝尝鲜，不在乎安全，并且希望一切越简单越好，那么您可以仅对外部用户按需开放 `5432` 端口（ PostgreSQL 数据库） 与 `3000` 端口（Grafana 可视化界面）。

在 [**Infra节点**](/zh/docs/node#infra节点) 上的 Nginx 默认会对外暴露 `80/443` 端口提供 Web 服务，并通过域名对不同服务进行区分，这一端口应当对办公网络（或整个整个互联网）开放。

严肃的生产数据库服务端口通常不应当直接暴露在公网上，如果您确实需要这么做，建议首先查阅 [安全最佳实践](/zh/docs/setup/security/)，并小心行事。





----------------

## 操作系统准备

Pigsty 支持多种基于 Linux 内核的服务器操作系统发行版，我们建议使用 **RockyLinux 8.9** 或 **Ubuntu 22.04.3** 作为安装 Pigsty 的 OS。

Pigsty 支持 RHEL (7,8,9)，Debian (11,12)，Ubuntu (20,22) 以及多种与之兼容的操作系统发行版，完整操作系统列表请参考 [**兼容性**](/zh/docs/reference/compatibility)。

在使用多个节点镜进行部署时，我们 **强烈** 建议您在所有用于 Pigsty 部署的节点上，使用**相同版本**的操作系统发行版与 Linux 内核版本

我们**强烈建议使用干净，全新安装的最小化安装的服务器操作系统环境**，并使用 `en_US` 作为首要语言。

**如何安装并启用 en_US locale？**



使用其他系统语言包时，如何确保 `en_US` 本地化规则集可用：

```bash
yum install -y glibc-locale-source glibc-langpack-en
localedef -i en_US -f UTF-8 en_US.UTF-8
localectl set-locale LANG=en_US.UTF-8
```

注：Pigsty 部署的 PostgreSQL 集群默认使用 `C.UTF8` locale，但字符集定义使用 `en_US` 以确保 `pg_trgm` 扩展可以正常工作。
如果您确实不需要此功能，可以配置 [**`pg_lc_ctype`**](/zh/docs/reference/param#pg_lc_ctype) 的值为 `C.UTF8` ，以避免在系统语言包缺失的情况下，数据库初始化报错的问题。






----------------

## 管理用户准备

在安装 Pigsty 的节点上，您需要拥有一个 “**管理用户**” —— 拥有免密 `ssh` 登陆权限与免密 `sudo` 权限。

免密 `sudo` 是必选项，用于在安装过程中执行需要 `sudo` 权限的命令，例如安装软件包，配置系统参数等。

**如何配置管理用户的免密码 sudo 权限？**



假设您的管理用户名为 `vagrant` ，则可以创建 `/etc/sudoers.d/vagrant` 文件，并添加以下记录：

```bash
%vagrant ALL=(ALL) NOPASSWD: ALL
```

则 vagrant 用户即可免密 `sudo` 执行所有命令。如果你的用户名不是 `vagrant`，请将上面操作中的 `vagrant` 替换为您的用户名。



**避免使用 root 用户安装**



尽管使用 `root` 用户安装 Pigsty 是可行的，但我们不推荐这样做。

[安全最佳实践](/zh/docs/setup/security/) 是使用一个不同于根用户（`root`）与数据库超级用户 (`postgres`) 的专用管理员用户（如：`dba`）

Pigsty 提供了专用剧本任务，可以使用一个现有的管理用户（例如 `root`），输入 ssh/sudo 密码，创建一个专用的 [**管理员用户**](/zh/docs/node/#创建管理员)。





----------------

## SSH 权限准备

除了免密 `sudo` 权限， Pigsty 还需要管理用户免密 `ssh` 登陆的权限。

对于[单机安装](/zh/docs/concept/arch#单机安装)的节点而言，这意味着本机上的管理用户可以通过 ssh 免密码登陆到本机上。
如果的 Pigsty 部署涉及到多个节点，这意味着[管理节点](/zh/docs/node#admin节点)上的管理用户应当可以通过 ssh 免密码登陆到所有被 Pigsty 纳管的节点上（包括本机），并免密执行 `sudo` 命令。

单机安装时，在 [**`configure`**](/zh/docs/setup/install#配置) 过程中，如果您的当前管理用户没有 SSH key，Pigsty 会尝试修复此问题：随机生成一对新的 `id_rsa` 密钥，并添加至本地 `~/.ssh/authroized_keys` 文件确保本机管理用户的 SSH 登陆能力。

Pigsty 默认会为您在纳管的节点上创建一个可用的管理用户 `dba` (`uid=88`)，如果您已经使用了此用户，我们建议您修改 [`node_admin_username`](/zh/docs/reference/param#node_admin_username) 使用新的用户名与其他 uid，或通过 [`node_admin_enabled`](/zh/docs/reference/param#node_admin_enabled) 参数禁用。

**如何配置管理用户的 ssh 免密码登陆？**



假设您的管理用户名为 `vagrant`，则以 `vagrant` 用户身份执行以下命令，会为其生成公私钥对 `~/.ssh/id_rsa[.pub]` 用于登陆。如果已经存在公私钥对，则无需生成新密钥对。

```bash
ssh-keygen -t rsa -b 2048 -N '' -f ~/.ssh/id_rsa -q
```

生成的公钥默认位于：`/home/vagrant/.ssh/id_rsa.pub`，私钥默认位于：`/home/vagrant/.ssh/id_rsa`，如果您操作系统用户名不叫 `vagrant`，将上面的 `vagrant` 替换为您的用户名即可。

您应当将公钥文件（`id_rsa.pub`）追加写入到需要登陆机器的对应用户上：`/home/vagrant/.ssh/authorized_keys` 文件中。如果您已经可以直接通过密码访问远程机器，可以直接通过`ssh-copy-id`的方式拷贝公钥：

```bash
ssh-copy-id <ip>                        # 输入密码以完成公钥拷贝
sshpass -p <password> ssh-copy-id <ip>  # 直接将密码嵌入命令中，避免交互式密码输入（注意安全！）
```

Pigsty 推荐将管理用户的创建，权限配置与密钥分发放在虚拟机的置备阶段完成，作为标准化交付内容的一部分。




----------------

## SSH 例外情况

如果您的 SSH 访问有一些额外限制，例如，使用了跳板机，或者进行了某些定制化修改，无法通过简单的 `ssh <ip>` 方式访问，那么可以考虑使用 ssh 别名。

例如，如果您的服务器可以通过 `~/.ssh/config` 中定义的别名，例如 `meta` 通过 `ssh` 访问，那么可以为 [**配置清单**](/zh/docs/setup/config) 中的节点配置 `ansible_host` 参数，指定 SSH Alias：

```yaml
nodes:
  hosts:  # 10.10.10.10 无法直接 ssh，但可以通过ssh别名 `meta` 访问
    10.10.10.10: { ansible_host: meta }
```

如果 SSH 别名无法满足您的需求，Ansible 还提供了一系列自定义 [**ssh 连接参数**](https://docs.ansible.com/archive/ansible/2.4/intro_inventory.html#list-of-behavioral-inventory-parameters)，可以精细控制 SSH 连接的行为。

最后，如果以下命令可以在管理节点上使用管理用户成功执行，意味着该目标节点上的管理用户与权限配置已经妥当：

```bash
ssh <ip|alias> 'sudo ls'
```




----------------

## 软件准备

在 [**管理节点**](/zh/docs/node#admin节点) 上，Pigsty 需要使用 [**Ansible**](/zh/docs/setup/playbook#ansible) 发起控制命令。如果您使用本地单机安装，那么管理节点和被管理的节点是同一台，需要安装 Ansible。对于普通节点，则无需安装 Ansible。

在 [**`bootstrap`**](/zh/docs/setup/offline#bootstrap) 过程中，Pigsty 会尽最大努力自动为您完成安装 Ansible 这一任务，但您也可以选择手工安装 Ansible。手工安装 Ansible 的过程因不同操作系统发行版/大版本而异（通常涉及到额外的弱依赖 `jmespath`）：

**安装 Ansible**



**EL 8 \/ 9**

sudo dnf install -y ansible python3.11-jmespath python3-cryptography

**EL 7**

sudo yum install -y ansible   # EL7 无需显式安装 Jmespath

**Debian \/ Ubuntu**

sudo apt install -y ansible python3-jmespath

**MacOS**

brew install ansible

为了安装 Pigsty，您还需要准备 Pigsty 源码包。您可以直接从 [GitHub Release](https://github.com/Vonng/pigsty/releases/) 页面下载特定版本，或使用以下命令获取最新稳定版本：

```bash
curl -L https://get.pigsty.cc/install  | bash -s v2.7.0
```

如果您的环境没有互联网访问，也可以考虑直接从 GitHub Release 页面或其他渠道下载针对不同操作系统发行版预先制作的 [**离线安装包**](/zh/docs/setup/offline/#离线软件包)。
