# Signals CI/CD & Local Stack (DEVOPS-SIG-26-001) Artifacts: - Compose stack: `ops/devops/signals/docker-compose.signals.yml` (Signals API + Mongo + Valkey + artifact volume). - Sample config: `ops/devops/signals/signals.yaml` (mounted into the container at `/app/signals.yaml` if desired). - Dockerfile: `ops/devops/signals/Dockerfile` (multi-stage build on .NET 10 RC). - Build/export helper: `scripts/signals/build.sh` (saves image tar to `out/signals/signals-image.tar`). - Span sink stack: `ops/devops/signals/docker-compose.spansink.yml` + `otel-spansink.yaml` to collect OTLP traces (Excititor `/v1/vex/observations/**`) and write NDJSON to `spansink-data` volume. Run via `scripts/signals/run-spansink.sh`. - Grafana dashboard stub: `ops/devops/signals/dashboards/excititor-vex-traces.json` (import into Tempo-enabled Grafana). Quick start (offline-friendly): ```bash # build image scripts/signals/build.sh # run stack COMPOSE_FILE=ops/devops/signals/docker-compose.signals.yml docker compose up -d # hit health curl -s http://localhost:5088/health # run span sink collector scripts/signals/run-spansink.sh ``` Configuration (ENV or YAML): - `Signals__Mongo__ConnectionString` default `mongodb://signals-mongo:27017/signals` - `Signals__Cache__ConnectionString` default `signals-valkey:6379` - `Signals__Storage__RootPath` default `/data/artifacts` - Authority disabled by default for local; enable with `Signals__Authority__Enabled=true` and issuer settings. CI workflow: - `.gitea/workflows/signals-ci.yml` restores, builds, tests, builds container, and uploads `signals-image.tar` artifact. Dependencies: - Mongo 7 (wiredTiger) - Valkey 8 (cache, BSD-3 licensed Redis fork) - Artifact volume `signals_artifacts` for callgraph blobs.