惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Last Watchdog
The Last Watchdog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
Y
Y Combinator Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The GitHub Blog
The GitHub Blog
博客园_首页
小众软件
小众软件
I
InfoQ
J
Java Code Geeks
月光博客
月光博客
S
Secure Thoughts
Microsoft Security Blog
Microsoft Security Blog
V
Visual Studio Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Stack Overflow Blog
Stack Overflow Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
N
News and Events Feed by Topic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Cloudflare Blog
T
Threat Research - Cisco Blogs
A
About on SuperTechFans
H
Help Net Security
MongoDB | Blog
MongoDB | Blog
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Latest news
Latest news
G
GRAHAM CLULEY
IT之家
IT之家
C
Cisco Blogs
Last Week in AI
Last Week in AI
Engineering at Meta
Engineering at Meta
L
LangChain Blog
The Register - Security
The Register - Security
SecWiki News
SecWiki News
M
MIT News - Artificial intelligence
NISL@THU
NISL@THU
T
Tenable Blog
博客园 - Franky
美团技术团队
I
Intezer
U
Unit 42
雷峰网
雷峰网
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
SegmentFault 最新的问题
C
Cyber Attacks, Cyber Crime and Cyber Security

流动

对口型视频合成方案对比:Wav2Lip、VideoReTalking 与 MuseTalk 2026 音色克隆方案对比:IndexTTS-2、CosyVoice、GPT-SoVITS、Fish Speech、VoxCPM 部署与实测 AI Agent折腾记(OpenClaw / Hermes Agent) 我的2025年 大连之行 回家收麦 六一儿童节爬长城 Golang database/sql 数据库断线自动重连机制解析 Golang默认Http Client导致的cannot assign requested address错误 清明踏春,爬山看海 购入小牛G400T电动车 北京的三月飞雪 wrenAI本地LLM模型部署 天津一日游 2024年终总结 停止使用staticfile.org服务 使用 ImageMagick 自动添加水印,保护图片版权 如何注册一个.sol域名 奥森公园半日游 昌平42公里骑行绿道打卡 十月一日爬慕田峪长城 当Hugo遇上AVIF,优化图片加载 博客被恶意镜像 Github Pages 部署流程解析 搭建个人锻炼页面 你好 Follow 中秋爬山 Google Adsense的审核之旅 让你的IPFS站点持久在线:接入Filebase的Names(IPNS)服务 一次简短的青岛之行 解决 "undeclared name: any (requires version go1.18 or later)" 编译错误 搭建自托管IPFS Gateway服务,替代Cloudflare的IPFS Gateway 302跳转的跨域问题(CORS) GORM增加sqlcommenter特性 源码分析:GORM是如何生成sql的 工银亚洲网银密码重置 加速Cloudflare访问 2023年终总结 2023年12月北京暴雪记录 使用Hugo实现响应式和优化的图片 加速Google Analytics 使用Google Indexing API加速博客收录 在Netlify上部署Twikoo评论系统 利用Github Actions定时抓取微博 北大口腔牙周刮治记录 故乡回忆之旅 解决Golang使用go get安装包后找不到可执行文件的问题 修正Hugo的JSON Feed格式 我的学车之路 新冠疫情后的第一个春节 第一次清理键盘 2022年终总结 去掉Cloudflare烦人的email-decode.min.js请求 累计布局偏移修复方案改进 —— 自动生成图片宽高 优化博客的累计布局偏移(CLS)问题 将博客部署到Cloudflare Pages 奥林匹克公园向日葵之旅 记第二次洗牙 记录2022年海淀幼升小 Golang解析json的一个问题 疫情下的生活 整理下博客的一些调整 疫情下的五一假期 自己动手,更换thinkpad x1硬盘 二刷百望山 带娃游颐和园 博客架构说明 难得的清明假期 十一年的等待,终于拿到了liudon.com域名 被隔离的一周 mysql中字符串和整型自动转换的问题 一次惊心动魄的Mysql更新操作 如何在北京公积金网站上修改婚姻状况 PHP7.2编译安装后没有php.ini文件的问题 检测网站支持的SSL/TLS协议版本 记一次难忘的手术经历 十一假期经历 Swoft 框架运行分析(五) —— ConsoleProcessor模块分析 Swoft 框架运行分析(四) —— EventProcessor模块分析 一个git submodule update引发的问题 一个Curl的耗时长的问题 Swoft 框架运行分析(三) —— BeanProcessor模块分析 Swoft 框架运行分析(二) —— AnnotationProcessor模块分析 Swoft 框架运行分析(一) BCMath 与 科学计数 Flink Could Not Resolve Resourcemanager Address 解决Sublime Text安装包时"There Are No Packages Available for Installation"的报错 关于本站 2019,新开始
将博客部署到星际文件系统(IPFS)
Liudon · 2023-02-21 · via 流动

在这篇文章,我将会介绍如何利用Github Actionshugo博客自动部署到IPFS上,并通过自定义域名访问IPFS上的文件。

IPFS(InterPlanetary File System)中文称为星际文件系统,是一个旨在实现文件的分布式存储、共享和持久化的网络传输协议。

照惯例,先上演示.访问我的IPFS博客

欢迎各位pin我的博客, ipfs pin add /ipns/liudon.xyz

curl 'https://liudon.xyz' -I
HTTP/2 200 
date: Tue, 21 Feb 2023 23:59:18 GMT
content-type: text/html
vary: Accept-Encoding
access-control-allow-methods: GET
access-control-allow-methods: GET, POST, OPTIONS
last-modified: Tue, 21 Feb 2023 23:59:18 GMT
x-ipfs-gateway-host: ipfs-bank1-sv15
x-ipfs-path: /ipns/liudon.xyz/
x-ipfs-roots: Qmd4pnpUj8CaLKoVMJNHJyrqwWVa4wvz1qKxZsU9vKgErL
x-ipfs-pop: ipfs-bank1-sv15
timing-allow-origin: *
access-control-allow-origin: *
access-control-allow-headers: X-Requested-With, Range, Content-Range, X-Chunked-Output, X-Stream-Output
access-control-expose-headers: Content-Range, X-Chunked-Output, X-Stream-Output
x-ipfs-lb-pop: gateway-bank1-sv15
x-proxy-cache: MISS
cf-cache-status: DYNAMIC
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=FLcvWgtngoLuGZkl9jYsviSoOlSoE2Y0rKxI3bgNaKRxhNOrIm6nozqVzndav3%2B9QrvvcJ5GNmC11JBlN8tiigbF9CWPW33TbnLKyfdeblOcEhmZINTcC%2BJ6xhKs"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 79d36f598970531f-LAX
alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400

准备工作:

  1. Cloudflare帐号
  2. 一台VPS主机,我用到腾讯云lighthouse主机2核2G
  3. 一个域名

方案介绍:

实现方案

  1. 在VPS主机上安装启动IPFS服务,通过端口5001在内网提供API服务.
  2. 在GitHub上通过ssh建立端口转发,本地端口5001转发到VPS主机5001.
  3. 在GitHub上利用ipfs-http-client上传文进到5001端口.
  4. 绑定域名到IPNS地址,通过域名访问IPFS文件.

1. 部署IPFS服务

  • 安装kubo,详见官方文档

    wget https://dist.ipfs.tech/kubo/v0.18.1/kubo_v0.18.1_linux-amd64.tar.gz
    
    tar -xvzf kubo_v0.18.1_linux-amd64.tar.gz
    
    > x kubo/install.sh
    > x kubo/ipfs
    > x kubo/LICENSE
    > x kubo/LICENSE-APACHE
    > x kubo/LICENSE-MIT
    > x kubo/README.md
    
    cd kubo
    sudo bash install.sh
    
    > Moved ./ipfs to /usr/local/bin
    
    ipfs --version
    
    > ipfs version 0.18.1
    
  • 初始化IPFS

    ipfs init --profile=server
    
  • 添加到开机启动

    [Unit]
    
    Description=IPFS Daemon
    After=syslog.target network.target remote-fs.target nss-lookup.target
    
    [Service]
    Type=simple
    ExecStart=/usr/local/bin/ipfs daemon --enable-namesys-pubsub
    User=root
    
    [Install]
    WantedBy=multi-user.target
    

    注意打开--enable-namesys-pubsub参数,不然IPNS更新生效很慢。

    将上述代码保存到/usr/lib/systemd/system/ipfs.service文件.

    启动进程.

    systemctl start ipfs.service
    
  • 开放端口

    IPFS默认通过4001端口跟DHT网络通信,需要放开4001端口访问.

2. GitHub Actions配置

博客我使用的Hugo,原有的工作流方案见将博客部署到Cloudflare Pages

完整的工作流配置见main.yml。

  • 添加如下变量到Actions secrets

    SSHKEY VPS主机ssh登陆私钥
    SSHHOST ssh用户@VPS机器IP,类似root@127.0.0.1
    
  • 更新yaml配置文件,添加如下任务.

       - name: Connect to ssh in BG
        timeout-minutes: 2
        run: | 
          echo "${{ secrets.SSHKEY }}" > ../privkey
          chmod 600 ../privkey
          ssh -o StrictHostKeyChecking=no ${{ secrets.SSHHOST }} -i ../privkey -L 5001:localhost:5001 -fTN
    
      - name: ipfs upload
        uses: aquiladev/ipfs-action@master
        id: deploy
        timeout-minutes: 2
        with:
          path: ./public
          service: ipfs
          verbose: true
          host: localhost
          port: 5001
          protocol: http
          key: self # 要配置key,这样才会生成IPNS地址
    

    测试执行action,日志里会有类似如下输出.

    Upload to IPFS finished successfully {
    cid: 'QmST2Zqv8qffFTVuqfRX57uzqxsoQtTYinmHpyLh7padAD',
    ipfs: 'QmST2Zqv8qffFTVuqfRX57uzqxsoQtTYinmHpyLh7padAD',
    ipns: '12D3KooWKvJ9Y4D5X4R3ajuc7tVtQWXZMG4iiMCFtay8frM66o4c'
    }
    

    每次执行,ipfs地址不同,ipns地址不变. 记住这里到ipns地址,下面会用到.

3. 域名配置

Cloudflare上添加解析:

  • 添加DNS TXT记录,名称为_dnslink,值为dnslink=/ipns/12D3KooWKvJ9Y4D5X4R3ajuc7tVtQWXZMG4iiMCFtay8frM66o4c,将这里的12D3KooWKvJ9Y4D5X4R3ajuc7tVtQWXZMG4iiMCFtay8frM66o4c改为上一步日志里到ipns值。
  • 添加DNS CNNANE记录,名称为你的域名,值为gateway.ipfs.io.

DNS解析

4. 开启相对路径

Livid大佬提醒,公共网关访问时存在相对路径问题

我用的Hugo,配置文件里打开relativeURLs配置。

从年前开始想怎么做成自动化,到今天终于跑通搞定了.😁😁😁

VPS主机运行情况

两天跑了14G流量,每月的流量资源包基本够用了.

参考资料:

IPFS 日用优化指南

参考配置