前言
寫部落格不久就遇到了需要引用大量圖片的尷尬境地。
如果所有圖片都上傳至 github,會使得後期程式碼倉庫越來越臃腫,在天朝這個網速讓人捉急的地方,需要更好的方法去解決這個問題。
第一反應想到的是使用物件儲存服務,然後配合 CDN,部署一個圖床。
通過多方面瞭解,七牛和騰訊雲都是不錯的選擇(阿里雲太貴,直接被我 pass 了)。
隨之而來的是一波波讓人蛋疼之事 ? 。
七牛會免費送 10GB 的空間,但是它的臨時域名只有 30 天的壽命,每 30 天會重新整理一次 ? 。
如果想要永久的,需要自己買一個域名,並且進行公安網備案。(備案真的很折騰。。。)
騰訊雲好一點,臨時域名是沒有限制的,搞了一下配置,勉強能用了。
過了幾天,想著是不是有更好的辦法。
因為工作關係,接觸了 ipfs,之前也對此有一定了解,果斷著手開始嘗試,能不能通過 ipfs 在自己的伺服器上開個節點,把圖片傳到 ipfs 公網上去,這樣就可以隨時隨地訪問了,類似於實現了 CDN 的作用。
準備工作
你只需要有一臺至少 10GB 硬碟的伺服器,當然記憶體越大越好,ipfs 非常佔用記憶體。
正文
首先我們需要通過 ssh 登入伺服器安裝 ipfs。
我的伺服器是 Ubuntu 18.04。
如果使用了其他的系統,可以跳轉至官方安裝介紹進行安裝。
# update packages
sudo apt update
# install golang
sudo apt install golang-go -y
# install git
sudo apt install git -y
# install ipfs-update
go get -u github.com/ipfs/ipfs-update
# add ~/go/bin into .bash_profile
echo "export PATH=$PATH:$HOME/go/bin" >> .bash_profile
# add GOPATH into .bash_profile
echo "export GOPATH=$HOME/go" >> .bash_profile
source .bash_profile
複製程式碼
安裝 ipfs:
$ ipfs-update install latest
fetching go-ipfs version v0.4.20
binary downloaded, verifying...
success! tests all passed.
installing new binary to /home/Like/go/bin/ipfs
checking if repo migration is needed...
Installation complete!
複製程式碼
初始化 ipfs:
$ ipfs init
initializing IPFS node at /home/Like/.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmS5DQXifPi4cBRDYhVLWbSAYcMEvt4J6RdBs4mCMr7oUP
to get started, enter:
ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme
複製程式碼
QmS5DQXifPi4cBRDYhVLWbSAYcMEvt4J6RdBs4mCMr7oUP
這串長長的字元就是你得到的節點 id。
不用擔心會丟失,你可以隨時用ipfs id
命令列來檢視。
接下來我們就可以開啟 ipfs 程式了:
$ ipfs daemon
Initializing daemon...
go-ipfs version: 0.4.20-
Repo version: 7
System version: amd64/linux
Golang version: go1.12.4
Swarm listening on /ip4/10.152.0.2/tcp/4001
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /p2p-circuit
Swarm announcing /ip4/10.152.0.2/tcp/4001
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready
複製程式碼
我們可以得到這幾個資訊:
- 官方提供了一個
WebUI: http://127.0.0.1:5001/webui
,它可以讓我們拜託指令操作。 - 我們有個本地閘道器
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
,讓我們可以通過 CID 訪問公網上的檔案。
接下來就簡單了,我們只要開啟nginx
服務,使我們能從外網訪問到這兩個地址,就實現了相當於物件儲存的功能。
首先我們ctrl+c
退出當前執行的 ipfs 程式。
實現後臺執行:
$ ipfs daemon --enable-gc > ipfs.log &
[1] 5497
複製程式碼
接下來我們安裝nginx
:
sudo apt install nginx -y
複製程式碼
安裝完成後,通過vim
修改配置,下面提供了配置,直接照抄就好。
sudo vim /etc/nginx/sites-available/default
複製程式碼
server {
server_name _;
location / {
proxy_pass http://127.0.0.1:5001;
}
location /ipfs/
{
proxy_pass http://127.0.0.1:8080;
}
}
複製程式碼
啟動nginx
服務:
sudo service nginx start
複製程式碼
在本地瀏覽器訪問 [your server ip]/webui
就可以看到 ipfs 的 UI 介面了 ? 。
第一次載入可能會有些慢,請耐心等待。
如果載入失敗,請重啟nginx
。
sudo service nginx restart
複製程式碼
在 UI 介面上可以看到兩行命令,複製他們,並在伺服器上執行。
# excute copied command
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://[your server ip]", "http://127.0.0.1:5001", "https://webui.ipfs.io"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "GET", "POST"]'
# restart ipfs daemon
kill -9 $(ps | grep 'ipfs' | cut -d' ' -f1)
ipfs daemon --enable-gc > ipfs.log &
複製程式碼
重新訪問[your server ip]/webui
,可以看到 UI 介面變了,你可以在這裡上傳檔案,並通過[your server ip]/ipfs/[CID]
訪問你上傳的檔案 ?。
如果你喜歡這篇文章,歡迎關注我的部落格。