IPFS是最近很是热门的一个分布式网络系统,其主要支持如下功能:ios
ipfs add
,将本地的一个文件(夹)上传到一个去中心化的web中,返回一个和文件夹内容有关的Hash,记为fsHash
。以后用户既能够经过ipfs
客户端根据fsHash
来获取内容;也能够经过官方提供的https gateway,用https://ipfs.io/ipfs/QmdPtC3T7Kcu9iJg6hYzLBWR5XCDcYMY7HV685E3kH3EcS/2015/09/15/hosting-a-website-on-ipfs/
之类的连接直接访问获取ipfs name publish
。每次上传新的文件夹后,获得的Hash
均不一样,这给访问带来了很大的不便。为了解决这个问题,咱们在持有私钥的状况下能够把fsHash
publish到一个和公钥相关的地址keyHash
,这样,用户就能够用https://ipfs.io/ipns/keyHash
来访问不一样的内容,而不用担忧内容版本的变化ipfs dns
。由于keyHash
很是长,ipfs
提供了一种可以经过https://ipfs.io/ipns/intmainreturn0.com
方式访问https://ipfs.io/ipns/keyHash
的方法:配置intmainreturn0.com
的DNS,添加TXT
项,内容是dnslink=/ipns/keyHash
便可但愿达到的效果是:git
name publish
https://ipfs.io
的可用性这一块都依赖于Travis-CI的功能。但这也要求咱们把私钥交给第三方……github
首先咱们须要生成一对公钥私钥:web
ipfs key gen -t ed25519 blog # 这里会输出keyHash base64 ~/.ipfs/keystore/blog #把输出的私钥复制成一行
而后运行:docker
travis encrypt SECKEY_BASE64=私钥
输出:浏览器
secure: "BLAHBLAH"
以后咱们就能够编写.travis.yml
了:缓存
sudo: required dist: trusty services: - docker env: global: - secure: "BLAHBLAH" branches: only: - master before_install: - git submodule update --init --recursive - mkdir -p ipfs/staging ipfs/data - docker run -d --name ipfs_host -v $(pwd)/ipfs/staging:/export -v $(pwd)/ipfs/data:/data/ipfs -p 18080:8080 -p 14001:4001 -p 15001:5001 ipfs/go-ipfs:latest # 启动daemon - sleep 3 # 等它建立好FS - ls -l ipfs/data - echo $UID - sudo chmod -R 777 ipfs/data/keystore - echo $SECKEY_BASE64 | base64 -d > ipfs/data/keystore/blog install: - rm -rf public || exit 0 - wget https://github.com/gohugoio/hugo/releases/download/v0.27.1/hugo_0.27.1_Linux-64bit.tar.gz && tar xzf hugo_0.27.1_Linux-64bit.tar.gz script: - ./hugo -v after_success: - cp -r ./public ipfs/staging - export DATA_HASH=$(docker exec ipfs_host ipfs add -r /export/public/ | tail -1 | awk '{print $2}') # 提取出fsHash - echo "DATA_HASH = $DATA_HASH" - docker exec ipfs_host ipfs name publish --key=blog $DATA_HASH # 用blog key上传 - sleep 5 # Wait for a while
这样,编译完成的东西就会自动上传到IPFS中并注册ipns了。这个时候,应该能够经过https://ipfs.io/ipns/keyHash
来访问了网络
intmainreturn0.com
反代IPFS访问大多数人很难记住长长的https://ipfs.io/ipns/fooooooooobbbbbbaaaaaaarrrrrrr
,并且ipfs.io
随时有可能被墙,所以咱们须要反代一下其的访问。分布式
反代须要咱们本地跑一个ipfs
和一个caddy
,目录结构:ui
. |-- caddy | `-- Caddyfile |-- docker-compose.yml `-- ipfs |-- data # 空文件夹 `-- staging # 空文件夹
docker-compose.yml
:
version: '2' services: ipfs: image: jbenet/go-ipfs restart: always volumes: - /home/htfy96/ipfs-stack/ipfs/staging:/export - /home/htfy96/ipfs-stack/ipfs/data:/data/ipfs caddy: image: abiosoft/caddy restart: always volumes: - /home/htfy96/ipfs-stack/caddy/Caddyfile:/etc/Caddyfile depends_on: - ipfs ports: - 443:443
Caddyfile
:
gzip log stdout rewrite { r (.*) to /ipns/keyHash/{1} } proxy /ipns/keyHash ipfs:8080
最后直接docker-compose up -d
就能够了,Caddy
会自动解决TLS证书获取等问题。
目前来看,去中心化、效率与便利彷佛三者中最多只能知足二者。要想让通常人也能用浏览器访问就必需要一个中心化的gateway,要想让做者随时随地上传就须要一个中心化的auto build/deploy系统。 整体来看,转到了IPFS以后,控制权从最早的彻底VPS owned,变成了Github / TravisCI / IPFS net / VPS 四方面共同拥有。好处是只要IPFS net不挂,历史上已经上传的东西都能找到;坏处是Github/Travis CI能够篡改内容,或者VPS挂了就不能反代访问。有利有弊须要权衡。