Migrate a site
This tutorial will guide you in moving your production site on the App.
This tutorial assumes you’ve created a site on Bitpoke App and will guide you in how to migrate the contents of your production site into your newly created site on the Bitpoke App. Any WordPress site is usually split in three main components: the code (themes and plugins), the database and the media files, so we’ll take each of these one by one.
To follow this tutorial, you’ll need a site to move, more exactly archives of its code, database and media files. In this tutorial, the site to be moved is in a repository called mysite
and it will be moved into a repository called my-dashboard-site
.
You’ll also need to have installed the mysql command line , kubectl and Google SDK .
Step 1. Import the code
1. Create a repository on GitHub
You’ll need to store your code on your own GitHub repository and you can use our
Stack example repo
as a starting point. For example, you can create a new repository (my-dashboard-site
) and copy the contents from stack-example-wordpress
into your new repo.
2. Setup Google Cloud Build
You can also set up any other CI that updates the site when pushing on master, but in this tutorial we’ll follow the setup with Google Cloud Build. Here are Google’s detailed steps on how to run builds on GitHub , which we’ll also take one by one here.
Google Cloud Build will allow you to connect your GitHub repository with your GCP project and set up continuous integration for your repository.
The steps below provide instructions for installing the app only for one repository, in this case my-dashboard-site
. Be aware to replace this with the name of your own repository on GitHub.
-
The first thing you need to do is enable the Cloud Build API in the GCP project where your Bitpoke App site is.
-
Go to the GitHub marketplace page for the Google Cloud Build app , scroll down and click
Setup with Google Cloud Build
at the bottom of the page.If you’ve already done this, click on
Edit your plan
. -
If prompted, sign in to GitHub.
-
In the Edit your plan page, select or update your billing information and click
grant this app access
. If you have previously purchased the GitHub Cloud Build App and are reinstalling it, skip this step. -
Select the Only select repositories option, then use the Select repositories drop-down to only enable your repository (
my-dashboard-site
) for access via the Cloud Build app. You will also be able to enable additional repositories later. -
Click Install.
-
Sign in to GCP then click Authorize Google Cloud Build by GoogleCloudBuild.
-
Select your GCP project where you’ve created your cluster , check the consent checkbox and click Next.
-
In the Select repository page that appears, select the checkbox next to your target repository, in this case
my-dashboard-site
, then click onConnect repository
. -
If you wish to create one or more initial default trigger(s) that will trigger builds on any branch push, use the Create a push trigger page that appears to those triggers. Select the boxes next to each target repository and click
Create push triggers
. Otherwise, skip this step. -
You now have successfully installed the Google Cloud Build app, connected your repository to your GCP project, and created push triggers that will launch your build(s).
-
Additionally, you can go to Google Cloud Platform - Cloud Build - Triggers to edit your trigger to only trigger builds when you push on the master branch.
3. Setting service account permissions
You need to enable your service account to manage the Kubernetes Engine resources, you can read more about setting service account permissions on Google’s documentation.
Go to Google Cloud Platform - Cloud Build - Settings and enable the Kubernetes Engine service:
4. Create a cloudbuild.yaml
file
To use the Google Cloud Build app, your repository must contain a cloudbuild.yaml
file to configure your build. Create a file named cloudbuild.yaml
in your project root directory.
You can read more about creating a cloudbuild.yaml file on Google’s documentation, but for now you can use this example as a starting point:
steps:
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/${_SITE_NAME}:$SHORT_SHA', '.' ]
- name: 'gcr.io/cloud-builders/kubectl'
args: ['patch', '-n', '${_PROJECT_NAME}', 'wordpress', '${_SITE_NAME}', '--type=json', '-p', '[{"op": "replace", "path": "/spec/image", "value": "gcr.io/$PROJECT_ID/${_SITE_NAME}:$SHORT_SHA"}]']
env:
- 'CLOUDSDK_COMPUTE_ZONE=<your cluster zone>'
- 'CLOUDSDK_CONTAINER_CLUSTER=<your cluster name>'
images:
- 'gcr.io/$PROJECT_ID/${_SITE_NAME}:$SHORT_SHA'
substitutions:
_SITE_NAME : <your site name>
_PROJECT_NAME : <your project name>
What you need to replace:
-
<your cluster zone>
and<your cluster name>
with the zone where your cluster was created and its name, go toGoogle Cloud Platform -> Kubernetes Engine -> Clusters
to see them (make sure you also have selected the right project):In this example
<your cluster zone>
isus-central1-a
and<your cluster name>
isstandard-cluster-1
. -
<your site name>
and<your project name>
, you can see these in the Bitpoke App, in the Runtime section of your site:
5. Add themes and plugins to the repo
In your Bitpoke App repository (my-dashboard-site
), copy the wp-content/themes
and wp-content/plugins
folders from the site you want to move (mysite
).
After you push your changes, go to Google Cloud Platform - Cloud Build to see if your build was successful.
Step 2. Import the database
You will need a database backup to import into your Bitpoke App site, e.g. mysite-mysql-backup.sql
.
- Do a search-replace in your backup for any fields that have set as default
0000-00-00 00:00:00
. Because MySQL runs withNO_ZERO_DATE
you’ll get errors if you leave them as0000-00-00 00:00:00
.
You can run for example:
sed -i 's/0000-00-00 00:00:00/1970-01-01 00:00:00/g' mysite-mysql-backup.sql
- Go to your Bitpoke App, on the Commands section and run the commands from Connect to the Database on your local machine, to connect to the database.
First, you set up port forwarding in order to be able to connect from your machine.
kubectl -n proj-fmjyxx port-forward default-mysql-0 3307:3306
Leave this running and open a new terminal tab, than get the username, password and database name and export them as environment variables:
export MYSQL_USER="$(kubectl -n proj-fmjyxx get secret mysite-bitpoke-m-sw1tg-mysql -o jsonpath='{.data.USER}' | base64 --decode)"
export MYSQL_PWD="$(kubectl -n proj-fmjyxx get secret mysite-bitpoke-m-sw1tg-mysql -o jsonpath='{.data.PASSWORD}' | base64 --decode)"
export MYSQL_DATABASE="$(kubectl -n proj-fmjyxx get secret mysite-bitpoke-m-sw1tg-mysql -o jsonpath='{.data.DATABASE}' | base64 --decode)"
Finally, connect to the database using the mysql command-line, without the need to type the password, used by default from the environment variable.
mysql -u ${MYSQL_USER} -h 127.0.0.1 -P 3307 ${MYSQL_DATABASE}
- Import the database
> source ~/Desktop/mysite-mysql-backup-2019-11-26-1243-0CCM76FFY4APG0P.sql
Step 3. Import media files
Go to Commands - Access the media files to see your storage details:
To import the media files, you can use the command you find here, under Using the CLI
:
gsutil -m cp -r ./wp-content/uploads gs://my-first-project-170ol/mysite-bitpoke-m-sw1tg/wp-content/
Just copy it and run it on your local machine, depending on where you have your uploads archive. After this, you can open your storage browser to see your newly imported media files.
When you import the media files, the files will have set as owner the user that uploads them, which means WordPress won’t have reading/writing rights. You need to run the following command to change this (replace with your own data):
gsutil -m acl ch -r -u my-first-project-170ol@testing-reactor.iam.gserviceaccount.com:O gs://my-first-project-170ol/mysite-bitpoke-m-3xvq6/wp-content/uploads/
You need to replace:
my-first-project-170ol@testing-reactor.iam.gserviceaccount.com
with your own email
To find it out, copy your K8s project namespace
, than run on your local machine:
kubectl -n <K8s project namespace> describe iamserviceaccount
Look for the email field and copy it, in this case is my-first-project-170ol@testing-reactor.iam.gserviceaccount.com
.
gs://my-first-project-170ol/mysite-bitpoke-m-3xvq6/wp-content/uploads/
with your own storage bucket, you can see it in theAccess Media file
section above and also on theBitpoke App -> Overview
page