一、IPFS概述
IPFS(Inter Planetary File System)是一個點對點的分佈式超媒體分發協議,它整合了過去幾年最好的分佈式系統思路,爲所有人提供全球統一的可尋址空間,包括Git、自證明文件系統SFS、BitTorrent和DHT,同時也被認爲是最有可能取代HTTP的新一代互聯網協議。
IPFS用基於內容的尋址替代傳統的基於域名的尋址,用戶不需要關心服務器的位置,不用考慮文件存儲的名字和路徑。我們將一個文件放到IPFS節點中,將會得到基於其內容計算出的唯一加密哈希值。哈希值直接反映文件的內容,哪怕只修改1比特,哈希值也會完全不同。當IPFS被請求一個文件哈希時,它會使用一個分佈式哈希表找到文件所在的節點,取回文件並驗證文件數據。
IPFS是通用目的的基礎架構,基本沒有存儲上的限制。大文件會被切分成小的分塊,下載的時候可以從多個服務器同時獲取。IPFS的網絡是不固定的、細粒度的、分佈式的網絡,可以很好的適應內容分發網絡的要求。這樣的設計可以很好的共享各類數據,包括圖像、視頻流、分佈式數據庫、整個操作系統、模塊鏈、 數據備份,還有靜態網站。
IPFS提供了一個友好的WEB訪問接口,用戶可通過http://ipfs.io/hash 獲取IPFS公共網絡中的內容,也許在不久的將來,IPFS協議將會徹底替代傳統的HTTP協議。
也可以根據業務需要,搭建自己私有結點的IPFS系統。
二、準備環境
1、系統環境:ubuntu-18.04.1-live-server-amd64.ios
2、語言環境:go1.11.2.linux-amd64.tar.gz (下載網址:https://golang.org/dl/ ,下載不了是因爲被“牆”了)
3、IPFS軟件:go-ipfs_v0.4.18_linux-amd64.tar.gz (下載網址:https://github.com/ipfs/go-ipfs/releases/tag/v0.4.18)
4、兩個服務器IP爲:192.168.1.100,192.168.1.101
三、安裝Golang語言環境
sudo tar -C /usr/local -xzf go1.11.2.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
四、安裝IPFS
cd ~
tar xvfz go-ipfs_v0.4.18_linux-amd64.tar.gz #解壓縮
cd go-ipfs/
sudo ./install.sh #安裝IPFS
五、初始化IPFS
ipfs init #初始化IPFS
該操作執行後,默認會在~目錄下生成一個隱藏目錄.ipfs,作爲ipfs的local存儲
cd ~/.ipfs
ll #查看.ipfs中安裝的內容
drwxrwxr-x 5 he he 4096 Nov 22 15:51 ./
drwxr-xr-x 6 he he 4096 Nov 24 13:25 ../
-rw-rw-r-- 1 he he 27 Nov 22 15:51 api
drwxr-xr-x 32 he he 4096 Nov 22 15:54 blocks/
-rw-rw---- 1 he he 5278 Nov 22 15:46 config
drwxr-xr-x 2 he he 4096 Nov 22 15:51 datastore/
-rw------- 1 he he 190 Nov 22 15:09 datastore_spec
drwx------ 2 he he 4096 Nov 22 15:09 keystore/
-rw-rw-r-- 1 he he 0 Nov 22 15:51 repo.lock
-rw-r--r-- 1 he he 2 Nov 22 15:09 version
(以上三至五步分別在兩臺服務器上執行)
六、生成共享Key
我們要組建的是私有網絡,所有節點需要使用相同的私有key來加入網絡中,我們要使用go來下載go-ipfs-swarm-key-gen工具來生成共享key
go get github.com/Kubuxu/go-ipfs-swarm-key-gen #編譯工具
cd $GOPATH
cd go/src/github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm-key-gen/
go build
./ipfs-swarm-key-gen > ~/.ipfs/swarm.key # 生成key
cd ~/.ipfs/cat swarm.key #查看密鑰內容
/key/swarm/psk/1.0.0/
/base16/
afc9b81ccb00cf58ad0d0bb2fd7b26193e97451492c223770582b0aaed46b3ebscp ~/.ipfs/swarm.key 192.168.1.100:/home/he/.ipfs/ #將當前服務器下生成的key拷貝到192.168.1.100的相同目錄下
六、移除默認的bootstrap節點
ipfs bootstrap rm –all
removed /dnsaddr/bootstrap.libp2p.io/ipfs/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN
removed /dnsaddr/bootstrap.libp2p.io/ipfs/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa
removed /dnsaddr/bootstrap.libp2p.io/ipfs/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb
removed /dnsaddr/bootstrap.libp2p.io/ipfs/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt
removed /ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ
removed /ip4/104.236.179.241/tcp/4001/ipfs/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM
removed /ip4/104.236.76.40/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64
removed /ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu
removed /ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd
removed /ip6/2400:6180:0:d0::151:6001/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu
removed /ip6/2604:a880:1:20::203:d001/tcp/4001/ipfs/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM
removed /ip6/2604:a880:800:10::4a:5001/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64
removed /ip6/2a03:b0c0:0:1010::23:1001/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd
七、加入結點
- 在192.168.1.100服務器上查詢節點ID:
ipfs id
{
"ID": "QmTep4vpFo8G9vp6m6PLyyz4MX3DufMB39WiFQQbPHUJPD",
"PublicKey": "CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCY41neG2vMSiU1DkW6TneojCChDGO/V9Uy/9jn0eBkvl0SF5Vqj1c3zQwzat3Nhc5vrxZn6ffSpcR5bPUbt8zEl53AJ7y7lcP9a1w+iUe4Ht8X2NWMRVTHprSml82id8pDpf3hPM554BbjM63ulmX12N/mOG3BSN9WN+0AQHH+qbwSjdWrwYXplXAbyjMztW9T+7fXruCG0uT8Js8Uuj7/u9mbnbgmFvx1dsnLMaa2LA5fqkyAeIMvC3SIvHgmbnX69qzjZn3CN6r1FFfY/LxMOr0GKkUmh3WXmxCWUCf//+rtHoUwypbIoL0SNOSbPLxS+dZMpC0W2EJlbfrVlP/NAgMBAAE=",
"Addresses": null,
"AgentVersion": "go-ipfs/0.4.18/",
"ProtocolVersion": "ipfs/0.1.0"
}
- 在192.168.1.101服務器上查詢節點ID:
ipfs id
{
"ID": "QmYNYDp5PEi64dgTYRdci3XhtmQEnZVBQTATinWw6fq3Ac",
"PublicKey": "CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDpF9xJrTde996NuhNmED5Xg90wRqvtMQJtovRcq5o79DldeQeuKe9ket7/+TIs5Cn+QQekwJCClmBWh7e+xNL8RP5Mer0fABw4yAESR8E0PhJhcbI0Wlgh2X18NBFUmriIZqzcKedX5MzPa7yFhNoDtGotAmXb9smoVIRZVOg9CqR0xG0RqeFwBZGXCtaeRxK18oFHNwZ3t6G5xycvyeXpYxIoDfqUO7mb7c1g1MTn3gOyUbi4kAZvWAAfdmnPiCEI7nHyhMY0ZOJqaqPh8AOxuVLtcHgPYfRgHU+QMkcEHVMzz2Pu41LLS2NWs8i8CjM5N+EBuorndWN2LfEd0xeNAgMBAAE=",
"Addresses": null,
"AgentVersion": "go-ipfs/0.4.18/",
"ProtocolVersion": "ipfs/0.1.0"
}
- 在192.168.1.100服務器上加入節點ID192.168.1.101:
ipfs bootstrap add /ip4/192.168.1.101/tcp/4001/ipfs/QmYNYDp5PEi64dgTYRdci3XhtmQEnZVBQTATinWw6fq3Ac
- 在192.168.1.101服務器上加入節點192.168.1.100:
ipfs bootstrap add /ip4/192.168.1.100/tcp/4001/ipfs/QmTep4vpFo8G9vp6m6PLyyz4MX3DufMB39WiFQQbPHUJPD
八、配置節點文件(實際上移除結點、增加結點等操作實現都最終在修改config文件)
cd ~/.ipfs
vim config
{
"API": {
"HTTPHeaders": {}
},
"Addresses": {
"API": "/ip4/127.0.0.1/tcp/5001", #127.0.0.1改爲所在服務器IP
"Announce": [],
"Gateway": "/ip4/127.0.0.1/tcp/8080",
"NoAnnounce": [],
"Swarm": [
"/ip4/0.0.0.0/tcp/4001",
"/ip6/::/tcp/4001"
]
},
"Bootstrap": [
"/ip4/192.168.1.101/tcp/4001/ipfs/QmYNYDp5PEi64dgTYRdci3XhtmQEnZVBQTATinWw6fq3Ac"
], #使用ipfs bootstrap add 命令加入的對方節點
"Datastore": {
"BloomFilterSize": 0,
"GCPeriod": "1h",
"HashOnRead": false,
"Spec": {
"mounts": [
{
"child": {
"path": "blocks",
"shardFunc": "/repo/flatfs/shard/v1/next-to-last/2",
"sync": true,
"type": "flatfs"
},
"mountpoint": "/blocks",
"prefix": "flatfs.datastore",
"type": "measure"
},
{
"child": {
"compression": "none",
"path": "datastore",
"type": "levelds"
},
"mountpoint": "/",
"prefix": "leveldb.datastore",
"type": "measure"
}
],
"type": "mount"
},
"StorageGCWatermark": 90,
"StorageMax": "10GB" #最大可用存儲空間
},
"Discovery": {
"MDNS": {
"Enabled": true,
"Interval": 10
}
},
"Experimental": {
"FilestoreEnabled": false,
"Libp2pStreamMounting": false,
"P2pHttpProxy": false,
"QUIC": false,
"ShardingEnabled": false,
"UrlstoreEnabled": false
},
"Gateway": {
"APICommands": [],
"HTTPHeaders": {
"Access-Control-Allow-Headers": [
"X-Requested-With",
"Range"
],
"Access-Control-Allow-Methods": [
"GET"
],
"Access-Control-Allow-Origin": [
"*"
]
},
"PathPrefixes": [],
"RootRedirect": "",
"Writable": false
},
"Identity": {
"PeerID": "QmYNYDp5PEi64dgTYRdci3XhtmQEnZVBQTATinWw6fq3Ac",
"PrivKey": "CAASqQkwggSlAgEAAoIBAQDpF9xJrTde996NuhNmED5Xg90wRqvtMQJtovRcq5o79DldeQeuKe9ket7/+TIs5Cn+QQekwJCClmBWh7e+xNL8RP5Mer0fABw4yAESR8E0PhJhcbI0Wlgh2X18NBFUmri
IZqzcKedX5MzPa7yFhNoDtGotAmXb9smoVIRZVOg9CqR0xG0RqeFwBZGXCtaeRxK18oFHNwZ3t6G5xycvyeXpYxIoDfqUO7mb7c1g1MTn3gOyUbi4kAZvWAAfdmnPiCEI7nHyhMY0ZOJqaqPh8AOxuVLtcHgPYfRgHU+QMk
cEHVMzz2Pu41LLS2NWs8i8CjM5N+EBuorndWN2LfEd0xeNAgMBAAECggEAYOpj1FpqCFmFNmZkxG4Cjb6tC/KGb5OOD+nOMm3DLiRoaZ31/ItBFwUjjUiefR3M/AMr22uZakJ+AdxiILaThwJkvYXW9nnEQjOehmxBP6iDW
fK9Bpl9xW05iJfZkNTX3xbZzpy5rMjcA24nL1jCkQHFl7tEgMXGqO+jK8Vq3l2wSY9z7c/DJwFrtSzJJxk34qgEnlzLA/aNislRDMqP+3CR3x+f/d+rzYof41b77yuWXF20tn2iWYMa7tSKFXPHNzC7CjQw5waKFhcoNni3
iZ8Snfy6pQuWGmCJqcl+WxnLgVxQNdKgKAPjaXM7kRRAZYUF07+7mElS32BdjlS/3QKBgQDyuqmHIFUZsg/ZMSa4CaCujvlFpQO+7gO1p4R4dS++IY3xD9yNek9kngQb9GPmpMOMKS5cwMNXByuBb5KY2AWC0nOXEizfl90
zDrXI+SdKxuQhw9/lhGKEAYMij+XM23JsbFQdnDBq8ayt72C0Dt1M9Do/NZdFlDQeLC/YQVYVXwKBgQD11lRhcd1o5Nb229RLo7AHzVkCwO+1TNQMOge42JzpA351fcGKvL+RkVstwCQGdhDEN4F3dJaEGs/6zYuD1dS9zt
Ym4Zc4lrqwQ3v51MriEEP24E9WjxxO0icbftrrn8iJWJiP/JjAKQZUZhGnqkr6ME8LYPcv3gIUWEBvSYpukwKBgQDydH/YSPSYeSOZiJ4rYPqOwqO97GnEcs1jy1PoWu34ll3JOFXPQChD0g86uTB894GY5J256pZ0vOW5I
fCmGcnPdlYdxfrq0TATyxLMEAwuhmLkU1q3UThysWwCvwgFTAKMyNxww04d1Q/uodjPorVtI9t2vho/Vx2EMhEMi57oMwKBgQCC8bLoZJomsR2/R8CAuaOdxEdRLCuCSnX4PUC3uMl7ZB0Lv/xDRd5UTzRd3iZSOrkbiuUv
F67ElvOJB8r0YgV7RJzVAPxnbAHsuUVkAXA/kaJh8YDQ/lF5un6SKrO5JdbPMZ2xtD44vKFeey+UOyTMtsajrPZ9TKeW5psLrARMeQKBgQCbtXDnE0fcJvHGAnbQu5xVWMs6c9fnXBD6U6UN68BbLt2t5X49dce6Ef1KoLX
D4gIE6Y4GYgBsl7sQHXlJl800XdkhaWFrvzw+9R5/eLEh0XXqts/mOL1R6xnozEvEnVrF+0jecDlw6Fee1X1pB8g1eer7G8odP6uhiGWY3+pOEw=="
},
"Ipns": {
"RecordLifetime": "",
"RepublishPeriod": "",
"ResolveCacheSize": 128
},
"Mounts": {
"FuseAllowOther": false,
"IPFS": "/ipfs",
"IPNS": "/ipns"
},
"Pubsub": {
"DisableSigning": false,
"Router": "",
"StrictSignatureVerification": false
},
"Reprovider": {
"Interval": "12h",
"Strategy": "all"
},
"Routing": {
"Type": "dht"
},
"Swarm": {
"AddrFilters": null,
"ConnMgr": {
"GracePeriod": "20s",
"HighWater": 900,
"LowWater": 600,
"Type": "basic"
},
"DisableBandwidthMetrics": false,
"DisableNatPortMap": false,
"DisableRelay": false,
"EnableRelayHop": false
}
}
九、跨域資源共享CORS配置
IPFS結點上線ipfs daemon
爲了後續的開發方便,我們還需要對跨域資源共享( CORS )進行配置,ctrl- c退出ipfs,然後按照下面的步驟進行跨域配置(如果加入時出現問題,可以重啓服務,在新的SSH窗口配置CORS)。
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'
ipfs config --json Addresses.API '"/ip4/0.0.0.0/tcp/5001"'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "GET", "POST", "OPTIONS"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Credentials '["true"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Headers '["Authorization"]'
ipfs config --json API.HTTPHeaders.Access-Control-Expose-Headers '["Location"]'
十、配置IPFS服務開機自動啓動
1. 創建服務文件
sudo vim /etc/systemd/system/ipfs.service
內容如下:
[Unit]
description=ipfs p2p daemon
After=network.target
Requires=network.target[Service]
ExecStart=/usr/local/bin/ipfs daemon[Install]
WantedBy=multi-user.targe最後,說一下/etc/systemd/system/下的配置文件(XXXX.service),
其中有三個配置項,[Unit] / [Service] / [Install]
1) [Unit] 區塊:啓動順序與依賴關係。
2) [Service] 區塊:啓動行爲,如何啓動,啓動類型。
3) [Install] 區塊,定義如何安裝這個配置文件,即怎樣做到開機啓動。
2. 服務插入
#給予運行權
sudo chmod +x /etc/systemd/system/ipfs.service
# 重新加載配置文件
# 設置IPFS開機自動啓動
sudo systemctl daemon-reloadsudo systemctl enable ipfs.service
# 重啓服務
sudo systemctl restart ipfs.service