A lightweight, self-hosted PaaS — deploy your apps from Git with automatic SSL, health checks, and webhooks. Built with Rust + SvelteKit, targeting <50MB RAM idle.
Think Coolify, but leaner.
- One-command deploy — push to Git, Ployer builds and deploys automatically
- Automatic SSL — via Caddy + Let's Encrypt, zero config
- Webhooks — GitHub and GitLab push events trigger auto-deploys
- Health checks — HTTP polling with auto-restart on failure
- Container stats — CPU, memory, and network I/O monitoring
- Real-time logs — WebSocket streaming for build and runtime logs
- Multi-server — manage apps across multiple servers
- Encrypted secrets — environment variables encrypted at rest (AES-256-GCM)
| Minimum | Recommended | |
|---|---|---|
| OS | Ubuntu 22.04 / Debian 12 | Ubuntu 24.04 LTS |
| RAM | 1 GB | 2 GB+ |
| CPU | 1 vCPU | 2 vCPU |
| Disk | 20 GB | 40 GB+ |
| Arch | x86_64 | x86_64 / arm64 |
Prerequisites: Docker must be installed and running before installing Ployer.
Important: Install on a fresh, dedicated server. Ployer owns ports 80 and 443 via Caddy. It will conflict with Nginx, Apache, Coolify, or any other reverse proxy already running on those ports.
Point your domain's DNS A record to your server IP first, then run:
curl -fsSL https://ployer.nusendra.com/install.sh | sudo bashNote:
curl | bashruns in non-interactive mode and will auto-detect your server IP. To use a custom domain with HTTPS, download and run the script directly:curl -fsSL https://ployer.nusendra.com/install.sh -o install.sh sudo bash install.sh
The installer will:
- Detect your OS and architecture
- Download the pre-built binary from GitHub Releases (no compilation needed)
- Ask for your domain or IP address
- Generate a secure JWT secret automatically
- Install and configure Caddy as a reverse proxy
- Set up systemd services for both Ployer and Caddy
- Start everything and print the dashboard URL
That's it. HTTPS is provisioned automatically when you use a domain.
Re-run the install script — it detects the current version and upgrades automatically:
curl -fsSL https://ployer.nusendra.com/install.sh | sudo bashConfig is stored in /opt/ployer/ployer.env. Edit it and restart Ployer to apply changes:
nano /opt/ployer/ployer.env
systemctl restart ployer| Variable | Default | Description |
|---|---|---|
PLOYER_JWT_SECRET |
(required) | Secret key for signing JWT tokens. Use a long random string. |
PLOYER_BASE_DOMAIN |
localhost |
Base domain for auto-generated app subdomains |
PLOYER_PUBLIC_URL |
http://localhost |
Full public URL of the Ployer dashboard |
PLOYER_ALLOWED_ORIGINS |
* |
CORS allowed origins. Lock down in production. |
PLOYER_DATABASE_URL |
sqlite:///var/lib/ployer/ployer.db |
SQLite database path |
PLOYER_PORT |
3001 |
Internal API port |
PLOYER_CADDY_URL |
http://localhost:2019 |
Caddy Admin API URL |
PLOYER_DOCKER_SOCKET |
/var/run/docker.sock |
Docker socket path |
LOG_FORMAT |
(plain text) | Set to json for structured JSON logging |
# View live logs
journalctl -u ployer -f
# Stop / start / restart
systemctl stop ployer
systemctl start ployer
systemctl restart ployer
# Reset a locked-out password
ployer reset-password --email you@example.com --password newpassword123- Add a server — Ployer auto-registers the local server on first start
- Create an application — provide a Git URL, branch, and build strategy
- Add the deploy key — copy the public key from Ployer into your repository's deploy keys
- Deploy — click Deploy or push to the configured branch via webhook
| Strategy | Description |
|---|---|
| Dockerfile | Builds using a Dockerfile in your repo root |
| Nixpacks | Auto-detects language and builds without a Dockerfile |
| Docker Compose | Deploys using a docker-compose.yml in your repo |
- Go to your application → Webhooks → Configure
- Select your Git provider (GitHub or GitLab)
- Copy the webhook URL and secret
- Add it to your repository's webhook settings
- Push to your configured branch — Ployer deploys automatically
Internet
│
▼
Caddy (80/443) ← TLS termination, automatic SSL
│
▼
Ployer (3001) ← Rust/Axum API + SvelteKit frontend (single binary)
│
├── SQLite ← Persistent database (/var/lib/ployer/)
├── Docker socket ← Container management
└── Caddy Admin API ← Dynamic reverse proxy routes
- Backend — Rust (Axum), SQLite via sqlx, bollard for Docker
- Frontend — SvelteKit (static build, embedded in the binary)
- Proxy — Caddy 2 (automatic HTTPS, dynamic routing)
- Database — SQLite with WAL mode (no separate database server needed)
- Process manager — systemd
Dashboard not loading after install
journalctl -u ployer -f
journalctl -u caddy -fSSL certificate not issued
- Make sure your domain's DNS A record points to the server before running the installer
- Ports 80 and 443 must be open (
ufw allow 80 && ufw allow 443)
Cannot connect to Docker
ls -la /var/run/docker.sock # should exist
systemctl status docker # should be activeDatabase errors on startup
ls -la /var/lib/ployer/ # check permissions
chown -R root:root /var/lib/ployer
systemctl restart ployerMIT — see LICENSE