Deployment
OrbitPage can be deployed with Docker, the Linux installer, or the Proxmox VE installer.
OrbitPage can be deployed with Docker, the Linux installer, or the Proxmox VE installer.
Docker (recommended)
| Registry | Image |
|---|---|
| Docker Hub | paoloronco/orbitpage |
| GitHub Container Registry | ghcr.io/paoloronco/orbitpage |
Use:
latestfor the current stable release;X.Y.Zto pin a specific release;@sha256:DIGESTto pin an exact image.
Replace version and digest placeholders with actual release values. Docker automatically selects the amd64 or arm64 image.
OrbitPage also runs on Docker-based hosting platforms. Use one replica and a writable, persistent local volume at /app/data; keep that volume when replacing the container. Configure HTTPS and a /health check on the platform. Stateless storage and shared multi-replica SQLite are unsupported.
Docker Run (recommended)
docker pull paoloronco/orbitpage:latest
docker run -d \
--name orbitpage \
--restart unless-stopped \
-p 8080:8080 \
-v orbitpage-data:/app/data \
--security-opt no-new-privileges:true \
paoloronco/orbitpage:latest
Open the dashboard and choose a password for the admin.
The public page is at http://device_ip:8080.
Change the port or data mount in the command if needed.
Docker options
--name orbitpage: names the containerorbitpagefor later commands.--restart unless-stopped: restarts after failures or Docker restarts, unless you stopped the container.-p 8080:8080: publishes port 8080 on all host interfaces;-p 127.0.0.1:8080:8080restricts it to the host.-v orbitpage-data:/app/data: stores the database, uploads, and generated secret in a persistent named volume.--security-opt no-new-privileges:true: prevents container processes from gaining additional privileges.
GHCR
docker pull ghcr.io/paoloronco/orbitpage:latest
docker run -d \
--name orbitpage \
--restart unless-stopped \
-p 8080:8080 \
-v orbitpage-data:/app/data \
--security-opt no-new-privileges:true \
ghcr.io/paoloronco/orbitpage:latest
Open the dashboard and choose a password for the admin.
The public page is at http://device_ip:8080.
Change the port or data mount in the command if needed.
The Docker options are the same; only the image address changes.
Docker Compose
Clone the repository and start the included configuration:
git clone https://github.com/paoloronco/OrbitPage.git
cd OrbitPage
docker compose up -d
| Setting | Default |
|---|---|
| Published port | 8080:8080 (all host interfaces) |
| Persistent data | ./orbitpage-data |
| Restart policy | unless-stopped |
Open the dashboard and choose a password for the admin. The public page is at http://device_ip:8080.
Edit docker-compose.yml to change the image, port, environment, or storage path.
Replace device_ip with the Docker host's LAN address. For local-only access, change the port mapping to "127.0.0.1:8080:8080" and use localhost in the URLs.
Optional setup token
To add a token to the first admin setup:
| Installation | Enable before startup | Read the token |
|---|---|---|
| Docker Run | Add -e REQUIRE_SETUP_TOKEN=true |
docker exec orbitpage cat /app/data/.setup-token |
| Docker Compose | Set REQUIRE_SETUP_TOKEN: "true" under environment |
docker compose exec orbitpage cat /app/data/.setup-token |
| Linux installer | Add --require-setup-token |
sudo cat /var/lib/orbitpage/.setup-token |
| Proxmox installer | Add --require-setup-token |
pct exec CTID -- cat /var/lib/orbitpage/.setup-token |
Enter the token when choosing the admin password. It can be used once.
Older Docker Hub images
The former paueron/orbitpage feed stops receiving updates on October 9, 2026. Use paoloronco/orbitpage with the same data mount. Installer-managed latest deployments migrate with sudo orbitpage update; manual deployments follow Updating OrbitPage. Replace old standalone orbitpage-update helpers from the current official image before using them.
Linux installer
Use a Debian 12/13 or Ubuntu 22.04/24.04/26.04 server, VM, or LXC on amd64 or arm64. For other Linux distributions, Windows, or macOS, use Docker with Linux containers.
sudo apt-get update
sudo apt-get install -y git
git clone https://github.com/paoloronco/OrbitPage.git
cd OrbitPage
sudo ./install.sh
The installer:
- installs Docker and Docker Compose when required;
- deploys the OrbitPage container;
- creates persistent storage;
- stores runtime secrets with restricted permissions;
- installs the
orbitpagemanagement command; - preserves existing data and secrets and creates a backup when run again.
Open http://SERVER_IP:8080/dashboard/profile and choose a password for the admin. The public page is at http://SERVER_IP:8080. Replace SERVER_IP with the server's LAN address shown by the installer.
Paths
| Location | Default |
|---|---|
| Application data | /var/lib/orbitpage |
| Runtime secrets | /etc/orbitpage/orbitpage.env, mode 0600 |
| Installer configuration | /opt/orbitpage |
| Backups | /var/backups/orbitpage |
| HTTP listener | 0.0.0.0:8080 (all IPv4 interfaces) |
Available commands
sudo orbitpage status
sudo orbitpage logs
sudo orbitpage start
sudo orbitpage stop
sudo orbitpage restart
sudo orbitpage config
sudo orbitpage backup
sudo orbitpage update
sudo orbitpage uninstall
Backup, restore, rollback, and uninstall procedures are in Maintenance.
Installation options
Set overrides before running the installer:
sudo ORBITPAGE_HTTP_PORT=8090 \
ORBITPAGE_PUBLIC_SITE_URL=https://page.example.com \
./install.sh
| Variable | Default | Purpose |
|---|---|---|
ORBITPAGE_HTTP_PORT |
8080 |
Host port |
ORBITPAGE_BIND_ADDRESS |
0.0.0.0 |
Host listener address; 127.0.0.1 limits access to the host |
ORBITPAGE_PUBLIC_SITE_URL |
Empty | Public HTTPS URL |
ORBITPAGE_IMAGE |
GHCR latest |
Image tag or digest |
ORBITPAGE_DATA_DIR |
/var/lib/orbitpage |
Data directory |
ORBITPAGE_CONTAINER_NAME |
orbitpage |
Container name |
ORBITPAGE_REQUIRE_SETUP_TOKEN |
false for new installs |
Host token for setup |
LAN and loopback
New Linux and Proxmox installations listen on all IPv4 interfaces. To limit HTTP access to the Linux host or the Proxmox guest, set ORBITPAGE_BIND_ADDRESS=127.0.0.1:
# Linux
sudo ORBITPAGE_BIND_ADDRESS=127.0.0.1 ./install.sh
# Proxmox host, when creating the LXC
ORBITPAGE_BIND_ADDRESS=127.0.0.1 ./install-pve.sh
Existing Linux installations keep their saved bind address. To enable LAN access, rerun the current installer from its checkout:
sudo ORBITPAGE_BIND_ADDRESS=0.0.0.0 ./install.sh
Reinstalling keeps the data and secrets. In Proxmox, loopback refers to the LXC itself.
Proxmox VE
The installer creates a dedicated unprivileged Debian 12 LXC and installs OrbitPage inside it.
Use an x86-64 Proxmox VE 8+ host with patched lxc-pve: at least 6.0.0-2 on PVE 8, or 6.0.5-2 on PVE 9+. Run as root:
apt-get update
apt-get install -y git
git clone https://github.com/paoloronco/OrbitPage.git
cd OrbitPage
./install-pve.sh
| Resource | Default |
|---|---|
| CPU | 2 cores |
| RAM | 2048 MB |
| Swap | 512 MB |
| Disk | 12 GB |
| Network | vmbr0, DHCP |
| Container | Unprivileged Debian 12 LXC |
| Features | nesting=1,keyctl=1 |
Docker, the database, uploads, and application secrets remain inside the LXC. HTTP is reachable on the guest's LAN address.
Open http://GUEST_IP:8080/dashboard/profile and choose a password for the admin. The public page is at http://GUEST_IP:8080. Use the LXC address shown by the installer for GUEST_IP.
Customize the LXC
Set variables before running the script:
ORBITPAGE_PVE_MEMORY=4096 \
ORBITPAGE_PVE_SSH_PUBLIC_KEY=/path/to/id_ed25519.pub \
./install-pve.sh
| Variable | Default | Purpose |
|---|---|---|
ORBITPAGE_PVE_CTID |
Next free cluster ID | New LXC ID |
ORBITPAGE_PVE_HOSTNAME |
orbitpage |
Guest hostname |
ORBITPAGE_PVE_CORES |
2 |
CPU cores |
ORBITPAGE_PVE_MEMORY |
2048 |
RAM in MB |
ORBITPAGE_PVE_SWAP |
512 |
Swap in MB |
ORBITPAGE_PVE_DISK_GB |
12 |
Root disk size in GB |
ORBITPAGE_PVE_ROOTFS_STORAGE |
First active rootdir storage | Root disk storage |
ORBITPAGE_PVE_TEMPLATE_STORAGE |
First active vztmpl storage | Template storage |
ORBITPAGE_PVE_TEMPLATE |
Latest Debian 12 amd64 | Template filename |
ORBITPAGE_PVE_BRIDGE |
vmbr0 |
Network bridge |
ORBITPAGE_PVE_IP |
dhcp |
DHCP or static IPv4 CIDR |
ORBITPAGE_PVE_GATEWAY |
Empty | Static IPv4 gateway |
ORBITPAGE_PVE_VLAN |
Empty | VLAN tag, 1–4094 |
ORBITPAGE_PVE_FIREWALL |
1 |
Network-interface firewall flag |
ORBITPAGE_PVE_SSH_PUBLIC_KEY |
Empty | Host path to a key authorized for guest root |
ORBITPAGE_HTTP_PORT |
8080 |
OrbitPage port inside the guest |
ORBITPAGE_BIND_ADDRESS |
0.0.0.0 |
Guest listener address; see LAN and loopback |
ORBITPAGE_PUBLIC_SITE_URL |
Empty | Public HTTPS URL |
ORBITPAGE_IMAGE |
GHCR latest |
Image tag or digest |
ORBITPAGE_REQUIRE_SETUP_TOKEN |
false for new installs |
Host token for setup |
ORBITPAGE_PVE_WAIT_ATTEMPTS |
90 |
Guest-start polling attempts |
ORBITPAGE_PVE_WAIT_SECONDS |
2 |
Seconds between attempts |
The firewall flag does not enable Proxmox firewall layers or add allow rules. If the Proxmox firewall is enabled, allow your HTTP port for LAN access.
Reverse proxy and HTTPS
Point your HTTPS reverse proxy at OrbitPage's HTTP address, such as http://127.0.0.1:8080 when both run on the same host.
| Setting | What to configure |
|---|---|
| HTTPS | Use a valid certificate at the proxy |
| Public URL | Set PUBLIC_SITE_URL to your public HTTPS address |
| Forwarded headers | Pass the original host, protocol, and client IP: Host, X-Forwarded-Proto, X-Forwarded-For |
| Proxy trust | Set ORBITPAGE_TRUST_PROXY only to the trusted proxy addresses or CIDRs |
| Cache | Exclude /api/*, /dashboard/*, /health, and localized dashboard paths such as /en-US/dashboard/* |
| Uploaded media | Forward /uploads/* to OrbitPage |
For a proxy on the same host, you can restrict HTTP to loopback. In Proxmox, a proxy inside the LXC can use 127.0.0.1; a proxy on the PVE host uses the guest's LAN address.
ENABLE_HTTPS=true enables a self-signed listener and is usually unnecessary behind the proxy. See Configuration for proxy variables and subdirectory hosting.
Updating OrbitPage
Back up before updating. Keep the existing data mount and secrets; use Maintenance for backup and rollback procedures.
Linux and Proxmox
For installer-managed deployments using latest:
sudo orbitpage update
From the Proxmox host:
pct exec CTID -- orbitpage update
Pinned images stay pinned. To select a new digest, use sudo ORBITPAGE_IMAGE=IMAGE@sha256:NEW_DIGEST orbitpage install with the actual image and digest.
Docker Compose updates
Run from the existing Compose project directory:
docker compose pull
docker compose up -d
Docker Run updates
Pull the new image and recreate the container with the same volume, ports, and environment. For the Docker Run example above:
docker pull paoloronco/orbitpage:latest
docker stop orbitpage
docker rm orbitpage
docker run -d \
--name orbitpage \
--restart unless-stopped \
-p 8080:8080 \
-v orbitpage-data:/app/data \
--security-opt no-new-privileges:true \
paoloronco/orbitpage:latest
Use your original settings if they differ. Removing the container keeps its named volume; do not delete the volume.
Web updates
In Account → General → Instance details, click Check for updates, then Install update…. The Linux/Proxmox installer enables the host update service for official latest images on systemd hosts. Without that service, the dialog shows terminal instructions.
For an existing Docker Run or Compose container, install the service with:
git clone https://github.com/paoloronco/OrbitPage.git
sudo ./OrbitPage/install.sh web-updates orbitpage
Replace orbitpage with the actual container name. The service requires Python 3, systemd, an official latest image, and a writable persistent /app/data mount. Source installations, custom images, and pinned releases use terminal updates.
Dashboard installation requires an administrator's current password. OrbitPage does not receive the Docker socket or sudo access. If an update result is unconfirmed, inspect the service and retained backup as described in Troubleshooting.
Verify the update
Run on the Docker host, or inside the LXC for Proxmox:
curl -fsS http://127.0.0.1:8080/health
Use your configured port if it differs. Also check dashboard login, the public page, and uploaded media.
Next steps
- Configuration: environment variables and application settings.
- Maintenance: backups, restore, rollback, and removal.
- Troubleshooting: deployment and proxy issues.
- Run from source: source installation.