Running Sia on a Synology NAS via Docker

Michael Lynch

通过 Docker 在群晖 NAS 上运行 Sia

概述

Sia 是一个去中心化的点对点网络,用于买卖计算机存储空间。如果你有多余的存储空间,Sia 允许你将其出售给想要在 Sia 云网络上存储文件的人。

在个人笔记本电脑或台式机上托管 Sia 服务器可能颇具挑战。人们通常会时不时关闭个人电脑,或至少定期重启。这给像 Sia 这样的应用带来了问题,因为它需要保持高可用性,才能为网络上的客户端提供服务。

一个便捷的解决方案是在网络附加存储(NAS)设备上运行 Sia。NAS 旨在始终保持开机状态,很少需要重启。此外,NAS 的核心作用就是提供大量存储,因此它很可能有充足的剩余空间。许多商用 NAS 设备都支持 Docker,这是一种可以运行 Sia 的虚拟化工具。

在本指南中,我将向你展示如何使用 Docker 在 NAS 设备上搭建 Sia 服务器。

为何要提供托管服务?

许多刚接触 Sia 的新人会问:“在 Sia 上提供托管能赚很多钱吗?”坦诚的回答是,在 Sia 上出租存储目前并不赚钱……至少现在还不是。

SiaHub 截图

存储租赁市场尚未达到临界规模。SiaHub 是我最喜欢的 Sia Host 浏览器,它显示截至 2017-05-25,Sia 网络的总存储容量高达 1.1 PB(拍字节),其中只有 2% 的容量已被租用。在如此供过于求的情况下,除非将价格定得几乎为零,否则 Host 无法卖出自己的存储空间。

所以目前还没法财源滚滚,但你仍然可能想要参与,原因如下:

如果租赁市场取得成功,将占据有利地位

Storj 等竞争对手不同,Sia 的目标是向企业客户而非家庭用户出售存储。迄今为止,还没有大公司重度依赖 Sia,但如果哪怕只有一家中大型企业开始将 Sia 用作存储后端,就可能彻底激活整个市场。

当用户在 Sia 上购买存储时,Host 选择算法会强烈偏好那些在网络中参与时间更长的 Host。这意味着,如果出现抢购热潮,拥有数月稳定历史记录的 Host 将比新加入网络的 Host 具有显著优势。

很有趣

我个人提供托管只是为了尝试新鲜事物。我觉得调整 Host 定价并观察它如何影响我收到的存储合约数量很有趣。Sia 还让我结识了由其他 Sia 用户组成的热情社区

软件版本

本指南在撰写时使用了各软件组件的最新版本:

群晖 DS412+ NAS 设备

  • DiskStation Manager (DSM) 6.1.2-15132
  • Sia v.1.3.4
  • Docker v.1.11.2

虽然本指南专为群晖 DSM 系统撰写,但其中与 Docker 相关的步骤应该适用于任何支持 Docker 的平台。

我已在 群晖 DS412+ 上成功测试过,但这些步骤应该适用于任何搭载最新 DSM 且具备足够 CPU/RAM 的群晖 NAS。将这些说明稍作调整以适配另一款功能齐全的消费级 NAS(例如 QNAP NAS)也应该很简单。

配置 NAS

安装 Docker

首先,安装 Docker。

Docker 是 DSM 提供的少数几个由群晖官方发布的套件之一。在套件中心中搜索 docker 并点击“Install”即可找到它。

安装 Docker 套件

创建 Sia 目录

接下来,为 Sia 创建一个专用的共享文件夹。这个文件夹将用于存储 Sia 的所有状态信息,包括加密的钱包文件和区块链数据库。

在 File Station 中,新建一个共享文件夹并将其命名为“sia”:

创建新的共享文件夹

启用对 DiskStation 的 SSH 访问

由于没有预打包的 Sia Docker 镜像,你需要创建一个 Dockerfile 来定义 Docker 镜像。由于 DSM 的 Docker 应用不支持通过 Dockerfile 创建镜像,你需要通过命令行来完成此操作。

要启用此功能,请打开 Control Panel > Terminal & SNMP,并勾选“Enable SSH service”旁边的复选框。

安装 Docker 套件

创建 Docker 容器

通过网络上的另一台机器使用 SSH 连接到你的 NAS。Linux 和 OS X 用户可以在终端中运行以下命令。Windows 用户则需要一个 SSH 客户端,例如 Cygwin

ssh admin@diskstation

通过 SSH 连接到 NAS 后,运行以下命令:

# NOTE: Replace 10.0.0.101 with the IP address of your Synology NAS on your
# local network.
LOCAL_IP=10.0.0.101

# Create a Docker container based on the Sia image and start running it in the
# background.
sudo docker run \
  --detach \
  --volume /volume1/sia:/sia-data \
  --publish "${LOCAL_IP}:9980:9980" \
  --publish 9981:9981 \
  --publish 9982:9982 \
  --restart always \
  --name sia-container \
  nebulouslabs/sia

上述命令将执行以下操作:

  • 下载我的非官方 Sia Docker 镜像
  • 从该镜像创建一个 Docker 容器并在后台开始运行该容器。
  • 将 NAS(Docker 宿主机)上端口 9980-9982 的流量转发到 Sia 容器内的相同端口。
    • 重要提示:请注意,对于端口 9980,你仅绑定到本地网络接口,而对于其他端口,则隐式绑定到所有接口。这是一项安全措施。任何通过端口 9980siad 通信的人都将完全控制我们的 Host,例如可以清空我们的钱包。如果我们的网络没有对外暴露此端口,这一措施并非严格必需,但无论如何都是一个有用的预防手段。
    • 我的 NAS 的 IP 地址是 10.0.0.101。你可以在本地网络上的另一台机器上通过命令 dig diskstation +short 来查找 NAS 的 IP 地址。

检查是否成功

在 DSM 中,打开 Docker 应用并查看“Container”面板。你应该会看到类似于以下内容的界面:

正在运行的 Sia 容器

如果你打开我们之前创建的“sia”共享文件夹,你会看到 siad 已经创建了几个文件夹:

Sia 生成的文件夹

配置 Sia

检查状态

让我们使用命令行客户端 siac 连接到 Sia 守护进程。

siad 于 NAS 上运行的情况下,你可以从本地网络上的任何其他机器与之通信。该机器需要最新的 Sia 发行版

siac 二进制文件复制到你的机器后,你可以通过在 addr 参数中指定 NAS 的主机名来运行 siac 命令:

# DISKSTATION is the hostname of the NAS on my local network, the default for
# Synology NAS devices.
$ ./siac --addr DISKSTATION:9980
Synced: No
Block:  0000000001ac2429ee234370ddf139ce87161277eded4bd58bcd31c5e5e2554f
Height: 727
Target: [0 0 0 0 12 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204 204]

添加 Host 存储

要创建用于出售给其他 Sia 用户的存储空间,请在“sia”共享文件夹中创建一个名为 host-storage 的专用子目录:

Sia 存储文件夹

然后,使用 siac 将该文件夹添加为新的 Sia Host 存储文件夹:

./siac --addr DISKSTATION:9980 host folder add /sia-data/host-storage 500GB

请注意,/sia-data/host-storage 是从 Docker 容器内守护进程的角度来看的路径,而非 siac 的角度。

允许 Sia 通过防火墙

Sia 需要通过端口 99819982 与远程对等节点通信。使用家用路由器时,请将其配置为把这些端口转发到群晖 NAS。具体操作因路由器而异,但大致如下所示:

注意:请将 10.0.0.101 替换为你的群晖 NAS 的 IP 地址。

防火墙设置

不应暴露端口 9980,因为它是 Sia 用于 API 通信的端口。将其暴露到公共互联网会使你的 Sia Host 容易受到攻击。

如何升级 Sia

Sia 仍是一项新技术,每隔几个月就会发布重要的新版本。租用者会根据服务器版本来决定向哪个 Host 购买文件合约,因此在新版本发布后尽快升级符合你的最佳利益。

如果你按照本指南操作,Sia 的所有状态都保存在 Docker 容器之外,因此你可以安全地进行升级,而不会影响你的 Sia 钱包或存储合约。

  1. admin 身份通过 SSH 登录到你的 NAS。

    ssh admin@diskstation
  2. 运行以下命令:

    # Gracefully shut down Sia
    sudo docker exec -it sia-container ./siac stop
    
    # Remove the old container.
    # NOTE: If Docker says the container is still running, wait a few minutes to
    # allow siad to finish shutting down gracefully and re-try this command.
    # It may take up to 10 minutes.
    sudo docker rm sia-container
    
    # Upgrade to the latest Sia Docker image
    sudo docker pull nebulouslabs/sia
    
    # NOTE: Replace 10.0.0.101 with the IP address of the Synology NAS on your
    # local network.
    LOCAL_IP=10.0.0.101
    
    # Re-create the Docker container.
    sudo docker run \
      --detach \
      --volume /volume1/sia:/sia-data \
      --publish "${LOCAL_IP}:9980:9980" \
      --publish 9981:9981 \
      --publish 9982:9982 \
      --restart always \
      --name sia-container \
      nebulouslabs/sia

完成此过程后,你将拥有一个运行最新版本 Sia 的全新 Sia Docker 容器。

结论

现在你拥有了一个只要 NAS 保持运行就会一直在线的可用 Sia 节点。

由于此配置将 Sia 的所有持久化状态都保留在容器之外,因此在发布新版本时升级 Sia 节点非常容易。

延伸阅读

本指南向你展示了如何让 Host 运行起来,但你还需要做更多工作来配置 Host 并对其进行优化以最大化收益。Sia 社区成员 RBZL 编写了一份优秀的指南:

原文由 Michael Lynch 发布

本文章由 muse-spark-1.2-contributor 进行翻译