Struktur Direktori Ci4 Docker

Sekarang saya pakai docker dalam pengembangan web dengan framework Ci4. Sebelumnya saya sering pakai environment lengkap seperti xampp ataupun Laragon. Tetapi karena saya memiliki beberapa project legacy yang masih pakai dependency lama, seperti php 7 atau yang lain, sehingga kadang kesulitan menyesuaikan atau mengganti dependency jika pakai Xampp atau Laragon. Apalagi kalau ada project paralel yang harus pakai dua versi php yang berbeda.

Dengan pengembangan berbasis kontainer seperti Docker, kita bisa mengatur lingkungan yang berbeda setiap project. Lingkungan pengembangan satu project bisa kita buat independen terhadap project lain. Kita juga bisa jalankan dua project itu secara bersamaan tanpa mengganggu project yang lain.

Untuk kasus Ci4 dan bisa juga untuk framework lain sejenis, kita bisa pisahkan direktori untuk public dan private. Tujuannya diantaranya untuk keamanan dan konsistensi git workflow.

Misalhnya kita bisa buat struktur direktori seperti berikut:

project_directory
|- docker-compose.yml
|- Dockerfile
|- src
|-- private
|-- public

Kita bisa masukkan semua code ci4 di direktori private. Kemudian copy isi dari direktori public dalam ci4 ke src/public. Kemudian kita mapping src/public ke document root dalam kontainer. Kita map juga direktori private ke server.

Berikut docker compose nya:

name: 'ci4zuriah'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: zuriah_app
    ports:
      - "8080:80"
    volumes:
      - ./src/public:/var/www/html
      - ./src/private:/var/www/private
      - ./docker/php.ini:/usr/local/etc/php/php.ini
    depends_on:
      - db
    networks:
      - ci4net

  db:
    image: arm64v8/mysql:9.4.0-oracle
    container_name: zuriah_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: ci4db
      MYSQL_USER: ci4user
      MYSQL_PASSWORD: ci4pass
    ports:
      - "3356:3306"
    volumes:
      - dbdata:/var/lib/mysql
    networks:
      - ci4net

  phpmyadmin:
    image: arm64v8/phpmyadmin:5.2
    container_name: zuriah_myadmin
    restart: always
    ports:
      - "8051:80"
    environment:
      PMA_HOST: db
      MYSQL_ROOT_PASSWORD: rootpass
      UPLOAD_LIMIT: 10M
    depends_on:
      - db
    networks:
      - ci4net

volumes:
  dbdata:

networks:
  ci4net:

Dockerfile

FROM php:8.3-apache

# Install dependencies
RUN apt-get update && apt-get install -y \
    libicu-dev \
    libpq-dev \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    unzip \
    curl \
    zip 

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- \
    && mv composer.phar /usr/local/bin/composer

# Aktifkan ekstensi PHP
RUN docker-php-ext-configure gd \
    --with-freetype \
    --with-jpeg \
    && docker-php-ext-install \
    gd \
    intl \
    mysqli \
    pdo \
    pdo_mysql

# Aktifkan mod_rewrite Apache
RUN a2enmod rewrite

# Restart Apache agar perubahan berlaku
RUN service apache2 restart

Kediri, 20 oct 2025

Dockerfile untuk Ci4 dengan Composer

Dengan case ingin menjalankan composer didalam container php dengan apache

FROM php:8.1-apache

# Install dependencies
RUN apt-get update && apt-get install -y \
    libicu-dev \
    libpq-dev \
    unzip \
    curl \
    zip \

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- \
    && mv composer.phar /usr/local/bin/composer

# Aktifkan ekstensi PHP Intl 
RUN docker-php-ext-install intl mysqli pdo pdo_mysql

# Aktifkan mod_rewrite Apache
RUN a2enmod rewrite

# Restart Apache agar perubahan berlaku
RUN service apache2 restart

p9, 2 Oct 2025

Emulator Android Studio Tidak Mau Jalan

Saya baru saja pindah laptop dari yang sebelumnya pakai thinkpad x200 dan macbook ke thinkpad t480s, saya pikir menjalankan emulator Android adalah hal sepele yang langsung jalan seperti sebelumnya. Ternyata tidak. Di tengah proses pengujian aplikasi, saya justru terjebak dalam masalah yang membuat saya hampir menyerah: emulator Android tidak mau jalan sama sekali.

Berikut kronologi dan poin-poin kesulitan yang saya hadapi, serta bagaimana akhirnya saya bisa menemukan solusi yang bekerja.

⚠️ 1. Emulator Selalu Berhenti Saat Proses Start

Setiap kali saya mencoba menjalankan emulator dari Android Studio, proses hanya sampai tahap “starting emulator” lalu berhenti begitu saja. Tidak ada error fatal, hanya pesan samar seperti “started new renderthread total 17” sebelum jendela emulator hilang tanpa jejak. Tidak ada log yang jelas, tidak ada crash report. Hanya mati begitu saja dengan pesan terminated.

🔧 2. Virtualization Sudah Diaktifkan di BIOS

Langkah pertama tentu saya cek BIOS. Di ThinkPad T480s, saya pastikan Intel Virtualization Technology dan VT-d sudah aktif. Tapi emulator tetap tidak bisa dijalankan. Ini membuat saya curiga bahwa masalahnya bukan di level BIOS, melainkan di lapisan software atau driver.

📦 3. Install Semua Komponen Emulator di SDK Manager

Saya buka Android Studio → SDK Manager → SDK Tools. Di sana saya install semua yang berkaitan dengan emulator:

  • Android Emulator
  • Emulator Hypervisor Driver
  • Platform SDK terbaru

Namun, hasilnya nihil. Emulator tetap tidak bisa dijalankan. Bahkan mencoba versi SDK yang lebih lama pun tidak membantu.

🧪 4. Coba Buat AVD Berbasis ARM—Tetap Gagal

Saya cari referensi dan menemukan mungkin masalahnya ada di image x86_64, jadi saya coba buat AVD berbasis ARM64 + Google APIs. AVD tidak berhasil dibuat karena setelah berbagai cara tidak ditemukan versi ARM.

🎛️ 5. Uji Coba Mode Grafis: Automatic, Hardware, Software

Saya mulai bereksperimen dengan konfigurasi grafis di AVD Manager:

  • Automatic → emulator tetap mati
  • Hardware → muncul warning bahwa GPU tidak mendukung Vulkan
  • Software → akhirnya emulator bisa jalan!

✅ 6. Solusi: Mode Software adalah Penyelamat

Setelah semua upaya gagal, saya ubah mode grafis emulator ke Software. Hasilnya? Emulator akhirnya bisa berjalan stabil. Memang performanya tidak secepat hardware acceleration, tapi cukup untuk debugging dan pengujian UI.

🎯 Kesimpulan

Masalah emulator Android yang tidak mau jalan bisa berasal dari banyak lapisan: BIOS, driver GPU, SDK configuration, bahkan mode grafis. Dalam kasus saya, mode grafis hardware (Vulkan/OpenGL) tidak kompatibel dengan GPU Intel UHD, dan hanya mode software yang bisa menyelamatkan.

Jika kamu mengalami hal serupa, jangan menyerah. Coba ubah mode grafis, pastikan virtualisasi aktif, dan jangan ragu untuk bereksperimen dengan AVD berbasis ARM atau x86_64. Kadang solusi paling sederhana—seperti memilih mode software—adalah yang paling efektif.

P9, 29 Agustus 2025

Project iOS Error dan Lama Tidak Dibuka

Sudah sekian tahun project-project iOS di macbook tidak saya buka. Masalahnya karena sempat pindah device pakai mini PC, yang sekarang rusak, untuk kegiatan sehari-hari.

Selain itu, Xcode yang sudah lama tidak dibuka minta update versi dimana setelah update bisa jadi banyak hal baru yang saya mungkin tidak sempat untuk eksplore. Belum lagi mac OS yang juga harus update kalau jalanin Xcode, begitu juga sebaliknya, akhirnya karena menghindari perputaran update ini, saya jadi malas buka project-project lama iOS saya.

Kondisi ini tidak mungkin saya biarkan seterusnya. Saya sediakan sumber daya pikiran dan waktu untuk mengurai satu per satu.

sdk doesn’t contain libarclite

Ini adalah pesan error pertama setelah buka project xcode.

Setelah mencari berbagai referensi, diminta untuk menaikkan deployment target di project dan juga podfile. Setelah diupdate, diminta menjalankan pod install.

Entah karena apa ternyata pod tidak dikenali. Akhirnya hapus cocoapods dan install ulang.

Waktu menjalankan install ulang cocoapods pakai gem, ternyata ruby nya pakai versi yang sudah udzur. Mau tidak mau install Ruby yang versi lebih baru

Setelah install Ruby versi terbaru, rupanya tidak langsung aktif, masih nyantol ke versi lama. Selanjutnya atur path agar ruby memakai versi yang barusan diinstall.

Ruby dan gem sudah tidak masalah. Masalah muncul di permission denied di docker. Entah kenapa ada sangkut paut sama docker juga disini. Selanjutnya perbaiki hak akses folder.

Waktu tambah path untuk ruby juga sempat ada masalah, karena petunjuk di referensi untuk mac berbasis ARM sedangkan mac saya masih pakai intell.

Setelah semua dilakukan, ternyata masih error yang sama soal libarclite.

Coba baca lagi dengan seksama dan lebih detail. Saya coba update semua yang berkaitan dengan deployment target, mulai dari project hingga semua dependency. Saya naikkan ke iOS 15 semua. Dan, Alhamdulillah berhasil sehingga aplikasi bisa dibuka kembali dan bisa dijalankan di simulator.

Setup Docker Container untuk CodeIgniter 4, MySQL (Debian), dan phpMyAdmin

🧭 Awal Mula: Ide Membuat Kontainer Dev

Saya ingin membuat lingkungan pengembangan berbasis Docker untuk CodeIgniter 4, agar proses development lebih stabil, portable, dan mudah direplikasi. Untuk itu, saya butuh stack yang terdiri dari:

  • Apache + PHP untuk menjalankan CI4
  • MySQL sebagai database backend
  • phpMyAdmin sebagai UI administrasi database
  • Aktifnya mod_rewrite agar CI4 bisa routing tanpa index.php

🏗️ Merancang Dockerfile dan docker-compose.yml

Alih-alih menggunakan image php:8.2-apache secara langsung, saya memutuskan membuat Dockerfile kustom agar bisa mengaktifkan mod_rewrite dan menyusun konfigurasi Apache sesuai kebutuhan.

📄 Dockerfile untuk Apache + PHP

Dockerfile

# Menggunakan image dasar PHP dengan Apache
FROM php:8.2-apache

# Perbarui package manager dan install ekstensi yang diperlukan
RUN apt-get update && apt-get install -y \
    libicu-dev \
    libpq-dev \
    unzip

# Aktifkan ekstensi PHP Intl 
RUN docker-php-ext-install intl 

# Aktifkan mod_rewrite Apache
RUN a2enmod rewrite

# Restart Apache agar perubahan berlaku
RUN service apache2 restart

EXPOSE 80
CMD ["apache2-foreground"]

📄 apache-config.conf

apache

<VirtualHost *:80>
    DocumentRoot /var/www/html
    <Directory /var/www/html>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

📦 docker-compose.yml

yaml

name: 'ci4app'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: ci4_app
    ports:
      - "8080:80"
    volumes:
      - ./ci4:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:8.0-debian
    container_name: mysql_db
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: ci4db
      MYSQL_USER: ci4user
      MYSQL_PASSWORD: ci4pass
    volumes:
      - ./mysql:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    container_name: phpmyadmin
    ports:
      - "8081:80"
    environment:
      PMA_HOST: db
      PMA_USER: ci4user
      PMA_PASSWORD: ci4pass
    depends_on:
      - db

⚠️ Masalah yang Terjadi: MySQL Error x86-64-v2

Saat pertama kali saya jalankan stack ini dengan docker compose up --build, CI4 langsung muncul di port 8080, tapi phpMyAdmin gagal tersambung ke database.

Setelah saya cek log mysql_db, ternyata muncul error:

Fatal glibc error: CPU does not support x86-64-v2

Saya baru sadar kalau image mysql:8.0 berbasis Oracle Linux 9 yang butuh CPU dengan dukungan modern. Dan processor saya belum mendukung x86-64-v2 😅.

🔄 Solusi: Ganti dengan mysql:8.0-debian

Setelah mencari tahu, saya menemukan kalau image mysql:8.0-debian lebih ringan dan tidak butuh instruksi CPU canggih. Saya langsung ganti di docker-compose.yml:

yaml

image: mysql:8.0-debian

Lalu saya jalankan ulang:

bash

docker compose down
docker compose up --build -d

Dan… berhasil! 🎉 Semua kontainer hidup dengan baik, CI4 bisa routing dengan .htaccess, dan phpMyAdmin langsung tersambung ke database.

✅ Kesimpulan

  • Gunakan Dockerfile untuk kontrol penuh terhadap konfigurasi Apache dan PHP.
  • Aktifkan mod_rewrite dengan a2enmod rewrite agar CI4 tidak butuh index.php.
  • Gunakan mysql:8.0-debian jika CPU kamu tidak mendukung x86-64-v2.
  • Pantau log dan error agar lebih cepat mendeteksi masalah.