{
  "schema_version": 3,
  "app": "nextcloud",
  "display_name": "Nextcloud",
  "upstream_repo": "https://github.com/nextcloud/server",
  "docs_url": "https://github.com/nextcloud/docker",
  "status": "ok",
  "summary": {
    "primary_service": "app",
    "app_version": "35.0.2",
    "app_version_pinned": true,
    "runs": 3,
    "publishable": true,
    "publishable_note": null,
    "idle_total_mem_mib": 296.93,
    "idle_total_cpu_pct": 2.52,
    "peak_total_mem_mib": 451.78,
    "peak_is_under_load": true,
    "startup_seconds": 26.8,
    "startup_peak_total_mem_mib": 301.63,
    "settled": true,
    "settle_seconds_used": 187.0,
    "peak_max_mib": 478.96,
    "sizing_peak_mib": 478.96,
    "idle_mem_mib": {
      "median": 296.93,
      "min": 294.95,
      "max": 301.33,
      "values": [
        301.33,
        294.95,
        296.93
      ]
    },
    "idle_cpu_pct": {
      "median": 2.52,
      "min": 1.77,
      "max": 2.58,
      "values": [
        2.52,
        1.77,
        2.58
      ]
    },
    "peak_mem_mib": {
      "median": 451.78,
      "min": 401.61,
      "max": 478.96,
      "values": [
        401.61,
        451.78,
        478.96
      ]
    },
    "startup_peak_mem_mib": {
      "median": 301.63,
      "min": 295.39,
      "max": 302.46,
      "values": [
        301.63,
        295.39,
        302.46
      ]
    },
    "startup_s": {
      "median": 26.8,
      "min": 26.8,
      "max": 26.9,
      "values": [
        26.9,
        26.8,
        26.8
      ]
    },
    "settled_after_healthy_s": {
      "median": 189.6,
      "min": 186.6,
      "max": 216.8,
      "values": [
        216.8,
        189.6,
        186.6
      ]
    },
    "settled_runs": 3,
    "per_service": {
      "app": {
        "idle_mem_mib": {
          "median": 204.31,
          "min": 204.19,
          "max": 210.65,
          "values": [
            210.65,
            204.31,
            204.19
          ]
        },
        "peak_mem_mib": {
          "median": 308.8,
          "min": 307.5,
          "max": 317.0,
          "values": [
            308.8,
            307.5,
            317.0
          ]
        }
      },
      "cron": {
        "idle_mem_mib": {
          "median": 34.39,
          "min": 34.32,
          "max": 34.42,
          "values": [
            34.32,
            34.39,
            34.42
          ]
        },
        "peak_mem_mib": {
          "median": 147.3,
          "min": 34.35,
          "max": 167.3,
          "values": [
            34.35,
            147.3,
            167.3
          ]
        }
      },
      "db": {
        "idle_mem_mib": {
          "median": 46.1,
          "min": 45.97,
          "max": 46.17,
          "values": [
            46.1,
            45.97,
            46.17
          ]
        },
        "peak_mem_mib": {
          "median": 50.96,
          "min": 49.48,
          "max": 51.44,
          "values": [
            49.48,
            50.96,
            51.44
          ]
        }
      },
      "redis": {
        "idle_mem_mib": {
          "median": 10.29,
          "min": 10.27,
          "max": 12.16,
          "values": [
            10.27,
            10.29,
            12.16
          ]
        },
        "peak_mem_mib": {
          "median": 10.69,
          "min": 10.54,
          "max": 12.52,
          "values": [
            10.69,
            10.54,
            12.52
          ]
        }
      }
    },
    "variance_flag": null,
    "representative_run": 3,
    "cpu_models": [
      "AMD EPYC 7763 64-Core Processor"
    ],
    "cpu_model_mismatch": false,
    "rule": "idle = median of the run idle means; peak = median of the run peaks (highest simultaneous total, under load when the app has a load step); peak_max_mib = highest run peak; sizing_peak_mib = highest over runs of max(run peak, run startup peak); variance_flag when max/min over runs is above 1.5 for idle or peak.",
    "periodic": {
      "service": "cron",
      "interval_seconds": 300,
      "align": "wall_clock",
      "settle_after_tick_seconds": 60,
      "runs_idle_after_tick": 3,
      "runs_with_tick_in_load_window": [],
      "runs_with_tick_near_load_window": [],
      "wait_added_s": {
        "values": [
          91.0,
          66.7,
          63.7
        ],
        "max": 91.0,
        "mean": 73.8
      },
      "any_cap_reached": false,
      "note": "idle starts after at least one wall-clock tick of the periodic job; the peak is computed as for any app and may include the job's memory when a tick fell in (or just before) the load window"
    }
  },
  "run": {
    "started_at": "2026-10-18T03:21:24Z",
    "date": "2026-10-18",
    "harness_version": "3.0.0",
    "runs_requested": 3,
    "docker_host": null,
    "remote": false,
    "runs_completed": 3
  },
  "host": {
    "label": "github-actions ubuntu-latest (2 vCPU, 8 GB)",
    "ci": {
      "runs_on": "ubuntu-latest",
      "runner_environment": "github-hosted",
      "runner_os": "Linux",
      "runner_arch": "X64",
      "image_os": "ubuntu24",
      "image_version": "20261012.334.1"
    },
    "cpu_model": "AMD EPYC 7763 64-Core Processor",
    "cpu_model_note": null,
    "cores": 2,
    "mem_total_mib": 7938,
    "kernel": "6.17.0-1022-azure",
    "os": "Ubuntu 24.04.5 LTS",
    "arch": "x86_64",
    "oci_arch": "amd64",
    "docker_server_version": "28.0.4",
    "docker_client_version": "28.0.4",
    "compose_client_version": "2.38.2",
    "storage_driver": "overlay2",
    "containerd_image_store": false,
    "source": "docker info + throwaway container reading /proc/cpuinfo on the daemon host",
    "compose_note": "Compose runs on the client machine; Docker server fields are from the daemon host"
  },
  "helper_images": {
    "curlimages/curl:latest": {
      "pulled_as": "curlimages/curl:latest",
      "digest": "curlimages/curl@sha256:a134550be58ab783810e613ae96fd253c38f7bdd16d9bf9be350700c7a29ac06"
    },
    "python:3.12-slim": {
      "pulled_as": "python:3.12-slim",
      "digest": "python@sha256:a6e34c598f2467ed0e9a8d349809fcd8b5c603269512df273a0bb1784edc11b1"
    }
  },
  "pull_seconds": 28.5,
  "finished_at": "2026-10-18T03:37:28Z",
  "elapsed_seconds": 964.1,
  "services": {
    "app": {
      "image_ref": "nextcloud:apache",
      "image_repo": "nextcloud",
      "image_tag": "apache",
      "digest": "sha256:a588aa5353703b44106a6129adaaf7bf22521b7a4754f9f529b3228d6aa390c5",
      "digest_note": null,
      "version": "35.0.2",
      "version_source": "exec",
      "version_pinned": true,
      "version_note": null,
      "resolved_tag": "35.0.2",
      "resolved_tag_note": null,
      "image_size": {
        "unpacked_mb": 1480.0,
        "unpacked_source": "docker image ls Size: unpacked image on the daemon host, rounded by docker to 3 significant figures",
        "compressed_mb": 517.3,
        "compressed_source": "sum of compressed layer sizes in the registry manifest for linux/amd64",
        "compressed_null_reason": null,
        "unit_note": "MB = 10^6 bytes. unpacked = disk used on the host; compressed = what is downloaded"
      },
      "compose_image": "nextcloud:35.0.2",
      "compose_comment": "sha256:a588aa5353703b44106a6129adaaf7bf22521b7a4754f9f529b3228d6aa390c5  (version 35.0.2, from exec)",
      "restart_count": 0,
      "oom_killed": false
    },
    "cron": {
      "image_ref": "nextcloud:apache",
      "image_repo": "nextcloud",
      "image_tag": "apache",
      "digest": "sha256:a588aa5353703b44106a6129adaaf7bf22521b7a4754f9f529b3228d6aa390c5",
      "digest_note": null,
      "version": "35.0.2",
      "version_source": "exec",
      "version_pinned": true,
      "version_note": null,
      "resolved_tag": "35.0.2",
      "resolved_tag_note": null,
      "image_size": {
        "unpacked_mb": 1480.0,
        "unpacked_source": "docker image ls Size: unpacked image on the daemon host, rounded by docker to 3 significant figures",
        "compressed_mb": 517.3,
        "compressed_source": "sum of compressed layer sizes in the registry manifest for linux/amd64",
        "compressed_null_reason": null,
        "unit_note": "MB = 10^6 bytes. unpacked = disk used on the host; compressed = what is downloaded"
      },
      "compose_image": "nextcloud:35.0.2",
      "compose_comment": "sha256:a588aa5353703b44106a6129adaaf7bf22521b7a4754f9f529b3228d6aa390c5  (version 35.0.2, from exec)",
      "restart_count": 0,
      "oom_killed": false
    },
    "db": {
      "image_ref": "postgres:18-alpine",
      "image_repo": "postgres",
      "image_tag": "18-alpine",
      "digest": "sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873",
      "digest_note": null,
      "version": "18.6",
      "version_source": "exec",
      "version_pinned": true,
      "version_note": null,
      "resolved_tag": null,
      "resolved_tag_note": "no candidate tag among ['18.6', 'v18.6'] could be verified against the registry",
      "image_size": {
        "unpacked_mb": 304.0,
        "unpacked_source": "docker image ls Size: unpacked image on the daemon host, rounded by docker to 3 significant figures",
        "compressed_mb": 120.0,
        "compressed_source": "sum of compressed layer sizes in the registry manifest for linux/amd64",
        "compressed_null_reason": null,
        "unit_note": "MB = 10^6 bytes. unpacked = disk used on the host; compressed = what is downloaded"
      },
      "compose_image": "postgres:18-alpine@sha256:77f585114c32fbca283dc835b0596f4e52b51b4c6662d7810b2f4084f60a1873",
      "compose_comment": "version 18.6 (from exec); no registry tag for it could be verified, so the digest is pinned instead",
      "restart_count": 0,
      "oom_killed": false
    },
    "redis": {
      "image_ref": "redis:alpine",
      "image_repo": "redis",
      "image_tag": "alpine",
      "digest": "sha256:3811787313eba226a2ef38658c6ccb91cd5e110edc89c37767de373120a0e5a0",
      "digest_note": null,
      "version": "8.10.2",
      "version_source": "exec",
      "version_pinned": true,
      "version_note": null,
      "resolved_tag": null,
      "resolved_tag_note": "no candidate tag among ['8.10.2', 'v8.10.2'] could be verified against the registry",
      "image_size": {
        "unpacked_mb": 119.0,
        "unpacked_source": "docker image ls Size: unpacked image on the daemon host, rounded by docker to 3 significant figures",
        "compressed_mb": 39.1,
        "compressed_source": "sum of compressed layer sizes in the registry manifest for linux/amd64",
        "compressed_null_reason": null,
        "unit_note": "MB = 10^6 bytes. unpacked = disk used on the host; compressed = what is downloaded"
      },
      "compose_image": "redis:alpine@sha256:3811787313eba226a2ef38658c6ccb91cd5e110edc89c37767de373120a0e5a0",
      "compose_comment": "version 8.10.2 (from exec); no registry tag for it could be verified, so the digest is pinned instead",
      "restart_count": 0,
      "oom_killed": false
    }
  },
  "runs": [
    {
      "run": 1,
      "started_at": "2026-10-18T03:21:57Z",
      "host": {
        "label": "github-actions ubuntu-latest (2 vCPU, 8 GB)",
        "ci": {
          "runs_on": "ubuntu-latest",
          "runner_environment": "github-hosted",
          "runner_os": "Linux",
          "runner_arch": "X64",
          "image_os": "ubuntu24",
          "image_version": "20261012.334.1"
        },
        "cpu_model": "AMD EPYC 7763 64-Core Processor",
        "cpu_model_note": null,
        "cores": 2,
        "mem_total_mib": 7938,
        "kernel": "6.17.0-1022-azure",
        "os": "Ubuntu 24.04.5 LTS",
        "arch": "x86_64",
        "oci_arch": "amd64",
        "docker_server_version": "28.0.4",
        "docker_client_version": "28.0.4",
        "compose_client_version": "2.38.2",
        "storage_driver": "overlay2",
        "containerd_image_store": false,
        "source": "docker info + throwaway container reading /proc/cpuinfo on the daemon host",
        "compose_note": "Compose runs on the client machine; Docker server fields are from the daemon host"
      },
      "date": "2026-10-18",
      "startup": {
        "seconds": 26.9,
        "ok": true,
        "checks": [
          {
            "type": "container",
            "ok": true,
            "ready_after_s": 26.9,
            "detail": "shb-nextcloud-cron-1=running/no-healthcheck, shb-nextcloud-app-1=running/healthy, shb-nextcloud-db-1=running/healthy, shb-nextcloud-redis-1=running/healthy"
          }
        ],
        "up_command_seconds": 26.7,
        "definition": "wall clock from starting `docker compose up -d` until every health check passed; checks poll every 0.5 s from a throwaway container on the compose network, so resolution is about +/- 1 s"
      },
      "versions": {
        "app": "35.0.2",
        "cron": "35.0.2",
        "db": "18.6",
        "redis": "8.10.2"
      },
      "setup": [
        {
          "exit_code": 0,
          "duration_s": 1.4,
          "reported": {
            "installed": true,
            "version_string": "35.0.2"
          },
          "output_tail": [
            "status.php (Host: cloud.example.com): HTTP 200 {\"installed\": true, \"maintenance\": false, \"needsDbUpgrade\": false, \"version\": \"35.0.2.2\", \"versionstring\": \"35.0.2\", \"edition\": \"\", \"productname\": \"Nextcloud\", \"extendedSupport\": false}",
            "GET /login with Host cloud.example.com -> HTTP 200",
            "GET /login with Host localhost -> HTTP 200",
            "GET /login with Host not-trusted.example.org -> HTTP 400"
          ],
          "description": "Read status.php without logging in, as the install check, and request /login under the trusted domain, localhost and an untrusted host name (the response codes are in the output tail)."
        }
      ],
      "idle": {
        "per_service": {
          "app": {
            "samples": 11,
            "mem_mean_mib": 210.65,
            "mem_max_mib": 210.8,
            "cpu_mean_pct": 0.48,
            "cpu_max_pct": 5.25
          },
          "cron": {
            "samples": 11,
            "mem_mean_mib": 34.32,
            "mem_max_mib": 34.32,
            "cpu_mean_pct": 0.0,
            "cpu_max_pct": 0.01
          },
          "db": {
            "samples": 11,
            "mem_mean_mib": 46.1,
            "mem_max_mib": 46.46,
            "cpu_mean_pct": 1.11,
            "cpu_max_pct": 3.39
          },
          "redis": {
            "samples": 11,
            "mem_mean_mib": 10.27,
            "mem_max_mib": 10.43,
            "cpu_mean_pct": 0.93,
            "cpu_max_pct": 3.05
          }
        },
        "total": {
          "samples": 11,
          "dropped_for_total": 0,
          "mem_mean_mib": 301.33,
          "mem_max_mib": 301.65,
          "cpu_mean_pct": 2.52,
          "cpu_max_pct": 6.44
        },
        "window_seconds": 30.3,
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 301.45,
            "total_cpu_pct": 6.44
          },
          {
            "t_offset_s": 3.0,
            "total_mem_mib": 301.32,
            "total_cpu_pct": 0.16
          },
          {
            "t_offset_s": 6.1,
            "total_mem_mib": 301.3,
            "total_cpu_pct": 3.01
          },
          {
            "t_offset_s": 9.1,
            "total_mem_mib": 301.5,
            "total_cpu_pct": 0.68
          },
          {
            "t_offset_s": 12.1,
            "total_mem_mib": 301.21,
            "total_cpu_pct": 0.98
          },
          {
            "t_offset_s": 15.2,
            "total_mem_mib": 301.65,
            "total_cpu_pct": 3.52
          },
          {
            "t_offset_s": 18.2,
            "total_mem_mib": 301.24,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 21.2,
            "total_mem_mib": 300.81,
            "total_cpu_pct": 3.0
          },
          {
            "t_offset_s": 24.3,
            "total_mem_mib": 300.99,
            "total_cpu_pct": 0.14
          },
          {
            "t_offset_s": 27.3,
            "total_mem_mib": 301.57,
            "total_cpu_pct": 6.11
          },
          {
            "t_offset_s": 30.3,
            "total_mem_mib": 301.62,
            "total_cpu_pct": 3.53
          }
        ],
        "memory_stat": {
          "read_at": "2026-10-18T03:26:31Z",
          "per_service": {
            "app": {
              "cgroup": "v2",
              "anon_mib": 51.97,
              "file_mib": 959.89,
              "active_file_mib": 0.0,
              "inactive_file_mib": 905.18,
              "shmem_mib": 54.71
            },
            "cron": {
              "cgroup": "v2",
              "anon_mib": 33.22,
              "file_mib": 0.23,
              "active_file_mib": 0.0,
              "inactive_file_mib": 0.01,
              "shmem_mib": 0.22
            },
            "db": {
              "cgroup": "v2",
              "anon_mib": 7.4,
              "file_mib": 100.84,
              "active_file_mib": 0.0,
              "inactive_file_mib": 71.37,
              "shmem_mib": 29.47
            },
            "redis": {
              "cgroup": "v2",
              "anon_mib": 9.16,
              "file_mib": 0.0,
              "active_file_mib": 0.0,
              "inactive_file_mib": 0.0,
              "shmem_mib": 0.0
            }
          },
          "read_lag_s": 0.2,
          "method": "docker exec <container> cat /sys/fs/cgroup/memory.stat (cgroup v1: /sys/fs/cgroup/memory/memory.stat); MiB; splits what docker stats shows as one number into anon (heap) and file cache; a field that is absent was not printed by the kernel or not readable (see reason)",
          "taken": "right after the idle window"
        }
      },
      "periodic": {
        "service": "cron",
        "interval_seconds": 300,
        "align": "wall_clock",
        "settle_after_tick_seconds": 60,
        "tick_source": "computed from the wall clock (multiples of interval_seconds); not read from the job",
        "healthy_at": "2026-10-18T03:22:24Z",
        "ticks_since_healthy_before_idle": [
          "2026-10-18T03:25:00Z"
        ],
        "idle_started_at": "2026-10-18T03:26:01Z",
        "idle_ended_at": "2026-10-18T03:26:31Z",
        "seconds_since_last_tick_at_idle_start": 61.3,
        "idle_after_tick": true,
        "ticks_in_idle_window": [],
        "wait_added_s": 91.0,
        "wait_cap_s": 360,
        "cap_reached": false,
        "wait_started_at": "2026-10-18T03:24:30Z",
        "load_window_started_at": "2026-10-18T03:26:32Z",
        "ticks_in_load_window": [],
        "tick_in_load_window": false,
        "tick_near_load_window": false,
        "load_window_ended_at": "2026-10-18T03:27:10Z"
      },
      "settle": {
        "settled": true,
        "mode": "detected",
        "settle_seconds_used": 211.2,
        "settle_started_after_healthy_s": 5.6,
        "params": {
          "window_seconds": 60,
          "threshold_pct": 2.0,
          "threshold_min_mib": 10.0,
          "min_seconds": 120,
          "max_seconds": 600
        },
        "last_window": {
          "n": 20,
          "mean_mib": 301.27,
          "min_mib": 300.8,
          "max_mib": 301.63,
          "spread_mib": 0.83,
          "threshold_mib": 10.0
        },
        "rechecks": 0,
        "rule": "settled = over the last window_seconds the stack total varied (max - min) by less than max(threshold_pct of the window mean, threshold_min_mib); not before min_seconds, at the latest max_seconds, both counted from the end of the setup steps; the idle window must also be flat and agree with it. If max_seconds passes without settling, settled=false and the idle window is measured anyway."
      },
      "startup_peak": {
        "per_service_mem_mib": {
          "app": 217.6,
          "cron": 34.57,
          "db": 46.19,
          "redis": 10.5
        },
        "total_mem_mib": 301.63,
        "samples": 72,
        "note": "highest value across docker stats samples (about one every 2-3 s) from healthy until the stack settled; shorter spikes between samples are not seen"
      },
      "timeline": {
        "step_s": 10,
        "t0": "healthy",
        "offsets_s": [
          10,
          20,
          30,
          40,
          50,
          60,
          70,
          80,
          90,
          100,
          110,
          120,
          130,
          140,
          150,
          160,
          170,
          180,
          190,
          200,
          210,
          220,
          230,
          240,
          250
        ],
        "total_mem_mib": [
          241.8,
          259.7,
          261.2,
          261.4,
          259.0,
          258.0,
          256.2,
          258.9,
          260.8,
          262.1,
          262.2,
          263.4,
          264.7,
          266.9,
          265.0,
          273.6,
          301.3,
          301.4,
          301.1,
          301.2,
          301.3,
          301.5,
          301.3,
          301.2,
          301.4
        ],
        "per_service_mem_mib": {
          "app": [
            188.9,
            206.0,
            207.5,
            207.7,
            205.6,
            204.4,
            202.4,
            204.9,
            206.7,
            208.1,
            208.2,
            209.3,
            210.5,
            213.0,
            210.7,
            210.5,
            210.7,
            210.6,
            210.5,
            210.5,
            210.6,
            210.6,
            210.7,
            210.6,
            210.7
          ],
          "cron": [
            0.6,
            0.6,
            0.6,
            0.7,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            9.0,
            34.3,
            34.4,
            34.4,
            34.3,
            34.4,
            34.3,
            34.3,
            34.3,
            34.3
          ],
          "db": [
            42.1,
            42.8,
            42.7,
            42.8,
            42.6,
            42.7,
            42.9,
            43.2,
            43.2,
            43.3,
            43.1,
            43.3,
            43.3,
            43.2,
            43.5,
            43.9,
            46.0,
            46.1,
            46.0,
            46.0,
            46.1,
            46.1,
            46.1,
            46.1,
            46.1
          ],
          "redis": [
            10.3,
            10.3,
            10.4,
            10.3,
            10.2,
            10.3,
            10.2,
            10.3,
            10.3,
            10.2,
            10.2,
            10.3,
            10.3,
            10.1,
            10.2,
            10.2,
            10.3,
            10.3,
            10.3,
            10.3,
            10.2,
            10.4,
            10.2,
            10.2,
            10.3
          ]
        }
      },
      "load": {
        "per_service": {
          "app": {
            "samples": 19,
            "mem_mean_mib": 259.84,
            "mem_max_mib": 308.8,
            "cpu_mean_pct": 65.23,
            "cpu_max_pct": 83.26
          },
          "cron": {
            "samples": 19,
            "mem_mean_mib": 34.32,
            "mem_max_mib": 34.35,
            "cpu_mean_pct": 0.0,
            "cpu_max_pct": 0.01
          },
          "db": {
            "samples": 19,
            "mem_mean_mib": 48.23,
            "mem_max_mib": 49.48,
            "cpu_mean_pct": 22.18,
            "cpu_max_pct": 33.22
          },
          "redis": {
            "samples": 19,
            "mem_mean_mib": 10.47,
            "mem_max_mib": 10.69,
            "cpu_mean_pct": 1.89,
            "cpu_max_pct": 5.13
          }
        },
        "total": {
          "samples": 19,
          "dropped_for_total": 0,
          "mem_mean_mib": 352.86,
          "mem_max_mib": 401.61,
          "cpu_mean_pct": 89.3,
          "cpu_max_pct": 109.22
        },
        "description": "One user (the admin), over plain HTTP on the Compose network, one request at a time. A Python script generates 103 random files (100 small ones of 1 KB to 1 MB, about 50 MB together, and three of 50 MB), uploads them over WebDAV (MKCOL, then one PUT per file), lists the folder with PROPFIND, and downloads five files (three small, two large) and checks their SHA-256. About 200 MB in total. No browser, no sync client, no chunked upload, no previews, no sharing. `occ files:scan` is not part of this load (the harness cannot run commands inside the stack); it was run by hand, see the article.",
        "duration_s": 34.0,
        "window": "from LAB_MARK load_start (or step start) until 2 s after the step ended",
        "reported_by_script": {
          "files_uploaded": 103,
          "small_files": 100,
          "large_files": 3,
          "bytes_uploaded": 194456599,
          "upload_seconds": 31.7,
          "propfind_entries": 104,
          "propfind_seconds": 0.25,
          "files_downloaded": 5,
          "bytes_downloaded": 101451451,
          "download_seconds": 1.6,
          "downloads_sha256_match": true
        },
        "output_tail": [
          "generated 103 files (100 small, 3 large), 194.5 MB",
          "uploaded 103 files, 194.5 MB in 31.7s; statuses {201: 103}",
          "PROPFIND HTTP 207: 104 entries (1 folder + 103 files) in 0.25s",
          "downloaded 5 files, 101.5 MB in 1.6s, SHA-256 matches"
        ],
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 378.68,
            "total_cpu_pct": 33.2,
            "mem_mib": [
              285.8,
              34.32,
              48.07,
              10.49
            ],
            "cpu_pct": [
              30.55,
              0.0,
              2.27,
              0.38
            ]
          },
          {
            "t_offset_s": 2.0,
            "total_mem_mib": 390.35,
            "total_cpu_pct": 102.25,
            "mem_mib": [
              297.4,
              34.32,
              48.2,
              10.43
            ],
            "cpu_pct": [
              78.31,
              0.0,
              22.4,
              1.54
            ]
          },
          {
            "t_offset_s": 4.0,
            "total_mem_mib": 325.99,
            "total_cpu_pct": 101.57,
            "mem_mib": [
              233.4,
              34.32,
              47.98,
              10.29
            ],
            "cpu_pct": [
              70.79,
              0.0,
              29.23,
              1.55
            ]
          },
          {
            "t_offset_s": 6.1,
            "total_mem_mib": 332.98,
            "total_cpu_pct": 102.33,
            "mem_mib": [
              239.4,
              34.32,
              48.79,
              10.47
            ],
            "cpu_pct": [
              74.78,
              0.0,
              26.04,
              1.51
            ]
          },
          {
            "t_offset_s": 8.1,
            "total_mem_mib": 335.11,
            "total_cpu_pct": 108.79,
            "mem_mib": [
              241.5,
              34.32,
              48.72,
              10.57
            ],
            "cpu_pct": [
              73.84,
              0.01,
              29.81,
              5.13
            ]
          },
          {
            "t_offset_s": 10.1,
            "total_mem_mib": 398.93,
            "total_cpu_pct": 105.0,
            "mem_mib": [
              305.8,
              34.32,
              48.29,
              10.52
            ],
            "cpu_pct": [
              80.31,
              0.0,
              23.39,
              1.3
            ]
          },
          {
            "t_offset_s": 12.1,
            "total_mem_mib": 398.93,
            "total_cpu_pct": 101.86,
            "mem_mib": [
              306.1,
              34.35,
              48.13,
              10.35
            ],
            "cpu_pct": [
              73.05,
              0.0,
              27.15,
              1.66
            ]
          },
          {
            "t_offset_s": 14.1,
            "total_mem_mib": 374.5,
            "total_cpu_pct": 103.02,
            "mem_mib": [
              281.6,
              34.32,
              48.26,
              10.32
            ],
            "cpu_pct": [
              71.56,
              0.0,
              29.75,
              1.71
            ]
          },
          {
            "t_offset_s": 16.2,
            "total_mem_mib": 333.16,
            "total_cpu_pct": 102.92,
            "mem_mib": [
              242.1,
              34.32,
              46.26,
              10.48
            ],
            "cpu_pct": [
              72.1,
              0.0,
              29.27,
              1.55
            ]
          },
          {
            "t_offset_s": 18.2,
            "total_mem_mib": 335.87,
            "total_cpu_pct": 107.92,
            "mem_mib": [
              242.1,
              34.32,
              49.16,
              10.29
            ],
            "cpu_pct": [
              71.03,
              0.01,
              31.84,
              5.04
            ]
          },
          {
            "t_offset_s": 20.2,
            "total_mem_mib": 336.36,
            "total_cpu_pct": 107.24,
            "mem_mib": [
              242.6,
              34.32,
              49.06,
              10.38
            ],
            "cpu_pct": [
              79.92,
              0.0,
              25.89,
              1.43
            ]
          },
          {
            "t_offset_s": 22.2,
            "total_mem_mib": 336.1,
            "total_cpu_pct": 102.05,
            "mem_mib": [
              242.3,
              34.32,
              48.93,
              10.55
            ],
            "cpu_pct": [
              76.63,
              0.0,
              24.01,
              1.41
            ]
          },
          {
            "t_offset_s": 24.2,
            "total_mem_mib": 336.0,
            "total_cpu_pct": 101.95,
            "mem_mib": [
              242.7,
              34.32,
              48.37,
              10.61
            ],
            "cpu_pct": [
              77.55,
              0.0,
              23.05,
              1.35
            ]
          },
          {
            "t_offset_s": 26.3,
            "total_mem_mib": 401.61,
            "total_cpu_pct": 101.51,
            "mem_mib": [
              308.8,
              34.32,
              48.15,
              10.34
            ],
            "cpu_pct": [
              76.03,
              0.0,
              23.15,
              2.33
            ]
          },
          {
            "t_offset_s": 28.3,
            "total_mem_mib": 339.09,
            "total_cpu_pct": 109.22,
            "mem_mib": [
              244.6,
              34.32,
              49.48,
              10.69
            ],
            "cpu_pct": [
              71.03,
              0.0,
              33.22,
              4.97
            ]
          },
          {
            "t_offset_s": 30.3,
            "total_mem_mib": 337.07,
            "total_cpu_pct": 104.88,
            "mem_mib": [
              243.1,
              34.32,
              48.99,
              10.66
            ],
            "cpu_pct": [
              78.67,
              0.0,
              24.74,
              1.47
            ]
          },
          {
            "t_offset_s": 32.3,
            "total_mem_mib": 339.96,
            "total_cpu_pct": 100.56,
            "mem_mib": [
              246.5,
              34.32,
              48.66,
              10.48
            ],
            "cpu_pct": [
              83.26,
              0.0,
              16.07,
              1.23
            ]
          },
          {
            "t_offset_s": 34.4,
            "total_mem_mib": 337.56,
            "total_cpu_pct": 0.23,
            "mem_mib": [
              246.4,
              34.32,
              46.35,
              10.49
            ],
            "cpu_pct": [
              0.0,
              0.0,
              0.08,
              0.15
            ]
          },
          {
            "t_offset_s": 36.4,
            "total_mem_mib": 336.1,
            "total_cpu_pct": 0.28,
            "mem_mib": [
              244.7,
              34.32,
              46.6,
              10.48
            ],
            "cpu_pct": [
              0.0,
              0.0,
              0.11,
              0.17
            ]
          }
        ],
        "series_start_offset_s": 0.8,
        "peak_note": "peak = highest value seen across docker stats samples (about one every 2-3 s); shorter spikes between samples are not seen",
        "peak_memory_stat": {
          "read_at": "2026-10-18T03:27:00Z",
          "per_service": {
            "app": {
              "cgroup": "v2",
              "anon_mib": 128.05,
              "file_mib": 1014.29,
              "active_file_mib": 0.03,
              "inactive_file_mib": 941.58,
              "shmem_mib": 72.71
            },
            "cron": {
              "cgroup": "v2",
              "anon_mib": 33.22,
              "file_mib": 0.23,
              "active_file_mib": 0.0,
              "inactive_file_mib": 0.01,
              "shmem_mib": 0.22
            },
            "db": {
              "cgroup": "v2",
              "anon_mib": 9.84,
              "file_mib": 101.26,
              "active_file_mib": 0.0,
              "inactive_file_mib": 71.55,
              "shmem_mib": 29.71
            },
            "redis": {
              "cgroup": "v2",
              "anon_mib": 9.06,
              "file_mib": 0.0,
              "active_file_mib": 0.0,
              "inactive_file_mib": 0.0,
              "shmem_mib": 0.0
            }
          },
          "read_lag_s": 0.3,
          "series_index": 13,
          "sample_t_offset_s": 26.3,
          "total_mem_mib": 401.61
        },
        "series_services": [
          "app",
          "cron",
          "db",
          "redis"
        ]
      },
      "container_end_state": {
        "app": {
          "restart_count": 0,
          "oom_killed": false
        },
        "cron": {
          "restart_count": 0,
          "oom_killed": false
        },
        "db": {
          "restart_count": 0,
          "oom_killed": false
        },
        "redis": {
          "restart_count": 0,
          "oom_killed": false
        }
      },
      "teardown": {
        "done": true,
        "volumes_removed": true,
        "images_removed": false,
        "error": null
      },
      "warnings": [],
      "finished_at": "2026-10-18T03:27:24Z",
      "elapsed_seconds": 327.2
    },
    {
      "run": 2,
      "started_at": "2026-10-18T03:27:24Z",
      "host": {
        "label": "github-actions ubuntu-latest (2 vCPU, 8 GB)",
        "ci": {
          "runs_on": "ubuntu-latest",
          "runner_environment": "github-hosted",
          "runner_os": "Linux",
          "runner_arch": "X64",
          "image_os": "ubuntu24",
          "image_version": "20261012.334.1"
        },
        "cpu_model": "AMD EPYC 7763 64-Core Processor",
        "cpu_model_note": null,
        "cores": 2,
        "mem_total_mib": 7938,
        "kernel": "6.17.0-1022-azure",
        "os": "Ubuntu 24.04.5 LTS",
        "arch": "x86_64",
        "oci_arch": "amd64",
        "docker_server_version": "28.0.4",
        "docker_client_version": "28.0.4",
        "compose_client_version": "2.38.2",
        "storage_driver": "overlay2",
        "containerd_image_store": false,
        "source": "docker info + throwaway container reading /proc/cpuinfo on the daemon host",
        "compose_note": "Compose runs on the client machine; Docker server fields are from the daemon host"
      },
      "date": "2026-10-18",
      "startup": {
        "seconds": 26.8,
        "ok": true,
        "checks": [
          {
            "type": "container",
            "ok": true,
            "ready_after_s": 26.8,
            "detail": "shb-nextcloud-cron-1=running/no-healthcheck, shb-nextcloud-app-1=running/healthy, shb-nextcloud-redis-1=running/healthy, shb-nextcloud-db-1=running/healthy"
          }
        ],
        "up_command_seconds": 26.7,
        "definition": "wall clock from starting `docker compose up -d` until every health check passed; checks poll every 0.5 s from a throwaway container on the compose network, so resolution is about +/- 1 s"
      },
      "versions": {
        "app": "35.0.2",
        "cron": "35.0.2",
        "db": "18.6",
        "redis": "8.10.2"
      },
      "setup": [
        {
          "exit_code": 0,
          "duration_s": 1.8,
          "reported": {
            "installed": true,
            "version_string": "35.0.2"
          },
          "output_tail": [
            "status.php (Host: cloud.example.com): HTTP 200 {\"installed\": true, \"maintenance\": false, \"needsDbUpgrade\": false, \"version\": \"35.0.2.2\", \"versionstring\": \"35.0.2\", \"edition\": \"\", \"productname\": \"Nextcloud\", \"extendedSupport\": false}",
            "GET /login with Host cloud.example.com -> HTTP 200",
            "GET /login with Host localhost -> HTTP 200",
            "GET /login with Host not-trusted.example.org -> HTTP 400"
          ],
          "description": "Read status.php without logging in, as the install check, and request /login under the trusted domain, localhost and an untrusted host name (the response codes are in the output tail)."
        }
      ],
      "idle": {
        "per_service": {
          "app": {
            "samples": 11,
            "mem_mean_mib": 204.31,
            "mem_max_mib": 204.8,
            "cpu_mean_pct": 0.0,
            "cpu_max_pct": 0.01
          },
          "cron": {
            "samples": 11,
            "mem_mean_mib": 34.39,
            "mem_max_mib": 34.55,
            "cpu_mean_pct": 0.0,
            "cpu_max_pct": 0.0
          },
          "db": {
            "samples": 11,
            "mem_mean_mib": 45.97,
            "mem_max_mib": 46.16,
            "cpu_mean_pct": 0.84,
            "cpu_max_pct": 3.42
          },
          "redis": {
            "samples": 11,
            "mem_mean_mib": 10.29,
            "mem_max_mib": 10.48,
            "cpu_mean_pct": 0.92,
            "cpu_max_pct": 3.03
          }
        },
        "total": {
          "samples": 11,
          "dropped_for_total": 0,
          "mem_mean_mib": 294.95,
          "mem_max_mib": 295.6,
          "cpu_mean_pct": 1.77,
          "cpu_max_pct": 6.38
        },
        "window_seconds": 30.3,
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 294.69,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 3.0,
            "total_mem_mib": 294.44,
            "total_cpu_pct": 3.54
          },
          {
            "t_offset_s": 6.1,
            "total_mem_mib": 294.72,
            "total_cpu_pct": 0.15
          },
          {
            "t_offset_s": 9.1,
            "total_mem_mib": 294.84,
            "total_cpu_pct": 0.93
          },
          {
            "t_offset_s": 12.1,
            "total_mem_mib": 294.78,
            "total_cpu_pct": 3.03
          },
          {
            "t_offset_s": 15.2,
            "total_mem_mib": 295.3,
            "total_cpu_pct": 0.98
          },
          {
            "t_offset_s": 18.2,
            "total_mem_mib": 295.32,
            "total_cpu_pct": 2.97
          },
          {
            "t_offset_s": 21.2,
            "total_mem_mib": 294.74,
            "total_cpu_pct": 0.17
          },
          {
            "t_offset_s": 24.3,
            "total_mem_mib": 294.64,
            "total_cpu_pct": 0.99
          },
          {
            "t_offset_s": 27.3,
            "total_mem_mib": 295.6,
            "total_cpu_pct": 6.38
          },
          {
            "t_offset_s": 30.3,
            "total_mem_mib": 295.41,
            "total_cpu_pct": 0.14
          }
        ],
        "memory_stat": {
          "read_at": "2026-10-18T03:31:32Z",
          "per_service": {
            "app": {
              "cgroup": "v2",
              "anon_mib": 46.77,
              "file_mib": 947.28,
              "active_file_mib": 0.0,
              "inactive_file_mib": 892.46,
              "shmem_mib": 54.82
            },
            "cron": {
              "cgroup": "v2",
              "anon_mib": 33.23,
              "file_mib": 0.23,
              "active_file_mib": 0.0,
              "inactive_file_mib": 0.01,
              "shmem_mib": 0.22
            },
            "db": {
              "cgroup": "v2",
              "anon_mib": 7.41,
              "file_mib": 100.71,
              "active_file_mib": 0.0,
              "inactive_file_mib": 71.24,
              "shmem_mib": 29.47
            },
            "redis": {
              "cgroup": "v2",
              "anon_mib": 9.23,
              "file_mib": 0.0,
              "active_file_mib": 0.0,
              "inactive_file_mib": 0.0,
              "shmem_mib": 0.0
            }
          },
          "read_lag_s": 0.2,
          "method": "docker exec <container> cat /sys/fs/cgroup/memory.stat (cgroup v1: /sys/fs/cgroup/memory/memory.stat); MiB; splits what docker stats shows as one number into anon (heap) and file cache; a field that is absent was not printed by the kernel or not readable (see reason)",
          "taken": "right after the idle window"
        }
      },
      "periodic": {
        "service": "cron",
        "interval_seconds": 300,
        "align": "wall_clock",
        "settle_after_tick_seconds": 60,
        "tick_source": "computed from the wall clock (multiples of interval_seconds); not read from the job",
        "healthy_at": "2026-10-18T03:27:52Z",
        "ticks_since_healthy_before_idle": [
          "2026-10-18T03:30:00Z"
        ],
        "idle_started_at": "2026-10-18T03:31:01Z",
        "idle_ended_at": "2026-10-18T03:31:31Z",
        "seconds_since_last_tick_at_idle_start": 61.6,
        "idle_after_tick": true,
        "ticks_in_idle_window": [],
        "wait_added_s": 66.7,
        "wait_cap_s": 360,
        "cap_reached": false,
        "wait_started_at": "2026-10-18T03:29:54Z",
        "load_window_started_at": "2026-10-18T03:31:33Z",
        "ticks_in_load_window": [],
        "tick_in_load_window": false,
        "tick_near_load_window": false,
        "load_window_ended_at": "2026-10-18T03:32:12Z"
      },
      "settle": {
        "settled": true,
        "mode": "detected",
        "settle_seconds_used": 187.0,
        "settle_started_after_healthy_s": 2.6,
        "params": {
          "window_seconds": 60,
          "threshold_pct": 2.0,
          "threshold_min_mib": 10.0,
          "min_seconds": 120,
          "max_seconds": 600
        },
        "last_window": {
          "n": 20,
          "mean_mib": 294.71,
          "min_mib": 294.26,
          "max_mib": 295.39,
          "spread_mib": 1.13,
          "threshold_mib": 10.0
        },
        "rechecks": 0,
        "rule": "settled = over the last window_seconds the stack total varied (max - min) by less than max(threshold_pct of the window mean, threshold_min_mib); not before min_seconds, at the latest max_seconds, both counted from the end of the setup steps; the idle window must also be flat and agree with it. If max_seconds passes without settling, settled=false and the idle window is measured anyway."
      },
      "startup_peak": {
        "per_service_mem_mib": {
          "app": 207.5,
          "cron": 34.55,
          "db": 46.22,
          "redis": 10.48
        },
        "total_mem_mib": 295.39,
        "samples": 63,
        "note": "highest value across docker stats samples (about one every 2-3 s) from healthy until the stack settled; shorter spikes between samples are not seen"
      },
      "timeline": {
        "step_s": 10,
        "t0": "healthy",
        "offsets_s": [
          10,
          20,
          30,
          40,
          50,
          60,
          70,
          80,
          90,
          100,
          110,
          120,
          130,
          140,
          150,
          160,
          170,
          180,
          190,
          200,
          210,
          220
        ],
        "total_mem_mib": [
          254.4,
          258.7,
          258.0,
          258.0,
          255.2,
          254.0,
          256.4,
          256.6,
          256.6,
          256.9,
          257.3,
          257.5,
          258.1,
          294.8,
          294.8,
          294.7,
          294.5,
          294.6,
          294.8,
          294.7,
          295.1,
          295.1
        ],
        "per_service_mem_mib": {
          "app": [
            202.8,
            205.3,
            204.4,
            204.4,
            201.9,
            200.5,
            202.6,
            202.6,
            202.7,
            202.9,
            203.3,
            203.6,
            204.1,
            204.2,
            204.2,
            204.1,
            204.2,
            204.1,
            204.2,
            204.2,
            204.3,
            204.4
          ],
          "cron": [
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            0.7,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            34.3,
            34.3,
            34.4,
            34.3,
            34.3,
            34.4,
            34.3,
            34.5,
            34.4
          ],
          "db": [
            40.9,
            42.6,
            42.8,
            42.7,
            42.6,
            42.7,
            42.9,
            43.1,
            43.2,
            43.1,
            43.1,
            43.1,
            43.1,
            46.1,
            46.1,
            46.0,
            46.0,
            46.0,
            45.9,
            45.9,
            46.0,
            46.0
          ],
          "redis": [
            10.2,
            10.2,
            10.3,
            10.3,
            10.2,
            10.2,
            10.4,
            10.3,
            10.3,
            10.4,
            10.3,
            10.2,
            10.4,
            10.2,
            10.2,
            10.2,
            10.1,
            10.2,
            10.3,
            10.2,
            10.3,
            10.3
          ]
        }
      },
      "load": {
        "per_service": {
          "app": {
            "samples": 20,
            "mem_mean_mib": 264.83,
            "mem_max_mib": 307.5,
            "cpu_mean_pct": 65.3,
            "cpu_max_pct": 86.9
          },
          "cron": {
            "samples": 20,
            "mem_mean_mib": 53.02,
            "mem_max_mib": 147.3,
            "cpu_mean_pct": 12.81,
            "cpu_max_pct": 99.3
          },
          "db": {
            "samples": 20,
            "mem_mean_mib": 48.5,
            "mem_max_mib": 50.96,
            "cpu_mean_pct": 23.88,
            "cpu_max_pct": 34.07
          },
          "redis": {
            "samples": 20,
            "mem_mean_mib": 10.36,
            "mem_max_mib": 10.54,
            "cpu_mean_pct": 1.99,
            "cpu_max_pct": 5.42
          }
        },
        "total": {
          "samples": 20,
          "dropped_for_total": 0,
          "mem_mean_mib": 376.71,
          "mem_max_mib": 451.78,
          "cpu_mean_pct": 103.98,
          "cpu_max_pct": 142.54
        },
        "description": "One user (the admin), over plain HTTP on the Compose network, one request at a time. A Python script generates 103 random files (100 small ones of 1 KB to 1 MB, about 50 MB together, and three of 50 MB), uploads them over WebDAV (MKCOL, then one PUT per file), lists the folder with PROPFIND, and downloads five files (three small, two large) and checks their SHA-256. About 200 MB in total. No browser, no sync client, no chunked upload, no previews, no sharing. `occ files:scan` is not part of this load (the harness cannot run commands inside the stack); it was run by hand, see the article.",
        "duration_s": 35.7,
        "window": "from LAB_MARK load_start (or step start) until 2 s after the step ended",
        "reported_by_script": {
          "files_uploaded": 103,
          "small_files": 100,
          "large_files": 3,
          "bytes_uploaded": 194456599,
          "upload_seconds": 32.9,
          "propfind_entries": 104,
          "propfind_seconds": 0.23,
          "files_downloaded": 5,
          "bytes_downloaded": 101451451,
          "download_seconds": 1.7,
          "downloads_sha256_match": true
        },
        "output_tail": [
          "generated 103 files (100 small, 3 large), 194.5 MB",
          "uploaded 103 files, 194.5 MB in 32.9s; statuses {201: 103}",
          "PROPFIND HTTP 207: 104 entries (1 folder + 103 files) in 0.23s",
          "downloaded 5 files, 101.5 MB in 1.7s, SHA-256 matches"
        ],
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 372.66,
            "total_cpu_pct": 31.15,
            "mem_mib": [
              279.9,
              34.3,
              48.22,
              10.24
            ],
            "cpu_pct": [
              22.22,
              0.0,
              5.36,
              3.57
            ]
          },
          {
            "t_offset_s": 2.0,
            "total_mem_mib": 342.28,
            "total_cpu_pct": 104.86,
            "mem_mib": [
              249.5,
              34.3,
              47.94,
              10.54
            ],
            "cpu_pct": [
              75.89,
              0.0,
              27.43,
              1.54
            ]
          },
          {
            "t_offset_s": 4.0,
            "total_mem_mib": 325.73,
            "total_cpu_pct": 103.78,
            "mem_mib": [
              234.0,
              34.3,
              47.05,
              10.38
            ],
            "cpu_pct": [
              71.47,
              0.0,
              30.62,
              1.69
            ]
          },
          {
            "t_offset_s": 6.1,
            "total_mem_mib": 329.71,
            "total_cpu_pct": 102.08,
            "mem_mib": [
              235.9,
              34.3,
              49.18,
              10.33
            ],
            "cpu_pct": [
              73.12,
              0.0,
              27.45,
              1.51
            ]
          },
          {
            "t_offset_s": 8.1,
            "total_mem_mib": 396.94,
            "total_cpu_pct": 101.29,
            "mem_mib": [
              304.4,
              34.3,
              47.92,
              10.32
            ],
            "cpu_pct": [
              77.31,
              0.01,
              22.58,
              1.39
            ]
          },
          {
            "t_offset_s": 10.1,
            "total_mem_mib": 333.34,
            "total_cpu_pct": 109.09,
            "mem_mib": [
              240.6,
              34.3,
              48.21,
              10.23
            ],
            "cpu_pct": [
              69.6,
              0.0,
              34.07,
              5.42
            ]
          },
          {
            "t_offset_s": 12.1,
            "total_mem_mib": 333.99,
            "total_cpu_pct": 105.41,
            "mem_mib": [
              240.4,
              34.3,
              48.88,
              10.41
            ],
            "cpu_pct": [
              74.47,
              0.0,
              29.44,
              1.5
            ]
          },
          {
            "t_offset_s": 14.2,
            "total_mem_mib": 334.13,
            "total_cpu_pct": 103.04,
            "mem_mib": [
              240.7,
              34.3,
              49.01,
              10.12
            ],
            "cpu_pct": [
              74.22,
              0.0,
              27.32,
              1.5
            ]
          },
          {
            "t_offset_s": 16.2,
            "total_mem_mib": 334.14,
            "total_cpu_pct": 101.26,
            "mem_mib": [
              240.6,
              34.3,
              48.76,
              10.48
            ],
            "cpu_pct": [
              75.47,
              0.0,
              24.4,
              1.39
            ]
          },
          {
            "t_offset_s": 18.2,
            "total_mem_mib": 403.88,
            "total_cpu_pct": 106.69,
            "mem_mib": [
              305.0,
              40.51,
              48.11,
              10.26
            ],
            "cpu_pct": [
              74.53,
              4.09,
              26.52,
              1.55
            ]
          },
          {
            "t_offset_s": 20.2,
            "total_mem_mib": 402.5,
            "total_cpu_pct": 112.16,
            "mem_mib": [
              305.1,
              38.61,
              48.25,
              10.54
            ],
            "cpu_pct": [
              73.78,
              4.13,
              29.38,
              4.87
            ]
          },
          {
            "t_offset_s": 22.2,
            "total_mem_mib": 374.66,
            "total_cpu_pct": 110.62,
            "mem_mib": [
              277.2,
              38.79,
              48.36,
              10.31
            ],
            "cpu_pct": [
              77.86,
              4.19,
              26.99,
              1.58
            ]
          },
          {
            "t_offset_s": 24.3,
            "total_mem_mib": 339.88,
            "total_cpu_pct": 110.03,
            "mem_mib": [
              241.1,
              38.9,
              49.37,
              10.51
            ],
            "cpu_pct": [
              71.09,
              5.05,
              32.32,
              1.57
            ]
          },
          {
            "t_offset_s": 26.3,
            "total_mem_mib": 405.25,
            "total_cpu_pct": 107.95,
            "mem_mib": [
              307.3,
              39.31,
              48.11,
              10.53
            ],
            "cpu_pct": [
              76.25,
              4.61,
              25.65,
              1.44
            ]
          },
          {
            "t_offset_s": 28.3,
            "total_mem_mib": 405.62,
            "total_cpu_pct": 108.58,
            "mem_mib": [
              307.3,
              39.46,
              48.54,
              10.32
            ],
            "cpu_pct": [
              75.65,
              4.87,
              26.49,
              1.57
            ]
          },
          {
            "t_offset_s": 30.3,
            "total_mem_mib": 405.66,
            "total_cpu_pct": 113.05,
            "mem_mib": [
              307.5,
              39.64,
              48.43,
              10.09
            ],
            "cpu_pct": [
              72.7,
              4.37,
              31.1,
              4.88
            ]
          },
          {
            "t_offset_s": 32.3,
            "total_mem_mib": 342.71,
            "total_cpu_pct": 109.2,
            "mem_mib": [
              244.3,
              39.6,
              48.46,
              10.35
            ],
            "cpu_pct": [
              86.9,
              3.58,
              17.72,
              1.0
            ]
          },
          {
            "t_offset_s": 34.4,
            "total_mem_mib": 450.4,
            "total_cpu_pct": 142.54,
            "mem_mib": [
              246.0,
              143.1,
              50.96,
              10.34
            ],
            "cpu_pct": [
              83.39,
              26.77,
              31.22,
              1.16
            ]
          },
          {
            "t_offset_s": 36.4,
            "total_mem_mib": 451.78,
            "total_cpu_pct": 97.17,
            "mem_mib": [
              245.9,
              147.3,
              48.23,
              10.35
            ],
            "cpu_pct": [
              0.0,
              95.31,
              1.57,
              0.29
            ]
          },
          {
            "t_offset_s": 38.4,
            "total_mem_mib": 448.86,
            "total_cpu_pct": 99.75,
            "mem_mib": [
              244.0,
              146.4,
              47.97,
              10.49
            ],
            "cpu_pct": [
              0.0,
              99.3,
              0.01,
              0.44
            ]
          }
        ],
        "series_start_offset_s": 0.8,
        "peak_note": "peak = highest value seen across docker stats samples (about one every 2-3 s); shorter spikes between samples are not seen",
        "peak_memory_stat": {
          "read_at": "2026-10-18T03:32:10Z",
          "per_service": {
            "app": {
              "cgroup": "v2",
              "anon_mib": 61.62,
              "file_mib": 1151.02,
              "active_file_mib": 0.03,
              "inactive_file_mib": 1078.09,
              "shmem_mib": 72.92
            },
            "cron": {
              "cgroup": "v2",
              "anon_mib": 143.82,
              "file_mib": 5.98,
              "active_file_mib": 0.0,
              "inactive_file_mib": 5.76,
              "shmem_mib": 0.22
            },
            "db": {
              "cgroup": "v2",
              "anon_mib": 8.7,
              "file_mib": 101.79,
              "active_file_mib": 0.0,
              "inactive_file_mib": 71.5,
              "shmem_mib": 30.29
            },
            "redis": {
              "cgroup": "v2",
              "anon_mib": 9.06,
              "file_mib": 0.0,
              "active_file_mib": 0.0,
              "inactive_file_mib": 0.0,
              "shmem_mib": 0.0
            }
          },
          "read_lag_s": 0.3,
          "series_index": 18,
          "sample_t_offset_s": 36.4,
          "total_mem_mib": 451.78
        },
        "series_services": [
          "app",
          "cron",
          "db",
          "redis"
        ]
      },
      "container_end_state": {
        "app": {
          "restart_count": 0,
          "oom_killed": false
        },
        "cron": {
          "restart_count": 0,
          "oom_killed": false
        },
        "db": {
          "restart_count": 0,
          "oom_killed": false
        },
        "redis": {
          "restart_count": 0,
          "oom_killed": false
        }
      },
      "teardown": {
        "done": true,
        "volumes_removed": true,
        "images_removed": false,
        "error": null
      },
      "warnings": [],
      "finished_at": "2026-10-18T03:32:27Z",
      "elapsed_seconds": 302.4
    },
    {
      "run": 3,
      "started_at": "2026-10-18T03:32:27Z",
      "host": {
        "label": "github-actions ubuntu-latest (2 vCPU, 8 GB)",
        "ci": {
          "runs_on": "ubuntu-latest",
          "runner_environment": "github-hosted",
          "runner_os": "Linux",
          "runner_arch": "X64",
          "image_os": "ubuntu24",
          "image_version": "20261012.334.1"
        },
        "cpu_model": "AMD EPYC 7763 64-Core Processor",
        "cpu_model_note": null,
        "cores": 2,
        "mem_total_mib": 7938,
        "kernel": "6.17.0-1022-azure",
        "os": "Ubuntu 24.04.5 LTS",
        "arch": "x86_64",
        "oci_arch": "amd64",
        "docker_server_version": "28.0.4",
        "docker_client_version": "28.0.4",
        "compose_client_version": "2.38.2",
        "storage_driver": "overlay2",
        "containerd_image_store": false,
        "source": "docker info + throwaway container reading /proc/cpuinfo on the daemon host",
        "compose_note": "Compose runs on the client machine; Docker server fields are from the daemon host"
      },
      "date": "2026-10-18",
      "startup": {
        "seconds": 26.8,
        "ok": true,
        "checks": [
          {
            "type": "container",
            "ok": true,
            "ready_after_s": 26.8,
            "detail": "shb-nextcloud-cron-1=running/no-healthcheck, shb-nextcloud-app-1=running/healthy, shb-nextcloud-redis-1=running/healthy, shb-nextcloud-db-1=running/healthy"
          }
        ],
        "up_command_seconds": 26.7,
        "definition": "wall clock from starting `docker compose up -d` until every health check passed; checks poll every 0.5 s from a throwaway container on the compose network, so resolution is about +/- 1 s"
      },
      "versions": {
        "app": "35.0.2",
        "cron": "35.0.2",
        "db": "18.6",
        "redis": "8.10.2"
      },
      "setup": [
        {
          "exit_code": 0,
          "duration_s": 1.9,
          "reported": {
            "installed": true,
            "version_string": "35.0.2"
          },
          "output_tail": [
            "status.php (Host: cloud.example.com): HTTP 200 {\"installed\": true, \"maintenance\": false, \"needsDbUpgrade\": false, \"version\": \"35.0.2.2\", \"versionstring\": \"35.0.2\", \"edition\": \"\", \"productname\": \"Nextcloud\", \"extendedSupport\": false}",
            "GET /login with Host cloud.example.com -> HTTP 200",
            "GET /login with Host localhost -> HTTP 200",
            "GET /login with Host not-trusted.example.org -> HTTP 400"
          ],
          "description": "Read status.php without logging in, as the install check, and request /login under the trusted domain, localhost and an untrusted host name (the response codes are in the output tail)."
        }
      ],
      "idle": {
        "per_service": {
          "app": {
            "samples": 11,
            "mem_mean_mib": 204.19,
            "mem_max_mib": 204.4,
            "cpu_mean_pct": 0.89,
            "cpu_max_pct": 4.9
          },
          "cron": {
            "samples": 11,
            "mem_mean_mib": 34.42,
            "mem_max_mib": 34.67,
            "cpu_mean_pct": 0.0,
            "cpu_max_pct": 0.01
          },
          "db": {
            "samples": 11,
            "mem_mean_mib": 46.17,
            "mem_max_mib": 46.29,
            "cpu_mean_pct": 0.73,
            "cpu_max_pct": 3.77
          },
          "redis": {
            "samples": 11,
            "mem_mean_mib": 12.16,
            "mem_max_mib": 12.42,
            "cpu_mean_pct": 0.96,
            "cpu_max_pct": 3.07
          }
        },
        "total": {
          "samples": 11,
          "dropped_for_total": 0,
          "mem_mean_mib": 296.93,
          "mem_max_mib": 297.17,
          "cpu_mean_pct": 2.58,
          "cpu_max_pct": 5.07
        },
        "window_seconds": 30.3,
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 296.99,
            "total_cpu_pct": 3.05
          },
          {
            "t_offset_s": 3.0,
            "total_mem_mib": 296.93,
            "total_cpu_pct": 0.17
          },
          {
            "t_offset_s": 6.1,
            "total_mem_mib": 296.69,
            "total_cpu_pct": 3.94
          },
          {
            "t_offset_s": 9.1,
            "total_mem_mib": 296.78,
            "total_cpu_pct": 0.18
          },
          {
            "t_offset_s": 12.1,
            "total_mem_mib": 296.71,
            "total_cpu_pct": 0.98
          },
          {
            "t_offset_s": 15.2,
            "total_mem_mib": 296.88,
            "total_cpu_pct": 3.01
          },
          {
            "t_offset_s": 18.2,
            "total_mem_mib": 297.16,
            "total_cpu_pct": 5.06
          },
          {
            "t_offset_s": 21.2,
            "total_mem_mib": 296.94,
            "total_cpu_pct": 3.67
          },
          {
            "t_offset_s": 24.3,
            "total_mem_mib": 297.17,
            "total_cpu_pct": 0.21
          },
          {
            "t_offset_s": 27.3,
            "total_mem_mib": 297.03,
            "total_cpu_pct": 5.07
          },
          {
            "t_offset_s": 30.3,
            "total_mem_mib": 296.97,
            "total_cpu_pct": 3.08
          }
        ],
        "memory_stat": {
          "read_at": "2026-10-18T03:36:31Z",
          "per_service": {
            "app": {
              "cgroup": "v2",
              "anon_mib": 46.64,
              "file_mib": 947.28,
              "active_file_mib": 0.0,
              "inactive_file_mib": 892.46,
              "shmem_mib": 54.82
            },
            "cron": {
              "cgroup": "v2",
              "anon_mib": 33.33,
              "file_mib": 0.23,
              "active_file_mib": 0.0,
              "inactive_file_mib": 0.01,
              "shmem_mib": 0.22
            },
            "db": {
              "cgroup": "v2",
              "anon_mib": 7.52,
              "file_mib": 100.71,
              "active_file_mib": 0.0,
              "inactive_file_mib": 71.24,
              "shmem_mib": 29.47
            },
            "redis": {
              "cgroup": "v2",
              "anon_mib": 11.18,
              "file_mib": 0.0,
              "active_file_mib": 0.0,
              "inactive_file_mib": 0.0,
              "shmem_mib": 0.0
            }
          },
          "read_lag_s": 0.2,
          "method": "docker exec <container> cat /sys/fs/cgroup/memory.stat (cgroup v1: /sys/fs/cgroup/memory/memory.stat); MiB; splits what docker stats shows as one number into anon (heap) and file cache; a field that is absent was not printed by the kernel or not readable (see reason)",
          "taken": "right after the idle window"
        }
      },
      "periodic": {
        "service": "cron",
        "interval_seconds": 300,
        "align": "wall_clock",
        "settle_after_tick_seconds": 60,
        "tick_source": "computed from the wall clock (multiples of interval_seconds); not read from the job",
        "healthy_at": "2026-10-18T03:32:54Z",
        "ticks_since_healthy_before_idle": [
          "2026-10-18T03:35:00Z"
        ],
        "idle_started_at": "2026-10-18T03:36:00Z",
        "idle_ended_at": "2026-10-18T03:36:31Z",
        "seconds_since_last_tick_at_idle_start": 61.0,
        "idle_after_tick": true,
        "ticks_in_idle_window": [],
        "wait_added_s": 63.7,
        "wait_cap_s": 360,
        "cap_reached": false,
        "wait_started_at": "2026-10-18T03:34:57Z",
        "load_window_started_at": "2026-10-18T03:36:32Z",
        "ticks_in_load_window": [],
        "tick_in_load_window": false,
        "tick_near_load_window": false,
        "load_window_ended_at": "2026-10-18T03:37:13Z"
      },
      "settle": {
        "settled": true,
        "mode": "detected",
        "settle_seconds_used": 184.0,
        "settle_started_after_healthy_s": 2.6,
        "params": {
          "window_seconds": 60,
          "threshold_pct": 2.0,
          "threshold_min_mib": 10.0,
          "min_seconds": 120,
          "max_seconds": 600
        },
        "last_window": {
          "n": 20,
          "mean_mib": 296.5,
          "min_mib": 295.06,
          "max_mib": 302.46,
          "spread_mib": 7.4,
          "threshold_mib": 10.0
        },
        "rechecks": 0,
        "rule": "settled = over the last window_seconds the stack total varied (max - min) by less than max(threshold_pct of the window mean, threshold_min_mib); not before min_seconds, at the latest max_seconds, both counted from the end of the setup steps; the idle window must also be flat and agree with it. If max_seconds passes without settling, settled=false and the idle window is measured anyway."
      },
      "startup_peak": {
        "per_service_mem_mib": {
          "app": 209.8,
          "cron": 34.56,
          "db": 46.42,
          "redis": 12.41
        },
        "total_mem_mib": 302.46,
        "samples": 62,
        "note": "highest value across docker stats samples (about one every 2-3 s) from healthy until the stack settled; shorter spikes between samples are not seen"
      },
      "timeline": {
        "step_s": 10,
        "t0": "healthy",
        "offsets_s": [
          10,
          20,
          30,
          40,
          50,
          60,
          70,
          80,
          90,
          100,
          110,
          120,
          130,
          140,
          150,
          160,
          170,
          180,
          190,
          200,
          210,
          220
        ],
        "total_mem_mib": [
          256.1,
          260.3,
          259.7,
          259.9,
          257.0,
          255.7,
          258.0,
          258.2,
          258.2,
          258.6,
          258.7,
          258.5,
          270.9,
          295.5,
          297.8,
          296.6,
          296.2,
          296.5,
          296.9,
          296.7,
          297.0,
          297.1
        ],
        "per_service_mem_mib": {
          "app": [
            202.5,
            205.1,
            204.3,
            204.3,
            201.7,
            200.3,
            202.4,
            202.5,
            202.4,
            202.7,
            202.6,
            202.6,
            202.6,
            202.6,
            205.1,
            203.8,
            203.5,
            203.9,
            204.2,
            204.2,
            204.3,
            204.1
          ],
          "cron": [
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            0.6,
            11.8,
            34.3,
            34.3,
            34.4,
            34.3,
            34.4,
            34.4,
            34.3,
            34.4,
            34.5
          ],
          "db": [
            40.9,
            42.4,
            42.6,
            42.6,
            42.8,
            42.6,
            42.7,
            43.0,
            43.1,
            43.1,
            43.2,
            43.1,
            44.2,
            46.2,
            46.1,
            46.2,
            46.1,
            46.0,
            46.2,
            46.1,
            46.2,
            46.2
          ],
          "redis": [
            12.1,
            12.2,
            12.2,
            12.4,
            12.0,
            12.2,
            12.2,
            12.2,
            12.1,
            12.2,
            12.2,
            12.2,
            12.2,
            12.3,
            12.2,
            12.2,
            12.3,
            12.2,
            12.1,
            12.2,
            12.2,
            12.2
          ]
        }
      },
      "load": {
        "per_service": {
          "app": {
            "samples": 21,
            "mem_mean_mib": 267.55,
            "mem_max_mib": 317.0,
            "cpu_mean_pct": 63.78,
            "cpu_max_pct": 81.69
          },
          "cron": {
            "samples": 21,
            "mem_mean_mib": 54.43,
            "mem_max_mib": 167.3,
            "cpu_mean_pct": 20.11,
            "cpu_max_pct": 97.22
          },
          "db": {
            "samples": 21,
            "mem_mean_mib": 48.34,
            "mem_max_mib": 51.44,
            "cpu_mean_pct": 22.87,
            "cpu_max_pct": 42.83
          },
          "redis": {
            "samples": 21,
            "mem_mean_mib": 12.33,
            "mem_max_mib": 12.52,
            "cpu_mean_pct": 1.96,
            "cpu_max_pct": 5.09
          }
        },
        "total": {
          "samples": 21,
          "dropped_for_total": 0,
          "mem_mean_mib": 382.65,
          "mem_max_mib": 478.96,
          "cpu_mean_pct": 108.72,
          "cpu_max_pct": 194.33
        },
        "description": "One user (the admin), over plain HTTP on the Compose network, one request at a time. A Python script generates 103 random files (100 small ones of 1 KB to 1 MB, about 50 MB together, and three of 50 MB), uploads them over WebDAV (MKCOL, then one PUT per file), lists the folder with PROPFIND, and downloads five files (three small, two large) and checks their SHA-256. About 200 MB in total. No browser, no sync client, no chunked upload, no previews, no sharing. `occ files:scan` is not part of this load (the harness cannot run commands inside the stack); it was run by hand, see the article.",
        "duration_s": 37.7,
        "window": "from LAB_MARK load_start (or step start) until 2 s after the step ended",
        "reported_by_script": {
          "files_uploaded": 103,
          "small_files": 100,
          "large_files": 3,
          "bytes_uploaded": 194456599,
          "upload_seconds": 35.4,
          "propfind_entries": 104,
          "propfind_seconds": 0.23,
          "files_downloaded": 5,
          "bytes_downloaded": 101451451,
          "download_seconds": 1.9,
          "downloads_sha256_match": true
        },
        "output_tail": [
          "generated 103 files (100 small, 3 large), 194.5 MB",
          "uploaded 103 files, 194.5 MB in 35.4s; statuses {201: 103}",
          "PROPFIND HTTP 207: 104 entries (1 folder + 103 files) in 0.23s",
          "downloaded 5 files, 101.5 MB in 1.9s, SHA-256 matches"
        ],
        "series": [
          {
            "t_offset_s": 0.0,
            "total_mem_mib": 374.3,
            "total_cpu_pct": 29.17,
            "mem_mib": [
              279.2,
              34.42,
              48.25,
              12.43
            ],
            "cpu_pct": [
              26.51,
              0.0,
              2.28,
              0.38
            ]
          },
          {
            "t_offset_s": 2.0,
            "total_mem_mib": 390.8,
            "total_cpu_pct": 101.54,
            "mem_mib": [
              295.7,
              34.43,
              48.3,
              12.37
            ],
            "cpu_pct": [
              74.71,
              0.0,
              25.24,
              1.59
            ]
          },
          {
            "t_offset_s": 4.0,
            "total_mem_mib": 328.02,
            "total_cpu_pct": 102.19,
            "mem_mib": [
              232.6,
              34.42,
              48.78,
              12.22
            ],
            "cpu_pct": [
              76.13,
              0.0,
              24.51,
              1.55
            ]
          },
          {
            "t_offset_s": 6.1,
            "total_mem_mib": 398.96,
            "total_cpu_pct": 102.94,
            "mem_mib": [
              304.2,
              34.42,
              48.14,
              12.2
            ],
            "cpu_pct": [
              77.52,
              0.0,
              23.87,
              1.55
            ]
          },
          {
            "t_offset_s": 8.1,
            "total_mem_mib": 339.78,
            "total_cpu_pct": 107.16,
            "mem_mib": [
              244.1,
              34.42,
              49.03,
              12.23
            ],
            "cpu_pct": [
              70.93,
              0.01,
              31.25,
              4.97
            ]
          },
          {
            "t_offset_s": 10.1,
            "total_mem_mib": 341.58,
            "total_cpu_pct": 105.79,
            "mem_mib": [
              246.4,
              34.42,
              48.49,
              12.27
            ],
            "cpu_pct": [
              81.69,
              0.0,
              22.74,
              1.36
            ]
          },
          {
            "t_offset_s": 12.1,
            "total_mem_mib": 405.51,
            "total_cpu_pct": 101.97,
            "mem_mib": [
              310.4,
              34.42,
              48.17,
              12.52
            ],
            "cpu_pct": [
              78.14,
              0.0,
              22.38,
              1.45
            ]
          },
          {
            "t_offset_s": 14.2,
            "total_mem_mib": 344.7,
            "total_cpu_pct": 101.69,
            "mem_mib": [
              248.6,
              34.42,
              49.39,
              12.29
            ],
            "cpu_pct": [
              71.43,
              0.0,
              28.68,
              1.58
            ]
          },
          {
            "t_offset_s": 16.2,
            "total_mem_mib": 346.44,
            "total_cpu_pct": 103.08,
            "mem_mib": [
              250.5,
              34.42,
              49.16,
              12.36
            ],
            "cpu_pct": [
              76.6,
              0.0,
              24.99,
              1.49
            ]
          },
          {
            "t_offset_s": 18.2,
            "total_mem_mib": 413.21,
            "total_cpu_pct": 114.08,
            "mem_mib": [
              314.9,
              37.94,
              48.32,
              12.05
            ],
            "cpu_pct": [
              72.87,
              6.03,
              30.1,
              5.08
            ]
          },
          {
            "t_offset_s": 20.2,
            "total_mem_mib": 412.46,
            "total_cpu_pct": 127.36,
            "mem_mib": [
              313.0,
              38.77,
              48.41,
              12.28
            ],
            "cpu_pct": [
              74.93,
              23.95,
              27.06,
              1.42
            ]
          },
          {
            "t_offset_s": 22.2,
            "total_mem_mib": 454.51,
            "total_cpu_pct": 135.85,
            "mem_mib": [
              248.9,
              142.7,
              50.43,
              12.48
            ],
            "cpu_pct": [
              70.18,
              21.34,
              42.83,
              1.5
            ]
          },
          {
            "t_offset_s": 24.3,
            "total_mem_mib": 458.49,
            "total_cpu_pct": 194.33,
            "mem_mib": [
              248.8,
              147.8,
              49.78,
              12.11
            ],
            "cpu_pct": [
              67.83,
              97.22,
              27.53,
              1.75
            ]
          },
          {
            "t_offset_s": 26.3,
            "total_mem_mib": 456.31,
            "total_cpu_pct": 192.56,
            "mem_mib": [
              246.9,
              146.2,
              50.89,
              12.32
            ],
            "cpu_pct": [
              70.86,
              96.28,
              24.0,
              1.42
            ]
          },
          {
            "t_offset_s": 28.3,
            "total_mem_mib": 460.85,
            "total_cpu_pct": 189.96,
            "mem_mib": [
              249.1,
              147.8,
              51.44,
              12.51
            ],
            "cpu_pct": [
              61.04,
              91.93,
              31.9,
              5.09
            ]
          },
          {
            "t_offset_s": 30.3,
            "total_mem_mib": 478.96,
            "total_cpu_pct": 188.61,
            "mem_mib": [
              249.2,
              167.3,
              50.19,
              12.27
            ],
            "cpu_pct": [
              74.67,
              85.54,
              26.83,
              1.57
            ]
          },
          {
            "t_offset_s": 32.4,
            "total_mem_mib": 320.7,
            "total_cpu_pct": 102.73,
            "mem_mib": [
              261.4,
              0.97,
              46.1,
              12.23
            ],
            "cpu_pct": [
              72.49,
              0.0,
              28.53,
              1.71
            ]
          },
          {
            "t_offset_s": 34.4,
            "total_mem_mib": 376.71,
            "total_cpu_pct": 102.95,
            "mem_mib": [
              317.0,
              0.97,
              46.23,
              12.51
            ],
            "cpu_pct": [
              79.13,
              0.0,
              22.44,
              1.38
            ]
          },
          {
            "t_offset_s": 36.4,
            "total_mem_mib": 312.47,
            "total_cpu_pct": 67.91,
            "mem_mib": [
              251.9,
              0.97,
              47.14,
              12.46
            ],
            "cpu_pct": [
              57.5,
              0.0,
              9.53,
              0.88
            ]
          },
          {
            "t_offset_s": 38.4,
            "total_mem_mib": 311.36,
            "total_cpu_pct": 6.72,
            "mem_mib": [
              253.8,
              0.95,
              44.22,
              12.39
            ],
            "cpu_pct": [
              0.01,
              0.01,
              3.53,
              3.17
            ]
          },
          {
            "t_offset_s": 40.5,
            "total_mem_mib": 309.55,
            "total_cpu_pct": 4.49,
            "mem_mib": [
              252.0,
              0.95,
              44.21,
              12.39
            ],
            "cpu_pct": [
              4.3,
              0.0,
              0.02,
              0.17
            ]
          }
        ],
        "series_start_offset_s": 0.7,
        "peak_note": "peak = highest value seen across docker stats samples (about one every 2-3 s); shorter spikes between samples are not seen",
        "peak_memory_stat": {
          "read_at": "2026-10-18T03:37:04Z",
          "per_service": {
            "app": {
              "cgroup": "v2",
              "anon_mib": 70.68,
              "file_mib": 1002.71,
              "active_file_mib": 0.03,
              "inactive_file_mib": 930.01,
              "shmem_mib": 72.7
            },
            "cron": {
              "cgroup": "v2",
              "anon_mib": 165.2,
              "file_mib": 8.33,
              "active_file_mib": 0.0,
              "inactive_file_mib": 8.11,
              "shmem_mib": 0.22
            },
            "db": {
              "cgroup": "v2",
              "anon_mib": 10.52,
              "file_mib": 101.89,
              "active_file_mib": 0.0,
              "inactive_file_mib": 71.55,
              "shmem_mib": 30.34
            },
            "redis": {
              "cgroup": "v2",
              "anon_mib": 11.03,
              "file_mib": 0.0,
              "active_file_mib": 0.0,
              "inactive_file_mib": 0.0,
              "shmem_mib": 0.0
            }
          },
          "read_lag_s": 0.4,
          "series_index": 15,
          "sample_t_offset_s": 30.3,
          "total_mem_mib": 478.96
        },
        "series_services": [
          "app",
          "cron",
          "db",
          "redis"
        ]
      },
      "container_end_state": {
        "app": {
          "restart_count": 0,
          "oom_killed": false
        },
        "cron": {
          "restart_count": 0,
          "oom_killed": false
        },
        "db": {
          "restart_count": 0,
          "oom_killed": false
        },
        "redis": {
          "restart_count": 0,
          "oom_killed": false
        }
      },
      "teardown": {
        "done": true,
        "volumes_removed": true,
        "images_removed": false,
        "error": null
      },
      "warnings": [],
      "finished_at": "2026-10-18T03:37:28Z",
      "elapsed_seconds": 301.4
    }
  ],
  "load_defined": true,
  "notes": [
    "Image: the official `nextcloud` apache variant. The `cron` service is the same image started with /cron.sh: two containers in memory, one image on disk.",
    "The first install is automatic (database and admin variables in compose.yaml), so there is no web wizard and no installed apps beyond the image's defaults.",
    "Periodic job: service cron runs a scheduled job every 300 s on the wall-clock grid. After the settle rule is met, the idle window starts only once the job has ticked at least once since the stack became healthy and the last tick is 60 s old (extra wait capped at 360 s), so idle reflects a stack after one run of the job. The wait is part of settle_seconds_used; runs[].periodic has the tick times (computed from the clock, not read from the job)."
  ],
  "warnings": [],
  "files": {
    "compose": "nextcloud.compose.yaml",
    "env": "nextcloud.env"
  },
  "definitions": {
    "memory": "cgroup working set as reported by `docker stats` (usage minus inactive file cache), MiB = 2^20 bytes",
    "cpu": "percent of ONE core as reported by `docker stats` (4 busy cores = 400)",
    "total": "stats over the sum of all containers at the same instant",
    "sample_interval": "docker stats --no-stream takes about 1-2 s per call, so samples are 2-3 s apart",
    "runs": "each run is a full fresh cycle (up, health, setup, settle, idle, load, down -v); the published figure is the median over the runs, shown with the min-max range; see summary.rule"
  }
}
