參與

文件站 IPFS 鏡像的 pin 節點

anoni.net 文件站在主站之外另有一份 IPFS 鏡像,主站被封鎖或下架時仍可以讀取文件。IPFS 上的內容需要有節點 pin 住才會留存。2026 年 8 月查詢網路上的提供者,只有社群自己的一台節點,整份鏡像目前是單點。每多一個節點協助 pin,網路上就多一份完整複本,社群那台機器被停權或故障時文件仍然留存。

協助的方式是架設一個常駐的 IPFS 節點,再用排程腳本定期 pin 最新版本。Windows、Linux、macOS 都適用,用不用 Docker 皆可。

所需條件

  • 一台幾乎整天開機、能連上網路的電腦(桌機、家用伺服器或小主機)
  • 安裝好的 IPFS(安裝方式見下方)
  • 一支每隔幾小時自動 pin 最新版本的排程腳本

第一次要下載的整份鏡像約 240 MB,來源目前只有社群那一台,建議一開始就設定與社群節點的固定連線,下載會順利許多。無法常駐節點的話,文末有改用 pinning service 代 pin 的做法。

CID、IPNS 與 pin 的關係

需要排程的原因在於 CID 會隨內容改變。IPFS 的完整設計見去中心化網站發布,以下只整理 pin 會用到的概念。

  • IPFS 依檔案內容算出一段 hash,稱為 CID(Content Identifier),也就是內容在 IPFS 上的位址。內容相同則 CID 相同。
  • 內容一改,CID 就跟著改變。文件站每次更新、重新發布,都會產生新的 CID。
  • IPNS(InterPlanetary Name System)是固定的名稱,指向目前最新的 CID,文件站的 IPNS 名稱是下方那串 k51…。
  • pin 代表保留某個 CID 的內容。pin 綁在 CID 上,不會跟著 IPNS 更新。文件站發布新版之後,上次 pin 的仍是舊 CID。

pin 腳本先把 IPNS 解析成當前的 CID 並 pin 住,再放掉舊版。CID 每次發布都會變,所以要用排程定期重新執行。

三種相似的識別碼

IPFS 有三種外觀相近、用途不同的識別碼,貼錯欄位時工具會直接回報錯誤。

識別碼 開頭 是否改變 用途
CID bafybei… 每次發布都變 指定某一版內容
IPNS 名稱 k51qzi… 固定 取得最新版,本頁的 pin 用這個
Peer ID 12D3KooW… 固定 指定要連到哪一個節點

pin 文件站只需要 IPNS 名稱,Peer ID 在設定與社群節點的固定連線時才會用到。

排程 pin 的運作方式

IPNS 是各節點共用的同步點,文件站發布新版時只更新 IPNS,社群不需要另外通知。節點這端每隔幾小時解析一次 IPNS,發現 CID 改變就 pin 新版,全程不需要人工協調。

文件站的 IPFS 座標

以下都是公開值,可以直接使用。

  • IPNS 名稱:k51qzi5uqu5dlfm2jj0f70ex3r3babmwy8qh071inwknttr7wqa3uhdwvlmrmw
  • 節點 Peer ID:12D3KooWEzvBhnLa6NZnjnw22Yoqs56xq4pNCZdkkxw5yxvi1eV9(設定 peering 時才會用到)
  • DNSLink:_dnslink.anoni.net 指向同一個 IPNS 名稱,透過任何支援 DNSLink 的閘道都能讀取同一份內容
  • 瀏覽器:社群自架的 IPFS 閘道(ipfs.anoni.net)。舊網址 anoni-net.ipns.dweb.link 在 2026 年 9 月 30 日停止營運,見2026 年 9 月之後的 IPFS 維護變化

腳本每次執行時依序解析 IPNS 取得當前 CID、pin 新 CID、unpin 上一版,最後回收空間。新版 pin 成功之後才會放掉舊版,解析失敗或下載不到內容時,節點上現有的複本維持原狀。

常駐的 IPFS 節點

pin 需要本機有持續運作的 IPFS daemon 才能取得完整內容,依環境擇一安裝。

安裝 IPFS 官方的命令列實作 kubo,macOS 可以用 Homebrew:

brew install kubo

Homebrew 的套件名稱已從 ipfs 改為 kubo,舊名稱仍可安裝,但後面設定服務時需使用 kubo。Intel 與 Apple Silicon 都支援。

Linux 依官方說明下載對應架構的 kubo,安裝後初始化並啟動 daemon:

ipfs init          # 只有第一次需要
ipfs daemon

要讓 daemon 長時間常駐,Linux 建議設成 systemd user service。macOS 用 Homebrew 安裝時,套件附有服務定義,執行下列指令即可常駐,並在登入時自動啟動:

brew services start kubo

臨時測試時,直接在背景執行 ipfs daemon 即可。

最簡便的做法是安裝內含 kubo 的 IPFS Desktop,登入後常駐在系統匣,daemon 持續運作。IPFS Desktop 從 2026 年 9 月 30 日起沒有專職維護者(見2026 年 9 月之後的 IPFS 維護變化),想減少這項不確定性,Windows 也可以安裝獨立版 kubo 或使用 Docker。

安裝後確認命令列可以呼叫 ipfs。獨立版 kubo 需自行把 ipfs.exe 加進系統 PATH。使用 IPFS Desktop 而 PATH 找不到 ipfs 時,在腳本裡改用完整路徑即可。

用 docker-compose.yml 執行 kubo,容器名稱設為 ipfs_host:

services:
  ipfs_host:
    image: ipfs/kubo:latest
    restart: always
    volumes:
      - ./ipfs-data:/data/ipfs
    ports:
      - "4001:4001"   # swarm,對外開放有助於連上其他節點

啟動:

docker compose up -d

之後的 IPFS 指令都透過容器執行。設定下列環境變數,pin 腳本會自動套用:

export IPFS_CMD="docker exec ipfs_host ipfs"

pin 腳本

pin 腳本負責解析 IPNS、pin 新版與 unpin 舊版,IPNS 名稱已寫在腳本裡,不需要修改。Docker 使用者需先設定上一步的 IPFS_CMD。腳本會在你的機器上定期執行,建議先在 GitHub 讀過原始碼再執行。

anoni-pin.sh(Linux、macOS、Docker)

下載 anoni-pin.sh 在 GitHub 檢視原始碼

存檔後加上執行權限,先手動執行一次確認運作正常:

chmod +x anoni-pin.sh
./anoni-pin.sh          # 先手動執行一次確認正常

anoni-pin.ps1(Windows)

下載 anoni-pin.ps1 在 GitHub 檢視原始碼

先手動執行一次確認運作正常。PowerShell 預設會阻擋腳本,-ExecutionPolicy Bypass 只對這一次執行放行:

powershell -NoProfile -ExecutionPolicy Bypass -File .\anoni-pin.ps1

排程設定

文件站更新不頻繁,每 6 小時執行一次已足夠,想更快跟上新版可以縮短間隔。

使用 cron,編輯排程表:

crontab -e

加入下列一行,每 6 小時執行一次並把輸出寫進 log:

0 */6 * * * /path/to/anoni-pin.sh >> $HOME/.anoni-pin/log 2>&1

需要在開機後補執行錯過的排程時,可以改用 systemd timer 並設定 Persistent=true。

使用「工作排程器」,從命令列建立最快。以下設定每 6 小時執行一次:

schtasks /Create /TN "anoni-ipfs-pin" `
  /TR "powershell -NoProfile -ExecutionPolicy Bypass -File C:\Tools\anoni-pin.ps1" `
  /SC HOURLY /MO 6 /RL LIMITED

把 C:\Tools\anoni-pin.ps1 換成實際存放的路徑。也可以用工作排程器的圖形介面建立,「程式或指令碼」填 powershell,「新增引數」填 -NoProfile -ExecutionPolicy Bypass -File 你的路徑。

排程依主機的作業系統設定(Linux、macOS 用 cron,Windows 用工作排程器,見前兩個分頁),差別在執行腳本前需先設定 IPFS_CMD,例如包一層 wrapper:

#!/usr/bin/env bash
export IPFS_CMD="docker exec ipfs_host ipfs"
exec /path/to/anoni-pin.sh

cron 改為執行這支 wrapper 即可。

pin 結果的驗證

先解析出當前的 CID,再確認它在 pin 清單裡:

CID=$(ipfs name resolve --nocache /ipns/k51qzi5uqu5dlfm2jj0f70ex3r3babmwy8qh071inwknttr7wqa3uhdwvlmrmw)
ipfs pin ls --type=recursive | grep "${CID#/ipfs/}"

也可以從本機閘道開啟 http://127.0.0.1:8080${CID}/,內容正常顯示即代表 pin 成功。Docker 使用者把上面的 ipfs 換成 docker exec ipfs_host ipfs,上方的 compose 範例沒有對外開放 8080,用指令確認即可。

與社群節點的固定連線

pin 只需要 IPNS 名稱,內容透過 DHT 查找。第一次下載整份鏡像時,DHT 查詢緩慢或查不到來源都會拖長時間。設定 kubo 的 peering,可以讓節點與來源節點維持固定連線。

編輯 ~/.ipfs/config,在最外層加入 Peering 區塊:

"Peering": {
  "Peers": [
    { "ID": "12D3KooWEzvBhnLa6NZnjnw22Yoqs56xq4pNCZdkkxw5yxvi1eV9" }
  ]
}

Addrs 可以省略,kubo 會自動向 DHT 查詢位址。修改後重新啟動 daemon 即生效。Docker 使用者改的是 ./ipfs-data/config,改完執行 docker compose restart。

確認是否已連上:

ipfs swarm peers | grep 12D3KooWEzvBhnLa6NZnjnw22Yoqs56xq4pNCZdkkxw5yxvi1eV9

peering 是單向設定,社群節點沒有對應的條目,維持連線由你的節點負責。kubo 的設定文件裡寫到,單向 peering 會佔用對方節點的連線資源,鏡像數量增加之後負擔會集中在同一台機器。目前提供者只有一台,第一次的 240 MB 都要從它下載,所以建議一開始就設定 peering。協助 pin 的節點變多、來源不再集中在同一台之後,再移除設定即可。

2026 年 9 月之後的 IPFS 維護變化

Interplanetary Shipyard 是過去幾年維護 IPFS 主要軟體的團隊,Protocol Labs 停止資助之後,Shipyard 在 2026 年 9 月 30 日結束 IPFS 的工作。本頁的做法仍然可行,以下三項有所改變。

  • 軟體維護:kubo、Helia、Boxo、IPFS Desktop、IPFS Companion 都已沒有專職維護者,IPFS Foundation 改成對個別維護者發放 grant。程式繼續運作,安全性更新的節奏會變慢,安裝前先確認版本的發布日期。
  • 公開閘道與 bootstrap 節點:ipfs.io、dweb.link 與 IPFS 的 bootstrap 節點在同一天停止營運。kubo 0.38 之後 Bootstrap 的預設值是 auto,展開後的清單就包含這些節點。
  • 本頁的瀏覽網址:舊的 anoni-net.ipns.dweb.link 屬於 dweb.link,已換成社群自架的 IPFS 閘道(ipfs.anoni.net)。兩者讀取同一個 IPNS 名稱,透過 DNSLink 記錄對應。pin 腳本使用 IPNS 名稱,不受閘道影響。

下列指令可以查看節點目前取得的 bootstrap 節點,以及已連上的 peer 數量:

ipfs config Bootstrap --expand-auto
ipfs swarm peers | wc -l

auto 展開的節點停止營運之後,新安裝的節點可能無法加入 DHT。最直接的做法是把社群節點設為固定連線對象(見與社群節點的固定連線),Peering 只需要填 Peer ID。

維護與注意事項

  • 版本更新:文件站換了 CID 之後,下一次排程就會 pin 新版、放掉舊版,不需要人工處理。
  • 差異下載:pin 新版時舊版的區塊仍在節點上,IPFS 只下載實際不同的區塊。第一次要下載整份,之後一般的內容更新通常只有幾 MB。改動導覽列或版型時例外,全站 HTML 會一起重寫,差異接近鏡像大小的一半。
  • 磁碟用量:腳本 unpin 舊版後會執行一次垃圾回收,只保留最新版本。一份完整鏡像約 240 MB(2026 年 8 月實測)。
  • 停止協助:unpin 目前的版本並移除排程即可,不影響其他節點。
  • 隱私與風險:pin 的是公開文件,沒有隱私上的顧慮。提供 IPFS pin 的風險依司法管轄而不同,相關限制見去中心化網站發布的「已知限制與風險」。

pinning service 的替代做法

不想維護 daemon 與排程時,可以改用 Pinata、Storacha 這類 pinning service。手動 pin 時在服務的介面貼上當前的 CID,自動化則用服務的 API 寫成排程,流程與本頁的腳本相同(解析 IPNS 取得 CID,再交給服務 pin)。

代價是鏡像的存續改為依賴第三方服務商,可以當作備援。要真正去中心化,自架節點仍是最直接的做法。

相關閱讀