Skip to main content
Version: 7.x

cpanel

Source

Installing#

Add to your deploy.php

require 'contrib/cpanel.php';

Description#

This is a recipe that uses the cPanel 2 API.

Unfortunately the UAPI that is recommended does not have support for creating addon domains. The main idea behind is for staging purposes but I guess you can use it for other interesting concepts.

The idea is, every branch possibly has its own staging domain/subdomain (staging-neat-feature.project.com) and database db_neat-feature_project so it can be tested. This recipe can make the domain/subdomain and database creation part of the deployment process so you don't have to manually create them through an interface.

Configuration#

The example uses a .env file and Dotenv for configuration, but you can set the parameters as you wish

set('cpanel', [    'host' => getenv('CPANEL_HOST'),    'port' => getenv('CPANEL_PORT'),    'username' => getenv('CPANEL_USERNAME'),    'auth_type' => getenv('CPANEL_AUTH_TYPE'),    'token' => getenv('CPANEL_TOKEN'),    'user' => getenv('CPANEL_USER'),    'db_user' => getenv('CPANEL_DB_USER'),    'db_user_privileges' => getenv('CPANEL_DB_PRIVILEGES'),    'timeout' => 500,
    'allowInStage' => ['staging', 'beta', 'alpha'],
    'create_domain_format' => '%s-%s-%s',    'create_domain_values' => ['staging', 'master', get('application')],    'subdomain_prefix' => substr(md5(get('application')), 0,4) . '-',    'subdomain_suffix' => getenv('SUDOMAIN_SUFFIX'),

    'create_db_format' => '%s_%s-%s-%s',    'create_db_values' => ['apps', 'staging','master', get('application')],
]);
  • cpanel โ€“ array with configuration for cPanel
    • username โ€“ WHM account
    • user โ€“ cPanel account that you want in charge of the domain
    • token โ€“ WHM API token
    • create_domain_format โ€“ Format for name creation of domain
    • create_domain_values โ€“ The actual value reference for naming
    • subdomain_prefix โ€“ cPanel has a weird way of dealing with addons and subdomains, you cannot create 2 addons with the same subdomain, so you need to change it in some way, example uses first 4 chars of md5(app_name)
    • subdomain_suffix โ€“ cPanel has a weird way of dealing with addons and subdomains, so the suffix needs to be your main domain for that account for deletion purposes
    • addondir โ€“ addon dir is different from the deploy path because cPanel "injects" /home/user/ into the path, so tilde cannot be used
    • allowInStage โ€“ Define the stages that cPanel recipe actions are allowed in

.env file example#

CPANEL_HOST=xxx.xxx.xxx.xxxCPANEL_PORT=2087CPANEL_USERNAME=rootCPANEL_TOKEN=xxxxCPANEL_USER=xxxCPANEL_AUTH_TYPE=hashCPANEL_DB_USER=db_userCPANEL_DB_PRIVILEGES="ALL PRIVILEGES"SUDOMAIN_SUFFIX=.mymaindomain.com

Tasks#

  • cpanel:createaddondomain Creates an addon domain
  • cpanel:deleteaddondomain Removes an addon domain
  • cpanel:createdb Creates a new database

Usage#

A complete example with configs, staging and deployment

<?php
namespace Deployer;use Dotenv\Dotenv;
require 'vendor/autoload.php';(Dotenv::create(__DIR__))->load(); // this is used just so an .env file can be used for credentials
require 'cpanel.php';

Project nameset('application', 'myproject.com');Project repositoryset('repository', 'git@github.com:myorg/myproject.com');




set('cpanel', [    'host' => getenv('CPANEL_HOST'),    'port' => getenv('CPANEL_PORT'),    'username' => getenv('CPANEL_USERNAME'),    'auth_type' => getenv('CPANEL_AUTH_TYPE'),    'token' => getenv('CPANEL_TOKEN'),    'user' => getenv('CPANEL_USER'),    'db_user' => getenv('CPANEL_DB_USER'),    'db_user_privileges' => getenv('CPANEL_DB_PRIVILEGES'),    'timeout' => 500,    'allowInStage' => ['staging', 'beta', 'alpha'],
    'create_domain_format' => '%s-%s-%s',    'create_domain_values' => ['staging', 'master', get('application')],    'subdomain_prefix' => substr(md5(get('application')), 0,4) . '-',    'subdomain_suffix' => getenv('SUDOMAIN_SUFFIX'),

    'create_db_format' => '%s_%s-%s-%s',    'create_db_values' => ['apps', 'staging','master', get('application')],
]);
host('myproject.com')    ->stage('staging')    ->set('cpanel_createdb', vsprintf(get('cpanel')['create_db_format'], get('cpanel')['create_db_values']))    ->set('branch', 'dev-branch')    ->set('deploy_path',  '~/staging/' . vsprintf(get('cpanel')['create_domain_format'], get('cpanel')['create_domain_values']))    ->set('addondir',  'staging/' . vsprintf(get('cpanel')['create_domain_format'], get('cpanel')['create_domain_values']));Taskstask('build', function () {    run('cd {{release_path}} && build');});
after('deploy:prepare', 'cpanel:createaddondomain');after('deploy:prepare', 'cpanel:createdb');

Tasks#

cpanel:createdb#

Source

Creating database though CPanel API.

cpanel:createaddondomain#

Source

Creating addon domain though CPanel API.

cpanel:deleteaddondomain#

Source

Delete addon domain though CPanel API.