使用 Sia 和 Nextcloud 创建自己的低成本云存储应用
在今天的文章中,我将向你展示如何搭建自己的云存储 Web 应用,其功能类似于 Dropbox 或 Google Drive,但成本要低得多。这个方案可以将云存储成本降至每 TB 每月约 0.60 美元。相比之下,在 Dropbox 上使用同样的存储空间每月需要 8.25 美元,在 Google Drive 上则需要每月 10 美元。
视频教程
我制作了一段屏幕录制视频(screencast,屏幕演示视频),逐步讲解本指南中的操作,并展示最终效果。它实现的结果与这篇博文完全相同,但会在图形界面中完成更多配置,而本文则尽可能使用命令行。
如果你更喜欢视频教程,我建议先下载下面“为 Docker 创建文件和文件夹”一节中的文件,然后跟随视频操作。
要求
本指南面向中级用户。如果你没有使用 Docker 容器或虚拟机的经验,或者不习惯使用命令行,那么跟随本指南操作会比较困难。
视频演示使用的是 Windows 10,但本教程完全与操作系统无关。我提供的步骤适用于任何支持 Docker 的 64 位操作系统,包括 Windows、Mac OS X、Linux,甚至一些网络存储设备。
要完成本指南,你需要:
- 至少 500 个 Siacoin(SC)
- 6 GB 可用磁盘空间,最好位于固态硬盘(SSD)上
- 系统中已安装Docker Community Edition(免费)
所需时间
本指南中的步骤大约需要 20 分钟的实际操作时间。不过,安装过程中有几个环节需要等待 Sia 完成处理,等待时间可能从几分钟到几小时不等,因此总耗时为 3~4 小时。
- 创建 Docker 容器:5 分钟
- 配置 Sia:实际操作 10 分钟,总耗时 3~4 小时
- 配置 Nextcloud:5 分钟
本方案的组成部分
Sia
在这个方案中,我使用 Sia 为 Web 应用提供后端存储。我之前写过几篇关于 Sia 的文章,因为它是我最喜欢的新技术之一。Sia 是一个去中心化文件存储网络(decentralized file storage network,去中心化文件存储网络)。用户可以连接到 Sia,并出租闲置磁盘空间来赚取收入。目前 Sia 网络上的价格非常低,这正是你能够以极低的磁盘空间费用搭建云存储方案的原因。
Nextcloud
如果你熟悉 Sia,可能知道 Sia 自带一个名为 Sia-UI 的图形用户界面。这个 UI 的功能有限。它的主要缺点是桌面应用,因此你只能从一台计算机访问文件。它不支持查看任何媒体文件,所以如果你想在云存储中查看照片或视频,就必须先将文件复制到本地计算机的文件夹中,再打开副本。
为了解决 Sia-UI 的局限性,我在本教程中使用了 Nextcloud。Nextcloud 是一个开源云存储 Web 应用,提供类似 Dropbox 或 Google Drive 的 Web 界面。Nextcloud 的设计兼容多种不同的存储提供商,包括 Amazon S3、Dropbox 和 OpenStack。2017 年 2 月,Sia 团队为 Nextcloud 编写了一个定制插件,我将使用它把 Nextcloud 与 Sia 连接起来。
如果你想在继续之前先试用 Nextcloud,可以在 Nextcloud 网站上尝试免费即时演示。
Docker
Nextcloud 安装起来比较麻烦,因为它需要数据库、Web 服务器以及多个第三方软件库。与其经历 Nextcloud 繁琐的安装过程,我使用 Docker 来处理整个搭建过程。
Docker 允许开发者在“容器”中构建应用。在 Docker 术语中,容器是一个隔离环境,应用可以访问运行所需的全部组件,而不会接触其他额外内容。在本指南中,你将为 Sia 和 Nextcloud 创建容器,并使用名为 docker-compose 的功能将它们连接起来,使其能够相互通信。
设置 Docker 容器
为 Docker 创建文件和文件夹
首先,为这个方案创建一个目录,并下载所有必要的文件:
- 创建名为
sia-nextcloud的目录。你将在此文件夹中下载完整的区块链,因此请确保它位于至少有 6 GB 可用空间的驱动器上。 - 将下面三个文件下载到
sia-nextcloud目录中: - 在
sia-nextcloud中创建两个目录:sia-data和sia-uploads。
下载这些文件并创建相应文件夹后,你的目录应如下所示:
sia-nextcloud/
sia-data/
sia-uploads/
docker-compose.yml
Dockerfile.nextcloud
Dockerfile.sia
下面列出了每个文件的完整内容,并简要说明它们各自的作用。
docker-compose.yml
version: "3"
volumes:
nextcloud-data:
services:
sia:
build:
context: .
dockerfile: Dockerfile.sia
restart: on-failure
ports:
- "9980:9980"
volumes:
- ./sia-data:/mnt/sia-data
- ./sia-uploads:/mnt/sia-uploads
nextcloud:
build:
context: .
dockerfile: Dockerfile.nextcloud
ports:
- "8080:80"
links:
- sia:siad_container
volumes:
- ./sia-uploads:/mnt/sia-uploads
- nextcloud-data:/var/www/html
这个文件定义了 Web 应用的高层架构。它告诉 Docker 如何加载 Sia 和 Nextcloud 容器,并指定容器相互通信所需的配置选项。
此配置会将容器内的端口映射到本地计算机上的端口,因此 9980:9980 这一行会将本地计算机上的 9980 端口转发到 Sia 容器中的 9980 端口。这样,Sia 容器外部的应用就可以与其中的 Sia 服务器通信。同样,8080:80 会将本地计算机的 8080 端口转发到容器 Web 服务器的 80 端口。我选择 8080 是因为在大多数系统中,80 是特权端口,需要特殊权限才能访问。
此配置还设置了 Docker 存储卷,使容器能够保存持久化数据,即使容器本身被销毁,数据也不会丢失。./sia-data:/mnt/sia-data 让 Sia 容器能够访问你之前创建的 sia-data/ 文件夹。在容器内部,该路径会显示为 /mnt/sia-data。./sia-uploads:/mnt/sia-uploads 这一行实现了类似的效果。
Sia 和 Nextcloud 原本预期运行在同一系统、同一文件系统上。在本教程的架构中,它们运行在不同系统上,并拥有独立的文件系统,但两个容器配置中的 sia-uploads 行允许它们共享上传路径,而这正是所需的全部条件。
最后,nextcloud-data:/var/www/html 允许 Nextcloud 将配置数据持久化到名为 nextcloud-data 的 Docker 卷中。这样,重启 Nextcloud 容器时,就不需要从头重新配置 Nextcloud。
Dockerfile.sia
FROM debian:jessie-slim
ENV SIA_VERSION 1.3.2
ENV SIA_PACKAGE Sia-v$SIA_VERSION-linux-amd64
ENV SIA_ZIP ${SIA_PACKAGE}.zip
# Choose a binary release of Sia.
ENV SIA_RELEASE https://github.com/NebulousLabs/Sia/releases/download/v$SIA_VERSION/$SIA_ZIP
# Choose the directory within the container where Docker will place Sia.
ENV SIA_DIR /opt/$SIA_PACKAGE
RUN apt-get update && apt-get install -y \
socat \
wget \
unzip
# Download and install Sia.
RUN wget $SIA_RELEASE
RUN unzip $SIA_ZIP -d /opt
# Make the Sia ports available to the Docker container's host.
EXPOSE 9980 9981
# Configure the Sia daemon to run when the container starts.
# Specify the Sia directory as /mnt/sia so that you can view these files outside
# of Docker.
WORKDIR $SIA_DIR
ENTRYPOINT socat tcp-listen:9980,reuseaddr,fork tcp:localhost:8000 & ./siad --modules gctwr --sia-directory /mnt/sia-data --api-addr localhost:8000
这是 Sia 的 Dockerfile。它以精简版 Debian Jessie Linux 构建为基础创建 Docker 容器。随后,它下载最新版本的 Sia(本文撰写时为 1.3.2),解压缩并运行 Sia 服务器守护进程 siad。--modules gctwr 标志只加载租用 Sia 存储所需的模块。--sia-directory /mnt/sia-data 标志确保 Sia 使用 docker-compose.yml 中指定的持久化卷。
这个 Dockerfile 中令人困惑的部分是 socat 以及 --api-addr localhost:8000 标志的存在。尽管我已经尽了最大努力,Sia 开发者仍拒绝允许 siad 绑定到非 localhost 端口,即使这会破坏 Docker 场景。作为变通方案,本教程将 Sia 配置为绑定到 localhost:8000。随后,socat 绑定到非 localhost 的 9980 端口,并将流量转发到 localhost:8000。这种做法有点笨拙,但确实有效。
Dockerfile.nextcloud
FROM nextcloud:12.0.0-apache
EXPOSE 80
这个文件很简单,因为 Nextcloud 发布了自己的 Dockerfile。我唯一添加的内容就是让它监听 80 端口的一行配置。
启动容器
Docker 文件和文件夹准备好后,就可以启动容器了。在命令提示符中使用 cd 进入 sia-nextcloud 目录,然后输入以下命令:
docker-compose up -d
要检查容器状态,请使用 logs 命令:
docker-compose logs
Sia 加载完成后,你会在日志中看到类似下面这样的内容:
sia_1 | Loading...
sia_1 | (0/5) Loading siad...
sia_1 | (1/5) Loading gateway...
sia_1 | (2/5) Loading consensus...
sia_1 | (3/5) Loading transaction pool...
sia_1 | (4/5) Loading wallet...
sia_1 | (5/5) Loading renter...
sia_1 | Finished loading in 0.7577895 seconds
如果你在容器中运行 siac,会看到 Sia 已开始与 Sia 网络同步区块链:
docker exec -it sianextcloud_sia_1 ./siac consensus
Synced: No
Height: 730
Progress (estimated): 0.6%
配置 Sia
可选:加快区块链同步
Sia 必须下载完整区块链后才能开始使用,但这一过程可能需要 1~3 天。下面提供了一种可选的变通方法,可将同步时间缩短到 30~60 分钟。如果你愿意等待 Sia 自行完成同步,可以跳过此步骤,继续下一节。
应用区块链同步变通方法:
- 关闭 Docker 容器。
# Tell Sia to shut down gracefully.
docker exec -it sianextcloud_sia_1 ./siac stop
# Give Sia a few seconds to shut down gracefully.
sleep 5
# Stop the Docker containers.
docker-compose down
- 从最新的 SiaStats 快照下载 Sia 的 consensus.db 文件。
- 将
consensus.db文件复制到sia-nextcloud/sia-data/consensus/consensus.db(覆盖现有文件)。 - 重新启动 Docker 容器。
docker-compose up -d
- 定期检查容器日志,直到 Sia 处理完新的区块链并完成加载:
docker-compose logs
Sia 完成加载后,你会在日志中看到类似以下内容的消息:
sia_1 | Finished loading in 0.7577895 seconds
在我的测试中,使用 SSD 时这一过程耗时 50 分钟。如果在机械硬盘(HDD)上运行 Sia,则需要数小时。
完成区块链同步
现在,你需要等待 Sia 完成区块链同步。可以定期运行以下命令查看状态:
docker exec -it sianextcloud_sia_1 ./siac consensus
Sia 完成同步后,输出中会显示 Synced: Yes,如下所示:
Synced: Yes
Block: 000000000000000fdd4d3b48b096e048ad78f8f4fb88d21a025cd5411950e57e
Height: 117094
Target: [0 0 0 0 0 0 0 80 208 66 215 153 200 154 90 98 77 172 145 117 174 173 42 79 94 33 89 166 121 200 173 209]
Difficulty: 228263093718558163
为钱包充值 Siacoin
接下来,你需要在 Docker 容器中创建一个 Siacoin 钱包,并向其中发送至少 500 SC。
要创建新的 Sia 钱包,请输入以下命令:
docker exec -it sianextcloud_sia_1 ./siac wallet init
Sia 会生成一个由 29 个单词组成、名为“钱包种子”的密码短语,并将其显示在控制台中,示例输出如下:
guru delayed kidneys viewpoint rover request negative september number yodel aggravate
reheat soapy incur update later bimonthly bacon unusual godfather usher tiers pencil
ultimate vivid unsafe farming costume agile
Wallet encrypted with password:
guru delayed kidneys viewpoint rover request negative september number yodel aggravate
reheat soapy incur update later bimonthly bacon unusual godfather usher tiers pencil
ultimate vivid unsafe farming costume agile
这个种子控制着对 Siacoin 余额的访问,因此请将它复制到安全的地方,并务必不要把它发布到网上。Sia 会令人困惑地先显示种子,随后显示一模一样的密码。这让许多用户感到意外,但这是 Sia 的预期行为。
创建钱包后,需要使用种子密码短语将其解锁。输入以下命令,然后粘贴上面生成的种子。
docker exec -it sianextcloud_sia_1 ./siac wallet unlock
最后,生成一个新的 Siacoin 钱包地址:
docker exec -it sianextcloud_sia_1 ./siac wallet address
向你生成的钱包发送至少 500 SC。如果你没有 Siacoin,可以购买或挖矿获得。
创建租用合约
Sia 要求你预先购买存储空间,形式是“租用合约”(renter contracts,租户合约)。下面的命令会创建一项额度,让 Sia 用 500 SC 购买为期 12 周的存储合约。
docker exec -it sianextcloud_sia_1 ./siac renter setallowance 500SC 12w
在本文撰写时,500 SC 可以购买约 2 TB 的存储空间,因此如果需要更多空间,可以增加合约金额。随着 Siacoin 价值波动以及更多租户和主机加入市场,价格会随时间变化,但在合约期限内,你的存储价格是有保障的。
创建额度后,Sia 会开始建立存储合约。这一过程需要 20~30 分钟。你可以运行以下命令查看 Sia 已建立的合约数量:
docker exec -it sianextcloud_sia_1 ./siac renter contracts
当 Sia 至少创建了 20 个合约后,再继续下一步。
配置 Nextcloud
Sia 现在已经准备好开始存储数据,是时候配置 Nextcloud 容器了。
你可以通过命令行或 Web UI 配置 Nextcloud。这里使用命令行方法。如果你更喜欢通过 Web UI 设置 Nextcloud,可以访问 http://localhost:8080,并按照我的视频教程操作,从 13:44 开始。
安装 Nextcloud
加载 Nextcloud Docker 容器时,Nextcloud 的文件已经存在于容器中,但 Nextcloud 尚未安装,因此第一步是使用下面的命令安装 Nextcloud。
docker exec --user www-data -it sianextcloud_nextcloud_1 ./occ maintenance:install --database "sqlite" --database-name "nextcloud" --database-user "root" --database-pass "root" --admin-user "admin" --admin-pass "admin"
你应该会看到以下内容:
Nextcloud is not installed - only a limited number of commands are available
creating sqlite db
Nextcloud was successfully installed
上面的示例命令使用 root/root 作为数据库凭据,并使用 admin/admin 作为 Web 应用凭据。如果你要在受信任的网络(例如家中网络)上部署它,使用这些默认值没有问题。如果要将该系统部署在面向 Internet 的服务器上,则应选择不同且安全的凭据。
启用外部存储提供商
Sia 在 Nextcloud 中充当外部存储提供商,因此请输入以下命令,启用 Nextcloud 对外部提供商的支持。
docker exec --user www-data -it sianextcloud_nextcloud_1 php occ app:enable files_external
安装 Sia Nextcloud 应用
现在该安装 Nextcloud 的 Sia 应用了。遗憾的是,无法通过命令行安装 Nextcloud 应用,因此你需要在 Web 浏览器中完成以下步骤。
- 在浏览器中打开 http://localhost:8080,访问 NextCloud Web 应用。
- 输入你在上面“安装 Nextcloud”步骤中选择的 Nextcloud Web 应用凭据。如果使用的是默认凭据,则为
admin/admin。 - 在 Nextcloud 主屏幕中,点击右上角的齿轮图标,然后点击“Apps”。
- 点击左侧菜单中的“Tools”类别。
- 向下滚动到“Sia storage report”应用,然后点击其下方的“Enable”按钮。
配置 Sia 支持
整个过程的最后一步,是将 Sia Nextcloud 应用连接到你的 Sia 服务器实例。为此,请输入以下命令:
docker exec --user www-data -it sianextcloud_nextcloud_1 php occ files_external:create Sia sia null::null
docker exec --user www-data -it sianextcloud_nextcloud_1 php occ files_external:config 1 apiaddr siad_container:9980
docker exec --user www-data -it sianextcloud_nextcloud_1 php occ files_external:config 1 datadir /mnt/sia-uploads
你的 Sia Nextcloud 集成已经完成!
如果在浏览器中打开 Nextcloud 的 Files 标签页,你会看到一个 Sia 文件夹。Nextcloud 会自动将该文件夹中的所有文件备份到 Sia 网络。
在 Nextcloud 中使用 Sia
上传和下载文件
当你将文件上传到 Nextcloud 中的 Sia 文件夹时,应用会将其复制到本教程前面创建的 sia-uploads 文件夹。随后,Nextcloud 会在后台将文件上传到 Sia 网络,从而创建该文件的备份。
为了节省本地空间,你可以删除已经完全上传到 Sia 的文件。可以使用以下命令检查 Sia 已经完成备份的文件:
docker exec -it sianextcloud_sia_1 ./siac renter -v
Renter info:
Storage Spending: 1.449 SC
Upload Spending: 48.65 mS
Download Spending: 3.887 mS
Unspent Funds: 217.7 SC
Total Allocated: 219.2 SC
Tracking 8 files:
File size Available Progress Redundancy Renewing Sia path
5.60 MB Yes 86.67% 2.60 Yes 08 Hospital Beds.mp3
143.12 MB Yes 101.67% 3.00 Yes Futurama - s01e08 - A Big Piece Of Garbage.mp4
175.37 MB Yes 100.67% 3.00 Yes Futurama - s01e09 - Hell Is Other Robots.mp4
3.72 MB Yes 56.67% 1.70 Yes IMG_20170725_204611.jpg
3.37 MB Yes 100.00% 3.00 Yes IMG_20170725_204704.jpg
3.39 MB Yes 100.00% 3.00 Yes IMG_20170725_204727.jpg
3.64 MB Yes 96.67% 2.90 Yes IMG_20170725_204928.jpg
3.25 MB Yes 63.33% 1.90 Yes IMG_20170725_204944.jpg
冗余度达到 3.0 或更高的文件,都可以放心从 sia-uploads 中删除。
如果你尝试下载或查看已从 sia-uploads 中删除的文件,Sia Nextcloud 应用会自动重新下载该文件,使其在本地可用,不过具体需要几秒到几分钟,取决于文件大小和你的网速。
局限性
不支持子文件夹
虽然 Sia 原生允许用户创建文件夹来整理上传内容,但 Sia Nextcloud 应用不支持创建文件夹。Web 应用会显示这一选项,但如果你尝试添加文件夹,它只会显示“Could not create folder.”。
不支持应用内文本编辑
Nextcloud 应用包含一个简易文本编辑器,可以编辑云存储文件夹中的纯文本文件。遗憾的是,它无法处理 Sia 文件夹中的文件。如果你尝试编辑 Sia 文件夹中的文本文件,Nextcloud 会弹出一连串令人恼火的错误消息,并且不会保存你尝试进行的任何修改。
结语
本教程介绍了如何部署自己的 Nextcloud 实例,并使用 Sia 添加低成本文件备份功能。
我预计未来几个月会有越来越多的应用与 Sia 集成。就在几天前,Sia 宣布与Minio实现了新的集成,Minio 是一个分布式对象存储服务器。你在本教程中使用的技术将帮助你部署其他应用,并将它们与 Sia 集成。
- 更新(2017-09-13):Minio 集成即将完成。
随机一篇博客









