Docker Compose

Run container stacks behind the same panel as everything else.

A Docker Compose site gets a domain, nginx in front, an automatic certificate, logs and backups — next to your PHP, Node.js and Python sites, on a Debian or Ubuntu server you own.

Composeyour own file, or a generated one from a single image
HTTPSnginx in front, Let's Encrypt issued automatically
127.0.0.1containers publish to loopback only; nginx is the public face
Same panelnext to PHP, Node.js and Python sites on one server

A container stack as a site

A Docker Compose site is a reverse-proxy site whose upstream is a container stack. The panel allocates a loopback port and hands it to your compose file as AURA_PORT, runs docker compose up in the foreground under a systemd unit it manages, and renders an nginx server block that proxies the domain to that port with a Let's Encrypt certificate. The compose file and a .env live in the site's directory, owned by the site's Linux user, and you edit them like any other file.

Nothing else changes: the same domain handling, certificates, redirects, basic authentication, logs, edge shield and backups apply to a Docker site as to every other site on the server.

Two ways to create one

Create returns quickly; the image pull runs in the background and the site shows the panel's placeholder until the stack is up. Then Up, Down, Restart, Pull and Recreate are one click each, and docker compose logs is on the Logs tab. Docker Compose sites →

  • Single image. Give the image, the container port, environment variables as KEY=value lines and optionally a host port; the panel writes the compose file. Good for Ghost, Umami, Uptime Kuma, Gitea, n8n and any other application that ships as one image.
  • Compose file. Paste your own YAML for multi-service stacks: a web service with its database, cache and worker. The only requirement is that the web service publishes to 127.0.0.1:${AURA_PORT}:<container-port>.

Guardrails the panel enforces

All stacks share the host's Docker daemon, so the panel checks every compose file before it starts anything and refuses the settings that would let a container reach the host:

  • Publishing a port on any address other than 127.0.0.1.
  • privileged: true, network_mode: host, pid: host.
  • Capabilities that allow escape, and bind-mounting / or the Docker socket.
  • A stack with no service publishing the proxy port.
  • Administrators only
  • Loopback publishing only
  • Compose file validated before start

Alongside everything else

Most servers are not all containers. A typical auraPanel host runs a WordPress site, a Laravel application on PHP-FPM, a Node.js API as a systemd service and one or two container stacks, each on its own domain with its own certificate and its own Linux user, all in one list. When something ships as an image, run it as a Docker site; when it is a PHP, Node.js or Python codebase, run it natively and skip the container. Reverse-proxy sites cover services you run yourself outside the panel.

Data, backups and updates

Keep persistent data in a bind mount under the site's directory rather than a named volume: site backups archive the directory, and the restore wizard brings it back. Updating an application is Pull then Recreate. Deleting the site removes its containers, network, named volumes and images. Docker itself is installed by the panel's installer or later from the Services screen.

What this is not

  • Not a container orchestrator or a Portainer replacement. The unit is a site with a domain; the panel does not expose arbitrary container management.
  • Not per-site Docker isolation. Stacks share the daemon, which is why only administrators can create Docker sites.
  • No CPU or memory quotas set by the panel; declare them in your compose file.
  • No registry credential management; docker login on the host for private images.
  • The Databases tab and page cache are hidden for Docker sites; run the database inside the stack, or use a panel database from another site.

Frequently asked

Can a container talk to a MariaDB or PostgreSQL database managed by the panel?

Panel databases listen on the host's loopback interface. From a container that means the host gateway address rather than localhost, and the database user is granted access from 127.0.0.1 and localhost only, so in practice run the database inside the stack, or use a Docker site for the application and a PHP or Node.js site's database when both run natively.

Does the panel expose ports 80 and 443 to the container?

No. nginx owns 80 and 443 for every site on the server and proxies your domain to the container's loopback port; the container never binds a public port.

Which images work?

Any image that serves HTTP on a port you can map. The application inside must bind 0.0.0.0, not localhost, or nginx will get a 502.

Is Docker included in the licence?

Yes. Docker Compose sites are a site type like any other; one licence covers the server and everything on it. Pricing →

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 ↗