fix: make local-dev (make dev) work on non-root / NFS hosts (#3590)

* fix(scripts): avoid lsof hang during make dev cleanup on NFS

`_is_deerflow_pid` and `_report_reclaimed_ports` call `lsof -p <pid>` to
enumerate a process's open files. On hosts whose working tree or home is
on a network filesystem (NFS/autofs), `lsof -p` blocks indefinitely on the
kernel stat calls, so `make dev` / `make stop` hang forever at
"Stopping all services...".

Add `-b` (avoid kernel blocking functions) and `-w` (suppress the
resulting warnings) to both calls. The network-only `lsof -nP -iTCP`
probes are unaffected and already returned quickly.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(nginx): set global error_log so local-dev nginx starts as non-root

nginx.local.conf only declared `error_log` inside the `http {}` block.
nginx opens its compiled-in default error log (on Debian/Ubuntu builds,
the absolute /var/log/nginx/error.log) at startup, before it reaches the
http-block directive. When `make dev` launches nginx as a non-root user
that path is not writable, so startup fails with:

    [emerg] open() "/var/log/nginx/error.log" failed (13: Permission denied)

Declare a global (main-context) `error_log logs/nginx-error.log warn;`.
Combined with the existing `-p $REPO_ROOT`, logging resolves to the
repo-local logs/ directory and nginx starts without elevated privileges.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
zhernrong92 2026-06-19 23:20:55 +08:00 committed by GitHub
parent deb736b819
commit e97d93503d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 6 additions and 2 deletions

View file

@ -1,3 +1,7 @@
# Global error_log (main context). Without this, nginx opens its compiled-in
# default (/var/log/nginx/error.log) at startup before reaching the http-block
# error_log, which fails with permission denied when run as a non-root user.
error_log logs/nginx-error.log warn;
events {
worker_connections 1024;
}

View file

@ -105,7 +105,7 @@ _is_deerflow_pid() {
return 0
fi
files=$(lsof -p "$pid" 2>/dev/null) || return 1
files=$(lsof -b -w -p "$pid" 2>/dev/null) || return 1
while IFS= read -r root; do
[ -n "$root" ] || continue
case "$files" in
@ -122,7 +122,7 @@ _report_reclaimed_ports() {
for port in 8001 3000 2026; do
for pid in $(lsof -nP -iTCP:"$port" -sTCP:LISTEN -t 2>/dev/null); do
_is_deerflow_pid "$pid" || continue
files=$(lsof -p "$pid" 2>/dev/null)
files=$(lsof -b -w -p "$pid" 2>/dev/null)
case "$files" in *"$REPO_ROOT"/*) continue ;; esac # this worktree — normal
owner=""
while IFS= read -r root; do