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. 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. |