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掛了就不能反代訪問。有利有弊須要權衡。