Documentation for the WordPress site hosted at enclari.com.
web/opt/stack/wp/docker-compose.ymlwordpress_db-data)wordpress_wp-datawebsecure with Let's Encrypt DNS-01 Hetznerservices:
db:
image: mariadb:10.11
environment:
MYSQL_DATABASE: wordpress
MYSQL_USER: wp
MYSQL_PASSWORD: ${WP_DB_PASS}
MYSQL_ROOT_PASSWORD: ${WP_DB_ROOT_PASS}
volumes:
- wordpress_db-data:/var/lib/mysql
networks: [web]
restart: unless-stopped
wordpress:
image: wordpress:php8.2
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wp
WORDPRESS_DB_PASSWORD: ${WP_DB_PASS}
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress_wp-data:/var/www/html
networks: [web]
restart: unless-stopped
labels:
- traefik.enable=true
- traefik.docker.network=web
- traefik.http.routers.wp.rule=Host(`enclari.com`)
- traefik.http.routers.wp.entrypoints=websecure
- traefik.http.routers.wp.tls=true
- traefik.http.routers.wp.tls.certresolver=le
- traefik.http.routers.wp.middlewares=secure-headers
- traefik.http.services.wp.loadbalancer.server.port=80
pma:
image: phpmyadmin:5
environment:
PMA_HOST: db
PMA_USER: root
PMA_PASSWORD: ${WP_DB_ROOT_PASS}
networks: [web]
restart: unless-stopped
labels:
- traefik.enable=true
- traefik.docker.network=web
- traefik.http.routers.pma.rule=Host(`pma.enclari.com`)
- traefik.http.routers.pma.entrypoints=websecure
- traefik.http.routers.pma.tls=true
- traefik.http.routers.pma.tls.certresolver=le
- traefik.http.routers.pma.middlewares=authentik-forwardauth@docker,secure-headers
- traefik.http.services.pma.loadbalancer.server.port=80
volumes:
wordpress_db-data:
wordpress_wp-data:
networks:
web:
external: true
Covered by global backup script with tag service=wp.
What to include
/opt/stack/wpwordpress_db-data, wordpress_wp-dataManual backup
/root/backup.sh backup wp
restic snapshots --tag service=wp
Restore flow
cd /opt/stack/wp && docker compose down
rsync -aHAX --delete /opt/restore/wp-<TS>/opt/stack/wp/ /opt/stack/wp/
for V in $(docker volume ls -q | grep '^wordpress_'); do
rsync -aHAX --delete /opt/restore/wp-<TS>/var/lib/docker/volumes/$V/_data/ /var/lib/docker/volumes/$V/_data/
done
docker compose up -d
# Update WordPress and phpMyAdmin
cd /opt/stack/wp
docker compose pull && docker compose up -d
# Logs
docker compose logs -f --tail=200 wordpress
docker compose logs -f --tail=200 pma
# DB shell
docker exec -it $(docker ps --filter name=wp_db --format '{{.ID}}') mysql -u root -p