LibreSpeed 的 Docker 版本可在此处获取:GitHub Packages
基于 Alpine Linux 的 LibreSpeed Docker 版本也可在此处获取:GitHub Packages,位于所有带 -alpine 后缀的标签下。该变体明显更小,但由于其工具链基于 musl libc(如此处所述),行为可能略有不同。
如果你只是想试用一下,最快的方式是:
docker run -p 80:8080 -d --name speedtest --rm ghcr.io/librespeed/speedtest然后用浏览器访问你服务器的 80 端口试用。如果 80 端口已被占用,请调整上面 80:8080 中的第一个数字。 默认以 standalone(独立)模式运行。
在生产环境中,我们建议使用 docker-compose。
要使用 docker compose 启动容器,可以使用以下 docker-compose.yml 配置:
version: '3.7'
services:
speedtest:
container_name: speedtest
image: ghcr.io/librespeed/speedtest:latest
restart: always
environment:
MODE: standalone
#TITLE: "LibreSpeed"
#TAGLINE: "No Flash, No Java, No Websockets, No Bullsh*t"
#TELEMETRY: "false"
#ENABLE_ID_OBFUSCATION: "false"
#REDACT_IP_ADDRESSES: "false"
#PASSWORD:
#GDPR_EMAIL: "privacy@example.com"
#DISABLE_IPINFO: "false"
#IPINFO_APIKEY: "your api key"
#DISTANCE: "km"
#WEBPORT: 8080
ports:
- "80:8080" # webport mapping (host:container)请根据预期的运行模式调整环境变量。
如果你想在单台服务器上安装 LibreSpeed,需要将其配置为独立模式。为此,请将 MODE 环境变量设置为 standalone。
测试可通过 80 端口访问。
以下是在该模式下可用的其他环境变量列表:
TITLE:你的网速测试的标题。默认值:LibreSpeedTAGLINE:现代前端(index-modern.html)标题下方显示的标语。默认值:No Flash, No Java, No Websockets, No Bullsh*tUSE_NEW_DESIGN:设置为true时,启用新的现代前端设计。设置为false(默认)时,使用经典设计。也可以使用 URL 参数(?design=new或?design=old)切换设计。默认值:falseSERVER_LIST_URL:设置后,两种前端设计都会从此 URL 加载服务器列表,而不是使用生成或挂载的server-list.json。如果你希望容器化前端使用远程共享服务器列表,这很有用。TELEMETRY:是否启用遥测。如果启用,你可能希望数据持久化,详见下文。默认值:falseENABLE_ID_OBFUSCATION:在启用遥测的情况下设置为 true 时,测试 ID 会被混淆,以避免暴露数据库内部的顺序 ID。默认值:falseOBFUSCATION_SALT:用于混淆测试 ID 的盐字符串。格式应为 2 字节的十六进制字符串(例如0x1234abcd)。如果未指定,将生成一个随机的。REDACT_IP_ADDRESSES:在启用遥测的情况下设置为 true 时,IP 地址和主机名将从收集的遥测中移除,以更好地保护隐私。默认值:falseDB_TYPE:设置为受支持的数据库后端之一时,将使用它而不是默认的 sqlite 数据库后端。TELEMETRY必须设置为true。此外,你还必须按照 doc.md 中的说明创建数据库。受支持的后端类型有:- sqlite - 无需额外设置
- mysql、postgresql - 设置额外的环境变量:
- DB_HOSTNAME - 数据库服务器的名称或 IP
- DB_PORT(仅 mysql)- 数据库运行的端口
- DB_NAME - 遥测数据库的名称
- DB_USERNAME、DB_PASSWORD - 对数据库具有读取和更新权限的用户的凭据
- mssql - 尚不支持 docker 镜像(欢迎为此提交 PR,需要在
entrypoint.sh中实现)
PASSWORD:访问统计页面的密码。如果未设置,统计页面将不允许访问。GDPR_EMAIL:隐私政策中显示的用于数据删除请求的电子邮件地址。如果未设置,将显示默认占位文本。在生产环境中运行时应设置此项以符合 GDPR 要求。启用遥测时必须指定。注意:旧的EMAIL环境变量仍作为回退被接受,但已弃用 —— 请迁移到GDPR_EMAIL。DISABLE_IPINFO:如果设置为true,将不会从 ipinfo.io 或离线数据库获取 ISP 信息和距离。默认值:falseIPINFO_APIKEY:ipinfo.io 的 API 密钥。可选,但如果想使用完整的 ipinfo.io API(距离测量需要),则是必需的。DISTANCE:当DISABLE_IPINFO设置为 false 时,指定如何测量与服务器的距离。可以是km(公里)、mi(英里),或空字符串以禁用距离测量。需要 ipinfo.io API 密钥。默认值:kmWEBPORT:允许为内置 Web 服务器选择自定义端口。默认值:8080。注意,你需要通过 docker 的 -p 参数将其暴露。这不是服务在 docker 外部暴露的端口!
如果启用了遥测,统计页面将在 http://your.server/results/stats.php 提供,但必须指定密码。
默认数据库驱动是 sqlite。数据库文件写入 /database/db.sql。
因此,如果你希望数据在镜像更新后仍然保留,必须使用 -v $PWD/db-dir:/database 挂载卷。
以下命令以独立模式启动 LibreSpeed,启用持久化遥测、ID 混淆和统计密码,监听 86 端口:
docker run -e MODE=standalone -e TELEMETRY=true -e ENABLE_ID_OBFUSCATION=true -e PASSWORD="yourPasswordHere" -e WEBPORT=86 -p 86:86 -v $PWD/db-dir/:/database -it ghcr.io/librespeed/speedtest对于多服务器场景,你需要部署 1 个或多个 LibreSpeed 后端,以及 1 个 LibreSpeed 前端。
在后端模式下,LibreSpeed 仅提供一个测试节点,没有 UI。为此,请将 MODE 环境变量设置为 backend。
以下后端文件可通过 80 端口访问:garbage.php、empty.php、getIP.php
以下是在该模式下可用的其他环境变量列表:
以下命令以默认设置在后端模式下启动 LibreSpeed,监听 80 端口:
docker run -e MODE=backend -p 80:8080 -it ghcr.io/librespeed/speedtest在前端模式下,LibreSpeed 为客户端提供 Web UI 和服务器列表。为此:
-
将
MODE环境变量设置为frontend -
创建一个包含测试节点的 servers.json 文件。语法如下:
注意:如果服务器仅支持 HTTP 或 HTTPS,请在 server 字段中指定协议。如果两者都支持,只需使用
//。 -
将此文件挂载到容器中的
/servers.json(示例见本文件末尾)
测试可通过 80 端口访问。
该模式下可用的环境变量列表与上面的独立模式相同。
如果你希望 Docker 前端从其他 URL 而不是 /servers.json 加载服务器列表,请设置 SERVER_LIST_URL:
docker run -e MODE=frontend -e SERVER_LIST_URL="https://example.com/custom-server-list.json" -p 80:8080 -it ghcr.io/librespeed/speedtest以下命令以前端模式启动 LibreSpeed,使用给定的 servers.json 文件,并启用遥测、ID 混淆、统计密码以及用于存储结果的持久化 sqlite 数据库:
docker run -e MODE=frontend -e TELEMETRY=true -e ENABLE_ID_OBFUSCATION=true -e PASSWORD="yourPasswordHere" -v $PWD/servers.json:/servers.json -v $PWD/db-dir/:/database -p 80:8080 -it ghcr.io/librespeed/speedtest在双模式下,LibreSpeed 作为独立服务器运行,同时也可以连接其他测试节点。为此:
- 将
MODE环境变量设置为dual - 按照前端模式的
servers.json说明操作 - 第一个服务器条目应是本地服务器,使用客户端可以访问的服务器端点地址。
[ { "name": "Friendly name for Server 1", "server" :"//server1.mydomain.com/", "dlURL" :"garbage.php", "ulURL" :"empty.php", "pingURL" :"empty.php", "getIpURL" :"getIP.php" }, { "name": "Friendly name for Server 2", "server" :"https://server2.mydomain.com/", "dlURL" :"garbage.php", "ulURL" :"empty.php", "pingURL" :"empty.php", "getIpURL" :"getIP.php" }, //...more servers... ]