# Day 8: Deploying with GitLab CI/CD & Docker Compose (WordPress + MySQL Stack)

In today's blog, we automate deploying a **WordPress and MySQL stack** using **Docker Compose** through **GitLab CI/CD**. Additionally, we’ll discuss an important issue if you later switch WordPress to run on **port 80**.

---

## 📜 **Docker Compose File —** `docker-compose.yaml`

Here’s the stack configuration:

```plaintext
version: '3.8'

services:
  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80  # WordPress runs on port 8080
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html

  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:
```

✅ **Access WordPress:** `http://<YOUR_VM_IP>:8080`

---

## 🤖 **GitLab CI/CD Pipeline —** `.gitlab-ci.yml`

```plaintext
stages:
  - deploy

deploy-job:
  stage: deploy
  image: alpine:latest
  
  before_script:
    - apk add --no-cache openssh sshpass

  script:
    - sshpass -p "$DOCKER_VM_PASSWORD" scp -o StrictHostKeyChecking=no docker-compose.yaml ${DOCKER_VM_USERNAME}@${DOCKER_VM_IP_ADDRESS}:/${DOCKER_VM_USERNAME}/docker-compose.yaml
    - sshpass -p "$DOCKER_VM_PASSWORD" ssh -o StrictHostKeyChecking=no ${DOCKER_VM_USERNAME}@${DOCKER_VM_IP_ADDRESS} "
        cd /${DOCKER_VM_USERNAME} && 
        docker compose -f docker-compose.yaml down &&
        docker compose -f docker-compose.yaml up -d
      "

  tags:
    - microk8s
```

✅ **Environment Variables Needed:**

| Variable Name | Description |
| --- | --- |
| `DOCKER_VM_IP_ADDRESS` | Remote Docker server's IP |
| `DOCKER_VM_USERNAME` | SSH username |
| `DOCKER_VM_PASSWORD` | SSH password |

---

## ⚠ **Running WordPress on Port 80 - Beware of Redirection Issues**

If you decide to change `8080:80` to `80:80` in your `docker-compose.yaml` to run WordPress on port **80**, you might face a **redirection issue**.

---

### ❌ **Reason for the Redirection**

WordPress **stores the site URL** (with the port) in the **database** when it's first installed. For example, if you ran it on:

```plaintext
http://68.183.86.22:8080
```

WordPress stores this URL inside the `wp_options` table (fields: `siteurl` and `home`). So, when you shift to **port 80**, WordPress **still tries to redirect** to the old port.

---

## 🔍 **How to Check Stored URL in WordPress**

1. Connect to the MySQL container:
    

```plaintext
docker exec -it <db-container-name> mysql -u exampleuser -pexamplepass
```

Example:

```plaintext
docker exec -it root-db-1 mysql -u exampleuser -pexamplepass
```

2. Run these SQL commands:
    

```plaintext
USE exampledb;
SELECT option_name, option_value FROM wp_options WHERE option_name IN ('siteurl', 'home');
```

You’ll likely see:

```plaintext
http://68.183.86.22:8080
```

---

## ✅ **How to Fix the Redirect**

Update the `siteurl` and `home` directly in the database:

```plaintext
UPDATE wp_options SET option_value = 'http://68.183.86.22' WHERE option_name = 'siteurl';
UPDATE wp_options SET option_value = 'http://68.183.86.22' WHERE option_name = 'home';
```

---

## 🔄 **Restart WordPress Container (Optional but Recommended)**

```plaintext
docker restart <wordpress-container-name>
```

Example:

```plaintext
docker restart root-wordpress-1
```

---

## 🌐 **Final Step:**

* Clear browser cache or try incognito mode.
    
* Access your WordPress on:
    

```plaintext
http://68.183.86.22
```

---

## 🎯 **Summary**

✅ GitLab CI/CD deploys your WordPress stack automatically  
✅ Docker Compose makes multi-container deployment simple  
✅ WordPress stores its base URL on first install  
✅ Update the database if you change the port later
