diff --git a/.dockerignore b/.dockerignore index 762819c..18cabf1 100644 --- a/.dockerignore +++ b/.dockerignore @@ -5,6 +5,7 @@ !.env.docker.example node_modules vendor +public/build storage/logs/*.log storage/framework/cache/data/* storage/framework/sessions/* diff --git a/Dockerfile b/Dockerfile index a1d975e..aae1aea 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,26 @@ +FROM composer:2 AS vendor + +WORKDIR /app + +COPY composer.json composer.lock ./ + +RUN composer install \ + --no-dev \ + --no-interaction \ + --no-progress \ + --prefer-dist \ + --optimize-autoloader + +FROM node:22-alpine AS assets + +WORKDIR /app + +COPY package.json package-lock.json vite.config.js ./ +COPY resources ./resources +COPY public ./public + +RUN npm ci && npm run build + FROM php:8.3-cli-bookworm WORKDIR /var/www/html @@ -23,6 +46,10 @@ COPY --from=composer:2 /usr/bin/composer /usr/bin/composer COPY docker/app/php.ini /usr/local/etc/php/conf.d/99-webgis.ini COPY docker/app/entrypoint.sh /usr/local/bin/webgis-entrypoint +COPY . . +COPY --from=vendor /app/vendor ./vendor +COPY --from=assets /app/public/build ./public/build + RUN chmod +x /usr/local/bin/webgis-entrypoint EXPOSE 8000 diff --git a/README.md b/README.md index 3baa82f..996ae55 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ Repository ini sudah disiapkan untuk jalan lewat Docker Compose: - `mysql`: database MySQL 8.4 dengan volume persisten - `vite`: hanya untuk development, tidak otomatis jalan saat production deploy +Image `app` sudah self-contained. Source code dan dependency Composer dibangun ke dalam image saat `docker compose build`, jadi tidak perlu bind mount proyek ke `/var/www/html` saat deploy production. + ## SSL Di Coolify SSL tidak dipasang di container aplikasi. Untuk deploy di Coolify, HTTPS ditangani oleh reverse proxy Coolify dengan sertifikat Let's Encrypt. @@ -75,7 +77,6 @@ docker compose up --build -d Entrypoint container `app` otomatis menjalankan: -- `composer install` - membuat `.env` dari `.env.docker.example` jika belum ada - `php artisan key:generate` jika `APP_KEY` belum ada - `php artisan migrate --force` @@ -202,5 +203,5 @@ Ganti password akun awal setelah deploy. - Pastikan `APP_URL` sesuai domain production. - Di Coolify, jangan publish host port manual. Set domain ke service `app` dan internal port `8000`. - Volume `webgis_mysql_data` menyimpan data MySQL. -- Folder project dimount ke `/var/www/html`, jadi perubahan file di server langsung terbaca container. +- Source code sudah masuk ke image saat build, jadi produksi tidak bergantung pada bind mount host ke `/var/www/html`. - Jika hosting punya backup volume, backup volume MySQL dan folder project. diff --git a/docker-compose.yml b/docker-compose.yml index fb55419..2f63007 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -7,9 +7,6 @@ services: working_dir: /var/www/html expose: - "8000" - volumes: - - ./:/var/www/html - - webgis_vendor:/var/www/html/vendor environment: APP_ENV: ${APP_ENV:-production} APP_DEBUG: ${APP_DEBUG:-false} @@ -61,6 +58,5 @@ services: start_period: 30s volumes: - webgis_vendor: webgis_node_modules: webgis_mysql_data: diff --git a/docker/app/entrypoint.sh b/docker/app/entrypoint.sh index 465acc6..7a9a57c 100644 --- a/docker/app/entrypoint.sh +++ b/docker/app/entrypoint.sh @@ -8,7 +8,8 @@ if [ ! -f .env ] && [ -f .env.docker.example ]; then fi if [ ! -f vendor/autoload.php ]; then - composer install + echo "vendor/autoload.php is missing. Rebuild the image so Composer dependencies are baked in." + exit 1 fi php artisan config:clear --no-ansi