Operations

Troubleshooting

Start with apcli status and apcli doctor, then work through the symptoms below. Each entry says what to check and what the fix is.

Verified against auraPanel 1.21.3· Last updated 17 September 2026

First two commands

sudo apcli status      # is the daemon running, and which version
sudo apcli doctor      # audit every site's server block, PHP pool, docroot and certificate

apcli doctor is read-only and works whether or not the daemon is up. Exit code 0 means everything is consistent, 1 means drift was found, 2 means it could not run. -v prints every check; --json is for monitoring. Run it with sudo, or the certificate checks are skipped because the certificate directory is root-only.

The panel does not load

  1. sudo apcli status. If aurapaneld is inactive: sudo apcli restart, then apcli logs for the reason.
  2. If it is active but https://<ip>:8443 does not answer, the block is a provider firewall or security group without 8443. UFW on the host already allows it.
  3. After an update, if the panel looks broken or "offline", reload the page once; releases since 1.19.1 return a real 404 for stale assets so the browser's service worker refreshes itself. If the update itself failed, the updater rolls back automatically and writes why to /var/log/aurapanel-update.log.

A watchdog timer probes the panel's health every minute and restarts the daemon after three consecutive failures, so a stopped daemon usually recovers by itself within a few minutes.

Every change is refused with "a valid license is required"

The trial has ended or the licence has expired, been revoked or been unbound: the panel is read-only (HTTP 402 on any change). Sites keep running. Open Licence, press Refresh to re-check, or activate. During a network outage an activated panel keeps full access for 14 days. See trial and licence.

A site returns 502

  • PHP site: sudo apcli doctor. Two findings cause this: "vhost fastcgi_pass=… but pool listen=… (sockets diverge — every request will 502)", and a pool that "exists in MULTIPLE PHP versions" after a version switch. The doctor prints the fix for each; for drift, delete and recreate the site through the panel.
  • Node.js site: the app is not listening on PORT. The site's Backend card says so: "Your app keeps exiting (restarted N×) — it isn't listening on the port… Make sure your app listens on process.env.PORT." Check journalctl -u aurapanel-site-<domain> for the crash; common causes are a wrong entry file, a missing npm install, or a hard-coded port. Node.js sites.
  • Python site: gunicorn is missing or cannot import the module. The journal shows ModuleNotFoundError or the panel's "gunicorn is not installed at /usr/bin/gunicorn" message. Python sites.
  • Docker site: "Container is running but not answering HTTP on 127.0.0.1:<port>": the container port in the compose file must match what the app listens on inside the container, and the app must bind 0.0.0.0, not localhost. Docker Compose sites.

A PHP site returns an empty page with status 200

The server block and the PHP pool disagree about the site user: apcli doctor reports "DRIFT: vhost says user=X but pool says user=Y". Delete and recreate the site through the panel; sites created by current releases cannot get into this state.

HTTPS is not issued

The site's overview shows the last ACME error. Work through HTTPS certificates: DNS pointing elsewhere, port 80 blocked, or a Cloudflare proxy answering the challenge (switch to DNS-01). On the server: journalctl -u aurapaneld | grep acme. apcli doctor warns 30 days before a certificate expires and errors at 7.

Cloudflare shows error 525 or 520

Cloudflare reached the server, but the TLS handshake failed. The server completes handshakes only for hostnames it has a server block for; a hostname with no site (a forgotten subdomain, a domain you meant to redirect) is rejected at the handshake and Cloudflare reports 525. Create the site, or a redirect, for that hostname. A 520 or 525 on a hostname that does have a site usually means Cloudflare's SSL mode is not Full.

Cloudflare shows error 524 during an upload, import or restore

Cloudflare drops responses that take longer than about 100 seconds. The panel keeps long operations off that path: uploads are sent in 90 MB chunks with resume, and backups and restores run as background jobs you poll. If you are proxying the panel's own domain through Cloudflare and still see 524 on a long action, run the action from the server address instead, or leave the panel hostname unproxied (grey cloud).

"… step failed — open Logs → app for the details."

The dependency install or build for a Node.js site failed. The full output is in the site's Logs tab under app.

A framework site 403s or serves the wrong directory

Applications that serve from a subdirectory (Laravel and Moodle 5 use public/) need Settings → General → Document root set to that directory. Since 1.19.5 an override is honoured on every render.

A database or nginx is down

sudo apcli server status
sudo apcli server restart mariadb      # nginx, postgresql, redis-server, docker, php8.4-fpm …

The panel refuses to restart units it is not responsible for. Database actions in the panel report "MariaDB isn't running on this host. Start it from Instance → Services…" when this is the cause.

The server is slow and a service is restarting constantly

The Runaway services card on the Server page lists services the watchdog has flagged. Crash-looping services are already throttled to half a core; a CPU hog has a one-click Throttle. Find the cause in that unit's journal, fix it, then Remove cap. Runaway service watchdog.

Locked out of the panel

sudo apcli user list
sudo apcli user passwd admin@example.com --generate

Root on the server can always reset a panel password, in any licence state. Lost password or authenticator.

Start again

sudo aurapanel-uninstall removes the panel and everything it installed, including sites, their Linux users and home directories; --keep-databases preserves MariaDB and PostgreSQL. Back up first. A reinstall does not restart the 30-day trial.

Still stuck

Send the output of apcli status, apcli doctor -v and the relevant journal lines through the contact form. Customers can also reach us from the portal.

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 ↗