GUN是一个生态系统,提供了一系列工具,让你能够构建社区运营和加密应用 - 类似于开源版的Firebase或去中心化的Dropbox。
互联网档案馆和数百个其他应用都在生产环境中运行GUN。GUN还是Twitter的bluesky计划的一部分!
- 默认支持多人操作,实现实时P2P状态同步!
- 图数据让你可以使用键值对、表格、文档、视频等多种数据形式!
- 本地优先、离线支持,去中心化且端到端加密。
基于GUN的Zoom、Reddit、Instagram、Slack、YouTube、Stripe、Wikipedia、Facebook Horizon等去中心化替代品已经每天推送了数TB的P2P流量。我们是一个友好的社区,正在创造一个自由有趣的未来:
快速入门
GUN 非常容易上手:
- 试试浏览器中的交互式教程(普通开发者平均需要5分钟)。
- 或者
npm install gun
然后运行示例cd node_modules/gun && npm start
(普通开发者平均需要5分钟)。
注意: 如果你没有安装 node 或 npm,请先阅读这里。 如果
npm
命令行不起作用,你可能需要先mkdir node_modules
或使用sudo
。
- 这里有示例的在线演示:http://try.axe.eco/
- 或者编写一个简单的应用:(立即在 playground 中尝试)
<script src="https://cdn.jsdelivr.net/npm/gun/gun.js"></script>
<script>
// 在 ESM 中使用 import GUN from 'gun';
// 在 NodeJS 中使用 GUN = require('gun');
// 在 React 中使用 GUN = require('gun/gun');
gun = GUN();
gun.get('mark').put({
name: "Mark",
email: "mark@gun.eco",
});
gun.get('mark').on((data, key) => {
console.log("实时更新:", data);
});
setInterval(() => { gun.get('mark').get('live').put(Math.random()) }, 9);
</script>
- 或者尝试一些令人兴奋的功能,比如将循环引用保存到文档表中!(试一试)
cat = {name: "Fluffy", species: "kitty"};
mark = {boss: cat};
cat.slave = mark;
// 部分更新会与现有数据合并!
gun.get('mark').put(mark);
// 像访问文档一样访问数据。
gun.get('mark').get('boss').get('name').once(function(data, key){
// `once` 只获取一次数据,不订阅。
console.log("Mark 的老板是", data);
});
// 遍历循环引用的图!
gun.get('mark').get('boss').get('slave').once(function(data, key){
console.log("Mark 是猫的奴隶!", data);
});
// 将它们都添加到表中!
gun.get('list').set(gun.get('mark').get('boss'));
gun.get('list').set(gun.get('mark'));
// 从表中连续获取每个项目一次:
gun.get('list').map().once(function(data, key){
console.log("项目:", data);
});
// 实时更新表!
gun.get('list').set({type: "cucumber", goal: "jumping cat"});
想要继续构建更多内容吗?跳转到文档!
关于
首先也是最重要的,GUN 是一个由最友善和最乐于助人的人组成的社区。所以我邀请你来告诉我们你正在做什么,想要构建什么(无论是新技术还是旧技术!只要保持友善),并直接向我们提问。:)
GUN 生态系统堆栈是一系列独立且模块化的工具集合,涵盖了从 CRDT 冲突解决、密码学安全和加密、基数存储序列化、网状网络和路由算法,到分布式系统正确性和负载测试、CPU 调度 JSON 解析器(防止 UI 卡顿)等各个方面!
说到这里,让我们先对一些官方支持者表示感谢:
支持
感谢:
Robert Heessels、 Lorenzo Mangani、 NLnet基金会、 Sam Liu、 Daniel Dombrowsky、 Vincent Woo、 AJ ONeal、 Bill Ottman、 Mike Lange、 Sean Matheson、 Alan Mimms、 Dário Freire、 John Williamson、 Robin Bron、 Elie Makhoul、 Mike Staub、 Bradley Matusiak、 Jeff Cook、 Nico、 Aaron Artille、 Tim Robinson、 Fabian Stamm、 Mike Staub、 Hunter Owens、 Jacob Millner、 Gerrit Balindt、 Gabriel Lemon、 Murage Martin、 Jason Stallings
- 加入其他人赞助代码:https://www.patreon.com/gunDB!
- 提问:http://stackoverflow.com/questions/tagged/gun?
- 发现bug?在此报告:https://github.com/amark/gun/issues;
- 需要帮助?与我们聊天:http://chat.gun.eco。
历史
GUN是由Mark Nadal在2014年创建的,此前他花了4年时间试图让他的协作网络应用程序使用传统数据库来扩展。
在他意识到主从数据库架构会造成一个巨大的瓶颈后,他(作为一个完全的外行新手)天真地决定质疑现状,通过一些有争议的、异端的和反传统的实验来改变现状: NoDB - 无主节点、无服务器、无"单一真实来源",不使用真正的编程语言或实体硬件构建,无需DevOps,无锁定,不仅仅是SQL或NoSQL,而是两者兼具(全部 - 图形、文档、表格、键值对)。
目标是构建一个P2P数据库,可以在任何浏览器中生存,并且在假设任何离线优先活动后,能够在任何设备之间正确同步数据。
从技术角度来说,GUN是一个图形同步协议,配备轻量级嵌入式引擎,能够在仅约9KB的gzip压缩大小内实现每秒2000万+API操作。
文档
如果没有社区贡献者,这一切都不可能实现,在此向他们表示衷心的感谢: ajmeyghani(通过图解学习GUN基础知识);anywhichway(块存储);beebase(Quasar);BrockAtkinson(brunch配置);Brysgo(GraphQL);d3x0r(SQLite);forrestjt(file.js);hillct(Docker);JosePedroDias(图形可视化工具);JuniperChicago(cycle.js绑定);jveres(todoMVC);kristianmandrup(edge);Lightnet(优秀的Vue用户示例和用户功能全面演示场);lmangani(Cytoscape可视化工具、Cassandra、Fastify、LetsEncrypt);mhelander(SEA);omarzion(便利贴应用);PsychoLlama(LevelDB);RangerMauve(schema);robertheessels(gun-p2p-auth);rogowski(AXE);sbeleidy;sbiaudet(C#移植版);Sean Matheson(Observable/RxJS/Most.js绑定);Shadyzpop(React Native示例);sjones6(Flint);已故**Stefdv(Polymer/web组件);zrrrzzt(JWT认证);xmonader(Python移植版)**。
我遗漏了很多其他人,抱歉,我会尽快添加他们!这个列表已经非常老旧且过时了,如果你想被列入其中,请提交一个PR!:)
测试
首先你需要运行npm install -g mocha
。然后在gun根目录下运行npm test
。测试会触发对数据库的持久化写入,所以后续的测试运行会失败。你必须在再次运行测试之前清除数据库。这可以通过在项目目录下运行rm -rf *data*
命令来完成。
填充库
这些只在NodeJS和React Native中需要,它们为原生浏览器WebCrypto API提供填充。
如果你想使用SEA进行User
认证和安全性,你需要安装:
npm install @peculiar/webcrypto --save
请查看我们的React Native文档以获取安装说明!
然后你可以无错误地引入SEA:
GUN = require('gun/gun');
SEA = require('gun/sea');
部署
注意:在
npm start
时自动部署的默认示例会将所有GUN文件、模块和存储CDN化。
注意:未来,AXE将开始自动将你的节点集群到共享的DHT中。你可能想要禁用这个功能以运行一个隔离的网络。 注意:在云提供商上使用GUN部署Web应用程序时,您可能需要在.env文件中设置CI=false。这可以防止GUN特定的警告在部署应用程序时被视为错误。您也可以通过修改webpack配置来解决这个问题,使其不尝试构建GUN依赖项。
要为您的开发团队快速搭建GUN中继节点,可以使用Heroku、Docker或下面列出的其他选项。或者使用其变体,如Dokku、K8s等!或者同时使用所有这些,让您的中继节点也实现去中心化!
Linux
使用具有sudo权限的账户SSH登录到一个干净的操作系统安装的主目录。设置所需的环境变量(见下文),然后执行:
curl -o- https://raw.githubusercontent.com/amark/gun/master/examples/install.sh | bash
请先阅读install.sh! 如果找不到curl命令,请将install.sh的内容复制粘贴到您的SSH会话中。
现在您可以安全地使用CTRL+A+D退出而不停止节点。要停止所有进程,请执行killall screen或killall node。
可能需要设置环境变量,如export HTTPS_CERT=/cert.pem HTTPS_KEY=/key.pem PORT=443。您还可以查看示例nginx配置。对于生产部署,您可能需要使用pm2或更好的工具来确保机器重启后节点仍然运行。
Dome
Heroku
Heroku每15分钟删除一次您的数据,解决这个问题的一种方法是添加廉价存储。
或者:
git clone https://github.com/amark/gun.git
cd gun
heroku create
git push -f heroku HEAD:master
然后在浏览器中访问'heroku create'步骤输出的URL。确保在设置选项卡中设置所有环境配置变量。
Zeet.co
然后在浏览器中访问'now --npm'步骤输出的URL。
Docker
警告:Docker镜像由社区贡献,可能较旧且缺少安全更新,请检查版本号进行比较。
从Docker Hub拉取 。或者:
docker run -p 8765:8765 gundb/gun
或者在本地构建Docker镜像:
git clone https://github.com/amark/gun.git
cd gun
docker build -t myrepo/gundb:v1 .
docker run -p 8765:8765 myrepo/gundb:v1
如果您更喜欢带有元数据标签的Docker镜像(仅限Linux/Mac):
npm run docker
docker run -p 8765:8765 username/gun:git
然后在浏览器中访问http://localhost:8765。
许可证
由Mark Nadal、GUN团队和众多优秀的贡献者用♥设计。 根据 Zlib / MIT / Apache 2.0 开源许可证公开发布。