We have the Git client available at Kinsta so you can SSH in and pull your own Git repo down from Github, Gitlab, Bitbucket, or any other third-party. SSH access is available on all of Kinsta’s hosting plans.

If you’re just starting out, make sure to read our guide on git vs Github.

However, we don’t yet have the feature released where you can just git push kinsta my_site and it automatically gets deployed. This part is coming. But you can still easily use Git at Kinsta, just follow the instructions below.

How to Use Git

You can create a deployment script in a few minutes that will SSH into your Google Cloud Linux container and pull down the latest version of your repo. Your SSH details for your Kinsta site can be found on the Info page of your site in MyKinsta.

SSH terminal command in MyKinsta.
SSH terminal command in MyKinsta.

The command to pull your repo to your public directory will look something like this:

ssh [email protected] -p portnumber "cd /www/my_site/public && git pull"

Another way of doing this is to utilize WP Pusher. Many of our clients use this and it makes it super easy, as you don’t have to know how to use Git or SSH.

Austin also has an excellent tutorial on how to set up automatic Git deploy with Kinsta using SSH.

Some other alternatives include Beanstalk and DeployBot. Otherwise, you can follow the more detailed Git instructions below.

Clone Repo

To clone a repo:

git clone https://github.com/USER/REPO.git

When using Git for private repositories, you use your GitHub username and password which are passed to the server.

git clone https://username:[email protected]/USER/REPO.git

If two-factor authentication is enabled, an OAuth token must be used in place of your standard credentials. Follow these instructions on how to create an OAuth token.

To clone a repo that has 2FA enabled:

git clone https://[email protected]/USER/REPO.git

Private Repo

If it’s a private repo, credentials need to be added to the git pull:

Pull

ssh [email protected] -p portnumber "cd /www/my_site/public && git pull https://username:[email protected]/USER/REPO"

Private Repo With 2FA

If two-factor authentication is enabled, an OAuth token must be used in place of your standard credentials. Follow these instructions on how to create an OAuth token. To deploy a repo that has 2FA enabled:

Pull

ssh [email protected] -p portnumber "cd /www/my_site/public && git pull https://[email protected]/USER/REPO"

If the git pull above doesn’t contain credentials and the HTTPS path, it will attempt to look locally (rather than at the hosted repo) and throw the message: “Everything up-to-date.”

Dealing With Conflicts Found

If you change something on remote the deployment commands above will abort due to conflicts found. What should you do then? It depends on which one you want to treat as “King.” In this example below, we will treat the Git repo as “King” and forget the conflicts.

Force Pull

Fair warning. The following overwrites changes that exist on remote with what is in the Git repo.

ssh [email protected] -p portnumber "cd /www/MY_SITE/public && git fetch https://[email protected]/USER/REPO.git && git reset --hard kinsta/mysite"

If you have questions regarding how to use Git at Kinsta our support department will be happy to help once you’re up and running.

How to Auto Deploy to Kinsta with GitLab CI/CD (Advanced)

For more advanced users, GitLab CI/CD (continuous integration/continuous delivery) can be used to automatically push code changes to your Kinsta site whenever a new commit is pushed to the relevant branch. This method allows you to continuously push code to your live environment on Kinsta without overwriting the WordPress MySQL database.

Create a Kinsta Site (optional)

For the purposes of this tutorial, we’ll be creating a new empty site on Kinsta, and we will install WordPress later on. If you already have a Kinsta site, you can still follow along with this tutorial.

In MyKinsta, go to your Sites page and click Add Site in the upper right corner. Select the Don’t Install WordPress option, name your site, select a location, and click the Add Site button to finish the site creation process.

Create an empty site in MyKinsta.
Create an empty site in MyKinsta.

Create a GitLab Project

To get started, head over to GitLab and click Create a Project to create a new repository for your Kinsta site.

Create a project in GitLab.
Create a project in GitLab.

Select the Blank Project option, and fill in the “Project Name” and “Project Slug” fields.

Create a blank project in GitLab.
Create a blank project in GitLab.

For the Visibility Level option, we recommend making the repository private. Since this repository may contain premium plugin and theme code, leaving it accessible over the public Internet would allow anyone to download the products you paid for.

Once you’re finished configuring the new project, click Create Project to continue.

Configure SSH Keys

Next, you’ll need to add SSH keys to GitLab and MyKinsta to allow the two platforms to communicate with each other. Let’s start with adding an SSH key in GitLab.

Add SSH Public Key to GitLab

First, SSH into your Kinsta live environment, and run the cat command below to display your SSH public key.

cat ~/.ssh/id_rsa.pub

Your public key should look similar to the one below. Keep your Terminal window open for the now, and go back to GitLab in your web browser.

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC7zdjwd6UIUJ5t4YnXNi6yhdHgrvIV2xgjvJ3592wd1Hzmnta4dau7yOIxQDU7/oNIr6DIskuIUii5ruGi4YZpIwB/AWGrn/uWb+FXJFiQHMZq9rCFcqtZXT0fyzKiSNkblV4F1RaPQJRvxfSUsSQ3jJU3FX8CF1c4R40CiBKkSHM8uavVIIESzgIHRiWVxkL9F6SKzg8GeTctJaAa3W+q1F1T60OKYmzH3OLdA37ZNmkm1CYWa8SF0JjOszxOnPwhfQ49P5r+rftXRFLz/7hGJ8CnUyzErSiUdUKNknUAB+w4KEZshQSNuiken0+GKqIw83dWWSyjiJJigcyDez2s+3AqDLHPG45NoBEXuBXjPQ9C08hokVyKlbzd/P2qvcnzUT5S6zTuaYOW+50+fiXeYkJlEoYYxoGRVx6FFdFqWyJx5UyaDv7QY3iQH0qct1iq9XGXMhBxIecIAEPUwF8nOp15in8L+5UIFMiNnihztTAXysc+8xvVwbuRlQIeR/E= ansible-generated on fvj-kinstagit

Click on the user icon dropdown in the upper right corner of GitLab, and click Settings.

Go to the GitLab settings page.
Go to the GitLab settings page.

On the Settings page, click on SSH Keys in the sidebar.

SSH keys in GitLab.
SSH keys in GitLab.

Paste your SSH public key into the text field. The title field should auto-populate with a name, but feel free to change it if you’d like. GitLab also allows you to set an expiration date for the SSH key. This option is useful if you invalidate and rotate SSH keys as part of your infrastructure security protocol. If you don’t, feel free to leave the Expires At field blank.

Add your SSH key in GitLab.
Add your SSH key in GitLab.

After you’ve double-checked your configuration, click Add Key to finalize the process.

Add SSH Public Key to MyKinsta

Now that your SSH public key has been to GitLab, you’ll need to add the same key to MyKinsta. In MyKinsta, click on your user icon in the lower left corner and click User Settings. This step adds the Kinsta public key to your site’s authorized_keys file (only writable by root and MyKinsta) and will allow GitLab to SSH into your site to push code changes.

User settings in MyKinsta.
User settings in MyKinsta.

Scroll down and click Add SSH Key.

Add SSH key in MyKinsta.
Add SSH key in MyKinsta.

In the modal/pop-up window, specify a name/label for the SSH key, paste your public key in the SSH key text field, and click Add SSH key to finalize the process.

Add your SSH key in MyKinsta.
Add your SSH key in MyKinsta.

Add SSH Private Key to GitLab

Next, you’ll need to add your Kinsta live environment’s SSH private key as an environment variable in GitLab. The private key will allow GitLab to SSH into your Kinsta site to push code changes directly.

To find your private key, run the Terminal command below in your Kinsta live environment. Be sure not to share your SSH private key anywhere outside GitLab.

cat ~/.ssh/id_rsa

In GitLab, click on the project you created earlier. In the sidebar, hover over “Settings” and click CI/CD.

GitLab repository CI/CD settings.
GitLab repository CI/CD settings.

Scroll down to the Variables section, click the Expand button, and click Add Variable. Use SSH_PRIVATE_KEY for the key name, paste your private key into the text field, and click Add Variable to continue.

After the variable has been added, you’ll be able to see it in your repository settings.

SSH private key variable in GitLab.
SSH private key variable in GitLab.

Clone GitLab Repo to MyKinsta

Now that the necessary SSH keys have been added, you can clone your GitLab repository to your Kinsta live environment. In GitLab, navigate to your repository, click on the blue Clone button, and copy the URL under Clone with SSH.

Clone with SSH in GitLab.
Clone with SSH in GitLab.

Next, SSH into your Kinsta live environment and navigate to your home directory. If you are unsure how to get to your home directory, use the command below.

cd ~/

Once you’re in the home directory, run the git clone command with the URL you copied from GitLab.

git clone [your-repository-url-here]

After cloning the repository, you’ll see a warning that says “you appear to have cloned an empty repository”. This is to be expected because the repo is empty at the moment.

Clone your GitLab repository to your Kinsta live environment.
Clone your GitLab repository to your Kinsta live environment.

At Kinsta, our Nginx configuration serves content from the ~/public folder. Thus, you’ll want to delete the current ~/public folder and rename your cloned repo folder to ~/public. To do this, run the two commands below.

rm -rf ~/public
mv ~/your-repo-folder-name ~/public

Configure GitLab Repo

Next, use the command below to navigate to the ~/public folder.

cd ~/public

Run the two commands below to configure your GitLab repo. Be sure to specify a valid email address and a username of your choice.

git config --global user.email "[email protected]"
git config --global user.name "brian"

Install WordPress with WP-CLI

Now that the GitLab repo has been cloned to your Kinsta live environment and configured, let’s install WordPress. You can either install WordPress manually by downloading it from wordpress.org, or you can install it with WP-CLI. For this example, we’ll use WP-CLI to install WordPress with the command below in the ~/public folder.

wp core download

After installing WordPress, your ~/public folder should look like this:

A fresh WordPress installation with WordPress core files and directories.
A fresh WordPress installation with WordPress core files and directories.

Next, go to the Domains page in MyKinsta for your site, and visit your Primary domain.

Visit your primary domain to configure WordPress.
Visit your primary domain to configure WordPress.

You’ll be greeted with the WordPress five-minute installation process. If you’re unsure about how to set up WordPress, we have an in-depth guide here.

Configure the new installation of WordPress.
Configure the new installation of WordPress.

After WordPress has been installed, you should be able to see your new WordPress site by visiting your primary domain.

A new WordPress install.
A new WordPress install.

Configure the GitLab CI/CD Pipeline

Next, you’ll need to set up a special configuration file to instruct GitLab to initiate automatic deployments after the repo’s main branch has been updated. To do this, navigate to the ~/public folder in your Kinsta live environment and create a new file called .gitlab-ci.yml with the command below.

cd ~/public && touch .gitlab-ci.yml

After the file has been created, add the following text to the file. You can either edit the file with nano or vim in Terminal, or with SFTP and a text or code editor. If you use an SFTP client, be sure to enable hidden files in order to see the .gitlab-ci.yml file.

before_script:
    - apt-get update -qq
    - apt-get install -qq git
    # Setup SSH deploy keys
    - 'which ssh-agent || ( apt-get install -qq openssh-client )'
    - eval $(ssh-agent -s)
    - ssh-add <(echo "$SSH_PRIVATE_KEY")
    - mkdir -p ~/.ssh- '[[ -f /.dockerenv ]] && echo -e "Host *ntStrictHostKeyChecking nonn" > ~/.ssh/config'
deploy_live:
    type: deploy
    environment:
        name: Live
        url: your-primary-domain
    script:
        - ssh [email protected] -p port-number "cd public-root && git checkout main && git pull origin main && exit"
    only:
        - main

Be sure to change the url and script parameters in the deploy_live block. You’ll want to replace the bolded values with your site’s settings from MyKinsta .

Public path and SSH details in MyKinsta.
Public path and SSH details in MyKinsta.

The only: - main section of the file refers to the repository branch that will trigger GitLab’s CI/CD process. With this configuration, pushes to the main branch will initiate a deployment to your Kinsta live environment. If you would like to specify another branch to trigger deployment, feel free to change the configuration.

If you’d like to implement additional granularity to the configuration to account for a staging environment, you can add an additional deploy_staging block with the URL and SSH details for your Kinsta staging environment.

deploy_staging:
    type: deploy
    environment:
        name: Staging
        url: your-staging-domain
    script:
        - ssh [email protected] -p port-number "cd public-root && git checkout main && git pull origin staging && exit"
    only:
        - staging

Notice the only: - staging section as well – this means pushes to the staging branch will initiate GitLab’s CI/CD process.

Initial Commit to GitLab

Now that WordPress and the GitLab configuration file are set up, let’s make an initial commit to GitLab. To do this, we’ll create a new branch called v0.1, start tracking the files in the repo, commit the changes, and push the changes to GitLab on the v0.1 branch. Run the commands below from ~/public to trigger the initial commit.

git checkout -b v0.1
git add .
git commit -a -m 'Initial Commit'
git push origin v0.1

If you check your repository in GitLab, you’ll now see the files from your initial commit.

Initial commit to GitLab.
Initial commit to GitLab.

Configure Kinsta Staging Environment

The next step is to create and configure a staging environment in MyKinsta so you have a safe place to test out new plugins, themes, and code without impacting your production environment.

Create a staging environment in MyKinsta.
Create a staging environment in MyKinsta.

SSH into the staging environment, and run the command below to check for any code changes.

cd ~/public && git status

You should see a message like the one below. As you can see, the branch is the v0.1 one that was created earlier. In addition, the wp-config.php file has changed. This happens because Kinsta adds a few additional lines to wp-config.php during the push from live to staging.

Changed files in the Kinsta staging environment.
Changed files in the Kinsta staging environment.

Commit and Push Changes to Live

Finally, let’s make some changes to the staging environment and push a new commit to the Kinsta live environment using GitLab. Keep in mind the purpose of this method is to bypass Kinsta’s normal Push to Live feature which overwrites the WordPress database as well.

For this example, let’s install the Yoast SEO plugin using WP-CLI with the command below.

cd ~/public && wp plugin install wordpress-seo

After the Yoast SEO plugin has been installed, run the commands below to make a commit and push the changes to the v0.1 branch.

git add .
git commit -a -m ‘Installed Yoast SEO plugin.’
git push origin v0.1

Finally, let’s switch over to the main branch, merge v0.1 to main, and push main to GitLab with the commands below. This will cause GitLab to initiate a deployment process to your Kinsta live environment because of the only: - main setting in the GitLab configuration file.

git checkout main
git merge v0.1
git push origin main

In GitLab, go to CI/CD > Jobs in your repo’s sidebar, and you’ll see the job running. This job is GitLab pushing the Yoast SEO plugin to your Kinsta live environment.

Active job in GitLab.
Active job in GitLab.

After the job is finished, run wp plugin list on your Kinsta live environment. You should see wordpress-seo – the Yoast SEO plugin that was installed on the staging environment earlier.

The Yoast SEO plugin was deployed via GitLab.
The Yoast SEO plugin was deployed via GitLab.

If you’re a theme or plugin developer who works with Kinsta sites, setting up auto deploys via GitLab CI/CD can help speed up your workflow. This setup allows you to deploy code from either your local environment or Kinsta staging environment without having to overwrite the MySQL database on your live production site.