Compare commits
5 Commits
69b03fb467
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 4907ff7ef8 | |||
| 4e19f27522 | |||
| 1b3031a1ab | |||
| 70d6efdec6 | |||
| 2f8b14ed2a |
@@ -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
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user