Manage web applications with WOR Host
One consistent workflow for services, hosts, SSL certificates, and backups across Node.js, PHP, Go, Python, and static web applications on Linux, macOS, and Windows.
$ curl -fsSL https://wor.worapong.com/download/installer.sh | bash
Everything you need to run web applications
Built for developers who manage their own servers.
Built-in templates
static, node, go, python and php — scaffolded with a starter source tree and wired to the right process manager (PM2, systemd or PHP-FPM) automatically. Dedicated PHP-FPM pools on Linux.
Per-service configuration
Each service carries its own .wor/ folder: web-server snippets included into its vhost, and — for php — its own php.ini and php-fpm pool tuning, validated and applied without touching the settings of every other site on the machine.
Host management
Generates and enables Nginx and Apache vhosts, tests configuration before reload, and can manage your local hosts file for development domains.
Deploy & rollback
Pull from git, install dependencies, rebuild and restart with one command — and roll back to the previous release when something goes wrong.
SSL certificates
Issue, renew and install certificates per host — Let's Encrypt, self-signed, or bring your own cert and key. WOR keeps its own copy of each one, refreshes it on renewal, and lets you switch the HTTP → HTTPS redirect on or off per host.
Database backups
MySQL/MariaDB, PostgreSQL, SQL Server and SQLite backup profiles with Go-native gzip compression — no extra tooling needed.
Health & diagnostics
wor health sweeps the whole fleet, wor diagnose does read-only root-cause analysis on a broken service, and wor doctor checks the machine itself.
Upgrades itself
wor upgrade compares the binary you are running against the release the download site publishes, shows you both, and installs the newer one once you confirm — no package repository to add, no install steps to remember.
Why WOR?
Same servers, same tools underneath — one consistent workflow on top.
| Traditional workflow | WOR workflow |
|---|---|
| pm2 / systemctl / php-fpm commands per service | wor service |
| editing nginx/apache vhosts by hand | wor host |
| certbot + renewal cron | wor ssl |
| git pull + install deps + rebuild + restart | wor deploy |
| mysqldump + gzip + retention scripts | wor database backup |
| curl + grep in a loop | wor health |
| log hunting across five files | wor diagnose |
WOR builds on the tools you already trust. It doesn’t replace them—it gives them one consistent workflow.
Install in under a minute
One static Go binary, no runtime dependencies. The one-liner supports Debian/Ubuntu.
$ curl -fsSL https://wor.worapong.com/download/installer.sh | bash
Installing on macOS or Windows, or want the step-by-step guide? Read the docs — install, quick start, and the full command reference.
See it in action
Three commands, one story: wor service status (what's configured & running) → wor health (who's broken) → wor diagnose (why, and how to fix it).
Per-provider process view. The blue ✓ means enabled in config — deliberately not a green health dot; live process state is the last column, and the footer says what this command doesn't check.
$ wor service status PM2 (node) ✓ com-example/api :3001 pid 41230 2d 4h online wor_com-example_api cpu 0.4% mem 86mb ✗ com-example/queue :3005 disabled SYSTEMD (go/python) ✓ com-example/worker :3102 pid 40988 active wor_com-example_worker cpu 1.2% mem 24mb PHP-FPM (php) ✓ com-shop/webapp n/a running (php 8.4 pool) STATIC (no process) ✓ com-example/landing n/a served by web server (process status only -- for end-to-end health: wor health)
Fleet-wide sweep: host resources up top, one card per enabled service — process check, live cpu/mem, and one real HTTP request through the web server. Notice com-shop/webapp: the pool is up, yet requests fail — process status alone would never catch this. Exit code drives cron.
$ wor health WOR Health (4 enabled services) -------------------------------------------- Host CPU : 9% (4 cores) Host Memory : 2.1G / 7.8G (27%) Disk Usage : 17.6G / 77.9G (23%) -------------------------------------------- ● com-example/api Status : Online Runtime: pm2 (node) CPU : 0.4% Memory : 86.3M (1.1%) Uptime : 2d 4h ✓ https://api.example.com -> 200 ● com-example/worker Status : Online Runtime: systemd (go) CPU : 1.2% Memory : 24.6M (0.3%) ℹ no host registered -- HTTP not probed ● com-shop/webapp Status : Online Runtime: php-fpm 8.4 (dedicated pool, 3 workers) CPU : 0.2% Memory : 118.4M (1.5%) ✗ https://shop.example.com -> 502 ● com-example/landing Status : Online (served by web server) Runtime: static ✓ https://www.example.com -> 200 -------------------------------------------- Healthy : 2 Warning : 1 Failed : 1 wor diagnose com-shop/webapp # root cause + fix To bring everything enabled back up: wor run
Read-only root-cause analysis of the failure wor health found: layered checks print live, then the summary names one root cause with evidence and a numbered runbook. Diagnose recommends — it never changes anything itself.
$ wor diagnose shop.example.com WOR Diagnose ------------ Target : com-shop/webapp Host : shop.example.com [ssl: letsencrypt] Runtime: php 8.4 (dedicated php-fpm pool) Server : nginx (nginx/1.24.0) Checks ------------------------------------------------ [PASS] config enabled (php), document root found [PASS] dns shop.example.com -> 203.0.113.10 (this machine) [PASS] nginx running, vhost ok, config test ok [PASS] ssl letsencrypt cert valid (58d left) [FAIL] process pool is up but its socket denies the web server user (www-data) [FAIL] http-host via shop.example.com :443 -> 502 [PASS] files reachable by web server user (www-data) [PASS] disk 23% used [WARN] logs 1 known error pattern(s) in nginx error log -- see evidence below Summary ------------------------------------------------ Status: FAILED (2 fail, 1 warn) Root cause: www-data cannot connect to this pool's socket -- listen.owner/listen.group in the pool config don't include the web server user, so every request through nginx gets 502 Evidence ------------------------------------------------ php-fpm socket: /run/php/wor_com-shop_webapp.sock is deploy:deploy 0660 -- www-data cannot connect nginx error log: 2026/07/09 14:02:17 [crit] 8412#8412: *3 connect() to unix:/run/php/wor_com-shop_webapp.sock failed (13: Permission denied) (x14) Suggested fix (run yourself -- wor diagnose never changes anything) ------------------------------------------------ 1. Fix the root cause -- www-data cannot connect to this pool's socket -- listen.owner/listen.group in the pool config don't include the web server user, so every request through nginx gets 502: sudo sed -i 's/^listen.owner = .*/listen.owner = www-data/; s/^listen.group = .*/listen.group = www-data/' /etc/php/8.4/fpm/pool.d/wor_com-shop_webapp.conf && sudo systemctl restart php8.4-fpm check ownership/permissions under /opt/wor/domains/com-shop/webapp; wor doctor's Security section shows the exact fix 2. If it persists -- the web server is up but cannot reach the app behind it (502): wor service restart com-shop/webapp 3. Verify: wor diagnose com-shop/webapp
Ready to try it?
Install in under a minute, or grab a release archive.
If WOR saves you time,
consider buying me a beer and some Texas BBQ.
Thanks for supporting independent open source.
🍺 Buy me a beer & BBQ