Skip to content

Commit

Permalink
Merge branch 'Fankouzu:main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
lvxuan149 authored Sep 9, 2024
2 parents 5b9791e + d5ed5e4 commit d30475f
Show file tree
Hide file tree
Showing 4 changed files with 286 additions and 0 deletions.
9 changes: 9 additions & 0 deletions docs/.vitepress/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,15 @@ function sidebarSolanaValidatorDocumentation(): DefaultTheme.SidebarItem[] {
link: "operations/validator-or-rpc-node",
},
{ text: "准备工作", link: "operations/prerequisites" },
{
text: "最佳实践",
collapsed: true,
items: [
{ text: "日常运维", link: "operations/best-practices/general.md" },
{ text: "监控", link: "operations/best-practices/monitoring.md" },
{ text: "安全", link: "operations/best-practices/security.md" },
],
}
],
},
],
Expand Down
151 changes: 151 additions & 0 deletions docs/SolanaValidatorDocumentation/operations/best-practices/general.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
# Solana 验证器运维最佳实践

成功设置并启动 [测试网上的验证器](https://docs.solanalabs.com/operations/setup-a-validator)(或您选择的其他集群)后,您将需要熟悉如何在日常基础上维护验证器。在日常中,您将 [监控您的服务器](https://docs.solanalabs.com/operations/best-practices/monitoring)、定期更新软件(Solana 验证器软件和操作系统软件包)以及管理您的投票账户和身份账户。

所有这些技能对于实践都至关重要。最大限度地延长验证器的正常运行时间是成为优秀的运维人员的重要组成部分。

## 教育研讨会

Solana 验证器社区定期举办教育研讨会。您可以通过以下方式观看过去的研讨会。
[Solana 验证器教育研讨会播放列表](https://www.youtube.com/watch?v=86zySQ5vGW8&list=PLilwLeBwGuK6jKrmn7KOkxRxS9tvbRa5p).

## 验证者命令行帮助

在Solana命令行界面中,您可以运行带有`--help`标志的`solana-validator`命令,以更好地了解可用的标志和子命令。

```
solana-validator --help
```

## 重启您的验证节点

您可能出于多种运维原因需要重启您的验证器。作为最佳实践,您应该避免在领导者时段重启。[leader slot](https://solana.com/docs/terminology#leader-schedule) 是您的验证器预期产生区块的时间。为了集群的健康以及您的验证器赚取交易费奖励的能力,您不会希望在可产生区块机会的期间让验证器处于离线状态。

要查看一个周期的完整领导者日程,请使用以下命令:

```
solana leader-schedule
```

根据当前时段和领导者日程,您可以计算出验证器预计不会产生区块的开放时间窗口。。

假设您已准备好重启,您可以使用 `solana-validator exit` 命令。当达到适当的空闲时间窗口时,该命令会退出您的验证器进程。假设您为验证器进程实现了 systemd,验证器在退出后应该会自行重启。有关详细信息,请参见以下帮助命令:

```
solana-validator exit --help
```

## 升级

升级[Solana命令行界面软件](https://docs.solanalabs.com/cli/install)有多种方法。作为运维人员,您需要经常进行升级,因此熟悉这个过程非常重要。


> **注意** 在下载或从源代码构建最新版本时,验证器节点无需离线。以下所有方法都可以在验证器进程重新启动之前完成。
### 从源代码构建

最佳实践是从源代码构建您的Solana二进制文件。如果您从源代码构建,您可以确保在创建二进制文件之前代码没有被篡改。您还可能能够针对您的特定硬件优化您的`solana-validator`二进制文件。

如果您在验证器机器(或具有相同CPU的机器)上从源代码构建,您可以使用 `-march` 标志针对您的特定架构。请参阅以下文档以获取更多信息:[从源代码构建的说明](https://docs.solanalabs.com/cli/install#build-from-source)

### solana-install

如果您不习惯从源代码构建,或者您需要快速安装新版本来测试某些功能,您可以改用 `solana-install` 命令。

假设您想要安装Solana版本`1.14.17`,您将执行以下操作:

```
solana-install init 1.14.17
```

这个命令会下载`1.14.17`版本的可执行文件,并将其安装到`.local`目录中。您也可以查看`solana-install --help`以获取更多选项。

> **注意** 这个命令只有在您已经安装了 Solana CLI 的情况下才有效。如果您还没有安装CLI,请参考[安装 Solana CLI 工具](https://docs.solanalabs.com/cli/install)
### 重启

对于所有安装方法,您需要重启验证器进程,才能使用新安装的版本。使用 `solana-validator exit` 来重启您的验证器进程。

### 验证版本

验证您的验证器进程是否已更改为所需版本的最佳方法是在重启后搜索日志。以下 grep 命令应该可以显示您的验证器使用哪个版本重启的:

```
grep -B1 'Starting validator with' <path/to/logfile>
```

## 快照

没有经历过显著停机(多个小时的停机)的验证器运维人员应该避免下载快照。保持本地账本对集群的健康以及您的验证器历史记录非常重要。因此,您不应该在您的验证器离线或遇到问题时下载新快照。下载快照应该只限于您没有本地状态的情况。长时间的停机或新验证器的首次安装是您可能没有本地状态的例子。在其他情况下,比如为了升级而重启,应该避免下载快照。

为了避免在重启时下载快照,请将以下标志添加到 `solana-validator` 命令中:

```
--no-snapshot-fetch
```

如果您在 `solana-validator` 命令中使用了这个标志,请确保在您的验证器启动后运行 `solana catchup <pubkey>`,以确保验证器在合理的时间内追赶上来。如果经过一段时间后(可能是几个小时),您的验证器仍然落后,那么您可能需要下载一个新的快照。

### 下载快照

如果您是第一次启动验证器,或者您的验证器在重启后落后得太远,那么您可能需要下载快照。

要下载快照,您切记**不要**使用 `--no-snapshot-fetch` 标志。
不使用该标志,您的验证器将自动从您使用 `--known-validator` 标志指定的已知验证器下载快照。

如果其中一个已知验证器下载速度很慢,您可以尝试向您的验证器添加 `--minimal-snapshot-download-speed` 标志。如果初始下载速度低于您设置的阈值,此标志将切换到另一个已知验证器。


### 手动下载快照

如果一个或多个您已知的验证器出现网络问题,那么您可能需要手动下载快照。要从您已知的验证器手动下载快照,首先,使用 `solana gossip` 命令找到验证器的IP地址。在以下示例中,`5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on` 是我的一个已知验证器的公钥:

```
solana gossip | grep 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on
```

验证器的IP地址是`139.178.68.207`,并且这个验证器上开放的端口是`80`。您可以在 gossip 输出的第五列中看到 IP 地址和端口:

```
139.178.68.207 | 5D1fNXzvv5NjV1ysLjirC4WY92RNsVH18vjmcszZd8on | 8001 | 8004 | 139.178.68.207:80 | 1.10.27 | 1425680972
```

现在已知IP和端口,您可以下载完整快照或增量快照:

```
wget --trust-server-names http://139.178.68.207:80/snapshot.tar.bz2
wget --trust-server-names http://139.178.68.207:80/incremental-snapshot.tar.bz2
```

现在将这些文件移动到您的快照目录中。如果您尚未指定快照目录,则应将文件放入您的账本目录。

一旦您有了本地快照,您可以使用`--no-snapshot-fetch`标志重启您的验证器。

## 定期检查账户余额

确保身份账户中的资金不会意外耗尽至关重要,因为一旦资金耗尽,您的节点将停止投票。另外需要注意的是,在投票账户中的这三个密钥对中,身份账户的密钥对最为脆弱,因为在运行`solana-validator`软件时,身份账户的密钥对会存储在您的验证节点上。应该在该账户中存放多少SOL完全由您决定。作为最佳实践,定期检查该账户余额,并根据需要及时补充或提取资金。要查看账户余额,请执行:

```
solana balance validator-keypair.json
```

> **注意** `solana-watchtower` 可以监控验证器身份账户的最低余额。有关详细信息,请参见[监控最佳实践](https://docs.solanalabs.com/operations/best-practices/monitoring)
## 从投票账户中提取资金

作为提醒,您的提取者的密钥对应该**永远不要**存储在您的服务器上。它应该存储在硬件钱包、纸钱包或多重签名钱包中,以减轻黑客攻击和资金被盗的风险。

要从您的投票账户中提取资金,您需要在受信任的计算机上运行`solana withdraw-from-vote-account`。例如,在受信任的计算机上,
您可以从您的投票账户中提取所有资金(不包括租金豁免最低限额)。以下示例假设您有一个单独的密钥对来存储您的资金,名为`person-keypair.json`

```
solana withdraw-from-vote-account \
vote-account-keypair.json \
person-keypair.json ALL \
--authorized-withdrawer authorized-withdrawer-keypair.json
```

要获取有关该命令的更多信息,请使用
`solana withdraw-from-vote-account --help`

有关不同密钥对和其他相关操作的更详细说明,请参阅[投票账户管理](https://docs.solanalabs.com/operations/guides/vote-accounts)
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
# Solana 验证器监控最佳实践

确保你的验证器配置了监控至关重要。万一你的验证器出现滞后(落后于网络其他节点),你需要立即响应并修复问题。一个非常有用的监控工具是[`solana-watchtower`](https://docs.solanalabs.com/operations/best-practices/monitoring#solana-watchtower)

## Solana Watchtower

Solana Watchtower是一款极为实用的监控工具,它会定期检查你的验证器健康状况。它能监控你的验证器是否有滞后行为,然后通过你选择的应用程序(如 Slack、Discord、Telegram 或 Twilio)通知你。此外,`solana-watchtower`还能监控整个集群的健康状态,使你能够意识到任何集群范围内的问题,从而确保你能及时响应并维护网络的稳定运行。

### 入门

要开始使用 Solana Watchtower,运行命令 `solana-watchtower --help`。从帮助菜单中,你可以查看可选标志及命令的解释。

以下是一个示例命令,用于监控标识公钥为 `2uTk98rqqwENevkPH2AHHzGHXgeGc1h6ku8hQUqWeXZp` 的验证器节点:

```
solana-watchtower --monitor-active-stake --validator-identity \
2uTk98rqqwENevkPH2AHHzGHXgeGc1h6ku8hQUqWeXZp
```

该命令将监控你的验证器,但除非你添加了在 `solana-watchtower --help` 中提到的环境变量,否则你不会收到通知。由于为每种通知服务设置可能不那么直接,下一节将引导你完成[在 Telegram 上设置watchtower通知](https://docs.solanalabs.com/operations/best-practices/monitoring#setup-telegram-notifications)的步骤。

### 最佳实践

最佳实践是在与你的验证器分开的服务器上运行 `solana-watchtower` 命令。

如果你将 `solana-watchtower` 运行在与 `solana-validator` 进程相同的计算机上,那么在像停电这样的灾难性事件中,你可能无法意识到问题的存在,因为你的 `solana-watchtower` 进程会在同一时间停止,与你的 `solana-validator` 进程一起。

此外,虽然在终端中手动设置环境变量并运行 `solana-watchtower` 进程是测试命令的一种好方法,但从运行操作角度来看并不可靠,因为该进程不会在终端关闭或系统重启期间重新启动。

相反,你可以将 `solana-watchtower` 命令作为系统进程运行,类似于 `solana-validator`。在系统进程文件中,你可以指定机器人的环境变量。

### 设置 Telegram 通知

为了将验证器健康状态通知发送到你的Telegram账户,我们需要完成以下几个步骤:

1. 创建一个用于发送消息的机器人。这个机器人将通过 Telegram上 的 BotFather 来创建。
2. 给机器人发送一条消息。
3. 创建一个 Telegram 群组,该群组将接收 watchtower 的通知。
4. 在命令行环境中添加环境变量。
5. 重启`solana-watchtower`命令。

#### 使用BotFather创建机器人

在 Telegram 中搜索 `@BotFather`。向 **BotFather** 发送以下消息:`/newbot`

现在,你需要为机器人想一个名字。唯一的要求是名字不能包含破折号或空格,并且**必须**`bot`结尾。很多名字已经被占用,因此你可能需要尝试几个。一旦找到可用的名字,**BotFather**会回复你,其中包括与机器人聊天的链接以及机器人的一个令牌。请记下这个令牌,在设置环境变量时会用到。

#### 向机器人发送消息

在 Telegram 中找到该机器人并向它发送如下消息:`/start`。向机器人发送消息将在之后帮助你找到机器人聊天室ID。

#### 创建 Telegram 群组

在 Telegram 中,点击新消息图标,然后选择创建新群组。找到你新创建的机器人并将其添加到群组中。接下来,为群组起一个你喜欢的名字。

#### 为 Watchtower 设置环境变量

既然你已经设置了机器人,接下来需要为该机器人设置环境变量,以便 watchtower 能够发送通知。

首先,请回顾从**@BotFather**收到的聊天消息。在消息中,有一个用于你机器人的 HTTP API 令牌,格式如下:`389178471:MMTKMrnZB4ErUzJmuFIXTKE6DupLSgoa7h4o`。你将使用此令牌设置`TELEGRAM_BOT_TOKEN`环境变量。在计划运行`solana-watchtower`的终端中,执行以下命令:

```
export TELEGRAM_BOT_TOKEN=<HTTP API Token>
```

接下来,你需要群组的`chat id`,以便`solana-watchtower`知道应将消息发送到何处。首先,在你创建的聊天群组中向你的机器人发送一条消息,比如 `@newvalidatorbot hello`

接下来,在你的浏览器中,访问 `https://api.telegram.org/bot<HTTP_API令牌>/getUpdates`。确保将`<HTTP_API令牌>`替换为你从**@BotFather**消息中获得的API令牌。同时,请确保在 URL 中的 API 令牌前包含单词`bot`。在浏览器中发起这个请求。

响应应该是JSON格式的。在JSON中搜索字符串`"chat":`。该`chat`对象下的`id`值就是你的`TELEGRAM_CHAT_ID`。它会是一个负数,比如:`-781559558`。请记住要包含负号!如果你在JSON中找不到`"chat":`,那么你可能需要先将机器人从聊天群组中移除,然后再重新添加一次。

掌握 Telegram `chat id` 后,导出你计划运行 solana-watchtower 的环境变量:

```
export TELEGRAM_CHAT_ID=<negative chat id number>
```

#### 重启 solana-watchtower

一旦设置了环境变量,接下来请重启 `solana-watchtower`。你应该能看到与验证器相关的输出信息。

为了测试你的Telegram配置是否工作正常,你可以暂时停止验证器,直到其被标记为滞后。一旦验证器处于逾期状态,最多在一分钟后,你应该能在Telegram群组中收到由你的机器人发送的消息。之后再次启动验证器,并确认你能从机器人那里收到另一条消息,这条消息应当显示 `all clear`
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Solana 验证器安全最佳实践

作为 Ubuntu 计算机的系统管理员,需要具备系统的专业技术知识及最佳安全实践。以下列表应能帮助您入门,并被视为确保系统安全的最低要求。

## 保持系统更新

确保定期更新 Ubuntu 系统中的软件包。过时的软件包可能包含已知的安全漏洞,黑客可能会利用这些漏洞。一个好的做法是至少每周更新一次。要更新你的系统,请执行以下操作:

```
sudo apt update
sudo apt upgrade
```

## 不要将你的取款密钥存储在验证器机器上。

您的取款密钥赋予运维人员对投票账户的完全控制权。这是高度敏感的信息,不应存储在验证器本身上。

对于取款密钥管理,有多种选择。一些操作员选择使用硬件钱包或纸钱包来保存取款密钥对。另一种选择是多重签名,其中多重签名的每个密钥都是一个硬件钱包或纸钱包。无论您选择哪种方式,请确保授权的取款密钥被安全存储,并且它是在一台可信的计算机(而非您的验证器计算机)上生成的。

再次强调,取款密钥对任何时候都不应存储在您的验证器上。

## 不要以 Root 用户身份运行 Solana 验证器。

以root用户身份运行应用程序可能会让初期设置变得更容易,但这是一种不好的做法。

如果您的系统中存在漏洞,当 Solana 应用程序以`root`用户身份运行时,黑客可能获得完全访问权限。因此,建议您参考[设置说明](https://docs.solanalabs.com/operations/setup-a-validator#sol-user),创建一个名为`sol`的用户,并以`sol`用户身份运行应用程序。这样可以更好地限制潜在的安全风险,提高系统的安全性。

## 关闭未使用的端口

你的系统应关闭所有不需要对外开放的端口。一个常见的关闭端口的防火墙是`ufw`(简易防火墙)。你可以在[Digital Ocean](https://www.digitalocean.com/community/tutorials/ufw-essentials-common-firewall-rules-and-commands)找到使用`ufw`的指南。

## 使用 fail2ban 防止暴力攻击

[fail2ban](https://github.com/fail2ban/fail2ban) 是一款网络安全工具,它会检查您的日志中是否存在可疑的登录尝试,并在多次尝试后禁止这些IP地址。这将有助于减轻针对您服务器的暴力破解攻击。

默认设置应该可以通过简单安装 `fail2ban` 即可开箱即用:

```
sudo apt install fail2ban
```

## 不要使用密码认证进行 SSH 登录

除了安装 `fail2ban` 外,还建议禁用基于密码的SSH访问认证。推荐使用SSH密钥认证方式。

0 comments on commit d30475f

Please sign in to comment.