通过 Docker 在群晖 NAS 上运行 Sia
概述
Sia 是一个去中心化的点对点网络,用于买卖计算机存储空间。如果你有多余的存储空间,Sia 允许你将其出售给想要在 Sia 云网络上存储文件的人。
在个人笔记本电脑或台式机上托管 Sia 服务器可能颇具挑战。人们通常会时不时关闭个人电脑,或至少定期重启。这给像 Sia 这样的应用带来了问题,因为它需要保持高可用性,才能为网络上的客户端提供服务。
一个便捷的解决方案是在网络附加存储(NAS)设备上运行 Sia。NAS 旨在始终保持开机状态,很少需要重启。此外,NAS 的核心作用就是提供大量存储,因此它很可能有充足的剩余空间。许多商用 NAS 设备都支持 Docker,这是一种可以运行 Sia 的虚拟化工具。
在本指南中,我将向你展示如何使用 Docker 在 NAS 设备上搭建 Sia 服务器。
为何要提供托管服务?
许多刚接触 Sia 的新人会问:“在 Sia 上提供托管能赚很多钱吗?”坦诚的回答是,在 Sia 上出租存储目前并不赚钱……至少现在还不是。

存储租赁市场尚未达到临界规模。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”即可找到它。

创建 Sia 目录
接下来,为 Sia 创建一个专用的共享文件夹。这个文件夹将用于存储 Sia 的所有状态信息,包括加密的钱包文件和区块链数据库。
在 File Station 中,新建一个共享文件夹并将其命名为“sia”:

启用对 DiskStation 的 SSH 访问
由于没有预打包的 Sia Docker 镜像,你需要创建一个 Dockerfile 来定义 Docker 镜像。由于 DSM 的 Docker 应用不支持通过 Dockerfile 创建镜像,你需要通过命令行来完成此操作。
要启用此功能,请打开 Control Panel > Terminal & SNMP,并勾选“Enable SSH service”旁边的复选框。

创建 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,你仅绑定到本地网络接口,而对于其他端口,则隐式绑定到所有接口。这是一项安全措施。任何通过端口9980与siad通信的人都将完全控制我们的 Host,例如可以清空我们的钱包。如果我们的网络没有对外暴露此端口,这一措施并非严格必需,但无论如何都是一个有用的预防手段。 - 我的 NAS 的 IP 地址是
10.0.0.101。你可以在本地网络上的另一台机器上通过命令dig diskstation +short来查找 NAS 的 IP 地址。
- 重要提示:请注意,对于端口
检查是否成功
在 DSM 中,打开 Docker 应用并查看“Container”面板。你应该会看到类似于以下内容的界面:

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

配置 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 的专用子目录:

然后,使用 siac 将该文件夹添加为新的 Sia Host 存储文件夹:
./siac --addr DISKSTATION:9980 host folder add /sia-data/host-storage 500GB请注意,/sia-data/host-storage 是从 Docker 容器内守护进程的角度来看的路径,而非 siac 的角度。
允许 Sia 通过防火墙
Sia 需要通过端口 9981 和 9982 与远程对等节点通信。使用家用路由器时,请将其配置为把这些端口转发到群晖 NAS。具体操作因路由器而异,但大致如下所示:
注意:请将 10.0.0.101 替换为你的群晖 NAS 的 IP 地址。

你不应暴露端口 9980,因为它是 Sia 用于 API 通信的端口。将其暴露到公共互联网会使你的 Sia Host 容易受到攻击。
如何升级 Sia
Sia 仍是一项新技术,每隔几个月就会发布重要的新版本。租用者会根据服务器版本来决定向哪个 Host 购买文件合约,因此在新版本发布后尽快升级符合你的最佳利益。
如果你按照本指南操作,Sia 的所有状态都保存在 Docker 容器之外,因此你可以安全地进行升级,而不会影响你的 Sia 钱包或存储合约。
以
admin身份通过 SSH 登录到你的 NAS。ssh admin@diskstation运行以下命令:
# 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 编写了一份优秀的指南:
随机一篇博客