WordPress hosting infrastructure you actually control.

Run it from your terminal, script it in your pipeline, or hand it to your AI agent. No DevOps knowledge required.

$curl -fsSL https://raw.githubusercontent.com/shariffff/pressctl/main/install.sh | bash

Everything happens in your terminal

Provision servers, deploy sites, manage domains and SSL — all through one interactive menu.

press — bash
➜ ~ press
 
pressctl github.com/shariffff/pressctl
 
▶ 1 Provision a new server
2 Create a WordPress site
3 Delete a site
4 Add a domain to a site
5 Issue / renew SSL for a domain
6 Check server health
7 List servers
8 List sites
 
↑↓ navigate enter or number type to filter M more Q quit

What you get out of the box

Production-grade WordPress on Ubuntu 24.04. Nginx, PHP 8.3, MariaDB, Redis, and battle-tested Ansible under the hood.

  • Isolated Linux user and group per site
  • Dedicated PHP-FPM pool and socket per site
  • Separate Nginx config with modular includes
  • Per-site database with single-database privileges
  • UFW firewall — ports 22, 80, 443 only
  • Fail2ban brute-force protection
  • Let's Encrypt auto SSL certificates
  • System cron with file-locked WP-Cron per site
  • Redis object cache
  • FastCGI page cache per site
  • Interactive CLI or fully scriptable flags
  • AI-agent friendly — structured output, predictable commands

What's on the server

Every site gets its own Linux user, PHP-FPM pool, Nginx config, and database. No shared resources. Here's exactly what that looks like.

bash
$ cat /etc/nginx/sites-available/example.com/example.com
server {
listen 80;
server_name example.com;
root /sites/example.com/files;
 
# modular per-site includes
include sites-available/example.com/server/*;
 
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.3-examplecom.sock;
include sites-available/example.com/location/*;
}
}
bash
$ cat /etc/php/8.3/fpm/pool.d/examplecom.conf
[examplecom]
user = examplecom
group = examplecom
 
listen = /run/php/php8.3-examplecom.sock
listen.owner = examplecom
listen.group = www-data
 
pm = dynamic
pm.max_children = 5
pm.start_servers = 1
pm.max_requests = 500
bash
$ tree /sites/example.com/
/sites/example.com/
├── files/ ← document root
│ ├── wp-config.php
│ ├── wp-content/
│ └── index.php
├── logs/
│ ├── access.log
│ └── error.log
├── .local/bin/
│ └── php → /usr/bin/php8.3
└── .pressctl-pool.conf ← custom overrides
bash
$ mysql -e "SHOW GRANTS FOR examplecom@localhost"
GRANT ALL PRIVILEGES ON `examplecom`.*
TO 'examplecom'@'localhost'
 
# one database, one user, localhost only
# credentials generated at site creation

Get started in seconds

Install pressctl, point it at any Ubuntu 24.04 VPS, and you're hosting WordPress.

$curl -fsSL https://raw.githubusercontent.com/shariffff/pressctl/main/install.sh | bash