Create your VM or VPS

Item Recommended value Notes
Plan 4 CPU / 8 GB RAM / 160 GB SSD (the plan you selected) Gives enough head-room for MariaDB + PHP-FPM builds
Image Ubuntu 24.04 LTS Latest LTS keeps packages current a bit longer
Region closest to the majority of your visitors Lower TTFB

1. Hardening your server

Access your server via SSH as the root user, then run the following commands:

# Switch SSH to port 2222
sudo sed -i 's/^#\?Port .*/Port 2222/' /etc/ssh/sshd_config
sudo systemctl enable ssh
sudo systemctl start ssh
sudo systemctl restart ssh

# Refresh UFW rules
sudo ufw delete limit 22/tcp
sudo ufw limit 2222/tcp          # new, rate-limited SSH
sudo ufw allow 80/tcp            # HTTP
sudo ufw allow 443/tcp           # HTTPS
sudo ufw enable

# Next log-in:
# ssh -p 2222 root@<your-server-ip>

2. Install Docker Engine & Compose v2

sudo apt update && sudo apt install -y ca-certificates curl gnupg git
# 1) Docker official GPG & repo
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
 | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
 https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
 | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 2) Engine + compose-plugin
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER && newgrp docker
docker version && docker compose version   # verif

3 Clone your WordPress Pete bundle

mkdir -p ~/wordpress-pete && cd ~/wordpress-pete
git clone https://github.com/peterconsuegra/wp-pete-docker.git .

4. Prepare the .env file

cp .env.example.production .env
vim .env 

Add your own passwords:

MYSQL_ROOT_PASSWORD=EvenMoreSecret
PETE_DB_USER=pete
PETE_DB_NAME=pete_db
PETE_DB_PASS=pixma301
PETE_ENVIRONMENT=production
APACHE_RELOAD_SECRET=SuperReload123
APACHE_RELOAD_URL=http://apache/internal-reload
APACHE_CERTBOT_URL=http://apache/internal-certbot

5. Build & run

docker compose pull       
docker compose build      
docker compose up -d      
docker compose logs -f    

You should see:

php-1     | #######################################
php-1     | WordPress Pete installation completed
php-1     | #######################################
php-1     | #######################################
php-1     | Launching WordPress Pete...
php-1     | #######################################

Open your WordPress Pete installatin in your browser: http://yourserverip

6. Auto-Start WordPress Pete on System Boot

Press Command C or Control C on the terminal, and run the following commands:

cp wordpress-pete.service /etc/systemd/system/wordpress-pete.service
sudo systemctl daemon-reload
sudo systemctl enable --now wordpress-pete.service
sudo systemctl restart wordpress-pete.service

Docker workflow cheatsheet

Task Command What it does
Start / build stack docker compose up --build Build (if needed) + run all services.
Stop stack docker compose down Stop & remove containers (data stays).
Get a shell inside a service docker compose exec <service> bash

Enter into containers via the terminal e.g. wordpress, apache, php.

docker compose exec wordpress bash

docker compose exec apache bash

docker compose exec php bash

Re-build after editing a Dockerfile docker compose build --no-cache <service> Fresh image, no cache.
Reset phpMyAdmin docker compose down β†’ docker volume rm wp-pete-docker_pma_data Drops the pma volume so it’s rebuilt on next up.
Delete all volumes docker compose down -v Nukes containers and data.
Restart Apache in its container apache2ctl restart Run inside the apache (or wordpress) shell.
Apache vhosts live in /etc/apache2/sites-available β†’ configs
/etc/apache2/sites-enabled β†’ live symlinks
Edit, then apache2ctl graceful.
MySQL prompt docker compose exec db mysql -u root -p Enter DB inside the db container.