# changelog

author: GetPageSpeed <info@getpagespeed.com> 1.8.4-1
changelog:
  - 1.8.4-1
  - Replace asyncore with selectors for Python 3.12+ compatibility
  - Add GitHub Actions CI with Python 3.8-3.13 test matrix


author: GetPageSpeed <info@getpagespeed.com> 1.8.5-1
changelog:
  - 1.8.5-1
  - Agent now starts when agent.conf lacks the optional [loggers]/[handlers]/[formatters] sections (falls back to built-in logging defaults)
  - systemd unit Documentation URL points to amplify.getpagespeed.com/docs


author: GetPageSpeed <info@getpagespeed.com> 1.8.5-2
changelog:
  - 1.8.5-2
  - Fix TypeError in exponential_delay() on Python 3.12+ (Noble/Trixie/EL10/Fedora/SLES16)
  - Ported from upstream PR github.com/nginxinc/nginx-amplify-agent/pull/125 by @jasil1414


author: GetPageSpeed <info@getpagespeed.com> 1.8.9-1
changelog:
  - 1.8.9-1
  - install.sh self-heals a missing /etc/amplify-agent/agent.conf.default
    after package install (yum reinstall on RPM, apt-get install --reinstall
    --force-confmiss on DEB). Closes a customer-reported "can't find
    /etc/amplify-agent/agent.conf.default" abort on Ubuntu 22.04 after a
    remove + rm /etc/amplify-agent + reinstall cycle.
  - DEB-only: agent.conf.default is no longer registered as a dpkg conffile
    (it is a build-time template for install.sh, not a user-editable config).
    No behavior change on RPM, since the spec lists /etc/amplify-agent//* without
    %config(noreplace).


author: GetPageSpeed <info@getpagespeed.com> 1.8.10-1
changelog:
  - 1.8.10-1
  - (DEB-only fix, no behavior change on RPM.) Follow-up to 1.8.9-1
    after the test-deb-reinstall-recovery integration test caught two
    more bugs on jammy:
    * override_dh_installdeb in debian/rules strips agent.conf.default
      from the auto-detected conffiles list. The 1.8.9-1 attempt used a
      .conffiles file, but that APPENDS to auto-detection rather than
      replacing it.
    * postinst no longer early-exits on the upgrade branch when
      agent.conf is missing -- the early exit was skipping
      dh_installsystemd's unmask, so a service masked by `apt-get remove`
      stayed masked through reinstall and install.sh's "Launching" step
      failed.
  - (Cross-distro) install.sh self-heal branch added in 1.8.9-1 has been
    removed -- redundant once 1.8.10-1 is the latest available package.


author: GetPageSpeed <info@getpagespeed.com> 1.8.11-1
changelog:
  - 1.8.11-1
  - Fix "This operation would block forever" race on EL7 cold-boot start.
    python-daemon's DaemonContext double-forks via os.fork captured at
    import time -- before our gevent.monkey.patch_all() ran -- so gevent's
    auto-reinit-on-fork never fires. The child process inherited a hub
    whose libev wakefd/eventfd were closed during fork, and the
    supervisor's first network call raised
    gevent.hub.LoopExit("This operation would block forever").
    Call gevent.reinit() in the child immediately after DaemonContext
    enters to rebuild the libev hub. Manifested at cold boot on EL7;
    warm restarts got scattered FD numbers and usually escaped the race.


author: GetPageSpeed <info@getpagespeed.com> 1.8.12-1
changelog:
  - 1.8.12-1
  - systemd auto-restart safety net for the cold-boot start path. The
    gevent.reinit() fix in 1.8.11-1 is the cure for the EL7 fork race; this
    guarantees recovery if it ever loses the race on some cold-boot FD timing.
    Adds Restart=on-failure, RestartSec=5s, StartLimitInterval=60,
    StartLimitBurst=3 to the unit (pre-v230 names in [Service] for EL7
    systemd 219). on-failure does not fight a clean `systemctl stop`; the
    bounded limit lets a transient boot race recover on retry yet still
    surfaces a persistent failure as `failed` instead of looping forever.


author: GetPageSpeed <info@getpagespeed.com> 1.8.13-1
changelog:
  - 1.8.13-1
  - Stop the recurring "workers_io raised AccessDenied" log noise. The NGINX
    worker IO collector reads /proc/<pid>/io, which is ptrace-gated and
    unreadable for the root-owned master (and even between same-user workers),
    so io_counters() raised psutil.AccessDenied and aborted the whole collection
    cycle, zeroing nginx.workers.io.kbs_r/kbs_w. Now skip the inaccessible
    process and sum IO over the readable workers. NoSuchProcess still propagates
    to the need_restart path.


author: GetPageSpeed <info@getpagespeed.com> 1.8.14-1
changelog:
  - 1.8.14-1
  - Close a restart-recovery hole. An uncaught exception during agent startup
    (notably the initial talk_to_cloud raising AmplifyCriticalException when a
    rapid restart races the cloud handshake) was logged and then let the process
    fall off the end of run() and exit 0. systemd Restart=on-failure treats a
    clean exit as success, so the agent stayed inactive (dead) instead of being
    revived; a single manual start recovered it. main.run() now exits non-zero on
    any uncaught run-time exception, so the existing on-failure net (1.8.12-1)
    restarts it -- and the fresh process re-runs gevent.reinit() (1.8.11-1).
  - Stop two destructors (AbstractManager.__del__, FileTail.__del__) from raising
    during garbage collection / interpreter shutdown -- a missing `running`
    attribute and a None context.log surfaced as unraisable-exception warnings.


author: GetPageSpeed <info@getpagespeed.com> 1.8.15-1
changelog:
  - 1.8.15-1
  - Fix `yum upgrade`/`apt upgrade` not restarting the agent. The %post/postinst
    upgrade branch detected the running agent with `pgrep amplify-agent`, which
    matches only the process comm -- truncated by the kernel to 15 chars
    (`nginx-amplify-a`), so the pattern `amplify-agent` never matched and the
    stop/start was skipped, leaving old code resident. Use
    `pgrep -f nginx-amplify-agent.py`, which matches the full process cmdline.


author: GetPageSpeed <info@getpagespeed.com> 1.8.15-2
changelog:
  - 1.8.15-2
  - Fix fresh CentOS/RHEL 7 installs from install.sh. Treat EL7 as a Python 3
    platform so the repo config points at the live /py3/ RPM repository, enable
    EPEL for EL7 Python 3 dependencies, and add the missing python3-requests
    runtime dependency for EL7.


author: GetPageSpeed <info@getpagespeed.com> 1.8.15-2
changelog:
  - 1.8.15-2
  - Fix fresh CentOS 7 / RHEL 7 installs of the agent, which were silently broken
    by two compounding bugs. (1) install.sh routed EL7 down the retired Python-2
    repo path (baseurl .../centos/7/... -> HTTP 404); EL7 now uses the Python-3
    path (.../py3/centos/7/...) like EL8+. (2) The RPM declared no runtime deps on
    EL7, so the agent started with `ModuleNotFoundError: No module named 'requests'`.
    Add an `%if 0%{?rhel} == 7` block requiring python3 + python3-requests.
    python3-requests is not in the EL7 base repos (only in EPEL), so install.sh now
    enables EPEL on EL7 before installing so the dependency resolves.


author: GetPageSpeed <info@getpagespeed.com> 1.8.16-1
changelog:
  - 1.8.16-1
  - Agent now logs admin broadcast messages returned by the cloud. The server
    (amplify-server, shipped 2026-06-15) already returned a `messages: []` array
    in its CloudResponse to POST /1.4/{api_key}/agent/, but the agent parsed and
    then silently dropped the field. supervisor.py now logs every non-empty
    message at INFO with an `amplify message: ` prefix, so Amplify-admin
    broadcasts are visible in /var/log/amplify-agent/agent.log.


author: GetPageSpeed <info@getpagespeed.com> 1.8.17-1
changelog:
  - 1.8.17-1
  - Report the EC2 instance region and availability zone alongside the existing
    instance ID in system metadata, allowing Amplify to identify cloud hosts on
    their detail pages.


