{"id":25495769,"url":"https://github.com/litermc/go-openbmclapi","last_synced_at":"2025-08-01T11:36:59.237Z","repository":{"id":64304030,"uuid":"418331127","full_name":"LiterMC/go-openbmclapi","owner":"LiterMC","description":"OpenBMCLAPI written in Golang","archived":false,"fork":false,"pushed_at":"2024-10-09T17:56:35.000Z","size":12703,"stargazers_count":48,"open_issues_count":14,"forks_count":21,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-07T13:28:35.539Z","etag":null,"topics":["bmclapi","golang-application","minecraft","minecraft-mirror","mirror","openbmclapi"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/LiterMC.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-10-18T03:31:32.000Z","updated_at":"2025-02-12T01:17:31.000Z","dependencies_parsed_at":"2023-12-12T05:23:29.409Z","dependency_job_id":"bb6983cb-cf21-4f40-bde9-1f2a0c584c5f","html_url":"https://github.com/LiterMC/go-openbmclapi","commit_stats":null,"previous_names":["litermc/go-openbmclapi","kpnmserver/go-openbmclapi"],"tags_count":238,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiterMC%2Fgo-openbmclapi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiterMC%2Fgo-openbmclapi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiterMC%2Fgo-openbmclapi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LiterMC%2Fgo-openbmclapi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LiterMC","download_url":"https://codeload.github.com/LiterMC/go-openbmclapi/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244056425,"owners_count":20390719,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bmclapi","golang-application","minecraft","minecraft-mirror","mirror","openbmclapi"],"created_at":"2025-02-19T00:39:17.153Z","updated_at":"2025-03-17T15:12:23.074Z","avatar_url":"https://github.com/LiterMC.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\nGo OpenBmclAPI\n[![License](https://img.shields.io/github/license/LiterMC/go-openbmclapi)](https://github.com/LiterMC/go-openbmclapi/blob/master/LICENSE)\n[![Build Status](https://img.shields.io/github/actions/workflow/status/LiterMC/go-openbmclapi/build-tag.yml)](https://github.com/LiterMC/go-openbmclapi/actions)\n[![Downloads](https://img.shields.io/github/downloads/LiterMC/go-openbmclapi/total)](https://github.com/LiterMC/go-openbmclapi/releases)\n==============\n\nGolang 版的 [OpenBmclAPI](https://github.com/bangbang93/openbmclapi)\n\n\u003e 注: 本仓库部分代码按照 \u003chttps://github.com/bangbang93/openbmclapi\u003e 编写, **非官方, 不保证时效性**\n\n*如果本项目有用, 就给个 star ⭐️ 吧 :)*\n\n欢迎进行 PR.\n\n-\u003e [完整贡献者列表](./CONTRIBUTORS.md)\n\n## 特性\n\n- 支持代理 BMCLAPI 请求, 并使用本地缓存加速请求\n- 使用协程/多线程, 超高的文件同步速度\n- ~~不依赖大量的三方包, 体积小巧~~\n- 静态文件, 无需配置任何依赖\n- 得益于 Golang 强大的跨平台编译器, 支持大部分平台/处理器\n- 内置一个统计面板\n- 支持在面板内实时查看日志 (需登录)\n- 支持自动化打洞程序\n- 支持在节点上线/下线时发送通知\n- 支持一些小众的~~奇怪~~需求\n- ~~更好的压榨节点~~\n\n## FAQ\n\nQ: 如何运行 / 配置该程序?  \nA: 请查看 [`docs`](./docs) 文件夹下的文档\n\nQ: 支持`.env`文件吗?  \nA: 不支持, Go-OpenBmclAPI 使用 yaml 配置文件, 该文件应位于程序的运行目录. 初次运行本程序时会自动创建该配置文件\n\nQ: 没有适合我的平台的程序怎么办?  \nA: 检查 [Go Platform Values](https://gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63#platform-values), 如果您的系统/架构存在, 那么可以发个 issue\n\nQ: 版本号格式  \nA: `v\u003copenbmclapi 版本\u003e-\u003cgo-openbmclapi 构建计数\u003e`, 例: `v1.6.7-60`\n\nQ: 面板在哪里访问?  \nA: 服务端启动时会输出 `https://\u003cpublic-host\u003e:\u003cpublic-port\u003e`, 访问这个地址就可以了\n   \u003e 注: 面板与 openbmclapi 下载服务共用一个端口, 并非单独配置\n\nQ: 检查文件的时候过慢怎么办?  \nA: 如果您确定您的存储稳定, 将 `config.yaml` 下的 `no-heavy-check` 选项设为 `true` 即可\n\nQ: 程序无法运行 / 直接退出怎么办?  \nA: 请将运行目录下 `logs` 文件夹内最新的日志上传到 [Github Issue](https://github.com/LiterMC/go-openbmclapi/issues/new)\n\nQ: 面板日志一直无法连接?  \nA: 请确认中间所有的反向代理都支持 WebSocket\n\n## 安装\n\n注意: LiterMC-RootCA 的 SHA1 指纹为 `A2:CB:34:70:25:CF:5D:F6:57:1C:67:81:35:49:7D:6D:A7:26:F7:0E`\n\n### 无依赖直接运行\n\n1. 从 [Github Release](https://github.com/LiterMC/go-openbmclapi/releases/latest) 找到**适合您服务器平台**的程序并下载到节点服务器上\n2. 配置配置文件, 可以直接使用与bangbang93的openbmclapi相同的环境变量配置, 也可以从`config.yaml`进行配置 _(下文有讲)_\n3. 运行程序\n\n### 从docker运行\n\n- 可直接运行仓库目录下的 [`scripts/docker-run.sh`](./scripts/docker-run.sh) 文件, 运行之前请确保存在`craftmine/go-openbmclapi:latest`镜像, 或网络连通\n- 国内可能屏蔽了 dockerHUB, 可以尝试拉取 `mcdr.waerba.com/go-openbmclapi:latest`\n- 也可使用`docker build -t craftmine/go-openbmclapi:latest .`手动编译镜像\n\n### 从`systemd`运行 _(仅Linux)_\n\n1. **确保systemd是您的*启动进程***\n2. 执行\n   ```sh\n   curl -fsSL https://raw.githubusercontent.com/LiterMC/go-openbmclapi/HEAD/installer/service/installer.sh | sudo bash -s\n   ```\n   \u003e 注意, 新版新增使用 `openbmclapi` 用户执行程序, 可能需要执行 `sudo chown -R openbmclapi /opt/openbmclapi` 指令修复权限\n\n   国内对 Github 的支持较差, 可以使用 ghproxy 等镜像站运行脚本, 本例中使用了 [crashmc.com](https://crashmc.com) 提供的 CDN:\n   ```sh\n   MIRROR_PREFIX=https://cdn.crashmc.com/\n   curl -fsSL ${MIRROR_PREFIX}https://raw.githubusercontent.com/LiterMC/go-openbmclapi/HEAD/installer/service/installer.sh | sudo bash -s -- --mirror \"${MIRROR_PREFIX}\"\n   ```\n\n   如果需要下载指定版本, 只需设置 `-t|--tag` 标志即可\n   ```sh\n   curl -fsSL https://raw.githubusercontent.com/LiterMC/go-openbmclapi/HEAD/installer/service/installer.sh | sudo bash -s -- --tag v1.9.7-8\n   ```\n3. 配置`/opt/openbmclapi/config.yaml`配置文件\n4. 使用`systemctl start go-openbmclapi.service`启动服务\n   - 使用`systemctl reload go-openbmclapi.service`可重新加载配置文件\n   - 使用`systemctl stop go-openbmclapi.service`停止服务\n   - 使用`systemctl enable go-openbmclapi.service`让服务自启动\n   - 使用`systemctl disable go-openbmclapi.service`禁止服务自启动\n   - 使用`journalctl -f --output cat -u go-openbmclapi.service`实时监听日志\n\n### 从源代码运行\n\n1. 确保您的服务器上装有 `go 1.21+` 以及 `node \u0026 npm`\n2. 下载本仓库 _(可以使用`git clone https://github.com/LiterMC/go-openbmclapi.git`)_\n3. cd 进入本仓库\n4. 配置配置文件或环境变量\n5. 使用 `go generate . \u0026\u0026 go run .` 运行本程序\n\n### 第三方自更新+无依赖直接运行脚本\n\n源代码位于 \u003chttps://github.com/8Mi-Tech/Shell/blob/main/go-openbmclapi-in-tmux.sh\u003e\n\n```\ncd /opt/openbmclapi\nwget -O start.sh https://raw.githubusercontent.com/8Mi-Tech/Shell/main/go-openbmclapi-in-tmux.sh\nbash ./start.sh\n```\n\n## 配置\n\n### 使用配置文件\n\n#### 注意: 配置文件指定的值会被环境变量的值 _(如果存在)_ 覆盖掉\n\n配置文件应为**运行目录**下的`config.yaml`文件, 使用`yaml`格式解析  \n例:\n```yaml\n# 是否不打印访问信息\nno-access-log: false\n# 最多输出几个 1MB 的访问日志\naccess-log-slots: 16\n# 日志最长保存时间 (天). 设置为 0 禁用清理过期日志\nlog-slots: 7\n# 是否不使用 bmclapi 分发的证书, 同 CLUSTER_BYOC\nbyoc: false\n# 是否提供自己的证书. 启用后同时需要设置下面的 certificates 字段\nuse-cert: false\n# 是否信任 X-Forwarded-For 标头 (有反代时启用)\ntrusted-x-forwarded-for: false\n# 实际开放的公网主机名, 同 CLUSTER_IP\npublic-host: example.com\n# 实际开放的公网端口, 同 CLUSTER_PUBLIC_PORT\npublic-port: 8080\n# 要监听的本地端口, 同 CLUSTER_PORT\nport: 4000\n# openbmclapi 的 CLUSTER_ID\ncluster-id: ${CLUSTER_ID}\n# openbmclapi 的 CLUSTER_SECRET\ncluster-secret: ${CLUSTER_SECRET}\n# 文件同步间隔 (分钟)\nsync-interval: 10\n# 仅在程序开始时清理文件\nonly-gc-when-start: false\n# 按需同步时最大可打开的连接数量.\ndownload-max-conn: 64\n# 连接主控的最大重试数, 0 表示不重试, -1 表示无限制\nmax-reconnect-count: 10\n\n# 证书列表. 仅当 use-cert 为 true 时才会加载. 不受 byoc 影响\ncertificates:\n  - cert: /path/to/cert.pem # 证书路径\n    key: /path/to/key.pem   # 私钥路径\n\n# 打洞程序配置\ntunneler:\n  # 是否使用打洞\n  enable: false\n  # 打洞程序/脚本路径. 注意: 暂不支持传递参数. 若要指定参数, 请在脚本内带参调用目标程序\n  tunnel-program: ./path/to/tunnel/program\n  # 打洞程序 host \u0026 port 输出, 使用 regex 格式\n  output-regex: \\bNATedAddr\\s+(?\u003chost\u003e[0-9.]+|\\[[0-9a-f:]+\\]):(?\u003cport\u003e\\d+)$\n  # 打洞超时, 暂无用处\n  tunnel-timeout: 0\n\n# 缓存\ncache:\n  # 缓存类型:\n  #   nocache: 不缓存\n  #   inmem: 程序内内存缓存\n  #   redis: Redis 缓存\n  type: redis\n  # 如果使用 Redis 缓存则还需要配置用户名密码等:\n  data:\n    network: tcp\n    addr: \"redis.server.hostname.example.com:6379\"\n    client-name: \"go-openbmclapi\"\n    username: redis-username\n    password: redis-password\n\n# 服务器上行限制\nserve-limit:\n  # 是否启用上行限制\n  enable: false\n  # 最大连接数量, -1 表示无限制\n  max-conn: 16384\n  # 上行速率限制 (KiB/s), 0 表示无限制\n  upload-rate: 0\n\n# API 速率限制. 注意: 该功能仅限制对 /api 路径的访问, 不会影响 openbmclapi 基本功能\napi-rate-limit:\n  # 未登录用户的速率限制, 以访问 IP 为准 (会被 trusted-x-forwarded-for 标志影响)\n  anonymous:\n    per-minute: 10 # 每分钟最多请求数, 0 表示不限制\n    per-hour: 120  # 每小时最多请求数, 0 表示不限制\n  # 已登录用户的速率限制, 以用户名为准\n  logged:\n    per-minute: 120\n    per-hour: 6000\n\n# 通知设置\nnotification:\n  # 启用邮件通知\n  enable-email: false\n  # 邮件 SMTP 服务器及其端口\n  email-smtp: smtp.example.com:25\n  # SMTP 服务器加密类型\n  # - none : 无加密\n  # - ssl  : 使用 SSL/TLS 加密\n  # - tls  : 使用 STARTTLS 加密\n  email-smtp-encryption: tls\n  # 通知者邮箱用户名\n  email-sender: noreply@example.com\n  # 通知者邮箱密码\n  email-sender-password: example-password\n  # 启用 Webhook (TODO)\n  enable-webhook: true\n\n# 内置的仪表板\ndashboard:\n  # 是否启用\n  enable: true\n  # 登录用的用户名, 留空表示禁止登录\n  username: \"\"\n  # 登录用的密码, 留空表示禁止登录\n  password: \"\"\n  # PWA 的名称, 在桌面设备上显示\n  pwa-name: GoOpenBmclApi Dashboard\n  # PWA 短名称, 在移动设备上显示\n  pwa-short_name: GOBA Dash\n  # PWA 描述\n  pwa-description: Go-Openbmclapi Internal Dashboard\n  # 签名推送 JWT 时的 subject, 请将其设为 \"mailto:\u003c您的邮箱\u003e\" 或 \"https://\u003c您的域名\u003e\"\n  notification-subject: mailto:user@example.com\n\n# Github API 客户端配置\ngithub-api:\n  # 更新检测间隔\n  update-check-interval: 1h0m0s\n  # Github API 访问令牌, 绕过IP速率限制\n  # 请访问 \u003chttps://github.com/settings/tokens\u003e 生成新的无权限令牌\n  authorization: Bearer ghp_xxxx\n\n# 数据库\ndatabase:\n  # 数据库驱动, 可选值有:\n  # - memory # 内存数据库, 无持久化, 不需 DSN\n  # - sqlite   # sqlite 文件存储. DSN 为文件路径\n  # - mysql    # MySQL, DSN 见 \u003chttps://github.com/go-sql-driver/mysql?tab=readme-ov-file#dsn-data-source-name\u003e\n  # - postgres # PostgreSQL, DSN 见 \u003chttps://pkg.go.dev/github.com/lib/pq#hdr-Connection_String_Parameters\u003e\n  driver: sqlite\n  # 数据库的 DSN. 请参考上文\n  data-source-name: files.db\n\n# BMCLAPI 代理, 会处理所有文件下载请求, 并将其他请求转发到 BMCLAPI 主服务器\nhijack: # 注: 虽然名字是叫(hijack)劫持, 但其实它就是个代理\n  # 是否启用代理. 代理会在 /bmclapi/ 子路径下开启服务.\n  enable: false\n  # 是否启用本地缓存 (这样就可以离线访问访问过的端点了)\n  enable-local-cache: false\n  # 本地缓存保存位置\n  local-cache-path: hijack_cache\n  # 是否需要登录才能访问\n  require-auth: true\n  # 用户名密码对\n  auth-users:\n    - username: example-username\n      password: example-password # ❌ 请不要保持该密码 ❌\n\n# 子存储节点列表\n# 注意: measure 测量请求总是以第一个存储为准\nstorages:\n  # local 为本地存储\n  - type: local\n    # 节点 ID\n    id: local-storage-1\n    # 使用该子节点的概率 (非负整数)\n    weight: 100\n    # 节点附加数据\n    data:\n      # cache 文件夹的路径\n      cache-path: cache\n      # 压缩方式 (目前未使用)\n      compressor: \"\"\n  # mount 为网络存储 (与旧版 oss 选项含义大致相同)\n  - type: mount\n    # 节点 ID\n    id: mount-storage-1\n    # 使用该子节点的概率 (非负整数)\n    # 设为 0 将使该子节点成为备选节点 (若该节点前一个节点失效才会使用该节点), 如果所有子节点均为 0 则平均分配\n    weight: 0\n    # 节点附加数据\n    data:\n      # 文件夹路径\n      path: oss_mirror\n      # 对应的网络URL路径\n      redirect-base: https://oss.example.com/base/paths\n      # 启动之前在 measure 子文件夹内生成 1-200MB 的测速文件 (默认为动态生成)\n      pre-gen-measures: false\n  # webdav 使用 webdav 存储\n  - type: webdav\n    # 节点 ID\n    id: webdav-storage-1\n    # 使用该子节点的概率 (非负整数)\n    weight: 100\n    # 节点附加数据\n    data:\n      # 最多同时发起的连接数\n      max-conn: 24\n      # 最大上传速率 (KiB/s), 0 表示无限制\n      max-upload-rate: 0\n      # 最大下载速率 (KiB/s), 0 表示无限制\n      max-download-rate: 0\n      # 启动之前生成 1-200MB 的测速文件 (默认为动态生成)\n      pre-gen-measures: false\n      # 设置为 true 后将跟踪 302 请求 (即不会将最终用户重定向到网盘)\n      follow-redirect: false\n      # 重定向链接的缓存时间, 仅当 follow-redirect 为 false 时有用. 0 表示不缓存重定向链接\n      redirect-link-cache: 0s\n      # 链接到下方 webdav-users 的键值对\n      alias: example-user\n      # 相对于 alias 中的 Webdav 入口 URL **注意⚠️: 不要使用非 ascii (包括中文) 路径**\n      endpoint: ../optional/another/endpoint/\n      # [可选] 覆盖 alias 中的用户名\n      username: optional-another-username\n      # [可选] 覆盖 alias 中的密码\n      password: optional-another-password\n\nwebdav-users:\n    example-user:\n        # Webdav 入口 URL **注意⚠️: 不要使用非 ascii (包括中文) 路径**\n        endpoint: https://webdav.example.com/path/to/endpoint/\n        # 用户名\n        username: example-username\n        # 密码\n        password: example-password\n\n# 以下为高级选项, 通常用于调试. **❌ 如果不理解其工作原理请不要碰 ❌**\nadvanced:\n  # 是否打印调试日志\n  debug-log: false\n  # 是否记录 socket.io 流的日志 (仅在打开 debug-log 后才会输出到标准输出)\n  socket-io-log: false\n  # 跳过文件哈希值校验\n  no-heavy-check: true\n  # 不删除未使用的文件对象 **注意⚠️: 该选项打开后磁盘使用率会随时间增长**\n  no-gc: false\n  # 两次哈希校验之间间隔几次简单检查\n  heavy-check-interval: 120\n  # 发送心跳包的超时限制 (秒), 网不好就调高点\n  keepalive-timeout: 10\n  # 跳过第一次同步, 直接启动节点. **⚠️ 请保持该选项为 false ⚠️**\n  skip-first-sync: false\n  # 不检查请求签名. **⚠️ 请保持该选项为 false ⚠️**\n  skip-signature-check: false\n  # 是否在连接断开后直接退出\n  exit-when-disconnected: false\n  # 不执行快速上线\n  no-fast-enable: false\n  # 上线前等待几秒\n  wait-before-enable: 0\n  # ⚠️ 不进行安全域名重定向\n  do-NOT-redirect-https-to-SECURE-hostname: false\n  # ⚠️ 当您阅读完全部 README 后, 将该选项设为 true 即可避免打开浏览器\n  do-not-open-faq-on-windows: false\n\n```\n\n## 子命令\n\nGo-OpenBmclAPI 提供了一组子命令:\n```\nSub commands:\n  help\n        显示帮助消息\n\n  main | serve | \u003cempty\u003e\n        执行主程序\n\n  license\n        打印完整许可证\n\n  version\n        打印程序版本\n\n  zip-cache [options ...]\n        使用 gzip 压缩 cache 文件夹内的文件 (迁移用)\n\n    Options:\n      verbose | v : 显示正在压缩的文件\n      all | a : 压缩所有文件 (默认不会压缩10KB以下的文件)\n      overwrite | o : 覆盖存在的已压缩的目标文件\n      keep | k : 不删除压缩过的文件\n\n  unzip-cache [options ...]\n        解压缩 cache 文件夹内的文件 (迁移用)\n\n    Options:\n      verbose | v : 显示正在解压缩的文件\n      overwrite | o : 覆盖存在的未压缩的目标文件\n      keep | k : 不删除解压缩过的文件\n\n  upload-webdav\n        将本地 cache 文件夹上传到 webdav 存储\n        上传之前请确保 config.yaml 下存在至少一个 local 存储和至少一个 webdav 存储\n```\n\n## 致谢\n\n[OpenBMCLAPI-TypeScript](https://github.com/bangbang93/openbmclapi)（[@bangbang93](https://github.com/bangbang93)）\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flitermc%2Fgo-openbmclapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flitermc%2Fgo-openbmclapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flitermc%2Fgo-openbmclapi/lists"}