如何在Heroku上为Django应用运行IPFS daemon?
在Heroku上的Django应用中运行IPFS Daemon的可行方案
我之前刚好折腾过类似的需求,给你几个实际能用的思路,帮你解决和IPFS交互的问题:
方案一:使用Heroku多Buildpack + Procfile启动独立IPFS进程
这是最规范的方式,把IPFS daemon作为一个单独的dyno进程运行:
- 先给你的Heroku应用添加IPFS专用的Buildpack:
heroku buildpacks:add https://github.com/heroku/heroku-buildpack-ipfs.git - 确保你的Python Buildpack已经存在(如果之前没加过,执行这个):
heroku buildpacks:add heroku/python - 在项目根目录创建/修改
Procfile,同时定义web(Django)和ipfs进程:web: gunicorn your_project_name.wsgi ipfs: ipfs daemon --enable-pubsub-experiment --routing=dhtclient --api=/ip4/127.0.0.1/tcp/5001 - 部署后,启动ipfs dyno:
这样Django应用就能通过本地5001端口访问IPFS API了。heroku ps:scale ipfs=1
⚠️ 注意:Heroku的dyno文件系统是临时的,重启后IPFS节点的本地存储会被清空,所以如果需要持久化pin的文件,得配合远程pin服务或者第三方存储。
方案二:在Django启动时附带启动IPFS Daemon
如果不想单独开dyno,可以尝试在Django应用启动时后台启动daemon,适合资源占用不大的场景:
在你的Django应用的apps.py里修改启动逻辑:
import subprocess import os from django.apps import AppConfig class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app_name' def ready(self): # 避免开发模式下重复启动 if os.environ.get('RUN_MAIN') == 'true' and not os.environ.get('IPFS_DAEMON_STARTED'): os.environ['IPFS_DAEMON_STARTED'] = '1' # 启动IPFS daemon subprocess.Popen([ 'ipfs', 'daemon', '--enable-pubsub-experiment', '--routing=dhtclient', '--api=/ip4/127.0.0.1/tcp/5001' ])
然后在settings.py里指定这个AppConfig:
INSTALLED_APPS = [ # ...其他应用 'your_app_name.apps.YourAppConfig', ]
⚠️ 风险提示:这种方式下daemon和Django共享同一个dyno资源,容易因为内存/CPU占用过高被Heroku终止进程,而且daemon的日志不好单独排查。
方案三:使用第三方托管IPFS节点(最稳定推荐)
其实Heroku的环境并不适合长期运行IPFS daemon(临时存储+资源限制),更省心的方式是直接连接到第三方托管的IPFS节点:
修改你的Python IPFS API连接代码,指定远程节点地址:
import ipfshttpclient # 替换成公共节点或者你自己托管的节点地址 client = ipfshttpclient.connect('/ip4/xxx.xxx.xxx.xxx/tcp/5001')
公共节点可以找一些免费的,或者用付费的托管服务(比如Pinata、Infura的IPFS服务),这种方式完全避开了Heroku上运行daemon的各种坑,稳定性更高。
内容的提问来源于stack exchange,提问作者fccoelho
相关产品推荐
相关产品推荐

