Sebagai developer, terkadang kita tidak bisa lari dari legacy project. Baru-baru ini, saya harus menghidupkan kembali aplikasi berbasis CodeIgniter 3 yang membutuhkan PHP 7.0. Masalahnya, PHP 7.0 dan Debian Stretch (base image-nya) sudah lama mencapai End of Life (EOL).

Di sistem immutable seperti Fedora Silverblue, menjalankan stack jadul ini di dalam kontainer adalah solusi paling bersih. Berikut adalah panduan setup LAMP Stack legacy menggunakan Podman, lengkap dengan trik repositori dan Composer.

Tantangan Repositori EOL

Masalah utama saat menggunakan php:7.0-apache sekarang adalah apt-get update pasti gagal karena server Debian Stretch sudah dipindahkan ke arsip. Kita harus melakukan patching pada sources.list di dalam Dockerfile agar bisa menginstall ekstensi yang dibutuhkan.

Struktur Project Modular

Agar rapi dan mudah dimigrasi, saya menggunakan struktur folder seperti ini:

legacy-lamp/
├── apache/
│   ├── Dockerfile
│   └── vhost.conf
├── mariadb/
│   └── Dockerfile
├── phpmyadmin/
├── code/         # Source code aplikasi (CI3/Laravel)
└── docker-compose.yaml

Dockerfile: Trik Archive & Composer 2.2

Inilah “resep rahasia” agar PHP 7.0 tetap bisa menginstall paket sistem dan menjalankan Composer modern (v2.2 LTS adalah versi terakhir yang mendukung PHP 7.0).

  • apache/Dockerfile
FROM docker.io/library/php:7.0.33-apache

# 1. Fix repository untuk Debian Stretch (EOL) agar bisa install paket
RUN sed -i 's|deb.debian.org|archive.debian.org|g' /etc/apt/sources.list && \
    sed -i '/security.debian.org/d' /etc/apt/sources.list && \
    sed -i '/stretch-updates/d' /etc/apt/sources.list && \
    echo 'Acquire::Check-Valid-Until "false";' > /etc/apt/apt.conf.d/10no-check-valid && \
    echo 'Acquire::AllowInsecureRepositories "true";' >> /etc/apt/apt.conf.d/10no-check-valid && \
    echo 'APT::Get::AllowUnauthenticated "true";' >> /etc/apt/apt.conf.d/10no-check-valid

# 2. Install dependencies & PHP extensions
RUN apt-get update && \
    apt-get -o Acquire::AllowInsecureRepositories=true -o APT::Get::AllowUnauthenticated=true install -y \
    libpng-dev libjpeg-dev libonig-dev libxml2-dev \
    zip unzip git curl libmcrypt-dev libicu-dev \
    && docker-php-ext-install \
    mysqli \
    pdo \
    pdo_mysql \
    gd \
    mbstring \
    mcrypt \
    bcmath \
    zip \
    intl

# 3. TAMBAHAN: Install Composer 2.2 LTS (Versi terakhir yang dukung PHP 7.0 secara stabil)
COPY --from=docker.io/library/composer:2.2 /usr/bin/composer /usr/bin/composer

# 4. Aktifkan mod_rewrite untuk CodeIgniter
RUN a2enmod rewrite

# 5. Konfigurasi virtual host
COPY vhost.conf /etc/apache2/sites-available/000-default.conf

# Tambahkan ini sebelum WORKDIR jika ingin melihat error langsung
RUN echo "display_errors = On" > /usr/local/etc/php/conf.d/error-reporting.ini && \
    echo "error_reporting = E_ALL" >> /usr/local/etc/php/conf.d/error-reporting.ini

WORKDIR /var/www/html

# Pastikan user www-data memiliki akses ke folder code
RUN chown -R www-data:www-data /var/www/html
  • apache/vhost.conf
<VirtualHost *:80>
    DocumentRoot /var/www/html
    <Directory "/var/www/html">
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
  • mariadb/Dockerfile
FROM mariadb:10.1.37

Konfigurasi Podman Compose

Satu hal krusial di Fedora Silverblue adalah SELinux. Kita harus menambahkan suffix :Z pada volume agar kontainer punya izin akses ke folder di host.

services:
  lamp_apache:
    build: ./apache
    container_name: lamp_apache
    ports:
      - "8080:80"
    volumes:
      - ./code:/var/www/html:Z
    networks:
      - lamp_net
    depends_on:
      - lamp_mariadb

  lamp_mariadb:
    build: ./mariadb
    container_name: lamp_mariadb
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: legacy_db
      MYSQL_USER: legacy_user
      MYSQL_PASSWORD: legacy_pass
    ports:
      - "3307:3306"
    volumes:
      - mariadb_data:/var/lib/mysql:Z
    networks:
      - lamp_net

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:4.8.4
    container_name: lamp_phpmyadmin
    environment:
      PMA_HOST: lamp_mariadb
      PMA_PORT: 3306
    ports:
      - "9090:80"
    depends_on:
      - lamp_mariadb
    networks:
      - lamp_net

volumes:
  mariadb_data:

networks:
  lamp_net:
    driver: bridge

Workflow Menjalankan Composer

Karena Composer sudah ada di dalam kontainer web, kita tidak perlu menginstallnya di Fedora host. Cukup jalankan via podman exec:

# Jalankan install di subfolder project
podman exec -it -w /var/www/html/nama-project legacy-lamp composer install

Tips Troubleshooting di Silverblue

Jika kamu menemui error 403 Forbidden atau Permission Denied saat menulis cache/logs:

  1. Pastikan volume menggunakan :Z.
  2. Jalankan sudo restorecon -Rv ./code untuk mereset konteks SELinux.
  3. Ubah ownership folder cache ke www-data di dalam kontainer.

Kesimpulan

Dengan memindahkan legacy environment ke kontainer Podman, kita tetap bisa produktif mengerjakan project lama tanpa harus mengompromikan keamanan dan stabilitas sistem operasi Fedora Silverblue kita.

Sampai jumpa di tutorial berikutnya!