Enable Holesail tunnels by default; keep holesail as required dep
CI / test (push) Successful in 9m59s

Holesail is on unless ENABLE_HOLESAIL=0/false/off. The holesail package remains a required dependency; docs and UI copy match the new default.
This commit is contained in:
2026-07-10 22:56:17 -04:00
parent 02f25e0981
commit 244ff569f5
14 changed files with 50 additions and 26 deletions
+5 -3
View File
@@ -1,6 +1,6 @@
/**
* Holesail tunnel RPC handlers.
* Gated by ENABLE_HOLESAIL=1.
* On by default; opt out with ENABLE_HOLESAIL=0.
*/
import {
isHolesailEnabled,
@@ -17,13 +17,15 @@ import logger from '../utils/logger.js'
function assertHolesail() {
if (!isHolesailEnabled()) {
const err = new Error('Holesail tunnels disabled. Set ENABLE_HOLESAIL=1 to enable.')
const err = new Error(
'Holesail tunnels disabled. Remove ENABLE_HOLESAIL=0 (enabled by default).'
)
err.code = 'FEATURE_DISABLED'
throw err
}
if (!isHolesailAvailable()) {
const err = new Error(
'Holesail package is not available on this server. Install dependency "holesail".'
'Holesail package is not available. Ensure dependency "holesail" is installed (required).'
)
err.code = 'FEATURE_DISABLED'
throw err
+1 -1
View File
@@ -76,7 +76,7 @@ if (isHolesailEnabled()) {
` Holesail tunnels: ${hs.available ? 'enabled' : 'enabled but package missing'} (max ${hs.max})`
)
} else {
console.log(' Holesail tunnels: off (set ENABLE_HOLESAIL=1 to enable)')
console.log(' Holesail tunnels: off (ENABLE_HOLESAIL=0)')
}
console.log('═══════════════════════════════════════════════════════════')
console.log('')
+10 -3
View File
@@ -4,7 +4,8 @@
* peardock control plane: HyperDHT + protomux-rpc
* Data plane tunnels: Holesail L4 TCP/UDP reverse proxy (hs:// keys)
*
* Gated by ENABLE_HOLESAIL=1. Package: holesail (AGPL-3.0).
* Enabled by default. Set ENABLE_HOLESAIL=0 to disable.
* Package: holesail (AGPL-3.0) — required dependency.
*
* @see https://github.com/holesail/holesail
* @see docs/HOLESAIL.md
@@ -62,8 +63,14 @@ function loadHolesail() {
}
}
/**
* Holesail tunnels are on by default.
* Opt out with ENABLE_HOLESAIL=0 / false / off / no.
*/
export function isHolesailEnabled() {
return process.env.ENABLE_HOLESAIL === '1' || process.env.ENABLE_HOLESAIL === 'true'
const v = String(process.env.ENABLE_HOLESAIL ?? '1').trim().toLowerCase()
if (v === '0' || v === 'false' || v === 'off' || v === 'no') return false
return true
}
export function isHolesailAvailable() {
@@ -219,7 +226,7 @@ export function getTunnel(id) {
*/
export async function createTunnel(opts = {}) {
if (!isHolesailEnabled()) {
const err = new Error('Holesail tunnels disabled. Set ENABLE_HOLESAIL=1 to enable.')
const err = new Error('Holesail tunnels disabled. Remove ENABLE_HOLESAIL=0 to re-enable (on by default).')
err.code = 'FEATURE_DISABLED'
throw err
}
+4 -2
View File
@@ -89,8 +89,10 @@ export function getMetricsSnapshot(extra = {}) {
features: {
swarm: process.env.ENABLE_SWARM === '1' || process.env.ENABLE_SWARM === 'true',
plugins: process.env.ENABLE_PLUGINS === '1' || process.env.ENABLE_PLUGINS === 'true',
holesail:
process.env.ENABLE_HOLESAIL === '1' || process.env.ENABLE_HOLESAIL === 'true',
holesail: (() => {
const v = String(process.env.ENABLE_HOLESAIL ?? '1').trim().toLowerCase()
return !(v === '0' || v === 'false' || v === 'off' || v === 'no')
})(),
peerAllowlist:
process.env.PEARDOCK_PEER_ALLOWLIST === '1' ||
process.env.PEARDOCK_PEER_ALLOWLIST === 'true',