IPFSBED 部署经验总结
一、Cloudflare Pages 部署方式是否还需要单独部署 IPFS 节点?
答案是:是的,您仍然需要一个 IPFS 节点。
让我们来解析一下 Cloudflare Pages 和 Debian 云服务器在 ipfsbed
架构中的角色:
1. Cloudflare Pages 的角色:应用托管 (前端 + 后端逻辑)
ipfsbed
项目本身是一个应用程序,它包含一个用户上传界面(前端)和一个处理上传请求的程序(后端逻辑)。- 当您使用 Cloudflare Pages 部署时,Cloudflare 会托管这个应用程序。用户通过浏览器访问 Cloudflare 的地址,看到的是
ipfsbed
的前端界面。 - 当用户上传文件时,请求会被发送到运行在 Cloudflare 上的后端函数 (Cloudflare Functions)。
- 关键点:这个后端函数本身不存储文件。它的唯一工作是作为一个“中转站”,接收到文件后,再通过 IPFS 的 API 接口,发送给一个真正的 IPFS 节点。
2. Debian 云服务器的角色:IPFS 节点 (数据存储层)
- 您在 Debian 服务器上部署的
go-ipfs
容器,就是那个真正的 IPFS 节点。 - 它负责接收
ipfsbed
后端函数发来的文件,将其“固定”(Pin)在自己的存储空间里,并将其宣告到整个 IPFS 网络中。 - 没有这个节点,
ipfsbed
上传的文件将无处可去,或者即使上传到某个临时节点,也会很快因为无人“固定”而从网络中消失。
两种方案对比
因此,即使您选择使用 Cloudflare Pages 来部署 ipfsbed
应用,您依然需要为它提供一个 IPFS 节点 API。您有两个选择:
方案 | 使用您自己的 Debian 云服务器 | 使用第三方 IPFS Pinning 服务 (如 Pinata, Infura) |
---|---|---|
工作原理 | Cloudflare 上的 ipfsbed 应用,将其接收到的文件,发送到您 Debian 服务器上 IPFS 节点的 API 地址。 | Cloudflare 上的 ipfsbed 应用,将其接收到的文件,发送到第三方服务商提供的 API 地址。 |
优点 | 1. 完全控制:数据完全存储在您自己的服务器上。<br>2. 成本可控:除了服务器本身的费用,没有额外的存储或请求费用。 | 1. 免维护:您不需要管理自己的服务器和 IPFS 节点。<br>2. 高可用:通常由专业团队维护,保证服务稳定。 |
缺点 | 1. 需要维护:您需要自己负责服务器和 IPFS 节点的运行、更新和安全。<br>2. 单点故障:如果您的服务器宕机,图床就无法上传文件。 | 1. 依赖第三方:您的数据由第三方公司存储。<br>2. 成本:有免费额度,但超出后需要按存储量和请求次数付费。 |
部署方式 | 您需要按照之前的教程部署好 IPFS 节点,并为其 API 端口设置一个公网可访问的域名(反向代理),然后将这个 API 地址配置到 ipfsbed 中。 | 您需要在第三方服务网站注册账户,获取 API 密钥,然后将服务商提供的 API 地址和密钥配置到 ipfsbed 中。 |
结论:
使用 Cloudflare Pages 部署 ipfsbed
是一种非常高效的方式,它可以为您提供稳定、快速的前端访问。但这并不能替代后端的 IPFS 存储节点。
您必须为 Cloudflare Pages 上运行的 ipfsbed
提供一个 IPFS API 终结点,这个终结点可以来自您自己用 Debian 服务器搭建的节点,也可以来自付费的第三方服务。
二、如何修改这两个部分的代码
可以依靠大模型进行修改。我是直接在 AI Studio 上问的 Gemini。
- 提示词 1:
可以确定项目作者代码是可以正常使用,尽可能完整保留作者原来代码,如果代码中有提供了有用的网关,先不要删除,优先使用我提供的节点https://ipfs-api.123456.xyz(这里修改成你自己的),在我的节点无法使用时候再使用原作者提供节点。将修改后的内容,做一个注释,方便我后续修改的时候只改需要修改那些地方。修改github的代码static/file.js内容。我给你提供static/file.js的完整内容,为了防止格式错误,你直接帮我修改好。完整内容如下:“复制作者的代码”
- 提示词 2:
可以确定项目作者代码是可以正常使用,尽可能完整保留作者原来代码,如果代码中有提供了有用的网关https://ipfs-gw.123456.xyz(这里修改成你自己的),先不要删除,优先使用我提供的网关,在我的网关无法使用时候再使用原作者提供网关。将修改后的内容,做一个注释,方便我后续修改的时候只改需要修改那些地方。修改github的代码static/common.js内容。我给你提static/common.js的完整内容,为了防止格式错误,你直接帮我修改好。完整内容如下:“复制作者的代码”
开始部署
一、使用 Cloudflare Pages 部署前端
您可以使用 Cloudflare Pages 轻松部署自己的 IPFSBED 实例:
- 在 GitHub 上 fork 此仓库。
- 登录您的 Cloudflare 控制面板并导航至 Pages。
- 点击 “创建项目” 并选择 “连接到 Git”。
- 选择您 fork 的仓库并配置构建设置:
- 构建命令:留空
- 构建输出目录:
/
(根目录)
- 在环境变量部分,如果要使用 URL 缩短功能,添加以下内容:
YOURLS_SIGNATURE
:您的 YOURLS API 签名令牌(在https://yourdomain.com/admin/tools.php
获取)YOURLS_API_ENDPOINT
:您的 YOURLS API 端点 URL(例如,https://yourdomain.com/yourls-api.php
)
- 点击 “保存并部署”。
部署后,您的 IPFSBED 实例将在 your-project-name.pages.dev
上可用。您还可以在 Cloudflare Pages 设置中配置自定义域名。
二、前端已部署,现在部署后端 IPFS
前端绑定了自定义域名 i.123456.xyz
。在 Debian 云服务上部署 IPFS(后端)需要的步骤?
现在的架构是:前端应用 ipfsbed
部署在 Cloudflare Pages (i.123456.xyz
),现在需要一个后端的 IPFS 节点(在您的 Debian 服务器上)来实际存储文件。
这个架构非常好,可以充分利用 Cloudflare 的全球 CDN 加速前端访问,同时您又能完全控制自己的后端数据。
请跟我按照以下步骤操作,为您的 Cloudflare Pages 应用配置一个专属的、稳定的 IPFS 后端。
第一步:规划并设置域名
这是最关键的一步。为了让 Cloudflare 上的应用能安全、稳定地和您服务器上的 IPFS 节点通信,我们需要为 IPFS 节点的两个核心功能(API 和网关)分别设置一个域名,并开启 HTTPS。
- 选择域名:
您需要两个新的子域名,全部指向您 Debian 云服务器的 IP 地址。我推荐以下名称:
- API 域名:
ipfs-api.123456.xyz
(用于程序通信,比如上传文件) - 网关域名:
ipfs-gw.123456.xyz
(用于浏览器访问,比如查看图片)
- API 域名:
- 解析域名:
- 登录您的域名 DNS 服务商(很可能也是 Cloudflare)。
- 创建两条 A 记录:
ipfs-api
-> 指向您 Debian 云服务器的公网 IP 地址ipfs-gw
-> 指向您 Debian 云服务器的公网 IP 地址
- 请确保这两条 A 记录的“云朵”(代理状态)是灰色的,即“仅 DNS”模式。
第二步:在 Debian 服务器上重新部署 IPFS 节点
为了更清晰地看到每一步的操作,建议使用命令行部署。
根据您的新要求(IP 为 123.456.78.90
,部署目录为 /opt/ipfs
),我为您准备了一个完整的、自动化的部署脚本。您只需要将这个脚本复制到服务器上执行即可。
这个脚本会完成以下所有事情:
- 创建所需的目录 (
/opt/ipfs
)。 - 停止并删除可能存在的旧 IPFS 容器,确保全新安装。
- 使用临时的 IPFS 容器来初始化配置文件。
- 自动修改配置文件,设置好 API、网关、CORS 跨域以及您的公网 IP。
- 启动一个长期运行的、稳定的 IPFS 守护容器。
部署脚本
请将以下所有代码复制并保存为一个文件,例如 setup_ipfs.sh
。
#!/bin/bash
# --- 配置信息 ---# 您的服务器公网IP地址HOST_IP="123.456.78.90"# IPFS数据和配置在主机上存储的根目录IPFS_PATH="/opt/ipfs"# 容器名称CONTAINER_NAME="ipfs_node"# 端口映射API_PORT="11114"GATEWAY_PORT="11104"SWARM_PORT="4001"
# --- 脚本正文 ---
# 检查Docker是否安装if ! [ -x "$(command -v docker)" ]; then echo "错误: Docker 未安装。请先安装Docker再运行此脚本。" >&2 exit 1fi
echo "--- 1. 准备主机目录 ---"# 创建IPFS数据和临时文件的目录sudo mkdir -p "${IPFS_PATH}/data"sudo mkdir -p "${IPFS_PATH}/staging"echo "目录 ${IPFS_PATH}/data 和 ${IPFS_PATH}/staging 已创建。"
echo "--- 2. 清理旧容器 (如果存在) ---"# 停止并删除同名容器,忽略错误(如果容器不存在)docker stop ${CONTAINER_NAME} >/dev/null 2>&1 || truedocker rm ${CONTAINER_NAME} >/dev/null 2>&1 || trueecho "旧容器已清理。"
echo "--- 3. 初始化IPFS并进行配置 ---"# 检查是否已存在配置文件,如果不存在则进行初始化if [ ! -f "${IPFS_PATH}/data/config" ]; then echo "未找到配置文件,正在进行初始化..." docker run --rm -v "${IPFS_PATH}/data:/data/ipfs" ipfs/go-ipfs:latest init --profile=serverelse echo "找到现有配置文件,跳过初始化。"fi
# 使用临时容器修改配置echo "正在配置 API 和 Gateway..."docker run --rm -v "${IPFS_PATH}/data:/data/ipfs" ipfs/go-ipfs:latest config Addresses.API /ip4/0.0.0.0/tcp/${API_PORT}docker run --rm -v "${IPFS_PATH}/data:/data/ipfs" ipfs/go-ipfs:latest config Addresses.Gateway /ip4/0.0.0.0/tcp/${GATEWAY_PORT}
echo "正在配置 Swarm 网络..."docker run --rm -v "${IPFS_PATH}/data:/data/ipfs" ipfs/go-ipfs:latest config Addresses.Swarm --json '["/ip4/0.0.0.0/tcp/4001", "/ip4/0.0.0.0/udp/4001/quic", "/ip4/0.0.0.0/udp/4001/quic-v1"]'
echo "正在宣告公网IP: ${HOST_IP}..."docker run --rm -v "${IPFS_PATH}/data:/data/ipfs" ipfs/go-ipfs:latest config Addresses.Announce --json '["/ip4/'${HOST_IP}'/tcp/4001", "/ip4/'${HOST_IP}'/udp/4001/quic", "/ip4/'${HOST_IP}'/udp/4001/quic-v1"]'
echo "正在配置 CORS 跨域头..."docker run --rm -v "${IPFS_PATH}/data:/data/ipfs" ipfs/go-ipfs:latest config API.HTTPHeaders.Access-Control-Allow-Origin --json '["*"]'docker run --rm -v "${IPFS_PATH}/data:/data/ipfs" ipfs/go-ipfs:latest config API.HTTPHeaders.Access-Control-Allow-Methods --json '["PUT", "POST", "GET"]'docker run --rm -v "${IPFS_PATH}/data:/data/ipfs" ipfs/go-ipfs:latest config API.HTTPHeaders.Access-Control-Allow-Credentials --json '["true"]'echo "配置完成!"
echo "--- 4. 启动IPFS守护容器 ---"docker run -d \ --name ${CONTAINER_NAME} \ --restart unless-stopped \ -p ${API_PORT}:${API_PORT} \ -p ${GATEWAY_PORT}:${GATEWAY_PORT} \ -p ${SWARM_PORT}:4001/tcp \ -p ${SWARM_PORT}:4001/udp \ -v "${IPFS_PATH}/staging:/export" \ -v "${IPFS_PATH}/data:/data/ipfs" \ ipfs/go-ipfs:latest daemon --enable-gc --enable-pubsub-experiment
echo "--- 部署完成! ---"echo "IPFS容器 '${CONTAINER_NAME}' 已成功启动。"echo "您可以通过 'docker logs ${CONTAINER_NAME}' 查看日志。"
如何使用脚本
-
连接服务器: 通过 SSH 登录到您的 Debian 云服务器。
-
保存脚本: 使用
vim
或nano
编辑器,创建一个新文件。Terminal window nano setup_ipfs.sh将上面提供的完整脚本代码粘贴进去,然后按
Ctrl+X
,再按Y
和Enter
保存并退出。 -
授予执行权限:
Terminal window chmod +x setup_ipfs.sh -
运行脚本: 使用
sudo
来执行此脚本,以确保有权限创建目录和运行 Docker。Terminal window sudo ./setup_ipfs.sh
脚本会自动执行所有步骤。
后续步骤提醒
IPFS 节点部署完成后,要让您的图床 i.123456.xyz
完全正常工作,您仍然需要:
- 设置反向代理:像之前教程里一样,去 1Panel(或手动配置 Nginx)为
ipfs-api.123456.xyz
和ipfs-gw.123456.xyz
这两个域名设置反向代理并配置 SSL 证书。https://ipfs-api.123456.xyz
->http://127.0.0.1:11114
https://ipfs-gw.123456.xyz
->http://127.0.0.1:11104
- 更新 Cloudflare Pages 环境变量:确保 Cloudflare Pages 里的环境变量指向您刚刚设置好的带 HTTPS 的域名。
完成这些步骤后,您的整套服务就可以正常运行了。
修改代码并重新部署
直接将自己的节点地址写入项目代码中。
下面,我将为您提供一个纯网页操作的详细步骤。
使用 GitHub 网页端安全管理修改和更新的步骤
第一部分:首次设置您的专属配置
这个部分您只需要做一次。
步骤一:在 GitHub 上创建您的配置分支
-
打开浏览器,进入您 fork 后的 GitHub 仓库页面(例如
https://github.com/你的用户名/ipfsbed
)。 -
在代码文件列表的左上方,您会看到一个显示当前分支名称的按钮(默认是
main
)。点击这个按钮。 -
在弹出的输入框中,输入一个新的分支名称,例如
my-config
。 -
点击下方出现的 “Create branch: my-config from ‘main’” 选项。
现在,您的浏览器页面会自动切换到这个全新的
my-config
分支。它一开始的内容和main
分支完全一样。
步骤二:在新分支上直接修改代码
- 确认您在正确的分支上:确保页面上方的分支按钮显示的是
my-config
。 - 找到并编辑文件:导航到
static/file.js
文件,点击进入文件内容页面。 - 点击编辑按钮:在文件内容的右上角,找到一个铅笔形状的图标 ✏️,点击它进入在线编辑模式。
- 粘贴新代码:删除编辑器里的所有旧代码,将我们之前准备好的、修改后的
static/file.js
完整内容粘贴进去。 - 提交更改:
- 向下滚动页面,您会看到一个 “Commit changes” 的区域。
- 您可以在描述框里写一些备注,比如“配置我的专属 IPFS 节点”。
- 确保下方的选项是 “Commit directly to the
my-config
branch.” - 点击绿色的 “Commit changes” 按钮。
- 用同样的方式,修改
static/common.js
文件(如果在上一步已经修改过)。
步骤三:更新 Cloudflare Pages 的部署分支
这一步和之前一样,但至关重要。
- 进入您的 Cloudflare Pages 项目设置。
- 找到“构建和部署”(Builds & deployments)设置。
- 将“生产分支”(Production branch)从
main
更改为my-config
。 - 保存。Cloudflare 将使用您这个包含了专属修改的分支来进行部署。
恭喜!至此,您的首次配置已全部在网页上完成,并且非常安全。
第二部分:未来如何安全地同步原作者的更新
当您看到原作者的项目有更新时,可以按以下纯网页流程来安全地获取更新。
-
更新主分支 (main):
- 访问您 fork 的仓库主页。
- 点击页面上方的 “Sync fork” 按钮,然后点击 “Update branch”。
- 这个操作会安全地把原作者的所有更新同步到您的
main
分支,但不会影响您正在线上部署的my-config
分支。
-
创建“拉取请求”(Pull Request) 来合并更新:
- 点击仓库上方的 “Pull requests” 标签页。
- 点击绿色的 “New pull request” 按钮。
- 这是最关键的一步:您会看到两个分支选择框。
base
分支:选择my-config
(您要将代码合并到这个分支)。compare
分支:选择main
(您要从这个分支拉取更新)。
- 设置好后,您会看到一个箭头清晰地表示
main
→my-config
。 - 点击 “Create pull request”。标题和描述可以随便写,比如“同步上游更新”。
-
审查并合并“拉取请求”:
- 创建后,GitHub 会自动检查两个分支的代码差异。
- 情况 A:无冲突
- 页面会显示 “This branch has no conflicts with the base branch.”。
- 您只需点击绿色的 “Merge pull request” -> “Confirm merge” 即可。
- 情况 B:有冲突(例如作者也修改了
static/file.js
)- 页面会提示有冲突,并且“Merge”按钮是灰色的。
- 会出现一个 “Resolve conflicts” 按钮,点击它。
- GitHub 会打开一个特殊的编辑器,用
<<<<<<<
,=======
,>>>>>>>
标记出冲突的地方。 - 您需要做的就是在这个编辑器里,手动删除这些标记,并将代码整理成您最终想要的样子(比如,保留您的专属节点配置,同时也保留作者对其他部分的修改)。
- 修改完成后,点击页面右上角的 “Mark as resolved”,然后点击 “Commit merge”。
- 现在冲突就解决了,回到 Pull Request 页面,您就可以点击绿色的 “Merge pull request” 按钮了。
-
自动部署:当您成功合并了 Pull Request 后,就意味着您的
my-config
分支已经包含了所有最新代码。Cloudflare Pages 会立刻检测到这个更新,并自动为您重新部署网站。
部署到这一步还会遇到一个问题,就是需要在 Cloudflare 上修改 main
为 my-config
- 问题诊断:生产分支设置错误
- 修改已生效:您在
my-config
分支上的代码修改已经成功被 Cloudflare 检测到,并完成了一次预览部署 (Preview)。这是顶部的第一条记录,在 15 分钟前完成。 - 生产环境未更新:您的主域名
123456.xyz
对应的生产环境 (Production),绑定的仍然是main
分支。请看截图中“制作”标签旁边清晰地写着main
分支。
根本原因:您访问 i.123456.xyz
时,看到的是 main
分支的旧代码。而您修改后的新代码,只存在于一个单独的预览环境中,没有发布到主域名上。
最终解决方案:更改生产分支
这是解决问题的最后一步,也是最简单的一步。我们只需要告诉 Cloudflare,让您的主域名使用 my-config
分支的代码。
- 在您的 Cloudflare Pages 项目页面,点击顶部的 “设置 (Settings)” 标签页。
- 在设置页面中,点击左侧的 “构建和部署 (Builds & deployments)”。
- 找到 “生产分支 (Production branch)” 这个设置项。您会看到它当前的值是
main
。 - 点击“编辑分支(Edit branch)”或类似的按钮,将它从
main
更改为my-config
。 - 点击“保存 (Save)”。
后续操作
保存之后,Cloudflare 会自动将 my-config
分支上最新的、已经构建好的部署正式发布到您的主域名 i.123456.xyz
上。这个过程通常很快,一两分钟内就会生效。
最终验证
请在 Cloudflare 显示更新完成后:
- 打开一个全新的浏览器“无痕/隐私模式”窗口。
- 访问
https://i.123456.xyz
,刷新页面,提示测速成功,上传和下载文件正常,代表服务部署成功。