Provisioning
When a new site is created, ProvisionSiteJob runs Provisioner::provision(), which performs seven steps in order. On failure, cleanup runs in reverse order.
Flow
sequenceDiagram
participant User
participant Job as ProvisionSiteJob
participant P as Provisioner
participant FS as Filesystem
participant MySQL
participant WP as WP-CLI
participant Nginx
User->>Job: Create site
Job->>P: provision(site)
P->>FS: ensureFilesystem
P->>P: createSiteUser
P->>MySQL: createDatabase
P->>WP: installWordPress
P->>WP: applyTemplate
P->>P: installWphosterAgent
P->>Nginx: configureNginx
P->>P: configureCloudflare
Step breakdown
- ensureFilesystem —
mkdir -psite root,chmod 755. Path fromconfig('wphoster.paths.sites_root'). - createSiteUser —
UserManager::createSiteUser()creates OS user;os_userandos_user_uidsaved on site. File:app/Services/System/UserManager.php. - createDatabase — MySQL
CREATE DATABASE,CREATE USER,GRANT. Password stored encrypted insite.db_password_encrypted. Usessudo mysqlwith stdin. - installWordPress — Download WordPress zip (cached 24h in
storage/app/tmp/wordpress-latest.zip), unzip to site root,wp config create,wp core install. - applyTemplate — Install plugins/themes from site template (local path or repo slug), apply
wp_option_overrides_json. File:app/Services/Provisioning/Provisioner.php(applyTemplate). - installWphosterAgent —
WphosterAgentInstaller::install()rsyncs plugin fromprovisioning/wordpress/wphoster-agent, activates plugin, appends token to wp-config. File:app/Services/WordPress/WphosterAgentInstaller.php. - configureNginx — Render
provisioning/nginx/site.conf.stubwith{{ server_name }},{{ root_path }},{{ php_fpm_socket }}; write tonginx_sites_available/{slug}.conf, symlink innginx_sites_enabled,nginx -s reload. - configureCloudflare — Upsert A record for site FQDN to
config('wphoster.server_ip')(if Cloudflare enabled).
Key files
| Path | Purpose |
|---|---|
app/Services/Provisioning/Provisioner.php | Main provisioning logic |
app/Jobs/ProvisionSiteJob.php | Queue job that calls Provisioner |
app/Services/System/UserManager.php | Create/delete site OS user |
app/Services/WordPress/WphosterAgentInstaller.php | Install agent plugin and token |
provisioning/nginx/site.conf.stub | Nginx vhost template |
Cleanup on failure
cleanupOnFailure() runs in reverse order: Nginx config removed, database dropped, user deleted, filesystem removed. Cloudflare is not reverted (provisioning continues without failing if DNS fails).
Nginx template snippet
provisioning/nginx/site.conf.stub
server_name {{ server_name }};
root {{ root_path }};
fastcgi_pass {{ php_fpm_socket }};
Config keys
| Key | Purpose |
|---|---|
wphoster.paths.sites_root | Base directory for site roots |
wphoster.paths.nginx_sites_available | Nginx configs directory |
wphoster.paths.nginx_sites_enabled | Nginx enabled symlinks |
wphoster.php_fpm_socket | PHP-FPM socket path |
wphoster.mysql.host | MySQL host |
wphoster.mysql.root_user | MySQL root user for CREATE DATABASE |
wphoster.wp_cli.path | WP-CLI binary path |
wphoster.agent.enabled | Whether to install WP Hoster Agent |
wphoster.agent.path | Path to agent plugin source |