尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
Open-source, self-hosted DMARC monitoring for agencies — unlimited domains, automatic report ingestion, no per-domain pricing.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Open-source, self-hosted DMARC monitoring for agencies. Point it at the mailbox
your rua= reports arrive in and it collects, parses and charts them — unlimited
domains, many clients, no per-domain pricing, and the report data never leaves
your infrastructure.
Documentation · Install guide · Configuration · Kubernetes
Built with:
src/api)src/web)Run the analyzer from the published image — no build, no account, your data stays on your machine. Requires Docker.
mkdir dmarc-analyzer && cd dmarc-analyzer
curl -fsSL -o compose.yml https://raw.githubusercontent.com/dmarc-analyzer-net/DmarcAnalyzerApp/main/deploy/compose.yml
# generate the key that encrypts mailbox credentials at rest
echo "DMARC_ENCRYPTION_KEY=$(openssl rand -base64 32)" > .env
docker compose up -d
Then open http://localhost:8080 and create the first admin account (registration is locked after this first-run bootstrap).
What you get: the console on port 8080 and a background loop polling your
mailboxes for DMARC reports, both in one container (APP_MODE=all), plus
PostgreSQL. Two containers.
Two overlays sit next to that file if the defaults do not fit — they need Compose v2.24 or newer:
| Instead of the bundled database or the single container | |
|---|---|
| Use a Postgres you already run | -f compose.yml -f compose.external-db.yml |
| Run the worker separately | -f compose.yml -f compose.split.yml |
| Both | add both -f flags |
Set COMPOSE_FILE=compose.yml:compose.split.yml in .env and day-to-day use
stays docker compose up -d. Every combination reads the same environment
variables.
ghcr.io/dmarc-analyzer-net/dmarc-analyzer, for linux/amd64 +
linux/arm64. Mirrored to Docker Hub as dmarcanalyzernet/dmarc-analyzer;
GHCR is recommended because it has no anonymous pull rate limits.latest is the most recent release (what the compose file uses), or
pin a version such as 0.15.0. edge tracks main and is unreleased —
useful for trying a fix early, not for production.rua= reports arrive in) — see docs/ops/mailbox-sync.md.docker compose pull && docker compose up -d (schema migrations
run automatically on startup via Database__MigrateOnStartup).Coolify and Dokploy both need DMARC_ENCRYPTION_KEY and a Postgres
connection set the same way as the Quick Start above — see
docs/ops/configuration.md for every variable and where it applies.
src/api - backend app (api / worker / all modes via APP_MODE)src/web - frontend appdocs/planning - roadmap, backlog, architecture, API contract, and data modeldocs/planning/adr - architecture decision recordsRun API and frontend directly for fast iteration and hot reload.
Prerequisites:
Terminal 1 - API (hot reload):
APP_MODE=api dotnet watch --project src/api
Terminal 2 - Frontend (hot reload):
cd src/web
npm install
npm run dev
App URLs:
http://localhost:5173http://localhost:5076/api/v1/system/statusVite is configured to proxy /api to the local ASP.NET API in development.
Build and run the single image in two modes (api, worker) plus PostgreSQL:
# once per clone — the key that encrypts mailbox credentials at rest is not in
# the repo, so compose refuses to start until you generate your own
echo "DMARC_ENCRYPTION_KEY=$(openssl rand -base64 32)" > .env
docker compose up -d --build
Keep that key once you have added a report source: changing it makes every stored mailbox password undecryptable.
If the build fails during dotnet restore with NU1004, packages.lock.json
does not match the project's package references. The image build restores in
locked mode deliberately — a stale lockfile should stop the build rather than
silently resolve different transitive versions into the image — so regenerate it
and commit the change:
dotnet restore src/api/DmarcAnalyzer.Api.csproj --force-evaluate
Services:
http://localhost:8080localhost:5432APP_MODE=workerStop:
docker compose down
The same container image (dmarc-analyzer-net:dev) runs in three modes:
APP_MODE=api - serves API + static React build (wwwroot)APP_MODE=worker - runs background worker hostAPP_MODE=all - both in one process; the simplest way to self-host on a
single machineAPP_MODE=migrate - applies pending migrations and exits; for orchestrators
that need the schema settled before any app pod startsAny other value fails startup rather than falling back to api, so a typo
cannot leave you with a container that serves the console and ingests nothing.
From repo root:
dotnet build DmarcAnalyzerApp.slnx
From src/web:
npm run build
Use http/api.http with VS Code REST Client or JetBrains HTTP client to run API requests quickly during development.
http/api.httphttp://localhost:5076Everything lives under /api/v1; full contract in
docs/planning/api-contract.md. A sample to get oriented:
GET /api/v1/system/status — health/versionGET /api/v1/domains, GET /api/v1/clients — the core resourcesGET /api/v1/analytics/summary — dashboard-level pass/fail totalsGET /api/v1/analytics/domains/{domainId}/sources — per-domain sending sourcesGET /api/v1/alerts — configured alert rulesGET /api/v1/mailbox-health, GET /api/v1/mailbox-sync-runs,
POST /api/v1/report-sources/{id}/sync — mailbox ingestion status/triggerTry these against a running instance with http/api.http (see above).
Key operational endpoints:
GET /api/v1/mailbox-healthGET /api/v1/mailbox-sync-runsPOST /api/v1/report-sources/{id}/sync (manual trigger)Ops runbook:
docs/ops/configuration.md — every environment variable, and the same set in
every deployment shape. Kept true by ConfigurationContractTests.docs/ops/migrating-a-running-instance.md — bringing a running instance onto a
newer image, including why a green healthcheck does not prove the schema is current.docs/ops/upgrading-postgresql.md — the PostgreSQL 17 → 18 migration. A major
version cannot upgrade in place; this is the dump-and-restore window.docs/ops/aws-rds-iam.md — Postgres on AWS with no database password: IAM tokens,
which CA to verify against (RDS endpoint vs RDS Proxy), and the Compose and Helm recipe.docs/ops/mailbox-sync.mddocs/ops/oidc-zitadel.md — and the per-provider guides it links, including
docs/ops/oidc-entra.md, which Microsoft Entra ID needs rather than merely benefits from.docs/ops/release.mdStart here before implementation details:
docs/planning/architecture.mddocs/planning/api-contract.mddocs/planning/data-model.mddocs/planning/roadmap.mdPull requests are welcome, and there is no CLA to sign — see
CONTRIBUTING.md for how work gets merged and what review
will ask of you. AGENTS.md is the orientation map for the
codebase itself.
Found a security problem? Do not open a public issue — see
SECURITY.md.