在AWS上托管IPFS节点

温馨提示:这篇文章已超过845天没有更新,请注意相关的内容是否还可用!

本文由IPFS原力区收集译制,版权所属原作者

前言

我们已经在ipfs.runfiliation.com上启动了一个ipfs节点,可以试一试:

  • 在网关上查看对象:https: //ipfs.runfission.com/ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv
  • 通过TCP连接,地址为:/ip4/3.215.160.238/tcp/4001/ipfs/QmVLEz2SxoNiFnuyLpbXsH6SvjPTrHNMU88vCQZyhgBzgw
  • 通过安全的Websocket连接:/dns4/ipfs.runfission.com/tcp/4003/wss/ipfs/QmVLEz2SxoNiFnuyLpbXsH6SvjPTrHNMU88vCQZyhgBzgw
本指南包括3个部分:
  • 设置IPFS节点
  • 将s3设置为数据存储
  • 设置TLS +(安全)Websocket

正文

一、设置IPFS节点 设置EC2

  • 启动实例
  • 我们使用了Ubuntu 18.04 64位(x86)
  • t2.large(t2.micro免费版)
  • 添加安全组
  • 称它为 ipfs-node
  • 您现在可以打开所有流量
  • 稍后您将需要一个限制性更强的防火墙
  • 端口22上的所有SSH流量
  • 端口80/443上的所有HTTP / HTTPS流量
  • 端口8080(网关)上的所有TCP通信量(网关)
  • 端口4001-4003(ipfs连接端口)上的所有TCP通信量
  • 创建新的密钥对
  • 命名: aws-ipfs-node
  • cd ~/下载
  • 使文件对当前用户只读: sudo chmod 400 aws-ipfs-node.pem
  • 移至ssh keys文件夹:mv aws-ipfs-node.pem ~/.ssh

SSH实例

  • ssh -i ~/.ssh/aws-ipfs-node.pem ubuntu@$PUBLIC_DNS
  • 在我们的例子中:ssh -i ~/.ssh/aws-ipfs-node.pem ubuntu@ec2-3-215-160-238.compute-1.amazonaws.com

安装IPFS:

  • 下载ipfs :wget https://dist.ipfs.io/go-ipfs/v0.4.22/go-ipfs_v0.4.22_linux-amd64.tar.gz(或最新版本)
  • 解压: tar xvfz go-ipfs_v0.4.22_linux-amd64.tar.gz
  • 将二进制文件移至$ PATH:sudo mv go-ipfs/ipfs /usr/local/bin
  • 清理: rm go-ipfs_v0.4.22_linux-amd64.tar.gz
  • 清理: rm -rf go-ipfs

检查点:

ipfs version should print ipfs version 0.4.22(或您下载的任何版本)

初始化回购

  • 编辑用于设置环境变量的用户配置文件:(sudo vim ~/.profile或您使用的任何文本编辑器)
  • 添加 export IPFS_PATH=/data/ipfs(或您希望在任何地方安装ipfs的地方)
  • 源 ~/.profile
  • sudo mkdir -p $IPFS_PATH
  • 允许当前用户访问ipfs数据 sudo chown ubuntu:ubuntu $IPFS_PATH
  • 使用server配置初始化ipfs repo :ipfs init -p server
  • 更改配置:
  • 使用ipfs配置数据存储设置最大存储空间。StorageMax XXGB(如果连接到s3,则将其提升很多
  • 启用网关: ipfs配置地址。网关/ip4/0.0.0/tcp/8080
  • 或者,可以通过/data/ipfs/config直接编辑来更改它们

运行后台程序

  • 创建systemctl服务
  • 创建/lib/systemd/system/ipfs.service包含内容的文件
[Unit]

Description=ipfs daemon

[Service]

ExecStart=/usr/local/bin/ipfs daemon–enable-gc

estart=always

User=ubuntu

Group=ubuntu

Environment=”IPFS_PATH=/data/ipfs”

[Install]

WantedBy=multi-user.target

  • 重新启动systemctl daemon以便找到新服务:sudo systemctl daemon-reload
  • 告诉systemctl ipfs应在启动时启动:sudo systemctl enable ipfs
  • 启动ipfs:sudo systemctl start ipfs
  • 检查状态: sudo systemctl status ipfs
  • 应该会看到
 ipfs.service – ipfs daemon 

Loaded: loaded (/lib/systemd/system/ipfs.service; enabled; vendor preset: enabled)

Active: active (running) since Wed 2019-08-28 20:38:04 UTC; 4s ago

Main PID: 30133 (ipfs)

Tasks: 9 (limit: 4915)

CGroup: /system.slice/ipfs.service

└─30133 /usr/local/bin/ipfs daemon –enable-gc

ipfs[30133]: Swarm listening on /ip4/127.0.0.1/tcp/4001

ipfs[30133]: Swarm listening on /ip4/172.31.43.10/tcp/4001

ipfs[30133]: Swarm listening on /ip6/::1/tcp/4001

ipfs[30133]: Swarm listening on /p2p-circuit

ipfs[30133]: Swarm announcing /ip4/127.0.0.1/tcp/4001

ipfs[30133]: Swarm announcing /ip6/::1/tcp/4001

ipfs[30133]: API server listening on /ip4/127.0.0.1/tcp/5001

ipfs[30133]: WebUI: http://127.0.0.1:5001/webui

ipfs[30133]: Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/80

ipfs[30133]: 后台程序已就绪

检查点:

在浏览器中加载$public_dns:8080/ipfs/qms4ustl54uo8fzr9455qaxzwumiuhyvmcx9ba8nuh4uvv,您应该会看到docs目录

在我们的例子中:

http://ec2-3-215-160-238.compute-1.amazonaws.com:8080/ipfs/qms4ustl54uo8fzr9455qaxzwumiuhyvmcx9ba8nuh4uvv

二、将s3设置为数据存储

注意:在将数据添加到ipfs节点之前执行此操作。这将破坏任何已经添加的数据。

创建s3 bucket

  • 我们将调用我们的ipfs-node
  • 确保它与ec2实例位于相同的区域
  • 保留公共访问权限(只有我们的节点才能访问这些对象)
  • 获取节点的访问密钥
  • 转到我的aws安全证书
  • 用户在侧边栏
  • 添加用户
  • 我们将调用我们的ipfs-node访问类型:程序访问
  • 目前:s3完全访问权限,以后可以定制
  • 记下访问密钥和秘密访问密钥(请注意:由于您无法再次访问秘密密钥,请立即执行此操作)

构建工具

  • 安装 go
  • 必须与用于构建ipfs的版本相同
  • ipfs version –all
  • wget https://dl.google.com/go/go$VERSION.linux-amd64.tar.gz
  • in our case:获取https:// dl.google.com / go / go1.12.7.linux-amd64.tar.gz`
  • tar xvfz go1.12.7.linux-amd64.tar.gz
  • sudo mv go /usr/local
  • rm go1.12.7.linux-amd64.tar.gz
  • 安装构建工具
  • sudo apt update
  • sudo apt install make
  • sudo apt install build-essential
  • 设置环境量
  • 编辑~/.profile:vim ~/.profile
  • export PATH=$PATH:/usr/local/go/bin在底部添加
  • export GOPATH=/home/ubuntu/go在底部添加
  • source ~/.profile

构建并安装s3插件

  • git clone https://github.com/ipfs/go-ds-s3.git
  • cd go-ds-s3
  • 构建插件: make build
  • 如果不针对最新版本的IPFS构建,请设置环境变量IPFS_VERSION = vXYZ
  • 输出是 go-ds-s3.so
  • 安装插件: make install
  • 移动go-ds-s3.so到data/ipfs/plugins

配置ipfs以使用插件

  • 编辑配置: vim /ipfs/data/config
  • 在Datastore.Spec.mounts下应该有2个项目
  • 将第一个替换为
{

    “child”: {

      “type”: “s3ds”,

      “region”: “us-east-1”,

      “bucket”: “$bucketname”,

      “accessKey”: “”,

      “secretKey”: “”

    },

    “mountpoint”: “/blocks”,

    “prefix”: “s3.datastore”,

    “type”: “measure”

  }

  • 确保将该区域和bucket设置为s3 bucket的区域和bucket名称
  • 使用这里前面生成accessKey和secretKey
  • 编辑datastore_spec以匹配新的数据存储
  • vim /ipf/data/datastore_spec
  • 改成:
{“mounts”:[{“bucket”:”$bucketname”,”mountpoint”:”/blocks”,”region”:”us-east-1″,”rootDirectory”:””},{“mountpoint”:”/”,”path”:”datastore”,”type”:”levelds”}],”type”:”mount”}
  • 再次确保该区域和bucket匹配实际的s3 bucket
  • 重启ipfs: sudo systemctl重启ipfs
  • 确保没有systemctl状态ipfs错误

检查点:

将文件上传到ipfs,然后检查s3以确保在其中添加了ipfs dag对象

例:

  • 下载一些图片 wget https://fission.codes/assets/images/fission-1200×400.png
  • 添加到ipfs ipfs add fission-1200×400.png
  • 去检查s3并确保它具有ipfs对象

三、设置TLS +(安全)Websocket

安装 nginx

  • sudo apt update
  • sudo apt install nginx
  • 检查状态: systemctl status nginx
  • 应该看到类似
nginx.service – A high performance web server and a reverse proxy server

   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)

   Active: active (running) since Wed 2019-08-28 21:23:08 UTC; 32s ago

     Docs: man:nginx(8)

  Process: 31246 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCES

  Process: 31234 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status

 Main PID: 31248 (nginx)

    Tasks: 3 (limit: 4915)

   CGroup: /system.slice/nginx.service

           ├─31248 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;

           ├─31251 nginx: worker process

           └─31252 nginx: worker process

检查点:

$PUBLIC_DNS在浏览器中加载,您应该会看到nginx homepage

设置域+ TLS

  • 将域名指向您实例的公共DNS
  • 在我们的例子中是ipfs.runfission.com
  • 将证书和密钥添加到 nginx
  • 简易模式:
  • 有一些工具可以帮助您解决这个问题。例如,请参见certbot。可以生成证书+自动创建nginx配置
  • 手动:
  • 导入密钥+证书到实例
  • /etc/ssl/ipfs.runfission.com.key
  • /etc/ssl/ipfs.runfission.com.pem
  • 在/etc/nginx/site -available/default编辑nginx配置
  • 从2台服务器开始
  • 首先是一个简单的服务器,将http流量重定向到https
server {

if ($host = ipfs.runfission.com) { return 301 https://$host$request_uri; } listen 80; listen [::]:80; server_name ipfs.runfission.com; return 404;

  • 将https流量重定向443到ipfs网关,地址为8080
server {

server_name ipfs.runfission.com;

listen [::]:443 ssl ipv6only=on;

listen 443 ssl;

ssl_certificate /etc/ssl/ipfs.runfission.com.pem; ssl_certificate_key /etc/ssl/ipfs.runfission.com.key;

location / {

proxy_pass http://127.0.0.1:8080;

proxy_set_header Host $host;

proxy_cache_bypass $http_upgrade;

}

 }

检查点:

加载

https://$DOMAIN_NAME/ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv

您应该会看到通过https提供的ipfs文档。

添加安全的websocket

  • 告诉ipfs在ws端口上监听
  • 编辑 /data/ipfs/config
  • 添加“/ip4/0.0.0.0/tcp/4002/ws”到Address.Swarm
  • 推荐:通过设置Swarm.EnableRelayHop为允许中继跳true
  • 重启ipfs sudo systemctl restart ipfs
  • 使用Nginx设置安全代理
  • 在以下位置编辑nginx配置 /etc/nging/sites-available/default
  • 加:
server {

server_name ipfs.runfission.com;

listen [::]:4003 ssl ipv6only=on;

listen 4003 ssl;

ssl_certificate /etc/ssl/ipfs.runfission.com.pem;

ssl_certificate_key /etc/ssl/ipfs.runfission.com.key;

location / { proxy_pass http://127.0.0.1:4002;

proxy_http_version 1.1;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection “upgrade”;

}

}

  • 重新启动nginx sudo systemctl restart nginx

检查点:

转到websocket.org并测试您的连接wss://$DOMAIN_NAME:4003

真正的考验:

启动一个js ipfs节点(使用我们的awesome get ipfs包)并通过执行ipfs.swarm.connect或将multiaddr添加到节点引导列表来连接到/dns4/$domain_name/tcp/4003/wss/ipfs/$peer_ID。

请稍等(等待连接),打印对等方列表并确保包含托管节点:

setTimeout(async ()=> {

const peers = (await ipfs.swarm.peers()).map(p => p.peer._idB58String);

console.log(peers);

}, 1000)

—END—

本文由IPFS原力区编译,原文链接:

https://talk.fission.codes/t/a-loosely-written-guide-to-hosting-an-ipfs-node-on-aws/234

【IPFS原力区】 价值观:价值 共建 共享 荣耀

总部位于上海,聚集基于分布式网络&存储的众多技术大咖和爱好者,深耕基于 IPFS 的商业生态建设和社区发展。

每周二举办“分布式存储网络”主题沙龙,聚集了众多技术大咖和 IPFS 爱好者,通过持续输出全面、精细、优质的 IPFS 咨询和技术支持,将生态中的爱好者转化为 IPFS 支持者和参与者,共建 IPFS 生态的健康发展。