Compare commits

...

5 Commits

6 changed files with 60 additions and 14 deletions
+1
View File
@@ -5,6 +5,7 @@
!.env.docker.example !.env.docker.example
node_modules node_modules
vendor vendor
public/build
storage/logs/*.log storage/logs/*.log
storage/framework/cache/data/* storage/framework/cache/data/*
storage/framework/sessions/* storage/framework/sessions/*
+5 -6
View File
@@ -2,7 +2,7 @@ APP_NAME="WebGIS Miskin"
APP_ENV=production APP_ENV=production
APP_KEY= APP_KEY=
APP_DEBUG=false APP_DEBUG=false
APP_URL=https://domain-anda.test APP_URL=http://vwkgokg048o8gwok4sgko488.203.24.51.230.sslip.io
APP_LOCALE=en APP_LOCALE=en
APP_FALLBACK_LOCALE=en APP_FALLBACK_LOCALE=en
@@ -17,12 +17,11 @@ LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug LOG_LEVEL=debug
DB_CONNECTION=mysql DB_CONNECTION=mysql
DB_HOST=mysql DB_HOST=sokgg4gook0w8c8484wck4ss
DB_PORT=3306 DB_PORT=3306
DB_DATABASE=webgis_miskin DB_DATABASE=default
DB_USERNAME=webgis DB_USERNAME=mysql
DB_PASSWORD=change-this-password DB_PASSWORD=N2eFvS3vqx4rTv4jQIqcA0qmom0gQROnnvkYm4PtGsVRFiPPAFQJrRzgBYiYPclV
MYSQL_ROOT_PASSWORD=change-this-root-password
SESSION_DRIVER=database SESSION_DRIVER=database
SESSION_LIFETIME=120 SESSION_LIFETIME=120
+32
View File
@@ -1,3 +1,28 @@
FROM composer:2 AS vendor
WORKDIR /app
COPY composer.json composer.lock ./
# --no-scripts: artisan belum ada di stage ini, post-autoload-dump dijalankan di stage final
# tanpa --prefer-dist agar Composer bisa fallback ke git source saat unduhan dist gagal (mis. GitHub 504)
RUN composer install \
--no-dev \
--no-interaction \
--no-progress \
--no-scripts \
--no-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 FROM php:8.3-cli-bookworm
WORKDIR /var/www/html WORKDIR /var/www/html
@@ -23,6 +48,13 @@ 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/php.ini /usr/local/etc/php/conf.d/99-webgis.ini
COPY docker/app/entrypoint.sh /usr/local/bin/webgis-entrypoint 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 composer dump-autoload --no-dev --optimize --no-interaction \
&& php artisan package:discover --ansi
RUN chmod +x /usr/local/bin/webgis-entrypoint RUN chmod +x /usr/local/bin/webgis-entrypoint
EXPOSE 8000 EXPOSE 8000
+3 -2
View File
@@ -10,6 +10,8 @@ Repository ini sudah disiapkan untuk jalan lewat Docker Compose:
- `mysql`: database MySQL 8.4 dengan volume persisten - `mysql`: database MySQL 8.4 dengan volume persisten
- `vite`: hanya untuk development, tidak otomatis jalan saat production deploy - `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 Di Coolify
SSL tidak dipasang di container aplikasi. Untuk deploy di Coolify, HTTPS ditangani oleh reverse proxy Coolify dengan sertifikat Let's Encrypt. 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: Entrypoint container `app` otomatis menjalankan:
- `composer install`
- membuat `.env` dari `.env.docker.example` jika belum ada - membuat `.env` dari `.env.docker.example` jika belum ada
- `php artisan key:generate` jika `APP_KEY` belum ada - `php artisan key:generate` jika `APP_KEY` belum ada
- `php artisan migrate --force` - `php artisan migrate --force`
@@ -202,5 +203,5 @@ Ganti password akun awal setelah deploy.
- Pastikan `APP_URL` sesuai domain production. - Pastikan `APP_URL` sesuai domain production.
- Di Coolify, jangan publish host port manual. Set domain ke service `app` dan internal port `8000`. - Di Coolify, jangan publish host port manual. Set domain ke service `app` dan internal port `8000`.
- Volume `webgis_mysql_data` menyimpan data MySQL. - 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. - Jika hosting punya backup volume, backup volume MySQL dan folder project.
-4
View File
@@ -7,9 +7,6 @@ services:
working_dir: /var/www/html working_dir: /var/www/html
expose: expose:
- "8000" - "8000"
volumes:
- ./:/var/www/html
- webgis_vendor:/var/www/html/vendor
environment: environment:
APP_ENV: ${APP_ENV:-production} APP_ENV: ${APP_ENV:-production}
APP_DEBUG: ${APP_DEBUG:-false} APP_DEBUG: ${APP_DEBUG:-false}
@@ -61,6 +58,5 @@ services:
start_period: 30s start_period: 30s
volumes: volumes:
webgis_vendor:
webgis_node_modules: webgis_node_modules:
webgis_mysql_data: webgis_mysql_data:
+19 -2
View File
@@ -8,15 +8,32 @@ if [ ! -f .env ] && [ -f .env.docker.example ]; then
fi fi
if [ ! -f vendor/autoload.php ]; then 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 fi
php artisan config:clear --no-ansi php artisan config:clear --no-ansi
if ! grep -q '^APP_KEY=base64:' .env 2>/dev/null; then # Coolify menyuntik APP_KEY lewat environment variable, jadi key:generate
# hanya perlu jalan kalau key tidak ada di env maupun .env
if [ -z "${APP_KEY:-}" ] && ! grep -q '^APP_KEY=base64:' .env 2>/dev/null; then
php artisan key:generate --force --no-ansi php artisan key:generate --force --no-ansi
fi fi
DB_WAIT_HOST="${DB_HOST:-mysql}"
DB_WAIT_PORT="${DB_PORT:-3306}"
echo "Waiting for database at ${DB_WAIT_HOST}:${DB_WAIT_PORT}..."
tries=0
until mysqladmin ping -h "$DB_WAIT_HOST" -P "$DB_WAIT_PORT" --silent 2>/dev/null; do
tries=$((tries + 1))
if [ "$tries" -ge 30 ]; then
echo "Database at ${DB_WAIT_HOST}:${DB_WAIT_PORT} is unreachable after ${tries} attempts."
echo "Check that DB_HOST points to a reachable MySQL host on the same Docker network."
exit 1
fi
sleep 2
done
php artisan migrate --force --no-ansi php artisan migrate --force --no-ansi
php artisan db:seed --force --no-ansi php artisan db:seed --force --no-ansi