Sign inSign up

hieutq/aapanel

By hieutq

•Updated about 2 months ago

aaPanel in Docker: panel-only, single /www volume, multi-arch, no-privileged, auto-updated daily

Image
Web servers
1

1.1K

hieutq/aapanel repository overview

⁠aaPanel — Docker

Build and Push Check for Updates Docker Pulls Docker Image Size License: MIT

A clean, production-minded Docker packaging of aaPanel⁠ — the free, open web hosting control panel for Linux. One container, one volume, no privileged mode, multi-architecture, and rebuilt automatically every day to track the latest official aaPanel release.

This is an unofficial community image. aaPanel itself is developed by its respective owners; this repository only packages it for Docker.

⁠Why this image

  • 🧱 Panel-only, lightweight — ships the aaPanel core only. Install Nginx, Apache, MySQL, PHP, Redis, FTP and the rest from the panel UI, on demand — so the base image stays small and your stack stays exactly what you choose.
  • 💾 Single volume — all state lives under one /www volume. Easy to back up, move, or snapshot.
  • 🔓 No privileged: true — runs as an ordinary container with a plain process model (no systemd-in-Docker gymnastics, no host cgroup mount).
  • 🏗️ Multi-arch — native linux/amd64 and linux/arm64 images behind a single tag.
  • 🔄 Auto-updated daily — a scheduled pipeline checks the official aaPanel version API every day, and rebuilds + republishes when a new stable release ships. Image tags track the upstream version (e.g. 8.0.3).
  • 🔐 Secure by default — generates a random username, password, and secured entry path on first run, and prints them to the container logs.

⁠Supported Tags

TagDescription
latestMost recent stable aaPanel release
8.0.3, 8.0.2, …Pinned to a specific aaPanel version

Each version tag is a multi-arch manifest covering amd64 and arm64.

⁠Quick Start

git clone https://github.com/toquanghieu/aapanel-docker.git
cd aapanel-docker
cp .env.example .env          # optional — tweak the port or set fixed credentials
docker compose up -d
⁠Docker Run
docker run -d \
  --name aapanel \
  -p 8888:8888 \
  -p 80:80 -p 443:443 \
  -v aapanel_data:/www \
  --restart unless-stopped \
  hieutq/aapanel:latest
⁠Get your login details

On the first start the panel generates a random username, password, and a secured entry path, then prints them to the logs:

docker logs aapanel
============================================================
  aaPanel is ready
------------------------------------------------------------
  URL (host):      http://<your-server-ip>:8888/a1b2c3d4
  Username:        aapanel_x7f9k2
  Password:        3f8a1c9e2b7d4a06
------------------------------------------------------------

Open the printed URL and log in. The credentials are also stored inside the volume at /www/.aapanel-credentials, and you can always re-display panel info from inside the container:

docker exec -it aapanel bt 14

To set fixed credentials instead, provide the environment variables below before the first start.

⁠Environment Variables

All variables are optional. Credentials left unset are generated randomly on first run.

VariableDefaultDescription
AAPANEL_PORT8888Panel web UI port
AAPANEL_USERNAMErandomPanel login username
AAPANEL_PASSWORDrandomPanel login password
AAPANEL_ENTRYrandomSecured entry path, e.g. /my-secret-entry
AAPANEL_SSLoffServe the panel over HTTPS (on/off)

These apply only on first run, when the panel is initialized. To change them later, use the panel UI or the bt CLI inside the container.

⁠Ports

PortPublished by defaultDescription
8888✅aaPanel web UI
80✅HTTP — your websites (once a web server is installed)
443✅HTTPS
888—phpMyAdmin
21 / 20—FTP (control / data)
3306—MySQL

The non-panel ports only carry traffic once you install the matching service from the panel. Publish them by uncommenting the relevant lines in docker-compose.yml (or adding -p flags) when you need them.

⁠Data Persistence

Everything aaPanel manages lives under a single /www volume:

PathContents
/www/server/panelPanel application, config, and database
/www/wwwrootYour website files
/www/server/dataMySQL data (after you install MySQL)
/www/server/*Other services you install (Nginx, PHP, …)

Back up by snapshotting the aapanel_data volume. To use a host bind mount instead, replace aapanel_data:/www with ./www:/www in the compose file and drop the trailing volumes: block.

⁠Installing a Web Stack

This image intentionally ships only the panel. After logging in:

  1. Go to the panel's home page; it will offer a recommended stack.
  2. Pick LNMP (Nginx) or LAMP (Apache) — or install components à la carte from App Store → Runtime / Web Server / Database.
  3. Add your site under Website, then publish ports 80/443 (and 3306, 888, 21 as needed) on the container.

⁠Security

  • Random username, password, and secured entry path on first boot — no well-known default credentials.
  • Runs without privileged: true and without mounting the host cgroup.
  • Change the panel port and entry path, and enable HTTPS + two-factor auth from the panel's Settings page for any internet-facing deployment.
  • Restrict access to the panel port (8888) with a firewall or reverse proxy.

⁠Troubleshooting

Lost your password?

# Re-display panel info (URL, user, entry path):
docker exec -it aapanel bt 14
# Reset the password:
docker exec -it aapanel bt 5

Panel not reachable? Confirm the daemon is up and you are hitting the secured entry path (the URL suffix from the logs), not just the bare port:

docker logs aapanel
docker exec -it aapanel /etc/init.d/bt status

A service you installed (Nginx/MySQL) isn't reachable from the host. Make sure its port is published on the container — add the -p flag (or compose line) and recreate the container.

⁠How It Works

  1. The Dockerfile installs aaPanel into a clean ubuntu:22.04 base using the official installer, then packs /www into a compressed first-run seed.
  2. On first start the entrypoint seeds the /www volume, sets the port and secured entry path, generates (or applies) credentials, and starts the panel daemon — no systemd required.
  3. A daily GitHub Actions workflow polls the official aaPanel version API. When a new stable release appears, it bumps the version, tags vX.Y.Z, and triggers a multi-arch build that publishes :X.Y.Z and :latest to Docker Hub and refreshes this description automatically.

⁠Building Locally

git clone https://github.com/toquanghieu/aapanel-docker.git
cd aapanel-docker
docker build -t hieutq/aapanel:local .
docker run -d --name aapanel -p 8888:8888 -v aapanel_data:/www hieutq/aapanel:local
docker logs aapanel        # grab the generated credentials

⁠License

MIT⁠. aaPanel is a trademark of its respective owners; this project is not affiliated with or endorsed by aaPanel.

Tag summary

Content type

Image

Digest

sha256:d897434e9…

Size

382.2 MB

Last updated

about 2 months ago

docker pull hieutq/aapanel