mirror of
https://github.com/netbirdio/netbird.git
synced 2026-07-18 12:39:54 +00:00
The CLI up path only tolerated a not-yet-ready daemon via a 10s blocking dial, so "netbird service start" immediately followed by "netbird up" (e.g. a container entrypoint) failed with a generic "daemon not running" error. The container entrypoint worked around this with a shell poll loop (status --check live) before running up. Move the readiness wait into the CLI, mirroring how the GUI already dials: - DialClientGRPCServer now uses grpc.NewClient with a tuned reconnect backoff and waits for the connection to reach READY (retrying on TRANSIENT_FAILURE) up to a 30s deadline, instead of grpc.DialContext + WithBlock with a hard 10s timeout. - up now polls Status via waitForDaemonStatus, retrying while the RPC is Unavailable (socket up but service not yet registered). Add an explicit daemon-ready signal so clients can wait deterministically instead of heuristically: - New optional StatusResponse.daemonReady field (field 5, wire-compatible with older GUIs/daemons which leave it unset). Regenerated with the pinned protoc v33.1 toolchain so no version churn leaks into the diff. - The server sets ready once Start succeeds and the DaemonService is registered (SetReady, called from the service controller). - waitForDaemonStatus waits for daemonReady=true (or an already-Connected status), with a bounded grace window so older daemons that never set the field are not blocked. Simplify the container entrypoint accordingly: drop the readiness poll loop (up now waits) and the now-dead NB_ENTRYPOINT_SERVICE_TIMEOUT env, keeping only the daemon+up process glue and SIGTERM forwarding for clean shutdown.
28 lines
987 B
Bash
Executable File
28 lines
987 B
Bash
Executable File
#!/usr/bin/env bash
|
|
# Runs the NetBird daemon and brings the connection up in one container process.
|
|
#
|
|
# A thin wrapper is needed (rather than a one-line ENTRYPOINT) for two reasons:
|
|
# 1. Two processes must run: the daemon (`service run`, long-lived) and a
|
|
# one-shot `up` that brings the connection up.
|
|
# 2. Signal handling: as PID 1 the wrapper must forward SIGTERM/SIGINT to the
|
|
# daemon so it tears down WireGuard and deregisters ephemeral peers on
|
|
# `docker stop`. Without this the daemon would be killed uncleanly.
|
|
#
|
|
# `netbird up` waits for the daemon to become ready on its own, so no readiness
|
|
# poll is needed here.
|
|
set -eEuo pipefail
|
|
|
|
NETBIRD_BIN="${NETBIRD_BIN:-"netbird"}"
|
|
export NB_LOG_FILE="${NB_LOG_FILE:-"console,/var/log/netbird/client.log"}"
|
|
|
|
daemon=""
|
|
cleanup() { [[ -n "${daemon}" ]] && kill -TERM "${daemon}" 2>/dev/null || true; }
|
|
trap cleanup SIGTERM SIGINT EXIT
|
|
|
|
"${NETBIRD_BIN}" service run &
|
|
daemon=$!
|
|
|
|
"${NETBIRD_BIN}" up
|
|
|
|
wait "${daemon}"
|