base on 最轻量、高效、透明、稳定的多币种矿池、矿池代理、矿池中转。支持 BTC, ETC, RVN, NicaHash, XNA, ETHW, Ergo 等币种。自定义抽水账号及比例,高性能数据中转算法,无任何share损耗。具有高效的抽水算法,保证精确抽水。支持多端口监听及多矿池连接,同时接入3000+矿机性能稳定且不掉线。The lightest, most efficient, transparent, and stable multi-cryptocurrency mining pool proxy. <p align="center"> <a href="https://zeroproxy.app"> <img width="200" src="https://zeroproxy.app/static/images/logo.svg"> </a> </p> <h1 align="center">Zero Proxy</h1> <div align="center"> 最轻量、高效、透明、稳定的多币种矿池代理。 </div> 简体中文 | [English](./README-en_US.md) ## ✨ 特性 - 🎨 多币种支持,zero proxy 可同时多端口代理 BTC, ETC, RVN, NICEHASH, XNA, ETHW, ERGO 等多币种。 - 🔥 支持 2miners/hiveon/poolin/f2pool/ezil 等多种知名矿池。 - 🚀 以 aws-t3.micro 为例,单台服务器可稳定接入 3000+ 台矿机并稳定运行。 - 🌈 支持定义多个监听端口,即启动一个代理,就能提供多个端口,分别连入不同的矿池。 - 📦 高效抽水算法,极大减少矿机额外份额损失,客户端算力显示正常。 - 💰 支持添加多个抽水账号,且每个账号可设置不同钱包地址及抽水比例,让您灵活定制抽水。 - 🪟 固定 0.5% 开发费用,所有数据均可在控制台查看,无额外抽水。 - 🔒 支持用户采用自定义证书来替换内置证书。 - ⛏️ 控制台内置了多个常用矿池,方便您进行配置。 - 🛡 采用 Go 及 Node.js 等前沿技术开发,安全可靠。 ## 🖥 支持的操作系统 - Linux (Ubuntu / CentOS / Debian / AlmaLinux / Rocky Linux / Fedora) - Windows 7 + - OSX ## 📦 一键安装(Linux) 一键安装脚本包括了安装/卸载/启动/关闭/重启/更新等功能。 ```bash curl -o install.sh https://raw.githubusercontent.com/zero-proxy/zero-proxy/master/install.sh && chmod u+x install.sh && bash install.sh ``` 通过一键安装,Zero Proxy 自带了守护进程,无需额外进行设置。当安装完成本代理后,您依然可以通过 install.sh 脚本进行代理管理,其功能包括:安装、卸载、启动、关闭、重启、更新代理等。通过执行 install.sh 脚本并选取相应数字即可。 安装完成后即可通过浏览器登陆web控制台(请确保3001端口在云服务商的安全组中已经开启): ``` http://ip:3001 账号:zero-proxy 密码: zeroproxypwd ``` 账号密码可在[config.json](./config.json)文件中配置。<b>请及时更改密码</b>,以防止被恶意第三方扫描登陆。 ## 更新日志 ### 2024-04-02 zero-proxy V1.3.4发布,修复部分bug。 ### 2024-03-10 zero-proxy V1.3.3正式发布,新增BTG和ZEPH币种。 ### 2024-02-27 zero-proxy V1.3.2正式发布,提高BTC代理性能。 ### 2024-02-09 zero-proxy V1.3.1正式发布,更好地支持BTC,并将开发者费用设置为0.5%。 ### 2024-01-13 zero-proxy V1.3.0正式发布,支持多矿池协议及多币种代理。 ## 💻 Web 控制台截图 <div> <img src="https://zeroproxy.app/static/images/dashboard.png"> <img src="https://zeroproxy.app/static/images/workers.png"> <img src="https://zeroproxy.app/static/images/agents.png"> <img src="https://zeroproxy.app/static/images/proxy-config.png"> </div> ## ⚒️ 手动安装(Linux) ```bash git clone https://github.com/zero-proxy/zero-proxy.git cd zero-proxy chmod u+x zero-proxy_linux # 若未安装node.js,则先通过nvm安装,若已安装node.js可跳过 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash source ~/.nvm/nvm.sh nvm install 16 # 安装pm2,作为守护进程 npm install -g pm2 # 初始化日志系统 pm2 install pm2-logrotate pm2 set pm2-logrotate:max_size 20M pm2 set pm2-logrotate:compress true pm2 set pm2-logrotate:retain 10 # 启动 pm2 start zero-proxy_linux --name zero-proxy -e logs/zero-proxy-error.log -o logs/zero-proxy-out.log # 停止 pm2 stop zero-proxy # 重启 pm2 restart zero-proxy # 查看日志 pm2 logs ``` ## ⚒️ 手动安装(Windows) 进入下载页面下载最新版本,解压后运行 zero-proxy_win64.exe 即可,请注意,若直接运行则无守护进行,可参照上述命令安装 pm2 后运行。 ## ✈️ 更新代理 可以通过 install.sh 脚本一键更新代理 ```bash ./install.sh # 输入: 6 ``` ## ⚙️ 手动更新(推荐使用 install.sh 脚本进行更新) ```bash cd zero-proxy git pull origin master # 删除之前的版本 pm2 delete zero-proxy # 启动最新版本 pm2 start zero-proxy_linux --name zero-proxy ``` ## 🗂️ 配置文件 [config.js](./config.json)为矿池代理的配置文件,可以通过在控制台中设置,亦可直接在文件中配置。 | 配置 | 解释 | | :----------: | :------------------------------------------------------------------------------------: | | maxWorkers | 矿池最大连接数,设置为 0 则表示无上限(Linux 系统需要打开文件连接上限) | | workerPrefix | 全局矿机前缀,会加在矿机名的前面,在抽水账户的矿池界面中显示,设置为空则不添加前缀 | | user | 控制台登录的用户密码 | | agents | 抽水账户列表,可设置多个抽水账户,详细解释见下方,可在控制台中设置 | | servers | 监听端口列表,可设置多个监听端口,分别连接不同的矿池,详细解释见下方,可在控制台中设置 | | cert | 证书配置,可设置为内置证书或自定义证书,推荐通过控制台设置 | ### agents 抽水账户配置 (建议通过 Web 控制台配置) | 配置 | 解释 | | :------: | :--------------------------------------------------------: | | user | 抽水账户的钱包地址 | | password | 抽水账户接入矿池的密码,若无密码可不填,或填“x” | | name | 抽水账户名称,仅做备注用,可随意命名 | | fee | 抽水比例,为 0 到 1 之间的数,若要设置为 1%抽水,则填 0.01 | | enable | 是否开启该抽水账户 | | pool | 抽水账户对应的矿池,包含币种,host, port 以及是否开启 TLS | ### servers 监听端口配置 (建议通过 Web 控制台配置) | 配置 | 解释 | | :--: | :---------------------------------------------------------------------------------: | | port | 表示矿池代理对接入连接的监听端口,一个监听端口可以对应连接一个矿池,请确保端口不被其它程序占用 | | tls | 该监听端口是否要开启 TLS/SSL,若开启,则矿机需要相应开启 TLS/SSL 才可接入 | | pool | 所有接入该监听端口的矿机,都将连接到本矿池中 | | id | ID可不配置,系统会在后续启动中自动生成 ID,若手动配置,请确保 ID 不与现有 ID 重复 | 通过对监听端口、对应矿池的自由组合,我们可以配置成各种连接方式,如下所示: ```json "servers": [ { "port": 10200, "tls": false, "pool": { "host": "etc.hiveon.com", "port": 20443, "tls": true, "coin": "ETC" }, "id": "etc" }, { "port": 10201, "tls": true, "pool": { "host": "asia-rvn.2miners.com", "port": 16060, "tls": true, "coin": "RVN" }, "id": "rvn-tls" }, { "port": 10300, "tls": false, "pool": { "host": "kawpow.auto.nicehash.com", "port": 9200, "tls": false, "coin": "NICEHASH-KAWPOW" }, "id": "nicehash" }, ], ``` 该示例表示 Zero Proxy 开启了 3 个监听端口,分别为: 1. 监听 10200 口,矿机到本代理的连接不开启 TLS,对应矿池为 hiveon,且从代理到矿池的连接开启 TLS。 2. 监听 10201 口,矿机到本代理的连接开启 TLS,对应矿池为 2miners,且从代理到矿池的连接也开启 TLS。 3. 监听 10300 口,矿机到本代理的连接不开启 TLS,对应矿池为 nicehash-kawpow,且从代理到矿池的连接也不开启 TLS。 ## 💡 FAQ 1. 抽水账号在矿池中显示的曲线为心电图,正常吗? 抽水算法的目标是为了尽量提高抽水效率,尽最大可能降低对客户矿机的影响,这会导致抽水账户显示的算力曲线为心电图曲线,但是不影响收益,同时,客户矿机的算力曲线完全正常。 2. 可以支持大规模的矿机接入吗? 可以,在内部使用的过程中,我们仅使用单台aws-t3.micro服务器即可接入 3200+ 台矿机,并且能够长时间稳定运行,CPU保持在50%使用率内。 3. 我自己部署 Zero Proxy 后,用户矿机接入多久后,我才能在控制台中看到抽水? 为了保证用户体验,在矿机第一次接入时,会优先为矿机客户工作,约2-4小时候后会进入第一次抽水时间,届时可进入控制台中查看,请耐心等待。而后每隔一定时间开启新一轮抽水。若矿机中途掉线,重新连接后会自动恢复掉线前的状态,以保证整体抽水比例与设定值一致。 4. TLS和SSL的区别是什么,我通过代理开启了TLS,还需要开启SSL吗? 不需要,TLS即是最新版本的SSL,具有全部的SSL功能,同时比旧的SSL更加安全可靠。通常情况下我们认为TLS和SSL是一样的,都代表对传输层进行可靠的安全加密,可以进行混用,不需要做额外区分。 5. 可以用一个代理同时接入多个矿池吗? 可以,通过上述示例配置,我们就让本代理同时接入了hiveon和2miners和nicehash中,客户端只要连接不同的端口(分别为10200,10201,10300)即可接入不同的矿池。 6. 为什么我设置了监听端口,但是客户端机器还是连接不进来 通常情况下,云服务商(如亚马逊云)会在安全组中限制接入的端口,当你创建了一个监听端口时,请务必确保该端口在云服务商控制台的安全组中也被放行。 7. pm2 是什么,可以不使用吗? pm2 是一个类似于 supervisor 的守护进程,能够保证 Zero Proxy 在任何时候都能够稳定运行,非常建议配合使用。 8. 开发费用是固定的吗?如何查看? Zero Proxy 固定抽取0.5%作为开发费用,无论用户添加几个抽水账号,设置多少抽水比例,该费用均不变。用户可通过控制台、后端日志或者抓取流量包的形式进行判断。 ## 🔗 链接 - [Zero Proxy 官网](https://zeroproxy.app/) ## ❤️ 捐赠 BTC: bc1qu0atqnnp3ms7dcc42y76aa7a9fwtyzrdzgm8cy ETH: 0xa99428129b7278f20470d72d287B8FEb4276A046 USDT: 0xa99428129b7278f20470d72d287B8FEb4276A046 ", Assign "at most 3 tags" to the expected json: {"id":"6958","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"