Operations

Logs and monitoring

Each site logs into its own directory; runtime services log to the journal under a predictable unit name; the panel records CPU, memory, disk and network history.

Verified against auraPanel 1.21.3· Last updated 17 September 2026

Site logs

Each site writes to its own directory, owned by the site user:

FileContents
/home/<user>/logs/access.lognginx access log for the site's domain.
/home/<user>/logs/error.lognginx errors for the site, including upstream failures (502, 504).
/home/<user>/logs/app.logApplication output where the runtime writes a file.

Rotation is daily, keeping 14 compressed archives (access.log.1, access.log.2.gz …), configured per site in /etc/logrotate.d/<user>. nginx is reloaded after each rotation. Log files under the document root are never served: every server block denies *.log.

The Logs tab

The site's Logs tab shows the last 500 lines of the chosen source, with:

  • a source switch: access, error, app (Node.js and Python journal), or docker (compose logs);
  • level chips (2xx/3xx/4xx/5xx for access; error/warn/notice for error) and a text filter;
  • Older / Newer to step back through rotated days;
  • Live, which refreshes every 4 seconds and follows the end;
  • select, Copy and Download as <domain>-<kind>-<date>.log.

Node.js, Python and Docker service logs

Runtime processes log to the systemd journal under the site's unit. The journal keeps about seven days by default.

journalctl -u aurapanel-site-example.com -n 200 --no-pager
journalctl -u aurapanel-site-example.com -f            # follow
docker compose -p <project> logs --tail 200            # Docker sites

Panel and update logs

apcli logs          # last 200 lines of the panel daemon
apcli logs -f       # follow
journalctl -u aurapaneld | grep acme       # certificate issuance
cat /var/log/aurapanel-update.log          # self-update runs

Resource history

The panel samples the server once a minute, directly from /proc: CPU (I/O wait counted as idle), load, memory and swap, disk on /, and network bytes on physical interfaces (Docker bridges and virtual interfaces excluded). Samples are kept for six months.

Resources shows windows of 24 hours, 7 days, 30 days and 6 months, each drawn from about 90 aggregated points; the latest point is labelled by its bucket ("last 15 min", "last 2 h") and gaps are shown as gaps, never interpolated. By site attributes CPU and memory to sites by their Linux user every five minutes, and disk by document-root size nightly, with an explicit "other" remainder for nginx, the database engines and the panel, which cannot be pinned to one site.

Site health

The site list shows Online, Provisioning, Degraded, Offline or Stopped, refreshed in the background every 45 seconds from a signal appropriate to the type: the systemd unit state and restart count for Node.js, Python and Docker; the PHP-FPM service for PHP; nginx for static sites; an upstream probe for reverse proxies. The rule is that uncertainty never downgrades a site: only confirmed problems do.

Optional deep checks add specific warnings: a Health check path you set on the site's Backend card is probed on the loopback port ("Health check failing"); a database the panel created but the engine no longer has ("Database missing"); a Node site with package.json but no node_modules ("Deps missing"); and a service the runaway watchdog has flagged ("Worker crash-looping", "Worker high CPU").

Services

Services lists the units the panel is responsible for, with start, stop and restart: nginx, each PHP-FPM version, MariaDB, PostgreSQL, Redis, Docker, Typesense and fail2ban. The panel daemon itself is shown but restarted with apcli restart.

sudo apcli server status
sudo apcli server restart nginx

Runaway service watchdog

Every 45 seconds the panel reads CPU time and restart counts for every systemd service. A service that restarts three or more times in two consecutive sweeps is a crash loop and is automatically throttled to half a CPU core (lifted after about 7.5 minutes of calm) with a persistent back-off drop-in. A service holding 85 percent of a core for four sweeps is reported as a CPU hog with a one-click Throttle, never throttled automatically. The panel daemon, SSH, systemd's own units and D-Bus are never touched.

Administrators receive one email per unit per 24 hours when a watchdog alert is confirmed, if outgoing email is configured. This is the panel's only alerting channel; there are no threshold alerts for CPU, memory, disk or certificate expiry.

Try the live demo

A real auraPanel on a real server, shared with everyone. Sign in with the demo account and click around.

Email
demo@goaura.one
Password
demo1234
Open the demo panel ↗

Shared public demo, so please don’t put anything personal in it. More about the demo →

Talk to us

Tell us what you need and how to reach you. A person reads this, not a queue.

We use these details only to reply to you. Privacy

Recent updates

What shipped in the last releases. With automatic updates on, each lands on your server the moment it is published.

  1. v1.21.3
    Framework sites were undetectable, and a restore could silently point the copy at the original's live database.

    DetectApp looked for each application's signature relative to the docroot — but every PHP framework in the registry serves from a subdirectory (DocrootSub: public, webroot, web, pub, docroot) and keeps the file that identifies it one level *above* that. So the Laravel signature searched <project>/public/artisan,…

  2. v1.21.2
    Restarting nginx now blocks the panel and reconnects, instead of showing a notice.

    v1.21.1 stopped the false "HTTP 520" but only put up a toast — and a toast is the wrong affordance when the panel itself is about to go away: the page sat there looking broken while every request failed underneath it.

  3. v1.21.1
    Restarting nginx from Services no longer reports a false failure.

    It showed "Restart failed — HTTP 520". The panel is reverse-proxied *by* nginx, so the request deadlocked against itself: the handler blocked waiting for the restart to finish, while nginx's graceful stop waited for that very request to drain. Neither could proceed until nginx's stop-retry timeout force-killed it,…

  4. v1.21.0
    Per-site X-Frame-Options, fixing page builders that couldn't load their preview.

    Elementor's editor failed with *"Multiple 'X-Frame-Options' headers with conflicting values ('DENY, SAMEORIGIN')"*. The cause is that nginx's add_header appends rather than replaces: when the application also sets the header — a WordPress security plugin, or a CDN transform — the browser received two values,…

  5. v1.20.6
    The multi-database restore refusal now says what is in the backup and what still works.

    It read only "Restoring a multi-database site isn't supported yet", which is a dead end: it named neither the databases involved, nor why one of them is the limit, nor any route forward.

  6. v1.20.5
    Services: cards in a row now match heights.

    Like the settings grid before it, the Services grid pinned each card to its own content height, so a row often showed one card noticeably shorter than the card beside it. Each row now takes the taller card's height and both fill it, and it re-balances as content changes — a runtime installed, a longer service list.

  7. v1.20.4
    Settings: paired cards now match heights.

    Organisation / Panel Domain and auraPanel Updates / Session timeout each sat at their own content height, so a row showed one card visibly shorter than its neighbour. Each row now takes the taller card's height and both fill it — driven by content, not a fixed value, so it still adapts as a card grows (a validation…

  8. v1.20.3
    Settings: Organisation and Panel Domain now share a row too.

    They were full-width blocks stacked above the rest of the page; they now sit side by side in the same two-column grid as the Updates / Session timeout pair, so the top of Settings reads as two tidy rows instead of four stacked bands. Both cards shrink cleanly — the logo drop zone is a fixed 44×44 and the name field…

All releases on GitHub ↗