Proyek ini adalah contoh konfigurasi untuk menjalankan berbagai aplikasi PHP menggunakan Apache sebagai web server, dengan dukungan untuk beberapa versi PHP (7.4 dan 8.3).
- Prasyarat
- Instalasi
- Menjalankan Aplikasi
- Struktur Direktori
- Menjalankan Proyek Baru
- Konfigurasi Apache
- Konfigurasi Environment
- Docker Compose
- Perintah Umum
- Penyelesaian Masalah
- Lisensi
Sebelum memulai, pastikan Anda telah menginstal:
- Docker
- Docker Compose
-
Clone repository ini ke direktori lokal Anda:
git clone https://github.com/ierfanfahruddin/docker-php-stack cd docker-php-stack -
Pastikan Docker dan Docker Compose telah terinstal di sistem Anda.
-
Jalankan layanan dengan perintah:
docker compose -f docker-compose-apache.yml up -d
-
Tunggu beberapa saat hingga semua layanan berjalan.
-
Akses aplikasi di browser Anda melalui:
http://localhost:8080/untuk aplikasi Laravel Filamenthttp://project-a.localhost:8080/untuk contoh proyek Ahttp://project-b.localhost:8080/untuk contoh proyek Bhttp://php7.localhost:8080/sample/untuk contoh proyek PHP 7.4http://php8.localhost:8080/sample/untuk contoh proyek PHP 8.3
-
Untuk menghentikan layanan:
docker compose -f docker-compose-apache.yml down
.
├── apache/
│ ├── httpd.conf # Konfigurasi utama Apache
│ └── vhosts/
│ ├── laravel.conf # Virtual host untuk aplikasi Laravel
│ ├── php7.conf # Virtual host untuk proyek PHP 7.4
│ ├── php8.conf # Virtual host untuk proyek PHP 8.3
│ ├── project_a.conf # Virtual host untuk proyek A
│ └── project_b.conf # Virtual host untuk proyek B
├── docker-compose-apache.yml # Konfigurasi Docker Compose
├── php-83-fpm/
│ └── Dockerfile # Konfigurasi PHP 8.3 FPM
├── php-74-fpm/
│ └── Dockerfile # Konfigurasi PHP 7.4 FPM
├── www/
│ ├── laravel/ # Aplikasi Laravel Filament
│ ├── project_a/ # Contoh proyek sederhana
│ ├── project_b/ # Contoh proyek dengan koneksi database
│ ├── php7/ # Direktori untuk proyek PHP 7.4
│ │ └── sample/ # Contoh proyek PHP 7.4
│ └── php8/ # Direktori untuk proyek PHP 8.3
│ └── sample/ # Contoh proyek PHP 8.3
└── ...
Untuk menambahkan proyek baru:
-
Untuk proyek yang membutuhkan PHP 7.4:
- Letakkan file proyek Anda di direktori
www/php7/nama-proyek/ - Akses proyek melalui
http://php7.localhost:8080/nama-proyek/
- Letakkan file proyek Anda di direktori
-
Untuk proyek yang membutuhkan PHP 8.3:
- Letakkan file proyek Anda di direktori
www/php8/nama-proyek/ - Akses proyek melalui
http://php8.localhost:8080/nama-proyek/
- Letakkan file proyek Anda di direktori
-
Untuk proyek khusus (seperti Laravel Filament):
- Buat direktori baru di
www/dengan nama proyek Anda - Tambahkan konfigurasi virtual host baru di
apache/vhosts/ - Sesuaikan konfigurasi
docker-compose-apache.ymljika diperlukan - Akses proyek melalui URL yang telah dikonfigurasi
- Buat direktori baru di
Tidak perlu konfigurasi tambahan untuk setiap proyek baru selama mengikuti struktur yang telah disediakan.
Konfigurasi Apache telah dioptimalkan untuk aplikasi Laravel Filament dengan:
- Virtual host khusus untuk aplikasi laravel
- Pengaturan rewrite rules yang sesuai untuk Laravel
- Konfigurasi PHP-FPM yang terintegrasi
- Penanganan khusus untuk direktori Livewire dan Filament
- Virtual host terpisah untuk proyek PHP 7.4 dan 8.3
File .env berisi konfigurasi untuk database MySQL dan PostgreSQL:
# --- MySQL Credentials ---
MYSQL_DATABASE=db_mysql
MYSQL_USER=root # Atau user lain yang Anda inginkan
MYSQL_PASSWORD=password # <-- Isi password
MYSQL_ROOT_PASSWORD=root_password # <-- Isi password root
# --- PostgreSQL Credentials ---
POSTGRES_DB=db_postgre
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgresPastikan untuk mengganti password dengan yang lebih aman sebelum menjalankan aplikasi di lingkungan produksi.
File docker-compose-apache.yml mendefinisikan layanan berikut:
- apache: Web server Apache 2.4
- php-83-fpm: PHP 8.3 FPM
- php-74-fpm: PHP 7.4 FPM
- db-mysql: Database MySQL 8.0
- db-postgre: Database PostgreSQL 13
Setiap layanan telah dikonfigurasi dengan volume dan port yang sesuai untuk pengembangan lokal.
# Untuk PHP 8.3
docker compose -f docker-compose-apache.yml exec php-83-fpm sh
# Untuk PHP 7.4
docker compose -f docker-compose-apache.yml exec php-74-fpm shProses ini terdiri dari dua langkah utama: menyalin file backup ke dalam kontainer, lalu menjalankan restore.
Catatan performa penting (Windows + WSL):
- Jika file dump berada di path Windows (contoh:
/mnt/c/...) dan diakses dari container Linux, proses import bisa jauh lebih lambat. - Untuk import besar, simpan file backup di filesystem WSL (contoh:
/home/<user>/backup) lalu lakukan restore dari sana. - Hindari import langsung dari folder Windows saat kebutuhan utamanya adalah kecepatan.
Jika file backup dalam format .zip dari Windows, ikuti alur berikut sebelum langkah 1:
-
Salin file
.zipdari Windows ke filesystem WSL terlebih dahulu:cp /mnt/c/Users/<user>/Downloads/nama_file.zip ~/backup/nama_file.zip
-
Ekstrak file
.zipdi dalam WSL:cd ~/backup unzip nama_file.zip # Pastikan file .sql hasil ekstrak ada di direktori ini ls -lh ~/backup/
Jika
unzipbelum tersedia:sudo apt install unzip
Setelah file .sql tersedia di filesystem WSL, lanjutkan ke langkah 1 di bawah seperti biasa.
-
Salin file backup ke dalam kontainer: Gunakan
docker cpuntuk menyalin file.sqlatau.backupdari komputer Anda ke direktori/tmpdi dalam kontainer.# Ganti /path/to/your/nama_file.sql dengan lokasi file Anda docker cp /path/to/your/nama_file.sql db-postgre-15:/tmp/nama_file.sql -
Jalankan perintah restore: Gunakan
docker execuntuk menjalankanpsqldi dalam kontainer, menunjuk ke file yang baru saja Anda salin.# Pastikan database 'nama_db' sudah dibuat sebelumnya docker exec -it db-postgre-15 psql -U postgres -d nama_db -f /tmp/nama_file.sql
-
(Opsional) Hapus file backup dari kontainer:
Setelah proses restore selesai, Anda bisa menghapus file backup dari direktori /tmp di dalam kontainer untuk menghemat ruang.
docker exec -it db-postgre-15 rm /tmp/nama_file.sql# Melihat log Apache
docker compose -f docker-compose-apache.yml logs apache
# Melihat log PHP FPM
docker compose -f docker-compose-apache.yml logs php-83-fpm
# Melihat log database
docker compose -f docker-compose-apache.yml logs db-mysql
docker compose -f docker-compose-apache.yml logs db-postgreJika project di WSL tiba-tiba menampilkan ribuan file berubah (permission/filemode):
Masalah ini terjadi karena Git melacak perubahan permission file di WSL. Penyebabnya adalah config core.filemode=true di level lokal repo yang meng-override config global.
-
Cek config yang aktif di repo:
git config --list | grep filemodeJika muncul dua baris dan salah satunya
core.filemode=true, lanjut ke langkah berikut. -
Set
core.filemode=falsedi level lokal repo (jalankan di dalam direktori project):git config core.filemode false -
Verifikasi — semua perubahan permission seharusnya hilang dari Source Control:
git status
Catatan: Jangan gunakan
git config --global core.filemode falsesaja, karena config lokal repo akan tetap override-nya. Perintah harus dijalankan di dalam direktori project masing-masing.
Jika git pull error Permission denied / unable to unlink old:
Masalah ini terjadi karena file di dalam project dimiliki oleh user Docker container (biasanya UID 82 milik PHP-FPM), bukan user WSL. Akibatnya Git tidak bisa menghapus/replace file saat pull.
-
Cek owner file yang bermasalah:
ls -la path/ke/file/yang/error
Jika terlihat angka (misal
82 82) bukan nama user Anda, lanjut ke langkah berikut. -
Ganti ownership seluruh folder project ke user WSL Anda (jalankan di direktori project):
sudo chown -R namauser:namauser /path/ke/project # Contoh: sudo chown -R ierfan:ierfan /home/ierfan/projects/docker-php-stack/www/php7/simrs/simrs_slawi -
Jalankan git pull lagi:
git pull
Pencegahan: Ini terjadi karena Docker container menulis file dengan user container-nya. Untuk mencegah berulang, tambahkan
userdi service PHP-FPM padadocker-compose-apache.yml:php-74-fpm: user: "1000:1000" # Sesuaikan dengan UID user WSL Anda (cek dengan: id -u)
Jika mengalami error 405 Method Not Allowed:
- Pastikan file
.envdi direktori aplikasi Laravel sudah dikonfigurasi dengan benar - Periksa konfigurasi session di
config/session.php - Verifikasi bahwa CSRF token disertakan dalam request POST/PUT/PATCH/DELETE
- Cek log Apache untuk informasi lebih detail tentang error
Jika mengalami masalah koneksi seperti "refused to connect":
- Pastikan semua layanan Docker berjalan dengan perintah
docker compose -f docker-compose-apache.yml up -d - Gunakan format URL yang benar:
http://[nama-virtual-host]:8080/karena semua layanan dijalankan melalui port 8080 - Periksa file hosts sistem Anda jika perlu menambahkan entri untuk virtual host
Proyek ini dilisensikan di bawah MIT License.