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 | bashEverything 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