Ronsen

Ronald Nababan

Tech, Indonesia, and randomness

Tadinya gua mikir gak akan butuh Docker buat aplikasi-aplikasi yang gua bikin. Tapi setelah jumlahnya makin banyak, bahkan lebih dari 10 biji, gua akhirnya memutuskan untuk menggunakan Docker. Di sini kebanyakan aplikasi yang gua bikin itu aplikasi yang menggunakan Laravel sebagai framework-nya.

Awalnya gua nyobain Laravel Sail, pustaka bawaan Laravel untuk Docker, biar cepat jalan. Sayangnya, pustaka ini nggak mendukung SQLite. Akhirnya gua memutuskan buat bikin pengaturannya dari nol. Biar lebih fleksibel.

Gua pilih nginx sebagai web server dan dibantu sama php-fpm seperti layaknya biasa gua pake di sebuah server. Ternyata gak segampang itu! Setelah seharian mencoba berbagai cara bisa jalan tetap aja gagal. Sebenarnya semua lebih mudah menggunakan perintah php artisan serve tapi dilarang sama dokumentasi Laravel.

Hampir putus asa, di detik-detik terakhir gua teringat Laravel Octane. Cara ini bahkan menurut gua lebih baik karena dengan menggunakan pustaka yang satu ini justru aplikasi Laravel semakin kencang. Gua pilih Frankenphp karena saat ini paling gampang buat disatuin dengan Laravel Octane.

Jadi begini konfigurasi Dockerfile-nya:

FROM ubuntu:latest

LABEL maintainer="Ronald Nababan"

ARG DEBIAN_FRONTEND=noninteractive

WORKDIR /var/www/html

RUN apt update && apt upgrade -y && \
	apt install -y zip unzip supervisor sqlite3 curl && \
	apt install -y php-cli php-sqlite3 php-gd php-curl php-imap php-mbstring \
	php-xml php-zip php-bcmath php-soap php-intl php-readline php-msgpack \
	php-igbinary php-memcached php-pcov php-imagick php-xdebug && \
	apt clean && rm -rf /var/lib/apt/lists/*

RUN curl -sLS https://getcomposer.org/installer | php -- --install-dir=/usr/bin/ --filename=composer

RUN ln -s /usr/local/bin/frankenphp /usr/local/bin/frankenphp

COPY . .

RUN cp .env.production .env

RUN composer install --optimize-autoloader --no-dev

RUN chown www-data:www-data -R storage && \
	chown www-data:www-data database && \
	chown www-data:www-data database/database.sqlite

RUN php artisan storage:link

EXPOSE 8000

ENTRYPOINT ["php", "artisan", "octane:start"]

Untuk memudahkan pemanggilan container-nya, berikut docker-compose.yml:

services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    container_name: app
    ports:
      - "8000:8000"
    volumes:
      - ./data/storage:/var/www/html/storage/app/public
      - ./data/database.sqlite:/var/www/html/database/database.sqlite
    restart: unless-stopped

Jalankan aplikasi dengan perintah berikut:

docker compose up -d

Langkah terakhir tinggal mapping aplikasi ini ke Cloudflare Tunnel dan semuanya akan berjalan dengan mulus!