Self-hosted Docker deployment panel — Compose stacks, automatic HTTPS, domains, and ops from one clean UI.
GitHub: github.com/masudranaxpert/NextDeploy
Docker Hub: hub.docker.com/r/masudranaxpert/nextdeploy
PHP hosting template (multi-version FPM, MySQL, phpMyAdmin, per-user limits) lives on the
php-panelbranch — not included inmain.
One command downloads docker-compose.yml, creates /data, pulls images, starts Caddy + panel, optionally registers systemd auto-start, and installs nextdeploy-update / nextdeploy-logs helpers.
curl -fsSL https://raw.githubusercontent.com/masudranaxpert/NextDeploy/main/install.sh | sudo bashWith install options:
curl -fsSL https://raw.githubusercontent.com/masudranaxpert/NextDeploy/main/install.sh | sudo bash -s -- --domain panel.example.com --email admin@example.comOr clone the repo and run locally:
git clone https://github.com/masudranaxpert/NextDeploy.git
cd NextDeploy
sudo bash install.sh| Option | Description |
|---|---|
--domain <host> |
Shown in the success summary (configure DNS + HTTPS in the panel after install) |
--email <addr> |
Reminder for Let's Encrypt / ACME email (set in panel settings when ready) |
--dir <path> |
Install directory (default: /opt/nextdeploy) |
--data-dir <path> |
Host data path patched into compose (default: /data) |
--help |
Usage |
Examples:
sudo bash install.sh --domain panel.example.com --email admin@example.com
sudo bash install.sh --dir /srv/nextdeploy --data-dir /mnt/nextdeploy-dataAfter install, open http://<server-ip>:8080 and create the first admin user.
Interactive (you must type yes to confirm):
curl -fsSL https://raw.githubusercontent.com/masudranaxpert/NextDeploy/main/uninstall.sh | sudo bashNon-interactive / force (no confirmation prompt): arguments after curl … | bash are not passed to the script unless you use bash -s --. The -- ends bash options; everything after it is passed to uninstall.sh:
curl -fsSL https://raw.githubusercontent.com/masudranaxpert/NextDeploy/main/uninstall.sh | sudo bash -s -- --forceSame idea with --keep-data:
curl -fsSL https://raw.githubusercontent.com/masudranaxpert/NextDeploy/main/uninstall.sh | sudo bash -s -- --force --keep-dataIf you already saved the script on disk:
sudo bash uninstall.sh --keep-data
sudo bash uninstall.sh --force| Option | Description |
|---|---|
--keep-data |
Keeps the data directory (workspaces, SQLite DB, uploads) |
--force / -f |
Skip the interactive yes confirmation |
--dir, --data-dir |
Must match your install if non-default |
| Command | Purpose |
|---|---|
nextdeploy-update |
docker compose pull + up -d in the install directory |
nextdeploy-logs |
docker compose logs -f --tail=100 |
systemctl status nextdeploy |
Systemd unit status (if enabled during install) |
mkdir -p /data
curl -fsSL https://raw.githubusercontent.com/masudranaxpert/NextDeploy/main/docker-compose.yml \
-o docker-compose.yml
docker compose up -dOr from a clone:
git clone https://github.com/masudranaxpert/NextDeploy.git
cd NextDeploy
docker compose up -dFor a local Dockerfile build instead of Docker Hub:
mkdir -p data/workspaces
docker compose -f docker-compose.local.yml up -d --builddocker pull masudranaxpert/nextdeploy:latestOpen http://localhost:8080 — first visit creates the admin account.
- Deploy apps — Upload a ZIP or files, configure
docker-compose.yml, deploy with one click - Automatic HTTPS — Caddy reverse proxy with Let's Encrypt / ZeroSSL via labels (caddy-docker-proxy)
- Domain routing — Per-app domains; the panel generates Caddy labels and merges them into the generated compose file
- File manager — Browse, upload, view, and delete workspace files in the browser
- Live deploy logs — Real-time output while Docker Compose runs
- Container logs — Tail with level filtering, timestamps, and download
- Docker resources — List and remove containers, images, and volumes
- Scheduled cleanup — Auto-prune unused Docker data on a configurable interval
- Multi-user auth — First-run admin; admins manage users and roles
- Responsive UI — Works on phones and tablets
- Linux host (install script target); Docker 24+ and Compose V2
- Ports 80, 443, and 8080 (panel UI) available
Common issues (including Cloudflare upload limits and volume restore workarounds) are documented in docs/troubleshooting.md.
Short version: If the panel is behind Cloudflare proxy (orange cloud), uploads are capped at the edge (typically 100 MB on Free/Pro). Large volume backup restores may stall or fail through the public domain. Use http://<server-ip>:8080 (or your configured port) to reach the panel directly, or use a DNS-only hostname for uploads. The panel itself allows up to 2 GiB request bodies for restore.
Persistent state uses the host /data bind mount (or your --data-dir): SQLite at /data/panel.db, workspaces under /data/workspaces.
| Variable | Default | Description |
|---|---|---|
DATA_DIR |
/data |
Panel data root inside the container |
WORKSPACES_ROOT |
/data/workspaces |
App file storage |
LISTEN_ADDR |
:8080 |
Panel HTTP listen |
PANEL_DEV |
false |
Reload templates on every request (dev only) |
The panel writes Caddy labels into .nextdeploy.generated.compose.yml. Add domains from the Domains tab — no hand-written Caddyfile for app routing. For local-style names (.test, .localhost, etc.) the panel can use internal TLS when HTTPS is enabled.
New releases are published when a version tag is pushed:
git tag v1.0.0
git push origin v1.0.0GitHub Actions will:
- Build a multi-arch Docker image (
linux/amd64+linux/arm64) - Push it to Docker Hub with version tags (
v1.0.0,latest) - Create a GitHub Release with auto-generated changelog
- Clean up old Docker Hub tags (keeps the 5 most recent)
MIT — see LICENSE.
