You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
mvn -s settings.xml -B # Run Spring Boot dev server (port 8080)
27
-
mvn -B -Pprod clean package -s settings.xml # Production WAR → target/utmstack.war
28
+
mvn -s settings.xml -B # Spring Boot dev server (port 8080)
29
+
mvn -B -Pprod clean package -s settings.xml # Production WAR → target/utmstack.war
28
30
```
29
-
-Maven settings: `backend/settings.xml` authenticates to GitHub Packages via `MAVEN_TK` env var (GitHub PAT with `read:packages`).
31
+
-`settings.xml` authenticates to GitHub Packages via `MAVEN_TK` env var (GitHub PAT with `read:packages`).
30
32
- Spring profiles: `dev` (default), `prod`, `tls`. Config in `backend/src/main/resources/config/`.
31
33
- Docker dev database: `docker-compose -f backend/src/main/docker/mysql.yml up -d`
32
34
-**No `src/test/` directory** — tests are embedded in `src/main/java/`.
35
+
-**`jib-maven-plugin` image mismatch** — `pom.xml` references `eclipse-temurin:11-jre-focal` but the backend requires Java 17. The `Dockerfile` correctly uses `eclipse-temurin:17`. Jib builds will fail or produce broken images.
36
+
-**`proto-command.txt`** contains the protoc command for gRPC code generation.
33
37
34
38
### Frontend (Angular 7)
35
39
```bash
@@ -44,6 +48,7 @@ npm run lint # ng lint (TSLint, NOT ESLint)
44
48
- Linter is **TSLint** (`tslint.json`), not ESLint. Uses `codelyzer` rules.
45
49
- Output: `dist/utm-stack`. Styles use SCSS (`angular.json`).
46
50
-**Builds need 8 GB heap**: `NODE_OPTIONS=--max_old_space_size=8192`.
51
+
- Frontend Dockerfile serves via nginx (see `frontend/nginx/`).
47
52
48
53
### Go Components
49
54
Each module is independent. Build from its directory:
@@ -72,7 +77,12 @@ CI injects `$AGENT_SECRET_PREFIX` for all three. Without it, these services cann
72
77
### Plugins
73
78
Each plugin under `plugins/*/` is a standalone Go module. Build binary named `com.utmstack.<name>.plugin`.
74
79
75
-
**16 plugins** are copied into `event_processor.Dockerfile`. The `plugins/` directory currently has 17 modules — `compliance-orchestrator` exists but is not yet in the Dockerfile.
80
+
**16 plugins** are in `event_processor.Dockerfile`. The `plugins/` directory has 17 modules — `compliance-orchestrator` is in the directory but not yet in the Dockerfile.
81
+
82
+
Plugin list in Dockerfile: `alerts`, `aws`, `azure`, `bitdefender`, `config`, `events`, `gcp`, `geolocation`, `inputs`, `o365`, `sophos`, `stats`, `soc-ai`, `modules-config`, `crowdstrike`, `feeds`.
83
+
84
+
### user-auditor and web-pdf
85
+
Both are small Spring Boot 2.7.14 microservices (Java 11). Each has its own `pom.xml`, `Dockerfile`, and `compose.yml`. Built independently of the main backend.
-**Backend** serves the REST API. WAR packaging. `filters/` and `rules/` are YAML files copied into the container at `/utmstack/filters` and `/utmstack/rules`.
114
+
-**Event processor** is the core Go-based log correlation engine. Loads compiled plugin binaries at runtime. `event_processor.Dockerfile` expects all plugins pre-built alongside it.
115
+
-**Frontend** is a standalone Angular app served by nginx in a separate container.
116
+
-**Agent** runs on endpoints (Windows/Linux/macOS). Communicates with `agent-manager` via gRPC. Has Windows resource files (`rsrc_windows_*.syso`) for embedded icons.
117
+
-**Collector** (`utmstack-collector/`) and **AS400** (`as400/`) are separate log collection services. `as400/` is a near-identical copy of `utmstack-collector/` (same structure, different parser).
118
+
-**etc/** contains ISO build configs and OpenSearch configuration.
119
+
120
+
## Testing
121
+
122
+
-**Go**: `go test -v ./...` in each module directory. CI runs this via `reusable-golang.yml` before build.
-**Backend**: No separate `src/test/` tree. Tests live in `src/main/java/` alongside production code.
125
+
-**Go deps check**: `bash .github/scripts/go-deps.sh --check --discover` (discovers all `go.mod` files, checks for outdated direct deps and out-of-sync `go.sum`).
126
+
91
127
## CI / CD
92
128
93
129
### PR Checks
94
-
`.github/workflows/pr-checks.yml` — runs on PRs to `release/**`, `v10`, `v11`. Triggers Go dependency checks, AI review, and approver job.
130
+
`.github/workflows/pr-checks.yml` — runs on PRs to `release/**`, `v10`, `v11`. Three jobs:
131
+
1.`go_deps` — dependency freshness check across all Go modules
132
+
2.`ai_review` — matrix of ThreatWinds AI prompts (`.github/ai-prompts/`)
**AI prompts:**`security.md`, `bugs.md`, `architecture.md`. Default model: `gemini-3-flash-lite`. Add new prompts by dropping `.md` into `.github/ai-prompts/`.
See `.github/workflows/README.md` for full CI/CD documentation (secrets, approver setup, deployment flows, hotfix procedure).
95
143
96
144
### Deployment Pipelines
97
-
-**v11** (`.github/workflows/v11-deployment-pipeline.yml`) — active line. Triggers: push to `release/v11**` (dev), push to `v11` (rc), `release.released` (prod).
98
-
-**v10** (`.github/workflows/v10-deployment-pipeline.yml`) — legacy. Triggers: push to `release/v10**` (dev), push to `v10` (rc), `release.released` with `v10.*` tag (prod).
145
+
-**v11** (`.github/workflows/v11-deployment-pipeline.yml`) — active line
146
+
-**v10** (`.github/workflows/v10-deployment-pipeline.yml`) — legacy (EOL Dec 2026)
147
+
148
+
Images published to `ghcr.io/utmstack/utmstack/<image>:<tag>`.
99
149
100
150
### Reusable Workflows
101
-
-`reusable-java.yml` — Maven build + Docker push to `ghcr.io/utmstack/utmstack/<image>:<tag>`
102
-
-`reusable-golang.yml` — `go test ./...`, `go build`, Docker push
-`reusable-sign-agent.yml` — Windows (jsign + GCP KMS) and macOS (codesign + notarytool) signing
105
-
-`reusable-basic.yml` — Docker build-only
106
-
107
-
### Agent Signing Workflow
108
-
`installer-release.yml` builds the installer binary with ldflags using `CM_ENCRYPT_SALT` and `CM_SIGN_PUBLIC_KEY` secrets.
155
+
-`reusable-basic.yml` — Docker build only
109
156
110
-
## Key Architecture Notes
157
+
## Filters, Rules, and Plugins
111
158
112
-
-**Event processor** is the core Go-based log correlation engine. Loads compiled plugin binaries at runtime. `event_processor.Dockerfile` expects all plugins pre-built alongside it.
113
-
-**Backend** serves the REST API. WAR packaging. `filters/` and `rules/` are YAML files copied into the container at `/utmstack/filters` and `/utmstack/rules`.
114
-
-**Frontend** is a standalone Angular app in a separate container.
115
-
-**Agent** runs on endpoints (Windows/Linux/macOS). Communicates with `agent-manager` via gRPC.
116
-
-**Collector** (`utmstack-collector/`) and **AS400** (`as400/`) are separate log collection services.
-**Installer build requires ldflags** — see `installer/build.sh` for `DEFAULT_BRANCH`, `INSTALLER_VERSION`, `REPLACE`, `PUBLIC_KEY`.
126
171
-**Geolocation data must be downloaded** — event processor Docker build fails without `./geolocation/` CSV files from GCS.
127
172
-**`.plugin` binaries are gitignored** — build artifacts, not committed.
128
-
-**`jib-maven-plugin` image mismatch** — pom.xml references `eclipse-temurin:11-jre-focal` but the backend requires Java 17.
173
+
-**`jib-maven-plugin` image mismatch** — `pom.xml` references `eclipse-temurin:11-jre-focal` but the backend requires Java 17.
174
+
-**`as400/` is a copy of `utmstack-collector/`** — nearly identical structure (agent, collector, config, conn, database, logservice, models, serv, utils). Changes to one usually need mirroring in the other.
175
+
-**`CONTRIBUTING.md` is stale** — mentions PEP 8 (Python) but there is no Python code in the repo.
176
+
-**`shared/` is a library, not buildable standalone** — consumed via `replace` directives. Don't try to `go build` it directly.
0 commit comments