crowdsecurity/crowdsec · error
target is down
Error message
target is down: %w
What it means
After parsing the nuclei target URL, RunWithNucleiTemplate checks the extracted host with IsAlive; if the target application is not reachable the test aborts with this error. The test requires both the crowdsec AppSec engine and the vulnerable target app to be up.
Solutions
- Start the test's target application before running the hub test
- Confirm the host:port extracted from NucleiTargetHost matches where the target actually listens (curl it manually)
- Check the target container/process logs for startup crashes
- If running in CI, ensure services are healthy/wait-for conditions before tests
Defensive patterns
Strategy: retry
Validate before calling
if err := waitReachable(targetHost, 30*time.Second); err != nil { t.Skipf("target app not up: %v", err) } Prevention
- Start the target app (e.g. docker compose up) before running hub tests
- Add CI health checks/wait-for on the target service
- Verify target port matches the test config with a manual curl
When it happens
Trigger: IsAlive(ctx, nucleiTargetHost) fails: the test's target application container/service is not started, is listening on a different interface/port, or crashed.
Common situations: Forgot to start the test's dummy/vulnerable app (e.g. docker compose service); target bound to localhost while config uses another hostname; port collision; target container exited on startup.
Understand the failure class
Background: ECONNREFUSED and "connection refused" / "could not connect to server" errors: what they mean and how to fix them — this error's family across 44 libraries.
Related errors
- appsec is down
- api register ( )
- cannot get records
- cannot list shards for enhanced_read
- cannot read line in response
AI-assisted analysis of crowdsecurity/crowdsec@909b515798 (2026-09-06).
Data as JSON: /api/errors/da1f60db97af559e.
Report an issue: GitHub.
Appendix: source
Thrown at pkg/hubtest/hubtest_item.go:396
if err2 != nil {
log.Errorf("unable to read crowdsec log file '%s': %s", crowdsecLogFile, err)
} else {
log.Errorf("crowdsec log file '%s'", crowdsecLogFile)
log.Errorf("%s\n", string(crowdsecLog))
}
return fmt.Errorf("appsec is down: %w", err)
}
// check if the target is available
nucleiTargetParsedURL, err := url.Parse(t.NucleiTargetHost)
if err != nil {
return fmt.Errorf("unable to parse target '%s': %w", t.NucleiTargetHost, err)
}
nucleiTargetHost := nucleiTargetParsedURL.Host
if _, err = IsAlive(ctx, nucleiTargetHost); err != nil {
return fmt.Errorf("target is down: %w", err)
}
nucleiConfig := NucleiConfig{
Path: "nuclei",
OutputDir: t.RuntimePath,
CmdLineOptions: []string{
"-ev", // allow variables from environment
"-nc", // no colors in output
"-dresp", // dump response
"-j", // json output
},
}
// the value in config is relative
nucleiTemplate := filepath.Join(t.Path, t.Config.NucleiTemplate)
err = nucleiConfig.RunNucleiTemplate(ctx, t.Name, nucleiTemplate, t.NucleiTargetHost)
if errors.Is(err, ErrNucleiRunFail) {View on GitHub (pinned to 909b515798)