Pasti pada penasaran, kenapa WordPress bisa jalan bareng MinIO atau S3 Object Storage? Karena, pada dasarnya, WordPress itu bukan aplikasi microservice, tapi monolith stateful application. Terus, apakah WordPress bisa dibikin jadi aplikasi stateless? Jawabannya tentu BISA BANGET! Gimana caranya? Yuk, simak penjelasannya di bawah ini.
Jadi, ada beberapa tujuan yang mau dicapai di pembahasan kali ini:
1. Source code WordPress (core, theme, plugin) harus ada di Git
Semua file core, theme, dan plugin dikelola lewat Git biar mudah diatur dan bisa dipastikan konsisten di semua pod.
2. Folder upload tetap aman meski update source code dari Git
File media seperti gambar yang diunggah pengguna nggak boleh hilang tiap kali ada pembaruan. Solusinya, simpan file di volume ReadWriteMany atau pakai layanan object storage seperti MinIO atau S3.
3. WordPress bisa auto-scale pas traffic tinggi
Dengan pengaturan yang tepat, WordPress bisa dibuat horizontal scaling, memastikan performa tetap stabil walaupun ada lonjakan pengunjung.
Dengan pendekatan ini, kita bisa bikin WordPress jadi lebih modern, efisien, dan tetap berjalan lancar walau skalanya besar. Siap bikin WordPress stateless? Yuk, kita mulai! 🚀
Buat bucket dan key secret di dashboard minio


Jangan lupa untuk Access Key dan Key Secret disimpan yaa.. Nanti akan kita pergunakan untuk menghubungkan wordpress dengan S3 bucket (minio).
Ada banyak plugin dan solusi buat mindahin media WordPress ke storage yang kompatibel dengan S3. Salah satu favorit kita adalah S3 Uploads dari Human Made. Memang sih, ada sedikit konfigurasi dan filter tambahan yang perlu diatur biar bisa jalan dengan storage S3 di luar AWS. Selain itu, plugin ini juga butuh Composer, jadi ada beberapa langkah tambahan yang harus dilewati. Tapi tenang, begitu semua beres, plugin ini bakal bekerja dengan mulus!
Untuk deployment WordPress kita, sebenernya nggak banyak yang berubah. Cuma kita perlu tambahin plugin S3 Uploads ini ke dalam Git repository kita. Selain itu, ada beberapa konstanta yang harus kita tambahin biar plugin ini bisa jalan, plus sedikit filter buat menyesuaikan konfigurasi dengan MinIO.
Oke langsung saja kita masuk step by step untuk menambahkan pluginnya.
pertama masuk ke folder wordpress kalian lalu ke directory plugins.
$ cd wp-content/plugins
$ mkdir s3-uploads && cd s3-uploads
$ wget https://github.com/humanmade/S3-Uploads/releases/download/3.0.7/manual-install.zip
$ unzip manual-install.zip && rm manual-install.zip
Kalo sudah menjalankan perintah diatas saatnya kita menambahkan 1 folder baru di dalam folder wp-content dengan nama mu-plugins, dan tambahkan file dengan nama s3-endpoint.php dan copy-kan code dibawah ini.
<?php
add_filter( 's3_uploads_s3_client_params', function( $params ) {
$params['endpoint'] = 'http://minio-api:9000';
$params['use_path_style_endpoint'] = true;
return $params;
} );
add_filter( 's3_uploads_bucket_url', function( $url ) {
return content_url();
} );
untuk endpoint jangan lupa disesuaikan dengan punya kalian.
Kalo sudah selesai lanjut menambahkan config untuk minio di config wordpress.
Tambahkan pada file wp-config.php
define( 'S3_UPLOADS_BUCKET', getenv_docker('S3_UPLOADS_BUCKET', 'name bucket') );
define( 'S3_UPLOADS_KEY', getenv_docker('S3_UPLOADS_KEY', 'key_s3') );
define( 'S3_UPLOADS_SECRET', getenv_docker('S3_UPLOADS_SECRET', 'secret_s3') );
define( 'S3_UPLOADS_REGION', getenv_docker('S3_UPLOADS_REGION', 'word') );
define( 'S3_UPLOADS_ENDPOINT', getenv_docker('S3_UPLOADS_ENDPOINT', 's3_or_minio_endpoint') );
define( 'S3_UPLOADS_USE_PATH_STYLE_ENDPOINT',true );
atau bisa juga ditambakan lewat configMap jika deployment wordpress kalian menggunakan configMap.
Oke kalo sudah lanjut untuk mengconfig nginx kita agar lokasi wp-content/uploads agar bisa mengarah ke minio. Contoh configurasinya seperti ini
location /wp-content/uploads {
rewrite ^/wp-content/(.+) /blog/$1 break;
proxy_pass http://minio-api:9000;
}
Kalo sudah coba kalian deploy wordpressnya dan aktifasi pluginnya dan coba untuk upload image kalian dan cek apakah image kalian sudah masuk ke bucket minio kalian.

