From 79c38c58368d4eebd9259704490b60bd870526f2 Mon Sep 17 00:00:00 2001 From: BinkyTwin Date: Wed, 20 May 2026 22:10:02 +0200 Subject: [PATCH 1/2] feat: add NodeLink template --- blueprints/nodelink/docker-compose.yml | 36 +++++++++++++++++++++ blueprints/nodelink/nodelink.svg | 6 ++++ blueprints/nodelink/template.toml | 45 ++++++++++++++++++++++++++ meta.json | 18 +++++++++++ 4 files changed, 105 insertions(+) create mode 100644 blueprints/nodelink/docker-compose.yml create mode 100644 blueprints/nodelink/nodelink.svg create mode 100644 blueprints/nodelink/template.toml diff --git a/blueprints/nodelink/docker-compose.yml b/blueprints/nodelink/docker-compose.yml new file mode 100644 index 00000000..ebc2ed04 --- /dev/null +++ b/blueprints/nodelink/docker-compose.yml @@ -0,0 +1,36 @@ +version: "3.8" + +services: + nodelink: + image: performanc/nodelink:3.8.0 + restart: unless-stopped + expose: + - "2333" + environment: + NODELINK_SERVER_HOST: 0.0.0.0 + NODELINK_SERVER_PORT: "2333" + NODELINK_SERVER_PASSWORD: ${NODELINK_SERVER_PASSWORD} + NODELINK_LOGGING_LEVEL: ${NODELINK_LOGGING_LEVEL} + NODELINK_LOGGING_FILE_ENABLED: ${NODELINK_LOGGING_FILE_ENABLED} + NODELINK_SOURCES_LOCAL_ENABLED: ${NODELINK_SOURCES_LOCAL_ENABLED} + NODELINK_SOURCES_LOCAL_BASEPATH: /app/local-music/ + NODELINK_METRICS_ENABLED: ${NODELINK_METRICS_ENABLED} + volumes: + - nodelink-cache:/app/.cache + - nodelink-local-music:/app/local-music + - nodelink-logs:/app/logs + healthcheck: + test: + [ + "CMD-SHELL", + "node -e \"fetch('http://127.0.0.1:2333/version').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"", + ] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + +volumes: + nodelink-cache: + nodelink-local-music: + nodelink-logs: diff --git a/blueprints/nodelink/nodelink.svg b/blueprints/nodelink/nodelink.svg new file mode 100644 index 00000000..bded37ef --- /dev/null +++ b/blueprints/nodelink/nodelink.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/blueprints/nodelink/template.toml b/blueprints/nodelink/template.toml new file mode 100644 index 00000000..b140036c --- /dev/null +++ b/blueprints/nodelink/template.toml @@ -0,0 +1,45 @@ +[variables] +main_domain = "${domain}" +server_password = "${password:32}" +logging_level = "info" +file_logging_enabled = "false" +local_source_enabled = "false" +metrics_enabled = "false" + +[[config.domains]] +serviceName = "nodelink" +port = 2333 +host = "${main_domain}" +path = "/" + +[[config.mounts]] +filePath = "README.md" +content = """# NodeLink + +This template deploys NodeLink, a Lavalink-compatible audio server for Discord music bots and real-time audio systems. + +## Connection + +Use the deployed domain as your NodeLink/Lavalink server URL: + +- Host: `https://${main_domain}` +- Port: `443` when connecting through the Dokploy domain +- Password: the generated `server_password` value + +NodeLink exposes the `/version`, `/v4/stats`, and Lavalink-compatible WebSocket/API endpoints through the same domain. + +## Local Music + +The template creates a persistent `nodelink-local-music` volume mounted at `/app/local-music`. Set `local_source_enabled` to `true` before deployment if you want NodeLink to resolve `file:///app/local-music/...` tracks. + +## Metrics + +Set `metrics_enabled` to `true` to expose Prometheus metrics at `/v4/metrics`. Keep this disabled unless your deployment is protected and monitored. +""" + +[config.env] +NODELINK_SERVER_PASSWORD = "${server_password}" +NODELINK_LOGGING_LEVEL = "${logging_level}" +NODELINK_LOGGING_FILE_ENABLED = "${file_logging_enabled}" +NODELINK_SOURCES_LOCAL_ENABLED = "${local_source_enabled}" +NODELINK_METRICS_ENABLED = "${metrics_enabled}" diff --git a/meta.json b/meta.json index 8be7825d..b56d5c5a 100644 --- a/meta.json +++ b/meta.json @@ -4415,6 +4415,24 @@ "nocode" ] }, + { + "id": "nodelink", + "name": "NodeLink", + "version": "3.8.0", + "description": "NodeLink is a lightweight Lavalink-compatible audio server built in Node.js for Discord music bots and real-time audio systems.", + "logo": "nodelink.svg", + "links": { + "github": "https://github.com/PerformanC/NodeLink", + "website": "https://nodelink.js.org/", + "docs": "https://nodelink.js.org/docs/advanced/docker" + }, + "tags": [ + "audio", + "discord", + "lavalink", + "music" + ] + }, { "id": "notifuse", "name": "Notifuse", From ef8071e5ffae0b31beeb7c779d6a710b09183a3f Mon Sep 17 00:00:00 2001 From: Mauricio Siu Date: Wed, 8 Jul 2026 01:49:54 -0600 Subject: [PATCH 2/2] fix: send Authorization header in NodeLink healthcheck NodeLink requires the Authorization header on every API route, including /version, so the healthcheck's unauthenticated fetch always got a 401 and the container stayed permanently unhealthy. Traefik skips unhealthy containers, so the assigned domain returned a sustained 404 even though the deploy finished successfully. Pass the container's NODELINK_SERVER_PASSWORD as the Authorization header in the healthcheck fetch; the container now reaches a healthy state and the domain routes to the server (401 on / without credentials, 200 on /version with the password), as expected for a Lavalink-compatible server. Co-Authored-By: Claude Fable 5 --- blueprints/nodelink/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blueprints/nodelink/docker-compose.yml b/blueprints/nodelink/docker-compose.yml index ebc2ed04..76a97b40 100644 --- a/blueprints/nodelink/docker-compose.yml +++ b/blueprints/nodelink/docker-compose.yml @@ -23,7 +23,7 @@ services: test: [ "CMD-SHELL", - "node -e \"fetch('http://127.0.0.1:2333/version').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"", + "node -e \"fetch('http://127.0.0.1:2333/version',{headers:{authorization:process.env.NODELINK_SERVER_PASSWORD||''}}).then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"", ] interval: 30s timeout: 10s