Skip to content

ierfanfahruddin/docker-php-stack

Repository files navigation

Docker PHP Stack dengan Apache

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

Daftar Isi

Prasyarat

Sebelum memulai, pastikan Anda telah menginstal:

  • Docker
  • Docker Compose

Instalasi

  1. Clone repository ini ke direktori lokal Anda:

    git clone https://github.com/ierfanfahruddin/docker-php-stack
    cd docker-php-stack
  2. Pastikan Docker dan Docker Compose telah terinstal di sistem Anda.

Menjalankan Aplikasi

  1. Jalankan layanan dengan perintah:

    docker compose -f docker-compose-apache.yml up -d
  2. Tunggu beberapa saat hingga semua layanan berjalan.

  3. Akses aplikasi di browser Anda melalui:

    • http://localhost:8080/ untuk aplikasi Laravel Filament
    • http://project-a.localhost:8080/ untuk contoh proyek A
    • http://project-b.localhost:8080/ untuk contoh proyek B
    • http://php7.localhost:8080/sample/ untuk contoh proyek PHP 7.4
    • http://php8.localhost:8080/sample/ untuk contoh proyek PHP 8.3
  4. Untuk menghentikan layanan:

    docker compose -f docker-compose-apache.yml down

Struktur Direktori

.
├── 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
└── ...

Menjalankan Proyek Baru

Untuk menambahkan proyek baru:

  1. 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/
  2. 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/
  3. 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.yml jika diperlukan
    • Akses proyek melalui URL yang telah dikonfigurasi

Tidak perlu konfigurasi tambahan untuk setiap proyek baru selama mengikuti struktur yang telah disediakan.

Konfigurasi Apache

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

Konfigurasi Environment

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=postgres

Pastikan untuk mengganti password dengan yang lebih aman sebelum menjalankan aplikasi di lingkungan produksi.

Docker Compose

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.

Perintah Umum

Masuk ke container PHP FPM:

# 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 sh

Backup dan Restore Database PostgreSQL:

Proses 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:

  1. Salin file .zip dari Windows ke filesystem WSL terlebih dahulu:

    cp /mnt/c/Users/<user>/Downloads/nama_file.zip ~/backup/nama_file.zip
  2. Ekstrak file .zip di dalam WSL:

    cd ~/backup
    unzip nama_file.zip
    # Pastikan file .sql hasil ekstrak ada di direktori ini
    ls -lh ~/backup/

    Jika unzip belum tersedia: sudo apt install unzip

Setelah file .sql tersedia di filesystem WSL, lanjutkan ke langkah 1 di bawah seperti biasa.

  1. Salin file backup ke dalam kontainer: Gunakan docker cp untuk menyalin file .sql atau .backup dari komputer Anda ke direktori /tmp di 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
  2. Jalankan perintah restore: Gunakan docker exec untuk menjalankan psql di 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
  3. (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 container:

# 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-postgre

Penyelesaian Masalah

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

  1. Cek config yang aktif di repo:

    git config --list | grep filemode

    Jika muncul dua baris dan salah satunya core.filemode=true, lanjut ke langkah berikut.

  2. Set core.filemode=false di level lokal repo (jalankan di dalam direktori project):

    git config core.filemode false
  3. Verifikasi — semua perubahan permission seharusnya hilang dari Source Control:

    git status

Catatan: Jangan gunakan git config --global core.filemode false saja, 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.

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

  2. 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
  3. Jalankan git pull lagi:

    git pull

Pencegahan: Ini terjadi karena Docker container menulis file dengan user container-nya. Untuk mencegah berulang, tambahkan user di service PHP-FPM pada docker-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:

  1. Pastikan file .env di direktori aplikasi Laravel sudah dikonfigurasi dengan benar
  2. Periksa konfigurasi session di config/session.php
  3. Verifikasi bahwa CSRF token disertakan dalam request POST/PUT/PATCH/DELETE
  4. Cek log Apache untuk informasi lebih detail tentang error

Jika mengalami masalah koneksi seperti "refused to connect":

  1. Pastikan semua layanan Docker berjalan dengan perintah docker compose -f docker-compose-apache.yml up -d
  2. Gunakan format URL yang benar: http://[nama-virtual-host]:8080/ karena semua layanan dijalankan melalui port 8080
  3. Periksa file hosts sistem Anda jika perlu menambahkan entri untuk virtual host

Lisensi

Proyek ini dilisensikan di bawah MIT License.

Releases

No releases published

Packages

 
 
 

Contributors