# WordPress + LAMP - Self Hosted CMS

*WordPress is one of the most popular content management systems and today we will deploy this famous open-source program on our very own cloud instance*

First, create your virtual cloud instance. I will be making use of Ubuntu on xneelo.

Create an instance: How to guides

[xneelo Cloud](https://xneelo.co.za/help-centre/cloud/create-an-instance)\
[AWS EC2](https://docs.aws.amazon.com/efs/latest/ug/gs-step-one-create-ec2-resources.html)\
[MS Azure VM](https://cloud.google.com/compute/docs/instances/create-start-instance)

Step 1

Update repositories

```
sudo apt update -y
```

```
sudo apt upgrade -y
```

Step 2

Install the [Apache web server](https://httpd.apache.org/)

```
sudo apt install apache2
```

Start and enable Apache

```
sudo systemctl start apache2
sudo systemctl enable apache2
```

Step 3

Install [MariaDB database server](https://mariadb.org/)

```
sudo apt install mariadb-server
```

Secure the database (Follow the instructions after running the command)

```
sudo mysql_secure_installation
```

Copy the following code into a bash file.

This script will allow you to create a database, username, and password without the need to manually configure this.

Create the file

```
sudo nano adduser.sh
```

Paste the below code in the file and save the file by pressing *Ctrl + x*, *Y* & *Enter*

```
#!/bin/bash

# Prompt the user for database details
read -p "Enter the desired database name: " db_name
read -p "Enter the desired username: " username
read -s -p "Enter the desired password: " password
echo

# Access the MariaDB server
mysql -u root -p <<EOF
# Create the database
CREATE DATABASE $db_name;

# Create the user and set the password
CREATE USER '$username'@'localhost' IDENTIFIED BY '$password';

# Grant privileges to the user on the database
GRANT ALL PRIVILEGES ON $db_name.* TO '$username'@'localhost';

# Flush privileges
FLUSH PRIVILEGES;

EOF

# Inform the user about the success
echo "Database, username, and password created successfully."
```

Run the script and set your database credentials

```
sudo bash adduser.sh
```

Step 4

Install PHP

```
sudo apt install php libapache2-mod-php php-mysql
```

Step 5

Navigate to the *html* directory

```
cd /var/www/html
```

Download and install WordPress

```
sudo wget https://wordpress.org/latest.tar.gz
```

Unpack the Tar file

```
sudo tar -xzvf latest.tar.gz
```

Move the WordPress files

```
sudo mv wordpress/* .
```

Remove the empty directory & tar.gz file

```
sudo rmdir wordpress
```

```
sudo rm latest.tar.gz
```

Set the permissions

```
sudo chown -R www-data:www-data /var/www/html/
```

Copy the WP-Config file

```
sudo cp wp-config-sample.php wp-config.php
```

Configure the wp-config file with the MySQL database credentials

```
sudo nano wp-config.php
```

Update the lines as indicated below:

```
define('DB_NAME', 'yourdbname');
define('DB_USER', 'yourdbuser');
define('DB_PASSWORD', 'yourdbpassword');
```

Remove the default *index.html* page

```
sudo rm index.html
```

Create the *.htaccess* file

```
sudo touch .htaccess
```

*Complete the installation*

Open your web browser of choice and navigate to your instance IP address. The WordPress installation wizard should appear.

You can follow the on-screen instructions to complete the installation

Your WordPress website will be accessible on your instance server IP address. You can connect a custom domain name to the website by pointing your DNS A '@' & 'www' records to the instance server IP address

You need to update the 000-default.conf file with your domain name. This file controls the default virtual host settings for your web server. To update the file, type the following command:

```
sudo nano /etc/apache2/sites-available/000-default.conf
```

This will open the file in the nano text editor. Look for the **ServerName** directive and replace the default value with your domain name. Save the file (*Ctrl + x*, *Y* & *Enter*) and exit the editor.

Thats it! You have installed WordPress and can continue to develop your website!


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://tech.keeganturner.co.za/how-to-guides/wordpress-+-lamp-self-hosted-cms.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
