{"id":1634,"date":"2026-10-11T17:28:14","date_gmt":"2026-10-11T17:28:14","guid":{"rendered":"https:\/\/black.host\/hc\/?p=1634"},"modified":"2026-10-11T19:18:17","modified_gmt":"2026-10-11T19:18:17","slug":"automatic-deployments-to-cpanel-with-github-actions","status":"publish","type":"post","link":"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/","title":{"rendered":"Automatic deployments to cPanel with GitHub Actions"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In the era of agentic development, version tracking is a must. Agents produce non-deterministic output, and the only sane way to work with that is a history you can inspect and revert. With that comes the need for automated deployments and rollbacks, and lucky for us this existed long before the agents came. Its name is CI\/CD.<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_88 counter-flat ez-toc-counter ez-toc-black ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<span class=\"ez-toc-title-toggle\"><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#What_is_CICD_and_why_AI_agents_need_it\" >What is CI\/CD and why AI agents need it?<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#Setting_up_basic_CICD_with_cPanel_and_GitHub_over_SFTP\" >Setting up basic CI\/CD with cPanel and GitHub over SFTP<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#1_The_workflow_file\" >1. The workflow file<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#2_The_deploy_key\" >2. The deploy key<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#3_The_secrets\" >3. The secrets<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#4_Push\" >4. Push<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#What_the_workflow_actually_does\" >What the workflow actually does<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#Rolling_back\" >Rolling back<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#Let_your_agent_do_it\" >Let your agent do it<\/a><\/li><li class='ez-toc-page-1'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#Where_to_go_from_here\" >Where to go from here<\/a><\/li><\/ul><\/nav><\/div>\n<h2 id=\"h-what-is-ci-cd-and-why-ai-agents-need-it\" class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"What_is_CICD_and_why_AI_agents_need_it\"><\/span>What is CI\/CD and why AI agents need it?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Continuous Integration and Continuous Deployment (or Delivery) is a software development method that automates the whole process of building, testing and deploying in a fast, reliable and repeatable way. In simpler words: the developer writes the code, commits it to Git, pushes it somewhere, and that push triggers the pipeline. The code gets tested and, if all lights are green, deployed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In the agentic era, where the developer supervises agents instead of typing every line, CI\/CD has never been more needed:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Agents mess up sometimes (still).<\/strong> Version control and a one-command rollback are a must.<\/li>\n\n\n\n<li><strong>The agent never needs the keys.<\/strong> It writes the code and the pipeline; GitHub holds the credentials; the server only ever talks to the pipeline. You review every change before it ships, and the agent cannot ship anything on its own.<\/li>\n\n\n\n<li><strong>Tokens cost money.<\/strong> Why spend them on repetitive upload work when all the agent has to do is commit and push.<\/li>\n<\/ol>\n\n\n\n<h2 id=\"h-setting-up-basic-ci-cd-with-cpanel-and-github-over-sftp\" class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Setting_up_basic_CICD_with_cPanel_and_GitHub_over_SFTP\"><\/span>Setting up basic CI\/CD with cPanel and GitHub over SFTP<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Enter Deployer 9000 (DEP 9000), our open-source GitHub Action for deployments over FTP, SFTP and rsync. All you need is one workflow file in your repository and a few secrets. So let&#8217;s get started.<\/p>\n\n\n\n<figure class=\"wp-block-pullquote alert\"><blockquote><p>This guide assumes you know your way around Git and pushing commits to GitHub. The repository can be private, that changes nothing below. SFTP needs SSH access on your cPanel account.<\/p><\/blockquote><\/figure>\n\n\n\n<h3 id=\"h-1-the-workflow-file\" class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_The_workflow_file\"><\/span>1. The workflow file<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In your repository, create <code>.github\/workflows\/deploy.yml<\/code> with the following content:<\/p>\n\n\n\n<pre title=\"\" class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">name: Deploy\n\non:\n  push:\n    branches: [ \"main\" ]\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\/checkout@v4\n\n      - name: Code Deployment\n        uses: Black-HOST\/deployer@v1\n        with:\n          protocol: sftp\n          server: ${{ secrets.SFTP_HOST }}\n          port: ${{ secrets.SFTP_PORT }}\n          username: ${{ secrets.SFTP_USER }}\n          ssh_key: ${{ secrets.SFTP_KEY }}\n          # the key password, if the key has one; an empty secret is ignored\n          password: ${{ secrets.SFTP_KEY_PASS }}\n          # SFTP paths are real paths, relative to the login's home directory\n          remote_dir: \"public_html\"\n          # a custom list replaces the default one, so the dotfile rules stay in front\n          exclude: \".*,.*\/,*.md\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Every push to <code>main<\/code> now runs this job: check out the repository, hand it to DEP 9000, upload it to <code>public_html<\/code> over SFTP. You might have noticed the <code>secrets.<\/code> references. Those are the credentials, and they never live in the file. We create them in step 3; first we need a key.<\/p>\n\n\n\n<h3 id=\"h-2-the-deploy-key\" class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_The_deploy_key\"><\/span>2. The deploy key<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of a password, the pipeline logs in with an SSH key that exists only for this purpose. If someone leaves the project, you delete the key in cPanel and the pipeline is locked out, nothing to rotate.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In cPanel, open <strong>SSH Access &gt; Manage SSH Keys &gt; Generate a New Key<\/strong>. Give it a name such as <code>deploy_key<\/code>, choose <strong>RSA<\/strong> with <strong>4096<\/strong> bits and click <strong>Generate Key<\/strong> as shown bellow. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"523\" src=\"https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/generate_rsa_key_cPanel-1024x523.png\" alt=\"Generating a RSA key pair with cPanel\" class=\"wp-image-1690\" srcset=\"https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/generate_rsa_key_cPanel-1024x523.png 1024w, https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/generate_rsa_key_cPanel-300x153.png 300w, https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/generate_rsa_key_cPanel-766x391.png 766w, https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/generate_rsa_key_cPanel-1536x784.png 1536w, https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/generate_rsa_key_cPanel-2048x1045.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">cPanel generates RSA keys only. The modern standard for SSH keys is ed25519: shorter, faster, nothing to size. If you prefer it, you cab create the key on your computer with the following command, assuming you have `OpenSSH` installed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">ssh-keygen -t ed25519 -f deploy_key -N \"\" -C \"github deploy\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This gives you <code>deploy_key<\/code> (private, goes to GitHub) and <code>deploy_key.pub<\/code> (public, goes to the server). Do not add either to the repository. In cPanel, open <strong>Manage SSH Keys &gt; Import Key<\/strong>, paste the content of <code>deploy_key.pub<\/code> as the public key and click <strong>Import<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Either way, the last step is the same: under <strong>Manage SSH Keys &gt; Public Keys<\/strong>, click <strong>Manage<\/strong> next to the key, then <strong>Authorize<\/strong>. Until you do, the key exists but cannot log in.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"184\" src=\"https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/authorize_ssh_key_cPanel-1024x184.png\" alt=\"Authorize SSH key in cPanel\" class=\"wp-image-1697\" srcset=\"https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/authorize_ssh_key_cPanel-1024x184.png 1024w, https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/authorize_ssh_key_cPanel-300x54.png 300w, https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/authorize_ssh_key_cPanel-766x138.png 766w, https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/authorize_ssh_key_cPanel-1536x277.png 1536w, https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/authorize_ssh_key_cPanel-2048x369.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 id=\"h-3-the-secrets\" class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_The_secrets\"><\/span>3. The secrets<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Head to <strong>Settings &gt; Secrets and variables &gt; Actions<\/strong> in your GitHub repository and create these:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Secret<\/th><th>Value<\/th><\/tr><\/thead><tbody><tr><td><code>SFTP_HOST<\/code><\/td><td>your domain, or the server hostname shown in cPanel<\/td><\/tr><tr><td><code>SFTP_PORT<\/code><\/td><td>the SSH port, <code>22<\/code> unless your host says otherwise<\/td><\/tr><tr><td><code>SFTP_USER<\/code><\/td><td>your cPanel username<\/td><\/tr><tr><td><code>SFTP_KEY<\/code><\/td><td>the private key as text, not a file name: paste the whole content, <code>BEGIN<\/code> and <code>END<\/code> lines included, from <strong>Manage SSH Keys &gt; Private Keys &gt; View\/Download<\/strong> in cPanel, or from the <code>deploy_key<\/code> file if you created it yourself<\/td><\/tr><tr><td><code>SFTP_KEY_PASS<\/code><\/td><td>the key password, only if you set one for your SSH key<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Only the key and its password are real secrets. We keep the rest as secrets too, so there is one place to look. If you prefer, host and port can be repository variables instead (<code>server: ${{ vars.SFTP_HOST }}<\/code>), which are visible in the settings and in the logs. That helps when a connection fails, because secret values are masked as <code>***<\/code> in the log. At the end you should get something like this in your GitHub settings:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"389\" src=\"https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/GitHub_secrets-1024x389.png\" alt=\"GitHub repository secrets\" class=\"wp-image-1701\" srcset=\"https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/GitHub_secrets-1024x389.png 1024w, https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/GitHub_secrets-300x114.png 300w, https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/GitHub_secrets-768x292.png 768w, https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/GitHub_secrets-1536x584.png 1536w, https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/GitHub_secrets.png 1930w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 id=\"h-4-push\" class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"4_Push\"><\/span>4. Push<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Commit the workflow file and push. The <strong>Actions<\/strong> tab in your repository shows the run; when it turns green, the site is live. The first deploy uploads everything; from then on, every push to <code>main<\/code> is a deployment.<\/p>\n\n\n\n<h2 id=\"h-what-the-workflow-actually-does\" class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"What_the_workflow_actually_does\"><\/span>What the workflow actually does<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A few lines in that file deserve a second look, because they are where cPanel deployments usually go wrong.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>remote_dir: \"public_html\"<\/code> has no leading slash on purpose.<\/strong> Over FTP, <code>\/<\/code> is your account&#8217;s home directory. Over SFTP, <code>\/<\/code> is the root of the server&#8217;s filesystem, and <code>\/public_html<\/code> does not exist. SFTP paths are relative to the home directory, so <code>public_html<\/code> is your web root. An addon or sub domain lives in its own folder; use that instead.<\/li>\n\n\n\n<li><strong><code>exclude<\/code> replaces the default list.<\/strong> DEP 9000 skips dotfiles, <code>node_modules\/<\/code> and <code>*.log<\/code> out of the box, so <code>.git\/<\/code> and <code>.env<\/code> never reach the web server. The moment you set your own <code>exclude<\/code>, that default is gone, which is why the example repeats <code>.*,.*\/<\/code> before adding <code>*.md<\/code>. Need <code>.htaccess<\/code> on the server? Add <code>include: \".htaccess\"<\/code>; included files are uploaded even though the dotfile rule excludes them.<\/li>\n\n\n\n<li><strong>Nothing is deleted on the server<\/strong> unless you ask. Add <code>delete: \"true\"<\/code> and files that no longer exist in the repository are removed on deploy.<\/li>\n\n\n\n<li><strong>Every deploy uploads every file<\/strong>, because a CI checkout gives all files the time of the checkout. Add <code>preserve_times: \"true\"<\/code> and DEP 9000 restores the commit time of each file first, so only the files that changed are uploaded. On a site with a few hundred files this turns a minute into seconds.<\/li>\n\n\n\n<li><strong><code>ssh_key<\/code> takes the key itself<\/strong>, the text of the private key file, not a path to it. The deployer writes it to a file inside the job&#8217;s container, which is thrown away when the job ends.<\/li>\n\n\n\n<li><strong>Optional, for more security: <code>host_key<\/code>.<\/strong> By default the deployer trusts whatever host key the server presents. Pin it (<code>host_key: \"ssh-ed25519 AAAA...\"<\/code>, from <code>ssh-keyscan -p &lt;port&gt; -t ed25519 &lt;server&gt;<\/code> run on a network you trust) and any other server is refused before the key or a single file is sent.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"h-rolling-back\" class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Rolling_back\"><\/span>Rolling back<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is the part the intro promised. The agent shipped something ugly, the site is broken, and it is 23:40. In the repository:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">git revert HEAD\ngit push<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The revert is a new commit that undoes the last one, the push triggers the pipeline, and a minute later the previous version is live. No FTP client, no &#8220;which files did it touch&#8221;, no restoring from a backup. If the bad commit added files that should disappear too, that is what <code>delete: \"true\"<\/code> is for. A rollback is just another commit, which also means it is in the history, reviewable, and revertable itself. <br><br>The alternative will be to re-trigger deploy action on specific commit that we know that we know everything was ok. <\/p>\n\n\n\n<h2 id=\"h-let-your-agent-do-it\" class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Let_your_agent_do_it\"><\/span>Let your agent do it<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You are building with Claude Code, Cursor or a similar tool? Then the setup above is the agent&#8217;s job, not yours. We&#8217;ve created the <a href=\"https:\/\/github.com\/Black-HOST\/CI-CD\" data-type=\"link\" data-id=\"https:\/\/github.com\/Black-HOST\/CI-CD\">CI\/CD playground<\/a>, simple repo where all the examples live. Each branch is an example on its own for different protocols and various setups. Once you pick your preferred branch\/method you can head down to the section <a href=\"https:\/\/github.com\/Black-HOST\/CI-CD\/tree\/sftp#let-your-agent-do-it\" data-type=\"link\" data-id=\"https:\/\/github.com\/Black-HOST\/CI-CD\/tree\/sftp#let-your-agent-do-it\">Let your agent do it<\/a> copy the prompt for your agent and the agent takes over. The private key goes into a GitHub secret, never into the chat or the repository. From that moment, &#8220;deploy&#8221; means &#8220;commit and push&#8221;, and that is something an agent can be trusted with.<\/p>\n\n\n\n<h2 id=\"h-where-to-go-from-here\" class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Where_to_go_from_here\"><\/span>Where to go from here<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This article pretty much covers the basics of DEP 9000 capabilities, so if your setup needs something more advanced you can find all the test cases we&#8217;ve been testing DEP 9000 against in in its automated workflows: <a href=\"https:\/\/github.com\/Black-HOST\/deployer\/tree\/master\/.github\/workflows\">https:\/\/github.com\/Black-HOST\/deployer\/tree\/master\/.github\/workflows<\/a>. Yep we do tests on all changes and we plan to keep this product as boring as possible by staying backward compatible within all of its versions. <br><br>In case that your cPanel account dosent have SSH access, then in our CI\/CD playground you can find an <a href=\"https:\/\/github.com\/Black-HOST\/CI-CD\/tree\/ftp\">FTP example<\/a> that does the same over FTPS with a password. <br><br>Or if you are deploying from GitLab, then we have DEP 9000 on Docker Hub as <a href=\"https:\/\/hub.docker.com\/r\/blackhost\/deployer\"><code>blackhost\/deployer<\/code><\/a> for now the <a href=\"https:\/\/github.com\/Black-HOST\/deployer#-quick-start-gitlab-ci\">DEP 9000 README<\/a> has the instructions on how can you setup this with .gitlab-ci.yml.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the era of agentic development, version tracking is a must. Agents produce non-deterministic output, and the only sane way to work with that is a history you can inspect and revert. With that comes the need for automated deployments and rollbacks, and lucky for us this existed long before the agents came. Its name [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1772,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[296,159],"tags":[],"class_list":["post-1634","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ci-cd","category-cpanel-whm"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.6 (Yoast SEO v28.6) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Automatic deployments to cPanel with GitHub Actions - Knowledge Base | BlackHOST<\/title>\n<meta name=\"description\" content=\"Learn how can you achieve CI\/CD pipeline in few steps with GitHub actions and Deployer 9000 directly to your cPanel shared hosting account.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Automatic deployments to cPanel with GitHub Actions\" \/>\n<meta property=\"og:description\" content=\"Learn how can you achieve CI\/CD pipeline in few steps with GitHub actions and Deployer 9000 directly to your cPanel shared hosting account.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/\" \/>\n<meta property=\"og:site_name\" content=\"Knowledge Base | BlackHOST\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/BlackH0ST\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-11T17:28:14+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-11T19:18:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/1634.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Thomas Nuchatel\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@_blackhost\" \/>\n<meta name=\"twitter:site\" content=\"@_blackhost\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Thomas Nuchatel\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/ci-cd\\\/automatic-deployments-to-cpanel-with-github-actions\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/ci-cd\\\/automatic-deployments-to-cpanel-with-github-actions\\\/\"},\"author\":{\"name\":\"Thomas Nuchatel\",\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/#\\\/schema\\\/person\\\/a9f685da3ffad63071d6e4173555e1a0\"},\"headline\":\"Automatic deployments to cPanel with GitHub Actions\",\"datePublished\":\"2026-10-11T17:28:14+00:00\",\"dateModified\":\"2026-10-11T19:18:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/ci-cd\\\/automatic-deployments-to-cpanel-with-github-actions\\\/\"},\"wordCount\":1402,\"publisher\":{\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/ci-cd\\\/automatic-deployments-to-cpanel-with-github-actions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/black.host\\\/hc\\\/wp-content\\\/uploads\\\/sites\\\/3\\\/2026\\\/10\\\/1634.jpg\",\"articleSection\":[\"CI\\\/CD\",\"cPanel\\\/WHM\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/ci-cd\\\/automatic-deployments-to-cpanel-with-github-actions\\\/\",\"url\":\"https:\\\/\\\/black.host\\\/hc\\\/ci-cd\\\/automatic-deployments-to-cpanel-with-github-actions\\\/\",\"name\":\"Automatic deployments to cPanel with GitHub Actions - Knowledge Base | BlackHOST\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/ci-cd\\\/automatic-deployments-to-cpanel-with-github-actions\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/ci-cd\\\/automatic-deployments-to-cpanel-with-github-actions\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/black.host\\\/hc\\\/wp-content\\\/uploads\\\/sites\\\/3\\\/2026\\\/10\\\/1634.jpg\",\"datePublished\":\"2026-10-11T17:28:14+00:00\",\"dateModified\":\"2026-10-11T19:18:17+00:00\",\"description\":\"Learn how can you achieve CI\\\/CD pipeline in few steps with GitHub actions and Deployer 9000 directly to your cPanel shared hosting account.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/ci-cd\\\/automatic-deployments-to-cpanel-with-github-actions\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/black.host\\\/hc\\\/ci-cd\\\/automatic-deployments-to-cpanel-with-github-actions\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/ci-cd\\\/automatic-deployments-to-cpanel-with-github-actions\\\/#primaryimage\",\"url\":\"https:\\\/\\\/black.host\\\/hc\\\/wp-content\\\/uploads\\\/sites\\\/3\\\/2026\\\/10\\\/1634.jpg\",\"contentUrl\":\"https:\\\/\\\/black.host\\\/hc\\\/wp-content\\\/uploads\\\/sites\\\/3\\\/2026\\\/10\\\/1634.jpg\",\"width\":1200,\"height\":675},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/ci-cd\\\/automatic-deployments-to-cpanel-with-github-actions\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/black.host\\\/hc\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Automatic deployments to cPanel with GitHub Actions\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/#website\",\"url\":\"https:\\\/\\\/black.host\\\/hc\\\/\",\"name\":\"Knowledge Base | BlackHOST\",\"description\":\"Knowledge Base\",\"publisher\":{\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/black.host\\\/hc\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/#organization\",\"name\":\"BlackHOST\",\"url\":\"https:\\\/\\\/black.host\\\/hc\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/black.host\\\/hc\\\/wp-content\\\/uploads\\\/sites\\\/3\\\/2020\\\/05\\\/text.png\",\"contentUrl\":\"https:\\\/\\\/black.host\\\/hc\\\/wp-content\\\/uploads\\\/sites\\\/3\\\/2020\\\/05\\\/text.png\",\"width\":1200,\"height\":143,\"caption\":\"BlackHOST\"},\"image\":{\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/BlackH0ST\\\/\",\"https:\\\/\\\/x.com\\\/_blackhost\",\"https:\\\/\\\/www.youtube.com\\\/c\\\/BlackHOST\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/blackhost\",\"https:\\\/\\\/www.instagram.com\\\/_blackhost\\\/\",\"https:\\\/\\\/ch.pinterest.com\\\/BlackH0ST\\\/\",\"https:\\\/\\\/mastodon.social\\\/@blackhost\",\"https:\\\/\\\/primal.net\\\/BlackHOST\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/black.host\\\/hc\\\/#\\\/schema\\\/person\\\/a9f685da3ffad63071d6e4173555e1a0\",\"name\":\"Thomas Nuchatel\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/56ccd114c4d0553e66448d4423073e3c9b336a6cbedce70e926d3404837f3255?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/56ccd114c4d0553e66448d4423073e3c9b336a6cbedce70e926d3404837f3255?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/56ccd114c4d0553e66448d4423073e3c9b336a6cbedce70e926d3404837f3255?s=96&r=g\",\"caption\":\"Thomas Nuchatel\"},\"sameAs\":[\"https:\\\/\\\/black.host\"]}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Automatic deployments to cPanel with GitHub Actions - Knowledge Base | BlackHOST","description":"Learn how can you achieve CI\/CD pipeline in few steps with GitHub actions and Deployer 9000 directly to your cPanel shared hosting account.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/","og_locale":"en_US","og_type":"article","og_title":"Automatic deployments to cPanel with GitHub Actions","og_description":"Learn how can you achieve CI\/CD pipeline in few steps with GitHub actions and Deployer 9000 directly to your cPanel shared hosting account.","og_url":"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/","og_site_name":"Knowledge Base | BlackHOST","article_publisher":"https:\/\/www.facebook.com\/BlackH0ST\/","article_published_time":"2026-10-11T17:28:14+00:00","article_modified_time":"2026-10-11T19:18:17+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/1634.jpg","type":"image\/jpeg"}],"author":"Thomas Nuchatel","twitter_card":"summary_large_image","twitter_creator":"@_blackhost","twitter_site":"@_blackhost","twitter_misc":{"Written by":"Thomas Nuchatel","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#article","isPartOf":{"@id":"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/"},"author":{"name":"Thomas Nuchatel","@id":"https:\/\/black.host\/hc\/#\/schema\/person\/a9f685da3ffad63071d6e4173555e1a0"},"headline":"Automatic deployments to cPanel with GitHub Actions","datePublished":"2026-10-11T17:28:14+00:00","dateModified":"2026-10-11T19:18:17+00:00","mainEntityOfPage":{"@id":"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/"},"wordCount":1402,"publisher":{"@id":"https:\/\/black.host\/hc\/#organization"},"image":{"@id":"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#primaryimage"},"thumbnailUrl":"https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/1634.jpg","articleSection":["CI\/CD","cPanel\/WHM"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/","url":"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/","name":"Automatic deployments to cPanel with GitHub Actions - Knowledge Base | BlackHOST","isPartOf":{"@id":"https:\/\/black.host\/hc\/#website"},"primaryImageOfPage":{"@id":"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#primaryimage"},"image":{"@id":"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#primaryimage"},"thumbnailUrl":"https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/1634.jpg","datePublished":"2026-10-11T17:28:14+00:00","dateModified":"2026-10-11T19:18:17+00:00","description":"Learn how can you achieve CI\/CD pipeline in few steps with GitHub actions and Deployer 9000 directly to your cPanel shared hosting account.","breadcrumb":{"@id":"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#primaryimage","url":"https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/1634.jpg","contentUrl":"https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2026\/10\/1634.jpg","width":1200,"height":675},{"@type":"BreadcrumbList","@id":"https:\/\/black.host\/hc\/ci-cd\/automatic-deployments-to-cpanel-with-github-actions\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/black.host\/hc\/"},{"@type":"ListItem","position":2,"name":"Automatic deployments to cPanel with GitHub Actions"}]},{"@type":"WebSite","@id":"https:\/\/black.host\/hc\/#website","url":"https:\/\/black.host\/hc\/","name":"Knowledge Base | BlackHOST","description":"Knowledge Base","publisher":{"@id":"https:\/\/black.host\/hc\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/black.host\/hc\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/black.host\/hc\/#organization","name":"BlackHOST","url":"https:\/\/black.host\/hc\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/black.host\/hc\/#\/schema\/logo\/image\/","url":"https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2020\/05\/text.png","contentUrl":"https:\/\/black.host\/hc\/wp-content\/uploads\/sites\/3\/2020\/05\/text.png","width":1200,"height":143,"caption":"BlackHOST"},"image":{"@id":"https:\/\/black.host\/hc\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/BlackH0ST\/","https:\/\/x.com\/_blackhost","https:\/\/www.youtube.com\/c\/BlackHOST","https:\/\/www.linkedin.com\/company\/blackhost","https:\/\/www.instagram.com\/_blackhost\/","https:\/\/ch.pinterest.com\/BlackH0ST\/","https:\/\/mastodon.social\/@blackhost","https:\/\/primal.net\/BlackHOST"]},{"@type":"Person","@id":"https:\/\/black.host\/hc\/#\/schema\/person\/a9f685da3ffad63071d6e4173555e1a0","name":"Thomas Nuchatel","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/56ccd114c4d0553e66448d4423073e3c9b336a6cbedce70e926d3404837f3255?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/56ccd114c4d0553e66448d4423073e3c9b336a6cbedce70e926d3404837f3255?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/56ccd114c4d0553e66448d4423073e3c9b336a6cbedce70e926d3404837f3255?s=96&r=g","caption":"Thomas Nuchatel"},"sameAs":["https:\/\/black.host"]}]}},"acf":[],"lang":"en","translations":{"en":1634},"amp_enabled":true,"pll_sync_post":[],"_links":{"self":[{"href":"https:\/\/black.host\/hc\/wp-json\/wp\/v2\/posts\/1634","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/black.host\/hc\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/black.host\/hc\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/black.host\/hc\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/black.host\/hc\/wp-json\/wp\/v2\/comments?post=1634"}],"version-history":[{"count":27,"href":"https:\/\/black.host\/hc\/wp-json\/wp\/v2\/posts\/1634\/revisions"}],"predecessor-version":[{"id":1769,"href":"https:\/\/black.host\/hc\/wp-json\/wp\/v2\/posts\/1634\/revisions\/1769"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/black.host\/hc\/wp-json\/wp\/v2\/media\/1772"}],"wp:attachment":[{"href":"https:\/\/black.host\/hc\/wp-json\/wp\/v2\/media?parent=1634"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/black.host\/hc\/wp-json\/wp\/v2\/categories?post=1634"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/black.host\/hc\/wp-json\/wp\/v2\/tags?post=1634"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}