Proyek: WordPress dan MySQL

Situs WordPress lengkap dengan MySQL, tanpa satu baris Dockerfile pun: kedua image resmi disusun menjadi satu stack Compose dengan dua volume terpisah (db-data untuk isi database, wp-content untuk tema, plugin, dan unggahan), healthcheck, serta resep backup dan restore yang bisa diuji lewat disaster drill.

Struktur Berkas #

BerkasPeran
compose.yamlService db (mysql:8.4) dan wordpress (wordpress:6.8-apache)
.env.exampleContoh environment kredensial (salin menjadi .env)
.gitignoreMemastikan .env tidak ikut ter-commit
README.mdDokumen ini

Prasyarat #

bash
cp .env.example .env

Lalu edit .env dan ganti kedua password. Compose menolak menyala bila kedua variabel itu kosong — pesan galatnya memandu Anda kembali ke .env.

Menjalankan #

bash
docker compose up -d

Tunggu db berstatus healthy (lihat docker compose ps), lalu buka http://localhost:8090. Karena wp-config.php sudah disiapkan entrypoint dari variabel WORDPRESS_DB_*, wizard tidak lagi menanyakan koneksi database. Empat langkah tersisa:

  1. Pilih bahasa (misalnya Bahasa Indonesia), lalu lanjut.
  2. Isi judul situs (misalnya Toko Kopi Kita), username admin (misalnya budi), password kuat, dan email.
  3. Klik Install WordPress hingga muncul halaman sukses.
  4. Klik Log In dan masuk ke dashboard wp-admin.

Backup #

Database dan berkas dicadangkan dengan alat berbeda karena bentuknya memang berbeda — mysqldump untuk data terstruktur, tar untuk berkas:

bash
# Backup database (tanpa -t agar aman untuk pipeline).
source .env && docker compose exec -T db sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" wordpress' | gzip > backup-wordpress-$(date +\%F).sql.gz

# Backup isi wp-content (tema, plugin, unggahan) dari container wordpress.
docker compose exec -T wordpress tar -czf - -C /var/www/html wp-content > backup-wp-content.tar.gz

Restore #

bash
# Restore database.
source .env && gunzip -c backup-wordpress-2026-10-13.sql.gz | docker compose exec -T db sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" wordpress'

# Restore wp-content: kosongkan dulu isi volume, lalu ekstrak, lalu
# restart container wordpress agar permission kembali rapi.
docker compose exec -T wordpress sh -c 'rm -rf /var/www/html/wp-content/* && tar -xzf - -C /var/www/html' < backup-wp-content.tar.gz
docker compose restart wordpress

Disaster Drill #

Uji cadangan Anda sebelum benar-benar dibutuhkan: hancurkan seluruh data dengan sadar, lalu bangkitkan situs dari berkas backup.

bash
docker compose down -v      # HAPUS volume: situs "hilang total"
docker compose up -d        # stack baru dengan volume kosong
# ulangi dua perintah Restore di atas

Buka kembali http://localhost:8090 — situs, tulisan, dan unggahan kembali seperti sebelum bencana. Backup yang belum pernah diuji restore-nya bukan backup.

Backup Otomatis (cron) #

Karakter % punya arti khusus di crontab sehingga harus ditulis \%:

cron
30 2 * * * cd /home/budi/wordpress-dan-mysql && source .env && docker compose exec -T db sh -c 'exec mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" wordpress' | gzip > backup-wordpress-$(date +\%F).sql.gz
30 3 * * 0 cd /home/budi/wordpress-dan-mysql && docker compose exec -T wordpress tar -czf - -C /var/www/html wp-content > backup-wp-content-$(date +\%F).tar.gz

Membersihkan #

bash
docker compose down          # volume db-data dan wp-content tetap ada
docker compose down -v       # sekaligus menghapus seluruh data situs