Minimum reproducer scaffold for the umami / postgres-v3 compat lane. Mirrors the architectural pattern of the doccano-django sample in samples-python: the sample owns orchestration (compose / bootstrap / traffic / noise filter / coverage), the keploy CI lanes consume it as a thin wrapper.
This is a SCAFFOLD. The compose, bootstrap, and a minimal record-traffic loop work end-to-end against bare umami without keploy in the picture. The full traffic loop the existing keploy/enterprise lane drives (run_api_flow in enterprise/.ci/scripts/umami-linux.sh, ~250 lines covering websites / events / sessions / reports / share-tokens / shareability) has not been ported into flow.sh::umami_record_traffic yet. Lanes consuming this sample today should either:
- Port the missing curls into
flow.sh::umami_record_traffic(preferred — that's the migration this scaffold is designed around). - Or call into
enterprise/.ci/scripts/umami-linux.sh::run_api_flowdirectly betweenflow.sh bootstrapandflow.sh coverageuntil the migration completes.
See the migration plan in this PR's description / linked issue for the full porting checklist.
umami-postgres/
├── Dockerfile # FROM ghcr.io/umami-software/umami:postgresql-v2.18.1
├── docker-compose.yml # postgres-15 + umami v2 on a fixed subnet, env-driven
├── flow.sh # bootstrap | record-traffic | coverage | list-routes
├── keploy.yml.template # globalNoise for createdAt/updatedAt/Date/uuid id fields
└── README.md # this file
The sample is keploy-independent: docker compose up && bash flow.sh bootstrap && bash flow.sh record-traffic runs end-to-end against bare umami. Lane scripts wrap that exact same path inside keploy record / keploy test.
bootstrap— login as admin via/api/auth/login, capture the JWT-style auth token, persist it to/tmp/umami-token-${UMAMI_PHASE}so subsequent calls share a deterministic Authorization header.record-traffic— drive the umami v1 API. Every call is logged to${UMAMI_FIRED_ROUTES_FILE}(when set) so thecoveragesubcommand has a numerator without needing a keploy recording.coverage— walks the running container'ssrc/app/api/**/route.tstree as the denominator (the umami router is file-system based), compares against fired/recorded routes, emits a(method, path)percentage.list-routes— diagnostic; prints the route table.
docker compose up -d
bash flow.sh bootstrap 240
UMAMI_FIRED_ROUTES_FILE=/tmp/fired.log bash flow.sh record-traffic
UMAMI_FIRED_ROUTES_FILE=/tmp/fired.log bash flow.sh coverage
docker compose down -vLanes pinning to this sample (pinned via --branch feat/keploy-compat-lanes-rollout until merge):
keploy/enterprise.woodpecker/umami-linux.yml— being slimmed in a follow-up PR.keploy/integrationsmay add a.woodpecker/umami-postgres.ymlfalsifying lane in a future PR (currently no integrations-side coverage of this app).