用 Docker 安裝 IPFS

  • FrankFrank
  • /
  • 7 分鐘閱讀
  • /
  • Mar 7, 2021
  • /
  • - views

IPFS 是一個非常科幻的檔案存儲系統。 如果想了解什麼是 IPFS,可參考這篇文章:IPFS 問與答

如果你有一台裝有 Docker 的伺服器,可以很方便的安裝 IPFS ,使你的伺服器變為 IPFS 中的一個節點。

IPFS 官方有提供 Docker 的安裝指引, 我這裡將它變為 docker-compose 更容易操作一些。

步驟一

建立一個 docker-compose.yml 檔案,內容如下:

version: '3'
services:
  ipfs:
    image: ipfs/go-ipfs:latest
    container_name: ipfs_host
    volumes:
      - ./export:/export
      - ./ipfs_data:/data/ipfs
    ports:
      - '4001:4001'
      - '4001:4001/udp'
      - '127.0.0.1:8080:8080'
      - '127.0.0.1:5001:5001'

其中 5001 port 為 API 以及 WEB UI,8080 為 Proxy Gateway。 具體內容可以參閱官方網站詳細了解。

步驟二

確認伺服器已經安裝 docker, docker-compose ,在相同路徑下執行:

docker-compose up

即可。

步驟三

當 docker-compose up 成功啟動後,訪問瀏覽器 localhost:5001/webui 即可開啟 WEB 界面: IFPS Web 管理界面 在 WebUI 界面中可以看到你當前的節點的狀態,連接到了多少 peers,你也可以方便的在 WebUI 中添加檔案到 IPFS 中。

可能遇到的問題 1

我第一次安裝時遇到了 WebUI 無響應的情況,即 127.0.0.1:5001/webui 無法開啟,半天沒有反應。查看 log 後發現因為我們使用 Docker 的形式安裝,而我的Docker Network 設定使得位於 Docker Container 內的 IPFS Deamon 無法連接 peers 導致。 解決這個問題,需要查看 Docker Container 的網絡設定:

docker inspect < your docker container id or name>

你會看到 Container 位於 172.19.0.0 subnet:

"IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },

因此需要添加 firewall rules 允許網絡連接:

firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=172.19.0.0/16 accept'

firewall-cmd --zone=public --add-masquerade --permanent

firewall-cmd --reload

可能遇到的問題 2

打開 WebUI 界面後,可能出現無法連接 API 的情況:

這個是因為 API 跨域訪問限制導致,按照界面提示添加對應的 rules 即可:

docker exec ipfs_host ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://www.yourdomain.com:5001","https://www.yourdomain.com","https://www.yourdomain.com","http://localhost:3000", "http://127.0.0.1:5001", "https://webui.ipfs.io"]'
[root@LS-820311-4279 ipfs]# docker exec ipfs_host ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "POST"]'