Troubleshooting

September 9, 2026 · View on GitHub

Full troubleshooting guide: Wiki — Troubleshooting

Operating System Compatibility

RedAmon is fully Dockerized and runs on any OS that supports Docker and Docker Compose v2+. Below are common OS-specific issues and their fixes.

Linux

ProblemCauseFix
Docker socket permission deniedUser not in docker groupsudo usermod -aG docker $USER then log out and back in
docker compose not foundOld Docker version uses docker-compose (hyphen)Install Docker Compose V2 plugin or use docker-compose
Port already in use (3000, 8010, etc.)Another service occupies the portChange ports in .env or stop the conflicting service
Containers killed (OOM)Insufficient RAMIncrease swap or free memory — see minimum requirements
Volume mount denied (SELinux)Fedora / RHEL / CentOS enforce SELinuxAdd :z suffix to volume mounts in docker-compose.yml, or run sudo setsebool -P container_manage_cgroup on
Firewall blocks container trafficfirewalld or ufw blocking Docker bridgesudo ufw allow in on docker0 or allow the Docker subnet in firewalld
DNS fails inside containerssystemd-resolved conflicts (Ubuntu 22.04+)Add {"dns": ["8.8.8.8", "8.8.4.4"]} to /etc/docker/daemon.json and restart Docker
/var/run/docker.sock not foundDocker not running or rootless Docker uses a different pathsudo systemctl start docker or set DOCKER_HOST to the correct socket path

Windows

ProblemCauseFix
Docker socket unavailableWindows uses named pipes, not Unix socketsUse Docker Desktop with WSL2 backend enabled
Line ending errors (\r\n)Git auto-converts LF → CRLF on Windowsgit config --global core.autocrlf input then re-clone the repo
Path too long errorsWindows 260-character path limitgit config --global core.longpaths true
Volume mount failsWindows path format incompatible with Linux containersRun from inside WSL2 filesystem (~/redamon), not from /mnt/c/
Extremely slow performanceBind mounts across Windows ↔ WSL boundaryStore the project inside WSL2 home (~/), not on a Windows-mounted drive
Docker Desktop won't startWSL2 or Hyper-V not enabledRun wsl --install in PowerShell (admin), reboot, then install Docker Desktop
Socket permission error in WSL2Docker Desktop integration not enabled for your WSL distroDocker Desktop → Settings → Resources → WSL Integration → enable your distro

macOS

ProblemCauseFix
Slow bind-mount performancemacOS filesystem sharing overheadUpgrade to Docker Desktop 4.x+ and enable VirtioFS in Settings → General
Port 5000 conflictmacOS AirPlay Receiver uses port 5000Disable AirPlay Receiver in System Settings → General → AirDrop & Handoff, or remap the port in .env
docker compose not foundDocker CLI plugins not in PATHRun brew install docker-compose or reinstall Docker Desktop
Containers OOM-killed during installDocker Desktop default Memory below RedAmon minimumDocker Desktop → Settings → Resources → Memory: set to 4 GB (8 GB with --gvm), then ./redamon.sh install
Cannot connect to the Docker daemonDocker Desktop not startedopen /Applications/Docker.app and wait until the whale icon stops animating before running ./redamon.sh
Mounts denied / path not sharedRepo cloned outside Docker Desktop's File Sharing allowlistClone the repo under ~/ (default-allowed), or add the custom path in Settings → Resources → File Sharing
SYN scans (naabu, masscan) miss hosts on the local LANnetwork_mode: host joins Docker Desktop's LinuxKit VM, not the Mac's networkExpected on Docker Desktop. Internet targets work normally; for LAN scans, run RedAmon on a Linux host
Login fails after install with no error in logsNon-interactive shell (CI, agents, some multiplexers) injected a \u0001 SOH byte into the admin email/password promptRun ./redamon.sh create-admin to (re)create the admin cleanly (reset-password only works once an admin already exists)
No admin prompt appeared at install / can't log inWebapp was slow to come up on first boot (common with --gvm or a small VM), so the automatic admin prompt was skippedRun ./redamon.sh create-admin once the stack is up (./redamon.sh status); it waits for the webapp, then prompts. Safe to re-run

The graph page hangs, 502s, or Neo4j logs "network aborts"

These three symptoms usually appear together on a project with a very large graph. They have distinct causes, so check them in this order.

SymptomCauseFix
Neo4j logs Increase in network aborts detected, connection count climbs steadilyFixed in this release. The webapp used to create a new Neo4j driver (and a new pool of up to 50 Bolt connections) on every production request, abandoning the previous oneUpdate. Confirm with CALL dbms.listConnections() — the count must stay flat while you reload the graph page, not climb
API requests sit in [pending] forever, no error, no timeoutFixed in this release. The driver's connection timeouts only bound acquiring a connection, so an unbounded whole-graph query ran foreverUpdate. Tune with NEO4J_QUERY_TIMEOUT_MS (default 120000) if you legitimately run long analytical queries
HTTP 502 from nginx, recv() failed (104: Connection reset by peer) in its error logThe webapp container was OOM-killed mid-response. A reset with no timeout means the process died, rather than the request being slowCheck ./redamon.sh status for OOM-killed containers and restart counts. Memory limits are sized from host RAM automatically; see README.MEMORY_GOVERNOR.md
Containers OOM-killed generallyHost genuinely too small, or limits pinned by hand in .env./redamon.sh status shows the computed allocation and warns when a running container has drifted from it

Useful checks:

./redamon.sh status                                    # OOM kills, restarts, allocation, disk
docker logs redamon-neo4j --tail 50 | grep -i abort    # Bolt connection aborts
docker inspect redamon-webapp --format '{{.RestartCount}} {{.State.OOMKilled}}'

./redamon.sh update refuses to pull

RedAmon's own scans used to dirty the git checkout. recon/ is bind mounted read-write into the spawned recon container, and two of its git-tracked data directories are re-downloaded there whenever their 24h cache expires:

PathWritten byContents
recon/main_recon_modules/data/mitre_db/add_mitre.pyMITRE CVE/CAPEC/CWE database, 15 files
recon/main_recon_modules/data/wappalyzer_cache/http_probe.pyWappalyzer fingerprints, technologies.json

So after a scan or two git pull --ff-only refused, and the error advised git commit -am 'local changes', which converts a self-healing dirty tree into a permanent dead end: the checkout then has a commit the project does not and a fast-forward can never happen again (issue #185).

update now restores both directories before pulling. Never commit files under them; they are machine-local caches that every scan may rewrite.

SymptomCauseFix
Could not pull updates: the working tree has local changes with no file list under it, and git status is cleanNot local changes at all: the branch has diverged. git log --oneline origin/master..HEAD shows a local changes commitUpdate once from a version that has this fixed. If you are already stuck, see the one-time recovery below
Same error, with a list of modified files under recon/main_recon_modules/data/Fixed in this release. update restored only a .last_update marker that had since been gitignored, so it was doing nothing while the database directories beside it were what actually driftedUpdate. Never commit those files — they are re-downloaded on every scan
Permission denied writing .torch-variant, .git/index, or similarAn earlier sudo ./redamon.sh … or sudo git … left root-owned files in a user-owned checkoutsudo chown -R "$(id -un):$(id -gn)" ., then re-run without sudo. update now checks this up front rather than failing halfway
Could not pull updates. plus a NOTE: 'git status' failed here blockAnother git process (an IDE, a hook, an interrupted command) holds .git/index.lock, or the index is corrupt. update deliberately refuses to auto-recover while it cannot read your working treeWait for the other git process to finish, or remove a stale .git/index.lock only if none is running. Do not reset --hard until git status works — it would discard uncommitted work nobody can see
error: unable to unlink … Permission denied on a file under recon/main_recon_modules/data/The scan container creates those cache directories as root inside a user-owned checkout, so neither git nor you can replace the fileSame chown. update now warns about root-owned runtime files before a release that changes one makes the pull fail

One-time recovery if your checkout has already diverged. The fix ships inside redamon.sh, which is the file you cannot pull, so a checkout that is already in this state needs one manual reset. It discards the bogus local changes commit only; run git log --oneline origin/master..HEAD first and copy anything of your own onto a branch if that list contains real work.

cd ~/redamon
sudo chown -R "$(id -un):$(id -gn)" .   # only if an earlier run used sudo
git fetch origin
git reset --hard origin/master
./redamon.sh update

From that release on, update recovers by itself: a diverging commit whose files are all RedAmon runtime files is reset automatically and reported, while a commit touching anything else stops the update with instructions that keep your work.

The automatic reset is the only destructive step in update, and it is gated four ways: the working tree must be clean, git status must be readable, every file in the diverging commits must sit under a RedAmon runtime data directory, and no path may contain a traversal. To disable it entirely and always recover by hand, set REDAMON_NO_AUTO_RESET=1.