使用 Sia 和 Nextcloud 自建低成本云存储应用
原文由 Michael Lynch 于 发布,订阅该博客
在今天的文章中,我将向你展示如何搭建一个类似 Dropbox 或 Google Drive 的云存储网页应用,但成本要低得多。这套方案的云存储成本约为每月每 TB 0.60 美元。相比之下,同样的存储空间在 Dropbox 上每月需要 8.25 美元,在 Google Drive 上则需要 10 美元。
视频教程
我录制了一个视频演示,逐步讲解本指南的所有操作并展示最终效果。视频实现的结果与本文完全一致,只不过视频中更多地通过图形界面进行配置,而本文则尽可能使用命令行。
如果你更喜欢看视频教程,建议你先下载下方“为 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 来为网页应用提供后端存储。我之前写过几篇文章介绍 Sia,它是我最喜欢的新技术之一。Sia 是一个去中心化的文件存储网络。用户可以接入 Sia 并出租自己闲置的磁盘空间来赚钱。目前 Sia 网络上的价格非常低,这也是你能以如此低的成本搭建云存储方案的原因。
Nextcloud
如果你对 Sia 有所了解,可能会知道 Sia 有一个名为Sia-UI 的图形界面。这个界面功能有限,最大的缺点是它是一个桌面应用,因此你只能在一台电脑上访问文件。它也不支持任何媒体预览,如果想在云存储中查看照片或视频,必须先把文件复制到本地文件夹再打开。
为了弥补 Sia-UI 的不足,本教程中使用了 Nextcloud。Nextcloud 是一款开源的云存储网页应用,提供了类似 Dropbox 或 Google Drive 的网页界面。Nextcloud 被设计为可兼容多种不同的存储后端,包括 Amazon S3、Dropbox 和 OpenStack。2017 年 2 月,Sia 团队为 Nextcloud 编写了一个定制插件,本教程将使用它来连接 Nextcloud 与 Sia。
如果你想在继续之前先体验一下 Nextcloud,可以在 Nextcloud 官网试用免费的即时演示。
Docker
Nextcloud 的安装比较繁琐,因为它需要数据库、Web 服务器以及若干第三方软件库。与其一步步走完繁琐的安装流程,我在本文中使用 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
该文件定义了网页应用的高层架构。它告诉 Docker 如何加载 Sia 和 Nextcloud 容器,并指定容器之间通信所需的配置选项。
该配置将容器内的端口映射到你本机的端口,因此 9980:9980 这一行会将本机的 9980 端口转发到 Sia 容器内的 9980 端口,使容器外的应用能够与容器内的 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 绑定到非本地端口,即使这会导致 Docker 场景无法正常工作。作为变通方案,本教程将 Sia 配置为绑定到 localhost:8000,再由 socat 绑定到非本地的 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 个单词组成的助记词,称为“钱包种子”(wallet seed),并在控制台中显示,类似于下面的示例输出:
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 容器了。
你可以通过命令行或网页界面来配置 Nextcloud。本文使用命令行方式。如果你更喜欢通过网页界面来配置 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 作为网页应用的登录凭据。如果你是在家庭等可信网络中部署,使用这些默认值没有问题。如果你要将该系统部署到面向公网的服务器上,则应选择更安全、不同的凭据。
启用外部存储
Sia 在 Nextcloud 中作为外部存储提供方,因此请输入以下命令以启用 Nextcloud 对外部存储的支持。
docker exec --user www-data -it sianextcloud_nextcloud_1 php occ app:enable files_external
安装 Sia Nextcloud 应用
现在来安装 Nextcloud 的 Sia 应用。遗憾的是,目前无法通过命令行安装 Nextcloud 应用,因此你需要在浏览器中完成以下步骤。
- 在浏览器中打开http://localhost:8080 以访问 Nextcloud 网页应用。
- 输入你在上述“安装 Nextcloud”步骤中设置的 Nextcloud 网页应用凭据。如果你使用的是默认凭据,则为
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 的“文件”标签页,会看到一个 Sia 文件夹。Nextcloud 会自动将该文件夹中的所有文件备份到 Sia 网络。
在 Nextcloud 中使用 Sia
上传和下载文件
当你将文件上传到 Nextcloud 中的 Sia 文件夹时,应用会先将其复制到你在本教程前面创建的 sia-uploads 文件夹中。随后,Nextcloud 会在后台将文件上传到 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 应用不支持创建文件夹。网页应用虽然提供了该选项,但如果你尝试新建文件夹,只会提示“Could not create folder”(无法创建文件夹)。
不支持应用内文本编辑
Nextcloud 应用内置了一个简易的文本编辑器,用于编辑云存储文件夹中的纯文本文件。但遗憾的是,该功能对 Sia 文件夹中的文件无效。如果你尝试编辑 Sia 文件夹中的文本文件,Nextcloud 会弹出大量报错信息,并且不会保存你的任何修改。
总结
本教程向你展示了如何部署自己的 Nextcloud 实例,并通过 Sia 实现低成本的文件备份。
预计未来几个月会有越来越多的应用与 Sia 集成。几天前,Sia 宣布与分布式对象存储服务器Minio 实现了新的集成。本教程中所使用的技术将有助于你部署其他应用并将其与 Sia 集成。
- 更新(2017-09-13):Minio 集成已接近完成。
随机一篇博客










评论
登录后参与讨论